WebSocketImpl.fromSocket constructor

WebSocketImpl.fromSocket(
  1. Stream<List<int>> stream,
  2. StreamSink<List<int>> sink,
  3. String? protocol, [
  4. bool _serverSide = false,
])

Implementation

WebSocketImpl.fromSocket(
    Stream<List<int>> stream, StreamSink<List<int>> sink, this.protocol,
    [this._serverSide = false]) {
  _consumer = _WebSocketConsumer(this, sink);
  _sink = StreamSinkImpl(_consumer);
  _readyState = WebSocket.OPEN;

  final transformer = _WebSocketProtocolTransformer(_serverSide);
  _subscription = transformer.bind(stream).listen((data) {
    if (data is _WebSocketPing) {
      if (!_writeClosed) _consumer.add(_WebSocketPong(data.payload));
    } else if (data is _WebSocketPong) {
      // Simply set pingInterval, as it'll cancel any timers.
      pingInterval = _pingInterval;
    } else {
      _controller.add(data);
    }
  }, onError: (error, stackTrace) {
    if (_closeTimer != null) _closeTimer!.cancel();
    if (error is FormatException) {
      _close(WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
    } else {
      _close(WebSocketStatus.PROTOCOL_ERROR);
    }
    // An error happened, set the close code set above.
    _closeCode = _outCloseCode;
    _closeReason = _outCloseReason;
    _controller.close();
  }, onDone: () {
    if (_closeTimer != null) _closeTimer!.cancel();
    if (_readyState == WebSocket.OPEN) {
      _readyState = WebSocket.CLOSING;
      if (!_isReservedStatusCode(transformer.closeCode)) {
        _close(transformer.closeCode, transformer.closeReason);
      } else {
        _close();
      }
      _readyState = WebSocket.CLOSED;
    }
    // Protocol close, use close code from transformer.
    _closeCode = transformer.closeCode;
    _closeReason = transformer.closeReason;
    _controller.close();
  }, cancelOnError: true);
  _subscription!.pause();
  _controller = StreamController(
      sync: true,
      onListen: () => _subscription!.resume(),
      onCancel: () {
        _subscription!.cancel();
        _subscription = null;
      },
      onPause: _subscription!.pause,
      onResume: _subscription!.resume);

  _webSockets[_serviceId] = this;
}