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