handleData method

dynamic handleData(
  1. WebSocketContext socket,
  2. dynamic data
)

Handles incoming data from a WebSocket.

Implementation

dynamic handleData(WebSocketContext socket, data) async {
  // Of a socket that has closed, whose streams are closed.
  if (socket._closed) return;
  try {
    socket._onData.add(data);
    var fromJson = json.decode(data.toString());
    if (fromJson is! Map) {
      throw AngelHttpException.badRequest(
        message: 'An action must be a JSON object.',
      );
    }
    var action = WebSocketAction.fromJson(fromJson);
    var eventName = action.eventName;

    if (eventName == null || eventName.isEmpty) {
      throw AngelHttpException.badRequest();
    }

    _onAction.add(action);
    socket._onAction.add(action);
    var actionData = fromJson['data'];
    if (actionData is! Map? && socket.on._hasListener(eventName)) {
      _log.warning(
        'The data of "$eventName" is not a JSON object, so '
        'socket.on["$eventName"] does not get it; listen to '
        'socket.onAction instead.',
      );
    }
    socket.on._add(eventName, actionData);

    if (eventName == authenticateAction) {
      await handleAuth(action, socket);
    }

    var split = eventName.split('::');
    if (split.length >= 2 && actions.contains(split[1])) {
      var event = await handleAction(action, socket);
      // Sent to the socket, as no hook broadcasts it.
      if (event is WebSocketEvent && !_broadcasts(split[0])) {
        socket.send(event.eventName!, event.data);
      }
    }
  } catch (e, st) {
    _log.severe('Invalid data');
    catchError(e, st, socket);
  }
}