UNPKG

@directus/api

Version:

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

55 lines (54 loc) 2.07 kB
import { useEnv } from '@directus/env'; import emitter from '../../emitter.js'; import { useLogger } from '../../logger/index.js'; import { handleWebSocketError, WebSocketError } from '../errors.js'; import { AuthMode } from '../messages.js'; import SocketController from './base.js'; const logger = useLogger(); export class LogsController extends SocketController { constructor(httpServer) { super(httpServer, 'WEBSOCKETS_LOGS'); const env = useEnv(); this.server.on('connection', (ws, auth) => { this.bindEvents(this.createClient(ws, auth)); }); logger.info(`Logs WebSocket Server started at ws://${env['HOST']}:${env['PORT']}${this.endpoint}`); } getEnvironmentConfig(configPrefix) { const env = useEnv(); const endpoint = String(env[`${configPrefix}_PATH`]); const maxConnections = `${configPrefix}_CONN_LIMIT` in env ? Number(env[`${configPrefix}_CONN_LIMIT`]) : Number.POSITIVE_INFINITY; return { endpoint, maxConnections, authentication: { mode: 'strict', timeout: 0, }, }; } bindEvents(client) { client.on('parsed-message', async (message) => { try { emitter.emitAction('websocket.logs', { message, client }); } catch (error) { handleWebSocketError(client, error, 'server'); return; } }); client.on('error', (event) => { emitter.emitAction('websocket.error', { client, event }); }); client.on('close', (event) => { emitter.emitAction('websocket.close', { client, event }); }); emitter.emitAction('websocket.connect', { client }); } checkUserRequirements(accountability) { // enforce admin only access for the logs streaming websocket if (!accountability?.admin) { throw new WebSocketError('auth', 'AUTH_FAILED', 'Unauthorized access.'); } } }