closeWrite method

  1. @override
Future<void> closeWrite()
override

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;
  }
}