close method

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

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