joinRoomOnMediaSFU function

Future<CreateJoinRoomResult> joinRoomOnMediaSFU(
  1. JoinMediaSFUOptions options
)

joinRoomOnMediaSFU

Sends a request to join an existing room on MediaSFU. This function validates the provided credentials and dynamically determines the endpoint based on the localLink. It performs an HTTP POST request with the provided payload and returns the response or an error.

Parameters:

  • payload (JoinMediaSFURoomOptions): The payload containing room join details.
  • apiUserName (String): The API username used for authentication.
  • apiKey (String): The API key for authentication (must be exactly 64 characters).
  • localLink (String, optional): A local link for community edition servers. If provided, it replaces the default MediaSFU endpoint.

Returns:

  • A Future<CreateJoinRoomResult> containing:
    • success (bool): Indicates whether the request was successful.
    • data (CreateJoinRoomResponse | CreateJoinRoomError): The response data or error details.

Example Usage:

final payload = JoinMediaSFURoomOptions(
  action: "join",
  meetingID: "testRoom123",
  userName: "user123",
);

final result = await joinRoomOnMediaSFU(
  JoinMediaSFUOptions(
  payload: payload,
  apiUserName: "apiUser123",
  apiKey: "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
  localLink: "https://custom.localserver.com",
 ),
);

if (result.success) {
  print('Successfully joined room: ${result.data}');
} else {
  print('Failed to join room: ${result.data.error}');
}

Implementation

Future<CreateJoinRoomResult> joinRoomOnMediaSFU(
    JoinMediaSFUOptions options) async {
  try {
    // Extract options
    final payload = options.payload;
    String apiUserName = options.apiUserName;
    String apiKey = options.apiKey;
    String localLink = options.localLink;

    // Validate credentials
    if (apiUserName.isEmpty ||
        apiKey.isEmpty ||
        apiUserName == "yourAPIUSERNAME" ||
        apiKey == "yourAPIKEY" ||
        apiKey.length != 64 ||
        apiUserName.length < 6) {
      return CreateJoinRoomResult(
        data: CreateJoinRoomError(error: "Invalid credentials"),
        success: false,
      );
    }

    // Choose the appropriate endpoint
    String endpoint = 'https://mediasfu.com/v1/rooms/';

    if (localLink.isNotEmpty &&
        !localLink.contains('mediasfu.com') &&
        localLink.length > 1) {
      localLink = localLink.replaceAll(RegExp(r'/$'), '');
      endpoint = '$localLink/joinRoom';
    }

    Map<String, dynamic> payloadJson = payload.toMap();

    // Prepare the request
    final response = await http.post(
      Uri.parse(endpoint),
      headers: {
        "Content-Type": "application/json",
        "Authorization": "Bearer $apiUserName:$apiKey",
      },
      body: jsonEncode(payloadJson),
    );

    // Handle response
    if (response.statusCode == 200 || response.statusCode == 201) {
      final data = jsonDecode(response.body);
      return CreateJoinRoomResult(
        data: CreateJoinRoomResponse.fromJson(data),
        success: true,
      );
    } else {
      final errorData = jsonDecode(response.body);
      return CreateJoinRoomResult(
        data: CreateJoinRoomError.fromJson(errorData),
        success: false,
      );
    }
  } catch (error) {
    // Handle unexpected errors
    return CreateJoinRoomResult(
      data: CreateJoinRoomError(error: 'Unknown error'),
      success: false,
    );
  }
}