sendOrThrow method

Future<void> sendOrThrow(
  1. RelayConnectivity relayConnectivity,
  2. ClientMsg msg
)

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);
}