UNPKG

@randajan/treelock

Version:

A minimal async lock with timeout support and parent-child queueing.

8 lines (7 loc) 7.22 kB
{ "version": 3, "sources": ["../../src/index.js", "../../src/static.js", "../../src/TreeLock.js"], "sourcesContent": ["import { TreeLock } from \"./TreeLock\";\r\n\r\n\r\nexport { TreeLock };\r\n\r\nexport default (options={})=>new TreeLock(options);\r\n", "\r\nimport { timeout } from \"@randajan/sleep\";\r\n\r\n\r\nexport const _privates = new WeakMap();\r\n\r\nexport const bfn = ()=>{};\r\nexport class Timeout extends Error {}\r\n\r\nexport const toInt = (num, min, max, errorName)=>{\r\n if (num == null) { return; }\r\n const tp = typeof num;\r\n if (tp !== \"number\") { throw new Error(`Expects '${errorName}' to be a 'number' but received '${tp}'`); }\r\n if (min != null && num < min) { throw new Error(`Expects '${errorName}' to be greater than '${min}' but received '${num}'`); }\r\n if (max != null && num > max) { throw new Error(`Expects '${errorName}' to be lesser than '${max}' but received '${num}'`); }\r\n return Math.round(num);\r\n}\r\n\r\nexport const toTimeoutMs = (num)=>toInt(num, 0, 2147483647, \"timeout\");\r\n\r\nexport const withTimeout = (prom, tms)=>{\r\n if (!tms) { return prom; }\r\n return Promise.race([prom, timeout(tms, new Timeout(`Execution time exceeded ${tms/1000}s`))]);\r\n}\r\n\r\n\r\nexport const toFn = (any, errorName)=>{\r\n if (any == null) { return; }\r\n const tp = typeof any;\r\n if (tp !== \"function\") { throw new Error(`Expects '${errorName}' to be a 'number' but received '${tp}'`); }\r\n return any;\r\n}", "import { _privates, bfn, Timeout, toFn, toTimeoutMs, withTimeout } from \"./static\";\n\nexport class TreeLock {\n constructor(options={}) {\n const { name, ttl, on, sup } = options;\n const _pp = _privates.get(sup);\n\n const _p = {\n sup,\n queue: Promise.resolve(),\n ram:0,\n enqueue: !_pp ? _=>_p.queue : _=>Promise.all([_p.queue, _pp.queue]),\n ttl:toTimeoutMs(ttl) ?? _pp?.ttl,\n on:toFn(on) || _pp?.on || bfn,\n }\n\n _p.append = (sub)=>{\n if (_p.subs) { _p.subs.push(sub); }\n else {\n _p.subs = [sub];\n const enq = _p.enqueue;\n _p.enqueue = _=>Promise.all([enq(), ..._p.subs.map(b=>b.queue)]);\n }\n }\n\n const finish = ()=>_p.ram = Math.max(0, _p.ram-1);\n const done = (r) =>{ finish(); _p.on(this, \"done\"); return r; };\n const crash = (err)=>{\n finish();\n const status = (err instanceof Timeout) ? \"timeout\" : \"error\";\n _p.on(this, status, err);\n }\n\n _p.run = (fn, tms, args)=>{ \n _p.ram++;\n if (this.ram + this.ramSup > 1) { _p.on(this, \"enter\"); }\n\n const exec = () => {\n _p.on(this, \"start\");\n return withTimeout(fn(...args), tms).then(done);\n };\n \n const next = _p.enqueue().then(exec);\n _p.queue = next.catch(crash);\n return next;\n }\n\n const enumerable = true;\n Object.defineProperties(this, {\n name:{ value:name },\n sup:{ value:sup },\n subs: { get:_=>[..._p.subs] },\n ram:{ enumerable, get:_=>_p.ram },\n ramSup:{ enumerable, get:!_pp ? _=>0 : _=>sup.ram + sup.ramSup },\n ramSub:{ enumerable, get:_=>_p.subs.reduce((r, s)=>r+s.ram+s.ramSub, 0) },\n queue:{ get:_=>_p.queue}\n });\n\n _privates.set(this, _p);\n if (_pp) { _pp.append(this); }\n }\n\n run(fn, ttl, ...args) {\n const _p = _privates.get(this);\n ttl = toTimeoutMs(ttl) ?? _p.ttl;\n return _p.run(fn, ttl, args);\n }\n\n wrap(fn, ttl) {\n const _p = _privates.get(this);\n ttl = toTimeoutMs(ttl) ?? _p.ttl;\n return (...args) => _p.run(fn, ttl, args);\n }\n\n sub(options={}) {\n return new TreeLock({\n ...options,\n sup:this\n });\n }\n\n}\n\n"], "mappings": "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", "names": [] }