@daisugi/kintsugi
Version:
Kintsugi is a set of utilities to help build a fault tolerant services.
62 lines • 1.96 kB
JavaScript
import { urandom } from './urandom.js';
const defaultConcurrencyCount = 2;
var State;
(function (State) {
State[State["Waiting"] = 0] = "Waiting";
State[State["Running"] = 1] = "Running";
})(State || (State = {}));
function runTask(task, tasks) {
task.state = State.Running;
return task
.fn(...task.args)
.then((value) => {
const taskIndex = tasks.findIndex((t) => t.id === task.id);
tasks.splice(taskIndex, 1);
task.resolve(value);
const nextTask = tasks.find((t) => t.state === State.Waiting);
if (nextTask) {
runTask(nextTask, tasks);
}
})
.catch((reason) => {
const taskIndex = tasks.findIndex((t) => t.id === task.id);
tasks.splice(taskIndex, 1);
task.reject(reason);
const nextTask = tasks.find((t) => t.state === State.Waiting);
if (nextTask) {
runTask(nextTask, tasks);
}
});
}
function withPoolCreator(fn, tasks, concurrencyCount) {
return (...args) => new Promise((resolve, reject) => {
const task = {
fn,
id: urandom(),
args,
resolve,
reject,
state: State.Waiting,
};
tasks.push(task);
const runningTasks = tasks.filter(({ state }) => state === State.Running);
if (runningTasks.length < concurrencyCount) {
runTask(task, tasks);
}
});
}
export function createWithPool(opts = {}) {
const concurrencyCount = opts.concurrencyCount || defaultConcurrencyCount;
const tasks = [];
return {
withPool(fn) {
return withPoolCreator(fn, tasks, concurrencyCount);
},
};
}
export function withPool(fn, opts = {}) {
const concurrencyCount = opts.concurrencyCount || defaultConcurrencyCount;
const tasks = [];
return withPoolCreator(fn, tasks, concurrencyCount);
}
//# sourceMappingURL=with_pool.js.map