close method
Closes the stream for both reading and writing
Implementation
@override
Future<void> close() async {
_log.fine('$_logPrefix close() called. Current state: $_state');
if (_state == YamuxStreamState.closed || _state == YamuxStreamState.reset) {
_log.finer(
'$_logPrefix close() called but stream already closed/reset. State: $_state. Doing nothing.');
return;
}
final previousState = _state;
_state = YamuxStreamState.closed; // Immediately transition to closed
try {
if (_consumedBytesForLocalWindowUpdate > 0 &&
previousState == YamuxStreamState.open) {
_log.finer(
'$_logPrefix Sending pending WINDOW_UPDATE for $_consumedBytesForLocalWindowUpdate consumed bytes before local FIN.');
final updateFrame = YamuxFrame.windowUpdate(
streamId, _consumedBytesForLocalWindowUpdate);
await _sendFrame(updateFrame);
_consumedBytesForLocalWindowUpdate = 0;
}
_log.finer(
'$_logPrefix Sending FIN frame (DATA frame with FIN flag) for local close().');
final frame = YamuxFrame.createData(streamId, Uint8List(0), fin: true);
await _sendFrame(frame);
} catch (e) {
_log.warning(
'$_logPrefix Error sending FIN frame during close(): $e. Proceeding to forceful cleanup (reset).');
} finally {
_log.finer(
'$_logPrefix close() ensuring cleanup. State before final cleanup: $_state (was $previousState).');
await _cleanup();
_log.fine('$_logPrefix close() completed. Final state: $_state');
}
}