doRelayBroadcast method
===================================================================================== The flow:
- register broadcast in relay manager's global state, so that even failed to connect relays will be taken into account for broadcast done logic
- make sure the relay is connected by calling reconnect
- if connected was successfull send the event
- 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",
);
}