handleEventBroadcast method
NdkBroadcastResponse
handleEventBroadcast({
- required Nip01Event nostrEvent,
- required EventSigner? signer,
- required Stream<
List< doneStream,RelayBroadcastResponse> > - Iterable<
String> ? specificRelays,
override
Implementation
@override
NdkBroadcastResponse handleEventBroadcast({
required Nip01Event nostrEvent,
required EventSigner? signer,
required Stream<List<RelayBroadcastResponse>> doneStream,
Iterable<String>? specificRelays,
}) {
Future<void> asyncStuff() async {
// =====================================================================================
// specific relays
// =====================================================================================
if (signer != null) {
await signer.sign(nostrEvent);
}
if (specificRelays != null) {
for (final relayUrl in specificRelays) {
// broadcast async
doRelayBroadcast(relayUrl, nostrEvent);
}
return;
}
// =====================================================================================
// own outbox
// =====================================================================================
// TODO should not only depend on cached, but go fetch it if not present in cache
final nip65List = (await UserRelayLists.getUserRelayListCacheLatest(
pubkeys: [nostrEvent.pubKey],
cacheManager: _cacheManager,
));
var writeRelaysUrls = _relayManager.globalState.relays.keys;
if (nip65List.isNotEmpty) {
writeRelaysUrls = nip65List.first.relays.entries
.where((element) => element.value.isWrite)
.map((e) => e.key)
.toList();
} else {
Logger.log.w(
"could not find user relay list from nip65, using default bootstrap relays");
}
for (final relayUrl in writeRelaysUrls) {
final isConnected =
_globalState.relays[relayUrl]?.relayTransport?.isOpen() ?? false;
if (isConnected) {
continue;
}
await _relayManager.connectRelay(
dirtyUrl: relayUrl,
connectionSource: ConnectionSource.broadcastOwn,
);
}
for (final relayUrl in writeRelaysUrls) {
final relay = _globalState.relays[relayUrl];
if (relay == null) {
Logger.log.w("relay $relayUrl not found");
continue;
}
_relayManager.registerRelayBroadcast(
eventToPublish: nostrEvent,
relayUrl: relayUrl,
);
_relayManager.send(
relay,
ClientMsg(
ClientMsgType.kEvent,
event: nostrEvent,
));
}
// =====================================================================================
// other inbox
// =====================================================================================
if (nostrEvent.pTags.isNotEmpty) {
final nip65Data = await UserRelayLists.getUserRelayListCacheLatest(
pubkeys: nostrEvent.pTags,
cacheManager: _cacheManager,
);
List<String> myWriteRelayUrlsOthers = [];
/// filter read relays
for (final userNip65 in nip65Data) {
final completeList = userNip65.relays.entries
.where((element) => element.value.isRead)
.map((e) => e.key)
.toList();
// cut list of at a certain threshold
final maxList = completeList.sublist(
0,
min(completeList.length,
BroadcastDefaults.MAX_INBOX_RELAYS_TO_BROADCAST),
);
myWriteRelayUrlsOthers.addAll(maxList);
}
for (final relayUrl in myWriteRelayUrlsOthers) {
final isConnected =
_globalState.relays[relayUrl]?.relayTransport?.isOpen() ?? false;
if (isConnected) {
continue;
}
await _relayManager.connectRelay(
dirtyUrl: relayUrl,
connectionSource: ConnectionSource.broadcastOther);
}
for (final relayUrl in myWriteRelayUrlsOthers) {
final relay = _globalState.relays[relayUrl];
if (relay == null) {
Logger.log.w("relay $relayUrl not found");
continue;
}
_relayManager.registerRelayBroadcast(
eventToPublish: nostrEvent,
relayUrl: relayUrl,
);
_relayManager.send(
relay,
ClientMsg(
ClientMsgType.kEvent,
event: nostrEvent,
));
}
}
}
asyncStuff();
return NdkBroadcastResponse(
publishEvent: nostrEvent,
broadcastDoneStream: doneStream,
);
}