directus

Форк
0
/
websocket.ts 
49 строк · 1.8 Кб
1
import { useEnv } from '@directus/env';
2
import { ServiceUnavailableError } from '@directus/errors';
3
import type { ActionHandler } from '@directus/types';
4
import { toBoolean } from '@directus/utils';
5
import emitter from '../emitter.js';
6
import { getWebSocketController } from '../websocket/controllers/index.js';
7
import type { WebSocketController } from '../websocket/controllers/rest.js';
8
import type { WebSocketMessage } from '../websocket/messages.js';
9
import type { WebSocketClient } from '../websocket/types.js';
10

11
const env = useEnv();
12

13
export class WebSocketService {
14
	private controller: WebSocketController;
15

16
	constructor() {
17
		if (!toBoolean(env['WEBSOCKETS_ENABLED']) || !toBoolean(env['WEBSOCKETS_REST_ENABLED'])) {
18
			throw new ServiceUnavailableError({ service: 'ws', reason: 'WebSocket server is disabled' });
19
		}
20

21
		const controller = getWebSocketController();
22

23
		if (!controller) {
24
			throw new ServiceUnavailableError({ service: 'ws', reason: 'WebSocket server is not initialized' });
25
		}
26

27
		this.controller = controller;
28
	}
29

30
	on(event: 'connect' | 'message' | 'error' | 'close', callback: ActionHandler) {
31
		emitter.onAction('websocket.' + event, callback);
32
	}
33

34
	off(event: 'connect' | 'message' | 'error' | 'close', callback: ActionHandler) {
35
		emitter.offAction('websocket.' + event, callback);
36
	}
37

38
	broadcast(message: string | WebSocketMessage, filter?: { user?: string; role?: string }) {
39
		this.controller.clients.forEach((client: WebSocketClient) => {
40
			if (filter && filter.user && filter.user !== client.accountability?.user) return;
41
			if (filter && filter.role && filter.role !== client.accountability?.role) return;
42
			client.send(typeof message === 'string' ? message : JSON.stringify(message));
43
		});
44
	}
45

46
	clients(): Set<WebSocketClient> {
47
		return this.controller.clients;
48
	}
49
}
50

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.