join static method
Future<DeewanMeeting>
join(
- MeetingCredentials credentials, {
- bool microphone = false,
- bool camera = false,
- 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;
}