in lib/src/copy/web_socket_impl.dart [823:851]
Future close([int? code, String? reason]) {
if (_isReservedStatusCode(code)) {
throw WebSocketChannelException('Reserved status code $code');
}
if (_outCloseCode == null) {
_outCloseCode = code;
_outCloseReason = reason;
}
if (!_controller.isClosed) {
// If a close has not yet been received from the other end then
// 1) make sure to listen on the stream so the close frame will be
// processed if received.
// 2) set a timer terminate the connection if a close frame is
// not received.
if (!_controller.hasListener && _subscription != null) {
_controller.stream.drain().catchError((_) => {});
}
// When closing the web-socket, we no longer accept data.
_closeTimer ??= Timer(const Duration(seconds: 5), () {
// Reuse code and reason from the local close.
_closeCode = _outCloseCode;
_closeReason = _outCloseReason;
if (_subscription != null) _subscription!.cancel();
_controller.close();
_webSockets.remove(_serviceId);
});
}
return _sink.close();
}