doRelayBroadcast method

Future<void> doRelayBroadcast(
  1. String relayUrl,
  2. Nip01Event nostrEvent
)

===================================================================================== The flow:

  1. register broadcast in relay manager's global state, so that even failed to connect relays will be taken into account for broadcast done logic
  2. make sure the relay is connected by calling reconnect
  3. if connected was successfull send the event
  4. otherwise call failBroadcast in order to publish a RelayBroadcastResponse for that specific relay with an error message

Implementation

Future<void> doRelayBroadcast(String relayUrl, Nip01Event nostrEvent) async {
  _relayManager.registerRelayBroadcast(
    eventToPublish: nostrEvent,
    relayUrl: relayUrl,
  );

  var connected = _relayManager.isRelayConnected(relayUrl);
  Object? error;
  if (!connected) {
    try {
      final result = await _relayManager.connectRelay(
        dirtyUrl: relayUrl,
        connectionSource: ConnectionSource.broadcastSpecific,
        connectTimeout: 1,
      );
      connected = result.first;
    } catch (e) {
      Logger.log.w(
        () => "Error during quick connect for $relayUrl in doRelayBroadcast",
        error: e,
      );
      error = e;
    }
  }

  if (connected) {
    if (await _shouldSkipObsoleteReplaceableBroadcast(nostrEvent)) {
      Logger.log.d(
        () =>
            'skip obsolete specific-relay broadcast ${nostrEvent.id} for $relayUrl',
      );
      _relayManager.failBroadcast(
        nostrEvent.id,
        relayUrl,
        'obsolete replaceable event skipped',
      );
      return;
    }

    final relayConnectivity = _relayManager.getRelayConnectivity(relayUrl);
    if (relayConnectivity != null) {
      await _relayManager.sendOrThrow(
        relayConnectivity,
        ClientMsg(ClientMsgType.kEvent, event: nostrEvent),
      );
      return;
    }
  }
  _relayManager.failBroadcast(
    nostrEvent.id,
    relayUrl,
    "Could not connect to relay $relayUrl $error",
  );
}