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.
@@ -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
- import * as c from "./class";
9
- export var restrictor;
10
- (function (restrictor) {
11
- const { MiniSemaphore: MS } = c;
12
- const internalLock = new MS(1);
13
- let locks = Object.create(null);
14
- const get = async (key, restriction) => {
15
- await internalLock.acquire(false);
16
- let lock = locks[key];
17
- if (!lock) {
18
- locks[key] = lock = new MS(restriction);
19
- }
20
- if (lock.limit !== restriction) {
21
- internalLock.release();
22
- throw new ReferenceError(`Cannot get object with different restriction: key: '${key}', lock.limit: ${lock.limit} <-> restriction: ${restriction},`);
23
- }
24
- internalLock.release();
25
- return lock;
26
- };
27
- restrictor.getLockByKey = async (key) => {
28
- await internalLock.acquire(false);
29
- const l = locks[key];
30
- internalLock.release();
31
- return l;
32
- };
33
- restrictor.cleanup = async (timeSpan, debug) => {
34
- await internalLock.acquire(false);
35
- const currentLocks = locks;
36
- const newLocks = Object.create(null);
37
- const keys = Object.keys(currentLocks);
38
- let eliminatedCount = 0;
39
- let eliminatedKeys;
40
- !timeSpan && (timeSpan = 1);
41
- timeSpan *= 1000;
42
- if (debug) {
43
- eliminatedKeys = [];
44
- }
45
- for (let i = 0, end = keys.length; i < end;) {
46
- const key = keys[i++];
47
- const s = currentLocks[key];
48
- if (s.last && Date.now() - s.last >= timeSpan) {
49
- eliminatedCount++;
50
- if (debug) {
51
- eliminatedKeys.push(key);
52
- }
53
- continue;
54
- }
55
- newLocks[key] = s;
56
- }
57
- locks = newLocks;
58
- internalLock.release();
59
- if (debug) {
60
- console.log(`eliminated: [\n${eliminatedKeys.join(",\n")}\n]` +
61
- "\n" +
62
- `lived: [\n${Object.keys(newLocks).join(",\n")}\n]`);
63
- }
64
- return eliminatedCount;
65
- };
66
- async function multi(key, restriction, pb) {
67
- const s = await get(key, restriction);
68
- const result = s.flow(pb);
69
- s.last = Date.now();
70
- return result;
71
- }
72
- restrictor.multi = multi;
73
- async function one(key, pb) {
74
- return multi(key, 1, pb);
75
- }
76
- restrictor.one = one;
77
- })(restrictor || (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
+ /**
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
- import * as core from "./core";
9
- import { Deque } from "./deque";
10
- const a = core.acquire;
11
- const r = core.release;
12
- export const create = (capacity) => {
13
- return {
14
- capacity,
15
- limit: capacity,
16
- q: new Deque(capacity),
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
- };
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.9",
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": "./webpack-esm/index.mjs",
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
- !function(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,c=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(){c(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{c(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.capacity++,e.q.length&&(e.capacity-=1,(e.q.shift()||r.THROW)()),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}}
4
- ;const r=(e,t)=>{const i=e._c;e._c=t;const r=e._f,n=e._l;if(r+n>i){const t=r+n&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);(e=>{const{MiniSemaphore:t}=r,i=new t(1);let n=Object.create(null);async function s(e,r,s){const c=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=c.flow(s)
5
- ;return c.last=Date.now(),a}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),c=Object.keys(r);let a,o=0;!e&&(e=1),e*=1e3,t&&(a=[]);for(let i=0,n=c.length;i<n;){const n=c[i++],l=r[n];l.last&&Date.now()-l.last>=e?(o++,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]`),o},e.multi=s,e.one=async function(e,t){return s(e,1,t)}})(t.restrictor||(t.restrictor={}))},139:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.create=void 0;const r=i(461),n=i(761),s=r.acquire,c=r.release;t.create=e=>({capacity:e,limit:e,q:new n.Deque(e),acquire(e){return s(this,e)},release(){c(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{c(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.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 c=i(464);Object.defineProperty(e,"restrictor",{enumerable:!0,get:function(){return c.restrictor}})})(),r
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.capacity++,e.q.length&&(e.capacity-=1,(e.q.shift()||r.THROW)()),
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,n=e._l;if(r+n>i){const t=r+n&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);(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)
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=s,e.one=async function(e,t){return s(e,1,t)}})(t.restrictor||(t.restrictor={}))},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={}
6
- ;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={};(()=>{var e=r;Object.defineProperty(e,"__esModule",{value:!0}),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}})})(),module.exports=r})();
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})();
@@ -1,6 +1,6 @@
1
- /*! For license information please see index.mjs.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.capacity++,e.q.length&&(e.capacity-=1,(e.q.shift()||r.THROW)()),
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,n=e._l;if(r+n>i){const t=r+n&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);(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)
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=s,e.one=async function(e,t){return s(e,1,t)}})(t.restrictor||(t.restrictor={}))},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={}
6
- ;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={};(()=>{var e=r;Object.defineProperty(e,"X$",{value:!0}),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}})})();var n=r.P7,s=r.G3,a=r.X$,c=r.Ue,o=r.gD;export{n as Deque,s as MiniSemaphore,a as __esModule,c as create,o as restrictor};
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