mini-semaphore 1.3.9 → 1.3.12
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 +7 -0
- package/cjs/class.js +92 -42
- package/cjs/core.js +67 -41
- package/cjs/deque.js +102 -65
- package/cjs/extras.js +7 -7
- package/cjs/flow-restrictor.js +137 -80
- package/cjs/index.js +19 -18
- package/cjs/object.js +71 -43
- package/esm/class.mjs +88 -0
- package/esm/core.mjs +62 -0
- package/esm/{deque.js → deque.mjs} +98 -61
- package/esm/{extras.js → extras.mjs} +3 -3
- package/esm/{flow-restrictor.js → flow-restrictor.mjs} +134 -77
- package/esm/{index.js → index.mjs} +12 -11
- package/esm/{object.js → object.mjs} +67 -39
- package/package.json +2 -2
- package/umd/index.js +6 -6
- package/webpack/index.js +5 -5
- package/webpack-esm/index.mjs +6 -6
- package/esm/class.js +0 -38
- package/esm/core.js +0 -36
- /package/esm/{index.d.ts → index.d.mts} +0 -0
- /package/webpack-esm/{index.d.ts → index.d.mts} +0 -0
- /package/webpack-esm/{index.mjs.LICENSE.txt → index.js.LICENSE.txt} +0 -0
|
@@ -1,77 +1,134 @@
|
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
let
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
restrictor.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
+
/**
|
|
9
|
+
* @file Utility module using `MiniSemaphore`
|
|
10
|
+
* @author jeffy-g <hirotom1107@gmail.com>
|
|
11
|
+
* @version 1.0
|
|
12
|
+
*/
|
|
13
|
+
import * as c from "./class.mjs";
|
|
14
|
+
/**
|
|
15
|
+
* @typedef {string | number} TLockRecordKey
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Flow Restriction
|
|
19
|
+
*/
|
|
20
|
+
export var restrictor;
|
|
21
|
+
(function (restrictor) {
|
|
22
|
+
const { MiniSemaphore: MS } = c;
|
|
23
|
+
/**
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
const internalLock = new MS(1);
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
*/
|
|
30
|
+
let locks = Object.create(null);
|
|
31
|
+
/**
|
|
32
|
+
*
|
|
33
|
+
* @param {TLockRecordKey} key
|
|
34
|
+
* @param {number} restriction
|
|
35
|
+
* @throws when different restriction
|
|
36
|
+
*/
|
|
37
|
+
const get = async (key, restriction) => {
|
|
38
|
+
await internalLock.acquire(false);
|
|
39
|
+
let lock = locks[key];
|
|
40
|
+
if (!lock) {
|
|
41
|
+
locks[key] = lock = new MS(restriction);
|
|
42
|
+
}
|
|
43
|
+
if (lock.limit !== restriction) {
|
|
44
|
+
internalLock.release();
|
|
45
|
+
throw new ReferenceError(`Cannot get object with different restriction: key: '${key}', lock.limit: ${lock.limit} <-> restriction: ${restriction},`);
|
|
46
|
+
}
|
|
47
|
+
internalLock.release();
|
|
48
|
+
return lock;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* get the semaphore associated with the value of `key`
|
|
52
|
+
*
|
|
53
|
+
* + ⚠️ The object to be retrieved with `key` must already be created with `multi` ore `one`
|
|
54
|
+
*
|
|
55
|
+
* @param {TLockRecordKey} key
|
|
56
|
+
* @returns `IFlowableLock` instance or `undefined`
|
|
57
|
+
*/
|
|
58
|
+
restrictor.getLockByKey = async (key) => {
|
|
59
|
+
await internalLock.acquire(false);
|
|
60
|
+
const l = locks[key];
|
|
61
|
+
internalLock.release();
|
|
62
|
+
return l;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Eliminate unused instances for the `timeSpan` seconds
|
|
66
|
+
*
|
|
67
|
+
* @param {number} timeSpan specify unit as seconds
|
|
68
|
+
* @param {true} [debug] enable debug
|
|
69
|
+
* @returns {Promise<number>} eliminated count
|
|
70
|
+
* @date 2020/6/19
|
|
71
|
+
*/
|
|
72
|
+
restrictor.cleanup = async (timeSpan, debug) => {
|
|
73
|
+
await internalLock.acquire(false);
|
|
74
|
+
const currentLocks = locks;
|
|
75
|
+
const newLocks = Object.create(null);
|
|
76
|
+
const keys = Object.keys(currentLocks);
|
|
77
|
+
let eliminatedCount = 0;
|
|
78
|
+
let eliminatedKeys;
|
|
79
|
+
!timeSpan && /* istanbul ignore next */ (timeSpan = 1);
|
|
80
|
+
timeSpan *= 1000;
|
|
81
|
+
if (debug) {
|
|
82
|
+
eliminatedKeys = [];
|
|
83
|
+
}
|
|
84
|
+
for (let i = 0, end = keys.length; i < end;) {
|
|
85
|
+
const key = keys[i++];
|
|
86
|
+
const s = currentLocks[key];
|
|
87
|
+
if (s.last && Date.now() - s.last >= timeSpan) {
|
|
88
|
+
eliminatedCount++;
|
|
89
|
+
if (debug) {
|
|
90
|
+
eliminatedKeys.push(key);
|
|
91
|
+
}
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
newLocks[key] = s;
|
|
95
|
+
}
|
|
96
|
+
locks = newLocks;
|
|
97
|
+
internalLock.release();
|
|
98
|
+
if (debug) {
|
|
99
|
+
console.log(`eliminated: [\n${eliminatedKeys.join(",\n")}\n]` +
|
|
100
|
+
"\n" +
|
|
101
|
+
`lived: [\n${Object.keys(newLocks).join(",\n")}\n]`);
|
|
102
|
+
}
|
|
103
|
+
return eliminatedCount;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Allocate a semaphore for each `key`, and limit the number of shares with the value of `restriction`
|
|
107
|
+
*
|
|
108
|
+
* @template {any} T
|
|
109
|
+
* @param {TLockRecordKey} key number or string as tag
|
|
110
|
+
* @param {number} restriction number of process restriction
|
|
111
|
+
* @param {() => Promise<T>} pb the process body
|
|
112
|
+
*/
|
|
113
|
+
async function multi(key, restriction, pb) {
|
|
114
|
+
const s = await get(key, restriction);
|
|
115
|
+
const result = s.flow(pb);
|
|
116
|
+
s.last = Date.now();
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
restrictor.multi = multi;
|
|
120
|
+
/**
|
|
121
|
+
* synonym of `multi(key, 1, pb)`
|
|
122
|
+
*
|
|
123
|
+
* + use case
|
|
124
|
+
* * Avoid concurrent requests to the same url
|
|
125
|
+
*
|
|
126
|
+
* @template {any} T
|
|
127
|
+
* @param {TLockRecordKey} key number or string as tag
|
|
128
|
+
* @param {() => Promise<T>} pb the process body
|
|
129
|
+
*/
|
|
130
|
+
async function one(key, pb) {
|
|
131
|
+
return multi(key, 1, pb);
|
|
132
|
+
}
|
|
133
|
+
restrictor.one = one;
|
|
134
|
+
})(restrictor || (restrictor = {}));
|
|
@@ -1,11 +1,12 @@
|
|
|
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
|
-
export { MiniSemaphore } from "./class";
|
|
9
|
-
export { create } from "./object";
|
|
10
|
-
export { Deque } from "./deque";
|
|
11
|
-
export { restrictor } from "./flow-restrictor";
|
|
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
|
+
export { MiniSemaphore } from "./class.mjs";
|
|
9
|
+
export { create } from "./object.mjs";
|
|
10
|
+
export { Deque } from "./deque.mjs";
|
|
11
|
+
export { restrictor } from "./flow-restrictor.mjs";
|
|
12
|
+
export const version = "v1.3.12";
|
|
@@ -1,39 +1,67 @@
|
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
+
/**
|
|
9
|
+
* @file minimal implementation of semaphore (object implementation
|
|
10
|
+
* @author jeffy-g <hirotom1107@gmail.com>
|
|
11
|
+
* @version 1.0
|
|
12
|
+
*/
|
|
13
|
+
import * as core from "./core.mjs";
|
|
14
|
+
import { Deque } from "./deque.mjs";
|
|
15
|
+
const a = core.acquire;
|
|
16
|
+
const r = core.release;
|
|
17
|
+
/**
|
|
18
|
+
* object implementation of `IFlowableLock`
|
|
19
|
+
*
|
|
20
|
+
* + constructs a semaphore object limited at `capacity`
|
|
21
|
+
*
|
|
22
|
+
* @param {number} capacity limitation of concurrent async by `capacity`
|
|
23
|
+
* @date 2020/2/7
|
|
24
|
+
* @version 1.0
|
|
25
|
+
*/
|
|
26
|
+
export const create = (capacity) => {
|
|
27
|
+
return {
|
|
28
|
+
capacity,
|
|
29
|
+
limit: capacity,
|
|
30
|
+
q: new Deque(capacity),
|
|
31
|
+
/**
|
|
32
|
+
*
|
|
33
|
+
* @param {boolean} [lazy]
|
|
34
|
+
* @returns {Promise<void>}
|
|
35
|
+
*/
|
|
36
|
+
acquire(lazy) {
|
|
37
|
+
return a(this, lazy);
|
|
38
|
+
},
|
|
39
|
+
release() {
|
|
40
|
+
r(this);
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* @param {number} restriction
|
|
44
|
+
*/
|
|
45
|
+
setRestriction(restriction) {
|
|
46
|
+
this.limit = this.capacity = restriction;
|
|
47
|
+
},
|
|
48
|
+
get pending() {
|
|
49
|
+
return this.q.length;
|
|
50
|
+
},
|
|
51
|
+
/**
|
|
52
|
+
* @template {any} T
|
|
53
|
+
* @param {() => Promise<T>} process
|
|
54
|
+
* @param {boolean} [lazy]
|
|
55
|
+
* @returns {Promise<T>}
|
|
56
|
+
*/
|
|
57
|
+
async flow(process, lazy) {
|
|
58
|
+
await a(this, lazy);
|
|
59
|
+
try {
|
|
60
|
+
return await process();
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
r(this);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
};
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mini-semaphore",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.12",
|
|
4
4
|
"description": "A lightweight version of Semaphore",
|
|
5
5
|
"private": false,
|
|
6
6
|
"main": "./cjs/index.js",
|
|
7
|
-
"module": "./
|
|
7
|
+
"module": "./esm/index.mjs",
|
|
8
8
|
"unpkg": "./umd/index.js",
|
|
9
9
|
"sideEffects": false,
|
|
10
10
|
"types": "./index.d.ts",
|
package/umd/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*! For license information please see index.js.LICENSE.txt */
|
|
2
|
-
|
|
3
|
-
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.
|
|
4
|
-
|
|
5
|
-
;return
|
|
6
|
-
this.limit=this.capacity=e},get pending(){return this.q.length},async flow(e,t){await s(this,t);try{return await e()}finally{
|
|
7
|
-
})()));
|
|
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={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(){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--,
|
|
3
|
+
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)}},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)=>{
|
|
4
|
+
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)}}},669:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.THROW=void 0;t.THROW=()=>{throw new Error("mini-semaphore: inconsistent occurred")}},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);const s=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};async function o(e,t,i){const r=await s(e,t),n=r.flow(i)
|
|
5
|
+
;return r.last=Date.now(),n}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),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=o,e.one=async function(e,t){return o(e,1,t)}}(n||(t.restrictor=n={}))},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){
|
|
6
|
+
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)}}})}},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(){return o.restrictor}
|
|
7
|
+
}),e.version="v1.3.12"})(),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={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)}}}},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.
|
|
3
|
-
e.capacity>e.limit&&(console.warn("inconsistent release!"),e.capacity=e.limit)}},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
|
|
4
|
-
Object.defineProperty(t,"__esModule",{value:!0}),t.THROW=void 0;t.THROW=()=>{throw new Error("mini-semaphore: inconsistent occurred")}},464:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restrictor=void 0;const r=i(518);(e
|
|
5
|
-
;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++,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=
|
|
6
|
-
|
|
2
|
+
(()=>{"use strict";var e={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)}}}},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++,
|
|
3
|
+
e.capacity>e.limit&&(console.warn("inconsistent release!"),e.capacity=e.limit)}},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)}}},669:(e,t)=>{
|
|
4
|
+
Object.defineProperty(t,"__esModule",{value:!0}),t.THROW=void 0;t.THROW=()=>{throw new Error("mini-semaphore: inconsistent occurred")}},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);const s=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};async function a(e,t,i){const r=await s(e,t),n=r.flow(i);return r.last=Date.now(),n}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)
|
|
5
|
+
;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++,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=a,e.one=async function(e,t){return a(e,1,t)}}(n||(t.restrictor=n={}))},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)}}})}},t={};function i(r){
|
|
6
|
+
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={};(()=>{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.12"})(),module.exports=r})();
|
package/webpack-esm/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
/*! For license information please see index.
|
|
2
|
-
var e={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)}}}},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.
|
|
3
|
-
e.capacity
|
|
4
|
-
|
|
5
|
-
;
|
|
6
|
-
;
|
|
1
|
+
/*! For license information please see index.js.LICENSE.txt */
|
|
2
|
+
var e={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)}}}},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!"),
|
|
3
|
+
e.capacity=e.limit)}},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)}}},669:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.THROW=void 0
|
|
4
|
+
;t.THROW=()=>{throw new Error("mini-semaphore: inconsistent occurred")}},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);const s=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};async function a(e,t,i){const r=await s(e,t),n=r.flow(i);return r.last=Date.now(),n}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=[])
|
|
5
|
+
;for(let i=0,n=a.length;i<n;){const n=a[i++],l=r[n];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=a,e.one=async function(e,t){return a(e,1,t)}}(n||(t.restrictor=n={}))},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)}}})}},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,"X$",{value:!0}),e.i8=e.gD=e.P7=e.Ue=e.G3=void 0;var t=i(518);Object.defineProperty(e,"G3",{enumerable:!0,get:function(){return t.MiniSemaphore}});var n=i(139);Object.defineProperty(e,"Ue",{enumerable:!0,get:function(){return n.create}});var s=i(761);Object.defineProperty(e,"P7",{enumerable:!0,get:function(){return s.Deque}});var a=i(464);Object.defineProperty(e,"gD",{enumerable:!0,get:function(){return a.restrictor}}),e.i8="v1.3.12"})();var n=r.P7,s=r.G3,a=r.X$,c=r.Ue,o=r.gD,l=r.i8;export{n as Deque,s as MiniSemaphore,a as __esModule,c as create,o as restrictor,l as version};
|
package/esm/class.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
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
|
-
import * as core from "./core";
|
|
9
|
-
import { Deque } from "./deque";
|
|
10
|
-
const a = core.acquire;
|
|
11
|
-
const r = core.release;
|
|
12
|
-
export class MiniSemaphore {
|
|
13
|
-
constructor(capacity) {
|
|
14
|
-
this.limit = this.capacity = capacity;
|
|
15
|
-
this.q = new Deque(capacity);
|
|
16
|
-
}
|
|
17
|
-
acquire(lazy) {
|
|
18
|
-
return a(this, lazy);
|
|
19
|
-
}
|
|
20
|
-
release() {
|
|
21
|
-
r(this);
|
|
22
|
-
}
|
|
23
|
-
setRestriction(restriction) {
|
|
24
|
-
this.limit = this.capacity = restriction;
|
|
25
|
-
}
|
|
26
|
-
get pending() {
|
|
27
|
-
return this.q.length;
|
|
28
|
-
}
|
|
29
|
-
async flow(process, lazy) {
|
|
30
|
-
await a(this, lazy);
|
|
31
|
-
try {
|
|
32
|
-
return await process();
|
|
33
|
-
}
|
|
34
|
-
finally {
|
|
35
|
-
r(this);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
package/esm/core.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
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
|
-
import { THROW } from "./extras";
|
|
9
|
-
const box = (z, r) => {
|
|
10
|
-
if (z.capacity > 0) {
|
|
11
|
-
z.capacity--, r();
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
z.q.push(r);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
export const acquire = (dis, lazy = true) => {
|
|
18
|
-
return new Promise(r => {
|
|
19
|
-
if (!lazy) {
|
|
20
|
-
box(dis, r);
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
setTimeout(() => box(dis, r), 4);
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
};
|
|
27
|
-
export const release = (dis) => {
|
|
28
|
-
dis.capacity++;
|
|
29
|
-
if (dis.q.length) {
|
|
30
|
-
dis.capacity -= 1, (dis.q.shift() || THROW)();
|
|
31
|
-
}
|
|
32
|
-
if (dis.capacity > dis.limit) {
|
|
33
|
-
console.warn("inconsistent release!");
|
|
34
|
-
dis.capacity = dis.limit;
|
|
35
|
-
}
|
|
36
|
-
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|