From 13f586265477eb6ec084e14afc9056156706729d Mon Sep 17 00:00:00 2001 From: Sven Czarnian Date: Thu, 3 Nov 2022 23:32:54 +0100 Subject: [PATCH] introduce server sent events services --- src/events/events.module.ts | 8 ++++++ src/events/events.service.spec.ts | 18 +++++++++++++ src/events/events.service.ts | 44 +++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 src/events/events.module.ts create mode 100644 src/events/events.service.spec.ts create mode 100644 src/events/events.service.ts diff --git a/src/events/events.module.ts b/src/events/events.module.ts new file mode 100644 index 0000000..7715472 --- /dev/null +++ b/src/events/events.module.ts @@ -0,0 +1,8 @@ +import { Module } from '@nestjs/common'; +import { EventsService } from './events.service'; + +@Module({ + providers: [EventsService], + exports: [EventsService], +}) +export class EventsModule {} diff --git a/src/events/events.service.spec.ts b/src/events/events.service.spec.ts new file mode 100644 index 0000000..f26bdfe --- /dev/null +++ b/src/events/events.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { EventsService } from './events.service'; + +describe('EventsService', () => { + let service: EventsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [EventsService], + }).compile(); + + service = module.get(EventsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/events/events.service.ts b/src/events/events.service.ts new file mode 100644 index 0000000..4dfc1ae --- /dev/null +++ b/src/events/events.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@nestjs/common'; +import { EventEmitter } from 'events'; +import { fromEvent, Observable } from 'rxjs'; + +@Injectable() +export class EventsService { + private readonly emitter: EventEmitter; + + constructor() { + this.emitter = new EventEmitter(); + } + + private subscribe(event: string): Observable { + return fromEvent(this.emitter, event); + } + + private emit(event: string, data: any): void { + this.emitter.emit(event, data); + } + + subscribeUserPrivilegeUpdate(vatsimId: string): Observable { + return this.subscribe(`/users/${vatsimId}`); + } + + emitUserPrivilegeUpdate(vatsimId: string): void { + this.emit(`/users/${vatsimId}`, {}); + } + + subscribeAirportRenew(): Observable { + return this.subscribe('/airports/renew'); + } + + emitAirportRenew(): void { + this.emit('/airports/renew', {}); + } + + subscribeArrivalSequenceUpdate(icao: string): Observable { + return this.subscribe(`/airports/arrival/${icao}`); + } + + emitArrivalSequenceUpdate(icao: string): void { + this.emit(`/airports/arrival/${icao}`, {}); + } +}