joinConsumeRoom function
- JoinConsumeRoomOptions options
Joins a consumption room, initiates a media Device if necessary, and sets up piped transports for streaming.
This function:
- Sends a request to join a specified consumption room using provided authentication details.
- Checks if a media
Deviceneeds to be initialized, and creates it using RTP capabilities if required. - Calls
receiveAllPipedTransportsto establish the necessary piped transports for media sharing.
Parameters:
options(JoinConsumeRoomOptions): An options object containing:remoteSock(io.Socket): The remote socket for communication.apiToken(String): The API token for authentication.apiUserName(String): The username for API access.parameters(JoinConsumeRoomParameters): Room-specific settings, including:roomName: The name of the room to join.islevel: Participant level in the room.member: Unique member identifier.device: MediaDeviceinstance, if already initialized.receiveAllPipedTransports: A function to handle piped transport setup.createDeviceClient: A function to initialize a new mediaDevice.updateDevice: A function to update theDeviceif initialized within the function.
Returns:
A Future<ResponseJoinRoom> containing the result of the join operation, including details about room
participants and RTP capabilities if the join operation is successful.
Throws:
Throws an Exception if there is an error joining the room, creating the Device, or setting up piped transports.
Example:
import 'package:socket_io_client/socket_io_client.dart' as io;
import 'package:mediasfu_mediasoup_client/mediasfu_mediasoup_client.dart';
import 'join_consume_room.dart';
final socket = io.io("http://localhost:3000", <String, dynamic>{
"transports": ["websocket"],
});
final parameters = JoinConsumeRoomParametersMock(
roomName: 'test-room',
islevel: '2',
member: 'user123',
device: null,
updateDevice: (device) => print('Device initialized: $device'),
receiveAllPipedTransports: (options) async => print('Setting up piped transports'),
createDeviceClient: (options) async => Device(),
);
final options = JoinConsumeRoomOptions(
remoteSock: socket,
apiToken: 'your-api-token',
apiUserName: 'test-user',
parameters: parameters,
);
try {
final response = await joinConsumeRoom(options);
print('Successfully joined room with response: $response');
} catch (error) {
print('Failed to join room: $error');
}
Implementation
Future<ResponseJoinRoom> joinConsumeRoom(JoinConsumeRoomOptions options) async {
// Extract parameters
final remoteSock = options.remoteSock;
final apiToken = options.apiToken;
final apiUserName = options.apiUserName;
final parameters = options.parameters;
final String roomName = parameters.roomName;
final String islevel = parameters.islevel;
final String member = parameters.member;
Device? device = parameters.getUpdatedAllParams().device;
ReceiveAllPipedTransportsType receiveAllPipedTransports =
parameters.receiveAllPipedTransports;
CreateDeviceClientType createDeviceClient = parameters.createDeviceClient;
try {
// Join the consumption room
final optionsJoinConRoom = JoinConRoomOptions(
socket: remoteSock,
roomName: roomName,
islevel: islevel,
member: member,
sec: apiToken,
apiUserName: apiUserName,
);
final data = await joinConRoom(optionsJoinConRoom);
if (data.success == true) {
// Setup media device if it's not already initialized
if (device == null && data.rtpCapabilities != null) {
final optionsDevice = CreateDeviceClientOptions(
rtpCapabilities: data.rtpCapabilities,
);
final Device? newDevice =
await createDeviceClient(options: optionsDevice);
// Update the device in the parameters
parameters.updateDevice(newDevice!);
}
// Initialize piped transports
final optionsReceive = ReceiveAllPipedTransportsOptions(
nsock: remoteSock,
parameters: parameters,
);
await receiveAllPipedTransports(optionsReceive);
}
return data;
} catch (error) {
if (kDebugMode) {
print('MediaSFU - Error in joinConsumeRoom: $error');
}
throw Exception(
'Failed to join the consumption room or set up necessary components.',
);
}
}