closeWrite method
Closes the stream for writing but leaves it open for reading
Implementation
@override
Future<void> closeWrite() async {
_log.finer('$_logPrefix closeWrite() called. Current state: $_state');
if (_state != YamuxStreamState.open && _state != YamuxStreamState.closing) {
_log.finer('$_logPrefix closeWrite() called on stream not in open/closing state: $_state. Doing nothing.');
return;
}
try {
_log.finer('$_logPrefix Sending FIN frame for closeWrite().');
final frame = YamuxFrame.createData(streamId, Uint8List(0), fin: true);
await _sendFrame(frame);
// Sending FIN locally means we won't write anymore.
_localFinSent = true;
_log.fine('$_logPrefix closeWrite() sent FIN and set _localFinSent=true. Current stream state: $_state.');
// If remote also sent FIN (_state == YamuxStreamState.closing), then both sides are done writing.
// The stream can now be fully cleaned up.
if (_state == YamuxStreamState.closing) {
_log.fine('$_logPrefix closeWrite() called, _localFinSent=true, and stream was already in closing state (remote FIN received). Cleaning up.');
await _cleanup();
} else {
_log.fine('$_logPrefix closeWrite() sent FIN. Stream remains in state: $_state for potential reads or remote FIN.');
}
} catch (e) {
_log.severe('$_logPrefix Error sending FIN frame during closeWrite(): $e. Resetting stream.');
await reset(); // Escalate to reset on send error
rethrow;
}
}