@simplysm/core-common 13.0.99 → 14.0.1
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/dist/common.types.d.ts +14 -14
- package/dist/common.types.js +2 -1
- package/dist/common.types.js.map +1 -6
- package/dist/env.d.ts +5 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +12 -8
- package/dist/env.js.map +1 -6
- 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 +31 -14
- package/dist/errors/argument-error.js.map +1 -6
- package/dist/errors/not-implemented-error.d.ts +8 -8
- package/dist/errors/not-implemented-error.js +30 -12
- package/dist/errors/not-implemented-error.js.map +1 -6
- package/dist/errors/sd-error.d.ts +10 -10
- package/dist/errors/sd-error.d.ts.map +1 -1
- package/dist/errors/sd-error.js +45 -24
- package/dist/errors/sd-error.js.map +1 -6
- package/dist/errors/timeout-error.d.ts +10 -10
- package/dist/errors/timeout-error.js +34 -15
- package/dist/errors/timeout-error.js.map +1 -6
- package/dist/extensions/arr-ext.d.ts +2 -2
- package/dist/extensions/arr-ext.helpers.d.ts +10 -10
- package/dist/extensions/arr-ext.helpers.js +112 -89
- package/dist/extensions/arr-ext.helpers.js.map +1 -6
- package/dist/extensions/arr-ext.js +458 -422
- package/dist/extensions/arr-ext.js.map +1 -6
- package/dist/extensions/arr-ext.types.d.ts +57 -57
- package/dist/extensions/arr-ext.types.d.ts.map +1 -1
- package/dist/extensions/arr-ext.types.js +6 -1
- package/dist/extensions/arr-ext.types.js.map +1 -6
- package/dist/extensions/map-ext.d.ts +16 -16
- package/dist/extensions/map-ext.js +27 -22
- package/dist/extensions/map-ext.js.map +1 -6
- package/dist/extensions/set-ext.d.ts +11 -11
- package/dist/extensions/set-ext.js +32 -25
- package/dist/extensions/set-ext.js.map +1 -6
- package/dist/features/debounce-queue.d.ts +17 -17
- package/dist/features/debounce-queue.js +98 -70
- package/dist/features/debounce-queue.js.map +1 -6
- package/dist/features/event-emitter.d.ts +20 -20
- package/dist/features/event-emitter.js +101 -78
- package/dist/features/event-emitter.js.map +1 -6
- package/dist/features/serial-queue.d.ts +11 -11
- package/dist/features/serial-queue.js +78 -57
- package/dist/features/serial-queue.js.map +1 -6
- package/dist/globals.d.ts +4 -4
- package/dist/globals.js +9 -1
- package/dist/globals.js.map +1 -6
- package/dist/index.js +28 -27
- package/dist/index.js.map +1 -6
- 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 +263 -252
- package/dist/types/date-only.js.map +1 -6
- package/dist/types/date-time.d.ts +36 -36
- package/dist/types/date-time.d.ts.map +1 -1
- package/dist/types/date-time.js +196 -288
- package/dist/types/date-time.js.map +1 -6
- 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 +202 -159
- package/dist/types/lazy-gc-map.js.map +1 -6
- package/dist/types/time.d.ts +23 -23
- package/dist/types/time.d.ts.map +1 -1
- package/dist/types/time.js +169 -158
- package/dist/types/time.js.map +1 -6
- package/dist/types/uuid.d.ts +11 -11
- package/dist/types/uuid.d.ts.map +1 -1
- package/dist/types/uuid.js +95 -70
- package/dist/types/uuid.js.map +1 -6
- package/dist/utils/bytes.d.ts +17 -17
- package/dist/utils/bytes.js +137 -81
- package/dist/utils/bytes.js.map +1 -6
- package/dist/utils/date-format.d.ts +40 -40
- package/dist/utils/date-format.js +187 -101
- package/dist/utils/date-format.js.map +1 -6
- package/dist/utils/error.d.ts +4 -4
- package/dist/utils/error.js +11 -6
- package/dist/utils/error.js.map +1 -6
- package/dist/utils/json.d.ts +19 -19
- package/dist/utils/json.js +187 -135
- package/dist/utils/json.js.map +1 -6
- package/dist/utils/num.d.ts +20 -20
- package/dist/utils/num.js +76 -34
- package/dist/utils/num.js.map +1 -6
- package/dist/utils/obj.d.ts +111 -111
- package/dist/utils/obj.d.ts.map +1 -1
- package/dist/utils/obj.js +706 -496
- package/dist/utils/obj.js.map +1 -6
- package/dist/utils/path.d.ts +10 -10
- package/dist/utils/path.js +35 -18
- package/dist/utils/path.js.map +1 -6
- package/dist/utils/primitive.d.ts +5 -5
- package/dist/utils/primitive.js +34 -14
- package/dist/utils/primitive.js.map +1 -6
- package/dist/utils/str.d.ts +38 -38
- package/dist/utils/str.js +217 -113
- package/dist/utils/str.js.map +1 -6
- package/dist/utils/template-strings.d.ts +26 -26
- package/dist/utils/template-strings.js +113 -40
- package/dist/utils/template-strings.js.map +1 -6
- package/dist/utils/transferable.d.ts +18 -18
- package/dist/utils/transferable.js +218 -151
- package/dist/utils/transferable.js.map +1 -6
- package/dist/utils/wait.d.ts +9 -9
- package/dist/utils/wait.js +30 -15
- package/dist/utils/wait.js.map +1 -6
- package/dist/utils/xml.d.ts +13 -13
- package/dist/utils/xml.js +84 -46
- package/dist/utils/xml.js.map +1 -6
- package/dist/utils/zip.d.ts +22 -22
- package/dist/utils/zip.js +172 -148
- package/dist/utils/zip.js.map +1 -6
- package/package.json +5 -7
- package/src/common.types.ts +14 -14
- package/src/env.ts +9 -1
- 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 +16 -16
- package/src/extensions/arr-ext.ts +35 -35
- package/src/extensions/arr-ext.types.ts +57 -57
- package/src/extensions/map-ext.ts +16 -16
- package/src/extensions/set-ext.ts +11 -11
- package/src/features/debounce-queue.ts +23 -23
- 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 +5 -5
- package/src/types/date-only.ts +84 -83
- package/src/types/date-time.ts +43 -42
- package/src/types/lazy-gc-map.ts +44 -44
- package/src/types/time.ts +29 -29
- package/src/types/uuid.ts +15 -15
- package/src/utils/bytes.ts +35 -35
- package/src/utils/date-format.ts +59 -59
- package/src/utils/error.ts +4 -4
- package/src/utils/json.ts +41 -41
- package/src/utils/num.ts +20 -20
- 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 +48 -48
- package/src/utils/template-strings.ts +29 -29
- package/src/utils/transferable.ts +38 -38
- package/src/utils/wait.ts +10 -10
- package/src/utils/xml.ts +19 -19
- package/src/utils/zip.ts +25 -25
- package/README.md +0 -160
- package/docs/errors.md +0 -119
- package/docs/extensions.md +0 -387
- package/docs/features.md +0 -143
- package/docs/types.md +0 -287
- package/docs/utils.md +0 -757
- package/tests/errors/errors.spec.ts +0 -80
- package/tests/extensions/array-extension.spec.ts +0 -654
- package/tests/extensions/map-extension.spec.ts +0 -117
- package/tests/extensions/set-extension.spec.ts +0 -67
- package/tests/types/date-only.spec.ts +0 -533
- package/tests/types/date-time.spec.ts +0 -246
- package/tests/types/lazy-gc-map.spec.ts +0 -606
- package/tests/types/time.spec.ts +0 -428
- package/tests/types/uuid.spec.ts +0 -74
- package/tests/utils/bytes-utils.spec.ts +0 -197
- package/tests/utils/date-format.spec.ts +0 -350
- package/tests/utils/debounce-queue.spec.ts +0 -226
- package/tests/utils/json.spec.ts +0 -400
- package/tests/utils/number.spec.ts +0 -136
- package/tests/utils/object.spec.ts +0 -810
- package/tests/utils/path.spec.ts +0 -70
- package/tests/utils/primitive.spec.ts +0 -43
- package/tests/utils/sd-event-emitter.spec.ts +0 -189
- package/tests/utils/serial-queue.spec.ts +0 -305
- package/tests/utils/string.spec.ts +0 -265
- package/tests/utils/template-strings.spec.ts +0 -48
- package/tests/utils/transferable.spec.ts +0 -639
- package/tests/utils/wait.spec.ts +0 -123
- package/tests/utils/xml.spec.ts +0 -146
- package/tests/utils/zip.spec.ts +0 -221
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 비동기 디바운스 큐
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* 짧은 시간 내에 여러 번 호출되면 마지막 요청만 실행하고
|
|
5
|
+
* 이전 요청은 무시한다. 입력 필드 자동완성,
|
|
6
|
+
* 연속적인 상태 변경 일괄 처리 등에 유용함.
|
|
7
7
|
*
|
|
8
8
|
* @remarks
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* 실행 중에 추가된 요청은 디바운스 지연 없이 현재 실행이
|
|
10
|
+
* 완료된 직후 즉시 처리됨. 이는 실행 완료 전에 도착한
|
|
11
|
+
* 요청을 놓치지 않기 위한 의도적인 설계임.
|
|
12
12
|
*
|
|
13
13
|
* @example
|
|
14
|
-
* const queue = new DebounceQueue(300); // 300ms
|
|
15
|
-
* queue.run(() => console.log("1")); //
|
|
16
|
-
* queue.run(() => console.log("2")); //
|
|
17
|
-
* queue.run(() => console.log("3")); //
|
|
14
|
+
* const queue = new DebounceQueue(300); // 300ms 지연
|
|
15
|
+
* queue.run(() => console.log("1")); // 무시됨
|
|
16
|
+
* queue.run(() => console.log("2")); // 무시됨
|
|
17
|
+
* queue.run(() => console.log("3")); // 300ms 후 실행
|
|
18
18
|
*
|
|
19
19
|
* @example
|
|
20
|
-
* //
|
|
20
|
+
* // 에러 처리
|
|
21
21
|
* queue.on("error", (err) => console.error(err));
|
|
22
22
|
*/
|
|
23
23
|
import { SdError } from "../errors/sd-error";
|
|
@@ -33,20 +33,20 @@ export declare class DebounceQueue extends EventEmitter<DebounceQueueEvents> {
|
|
|
33
33
|
private _isDisposed;
|
|
34
34
|
private _timer;
|
|
35
35
|
/**
|
|
36
|
-
* @param _delay
|
|
36
|
+
* @param _delay 디바운스 지연 시간 (밀리초). 생략 시 즉시 실행 (다음 이벤트 루프)
|
|
37
37
|
*/
|
|
38
38
|
constructor(_delay?: number | undefined);
|
|
39
39
|
/**
|
|
40
|
-
*
|
|
40
|
+
* 대기 중인 작업과 타이머 정리
|
|
41
41
|
*/
|
|
42
42
|
dispose(): void;
|
|
43
43
|
/**
|
|
44
|
-
*
|
|
44
|
+
* using 문 지원
|
|
45
45
|
*/
|
|
46
46
|
[Symbol.dispose](): void;
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
48
|
+
* 큐에 함수 추가
|
|
49
|
+
* 이전에 추가된 함수가 있으면 교체됨
|
|
50
50
|
*/
|
|
51
51
|
run(fn: () => void | Promise<void>): void;
|
|
52
52
|
private _processLast;
|
|
@@ -1,80 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 비동기 디바운스 큐
|
|
3
|
+
*
|
|
4
|
+
* 짧은 시간 내에 여러 번 호출되면 마지막 요청만 실행하고
|
|
5
|
+
* 이전 요청은 무시한다. 입력 필드 자동완성,
|
|
6
|
+
* 연속적인 상태 변경 일괄 처리 등에 유용함.
|
|
7
|
+
*
|
|
8
|
+
* @remarks
|
|
9
|
+
* 실행 중에 추가된 요청은 디바운스 지연 없이 현재 실행이
|
|
10
|
+
* 완료된 직후 즉시 처리됨. 이는 실행 완료 전에 도착한
|
|
11
|
+
* 요청을 놓치지 않기 위한 의도적인 설계임.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const queue = new DebounceQueue(300); // 300ms 지연
|
|
15
|
+
* queue.run(() => console.log("1")); // 무시됨
|
|
16
|
+
* queue.run(() => console.log("2")); // 무시됨
|
|
17
|
+
* queue.run(() => console.log("3")); // 300ms 후 실행
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // 에러 처리
|
|
21
|
+
* queue.on("error", (err) => console.error(err));
|
|
22
|
+
*/
|
|
1
23
|
import { SdError } from "../errors/sd-error.js";
|
|
2
24
|
import { EventEmitter } from "./event-emitter.js";
|
|
3
25
|
import consola from "consola";
|
|
4
|
-
class DebounceQueue extends EventEmitter {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Clean up pending tasks and timers
|
|
19
|
-
*/
|
|
20
|
-
dispose() {
|
|
21
|
-
this._isDisposed = true;
|
|
22
|
-
if (this._timer) {
|
|
23
|
-
clearTimeout(this._timer);
|
|
24
|
-
this._timer = void 0;
|
|
26
|
+
export class DebounceQueue extends EventEmitter {
|
|
27
|
+
_delay;
|
|
28
|
+
static _logger = consola.withTag("DebounceQueue");
|
|
29
|
+
_pendingFn;
|
|
30
|
+
_isRunning = false;
|
|
31
|
+
_isDisposed = false;
|
|
32
|
+
_timer;
|
|
33
|
+
/**
|
|
34
|
+
* @param _delay 디바운스 지연 시간 (밀리초). 생략 시 즉시 실행 (다음 이벤트 루프)
|
|
35
|
+
*/
|
|
36
|
+
constructor(_delay) {
|
|
37
|
+
super();
|
|
38
|
+
this._delay = _delay;
|
|
25
39
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
* If there was a previously added function, it will be replaced
|
|
38
|
-
*/
|
|
39
|
-
run(fn) {
|
|
40
|
-
if (this._isDisposed) return;
|
|
41
|
-
this._pendingFn = fn;
|
|
42
|
-
if (this._timer) {
|
|
43
|
-
clearTimeout(this._timer);
|
|
44
|
-
this._timer = void 0;
|
|
40
|
+
/**
|
|
41
|
+
* 대기 중인 작업과 타이머 정리
|
|
42
|
+
*/
|
|
43
|
+
dispose() {
|
|
44
|
+
this._isDisposed = true;
|
|
45
|
+
if (this._timer != null) {
|
|
46
|
+
clearTimeout(this._timer);
|
|
47
|
+
this._timer = undefined;
|
|
48
|
+
}
|
|
49
|
+
this._pendingFn = undefined;
|
|
50
|
+
super.dispose();
|
|
45
51
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
/**
|
|
53
|
+
* using 문 지원
|
|
54
|
+
*/
|
|
55
|
+
[Symbol.dispose]() {
|
|
56
|
+
this.dispose();
|
|
50
57
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
this.
|
|
58
|
+
/**
|
|
59
|
+
* 큐에 함수 추가
|
|
60
|
+
* 이전에 추가된 함수가 있으면 교체됨
|
|
61
|
+
*/
|
|
62
|
+
run(fn) {
|
|
63
|
+
if (this._isDisposed)
|
|
64
|
+
return;
|
|
65
|
+
this._pendingFn = fn;
|
|
66
|
+
if (this._timer != null) {
|
|
67
|
+
clearTimeout(this._timer);
|
|
68
|
+
this._timer = undefined;
|
|
69
|
+
}
|
|
70
|
+
if (!this._isRunning) {
|
|
71
|
+
this._timer = setTimeout(() => {
|
|
72
|
+
void this._processLast();
|
|
73
|
+
}, this._delay);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async _processLast() {
|
|
77
|
+
if (this._isDisposed || this._isRunning || !this._pendingFn)
|
|
78
|
+
return;
|
|
79
|
+
this._isRunning = true;
|
|
80
|
+
this._timer = undefined;
|
|
60
81
|
try {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
82
|
+
// 실행 중에 새 요청이 들어오면 디바운스 지연 없이 즉시 처리
|
|
83
|
+
// 실행 완료 전에 도착한 요청을 실행 직후 즉시 처리하기 위한 의도적인 설계
|
|
84
|
+
while (this._pendingFn) {
|
|
85
|
+
const currentFn = this._pendingFn;
|
|
86
|
+
this._pendingFn = undefined;
|
|
87
|
+
try {
|
|
88
|
+
await currentFn();
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
92
|
+
const sdError = new SdError(error, "작업 실행 중 오류 발생");
|
|
93
|
+
// 리스너가 있으면 이벤트로 발행, 없으면 로그 출력
|
|
94
|
+
if (this.listenerCount("error") > 0) {
|
|
95
|
+
this.emit("error", sdError);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
DebounceQueue._logger.error(sdError);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
this._isRunning = false;
|
|
70
105
|
}
|
|
71
|
-
}
|
|
72
|
-
} finally {
|
|
73
|
-
this._isRunning = false;
|
|
74
106
|
}
|
|
75
|
-
}
|
|
76
107
|
}
|
|
77
|
-
|
|
78
|
-
DebounceQueue
|
|
79
|
-
};
|
|
80
|
-
//# sourceMappingURL=debounce-queue.js.map
|
|
108
|
+
//# sourceMappingURL=debounce-queue.js.map
|
|
@@ -1,6 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/features/debounce-queue.ts"],
|
|
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
|
-
"names": []
|
|
6
|
-
}
|
|
1
|
+
{"version":3,"file":"debounce-queue.js","sourceRoot":"","sources":["../../src/features/debounce-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* EventTarget
|
|
2
|
+
* EventTarget 래퍼 - EventEmitter와 유사한 API 제공
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* 브라우저와 Node.js 모두에서 사용 가능한 타입 안전한 이벤트 이미터.
|
|
5
|
+
* 내부적으로 EventTarget을 사용하여 구현됨.
|
|
6
6
|
*
|
|
7
|
-
* @typeParam TEvents
|
|
7
|
+
* @typeParam TEvents 이벤트 타입 맵. key는 이벤트 이름, value는 이벤트 데이터 타입
|
|
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 타입은 인자 없이 호출
|
|
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
|
+
* 이벤트 리스너 등록
|
|
30
30
|
*
|
|
31
|
-
* @param type
|
|
32
|
-
* @param listener
|
|
33
|
-
* @note
|
|
31
|
+
* @param type 이벤트 타입
|
|
32
|
+
* @param listener 이벤트 핸들러
|
|
33
|
+
* @note 같은 리스너를 같은 이벤트에 중복 등록하면 무시됨
|
|
34
34
|
*/
|
|
35
35
|
on<TEventName extends keyof TEvents & string>(type: TEventName, listener: (data: TEvents[TEventName]) => void): void;
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
37
|
+
* 이벤트 리스너 제거
|
|
38
38
|
*
|
|
39
|
-
* @param type
|
|
40
|
-
* @param listener
|
|
39
|
+
* @param type 이벤트 타입
|
|
40
|
+
* @param listener 제거할 이벤트 핸들러
|
|
41
41
|
*/
|
|
42
42
|
off<TEventName extends keyof TEvents & string>(type: TEventName, listener: (data: TEvents[TEventName]) => void): void;
|
|
43
43
|
/**
|
|
44
|
-
*
|
|
44
|
+
* 이벤트 발행
|
|
45
45
|
*
|
|
46
|
-
* @param type
|
|
47
|
-
* @param args
|
|
46
|
+
* @param type 이벤트 타입
|
|
47
|
+
* @param args 이벤트 데이터 (void 타입이면 생략)
|
|
48
48
|
*/
|
|
49
49
|
emit<TEventName extends keyof TEvents & string>(type: TEventName, ...args: TEvents[TEventName] extends void ? [] : [data: TEvents[TEventName]]): void;
|
|
50
50
|
/**
|
|
51
|
-
*
|
|
51
|
+
* 특정 이벤트의 리스너 수 반환
|
|
52
52
|
*
|
|
53
|
-
* @param type
|
|
54
|
-
* @returns
|
|
53
|
+
* @param type 이벤트 타입
|
|
54
|
+
* @returns 등록된 리스너 수
|
|
55
55
|
*/
|
|
56
56
|
listenerCount<TEventName extends keyof TEvents & string>(type: TEventName): number;
|
|
57
57
|
/**
|
|
58
|
-
*
|
|
58
|
+
* 모든 이벤트 리스너 제거
|
|
59
59
|
*/
|
|
60
60
|
dispose(): void;
|
|
61
61
|
/**
|
|
62
|
-
*
|
|
62
|
+
* using 문 지원
|
|
63
63
|
*/
|
|
64
64
|
[Symbol.dispose](): void;
|
|
65
65
|
}
|
|
@@ -1,82 +1,105 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
/**
|
|
2
|
+
* EventTarget 래퍼 - EventEmitter와 유사한 API 제공
|
|
3
|
+
*
|
|
4
|
+
* 브라우저와 Node.js 모두에서 사용 가능한 타입 안전한 이벤트 이미터.
|
|
5
|
+
* 내부적으로 EventTarget을 사용하여 구현됨.
|
|
6
|
+
*
|
|
7
|
+
* @typeParam TEvents 이벤트 타입 맵. key는 이벤트 이름, value는 이벤트 데이터 타입
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* interface MyEvents {
|
|
11
|
+
* data: string;
|
|
12
|
+
* error: Error;
|
|
13
|
+
* done: void;
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* class MyEmitter extends EventEmitter<MyEvents> {}
|
|
17
|
+
*
|
|
18
|
+
* const emitter = new MyEmitter();
|
|
19
|
+
* emitter.on("data", (data) => console.log(data)); // data: string
|
|
20
|
+
* emitter.emit("data", "hello");
|
|
21
|
+
* emitter.emit("done"); // void 타입은 인자 없이 호출
|
|
22
|
+
*/
|
|
23
|
+
export class EventEmitter {
|
|
24
|
+
_target = new EventTarget();
|
|
25
|
+
// 이벤트 타입별 리스너 맵 관리 (같은 리스너를 다른 이벤트에 등록 가능)
|
|
26
|
+
// 다형성 리스너 관리를 위해 Function 타입 사용
|
|
27
|
+
_listenerMap = new Map();
|
|
28
|
+
/**
|
|
29
|
+
* 이벤트 리스너 등록
|
|
30
|
+
*
|
|
31
|
+
* @param type 이벤트 타입
|
|
32
|
+
* @param listener 이벤트 핸들러
|
|
33
|
+
* @note 같은 리스너를 같은 이벤트에 중복 등록하면 무시됨
|
|
34
|
+
*/
|
|
35
|
+
on(type, listener) {
|
|
36
|
+
// 이벤트 타입에 대한 맵 조회 또는 생성
|
|
37
|
+
let typeMap = this._listenerMap.get(type);
|
|
38
|
+
if (!typeMap) {
|
|
39
|
+
typeMap = new Map();
|
|
40
|
+
this._listenerMap.set(type, typeMap);
|
|
41
|
+
}
|
|
42
|
+
// 이 이벤트에 이미 등록된 리스너이면 무시 (중복 등록 방지)
|
|
43
|
+
if (typeMap.has(listener))
|
|
44
|
+
return;
|
|
45
|
+
const wrappedListener = (e) => listener(e.detail);
|
|
46
|
+
typeMap.set(listener, wrappedListener);
|
|
47
|
+
this._target.addEventListener(type, wrappedListener);
|
|
18
48
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
this._listenerMap.delete(type);
|
|
39
|
-
}
|
|
49
|
+
/**
|
|
50
|
+
* 이벤트 리스너 제거
|
|
51
|
+
*
|
|
52
|
+
* @param type 이벤트 타입
|
|
53
|
+
* @param listener 제거할 이벤트 핸들러
|
|
54
|
+
*/
|
|
55
|
+
off(type, listener) {
|
|
56
|
+
const typeMap = this._listenerMap.get(type);
|
|
57
|
+
if (!typeMap)
|
|
58
|
+
return;
|
|
59
|
+
const wrappedListener = typeMap.get(listener);
|
|
60
|
+
if (wrappedListener) {
|
|
61
|
+
this._target.removeEventListener(type, wrappedListener);
|
|
62
|
+
typeMap.delete(listener);
|
|
63
|
+
// 빈 맵 정리
|
|
64
|
+
if (typeMap.size === 0) {
|
|
65
|
+
this._listenerMap.delete(type);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
40
68
|
}
|
|
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
|
+
* @param type 이벤트 타입
|
|
73
|
+
* @param args 이벤트 데이터 (void 타입이면 생략)
|
|
74
|
+
*/
|
|
75
|
+
emit(type, ...args) {
|
|
76
|
+
this._target.dispatchEvent(new CustomEvent(type, { detail: args[0] }));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 특정 이벤트의 리스너 수 반환
|
|
80
|
+
*
|
|
81
|
+
* @param type 이벤트 타입
|
|
82
|
+
* @returns 등록된 리스너 수
|
|
83
|
+
*/
|
|
84
|
+
listenerCount(type) {
|
|
85
|
+
return this._listenerMap.get(type)?.size ?? 0;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 모든 이벤트 리스너 제거
|
|
89
|
+
*/
|
|
90
|
+
dispose() {
|
|
91
|
+
for (const [type, typeMap] of this._listenerMap) {
|
|
92
|
+
for (const wrappedListener of typeMap.values()) {
|
|
93
|
+
this._target.removeEventListener(type, wrappedListener);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
this._listenerMap.clear();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* using 문 지원
|
|
100
|
+
*/
|
|
101
|
+
[Symbol.dispose]() {
|
|
102
|
+
this.dispose();
|
|
69
103
|
}
|
|
70
|
-
this._listenerMap.clear();
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Supports using statement
|
|
74
|
-
*/
|
|
75
|
-
[Symbol.dispose]() {
|
|
76
|
-
this.dispose();
|
|
77
|
-
}
|
|
78
104
|
}
|
|
79
|
-
|
|
80
|
-
EventEmitter
|
|
81
|
-
};
|
|
82
|
-
//# sourceMappingURL=event-emitter.js.map
|
|
105
|
+
//# sourceMappingURL=event-emitter.js.map
|
|
@@ -1,6 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/features/event-emitter.ts"],
|
|
4
|
-
"mappings": "AAsBO,MAAM,aAEX;AAAA,EACiB,UAAU,IAAI,YAAY;AAAA;AAAA;AAAA,EAG1B,eAAe,oBAAI,IAA+C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnF,GAA8C,MAAkB,UAAqD;AAEnH,QAAI,UAAU,KAAK,aAAa,IAAI,IAAI;AACxC,QAAI,CAAC,SAAS;AACZ,gBAAU,oBAAI,IAAI;AAClB,WAAK,aAAa,IAAI,MAAM,OAAO;AAAA,IACrC;AAGA,QAAI,QAAQ,IAAI,QAAQ,EAAG;AAE3B,UAAM,kBAAkB,CAAC,MAAa,SAAU,EAAkB,MAAM;AACxE,YAAQ,IAAI,UAAU,eAAe;AACrC,SAAK,QAAQ,iBAAiB,MAAM,eAAe;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAA+C,MAAkB,UAAqD;AACpH,UAAM,UAAU,KAAK,aAAa,IAAI,IAAI;AAC1C,QAAI,CAAC,QAAS;AAEd,UAAM,kBAAkB,QAAQ,IAAI,QAAQ;AAC5C,QAAI,iBAAiB;AACnB,WAAK,QAAQ,oBAAoB,MAAM,eAAe;AACtD,cAAQ,OAAO,QAAQ;AAGvB,UAAI,QAAQ,SAAS,GAAG;AACtB,aAAK,aAAa,OAAO,IAAI;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KACE,SACG,MACG;AACN,SAAK,QAAQ,cAAc,IAAI,YAAY,MAAM,EAAE,QAAQ,KAAK,CAAC,EAAE,CAAC,CAAC;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAyD,MAA0B;AA9FrF;AA+FI,aAAO,UAAK,aAAa,IAAI,IAAI,MAA1B,mBAA6B,SAAQ;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,eAAW,CAAC,MAAM,OAAO,KAAK,KAAK,cAAc;AAC/C,iBAAW,mBAAmB,QAAQ,OAAO,GAAG;AAC9C,aAAK,QAAQ,oBAAoB,MAAM,eAAe;AAAA,MACxD;AAAA,IACF;AACA,SAAK,aAAa,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,CAAC,OAAO,OAAO,IAAU;AACvB,SAAK,QAAQ;AAAA,EACf;AACF;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
1
|
+
{"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../src/features/event-emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,YAAY;IAGN,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7C,2CAA2C;IAC3C,gCAAgC;IACf,YAAY,GAAG,IAAI,GAAG,EAA6C,CAAC;IAErF;;;;;;OAMG;IACH,EAAE,CAA4C,IAAgB,EAAE,QAA6C;QAC3G,wBAAwB;QACxB,IAAI,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,oCAAoC;QACpC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO;QAElC,MAAM,eAAe,GAAG,CAAC,CAAQ,EAAE,EAAE,CAAC,QAAQ,CAAE,CAAiB,CAAC,MAAM,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACvD,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAA4C,IAAgB,EAAE,QAA6C;QAC5G,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEzB,SAAS;YACT,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,IAAI,CACF,IAAgB,EAChB,GAAG,IAAyE;QAE5E,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAA4C,IAAgB;QACvE,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAChD,KAAK,MAAM,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC/C,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,CAAC,MAAM,CAAC,OAAO,CAAC;QACd,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 비동기 직렬 큐
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* 큐에 추가된 함수들은 순차적으로 실행됨.
|
|
5
|
+
* 하나의 작업이 완료된 후에야 다음 작업이 시작됨.
|
|
6
|
+
* 에러가 발생해도 후속 작업은 계속 실행됨.
|
|
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"); }); // 1 완료 후 실행
|
|
12
|
+
* queue.run(async () => { await fetch("/api/3"); }); // 2 완료 후 실행
|
|
13
13
|
*
|
|
14
14
|
* @example
|
|
15
|
-
* //
|
|
15
|
+
* // 에러 처리
|
|
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 각 작업 사이의 간격 (ms)
|
|
30
30
|
*/
|
|
31
31
|
constructor(_gap?: number);
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
33
|
+
* 대기 중인 큐 비우기 (현재 실행 중인 작업은 완료됨)
|
|
34
34
|
*/
|
|
35
35
|
dispose(): void;
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
37
|
+
* using 문 지원
|
|
38
38
|
*/
|
|
39
39
|
[Symbol.dispose](): void;
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
41
|
+
* 큐에 함수를 추가하고 실행
|
|
42
42
|
*/
|
|
43
43
|
run(fn: () => void | Promise<void>): void;
|
|
44
44
|
private _process;
|