websocket method
Upgrading websocket.
The return value can be any data you need, for example, in the event of a failure, you can return a Response or the result of a fallback call. Due to the different contents returned by different platforms, the return value depends on your implementation.
Implementation
@override
websocket(Event event, HttpRequest request, Hooks hooks) async {
if (event.locals.getOrNull(_kUpgradedWebSocket) == true) {
throw HttpException('The current request has been upgraded to WebSocket',
uri: event.uri);
} else if (!WebSocketTransformer.isUpgradeRequest(request)) {
return hooks.fallback(event);
}
final response = request.response;
final options = await hooks.onUpgrade(event);
for (final (name, value) in options.headers) {
response.headers.add(name, value);
}
final websocket = await WebSocketTransformer.upgrade(
request,
compression: options.ioCompressionOptions,
protocolSelector: _createProtocolSelector(options.protocols),
);
final peer = _IOPeer(event, websocket);
websocket.listen(
(payload) async {
final message = switch (payload) {
Uint8List bytes => Message.bytes(bytes),
List<int> bytes => Message.bytes(Uint8List.fromList(bytes)),
String text => Message.text(text),
_ => throw WebSocketException('Unsupported payload message.'),
};
return hooks.onMessage(peer, message);
},
onError: (error) => hooks.onError(peer, error),
onDone: () => hooks.onClose(peer,
code: websocket.closeCode, reason: websocket.closeReason),
);
event.locals.set(_kUpgradedWebSocket, true);
}