handleStream method
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();
}
}