@avstantso/utils-locker 1.0.3 → 1.1.0
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/CHANGELOG.md +12 -0
- package/package.json +7 -7
- package/dist/_global/_register.d.ts +0 -47
- package/dist/_global/index.d.ts +0 -1
- package/dist/export.d.ts +0 -2
- package/dist/index.d.ts +0 -5
- package/dist/index.js +0 -69
- package/dist/index.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [1.1.0] - 2026-01-18
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Updated all dependencies
|
|
10
|
+
|
|
11
|
+
## [1.0.4] - 2026-01-16
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Updated `@avstantso/core` dependency (fix `process is not defined` error in Vite build)
|
|
16
|
+
|
|
5
17
|
## [1.0.3] - 2026-01-16
|
|
6
18
|
|
|
7
19
|
### Changed
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@avstantso/utils-locker",
|
|
3
3
|
"license": "MIT",
|
|
4
4
|
"author": "avstantso",
|
|
5
|
-
"version": "1.0
|
|
5
|
+
"version": "1.1.0",
|
|
6
6
|
"description": "AVStantso framework utils: Locker",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"Locker"
|
|
@@ -23,12 +23,12 @@
|
|
|
23
23
|
"test": "NODE_ENV=test jest --coverage"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@avstantso/concepts": "1.0
|
|
27
|
-
"@avstantso/core": "1.0
|
|
28
|
-
"@avstantso/errors": "1.0
|
|
29
|
-
"@avstantso/js": "1.0
|
|
30
|
-
"@avstantso/std-ext": "1.0
|
|
31
|
-
"@avstantso/ts": "1.0
|
|
26
|
+
"@avstantso/concepts": "1.1.0",
|
|
27
|
+
"@avstantso/core": "1.1.0",
|
|
28
|
+
"@avstantso/errors": "1.1.0",
|
|
29
|
+
"@avstantso/js": "1.1.0",
|
|
30
|
+
"@avstantso/std-ext": "1.1.0",
|
|
31
|
+
"@avstantso/ts": "1.1.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@avstantso/dev-basic": "1.0.0"
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
declare namespace AVStantso {
|
|
2
|
-
/**
|
|
3
|
-
* @summary Async locker
|
|
4
|
-
*/
|
|
5
|
-
namespace Locker {
|
|
6
|
-
/**
|
|
7
|
-
* @summary Async locker options
|
|
8
|
-
*/
|
|
9
|
-
type Options = AsyncTasksManager.Option;
|
|
10
|
-
}
|
|
11
|
-
interface Locker {
|
|
12
|
-
/**
|
|
13
|
-
* @summary Async lock state
|
|
14
|
-
*/
|
|
15
|
-
readonly isLocked: boolean;
|
|
16
|
-
/**
|
|
17
|
-
* @summary Acquire lock
|
|
18
|
-
* @returns Release method for this lock
|
|
19
|
-
*/
|
|
20
|
-
acquire(): () => void;
|
|
21
|
-
/**
|
|
22
|
-
* @summary Wait for all locks will be released
|
|
23
|
-
*/
|
|
24
|
-
waitFor(): Promise<void>;
|
|
25
|
-
}
|
|
26
|
-
namespace Code {
|
|
27
|
-
/**
|
|
28
|
-
* @summary Locker utilities
|
|
29
|
-
*/
|
|
30
|
-
namespace Locker {
|
|
31
|
-
/**
|
|
32
|
-
* @summary Locker factory
|
|
33
|
-
*/
|
|
34
|
-
type Factory = {
|
|
35
|
-
(options?: AVStantso.Locker.Options): Locker;
|
|
36
|
-
is(candidate: unknown): candidate is Locker;
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
interface Code {
|
|
41
|
-
/**
|
|
42
|
-
* @summary Locker utilities
|
|
43
|
-
*/
|
|
44
|
-
Locker: Code.Locker.Factory;
|
|
45
|
-
}
|
|
46
|
-
const Locker: Code.Locker.Factory;
|
|
47
|
-
}
|
package/dist/_global/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import './_register';
|
package/dist/export.d.ts
DELETED
package/dist/index.d.ts
DELETED
package/dist/index.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
require('@avstantso/errors');
|
|
4
|
-
require('@avstantso/js');
|
|
5
|
-
require('@avstantso/concepts');
|
|
6
|
-
|
|
7
|
-
var AVStantso$1;
|
|
8
|
-
(function (AVStantso) {
|
|
9
|
-
/**
|
|
10
|
-
* @summary Async locker implementation
|
|
11
|
-
*/
|
|
12
|
-
class MultiLocker {
|
|
13
|
-
#manager;
|
|
14
|
-
#locks = new Set();
|
|
15
|
-
#lockNo = 0;
|
|
16
|
-
#consumers;
|
|
17
|
-
constructor(options) {
|
|
18
|
-
const { manager } = options || {};
|
|
19
|
-
if (manager) {
|
|
20
|
-
const { AsyncTasksManager } = avstantso;
|
|
21
|
-
this.#manager = AsyncTasksManager.is(manager)
|
|
22
|
-
? manager
|
|
23
|
-
: AsyncTasksManager;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
get isLocked() {
|
|
27
|
-
return this.#locks.size > 0;
|
|
28
|
-
}
|
|
29
|
-
#release(currentNo) {
|
|
30
|
-
if (!this.#locks.has(currentNo))
|
|
31
|
-
throw new AVStantso_InvalidStateError(this, 'locks', 'Locker release out of scope attempt');
|
|
32
|
-
this.#locks.delete(currentNo);
|
|
33
|
-
if (this.isLocked || !this.#consumers?.length)
|
|
34
|
-
return;
|
|
35
|
-
for (const c of this.#consumers)
|
|
36
|
-
c();
|
|
37
|
-
this.#consumers.length = 0;
|
|
38
|
-
}
|
|
39
|
-
acquire() {
|
|
40
|
-
const currentNo = ++this.#lockNo;
|
|
41
|
-
this.#locks.add(currentNo);
|
|
42
|
-
return this.#release.bind(this, currentNo);
|
|
43
|
-
}
|
|
44
|
-
async waitFor() {
|
|
45
|
-
if (!this.isLocked)
|
|
46
|
-
return;
|
|
47
|
-
const cc = (this.#consumers ??= []);
|
|
48
|
-
const p = new Promise((resolve) => cc.push(resolve));
|
|
49
|
-
return this.#manager?.regTask(p) || p;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
AVStantso.Locker = avstantso._reg.Locker(({ JS }) => Object.assign(function Locker(options) {
|
|
53
|
-
return new MultiLocker(options);
|
|
54
|
-
}, {
|
|
55
|
-
is: function isLocker(candidate) {
|
|
56
|
-
return (candidate
|
|
57
|
-
&& (candidate instanceof MultiLocker
|
|
58
|
-
|| (JS.is.object(candidate)
|
|
59
|
-
&& 'isLocked' in candidate
|
|
60
|
-
&& 'acquire' in candidate
|
|
61
|
-
&& 'waitFor' in candidate)));
|
|
62
|
-
}
|
|
63
|
-
}));
|
|
64
|
-
})(AVStantso$1 || (AVStantso$1 = {}));
|
|
65
|
-
|
|
66
|
-
var Locker = AVStantso.Locker;
|
|
67
|
-
|
|
68
|
-
exports.Locker = Locker;
|
|
69
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/_global/_register.ts","../src/export.ts"],"sourcesContent":["namespace AVStantso {\n /**\n * @summary Async locker\n */\n export namespace Locker {\n /**\n * @summary Async locker options\n */\n export type Options = AsyncTasksManager.Option;\n }\n\n export interface Locker {\n /**\n * @summary Async lock state\n */\n readonly isLocked: boolean;\n\n /**\n * @summary Acquire lock\n * @returns Release method for this lock\n */\n acquire(): () => void;\n\n /**\n * @summary Wait for all locks will be released\n */\n waitFor(): Promise<void>;\n }\n\n /**\n * @summary Async locker implementation\n */\n class MultiLocker implements Locker {\n #manager: AsyncTasksManager;\n #locks: Set<number> = new Set();\n #lockNo: number = 0;\n #consumers: ((value?: void) => void)[];\n\n constructor (options?: Locker.Options) {\n const { manager } = options || {};\n\n if (manager) {\n const { AsyncTasksManager } = avstantso;\n\n this.#manager = AsyncTasksManager.is(manager)\n ? manager\n : AsyncTasksManager;\n }\n }\n\n public get isLocked(): boolean {\n return this.#locks.size > 0;\n }\n\n #release(currentNo: number) {\n if (!this.#locks.has(currentNo))\n throw new AVStantso_InvalidStateError(\n this,\n 'locks',\n 'Locker release out of scope attempt'\n );\n\n this.#locks.delete(currentNo);\n\n if (this.isLocked || !this.#consumers?.length) return;\n\n for (const c of this.#consumers) c();\n\n this.#consumers.length = 0;\n }\n\n public acquire(): () => void {\n const currentNo = ++this.#lockNo;\n this.#locks.add(currentNo);\n return this.#release.bind(this, currentNo);\n }\n\n public async waitFor(): Promise<void> {\n if (!this.isLocked) return;\n\n const cc = (this.#consumers ??= []);\n const p = new Promise<void>((resolve) => cc.push(resolve));\n\n return this.#manager?.regTask(p) || p;\n }\n }\n\n export namespace Code {\n /**\n * @summary Locker utilities\n */\n export namespace Locker {\n /**\n * @summary Locker factory\n */\n export type Factory = {\n (options?: AVStantso.Locker.Options): Locker;\n is(candidate: unknown): candidate is Locker;\n };\n }\n }\n\n export interface Code {\n /**\n * @summary Locker utilities\n */\n Locker: Code.Locker.Factory;\n }\n\n export const Locker: Code.Locker.Factory = avstantso._reg.Locker(({ JS }) =>\n Object.assign(\n function Locker(options?: Locker.Options) {\n return new MultiLocker(options);\n },\n {\n is: function isLocker(candidate: unknown): candidate is Locker {\n return (\n candidate\n && (candidate instanceof MultiLocker\n || (JS.is.object(candidate)\n && 'isLocked' in candidate\n && 'acquire' in candidate\n && 'waitFor' in candidate)\n )\n );\n }\n }\n )\n );\n}\n","import Locker = AVStantso.Locker;\n\nexport {\n Locker\n};\n"],"names":["AVStantso"],"mappings":";;;;;;AAAA,IAAUA,WAAS;AAAnB,CAAA,UAAU,SAAS,EAAA;AA6BjB;;AAEG;AACH,IAAA,MAAM,WAAW,CAAA;AACf,QAAA,QAAQ;AACR,QAAA,MAAM,GAAgB,IAAI,GAAG,EAAE;QAC/B,OAAO,GAAW,CAAC;AACnB,QAAA,UAAU;AAEV,QAAA,WAAA,CAAa,OAAwB,EAAA;AACnC,YAAA,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,IAAI,EAAE;YAEjC,IAAI,OAAO,EAAE;AACX,gBAAA,MAAM,EAAE,iBAAiB,EAAE,GAAG,SAAS;gBAEvC,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC,EAAE,CAAC,OAAO;AAC1C,sBAAE;sBACA,iBAAiB;YACvB;QACF;AAEA,QAAA,IAAW,QAAQ,GAAA;AACjB,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;QAC7B;AAEA,QAAA,QAAQ,CAAC,SAAiB,EAAA;YACxB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;gBAC7B,MAAM,IAAI,2BAA2B,CACnC,IAAI,EACJ,OAAO,EACP,qCAAqC,CACtC;AAEH,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;YAE7B,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM;gBAAE;AAE/C,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU;AAAE,gBAAA,CAAC,EAAE;AAEpC,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QAC5B;QAEO,OAAO,GAAA;AACZ,YAAA,MAAM,SAAS,GAAG,EAAE,IAAI,CAAC,OAAO;AAChC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;YAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QAC5C;AAEO,QAAA,MAAM,OAAO,GAAA;YAClB,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE;YAEpB,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE,CAAC;AACnC,YAAA,MAAM,CAAC,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1D,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACvC;AACD;IAwBY,SAAA,CAAA,MAAM,GAAwB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,KACtE,MAAM,CAAC,MAAM,CACX,SAAS,MAAM,CAAC,OAAwB,EAAA;AACtC,QAAA,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC;AACjC,IAAA,CAAC,EACD;AACE,QAAA,EAAE,EAAE,SAAS,QAAQ,CAAC,SAAkB,EAAA;AACtC,YAAA,QACE;oBACI,SAAS,YAAY;AACtB,wBAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS;AACrB,2BAAA,UAAU,IAAI;AACd,2BAAA,SAAS,IAAI;AACb,2BAAA,SAAS,IAAI,SAAS,CAAC,CAC3B;QAEL;AACD,KAAA,CACF,CACF;AACH,CAAC,EAjISA,WAAS,KAATA,WAAS,GAAA,EAAA,CAAA,CAAA;;ACAnB,IAAO,MAAM,GAAG,SAAS,CAAC;;;;"}
|