join static method

Future<DeewanMeeting> join(
  1. MeetingCredentials credentials, {
  2. bool microphone = false,
  3. bool camera = false,
  4. String apiUrl = 'https://deewan.io',
})

Joins with credentials minted by your server. Encryption is always on.

Strict rooms: send exchangeKey to your server first, so the token it asks for carries it; the meeting key then arrives from the people already in the meeting (securityChanges tells you when).

Implementation

static Future<DeewanMeeting> join(
  MeetingCredentials credentials, {
  bool microphone = false,
  bool camera = false,
  String apiUrl = 'https://deewan.io',
}) async {
  _assertSecure(credentials.serverUrl, 'server_url', const ['wss', 'https']);
  _assertSecure(apiUrl, 'apiUrl', const ['https']);
  final passphrase = credentials.e2eePassphrase ?? '';
  if (!credentials.strict && passphrase.isEmpty) throw ArgumentError('e2eePassphrase is required');
  final keyProvider = await BaseKeyProvider.create(
    sharedKey: true,
    ratchetWindowSize: 0,
    failureTolerance: -1,
    keyRingSize: 16,
  );
  if (!credentials.strict) await keyProvider.setSharedKey(passphrase);
  final room = Room(
    roomOptions: RoomOptions(
      adaptiveStream: true,
      dynacast: true,
      encryption: E2EEOptions(keyProvider: keyProvider),
    ),
  );
  final listener = room.createListener();
  try {
    await room.connect(credentials.serverUrl, credentials.token);
  } catch (_) {
    await listener.dispose();
    await room.dispose();
    rethrow;
  }
  final meeting = DeewanMeeting._(room, listener, credentials.token, apiUrl);
  if (credentials.strict) {
    meeting._stopStrict = runStrictExchange(
      room: room,
      provider: keyProvider,
      post: (body) async {
        try {
          await meeting._call('POST', '/e2ee', body);
        } catch (_) {}
      },
      onState: (state) {
        meeting._security = state;
        if (!meeting._securityChanges.isClosed) meeting._securityChanges.add(state);
      },
    );
  }
  if (microphone) await room.localParticipant?.setMicrophoneEnabled(true);
  if (camera) await room.localParticipant?.setCameraEnabled(true);
  return meeting;
}