connectRecvTransport function
Establishes a connection for the receiving transport to consume media from a remote producer and resumes the consumer stream.
Parameters:
options(ConnectRecvTransportOptions): Contains all necessary details to connect and manage the receiving transport:consumer(Consumer): The media consumer instance.consumerTransport(Transport): The transport associated with the consumer.remoteProducerId(String): The ID of the producer being consumed.serverConsumerTransportId(String): The server-generated transport ID.nsock(io.Socket): The socket instance for real-time communication.parameters(ConnectRecvTransportParameters): Includes parameters for updating transports, resuming the consumer, and device details.
Workflow:
- Consumption Initiation: Emits a 
consumeevent to the socket to initiate media consumption, passing in the device'srtpCapabilities. - Consumer Transport Management: Adds the transport and consumer details to the 
consumerTransportslist for tracking active connections. - Stream Resumption: If the consumer is successfully created, emits a 
consumer-resumeevent to resume media reception and triggersconsumerResumeto update the UI and media handling. 
Returns:
- A 
Future<void>that completes once the transport is connected and the consumer is resumed. 
Example Usage:
final options = ConnectRecvTransportOptions(
  consumer: myConsumer,
  consumerTransport: myConsumerTransport,
  remoteProducerId: 'producer-id-123',
  serverConsumerTransportId: 'transport-id-abc',
  nsock: mySocket,
  parameters: myConnectRecvTransportParameters,
);
connectRecvTransport(options).then(() {
  print('Receiving transport connected and consumer resumed');
}).catchError((error) {
  print('Error connecting transport: $error');
});
Error Handling:
- Logs any errors encountered during the consumption or resumption process in debug mode.
 
Implementation
Future<void> connectRecvTransport(ConnectRecvTransportOptions options) async {
  var parameters = options.parameters.getUpdatedAllParams();
  // Extract parameters
  final consumer = options.consumer;
  final consumerTransports = parameters.consumerTransports;
  final updateConsumerTransports = parameters.updateConsumerTransports;
  final consumerResume = parameters.consumerResume;
  final nsock = options.nsock;
  final consumerTransport = options.consumerTransport;
  final remoteProducerId = options.remoteProducerId;
  final serverConsumerTransportId = options.serverConsumerTransportId;
  try {
    // Update consumerTransports array with the new consumer
    consumerTransports.add(TransportType(
      consumerTransport: consumerTransport,
      serverConsumerTransportId: serverConsumerTransportId,
      producerId: remoteProducerId,
      consumer: consumer,
      socket_: nsock,
    ));
    updateConsumerTransports(consumerTransports);
    // Extract track from the consumer
    MediaStream stream = consumer.stream;
    // Emit 'consumer-resume' event to signal consumer resumption
    nsock.emitWithAck('consumer-resume', {
      'serverConsumerId': consumer.id,
    }, ack: (resumeData) async {
      if (resumeData['resumed'] == true) {
        // Consumer resumed and ready to be used
        try {
          await consumerResume(ConsumerResumeOptions(
            stream: stream,
            consumer: consumer,
            kind: consumer.kind ?? '',
            remoteProducerId: remoteProducerId,
            parameters: parameters,
            nsock: nsock,
          ));
        } catch (error) {
          // Handle error
          if (kDebugMode) {
            print('consumerResume error: $error');
          }
        }
      }
    });
  } catch (error) {
    // Handle error
    if (kDebugMode) {
      print('consume error: $error');
    }
  }
}