import ConfigUpdateListener from "../config/ConfigUpdateListener"; import ConfigManager from "../config/ConfigManager"; import BufferManagerWorker from "./BufferManagerWorker"; import ApiBufferKey from "./ApiBufferKey"; import NoOpBufferManagerWorker from "./NoOpBufferManagerWorker"; import AgentConfig from "../common/data/AgentConfig"; abstract class AbstractBufferManager implements ConfigUpdateListener { private readonly configManager: ConfigManager; private readonly dummyWorker: BufferManagerWorker; private worker: BufferManagerWorker | null; protected constructor(configManager: ConfigManager) { this.configManager = configManager; this.dummyWorker = new NoOpBufferManagerWorker(); this.worker = this.dummyWorker; } abstract createWorker( agentConfig: AgentConfig ): BufferManagerWorker; onErroneousConfigUpdate(): void { if (this.worker) { let oldBuffer: BufferManagerWorker = this.worker; this.worker = this.dummyWorker; oldBuffer.shutdown(); } } onSuccessfulConfigUpdate(agentConfig: AgentConfig): void { if (!this.worker) return; if (!this.worker.getOperatingConfig()) return; // @ts-ignore if (this.isRefreshNeeded(this.worker.getOperatingConfig(), agentConfig)) { let oldBufferManagerWorker: BufferManagerWorker = this.worker; this.worker = this.createWorker(agentConfig); oldBufferManagerWorker.shutdown(); } } init(): boolean { return this.configManager.subscribeToUpdates(this); } shutdown(): boolean { if (this.worker) { this.worker.shutdown(); this.worker = null; } return true; } private isRefreshNeeded( olderConfig: AgentConfig, newConfig: AgentConfig ): boolean { if ( newConfig.getTimestamp().getTime() === 0 && olderConfig.getTimestamp().getTime() === 0 ) { return false; } return ( newConfig.getTimestamp().getTime() > olderConfig.getTimestamp().getTime() ); } getWorker(): BufferManagerWorker | null { return this.worker; } } export default AbstractBufferManager;