import log4js from 'log4js'; import { loadConfig } from '../config.js'; import NodeCache from 'node-cache'; import { etcdServer } from '../database/etcd.js'; import { updateObjectCache } from '../database/database.js'; const config = loadConfig(); // Setup logger const logger = log4js.getLogger('Update Manager'); logger.level = config.server.logLevel; /** * UpdateManager handles tracking object updates using Etcd and broadcasts update events via websockets. */ export class UpdateManager { constructor(socketClient) { this.socketClient = socketClient; } async subscribeToObjectNew(objectType) { await etcdServer.onKeyPutEvent( `/${objectType}s/new`, this.socketClient.socketId, (key, value) => { logger.trace('Object new event:', value); this.socketClient.socket.emit('objectNew', { _id: value, objectType: objectType }); } ); return { success: true }; } async subscribeToObjectUpdate(id, objectType) { await etcdServer.onKeyPutEvent( `/${objectType}s/${id}/object`, this.socketClient.socketId, (key, value) => { logger.trace('Object update event:', id); this.socketClient.socket.emit('objectUpdate', { _id: id, objectType: objectType, object: { ...value } }); } ); return { success: true }; } async removeObjectNewListener(objectType) { await etcdServer.removeKeyWatcher( `/${objectType}s/new`, this.socketClient.socketId, 'put' ); return { success: true }; } async removeObjectUpdateListener(id, objectType) { await etcdServer.removeKeyWatcher( `/${objectType}s/${id}/object`, this.socketClient.socketId, 'put' ); return { success: true }; } async getObjectUpdate(id, objectType) { try { const objectUpdate = { _id: id, objectType: objectType, object: await etcdServer.get(`/${objectType}s/${id}/object`) }; logger.trace(`Returning path: /${objectType}s/${id}/object`); return objectUpdate; } catch (error) { logger.error( `UpdateManager: Failed to get current value for /${objectType}s/${id}/object:`, error ); return { error: 'Not found' }; } } async setObjectUpdate(id, objectType, value) { try { await etcdServer.set(`/${objectType}s/${id}/object`, value); logger.trace(`Set value for path: /${objectType}s/${id}/object`); return true; } catch (error) { logger.error( `Failed to set value for /${objectType}s/${id}/object:`, error ); return false; } } }