UNPKG

@daisugi/kintsugi

Version:

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

62 lines 1.96 kB
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