@awesome-ecs/workers
Version:
The Workers package for Awesome ECS. Provides basic implementation for the Worker communication using ECS.
78 lines (77 loc) • 2.36 kB
JavaScript
//#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
export { WorkerHandlerRegistry, WorkerMessageQueue };
//# sourceMappingURL=index.mjs.map