From 77e87e1d0c8e14def4c8194d67e20492c953d104 Mon Sep 17 00:00:00 2001 From: Carlos Valente Date: Sun, 13 Oct 2024 22:30:37 +0200 Subject: [PATCH] refactor: make message service stateless --- apps/server/src/app.ts | 3 -- .../message-service/MessageService.ts | 51 +++++-------------- .../__tests__/MessageService.test.ts | 6 --- 3 files changed, 14 insertions(+), 46 deletions(-) diff --git a/apps/server/src/app.ts b/apps/server/src/app.ts index affe77fe1..129f02adb 100644 --- a/apps/server/src/app.ts +++ b/apps/server/src/app.ts @@ -202,9 +202,6 @@ export const startServer = async ( // TODO: pass event store to rundownservice runtimeService.init(maybeRestorePoint); - // eventStore set is a dependency of the services that publish to it - messageService.init((key, value) => eventStore.set(key, value)); - expressServer.listen(serverPort, '0.0.0.0', () => { const nif = getNetworkInterfaces(); consoleSuccess(`Local: http://localhost:${serverPort}/editor`); diff --git a/apps/server/src/services/message-service/MessageService.ts b/apps/server/src/services/message-service/MessageService.ts index 16261457a..42e214d35 100644 --- a/apps/server/src/services/message-service/MessageService.ts +++ b/apps/server/src/services/message-service/MessageService.ts @@ -1,63 +1,40 @@ -import { TimerMessage, MessageState } from 'ontime-types'; +import { MessageState, runtimeStorePlaceholder } from 'ontime-types'; import { DeepPartial } from 'ts-essentials'; import { throttle } from '../../utils/throttle.js'; -import type { PublishFn } from '../../stores/EventStore.js'; - -const defaultTimer: TimerMessage = { - text: '', - visible: false, - blink: false, - blackout: false, - secondarySource: null, -}; - -let timer = { ...defaultTimer }; -let external = ''; - -let throttledSet: PublishFn | null = null; +import { eventStore, type PublishFn } from '../../stores/EventStore.js'; /** - * Initialises the message service with a publish function - * @param publishFn + * Create a throttled version of the set function */ -export function init(publishFn: PublishFn) { - throttledSet = throttle(publishFn, 100); -} +const throttledSet: PublishFn = throttle(eventStore.set, 100); /** * Exposes function to reset the internal state */ export function clear() { - timer = { ...defaultTimer }; - external = ''; + throttledSet('message', { + ...runtimeStorePlaceholder.message, + }); } /** * Exposes the internal state of the message service */ export function getState(): MessageState { - return { - external, - timer, - }; + return eventStore.get('message'); } /** * Utility function allows patching internal object */ export function patch(patch: DeepPartial): MessageState { - // we cannot call patch before init - // eslint-disable-next-line no-unused-labels -- dev code path - DEV: { - if (throttledSet === null) { - throw new Error('MessageService.patch() called before init()'); - } - } + // make a copy of the state in store + const newState = { ...getState() }; - if ('timer' in patch) timer = { ...timer, ...patch.timer }; - if ('external' in patch && patch.external !== undefined) external = patch.external; - const newState = getState(); - throttledSet?.('message', newState); + if ('timer' in patch) newState.timer = { ...newState.timer, ...patch.timer }; + if ('external' in patch && patch.external !== undefined) newState.external = patch.external; + + throttledSet('message', newState); return newState; } diff --git a/apps/server/src/services/message-service/__tests__/MessageService.test.ts b/apps/server/src/services/message-service/__tests__/MessageService.test.ts index 1c780627d..d6c30916d 100644 --- a/apps/server/src/services/message-service/__tests__/MessageService.test.ts +++ b/apps/server/src/services/message-service/__tests__/MessageService.test.ts @@ -1,12 +1,6 @@ import * as messageService from '../MessageService.js'; describe('MessageService', () => { - const publishFunction = () => {}; - - beforeAll(() => { - messageService.init(publishFunction); - }); - beforeEach(() => { messageService.clear(); });