handleStream method

Future<void> handleStream(
  1. P2PStream stream,
  2. PeerId remotePeerIdParam
)

Implementation

Future<void> handleStream(P2PStream stream, PeerId remotePeerIdParam) async {
  final serviceMaxMsgSize = 4096; // As in Go for service side

  await stream.scope().setService(serviceName);
  await stream.scope().reserveMemory(serviceMaxMsgSize, ReservationPriority.always);

  await stream.setDeadline(DateTime.now().add(streamTimeout));

  try {
    // Use the remotePeerId from the stream connection, as in Go, not the param from handler if it's different.
    final remotePeerId = stream.conn.remotePeer;
    _autonatServiceLog('AutoNATService: New stream from $remotePeerId');

    final req = await readDelimited(stream, pb.Message.fromBuffer);

    if (req.type != pb.Message_MessageType.DIAL) {
      _autonatServiceLog('AutoNATService: Unexpected message from $remotePeerId: ${req.type}');
      await stream.reset(); // Reset before releasing memory if possible
      return;
    }

    final dialResponse = await _handleDial(remotePeerId, stream.conn.remoteMultiaddr, req.dial.peer); // await here
    final resMsg = pb.Message()
      ..type = pb.Message_MessageType.DIAL_RESPONSE
      ..dialResponse = dialResponse;

    await writeDelimited(stream, resMsg);
    _config.metricsTracer?.receivedDialResponse(dialResponse.status); // Assuming similar metric event

  } catch (e) {
    _autonatServiceLog('AutoNATService: Error handling stream: $e');
    await stream.reset(); // Reset before releasing memory if possible
  } finally {
    stream.scope().releaseMemory(serviceMaxMsgSize);
    await stream.close();
  }
}