111 lines
3.4 KiB
JavaScript
111 lines
3.4 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.AsynchronouslyCreatedResourcePool = exports.AsynchronouslyCreatedResource = void 0;
|
|
const node_assert_1 = __importDefault(require("node:assert"));
|
|
class AsynchronouslyCreatedResource {
|
|
constructor() {
|
|
this.onreadyListeners = [];
|
|
this.ondestroyListeners = [];
|
|
}
|
|
markAsReady() {
|
|
const listeners = this.onreadyListeners;
|
|
(0, node_assert_1.default)(listeners !== null);
|
|
this.onreadyListeners = null;
|
|
for (const listener of listeners) {
|
|
listener();
|
|
}
|
|
}
|
|
isReady() {
|
|
return this.onreadyListeners === null;
|
|
}
|
|
onReady(fn) {
|
|
if (this.onreadyListeners === null) {
|
|
fn(); // Zalgo is okay here.
|
|
return;
|
|
}
|
|
this.onreadyListeners.push(fn);
|
|
}
|
|
onDestroy(fn) {
|
|
if (this.ondestroyListeners === null) {
|
|
return;
|
|
}
|
|
this.ondestroyListeners.push(fn);
|
|
}
|
|
markAsDestroyed() {
|
|
const listeners = this.ondestroyListeners;
|
|
(0, node_assert_1.default)(listeners !== null);
|
|
this.ondestroyListeners = null;
|
|
for (const listener of listeners) {
|
|
listener();
|
|
}
|
|
}
|
|
isDestroyed() {
|
|
return this.ondestroyListeners === null;
|
|
}
|
|
}
|
|
exports.AsynchronouslyCreatedResource = AsynchronouslyCreatedResource;
|
|
// TODO: this will eventually become an scheduler
|
|
class AsynchronouslyCreatedResourcePool {
|
|
constructor(maximumUsage) {
|
|
this.pendingItems = new Set();
|
|
this.readyItems = new Set();
|
|
this.maximumUsage = maximumUsage;
|
|
this.onAvailableListeners = [];
|
|
this.onTaskDoneListeners = [];
|
|
}
|
|
add(item) {
|
|
this.pendingItems.add(item);
|
|
item.onReady(() => {
|
|
/* istanbul ignore else */
|
|
if (this.pendingItems.has(item)) {
|
|
this.pendingItems.delete(item);
|
|
this.readyItems.add(item);
|
|
this.maybeAvailable(item);
|
|
}
|
|
});
|
|
}
|
|
delete(item) {
|
|
this.pendingItems.delete(item);
|
|
this.readyItems.delete(item);
|
|
}
|
|
*[Symbol.iterator]() {
|
|
yield* this.pendingItems;
|
|
yield* this.readyItems;
|
|
}
|
|
get size() {
|
|
return this.pendingItems.size + this.readyItems.size;
|
|
}
|
|
maybeAvailable(item) {
|
|
/* istanbul ignore else */
|
|
if (item.currentUsage() < this.maximumUsage) {
|
|
for (const listener of this.onAvailableListeners) {
|
|
listener(item);
|
|
}
|
|
}
|
|
}
|
|
onAvailable(fn) {
|
|
this.onAvailableListeners.push(fn);
|
|
}
|
|
taskDone(item) {
|
|
for (let i = 0; i < this.onTaskDoneListeners.length; i++) {
|
|
this.onTaskDoneListeners[i](item);
|
|
}
|
|
}
|
|
onTaskDone(fn) {
|
|
this.onTaskDoneListeners.push(fn);
|
|
}
|
|
getCurrentUsage() {
|
|
let inFlight = 0;
|
|
for (const worker of this.readyItems) {
|
|
const currentUsage = worker.currentUsage();
|
|
if (Number.isFinite(currentUsage))
|
|
inFlight += currentUsage;
|
|
}
|
|
return inFlight;
|
|
}
|
|
}
|
|
exports.AsynchronouslyCreatedResourcePool = AsynchronouslyCreatedResourcePool;
|
|
//# sourceMappingURL=base.js.map
|