mini-semaphore 1.3.13 → 1.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,6 +13,10 @@
13
13
  A lightweight version of `Semaphore` that limits the number of process that can simultaneously access a resource or pool of resources.
14
14
  This implementation can only work within one javascript runtime thead and realized by `Promise`
15
15
 
16
+ > ## API
17
+
18
+ + [mini-semaphore API](./mini-semaphore-api.md)
19
+
16
20
  > ## Usage
17
21
 
18
22
  + how to imports
package/cjs/core.js CHANGED
@@ -1,14 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.release = exports.acquire = void 0;
4
- const extras_1 = require("./extras");
5
4
  /**
6
- * @typedef {import("./index").Deque} Deque
7
5
  * @typedef {import("./index").TVoidFunction} TVoidFunction
6
+ * @typedef {import("./index").Deque<TVoidFunction>} Deque
8
7
  * @typedef {import("./index").ISimplifiedLock} ISimplifiedLock
9
8
  * @typedef {import("./index").TFlowableLock} TFlowableLock
10
9
  * @typedef {import("./index").IFlowableLock} IFlowableLock
11
10
  */
11
+ /**
12
+ * Throws an error indicating an inconsistent state in mini-semaphore.
13
+ */
14
+ const THROW = /* istanbul ignore next */ () => {
15
+ throw new Error("mini-semaphore: Detected an inconsistent state, possibly due to a logic error or unexpected behavior.");
16
+ };
12
17
  /**
13
18
  *
14
19
  * @param {TFlowableLock} z
@@ -44,8 +49,10 @@ exports.acquire = acquire;
44
49
  * @returns {void}
45
50
  */
46
51
  const release = (dis) => {
47
- if (dis.q.length) {
48
- (dis.q.shift() || /* istanbul ignore next */ extras_1.THROW)();
52
+ /** @type {Deque} */
53
+ let dq;
54
+ if ((dq = dis.q).length) {
55
+ (dq.shift() || /* istanbul ignore next */ THROW)();
49
56
  }
50
57
  else {
51
58
  dis.capacity++;
package/cjs/deque.js CHANGED
@@ -10,7 +10,8 @@ exports.Deque = void 0;
10
10
  * @param {number} di dest index
11
11
  * @param {number} len move count
12
12
  */
13
- const am = /* istanbul ignore next */ (src, si, dst, di, len) => {
13
+ /* istanbul ignore next */
14
+ const am = (src, si, dst, di, len) => {
14
15
  for (let j = 0; j < len; ++j) {
15
16
  dst[j + di] = src[j + si];
16
17
  src[j + si] = void 0;
@@ -16,25 +16,23 @@ exports.restrictor = void 0;
16
16
  const c = require("./class");
17
17
  /**
18
18
  * @typedef {import("./index").IFlowableLock & { last?: number }} TFlowableLockWithTimeStamp
19
- * @typedef {string | number} TLockRecordKey
20
19
  */
21
20
  /**
22
21
  * Flow Restriction
23
22
  */
24
- var restrictor;
25
- (function (restrictor) {
23
+ exports.restrictor = (() => {
26
24
  const { MiniSemaphore: MS } = c;
27
25
  /**
28
26
  * @internal
29
27
  */
30
28
  const internalLock = new MS(1);
31
29
  /**
32
- * @type {Record<TLockRecordKey, TFlowableLockWithTimeStamp>}
30
+ * @type {Record<PropertyKey, TFlowableLockWithTimeStamp>}
33
31
  */
34
32
  let locks = Object.create(null);
35
33
  /**
36
34
  *
37
- * @param {TLockRecordKey} key
35
+ * @param {PropertyKey} key
38
36
  * @param {number} restriction
39
37
  * @throws when different restriction
40
38
  */
@@ -46,7 +44,7 @@ var restrictor;
46
44
  }
47
45
  if (lock.limit !== restriction) {
48
46
  internalLock.release();
49
- throw new ReferenceError(`Cannot get object with different restriction: key: '${key}', lock.limit: ${lock.limit} <-> restriction: ${restriction},`);
47
+ throw new ReferenceError(`Cannot get object with different restriction: key: '${String(key)}', lock.limit: ${lock.limit} <-> restriction: ${restriction},`);
50
48
  }
51
49
  internalLock.release();
52
50
  return lock;
@@ -56,10 +54,10 @@ var restrictor;
56
54
  *
57
55
  * + ⚠️ The object to be retrieved with `key` must already be created with `multi` ore `one`
58
56
  *
59
- * @param {TLockRecordKey} key
57
+ * @param {PropertyKey} key
60
58
  * @returns `IFlowableLock` instance or `undefined`
61
59
  */
62
- restrictor.getLockByKey = async (key) => {
60
+ const getLockByKey = async (key) => {
63
61
  await internalLock.acquire(false);
64
62
  const l = locks[key];
65
63
  internalLock.release();
@@ -73,7 +71,7 @@ var restrictor;
73
71
  * @returns {Promise<number>} eliminated count
74
72
  * @date 2020/6/19
75
73
  */
76
- restrictor.cleanup = async (timeSpan, debug) => {
74
+ const cleanup = async (timeSpan, debug) => {
77
75
  await internalLock.acquire(false);
78
76
  const currentLocks = locks;
79
77
  const newLocks = Object.create(null);
@@ -84,7 +82,6 @@ var restrictor;
84
82
  !timeSpan && /* istanbul ignore next */ (timeSpan = 1);
85
83
  timeSpan *= 1000;
86
84
  if (debug) {
87
- // @ts-ignore
88
85
  eliminatedKeys = [];
89
86
  }
90
87
  for (let i = 0, end = keys.length; i < end;) {
@@ -115,7 +112,7 @@ var restrictor;
115
112
  * Allocate a semaphore for each `key`, and limit the number of shares with the value of `restriction`
116
113
  *
117
114
  * @template {any} T
118
- * @param {TLockRecordKey} key number or string as tag
115
+ * @param {PropertyKey} key number or string as tag
119
116
  * @param {number} restriction number of process restriction
120
117
  * @param {() => Promise<T>} pb the process body
121
118
  */
@@ -125,7 +122,6 @@ var restrictor;
125
122
  s.last = Date.now();
126
123
  return result;
127
124
  }
128
- restrictor.multi = multi;
129
125
  /**
130
126
  * synonym of `multi(key, 1, pb)`
131
127
  *
@@ -133,11 +129,13 @@ var restrictor;
133
129
  * * Avoid concurrent requests to the same url
134
130
  *
135
131
  * @template {any} T
136
- * @param {TLockRecordKey} key number or string as tag
132
+ * @param {PropertyKey} key number or string as tag
137
133
  * @param {() => Promise<T>} pb the process body
138
134
  */
139
135
  async function one(key, pb) {
140
136
  return multi(key, 1, pb);
141
137
  }
142
- restrictor.one = one;
143
- })(restrictor || (exports.restrictor = restrictor = {}));
138
+ return {
139
+ getLockByKey, cleanup, multi, one
140
+ };
141
+ })();
package/cjs/index.js CHANGED
@@ -1,11 +1,4 @@
1
1
  "use strict";
2
- /*!
3
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4
- Copyright (C) 2020 jeffy-g <hirotom1107@gmail.com>
5
- Released under the MIT license
6
- https://opensource.org/licenses/mit-license.php
7
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
8
- */
9
2
  Object.defineProperty(exports, "__esModule", { value: true });
10
3
  exports.version = exports.restrictor = exports.Deque = exports.create = exports.MiniSemaphore = void 0;
11
4
  var class_1 = require("./class");
@@ -16,4 +9,4 @@ var deque_1 = require("./deque");
16
9
  Object.defineProperty(exports, "Deque", { enumerable: true, get: function () { return deque_1.Deque; } });
17
10
  var flow_restrictor_1 = require("./flow-restrictor");
18
11
  Object.defineProperty(exports, "restrictor", { enumerable: true, get: function () { return flow_restrictor_1.restrictor; } });
19
- exports.version = "v1.3.13";
12
+ exports.version = "v1.3.16";
package/esm/core.mjs CHANGED
@@ -1,11 +1,16 @@
1
- import { THROW } from "./extras.mjs";
2
1
  /**
3
- * @typedef {import("./index.mjs").Deque} Deque
4
2
  * @typedef {import("./index.mjs").TVoidFunction} TVoidFunction
3
+ * @typedef {import("./index.mjs").Deque<TVoidFunction>} Deque
5
4
  * @typedef {import("./index.mjs").ISimplifiedLock} ISimplifiedLock
6
5
  * @typedef {import("./index.mjs").TFlowableLock} TFlowableLock
7
6
  * @typedef {import("./index.mjs").IFlowableLock} IFlowableLock
8
7
  */
8
+ /**
9
+ * Throws an error indicating an inconsistent state in mini-semaphore.
10
+ */
11
+ const THROW = /* istanbul ignore next */ () => {
12
+ throw new Error("mini-semaphore: Detected an inconsistent state, possibly due to a logic error or unexpected behavior.");
13
+ };
9
14
  /**
10
15
  *
11
16
  * @param {TFlowableLock} z
@@ -40,8 +45,10 @@ export const acquire = (dis, lazy = true) => {
40
45
  * @returns {void}
41
46
  */
42
47
  export const release = (dis) => {
43
- if (dis.q.length) {
44
- (dis.q.shift() || /* istanbul ignore next */ THROW)();
48
+ /** @type {Deque} */
49
+ let dq;
50
+ if ((dq = dis.q).length) {
51
+ (dq.shift() || /* istanbul ignore next */ THROW)();
45
52
  }
46
53
  else {
47
54
  dis.capacity++;
package/esm/deque.mjs CHANGED
@@ -7,7 +7,8 @@
7
7
  * @param {number} di dest index
8
8
  * @param {number} len move count
9
9
  */
10
- const am = /* istanbul ignore next */ (src, si, dst, di, len) => {
10
+ /* istanbul ignore next */
11
+ const am = (src, si, dst, di, len) => {
11
12
  for (let j = 0; j < len; ++j) {
12
13
  dst[j + di] = src[j + si];
13
14
  src[j + si] = void 0;
@@ -13,25 +13,23 @@
13
13
  import * as c from "./class.mjs";
14
14
  /**
15
15
  * @typedef {import("./index.mjs").IFlowableLock & { last?: number }} TFlowableLockWithTimeStamp
16
- * @typedef {string | number} TLockRecordKey
17
16
  */
18
17
  /**
19
18
  * Flow Restriction
20
19
  */
21
- export var restrictor;
22
- (function (restrictor) {
20
+ export const restrictor = (() => {
23
21
  const { MiniSemaphore: MS } = c;
24
22
  /**
25
23
  * @internal
26
24
  */
27
25
  const internalLock = new MS(1);
28
26
  /**
29
- * @type {Record<TLockRecordKey, TFlowableLockWithTimeStamp>}
27
+ * @type {Record<PropertyKey, TFlowableLockWithTimeStamp>}
30
28
  */
31
29
  let locks = Object.create(null);
32
30
  /**
33
31
  *
34
- * @param {TLockRecordKey} key
32
+ * @param {PropertyKey} key
35
33
  * @param {number} restriction
36
34
  * @throws when different restriction
37
35
  */
@@ -43,7 +41,7 @@ export var restrictor;
43
41
  }
44
42
  if (lock.limit !== restriction) {
45
43
  internalLock.release();
46
- throw new ReferenceError(`Cannot get object with different restriction: key: '${key}', lock.limit: ${lock.limit} <-> restriction: ${restriction},`);
44
+ throw new ReferenceError(`Cannot get object with different restriction: key: '${String(key)}', lock.limit: ${lock.limit} <-> restriction: ${restriction},`);
47
45
  }
48
46
  internalLock.release();
49
47
  return lock;
@@ -53,10 +51,10 @@ export var restrictor;
53
51
  *
54
52
  * + ⚠️ The object to be retrieved with `key` must already be created with `multi` ore `one`
55
53
  *
56
- * @param {TLockRecordKey} key
54
+ * @param {PropertyKey} key
57
55
  * @returns `IFlowableLock` instance or `undefined`
58
56
  */
59
- restrictor.getLockByKey = async (key) => {
57
+ const getLockByKey = async (key) => {
60
58
  await internalLock.acquire(false);
61
59
  const l = locks[key];
62
60
  internalLock.release();
@@ -70,7 +68,7 @@ export var restrictor;
70
68
  * @returns {Promise<number>} eliminated count
71
69
  * @date 2020/6/19
72
70
  */
73
- restrictor.cleanup = async (timeSpan, debug) => {
71
+ const cleanup = async (timeSpan, debug) => {
74
72
  await internalLock.acquire(false);
75
73
  const currentLocks = locks;
76
74
  const newLocks = Object.create(null);
@@ -81,7 +79,6 @@ export var restrictor;
81
79
  !timeSpan && /* istanbul ignore next */ (timeSpan = 1);
82
80
  timeSpan *= 1000;
83
81
  if (debug) {
84
- // @ts-ignore
85
82
  eliminatedKeys = [];
86
83
  }
87
84
  for (let i = 0, end = keys.length; i < end;) {
@@ -112,7 +109,7 @@ export var restrictor;
112
109
  * Allocate a semaphore for each `key`, and limit the number of shares with the value of `restriction`
113
110
  *
114
111
  * @template {any} T
115
- * @param {TLockRecordKey} key number or string as tag
112
+ * @param {PropertyKey} key number or string as tag
116
113
  * @param {number} restriction number of process restriction
117
114
  * @param {() => Promise<T>} pb the process body
118
115
  */
@@ -122,7 +119,6 @@ export var restrictor;
122
119
  s.last = Date.now();
123
120
  return result;
124
121
  }
125
- restrictor.multi = multi;
126
122
  /**
127
123
  * synonym of `multi(key, 1, pb)`
128
124
  *
@@ -130,11 +126,13 @@ export var restrictor;
130
126
  * * Avoid concurrent requests to the same url
131
127
  *
132
128
  * @template {any} T
133
- * @param {TLockRecordKey} key number or string as tag
129
+ * @param {PropertyKey} key number or string as tag
134
130
  * @param {() => Promise<T>} pb the process body
135
131
  */
136
132
  async function one(key, pb) {
137
133
  return multi(key, 1, pb);
138
134
  }
139
- restrictor.one = one;
140
- })(restrictor || (restrictor = {}));
135
+ return {
136
+ getLockByKey, cleanup, multi, one
137
+ };
138
+ })();
package/esm/index.mjs CHANGED
@@ -1,12 +1,5 @@
1
- /*!
2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3
- Copyright (C) 2020 jeffy-g <hirotom1107@gmail.com>
4
- Released under the MIT license
5
- https://opensource.org/licenses/mit-license.php
6
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
7
- */
8
1
  export { MiniSemaphore } from "./class.mjs";
9
2
  export { create } from "./object.mjs";
10
3
  export { Deque } from "./deque.mjs";
11
4
  export { restrictor } from "./flow-restrictor.mjs";
12
- export const version = "v1.3.13";
5
+ export const version = "v1.3.16";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mini-semaphore",
3
- "version": "1.3.13",
3
+ "version": "1.3.16",
4
4
  "description": "A lightweight version of Semaphore",
5
5
  "private": false,
6
6
  "main": "./cjs/index.js",
package/umd/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*! For license information please see index.js.LICENSE.txt */
2
- ((e,t)=>{'object'==typeof exports&&'object'==typeof module?module.exports=t():'function'==typeof define&&define.amd?define([],t):'object'==typeof exports?exports.MiniSema=t():e.MiniSema=t()})(globalThis,(()=>(()=>{"use strict";var e={139:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.create=void 0;const r=i(461),n=i(761),s=r.acquire,o=r.release;t.create=e=>({capacity:e,limit:e,q:new n.Deque(e),acquire(e){return s(this,e)},release(){o(this)},setRestriction(e){this.limit=this.capacity=e},get pending(){return this.q.length},async flow(e,t){await s(this,t);try{return await e()}finally{o(this)}}})},461:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.release=t.acquire=void 0;const r=i(669),n=(e,t)=>{e.capacity>0?(e.capacity--,t()):e.q.push(t)}
3
- ;t.acquire=(e,t=!0)=>new Promise((i=>{t?setTimeout((()=>n(e,i)),4):n(e,i)}));t.release=e=>{e.q.length?(e.q.shift()||r.THROW)():e.capacity++,e.capacity>e.limit&&(console.warn("inconsistent release!"),e.capacity=e.limit)}},464:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restrictor=void 0;const r=i(518);var n;!function(e){const{MiniSemaphore:t}=r,i=new t(1);let n=Object.create(null);async function s(e,r,s){const o=await(async(e,r)=>{await i.acquire(!1);let s=n[e];if(s||(n[e]=s=new t(r)),s.limit!==r)throw i.release(),new ReferenceError(`Cannot get object with different restriction: key: '${e}', lock.limit: ${s.limit} <-> restriction: ${r},`);return i.release(),s})(e,r),a=o.flow(s);return o.last=Date.now(),a}e.getLockByKey=async e=>{await i.acquire(!1);const t=n[e]
4
- ;return i.release(),t},e.cleanup=async(e,t)=>{await i.acquire(!1);const r=n,s=Object.create(null),o=Object.keys(r);let a,c=0;!e&&(e=1),e*=1e3,t&&(a=[]);for(let i=0,n=o.length;i<n;){const n=o[i++],l=r[n];l.last&&Date.now()-l.last>=e?(c++,t&&a.push(n)):s[n]=l}return n=s,i.release(),t&&console.log(`eliminated: [\n${a.join(",\n")}\n]\nlived: [\n${Object.keys(s).join(",\n")}\n]`),c},e.multi=s,e.one=async function(e,t){return s(e,1,t)}}(n||(t.restrictor=n={}))},518:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MiniSemaphore=void 0;const r=i(461),n=i(761),s=r.acquire,o=r.release;t.MiniSemaphore=class{constructor(e){this.limit=this.capacity=e,this.q=new n.Deque(e)}acquire(e){return s(this,e)}release(){o(this)}setRestriction(e){this.limit=this.capacity=e}get pending(){
5
- return this.q.length}async flow(e,t){await s(this,t);try{return await e()}finally{o(this)}}}},669:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.THROW=void 0;t.THROW=()=>{throw new Error("mini-semaphore: inconsistent occurred")}},761:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Deque=void 0;const i=e=>(e=>(e>>>=0,e-=1,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,1+(e|=e>>16)))(Math.min(Math.max(16,0|e),1073741824));t.Deque=class{constructor(e){this._c=i(e),this._l=0,this._f=0,this._a=[]}push(e){const t=this._l;this._c<t+1&&r(this,i(1.5*this._c+16));const n=this._f+t&this._c-1;this._a[n]=e,this._l=t+1}shift(){const e=this._l;if(0===e)return;const t=this._f,i=this._a[t];return this._a[t]=void 0,this._f=t+1&this._c-1,this._l=e-1,i}get length(){return this._l}};const r=(e,t)=>{
6
- const i=e._c;e._c=t;const r=e._f+e._l;if(r>i){const t=r&i-1;((e,t,i,r,n)=>{for(let s=0;s<n;++s)i[s+r]=e[s+t],e[s+t]=void 0})(e._a,0,e._a,i,t)}}}},t={};function i(r){var n=t[r];if(void 0!==n)return n.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,i),s.exports}var r={};return(()=>{var e=r;Object.defineProperty(e,"__esModule",{value:!0}),e.version=e.restrictor=e.Deque=e.create=e.MiniSemaphore=void 0;var t=i(518);Object.defineProperty(e,"MiniSemaphore",{enumerable:!0,get:function(){return t.MiniSemaphore}});var n=i(139);Object.defineProperty(e,"create",{enumerable:!0,get:function(){return n.create}});var s=i(761);Object.defineProperty(e,"Deque",{enumerable:!0,get:function(){return s.Deque}});var o=i(464);Object.defineProperty(e,"restrictor",{enumerable:!0,get:function(){
7
- return o.restrictor}}),e.version="v1.3.13"})(),r})()));
2
+ ((e,t)=>{'object'==typeof exports&&'object'==typeof module?module.exports=t():'function'==typeof define&&define.amd?define([],t):'object'==typeof exports?exports.MiniSema=t():e.MiniSema=t()})(globalThis,(()=>(()=>{"use strict";var e={139:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.create=void 0;const r=i(461),n=i(761),s=r.acquire,o=r.release;t.create=e=>({capacity:e,limit:e,q:new n.Deque(e),acquire(e){return s(this,e)},release(){o(this)},setRestriction(e){this.limit=this.capacity=e},get pending(){return this.q.length},async flow(e,t){await s(this,t);try{return await e()}finally{o(this)}}})},461:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.release=t.acquire=void 0;const i=()=>{
3
+ throw new Error("mini-semaphore: Detected an inconsistent state, possibly due to a logic error or unexpected behavior.")},r=(e,t)=>{e.capacity>0?(e.capacity--,t()):e.q.push(t)};t.acquire=(e,t=!0)=>new Promise((i=>{t?setTimeout((()=>r(e,i)),4):r(e,i)}));t.release=e=>{let t;(t=e.q).length?(t.shift()||i)():e.capacity++,e.capacity>e.limit&&(console.warn("inconsistent release!"),e.capacity=e.limit)}},464:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restrictor=void 0;const r=i(518);t.restrictor=(()=>{const{MiniSemaphore:e}=r,t=new e(1);let i=Object.create(null);async function n(r,n,s){const o=await(async(r,n)=>{await t.acquire(!1);let s=i[r];if(s||(i[r]=s=new e(n)),s.limit!==n)throw t.release(),
4
+ new ReferenceError(`Cannot get object with different restriction: key: '${String(r)}', lock.limit: ${s.limit} <-> restriction: ${n},`);return t.release(),s})(r,n),a=o.flow(s);return o.last=Date.now(),a}return{getLockByKey:async e=>{await t.acquire(!1);const r=i[e];return t.release(),r},cleanup:async(e,r)=>{await t.acquire(!1);const n=i,s=Object.create(null),o=Object.keys(n);let a,c=0;!e&&(e=1),e*=1e3,r&&(a=[]);for(let t=0,i=o.length;t<i;){const i=o[t++],l=n[i];l.last&&Date.now()-l.last>=e?(c++,r&&a.push(i)):s[i]=l}return i=s,t.release(),r&&console.log(`eliminated: [\n${a.join(",\n")}\n]\nlived: [\n${Object.keys(s).join(",\n")}\n]`),c},multi:n,one:async function(e,t){return n(e,1,t)}}})()},518:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MiniSemaphore=void 0
5
+ ;const r=i(461),n=i(761),s=r.acquire,o=r.release;t.MiniSemaphore=class{constructor(e){this.limit=this.capacity=e,this.q=new n.Deque(e)}acquire(e){return s(this,e)}release(){o(this)}setRestriction(e){this.limit=this.capacity=e}get pending(){return this.q.length}async flow(e,t){await s(this,t);try{return await e()}finally{o(this)}}}},761:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Deque=void 0;const i=e=>(e=>(e>>>=0,e-=1,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,1+(e|=e>>16)))(Math.min(Math.max(16,0|e),1073741824));t.Deque=class{constructor(e){this._c=i(e),this._l=0,this._f=0,this._a=[]}push(e){const t=this._l;this._c<t+1&&r(this,i(1.5*this._c+16));const n=this._f+t&this._c-1;this._a[n]=e,this._l=t+1}shift(){const e=this._l;if(0===e)return;const t=this._f,i=this._a[t]
6
+ ;return this._a[t]=void 0,this._f=t+1&this._c-1,this._l=e-1,i}get length(){return this._l}};const r=(e,t)=>{const i=e._c;e._c=t;const r=e._f+e._l;if(r>i){const t=r&i-1;((e,t,i,r,n)=>{for(let s=0;s<n;++s)i[s+r]=e[s+t],e[s+t]=void 0})(e._a,0,e._a,i,t)}}}},t={};function i(r){var n=t[r];if(void 0!==n)return n.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,i),s.exports}var r={};return(()=>{var e=r;Object.defineProperty(e,"__esModule",{value:!0}),e.version=e.restrictor=e.Deque=e.create=e.MiniSemaphore=void 0;var t=i(518);Object.defineProperty(e,"MiniSemaphore",{enumerable:!0,get:function(){return t.MiniSemaphore}});var n=i(139);Object.defineProperty(e,"create",{enumerable:!0,get:function(){return n.create}});var s=i(761);Object.defineProperty(e,"Deque",{enumerable:!0,get:function(){
7
+ return s.Deque}});var o=i(464);Object.defineProperty(e,"restrictor",{enumerable:!0,get:function(){return o.restrictor}}),e.version="v1.3.16"})(),r})()));
package/webpack/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /*! For license information please see index.js.LICENSE.txt */
2
- (()=>{"use strict";var e={139:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.create=void 0;const r=i(461),n=i(761),s=r.acquire,a=r.release;t.create=e=>({capacity:e,limit:e,q:new n.Deque(e),acquire(e){return s(this,e)},release(){a(this)},setRestriction(e){this.limit=this.capacity=e},get pending(){return this.q.length},async flow(e,t){await s(this,t);try{return await e()}finally{a(this)}}})},461:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.release=t.acquire=void 0;const r=i(669),n=(e,t)=>{e.capacity>0?(e.capacity--,t()):e.q.push(t)};t.acquire=(e,t=!0)=>new Promise((i=>{t?setTimeout((()=>n(e,i)),4):n(e,i)}));t.release=e=>{e.q.length?(e.q.shift()||r.THROW)():e.capacity++,e.capacity>e.limit&&(console.warn("inconsistent release!"),e.capacity=e.limit)}},
3
- 464:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restrictor=void 0;const r=i(518);var n;!function(e){const{MiniSemaphore:t}=r,i=new t(1);let n=Object.create(null);async function s(e,r,s){const a=await(async(e,r)=>{await i.acquire(!1);let s=n[e];if(s||(n[e]=s=new t(r)),s.limit!==r)throw i.release(),new ReferenceError(`Cannot get object with different restriction: key: '${e}', lock.limit: ${s.limit} <-> restriction: ${r},`);return i.release(),s})(e,r),c=a.flow(s);return a.last=Date.now(),c}e.getLockByKey=async e=>{await i.acquire(!1);const t=n[e];return i.release(),t},e.cleanup=async(e,t)=>{await i.acquire(!1);const r=n,s=Object.create(null),a=Object.keys(r);let c,o=0;!e&&(e=1),e*=1e3,t&&(c=[]);for(let i=0,n=a.length;i<n;){const n=a[i++],l=r[n]
4
- ;l.last&&Date.now()-l.last>=e?(o++,t&&c.push(n)):s[n]=l}return n=s,i.release(),t&&console.log(`eliminated: [\n${c.join(",\n")}\n]\nlived: [\n${Object.keys(s).join(",\n")}\n]`),o},e.multi=s,e.one=async function(e,t){return s(e,1,t)}}(n||(t.restrictor=n={}))},518:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MiniSemaphore=void 0;const r=i(461),n=i(761),s=r.acquire,a=r.release;t.MiniSemaphore=class{constructor(e){this.limit=this.capacity=e,this.q=new n.Deque(e)}acquire(e){return s(this,e)}release(){a(this)}setRestriction(e){this.limit=this.capacity=e}get pending(){return this.q.length}async flow(e,t){await s(this,t);try{return await e()}finally{a(this)}}}},669:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.THROW=void 0;t.THROW=()=>{
5
- throw new Error("mini-semaphore: inconsistent occurred")}},761:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Deque=void 0;const i=e=>(e=>(e>>>=0,e-=1,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,1+(e|=e>>16)))(Math.min(Math.max(16,0|e),1073741824));t.Deque=class{constructor(e){this._c=i(e),this._l=0,this._f=0,this._a=[]}push(e){const t=this._l;this._c<t+1&&r(this,i(1.5*this._c+16));const n=this._f+t&this._c-1;this._a[n]=e,this._l=t+1}shift(){const e=this._l;if(0===e)return;const t=this._f,i=this._a[t];return this._a[t]=void 0,this._f=t+1&this._c-1,this._l=e-1,i}get length(){return this._l}};const r=(e,t)=>{const i=e._c;e._c=t;const r=e._f+e._l;if(r>i){const t=r&i-1;((e,t,i,r,n)=>{for(let s=0;s<n;++s)i[s+r]=e[s+t],e[s+t]=void 0})(e._a,0,e._a,i,t)}}}},t={};function i(r){var n=t[r]
6
- ;if(void 0!==n)return n.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,i),s.exports}var r={};(()=>{var e=r;Object.defineProperty(e,"__esModule",{value:!0}),e.version=e.restrictor=e.Deque=e.create=e.MiniSemaphore=void 0;var t=i(518);Object.defineProperty(e,"MiniSemaphore",{enumerable:!0,get:function(){return t.MiniSemaphore}});var n=i(139);Object.defineProperty(e,"create",{enumerable:!0,get:function(){return n.create}});var s=i(761);Object.defineProperty(e,"Deque",{enumerable:!0,get:function(){return s.Deque}});var a=i(464);Object.defineProperty(e,"restrictor",{enumerable:!0,get:function(){return a.restrictor}}),e.version="v1.3.13"})(),module.exports=r})();
2
+ (()=>{"use strict";var e={139:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.create=void 0;const r=i(461),n=i(761),s=r.acquire,a=r.release;t.create=e=>({capacity:e,limit:e,q:new n.Deque(e),acquire(e){return s(this,e)},release(){a(this)},setRestriction(e){this.limit=this.capacity=e},get pending(){return this.q.length},async flow(e,t){await s(this,t);try{return await e()}finally{a(this)}}})},461:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.release=t.acquire=void 0;const i=()=>{throw new Error("mini-semaphore: Detected an inconsistent state, possibly due to a logic error or unexpected behavior.")},r=(e,t)=>{e.capacity>0?(e.capacity--,t()):e.q.push(t)};t.acquire=(e,t=!0)=>new Promise((i=>{t?setTimeout((()=>r(e,i)),4):r(e,i)}));t.release=e=>{let t
3
+ ;(t=e.q).length?(t.shift()||i)():e.capacity++,e.capacity>e.limit&&(console.warn("inconsistent release!"),e.capacity=e.limit)}},464:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restrictor=void 0;const r=i(518);t.restrictor=(()=>{const{MiniSemaphore:e}=r,t=new e(1);let i=Object.create(null);async function n(r,n,s){const a=await(async(r,n)=>{await t.acquire(!1);let s=i[r];if(s||(i[r]=s=new e(n)),s.limit!==n)throw t.release(),new ReferenceError(`Cannot get object with different restriction: key: '${String(r)}', lock.limit: ${s.limit} <-> restriction: ${n},`);return t.release(),s})(r,n),c=a.flow(s);return a.last=Date.now(),c}return{getLockByKey:async e=>{await t.acquire(!1);const r=i[e];return t.release(),r},cleanup:async(e,r)=>{await t.acquire(!1)
4
+ ;const n=i,s=Object.create(null),a=Object.keys(n);let c,o=0;!e&&(e=1),e*=1e3,r&&(c=[]);for(let t=0,i=a.length;t<i;){const i=a[t++],l=n[i];l.last&&Date.now()-l.last>=e?(o++,r&&c.push(i)):s[i]=l}return i=s,t.release(),r&&console.log(`eliminated: [\n${c.join(",\n")}\n]\nlived: [\n${Object.keys(s).join(",\n")}\n]`),o},multi:n,one:async function(e,t){return n(e,1,t)}}})()},518:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MiniSemaphore=void 0;const r=i(461),n=i(761),s=r.acquire,a=r.release;t.MiniSemaphore=class{constructor(e){this.limit=this.capacity=e,this.q=new n.Deque(e)}acquire(e){return s(this,e)}release(){a(this)}setRestriction(e){this.limit=this.capacity=e}get pending(){return this.q.length}async flow(e,t){await s(this,t);try{return await e()}finally{a(this)}}}},
5
+ 761:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Deque=void 0;const i=e=>(e=>(e>>>=0,e-=1,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,1+(e|=e>>16)))(Math.min(Math.max(16,0|e),1073741824));t.Deque=class{constructor(e){this._c=i(e),this._l=0,this._f=0,this._a=[]}push(e){const t=this._l;this._c<t+1&&r(this,i(1.5*this._c+16));const n=this._f+t&this._c-1;this._a[n]=e,this._l=t+1}shift(){const e=this._l;if(0===e)return;const t=this._f,i=this._a[t];return this._a[t]=void 0,this._f=t+1&this._c-1,this._l=e-1,i}get length(){return this._l}};const r=(e,t)=>{const i=e._c;e._c=t;const r=e._f+e._l;if(r>i){const t=r&i-1;((e,t,i,r,n)=>{for(let s=0;s<n;++s)i[s+r]=e[s+t],e[s+t]=void 0})(e._a,0,e._a,i,t)}}}},t={};function i(r){var n=t[r];if(void 0!==n)return n.exports;var s=t[r]={exports:{}}
6
+ ;return e[r](s,s.exports,i),s.exports}var r={};(()=>{var e=r;Object.defineProperty(e,"__esModule",{value:!0}),e.version=e.restrictor=e.Deque=e.create=e.MiniSemaphore=void 0;var t=i(518);Object.defineProperty(e,"MiniSemaphore",{enumerable:!0,get:function(){return t.MiniSemaphore}});var n=i(139);Object.defineProperty(e,"create",{enumerable:!0,get:function(){return n.create}});var s=i(761);Object.defineProperty(e,"Deque",{enumerable:!0,get:function(){return s.Deque}});var a=i(464);Object.defineProperty(e,"restrictor",{enumerable:!0,get:function(){return a.restrictor}}),e.version="v1.3.16"})(),module.exports=r})();
@@ -1,6 +1,6 @@
1
1
  /*! For license information please see index.js.LICENSE.txt */
2
- var e={139:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.create=void 0;const r=i(461),n=i(761),s=r.acquire,a=r.release;t.create=e=>({capacity:e,limit:e,q:new n.Deque(e),acquire(e){return s(this,e)},release(){a(this)},setRestriction(e){this.limit=this.capacity=e},get pending(){return this.q.length},async flow(e,t){await s(this,t);try{return await e()}finally{a(this)}}})},461:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.release=t.acquire=void 0;const r=i(669),n=(e,t)=>{e.capacity>0?(e.capacity--,t()):e.q.push(t)};t.acquire=(e,t=!0)=>new Promise((i=>{t?setTimeout((()=>n(e,i)),4):n(e,i)}));t.release=e=>{e.q.length?(e.q.shift()||r.THROW)():e.capacity++,e.capacity>e.limit&&(console.warn("inconsistent release!"),e.capacity=e.limit)}},464:(e,t,i)=>{
3
- Object.defineProperty(t,"__esModule",{value:!0}),t.restrictor=void 0;const r=i(518);var n;!function(e){const{MiniSemaphore:t}=r,i=new t(1);let n=Object.create(null);async function s(e,r,s){const a=await(async(e,r)=>{await i.acquire(!1);let s=n[e];if(s||(n[e]=s=new t(r)),s.limit!==r)throw i.release(),new ReferenceError(`Cannot get object with different restriction: key: '${e}', lock.limit: ${s.limit} <-> restriction: ${r},`);return i.release(),s})(e,r),c=a.flow(s);return a.last=Date.now(),c}e.getLockByKey=async e=>{await i.acquire(!1);const t=n[e];return i.release(),t},e.cleanup=async(e,t)=>{await i.acquire(!1);const r=n,s=Object.create(null),a=Object.keys(r);let c,o=0;!e&&(e=1),e*=1e3,t&&(c=[]);for(let i=0,n=a.length;i<n;){const n=a[i++],l=r[n];l.last&&Date.now()-l.last>=e?(o++,
4
- t&&c.push(n)):s[n]=l}return n=s,i.release(),t&&console.log(`eliminated: [\n${c.join(",\n")}\n]\nlived: [\n${Object.keys(s).join(",\n")}\n]`),o},e.multi=s,e.one=async function(e,t){return s(e,1,t)}}(n||(t.restrictor=n={}))},518:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MiniSemaphore=void 0;const r=i(461),n=i(761),s=r.acquire,a=r.release;t.MiniSemaphore=class{constructor(e){this.limit=this.capacity=e,this.q=new n.Deque(e)}acquire(e){return s(this,e)}release(){a(this)}setRestriction(e){this.limit=this.capacity=e}get pending(){return this.q.length}async flow(e,t){await s(this,t);try{return await e()}finally{a(this)}}}},669:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.THROW=void 0;t.THROW=()=>{throw new Error("mini-semaphore: inconsistent occurred")}},
2
+ var e={139:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.create=void 0;const r=i(461),n=i(761),s=r.acquire,a=r.release;t.create=e=>({capacity:e,limit:e,q:new n.Deque(e),acquire(e){return s(this,e)},release(){a(this)},setRestriction(e){this.limit=this.capacity=e},get pending(){return this.q.length},async flow(e,t){await s(this,t);try{return await e()}finally{a(this)}}})},461:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.release=t.acquire=void 0;const i=()=>{throw new Error("mini-semaphore: Detected an inconsistent state, possibly due to a logic error or unexpected behavior.")},r=(e,t)=>{e.capacity>0?(e.capacity--,t()):e.q.push(t)};t.acquire=(e,t=!0)=>new Promise((i=>{t?setTimeout((()=>r(e,i)),4):r(e,i)}));t.release=e=>{let t
3
+ ;(t=e.q).length?(t.shift()||i)():e.capacity++,e.capacity>e.limit&&(console.warn("inconsistent release!"),e.capacity=e.limit)}},464:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restrictor=void 0;const r=i(518);t.restrictor=(()=>{const{MiniSemaphore:e}=r,t=new e(1);let i=Object.create(null);async function n(r,n,s){const a=await(async(r,n)=>{await t.acquire(!1);let s=i[r];if(s||(i[r]=s=new e(n)),s.limit!==n)throw t.release(),new ReferenceError(`Cannot get object with different restriction: key: '${String(r)}', lock.limit: ${s.limit} <-> restriction: ${n},`);return t.release(),s})(r,n),c=a.flow(s);return a.last=Date.now(),c}return{getLockByKey:async e=>{await t.acquire(!1);const r=i[e];return t.release(),r},cleanup:async(e,r)=>{await t.acquire(!1)
4
+ ;const n=i,s=Object.create(null),a=Object.keys(n);let c,o=0;!e&&(e=1),e*=1e3,r&&(c=[]);for(let t=0,i=a.length;t<i;){const i=a[t++],l=n[i];l.last&&Date.now()-l.last>=e?(o++,r&&c.push(i)):s[i]=l}return i=s,t.release(),r&&console.log(`eliminated: [\n${c.join(",\n")}\n]\nlived: [\n${Object.keys(s).join(",\n")}\n]`),o},multi:n,one:async function(e,t){return n(e,1,t)}}})()},518:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MiniSemaphore=void 0;const r=i(461),n=i(761),s=r.acquire,a=r.release;t.MiniSemaphore=class{constructor(e){this.limit=this.capacity=e,this.q=new n.Deque(e)}acquire(e){return s(this,e)}release(){a(this)}setRestriction(e){this.limit=this.capacity=e}get pending(){return this.q.length}async flow(e,t){await s(this,t);try{return await e()}finally{a(this)}}}},
5
5
  761:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Deque=void 0;const i=e=>(e=>(e>>>=0,e-=1,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,1+(e|=e>>16)))(Math.min(Math.max(16,0|e),1073741824));t.Deque=class{constructor(e){this._c=i(e),this._l=0,this._f=0,this._a=[]}push(e){const t=this._l;this._c<t+1&&r(this,i(1.5*this._c+16));const n=this._f+t&this._c-1;this._a[n]=e,this._l=t+1}shift(){const e=this._l;if(0===e)return;const t=this._f,i=this._a[t];return this._a[t]=void 0,this._f=t+1&this._c-1,this._l=e-1,i}get length(){return this._l}};const r=(e,t)=>{const i=e._c;e._c=t;const r=e._f+e._l;if(r>i){const t=r&i-1;((e,t,i,r,n)=>{for(let s=0;s<n;++s)i[s+r]=e[s+t],e[s+t]=void 0})(e._a,0,e._a,i,t)}}}},t={};function i(r){var n=t[r];if(void 0!==n)return n.exports;var s=t[r]={exports:{}}
6
- ;return e[r](s,s.exports,i),s.exports}var r={};(()=>{var e=r;Object.defineProperty(e,"BJ",{value:!0}),e.rE=e.Ws=e.Jj=e.vt=e.C=void 0;var t=i(518);Object.defineProperty(e,"C",{enumerable:!0,get:function(){return t.MiniSemaphore}});var n=i(139);Object.defineProperty(e,"vt",{enumerable:!0,get:function(){return n.create}});var s=i(761);Object.defineProperty(e,"Jj",{enumerable:!0,get:function(){return s.Deque}});var a=i(464);Object.defineProperty(e,"Ws",{enumerable:!0,get:function(){return a.restrictor}}),e.rE="v1.3.13"})();var n=r.Jj,s=r.C,a=r.BJ,c=r.vt,o=r.Ws,l=r.rE;export{n as Deque,s as MiniSemaphore,a as __esModule,c as create,o as restrictor,l as version};
6
+ ;return e[r](s,s.exports,i),s.exports}var r={};(()=>{var e=r;Object.defineProperty(e,"BJ",{value:!0}),e.rE=e.Ws=e.Jj=e.vt=e.C=void 0;var t=i(518);Object.defineProperty(e,"C",{enumerable:!0,get:function(){return t.MiniSemaphore}});var n=i(139);Object.defineProperty(e,"vt",{enumerable:!0,get:function(){return n.create}});var s=i(761);Object.defineProperty(e,"Jj",{enumerable:!0,get:function(){return s.Deque}});var a=i(464);Object.defineProperty(e,"Ws",{enumerable:!0,get:function(){return a.restrictor}}),e.rE="v1.3.16"})();const n=r.Jj,s=r.C,a=r.BJ,c=r.vt,o=r.Ws,l=r.rE;export{n as Deque,s as MiniSemaphore,a as __esModule,c as create,o as restrictor,l as version};
package/cjs/extras.js DELETED
@@ -1,7 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.THROW = void 0;
4
- const THROW = /* istanbul ignore next */ () => {
5
- throw new Error("mini-semaphore: inconsistent occurred");
6
- };
7
- exports.THROW = THROW;
package/esm/extras.mjs DELETED
@@ -1,4 +0,0 @@
1
- const THROW = /* istanbul ignore next */ () => {
2
- throw new Error("mini-semaphore: inconsistent occurred");
3
- };
4
- export { THROW };