sendOrThrow method
Sends a ClientMsg and surfaces transport churn/closed-socket failures to the caller instead of silently dropping the write.
Implementation
Future<void> sendOrThrow(
RelayConnectivity relayConnectivity,
ClientMsg msg,
) async {
NostrTransport? transport = relayConnectivity.relayTransport;
if (transport == null) {
throw StateError("relay not connected: ${relayConnectivity.url}");
}
await transport.ready;
if (!identical(relayConnectivity.relayTransport, transport) ||
!transport.isOpen()) {
transport = relayConnectivity.relayTransport;
if (transport == null) {
throw StateError(
"transport changed while waiting for ${relayConnectivity.url}",
);
}
await transport.ready;
if (!identical(relayConnectivity.relayTransport, transport) ||
!transport.isOpen()) {
throw StateError(
"transport changed while waiting for ${relayConnectivity.url}",
);
}
}
final String encodedMsg = jsonEncode(msg.toJson());
if (!identical(relayConnectivity.relayTransport, transport) ||
!transport.isOpen()) {
throw StateError(
"transport closed before send: ${relayConnectivity.url}",
);
}
_sendRaw(relayConnectivity, transport, encodedMsg);
}