import BufferManagerWorker from "./BufferManagerWorker"; import ApiBufferKey from "./ApiBufferKey"; import Semaphore from "../common/utils/Semaphore"; import AgentConfig from "../common/data/AgentConfig"; import APISample from "../common/data/APISample"; import SimpleBuffer from "./SimpleBuffer"; import { postRequest } from "../common/utils/RequestExecutor"; import SDKLogger from "../SDKLogger"; class DiscoveredApiBufferManagerWorker extends BufferManagerWorker { private readonly semaphore: Semaphore; constructor(config: AgentConfig, ctUrl: string) { super(config, ctUrl); this.semaphore = new Semaphore(config.getDiscoveryBufferSize()); } init(): boolean { return true; } offer(key: ApiBufferKey, apiSample: APISample): boolean { // @ts-ignore //TODO: handle null case gracefully this.bufferMap.computeIfAbsent(key, new SimpleBuffer(this.getOperatingConfig()?.getDiscoveryBufferSizePerApi())); let buffer: SimpleBuffer | undefined = this.bufferMap.getBuffer(key); if (buffer) { return buffer.offer(apiSample); } else { return false; } } canOffer(key: ApiBufferKey): boolean { if (this.semaphore.tryAcquire()) { let canOffer: boolean = false; if (this.getOperatingConfig()?.getCaptureApiSample()) { let buffer: SimpleBuffer | undefined = this.bufferMap.getBuffer(key); if (buffer) { canOffer = buffer.canOffer(); } else { // @ts-ignore canOffer = this.bufferMap.getBufferMap().size < this.getOperatingConfig()?.getDiscoveryBufferSize(); } } this.semaphore.release(); return canOffer; } return false; } syncForKey(key: ApiBufferKey) { try { let buffer: SimpleBuffer | undefined = this.bufferMap.getBuffer(key); if (!buffer) { return; } let iterations: number = buffer.getContentCount(); if (iterations === 0) { this.bufferMap.delete(key); return; } let contents: APISample[] = []; for (let i = 0; i < iterations; i++) { let apiSample: APISample | undefined = buffer.poll(); if (apiSample) { contents.push(apiSample); } else { this.bufferMap.delete(key); break; } } if (contents.length === 0) { return; } postRequest(this.ctUrl + this.getUri(), contents) .then(() => {}) .catch((err) => { SDKLogger.error("While sending discovered api samples" + err); }); } catch (e) { SDKLogger.error("While sending discovered api samples" + e); } } } export default DiscoveredApiBufferManagerWorker;