connect method
Implementation
@override
SocketConnection connect(String url, SocketTransportHandlers handlers) {
final channel = _channelFactory(
requireSecureEndpoint(url, const {'wss'}),
headers: _headers,
);
unawaited(channel.ready.then(
(_) => handlers.onOpen(),
onError: (Object error) => handlers.onError(error),
));
channel.stream.listen(
(Object? data) {
final String message;
if (data is String) {
if (data.length > _maxIncomingFrameBytes ||
utf8.encode(data).length > _maxIncomingFrameBytes) {
handlers.onError(
StateError('incoming realtime frame exceeded the size limit'));
unawaited(channel.sink.close(4009, 'frame too large'));
return;
}
message = data;
} else if (data is List<int>) {
if (data.length > _maxIncomingFrameBytes) {
handlers.onError(
StateError('incoming realtime frame exceeded the size limit'));
unawaited(channel.sink.close(4009, 'frame too large'));
return;
}
message = utf8.decode(data);
} else {
handlers.onError(
StateError('incoming realtime frame has an unsupported type'));
return;
}
handlers.onMessage(message);
},
onError: (Object error) => handlers.onError(error),
onDone: () {
final closeCode = channel.closeCode ?? 1006;
final closeReason = channel.closeReason ?? '';
handlers.onClose(TransportCloseEvent(
code: closeCode,
reason: closeReason,
wasClean: closeCode == 1000,
));
},
cancelOnError: false,
);
return _WebSocketConnectionAdapter(channel);
}