UNPKG

@awesome-ecs/workers

Version:

The Workers package for Awesome ECS. Provides basic implementation for the Worker communication using ECS.

80 lines (79 loc) 2.48 kB
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); //#region src/helpers/worker-handler-registry.ts var WorkerHandlerRegistry = class { handlers = /* @__PURE__ */ new Map(); register(requestType, handler) { this.handlers.set(requestType, handler); } resolve(requestType) { return this.handlers.get(requestType); } }; //#endregion //#region src/helpers/worker-message-queue.ts const COMPACTION_THRESHOLD = 1024; var WorkerMessageQueue = class { _queue; _head; _enqueueTimes; _stalledEntries; _recentStalledWaitTimesMs; constructor() { this._queue = []; this._head = 0; this._enqueueTimes = []; this._stalledEntries = []; this._recentStalledWaitTimesMs = []; } get size() { return this._queue.length - this._head; } get queue() { return this._queue.slice(this._head); } enqueue(message) { this._queue.push(message); this._enqueueTimes.push(performance.now()); this._stalledEntries.push(false); } dequeue() { if (this._head >= this._queue.length) return; const item = this._queue[this._head]; const enqueuedAt = this._enqueueTimes[this._head]; const wasStalled = this._stalledEntries[this._head] === true; this._head++; if (enqueuedAt !== void 0 && wasStalled) this._recentStalledWaitTimesMs.push(performance.now() - enqueuedAt); if (this._head >= COMPACTION_THRESHOLD || this._head * 2 >= this._queue.length) { this._queue = this._queue.slice(this._head); this._enqueueTimes = this._enqueueTimes.slice(this._head); this._stalledEntries = this._stalledEntries.slice(this._head); this._head = 0; } return item; } /** Marks all currently queued messages as stalled until they are eventually dispatched. */ markAllAsStalled() { for (let i = this._head; i < this._stalledEntries.length; i++) this._stalledEntries[i] = true; } /** Returns and clears wait times for messages that previously stalled before dispatch. */ flushWaitTimes() { if (!this._recentStalledWaitTimesMs.length) return []; const result = this._recentStalledWaitTimesMs; this._recentStalledWaitTimesMs = []; return result; } peek() { if (this._head < this._queue.length) return this._queue[this._head]; } clear() { this._queue = []; this._head = 0; this._enqueueTimes = []; this._stalledEntries = []; this._recentStalledWaitTimesMs = []; } }; //#endregion exports.WorkerHandlerRegistry = WorkerHandlerRegistry; exports.WorkerMessageQueue = WorkerMessageQueue; //# sourceMappingURL=index.cjs.map