@simplysm/core-common 13.0.69 → 13.0.71
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 +66 -267
- package/dist/common.types.d.ts +14 -14
- package/dist/errors/argument-error.d.ts +10 -10
- package/dist/errors/argument-error.d.ts.map +1 -1
- package/dist/errors/argument-error.js +2 -2
- package/dist/errors/argument-error.js.map +1 -1
- package/dist/errors/not-implemented-error.d.ts +8 -8
- package/dist/errors/not-implemented-error.js +2 -2
- package/dist/errors/not-implemented-error.js.map +1 -1
- package/dist/errors/sd-error.d.ts +10 -10
- package/dist/errors/sd-error.d.ts.map +1 -1
- package/dist/errors/timeout-error.d.ts +10 -10
- package/dist/errors/timeout-error.js +3 -3
- package/dist/errors/timeout-error.js.map +1 -1
- package/dist/extensions/arr-ext.d.ts +2 -2
- package/dist/extensions/arr-ext.helpers.d.ts +8 -8
- package/dist/extensions/arr-ext.helpers.js +1 -1
- package/dist/extensions/arr-ext.helpers.js.map +1 -1
- package/dist/extensions/arr-ext.js +13 -13
- package/dist/extensions/arr-ext.js.map +1 -1
- package/dist/extensions/arr-ext.types.d.ts +57 -57
- package/dist/extensions/arr-ext.types.d.ts.map +1 -1
- package/dist/extensions/map-ext.d.ts +16 -16
- package/dist/extensions/set-ext.d.ts +11 -11
- package/dist/features/debounce-queue.d.ts +17 -15
- package/dist/features/debounce-queue.d.ts.map +1 -1
- package/dist/features/debounce-queue.js +6 -6
- package/dist/features/debounce-queue.js.map +1 -1
- package/dist/features/event-emitter.d.ts +20 -20
- package/dist/features/event-emitter.js +17 -17
- package/dist/features/serial-queue.d.ts +11 -11
- package/dist/features/serial-queue.js +5 -5
- package/dist/features/serial-queue.js.map +1 -1
- package/dist/globals.d.ts +4 -4
- package/dist/types/date-only.d.ts +64 -64
- package/dist/types/date-only.d.ts.map +1 -1
- package/dist/types/date-only.js +63 -63
- package/dist/types/date-time.d.ts +37 -37
- package/dist/types/date-time.d.ts.map +1 -1
- package/dist/types/date-time.js +54 -37
- package/dist/types/date-time.js.map +1 -1
- package/dist/types/lazy-gc-map.d.ts +26 -26
- package/dist/types/lazy-gc-map.d.ts.map +1 -1
- package/dist/types/lazy-gc-map.js +26 -26
- package/dist/types/lazy-gc-map.js.map +1 -1
- package/dist/types/time.d.ts +25 -25
- package/dist/types/time.d.ts.map +1 -1
- package/dist/types/time.js +25 -25
- package/dist/types/time.js.map +1 -1
- package/dist/types/uuid.d.ts +11 -11
- package/dist/types/uuid.d.ts.map +1 -1
- package/dist/types/uuid.js +12 -12
- package/dist/types/uuid.js.map +1 -1
- package/dist/utils/bytes.d.ts +17 -17
- package/dist/utils/bytes.js +4 -4
- package/dist/utils/bytes.js.map +1 -1
- package/dist/utils/date-format.d.ts +45 -45
- package/dist/utils/date-format.js +1 -1
- package/dist/utils/date-format.js.map +1 -1
- package/dist/utils/error.d.ts +4 -4
- package/dist/utils/json.d.ts +17 -17
- package/dist/utils/json.js +3 -3
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/num.d.ts +23 -23
- package/dist/utils/obj.d.ts +111 -111
- package/dist/utils/obj.d.ts.map +1 -1
- package/dist/utils/obj.js +3 -3
- package/dist/utils/obj.js.map +1 -1
- package/dist/utils/path.d.ts +10 -10
- package/dist/utils/primitive.d.ts +5 -5
- package/dist/utils/primitive.js +1 -1
- package/dist/utils/primitive.js.map +1 -1
- package/dist/utils/str.d.ts +46 -46
- package/dist/utils/str.d.ts.map +1 -1
- package/dist/utils/str.js +5 -5
- package/dist/utils/str.js.map +1 -1
- package/dist/utils/template-strings.d.ts +26 -26
- package/dist/utils/transferable.d.ts +18 -18
- package/dist/utils/transferable.js +1 -1
- package/dist/utils/transferable.js.map +1 -1
- package/dist/utils/wait.d.ts +9 -9
- package/dist/utils/xml.d.ts +13 -13
- package/dist/utils/xml.d.ts.map +1 -1
- package/dist/utils/xml.js +1 -0
- package/dist/utils/xml.js.map +1 -1
- package/dist/zip/sd-zip.d.ts +22 -22
- package/dist/zip/sd-zip.js +16 -16
- package/package.json +4 -4
- package/src/common.types.ts +17 -17
- package/src/errors/argument-error.ts +15 -15
- package/src/errors/not-implemented-error.ts +9 -9
- package/src/errors/sd-error.ts +12 -12
- package/src/errors/timeout-error.ts +12 -12
- package/src/extensions/arr-ext.helpers.ts +10 -10
- package/src/extensions/arr-ext.ts +57 -57
- package/src/extensions/arr-ext.types.ts +59 -59
- package/src/extensions/map-ext.ts +16 -16
- package/src/extensions/set-ext.ts +11 -11
- package/src/features/debounce-queue.ts +21 -19
- package/src/features/event-emitter.ts +25 -25
- package/src/features/serial-queue.ts +13 -13
- package/src/globals.ts +4 -4
- package/src/index.ts +1 -1
- package/src/types/date-only.ts +83 -83
- package/src/types/date-time.ts +64 -44
- package/src/types/lazy-gc-map.ts +45 -45
- package/src/types/time.ts +34 -34
- package/src/types/uuid.ts +17 -17
- package/src/utils/bytes.ts +35 -35
- package/src/utils/date-format.ts +65 -65
- package/src/utils/error.ts +4 -4
- package/src/utils/json.ts +39 -39
- package/src/utils/num.ts +23 -23
- package/src/utils/obj.ts +138 -138
- package/src/utils/path.ts +10 -10
- package/src/utils/primitive.ts +6 -6
- package/src/utils/str.ts +260 -261
- package/src/utils/template-strings.ts +29 -29
- package/src/utils/transferable.ts +284 -284
- package/src/utils/wait.ts +10 -10
- package/src/utils/xml.ts +20 -19
- package/src/zip/sd-zip.ts +25 -25
- package/tests/errors/errors.spec.ts +80 -0
- package/tests/extensions/array-extension.spec.ts +796 -0
- package/tests/extensions/map-extension.spec.ts +147 -0
- package/tests/extensions/set-extension.spec.ts +74 -0
- package/tests/types/date-only.spec.ts +638 -0
- package/tests/types/date-time.spec.ts +391 -0
- package/tests/types/lazy-gc-map.spec.ts +692 -0
- package/tests/types/time.spec.ts +559 -0
- package/tests/types/uuid.spec.ts +74 -0
- package/tests/utils/bytes-utils.spec.ts +230 -0
- package/tests/utils/date-format.spec.ts +373 -0
- package/tests/utils/debounce-queue.spec.ts +272 -0
- package/tests/utils/json.spec.ts +486 -0
- package/tests/utils/number.spec.ts +157 -0
- package/tests/utils/object.spec.ts +829 -0
- package/tests/utils/path.spec.ts +78 -0
- package/tests/utils/primitive.spec.ts +43 -0
- package/tests/utils/sd-event-emitter.spec.ts +216 -0
- package/tests/utils/serial-queue.spec.ts +365 -0
- package/tests/utils/string.spec.ts +281 -0
- package/tests/utils/template-strings.spec.ts +57 -0
- package/tests/utils/transferable.spec.ts +703 -0
- package/tests/utils/wait.spec.ts +145 -0
- package/tests/utils/xml.spec.ts +146 -0
- package/tests/zip/sd-zip.spec.ts +238 -0
- package/docs/extensions.md +0 -503
- package/docs/features.md +0 -109
- package/docs/types.md +0 -486
- package/docs/utils.md +0 -780
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Set
|
|
2
|
+
* Set extension methods
|
|
3
3
|
*/
|
|
4
4
|
declare global {
|
|
5
5
|
interface Set<T> {
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Add multiple values at once
|
|
8
8
|
*/
|
|
9
9
|
adds(...values: T[]): this;
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Toggle value (remove if exists, add if not)
|
|
12
12
|
*
|
|
13
|
-
* @param value
|
|
14
|
-
* @param addOrDel
|
|
15
|
-
* @returns this (
|
|
13
|
+
* @param value Value to toggle
|
|
14
|
+
* @param addOrDel Force add ("add") or remove ("del") (if omitted, toggle automatically)
|
|
15
|
+
* @returns this (method chaining available)
|
|
16
16
|
*
|
|
17
17
|
* @remarks
|
|
18
|
-
* addOrDel
|
|
18
|
+
* addOrDel parameter allows concise expression of conditional add/remove.
|
|
19
19
|
*
|
|
20
20
|
* @example
|
|
21
21
|
* ```typescript
|
|
22
22
|
* const set = new Set<number>([1, 2, 3]);
|
|
23
23
|
*
|
|
24
|
-
* set.toggle(2); // 2
|
|
25
|
-
* set.toggle(4); // 4
|
|
24
|
+
* set.toggle(2); // 2 exists, so remove → {1, 3}
|
|
25
|
+
* set.toggle(4); // 4 doesn't exist, so add → {1, 3, 4}
|
|
26
26
|
*
|
|
27
|
-
* //
|
|
27
|
+
* // Conditional toggle
|
|
28
28
|
* const isAdmin = true;
|
|
29
|
-
* set.toggle(5, isAdmin ? "add" : "del"); //
|
|
29
|
+
* set.toggle(5, isAdmin ? "add" : "del"); // Force add
|
|
30
30
|
* ```
|
|
31
31
|
*/
|
|
32
32
|
toggle(value: T, addOrDel?: "add" | "del"): this;
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Asynchronous debounce queue
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* When called multiple times within a short time, only the last request is executed
|
|
5
|
+
* and previous requests are ignored. Useful for input field auto-complete,
|
|
6
|
+
* batching consecutive state changes, and more.
|
|
6
7
|
*
|
|
7
8
|
* @remarks
|
|
8
|
-
*
|
|
9
|
-
*
|
|
9
|
+
* Requests added during execution are processed immediately after the current execution
|
|
10
|
+
* completes without debounce delay. This is an intentional design to ensure that
|
|
11
|
+
* requests arriving before execution completes are not missed.
|
|
10
12
|
*
|
|
11
13
|
* @example
|
|
12
|
-
* const queue = new DebounceQueue(300); // 300ms
|
|
13
|
-
* queue.run(() => console.log("1")); //
|
|
14
|
-
* queue.run(() => console.log("2")); //
|
|
15
|
-
* queue.run(() => console.log("3")); //
|
|
14
|
+
* const queue = new DebounceQueue(300); // 300ms delay
|
|
15
|
+
* queue.run(() => console.log("1")); // ignored
|
|
16
|
+
* queue.run(() => console.log("2")); // ignored
|
|
17
|
+
* queue.run(() => console.log("3")); // executed after 300ms
|
|
16
18
|
*
|
|
17
19
|
* @example
|
|
18
|
-
* //
|
|
20
|
+
* // Error handling
|
|
19
21
|
* queue.on("error", (err) => console.error(err));
|
|
20
22
|
*/
|
|
21
23
|
import { SdError } from "../errors/sd-error";
|
|
@@ -31,20 +33,20 @@ export declare class DebounceQueue extends EventEmitter<DebounceQueueEvents> {
|
|
|
31
33
|
private _isDisposed;
|
|
32
34
|
private _timer;
|
|
33
35
|
/**
|
|
34
|
-
* @param _delay
|
|
36
|
+
* @param _delay Debounce delay time (milliseconds). If omitted, executes immediately (next event loop)
|
|
35
37
|
*/
|
|
36
38
|
constructor(_delay?: number | undefined);
|
|
37
39
|
/**
|
|
38
|
-
*
|
|
40
|
+
* Clean up pending tasks and timers
|
|
39
41
|
*/
|
|
40
42
|
dispose(): void;
|
|
41
43
|
/**
|
|
42
|
-
* using
|
|
44
|
+
* Supports using statement
|
|
43
45
|
*/
|
|
44
46
|
[Symbol.dispose](): void;
|
|
45
47
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
+
* Add a function to the queue
|
|
49
|
+
* If there was a previously added function, it will be replaced
|
|
48
50
|
*/
|
|
49
51
|
run(fn: () => void | Promise<void>): void;
|
|
50
52
|
private _processLast;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debounce-queue.d.ts","sourceRoot":"","sources":["../../src/features/debounce-queue.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"debounce-queue.d.ts","sourceRoot":"","sources":["../../src/features/debounce-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,UAAU,mBAAmB;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,aAAc,SAAQ,YAAY,CAAC,mBAAmB,CAAC;IAWtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAVpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAEnE,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAA4C;IAE1D;;OAEG;gBAC0B,MAAM,CAAC,EAAE,MAAM,YAAA;IAI5C;;OAEG;IACM,OAAO,IAAI,IAAI;IAUxB;;OAEG;IACM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAIjC;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;YAiB3B,YAAY;CA+B3B"}
|
|
@@ -3,7 +3,7 @@ import { EventEmitter } from "./event-emitter.js";
|
|
|
3
3
|
import consola from "consola";
|
|
4
4
|
class DebounceQueue extends EventEmitter {
|
|
5
5
|
/**
|
|
6
|
-
* @param _delay
|
|
6
|
+
* @param _delay Debounce delay time (milliseconds). If omitted, executes immediately (next event loop)
|
|
7
7
|
*/
|
|
8
8
|
constructor(_delay) {
|
|
9
9
|
super();
|
|
@@ -15,7 +15,7 @@ class DebounceQueue extends EventEmitter {
|
|
|
15
15
|
_isDisposed = false;
|
|
16
16
|
_timer;
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* Clean up pending tasks and timers
|
|
19
19
|
*/
|
|
20
20
|
dispose() {
|
|
21
21
|
this._isDisposed = true;
|
|
@@ -27,14 +27,14 @@ class DebounceQueue extends EventEmitter {
|
|
|
27
27
|
super.dispose();
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
* using
|
|
30
|
+
* Supports using statement
|
|
31
31
|
*/
|
|
32
32
|
[Symbol.dispose]() {
|
|
33
33
|
this.dispose();
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
36
|
+
* Add a function to the queue
|
|
37
|
+
* If there was a previously added function, it will be replaced
|
|
38
38
|
*/
|
|
39
39
|
run(fn) {
|
|
40
40
|
if (this._isDisposed) return;
|
|
@@ -61,7 +61,7 @@ class DebounceQueue extends EventEmitter {
|
|
|
61
61
|
await currentFn();
|
|
62
62
|
} catch (err) {
|
|
63
63
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
64
|
-
const sdError = new SdError(error, "
|
|
64
|
+
const sdError = new SdError(error, "Error occurred while executing task");
|
|
65
65
|
if (this.listenerCount("error") > 0) {
|
|
66
66
|
this.emit("error", sdError);
|
|
67
67
|
} else {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/features/debounce-queue.ts"],
|
|
4
|
-
"mappings": "
|
|
4
|
+
"mappings": "AAsBA,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,OAAO,aAAa;AAMb,MAAM,sBAAsB,aAAkC;AAAA;AAAA;AAAA;AAAA,EAWnE,YAA6B,QAAiB;AAC5C,UAAM;AADqB;AAAA,EAE7B;AAAA,EAZA,OAAwB,UAAU,QAAQ,QAAQ,eAAe;AAAA,EAEzD;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAYC,UAAgB;AACvB,SAAK,cAAc;AACnB,QAAI,KAAK,QAAQ;AACf,mBAAa,KAAK,MAAM;AACxB,WAAK,SAAS;AAAA,IAChB;AACA,SAAK,aAAa;AAClB,UAAM,QAAQ;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,CAAU,OAAO,OAAO,IAAU;AAChC,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAsC;AACxC,QAAI,KAAK,YAAa;AAEtB,SAAK,aAAa;AAElB,QAAI,KAAK,QAAQ;AACf,mBAAa,KAAK,MAAM;AACxB,WAAK,SAAS;AAAA,IAChB;AAEA,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,SAAS,WAAW,MAAM;AAC7B,aAAK,KAAK,aAAa;AAAA,MACzB,GAAG,KAAK,MAAM;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAc,eAA8B;AAC1C,QAAI,KAAK,eAAe,KAAK,cAAc,CAAC,KAAK,WAAY;AAE7D,SAAK,aAAa;AAClB,SAAK,SAAS;AAEd,QAAI;AAGF,aAAO,KAAK,YAAY;AACtB,cAAM,YAAY,KAAK;AACvB,aAAK,aAAa;AAElB,YAAI;AACF,gBAAM,UAAU;AAAA,QAClB,SAAS,KAAK;AACZ,gBAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,gBAAM,UAAU,IAAI,QAAQ,OAAO,qCAAqC;AAGxE,cAAI,KAAK,cAAc,OAAO,IAAI,GAAG;AACnC,iBAAK,KAAK,SAAS,OAAO;AAAA,UAC5B,OAAO;AACL,0BAAc,QAAQ,MAAM,OAAO;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* EventTarget
|
|
2
|
+
* EventTarget wrapper - provides EventEmitter-like API
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* A type-safe event emitter that can be used in both browsers and Node.js.
|
|
5
|
+
* Internally implemented using EventTarget.
|
|
6
6
|
*
|
|
7
|
-
* @typeParam TEvents
|
|
7
|
+
* @typeParam TEvents Event type map. Keys are event names, values are event data types
|
|
8
8
|
*
|
|
9
9
|
* @example
|
|
10
10
|
* interface MyEvents {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* const emitter = new MyEmitter();
|
|
19
19
|
* emitter.on("data", (data) => console.log(data)); // data: string
|
|
20
20
|
* emitter.emit("data", "hello");
|
|
21
|
-
* emitter.emit("done"); // void
|
|
21
|
+
* emitter.emit("done"); // void type is called without arguments
|
|
22
22
|
*/
|
|
23
23
|
export declare class EventEmitter<TEvents extends {
|
|
24
24
|
[K in keyof TEvents]: unknown;
|
|
@@ -26,40 +26,40 @@ export declare class EventEmitter<TEvents extends {
|
|
|
26
26
|
private readonly _target;
|
|
27
27
|
private readonly _listenerMap;
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
29
|
+
* Register an event listener
|
|
30
30
|
*
|
|
31
|
-
* @param type
|
|
32
|
-
* @param listener
|
|
33
|
-
* @note
|
|
31
|
+
* @param type Event type
|
|
32
|
+
* @param listener Event handler
|
|
33
|
+
* @note Duplicate registration of the same listener to the same event is ignored
|
|
34
34
|
*/
|
|
35
35
|
on<K extends keyof TEvents & string>(type: K, listener: (data: TEvents[K]) => void): void;
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
37
|
+
* Remove an event listener
|
|
38
38
|
*
|
|
39
|
-
* @param type
|
|
40
|
-
* @param listener
|
|
39
|
+
* @param type Event type
|
|
40
|
+
* @param listener Event handler to remove
|
|
41
41
|
*/
|
|
42
42
|
off<K extends keyof TEvents & string>(type: K, listener: (data: TEvents[K]) => void): void;
|
|
43
43
|
/**
|
|
44
|
-
*
|
|
44
|
+
* Emit an event
|
|
45
45
|
*
|
|
46
|
-
* @param type
|
|
47
|
-
* @param args
|
|
46
|
+
* @param type Event type
|
|
47
|
+
* @param args Event data (omitted if void type)
|
|
48
48
|
*/
|
|
49
49
|
emit<K extends keyof TEvents & string>(type: K, ...args: TEvents[K] extends void ? [] : [data: TEvents[K]]): void;
|
|
50
50
|
/**
|
|
51
|
-
*
|
|
51
|
+
* Return the number of listeners for a specific event
|
|
52
52
|
*
|
|
53
|
-
* @param type
|
|
54
|
-
* @returns
|
|
53
|
+
* @param type Event type
|
|
54
|
+
* @returns Number of registered listeners
|
|
55
55
|
*/
|
|
56
56
|
listenerCount<K extends keyof TEvents & string>(type: K): number;
|
|
57
57
|
/**
|
|
58
|
-
*
|
|
58
|
+
* Remove all event listeners
|
|
59
59
|
*/
|
|
60
60
|
dispose(): void;
|
|
61
61
|
/**
|
|
62
|
-
* using
|
|
62
|
+
* Supports using statement
|
|
63
63
|
*/
|
|
64
64
|
[Symbol.dispose](): void;
|
|
65
65
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
class EventEmitter {
|
|
2
2
|
_target = new EventTarget();
|
|
3
|
-
//
|
|
4
|
-
//
|
|
3
|
+
// Manage listener maps by event type (same listener can be registered to different events)
|
|
4
|
+
// Use Function type for polymorphic listener management
|
|
5
5
|
_listenerMap = /* @__PURE__ */ new Map();
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Register an event listener
|
|
8
8
|
*
|
|
9
|
-
* @param type
|
|
10
|
-
* @param listener
|
|
11
|
-
* @note
|
|
9
|
+
* @param type Event type
|
|
10
|
+
* @param listener Event handler
|
|
11
|
+
* @note Duplicate registration of the same listener to the same event is ignored
|
|
12
12
|
*/
|
|
13
13
|
on(type, listener) {
|
|
14
14
|
let typeMap = this._listenerMap.get(type);
|
|
@@ -22,10 +22,10 @@ class EventEmitter {
|
|
|
22
22
|
this._target.addEventListener(type, wrappedListener);
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
|
-
*
|
|
25
|
+
* Remove an event listener
|
|
26
26
|
*
|
|
27
|
-
* @param type
|
|
28
|
-
* @param listener
|
|
27
|
+
* @param type Event type
|
|
28
|
+
* @param listener Event handler to remove
|
|
29
29
|
*/
|
|
30
30
|
off(type, listener) {
|
|
31
31
|
const typeMap = this._listenerMap.get(type);
|
|
@@ -40,26 +40,26 @@ class EventEmitter {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
43
|
-
*
|
|
43
|
+
* Emit an event
|
|
44
44
|
*
|
|
45
|
-
* @param type
|
|
46
|
-
* @param args
|
|
45
|
+
* @param type Event type
|
|
46
|
+
* @param args Event data (omitted if void type)
|
|
47
47
|
*/
|
|
48
48
|
emit(type, ...args) {
|
|
49
49
|
this._target.dispatchEvent(new CustomEvent(type, { detail: args[0] }));
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
52
|
+
* Return the number of listeners for a specific event
|
|
53
53
|
*
|
|
54
|
-
* @param type
|
|
55
|
-
* @returns
|
|
54
|
+
* @param type Event type
|
|
55
|
+
* @returns Number of registered listeners
|
|
56
56
|
*/
|
|
57
57
|
listenerCount(type) {
|
|
58
58
|
var _a;
|
|
59
59
|
return ((_a = this._listenerMap.get(type)) == null ? void 0 : _a.size) ?? 0;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
|
-
*
|
|
62
|
+
* Remove all event listeners
|
|
63
63
|
*/
|
|
64
64
|
dispose() {
|
|
65
65
|
for (const [type, typeMap] of this._listenerMap) {
|
|
@@ -70,7 +70,7 @@ class EventEmitter {
|
|
|
70
70
|
this._listenerMap.clear();
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
|
-
* using
|
|
73
|
+
* Supports using statement
|
|
74
74
|
*/
|
|
75
75
|
[Symbol.dispose]() {
|
|
76
76
|
this.dispose();
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Asynchronous serial queue
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Functions added to the queue are executed sequentially.
|
|
5
|
+
* The next task starts only after one task completes.
|
|
6
|
+
* Subsequent tasks continue to execute even if an error occurs.
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
9
9
|
* const queue = new SerialQueue();
|
|
10
10
|
* queue.run(async () => { await fetch("/api/1"); });
|
|
11
|
-
* queue.run(async () => { await fetch("/api/2"); }); //
|
|
12
|
-
* queue.run(async () => { await fetch("/api/3"); }); //
|
|
11
|
+
* queue.run(async () => { await fetch("/api/2"); }); // executed after 1 completes
|
|
12
|
+
* queue.run(async () => { await fetch("/api/3"); }); // executed after 2 completes
|
|
13
13
|
*
|
|
14
14
|
* @example
|
|
15
|
-
* //
|
|
15
|
+
* // Error handling
|
|
16
16
|
* queue.on("error", (err) => console.error(err));
|
|
17
17
|
*/
|
|
18
18
|
import { SdError } from "../errors/sd-error";
|
|
@@ -26,19 +26,19 @@ export declare class SerialQueue extends EventEmitter<SerialQueueEvents> {
|
|
|
26
26
|
private readonly _queue;
|
|
27
27
|
private _isQueueRunning;
|
|
28
28
|
/**
|
|
29
|
-
* @param _gap
|
|
29
|
+
* @param _gap Gap between each task (ms)
|
|
30
30
|
*/
|
|
31
31
|
constructor(_gap?: number);
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
33
|
+
* Clear pending queue (currently executing task will complete)
|
|
34
34
|
*/
|
|
35
35
|
dispose(): void;
|
|
36
36
|
/**
|
|
37
|
-
* using
|
|
37
|
+
* Supports using statement
|
|
38
38
|
*/
|
|
39
39
|
[Symbol.dispose](): void;
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
41
|
+
* Add a function to the queue and execute it
|
|
42
42
|
*/
|
|
43
43
|
run(fn: () => void | Promise<void>): void;
|
|
44
44
|
private _process;
|
|
@@ -4,7 +4,7 @@ import consola from "consola";
|
|
|
4
4
|
import { waitTime } from "../utils/wait.js";
|
|
5
5
|
class SerialQueue extends EventEmitter {
|
|
6
6
|
/**
|
|
7
|
-
* @param _gap
|
|
7
|
+
* @param _gap Gap between each task (ms)
|
|
8
8
|
*/
|
|
9
9
|
constructor(_gap = 0) {
|
|
10
10
|
super();
|
|
@@ -14,20 +14,20 @@ class SerialQueue extends EventEmitter {
|
|
|
14
14
|
_queue = [];
|
|
15
15
|
_isQueueRunning = false;
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
17
|
+
* Clear pending queue (currently executing task will complete)
|
|
18
18
|
*/
|
|
19
19
|
dispose() {
|
|
20
20
|
this._queue.length = 0;
|
|
21
21
|
super.dispose();
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* using
|
|
24
|
+
* Supports using statement
|
|
25
25
|
*/
|
|
26
26
|
[Symbol.dispose]() {
|
|
27
27
|
this.dispose();
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
*
|
|
30
|
+
* Add a function to the queue and execute it
|
|
31
31
|
*/
|
|
32
32
|
run(fn) {
|
|
33
33
|
this._queue.push(fn);
|
|
@@ -44,7 +44,7 @@ class SerialQueue extends EventEmitter {
|
|
|
44
44
|
await fn();
|
|
45
45
|
} catch (err) {
|
|
46
46
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
47
|
-
const sdError = new SdError(error, "
|
|
47
|
+
const sdError = new SdError(error, "Error occurred while executing queue task");
|
|
48
48
|
if (this.listenerCount("error") > 0) {
|
|
49
49
|
this.emit("error", sdError);
|
|
50
50
|
} else {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/features/serial-queue.ts"],
|
|
4
|
-
"mappings": "AAiBA,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,OAAO,aAAa;AACpB,SAAS,gBAAgB;AAMlB,MAAM,oBAAoB,aAAgC;AAAA;AAAA;AAAA;AAAA,EAS/D,YAA6B,OAAe,GAAG;AAC7C,UAAM;AADqB;AAAA,EAE7B;AAAA,EAVA,OAAwB,UAAU,QAAQ,QAAQ,aAAa;AAAA,EAE9C,SAAyC,CAAC;AAAA,EACnD,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAYjB,UAAgB;AACvB,SAAK,OAAO,SAAS;AACrB,UAAM,QAAQ;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,CAAU,OAAO,OAAO,IAAU;AAChC,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAsC;AACxC,SAAK,OAAO,KAAK,EAAE;AACnB,SAAK,KAAK,SAAS;AAAA,EACrB;AAAA,EAEA,MAAc,WAA0B;AACtC,QAAI,KAAK,gBAAiB;AAC1B,SAAK,kBAAkB;AAEvB,QAAI;AACF,aAAO,KAAK,OAAO,SAAS,GAAG;AAC7B,cAAM,KAAK,KAAK,OAAO,MAAM;AAC7B,YAAI,CAAC,GAAI;AAET,YAAI;AACF,gBAAM,GAAG;AAAA,QACX,SAAS,KAAK;AACZ,gBAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,gBAAM,UAAU,IAAI,QAAQ,OAAO,
|
|
4
|
+
"mappings": "AAiBA,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,OAAO,aAAa;AACpB,SAAS,gBAAgB;AAMlB,MAAM,oBAAoB,aAAgC;AAAA;AAAA;AAAA;AAAA,EAS/D,YAA6B,OAAe,GAAG;AAC7C,UAAM;AADqB;AAAA,EAE7B;AAAA,EAVA,OAAwB,UAAU,QAAQ,QAAQ,aAAa;AAAA,EAE9C,SAAyC,CAAC;AAAA,EACnD,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAYjB,UAAgB;AACvB,SAAK,OAAO,SAAS;AACrB,UAAM,QAAQ;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,CAAU,OAAO,OAAO,IAAU;AAChC,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAsC;AACxC,SAAK,OAAO,KAAK,EAAE;AACnB,SAAK,KAAK,SAAS;AAAA,EACrB;AAAA,EAEA,MAAc,WAA0B;AACtC,QAAI,KAAK,gBAAiB;AAC1B,SAAK,kBAAkB;AAEvB,QAAI;AACF,aAAO,KAAK,OAAO,SAAS,GAAG;AAC7B,cAAM,KAAK,KAAK,OAAO,MAAM;AAC7B,YAAI,CAAC,GAAI;AAET,YAAI;AACF,gBAAM,GAAG;AAAA,QACX,SAAS,KAAK;AACZ,gBAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,gBAAM,UAAU,IAAI,QAAQ,OAAO,2CAA2C;AAG9E,cAAI,KAAK,cAAc,OAAO,IAAI,GAAG;AACnC,iBAAK,KAAK,SAAS,OAAO;AAAA,UAC5B,OAAO;AACL,wBAAY,QAAQ,MAAM,OAAO;AAAA,UACnC;AAAA,QACF;AAEA,YAAI,KAAK,OAAO,KAAK,KAAK,OAAO,SAAS,GAAG;AAC3C,gBAAM,SAAS,KAAK,IAAI;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/globals.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Whether development mode is enabled
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
4
|
+
* Substituted at build time:
|
|
5
|
+
* - Library build: Not substituted (kept as-is)
|
|
6
|
+
* - Client/Server build: Substituted with `define: { '__DEV__': 'true/false' }`
|
|
7
7
|
*/
|
|
8
8
|
export {};
|
|
9
9
|
declare global {
|