startListeningToRelay method

  1. @override
void startListeningToRelay({
  1. required String relay,
  2. required void onRelayListening(
    1. String relayUrl,
    2. dynamic receivedData,
    3. WebSocketChannel? relayWebSocket
    )?,
  3. required void onRelayConnectionError(
    1. String relayUrl,
    2. Object? error,
    3. WebSocketChannel? relayWebSocket
    )?,
  4. required void onRelayConnectionDone(
    1. String relayUrl,
    2. WebSocketChannel? relayWebSocket
    )?,
  5. required bool retryOnError,
  6. required bool retryOnClose,
  7. required bool shouldReconnectToRelayOnNotice,
  8. required Duration connectionTimeout,
  9. required bool ignoreConnectionException,
  10. required bool lazyListeningToRelays,
  11. void onNoticeMessageFromRelay(
    1. String relay,
    2. WebSocketChannel? relayWebSocket,
    3. NostrNotice notice
    )?,
})
override

This method will start listening to all relays that you did registered with the init method.

you need to call this method manually only if you set the lazyListeningToRelays parameter to true in the init method, otherwise it will be called automatically by the init method.

example:

Nostr.instance.relays.startListeningToRelay(
 onRelayListening: (relayUrl, receivedData) {
 print("received data: $receivedData from relay with url: $relayUrl");
},
onRelayConnectionError: (relayUrl, error) {
print("relay with url: $relayUrl has thrown an error: $error");
},
onRelayConnectionDone: (relayUrl) {
print("relay with url: $relayUrl is closed");
},
);

You can also use this method to re-connect to all relays in case of a connection failure.

Implementation

@override
void startListeningToRelay({
  required String relay,
  required void Function(
    String relayUrl,
    dynamic receivedData,
    WebSocketChannel? relayWebSocket,
  )? onRelayListening,
  required void Function(
    String relayUrl,
    Object? error,
    WebSocketChannel? relayWebSocket,
  )? onRelayConnectionError,
  required void Function(String relayUrl, WebSocketChannel? relayWebSocket)?
      onRelayConnectionDone,
  required bool retryOnError,
  required bool retryOnClose,
  required bool shouldReconnectToRelayOnNotice,
  required Duration connectionTimeout,
  required bool ignoreConnectionException,
  required bool lazyListeningToRelays,
  void Function(
          String relay, WebSocketChannel? relayWebSocket, NostrNotice notice,)?
      onNoticeMessageFromRelay,
}) {
  final relayWebSocket = nostrRegistry.getRelayWebSocket(relayUrl: relay);

  relayWebSocket!.stream.listen(
    (d) {
      final data = d.toString();

      onRelayListening?.call(relay, d, relayWebSocket);

      if (NostrEvent.canBeDeserialized(data)) {
        _handleAddingEventToSink(
          event: NostrEvent.deserialized(data),
          relay: relay,
        );
      } else if (NostrNotice.canBeDeserialized(data)) {
        final notice = NostrNotice.fromRelayMessage(data);

        onNoticeMessageFromRelay?.call(relay, relayWebSocket, notice);

        _handleNoticeFromRelay(
          notice: notice,
          relay: relay,
          onRelayListening: onRelayListening,
          connectionTimeout: connectionTimeout,
          ignoreConnectionException: ignoreConnectionException,
          lazyListeningToRelays: lazyListeningToRelays,
          onRelayConnectionError: onRelayConnectionError,
          onRelayConnectionDone: onRelayConnectionDone,
          retryOnError: retryOnError,
          retryOnClose: retryOnClose,
          shouldReconnectToRelayOnNotice: shouldReconnectToRelayOnNotice,
        );
      } else if (NostrEventOkCommand.canBeDeserialized(data)) {
        _handleOkCommandMessageFromRelay(
          okCommand: NostrEventOkCommand.fromRelayMessage(data),
          relay: relay,
        );
      } else if (NostrRequestEoseCommand.canBeDeserialized(data)) {
        _handleEoseCommandMessageFromRelay(
          eoseCommand: NostrRequestEoseCommand.fromRelayMessage(data),
          relay: relay,
        );
      } else if (NostrCountResponse.canBeDeserialized(data)) {
        final countResponse = NostrCountResponse.deserialized(data);

        _handleCountResponseMessageFromRelay(
          relay: relay,
          countResponse: countResponse,
        );
      } else {
        utils.log(
          'received unknown message from relay: $relay, message: $d',
        );
      }
    },
    onError: (error) {
      if (retryOnError) {
        _reconnectToRelay(
          relay: relay,
          onRelayListening: onRelayListening,
          onRelayConnectionError: onRelayConnectionError,
          onRelayConnectionDone: onRelayConnectionDone,
          retryOnError: retryOnError,
          retryOnClose: retryOnClose,
          shouldReconnectToRelayOnNotice: shouldReconnectToRelayOnNotice,
          connectionTimeout: connectionTimeout,
          ignoreConnectionException: ignoreConnectionException,
          lazyListeningToRelays: lazyListeningToRelays,
        );
      }

      if (onRelayConnectionError != null) {
        onRelayConnectionError(relay, error, relayWebSocket);
      }

      utils.log(
        'web socket of relay with $relay had an error: $error',
        error,
      );
    },
    onDone: () {
      if (retryOnClose) {
        _reconnectToRelay(
          relay: relay,
          onRelayListening: onRelayListening,
          onRelayConnectionError: onRelayConnectionError,
          onRelayConnectionDone: onRelayConnectionDone,
          retryOnError: retryOnError,
          retryOnClose: retryOnClose,
          shouldReconnectToRelayOnNotice: shouldReconnectToRelayOnNotice,
          connectionTimeout: connectionTimeout,
          ignoreConnectionException: ignoreConnectionException,
          lazyListeningToRelays: lazyListeningToRelays,
        );
      }

      if (onRelayConnectionDone != null) {
        onRelayConnectionDone(relay, relayWebSocket);
      }
    },
  );
}