joinConRoom function

Future<ResponseJoinRoom> joinConRoom(
  1. JoinConRoomOptions options
)

Joins a conference room with the provided options. Validates the input parameters before attempting to join the room.

Example usage:

final options = JoinConRoomOptions(
  socket: socketInstance,
  roomName: "s12345678",
  islevel: "1",
  member: "user123",
  sec: "64CharacterLongSecretHere",
  apiUserName: "user123",
);

try {
  final response = await joinConRoom(options);
  print("Room joined: ${response.success}");
} catch (error) {
  print("Failed to join room: $error");
}

Implementation

Future<ResponseJoinRoom> joinConRoom(JoinConRoomOptions options) async {
  try {
    // Input validation
    if (options.sec.isEmpty ||
        options.roomName.isEmpty ||
        options.islevel.isEmpty ||
        options.apiUserName.isEmpty ||
        options.member.isEmpty) {
      throw Exception('Missing required parameters');
    }

    // Alphanumeric validation
    validateAlphanumeric(options.roomName, 'roomName');
    validateAlphanumeric(options.apiUserName, 'apiUserName');
    validateAlphanumeric(options.member, 'member');

    // Validate roomName prefix
    if (!(options.roomName.startsWith('s') ||
        options.roomName.startsWith('p'))) {
      throw Exception('Invalid roomName, must start with "s" or "p"');
    }

    // Additional constraints
    if (!(options.sec.length == 64 &&
        options.roomName.length >= 8 &&
        options.islevel.length == 1 &&
        options.apiUserName.length >= 6 &&
        (options.islevel == '0' ||
            options.islevel == '1' ||
            options.islevel == '2'))) {
      throw Exception(
          'Invalid roomName, islevel, apiUserName, or secret format');
    }

    final completer = Completer<ResponseJoinRoom>();

    // Emit the 'joinConRoom' event with acknowledgment handling
    options.socket!.emitWithAck('joinConRoom', {
      'roomName': options.roomName,
      'islevel': options.islevel,
      'member': options.member,
      'sec': options.sec,
      'apiUserName': options.apiUserName,
    }, ack: (data) {
      if (data['rtpCapabilities'] == null) {
        if (data['banned'] == true) {
          throw Exception('User is banned.');
        } else if (data['suspended'] == true) {
          throw Exception('User is suspended.');
        } else if (data['noAdmin'] == true) {
          throw Exception('Host has not joined the room yet.');
        } else {
          throw Exception('Failed to join room');
        }
      } else {
        completer.complete(ResponseJoinRoom.fromJson(data));
      }
    });

    return completer.future;
  } catch (error) {
    if (kDebugMode) {
      print('Error joining consume room: $error');
    }
    rethrow;
  }
}