WebSocketImpl.fromSocket constructor
WebSocketImpl.fromSocket(])
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;
}