handleFrame method
Implementation
Future<void> handleFrame(YamuxFrame frame) async {
final handleStartTime = DateTime.now();
if (_state == YamuxStreamState.closed || _state == YamuxStreamState.reset) {
_log.warning('$_logPrefix 🔧 [YAMUX-STREAM-HANDLE-FRAME-SKIP] Stream closed/reset, ignoring frame type ${frame.type}');
return;
}
// For DATA frames, use optimized queuing to handle rapid delivery
if (frame.type == YamuxFrameType.dataFrame) {
return await _handleDataFrameOptimized(frame);
}
// Handle other frame types directly (they're less frequent)
try {
switch (frame.type) {
case YamuxFrameType.windowUpdate:
await _handleWindowUpdateFrame(frame);
break;
case YamuxFrameType.ping:
await _handlePingFrame(frame);
break;
case YamuxFrameType.reset:
_log.fine('$_logPrefix Received RESET frame. Session is terminating.');
_state = YamuxStreamState.reset; // Treat as reset
await _cleanup();
break;
default:
_log.severe('$_logPrefix Received unexpected frame type: ${frame.type}. Resetting stream.');
await reset();
throw StateError('Unexpected frame type: ${frame.type}');
}
} catch (e) {
_log.severe('$_logPrefix Error in handleFrame(): $e. Current state: $_state');
if (_state != YamuxStreamState.closed && _state != YamuxStreamState.reset) {
_log.warning('$_logPrefix Resetting stream due to error in handleFrame.');
await reset();
}
rethrow;
}
}