VoIP constructor

VoIP(
  1. Client client,
  2. WebRTCDelegate delegate, {
  3. bool enableSFUE2EEKeyRatcheting = false,
})

Implementation

VoIP(
  this.client,
  this.delegate, {
  this.enableSFUE2EEKeyRatcheting = false,
}) : super() {
  currentSessionId = base64Encode(secureRandomBytes(16));
  Logs().v('set currentSessionId to $currentSessionId');
  // to populate groupCalls with already present calls
  for (final room in client.rooms) {
    final memsList = room.getCallMembershipsFromRoom();
    for (final mems in memsList.values) {
      for (final mem in mems) {
        unawaited(createGroupCallFromRoomStateEvent(mem));
      }
    }
  }

  /// handles events todevice and matrix events for invite, candidates, hangup, etc.
  client.onCallEvents.stream.listen((events) async {
    await _handleCallEvents(events);
  });

  // handles the com.famedly.call events.
  client.onRoomState.stream.listen(
    (update) async {
      final event = update.state;
      if (event is! Event) return;
      if (event.room.membership != Membership.join) return;
      if (event.type != EventTypes.GroupCallMember) return;

      Logs().v('[VOIP] onRoomState: type ${event.toJson()}');
      final mems = event.room.getCallMembershipsFromEvent(event);
      for (final mem in mems) {
        unawaited(createGroupCallFromRoomStateEvent(mem));
      }
      for (final map in groupCalls.entries) {
        if (map.key.roomId == event.room.id) {
          // because we don't know which call got updated, just update all
          // group calls we have entered for that room
          await map.value.onMemberStateChanged();
        }
      }
    },
  );

  delegate.mediaDevices.ondevicechange = _onDeviceChange;
}