UNPKG

@daisugi/kintsugi

Version:

Kintsugi is a set of utilities to help build a fault tolerant services.

66 lines 2.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createWithPool = createWithPool; exports.withPool = withPool; const urandom_js_1 = require("./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: (0, urandom_js_1.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); } }); } function createWithPool(opts = {}) { const concurrencyCount = opts.concurrencyCount || defaultConcurrencyCount; const tasks = []; return { withPool(fn) { return withPoolCreator(fn, tasks, concurrencyCount); }, }; } function withPool(fn, opts = {}) { const concurrencyCount = opts.concurrencyCount || defaultConcurrencyCount; const tasks = []; return withPoolCreator(fn, tasks, concurrencyCount); } //# sourceMappingURL=with_pool.js.map