import { inject, Injectable } from '@angular/core'; import { environment } from '@environments/environment'; import { QueryClient } from '@tanstack/angular-query-experimental'; import { Observable } from 'rxjs'; import { io } from 'socket.io-client'; const { wsUrl } = environment; export enum WSEvents { COUNTDOWN = 'request_countdown', LIVE = 'request_schedule_live', SCHEDULE = 'request_schedule_printed', REFRESH = 'refresh_page', MESSAGE = 'broadcast_message', SURVEY = 'request_survey', ONDEMAND = 'request_ondemand', QUESTIONS = 'refresh_questions', QUORUM = 'refresh_quorum', NOTIFICATIONS = 'request_notifications', } @Injectable({ providedIn: 'root', }) export class WebsocketService { private queryClient = inject(QueryClient); socket = io(wsUrl, { secure: true, reconnection: true, rejectUnauthorized: false, transports: ['websocket', 'polling', 'flashsocket'], }); listen(eventName: string, invalidateQuery?: string[]) { return new Observable((subscriber) => { const handler = (data: T) => { subscriber.next(data); if (invalidateQuery) { this.queryClient.invalidateQueries({ queryKey: invalidateQuery }); } }; this.socket.on(eventName, handler); return () => this.socket.off(eventName, handler); }); } emit(eventName: string, data: any) { this.socket.emit(eventName, data); } } export const injectWebsocketService = () => inject(WebsocketService);