handleEventBroadcast method

  1. @override
NdkBroadcastResponse handleEventBroadcast({
  1. required Nip01Event nostrEvent,
  2. required EventSigner? signer,
  3. required BroadcastState broadcastState,
  4. Iterable<String>? specificRelays,
})
override

broadcasts given event using inbox/outbox (gossip) if explicit relays are given they are used instead nostrEvent event to publish explicitRelays used instead of gossip if set

Implementation

@override
NdkBroadcastResponse handleEventBroadcast({
  required Nip01Event nostrEvent,
  required EventSigner? signer,
  required BroadcastState broadcastState,
  Iterable<String>? specificRelays,
}) {
  final doneStream = broadcastState.stateUpdates
      .map((state) => state.broadcasts.values.toList());

  Future<void> asyncStuff() async {
    await relayManagerLight.seedRelaysConnected;

    final Nip01Event workingNostrEvent;
    try {
      if (signer != null) {
        workingNostrEvent = await signer.sign(nostrEvent);
      } else {
        workingNostrEvent = nostrEvent;
      }
    } catch (e, stackTrace) {
      broadcastState.addError(e, stackTrace);
      return;
    }

    if (specificRelays != null) {
      final cleanedSpecificRelays = cleanRelayUrls(specificRelays.toList());
      return RelayJitBroadcastSpecificRelaysStrategy.broadcast(
        specificRelays: cleanedSpecificRelays,
        relayManager: relayManagerLight,
        eventToPublish: workingNostrEvent,
        connectedRelays: relayManagerLight.connectedRelays
            .whereType<RelayConnectivity<JitEngineRelayConnectivityData>>()
            .toList(),
      );
    }

    // default publish to own outbox
    RelayJitBroadcastOutboxStrategy.broadcast(
      eventToPublish: workingNostrEvent,
      connectedRelays: relayManagerLight.connectedRelays
          .whereType<RelayConnectivity<JitEngineRelayConnectivityData>>()
          .toList(),
      cacheManager: cache,
      relayManager: relayManagerLight,
      bootstrapRelays: bootstrapRelays,
    );

    // check if we need to publish to others inboxes
    if (workingNostrEvent.pTags.isNotEmpty &&
        workingNostrEvent.kind != ContactList.kKind) {
      RelayJitBroadcastOtherReadStrategy.broadcast(
        eventToPublish: workingNostrEvent,
        connectedRelays: relayManagerLight.connectedRelays
            .whereType<RelayConnectivity<JitEngineRelayConnectivityData>>()
            .toList(),
        cacheManager: cache,
        relayManager: relayManagerLight,
        pubkeysOfInbox: workingNostrEvent.pTags,
      );
    }
  }

  asyncStuff();
  return NdkBroadcastResponse(
    publishEvent: nostrEvent,
    broadcastDoneStream: doneStream,
  );
}