sendOrFallback static method

Future<bool> sendOrFallback({
  1. required VoxeraRoomMessageChannel? channel,
  2. required String? identity,
  3. required void remember(
    1. String messageId
    ),
  4. required Future<VoxeraRoomSendResult> send(
    1. VoxeraRoomMessageChannel channel,
    2. String cid
    ),
  5. required Future<bool> viaDataChannel(),
})

Sends on the room socket when channel is connected and identity is known, otherwise through viaDataChannel (whose result is returned). remember gets the message id before the send, so the sender drops its own echo.

Returns false when the engine refused the message; the data channel is NOT used then, because a refusal is the room's cap or lock speaking.

Implementation

static Future<bool> sendOrFallback({
  required VoxeraRoomMessageChannel? channel,
  required String? identity,
  required void Function(String messageId) remember,
  required Future<VoxeraRoomSendResult> Function(
    VoxeraRoomMessageChannel channel,
    String cid,
  )
  send,
  required Future<bool> Function() viaDataChannel,
}) async {
  if (channel != null && channel.isConnected && identity != null) {
    final cid = newCid();
    remember(messageId(identity, cid));
    final result = await send(channel, cid);
    if (result == VoxeraRoomSendResult.sent) return true;
    if (result == VoxeraRoomSendResult.refused) return false;
  }
  return viaDataChannel();
}