websocket method

  1. @override
FutureOr websocket(
  1. Event event,
  2. HttpRequest request,
  3. Hooks hooks
)
override

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);
}