UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

38 lines (37 loc) 1.47 kB
import { useEnv } from '@directus/env'; import { ServiceUnavailableError } from '@directus/errors'; import { toBoolean } from '@directus/utils'; import emitter from '../emitter.js'; import { getWebSocketController } from '../websocket/controllers/index.js'; const env = useEnv(); export class WebSocketService { controller; constructor() { if (!toBoolean(env['WEBSOCKETS_ENABLED']) || !toBoolean(env['WEBSOCKETS_REST_ENABLED'])) { throw new ServiceUnavailableError({ service: 'ws', reason: 'WebSocket server is disabled' }); } const controller = getWebSocketController(); if (!controller) { throw new ServiceUnavailableError({ service: 'ws', reason: 'WebSocket server is not initialized' }); } this.controller = controller; } on(event, callback) { emitter.onAction('websocket.' + event, callback); } off(event, callback) { emitter.offAction('websocket.' + event, callback); } broadcast(message, filter) { this.controller.clients.forEach((client) => { if (filter && filter.user && filter.user !== client.accountability?.user) return; if (filter && filter.role && filter.role !== client.accountability?.role) return; client.send(typeof message === 'string' ? message : JSON.stringify(message)); }); } clients() { return this.controller.clients; } }