@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.
Files changed (181) hide show
  1. package/dist/common.types.d.ts +14 -14
  2. package/dist/common.types.js +2 -1
  3. package/dist/common.types.js.map +1 -6
  4. package/dist/env.d.ts +5 -0
  5. package/dist/env.d.ts.map +1 -1
  6. package/dist/env.js +12 -8
  7. package/dist/env.js.map +1 -6
  8. package/dist/errors/argument-error.d.ts +10 -10
  9. package/dist/errors/argument-error.d.ts.map +1 -1
  10. package/dist/errors/argument-error.js +31 -14
  11. package/dist/errors/argument-error.js.map +1 -6
  12. package/dist/errors/not-implemented-error.d.ts +8 -8
  13. package/dist/errors/not-implemented-error.js +30 -12
  14. package/dist/errors/not-implemented-error.js.map +1 -6
  15. package/dist/errors/sd-error.d.ts +10 -10
  16. package/dist/errors/sd-error.d.ts.map +1 -1
  17. package/dist/errors/sd-error.js +45 -24
  18. package/dist/errors/sd-error.js.map +1 -6
  19. package/dist/errors/timeout-error.d.ts +10 -10
  20. package/dist/errors/timeout-error.js +34 -15
  21. package/dist/errors/timeout-error.js.map +1 -6
  22. package/dist/extensions/arr-ext.d.ts +2 -2
  23. package/dist/extensions/arr-ext.helpers.d.ts +10 -10
  24. package/dist/extensions/arr-ext.helpers.js +112 -89
  25. package/dist/extensions/arr-ext.helpers.js.map +1 -6
  26. package/dist/extensions/arr-ext.js +458 -422
  27. package/dist/extensions/arr-ext.js.map +1 -6
  28. package/dist/extensions/arr-ext.types.d.ts +57 -57
  29. package/dist/extensions/arr-ext.types.d.ts.map +1 -1
  30. package/dist/extensions/arr-ext.types.js +6 -1
  31. package/dist/extensions/arr-ext.types.js.map +1 -6
  32. package/dist/extensions/map-ext.d.ts +16 -16
  33. package/dist/extensions/map-ext.js +27 -22
  34. package/dist/extensions/map-ext.js.map +1 -6
  35. package/dist/extensions/set-ext.d.ts +11 -11
  36. package/dist/extensions/set-ext.js +32 -25
  37. package/dist/extensions/set-ext.js.map +1 -6
  38. package/dist/features/debounce-queue.d.ts +17 -17
  39. package/dist/features/debounce-queue.js +98 -70
  40. package/dist/features/debounce-queue.js.map +1 -6
  41. package/dist/features/event-emitter.d.ts +20 -20
  42. package/dist/features/event-emitter.js +101 -78
  43. package/dist/features/event-emitter.js.map +1 -6
  44. package/dist/features/serial-queue.d.ts +11 -11
  45. package/dist/features/serial-queue.js +78 -57
  46. package/dist/features/serial-queue.js.map +1 -6
  47. package/dist/globals.d.ts +4 -4
  48. package/dist/globals.js +9 -1
  49. package/dist/globals.js.map +1 -6
  50. package/dist/index.js +28 -27
  51. package/dist/index.js.map +1 -6
  52. package/dist/types/date-only.d.ts +64 -64
  53. package/dist/types/date-only.d.ts.map +1 -1
  54. package/dist/types/date-only.js +263 -252
  55. package/dist/types/date-only.js.map +1 -6
  56. package/dist/types/date-time.d.ts +36 -36
  57. package/dist/types/date-time.d.ts.map +1 -1
  58. package/dist/types/date-time.js +196 -288
  59. package/dist/types/date-time.js.map +1 -6
  60. package/dist/types/lazy-gc-map.d.ts +26 -26
  61. package/dist/types/lazy-gc-map.d.ts.map +1 -1
  62. package/dist/types/lazy-gc-map.js +202 -159
  63. package/dist/types/lazy-gc-map.js.map +1 -6
  64. package/dist/types/time.d.ts +23 -23
  65. package/dist/types/time.d.ts.map +1 -1
  66. package/dist/types/time.js +169 -158
  67. package/dist/types/time.js.map +1 -6
  68. package/dist/types/uuid.d.ts +11 -11
  69. package/dist/types/uuid.d.ts.map +1 -1
  70. package/dist/types/uuid.js +95 -70
  71. package/dist/types/uuid.js.map +1 -6
  72. package/dist/utils/bytes.d.ts +17 -17
  73. package/dist/utils/bytes.js +137 -81
  74. package/dist/utils/bytes.js.map +1 -6
  75. package/dist/utils/date-format.d.ts +40 -40
  76. package/dist/utils/date-format.js +187 -101
  77. package/dist/utils/date-format.js.map +1 -6
  78. package/dist/utils/error.d.ts +4 -4
  79. package/dist/utils/error.js +11 -6
  80. package/dist/utils/error.js.map +1 -6
  81. package/dist/utils/json.d.ts +19 -19
  82. package/dist/utils/json.js +187 -135
  83. package/dist/utils/json.js.map +1 -6
  84. package/dist/utils/num.d.ts +20 -20
  85. package/dist/utils/num.js +76 -34
  86. package/dist/utils/num.js.map +1 -6
  87. package/dist/utils/obj.d.ts +111 -111
  88. package/dist/utils/obj.d.ts.map +1 -1
  89. package/dist/utils/obj.js +706 -496
  90. package/dist/utils/obj.js.map +1 -6
  91. package/dist/utils/path.d.ts +10 -10
  92. package/dist/utils/path.js +35 -18
  93. package/dist/utils/path.js.map +1 -6
  94. package/dist/utils/primitive.d.ts +5 -5
  95. package/dist/utils/primitive.js +34 -14
  96. package/dist/utils/primitive.js.map +1 -6
  97. package/dist/utils/str.d.ts +38 -38
  98. package/dist/utils/str.js +217 -113
  99. package/dist/utils/str.js.map +1 -6
  100. package/dist/utils/template-strings.d.ts +26 -26
  101. package/dist/utils/template-strings.js +113 -40
  102. package/dist/utils/template-strings.js.map +1 -6
  103. package/dist/utils/transferable.d.ts +18 -18
  104. package/dist/utils/transferable.js +218 -151
  105. package/dist/utils/transferable.js.map +1 -6
  106. package/dist/utils/wait.d.ts +9 -9
  107. package/dist/utils/wait.js +30 -15
  108. package/dist/utils/wait.js.map +1 -6
  109. package/dist/utils/xml.d.ts +13 -13
  110. package/dist/utils/xml.js +84 -46
  111. package/dist/utils/xml.js.map +1 -6
  112. package/dist/utils/zip.d.ts +22 -22
  113. package/dist/utils/zip.js +172 -148
  114. package/dist/utils/zip.js.map +1 -6
  115. package/package.json +5 -7
  116. package/src/common.types.ts +14 -14
  117. package/src/env.ts +9 -1
  118. package/src/errors/argument-error.ts +15 -15
  119. package/src/errors/not-implemented-error.ts +9 -9
  120. package/src/errors/sd-error.ts +12 -12
  121. package/src/errors/timeout-error.ts +12 -12
  122. package/src/extensions/arr-ext.helpers.ts +16 -16
  123. package/src/extensions/arr-ext.ts +35 -35
  124. package/src/extensions/arr-ext.types.ts +57 -57
  125. package/src/extensions/map-ext.ts +16 -16
  126. package/src/extensions/set-ext.ts +11 -11
  127. package/src/features/debounce-queue.ts +23 -23
  128. package/src/features/event-emitter.ts +25 -25
  129. package/src/features/serial-queue.ts +13 -13
  130. package/src/globals.ts +4 -4
  131. package/src/index.ts +5 -5
  132. package/src/types/date-only.ts +84 -83
  133. package/src/types/date-time.ts +43 -42
  134. package/src/types/lazy-gc-map.ts +44 -44
  135. package/src/types/time.ts +29 -29
  136. package/src/types/uuid.ts +15 -15
  137. package/src/utils/bytes.ts +35 -35
  138. package/src/utils/date-format.ts +59 -59
  139. package/src/utils/error.ts +4 -4
  140. package/src/utils/json.ts +41 -41
  141. package/src/utils/num.ts +20 -20
  142. package/src/utils/obj.ts +138 -138
  143. package/src/utils/path.ts +10 -10
  144. package/src/utils/primitive.ts +6 -6
  145. package/src/utils/str.ts +48 -48
  146. package/src/utils/template-strings.ts +29 -29
  147. package/src/utils/transferable.ts +38 -38
  148. package/src/utils/wait.ts +10 -10
  149. package/src/utils/xml.ts +19 -19
  150. package/src/utils/zip.ts +25 -25
  151. package/README.md +0 -160
  152. package/docs/errors.md +0 -119
  153. package/docs/extensions.md +0 -387
  154. package/docs/features.md +0 -143
  155. package/docs/types.md +0 -287
  156. package/docs/utils.md +0 -757
  157. package/tests/errors/errors.spec.ts +0 -80
  158. package/tests/extensions/array-extension.spec.ts +0 -654
  159. package/tests/extensions/map-extension.spec.ts +0 -117
  160. package/tests/extensions/set-extension.spec.ts +0 -67
  161. package/tests/types/date-only.spec.ts +0 -533
  162. package/tests/types/date-time.spec.ts +0 -246
  163. package/tests/types/lazy-gc-map.spec.ts +0 -606
  164. package/tests/types/time.spec.ts +0 -428
  165. package/tests/types/uuid.spec.ts +0 -74
  166. package/tests/utils/bytes-utils.spec.ts +0 -197
  167. package/tests/utils/date-format.spec.ts +0 -350
  168. package/tests/utils/debounce-queue.spec.ts +0 -226
  169. package/tests/utils/json.spec.ts +0 -400
  170. package/tests/utils/number.spec.ts +0 -136
  171. package/tests/utils/object.spec.ts +0 -810
  172. package/tests/utils/path.spec.ts +0 -70
  173. package/tests/utils/primitive.spec.ts +0 -43
  174. package/tests/utils/sd-event-emitter.spec.ts +0 -189
  175. package/tests/utils/serial-queue.spec.ts +0 -305
  176. package/tests/utils/string.spec.ts +0 -265
  177. package/tests/utils/template-strings.spec.ts +0 -48
  178. package/tests/utils/transferable.spec.ts +0 -639
  179. package/tests/utils/wait.spec.ts +0 -123
  180. package/tests/utils/xml.spec.ts +0 -146
  181. package/tests/utils/zip.spec.ts +0 -221
@@ -1,23 +1,23 @@
1
1
  /**
2
- * Asynchronous debounce queue
2
+ * 비동기 디바운스
3
3
  *
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.
4
+ * 짧은 시간 내에 여러 호출되면 마지막 요청만 실행하고
5
+ * 이전 요청은 무시한다. 입력 필드 자동완성,
6
+ * 연속적인 상태 변경 일괄 처리 등에 유용함.
7
7
  *
8
8
  * @remarks
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.
9
+ * 실행 중에 추가된 요청은 디바운스 지연 없이 현재 실행이
10
+ * 완료된 직후 즉시 처리됨. 이는 실행 완료 전에 도착한
11
+ * 요청을 놓치지 않기 위한 의도적인 설계임.
12
12
  *
13
13
  * @example
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
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
- * // Error handling
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 Debounce delay time (milliseconds). If omitted, executes immediately (next event loop)
36
+ * @param _delay 디바운스 지연 시간 (밀리초). 생략 즉시 실행 (다음 이벤트 루프)
37
37
  */
38
38
  constructor(_delay?: number | undefined);
39
39
  /**
40
- * Clean up pending tasks and timers
40
+ * 대기 중인 작업과 타이머 정리
41
41
  */
42
42
  dispose(): void;
43
43
  /**
44
- * Supports using statement
44
+ * using 문 지원
45
45
  */
46
46
  [Symbol.dispose](): void;
47
47
  /**
48
- * Add a function to the queue
49
- * If there was a previously added function, it will be replaced
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
- * @param _delay Debounce delay time (milliseconds). If omitted, executes immediately (next event loop)
7
- */
8
- constructor(_delay) {
9
- super();
10
- this._delay = _delay;
11
- }
12
- static _logger = consola.withTag("DebounceQueue");
13
- _pendingFn;
14
- _isRunning = false;
15
- _isDisposed = false;
16
- _timer;
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
- this._pendingFn = void 0;
27
- super.dispose();
28
- }
29
- /**
30
- * Supports using statement
31
- */
32
- [Symbol.dispose]() {
33
- this.dispose();
34
- }
35
- /**
36
- * Add a function to the queue
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
- if (!this._isRunning) {
47
- this._timer = setTimeout(() => {
48
- void this._processLast();
49
- }, this._delay);
52
+ /**
53
+ * using 지원
54
+ */
55
+ [Symbol.dispose]() {
56
+ this.dispose();
50
57
  }
51
- }
52
- async _processLast() {
53
- if (this._isDisposed || this._isRunning || !this._pendingFn) return;
54
- this._isRunning = true;
55
- this._timer = void 0;
56
- try {
57
- while (this._pendingFn) {
58
- const currentFn = this._pendingFn;
59
- this._pendingFn = void 0;
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
- await currentFn();
62
- } catch (err) {
63
- const error = err instanceof Error ? err : new Error(String(err));
64
- const sdError = new SdError(error, "Error occurred while executing task");
65
- if (this.listenerCount("error") > 0) {
66
- this.emit("error", sdError);
67
- } else {
68
- DebounceQueue._logger.error(sdError);
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
- export {
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 wrapper - provides EventEmitter-like API
2
+ * EventTarget 래퍼 - EventEmitter 유사한 API 제공
3
3
  *
4
- * A type-safe event emitter that can be used in both browsers and Node.js.
5
- * Internally implemented using EventTarget.
4
+ * 브라우저와 Node.js 모두에서 사용 가능한 타입 안전한 이벤트 이미터.
5
+ * 내부적으로 EventTarget을 사용하여 구현됨.
6
6
  *
7
- * @typeParam TEvents Event type map. Keys are event names, values are event data types
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 type is called without arguments
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
- * Register an event listener
29
+ * 이벤트 리스너 등록
30
30
  *
31
- * @param type Event type
32
- * @param listener Event handler
33
- * @note Duplicate registration of the same listener to the same event is ignored
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
- * Remove an event listener
37
+ * 이벤트 리스너 제거
38
38
  *
39
- * @param type Event type
40
- * @param listener Event handler to remove
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
- * Emit an event
44
+ * 이벤트 발행
45
45
  *
46
- * @param type Event type
47
- * @param args Event data (omitted if void type)
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
- * Return the number of listeners for a specific event
51
+ * 특정 이벤트의 리스너 반환
52
52
  *
53
- * @param type Event type
54
- * @returns Number of registered listeners
53
+ * @param type 이벤트 타입
54
+ * @returns 등록된 리스너
55
55
  */
56
56
  listenerCount<TEventName extends keyof TEvents & string>(type: TEventName): number;
57
57
  /**
58
- * Remove all event listeners
58
+ * 모든 이벤트 리스너 제거
59
59
  */
60
60
  dispose(): void;
61
61
  /**
62
- * Supports using statement
62
+ * using 문 지원
63
63
  */
64
64
  [Symbol.dispose](): void;
65
65
  }
@@ -1,82 +1,105 @@
1
- class EventEmitter {
2
- _target = new EventTarget();
3
- // Manage listener maps by event type (same listener can be registered to different events)
4
- // Use Function type for polymorphic listener management
5
- _listenerMap = /* @__PURE__ */ new Map();
6
- /**
7
- * Register an event listener
8
- *
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
- */
13
- on(type, listener) {
14
- let typeMap = this._listenerMap.get(type);
15
- if (!typeMap) {
16
- typeMap = /* @__PURE__ */ new Map();
17
- this._listenerMap.set(type, typeMap);
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
- if (typeMap.has(listener)) return;
20
- const wrappedListener = (e) => listener(e.detail);
21
- typeMap.set(listener, wrappedListener);
22
- this._target.addEventListener(type, wrappedListener);
23
- }
24
- /**
25
- * Remove an event listener
26
- *
27
- * @param type Event type
28
- * @param listener Event handler to remove
29
- */
30
- off(type, listener) {
31
- const typeMap = this._listenerMap.get(type);
32
- if (!typeMap) return;
33
- const wrappedListener = typeMap.get(listener);
34
- if (wrappedListener) {
35
- this._target.removeEventListener(type, wrappedListener);
36
- typeMap.delete(listener);
37
- if (typeMap.size === 0) {
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
- * Emit an event
44
- *
45
- * @param type Event type
46
- * @param args Event data (omitted if void type)
47
- */
48
- emit(type, ...args) {
49
- this._target.dispatchEvent(new CustomEvent(type, { detail: args[0] }));
50
- }
51
- /**
52
- * Return the number of listeners for a specific event
53
- *
54
- * @param type Event type
55
- * @returns Number of registered listeners
56
- */
57
- listenerCount(type) {
58
- var _a;
59
- return ((_a = this._listenerMap.get(type)) == null ? void 0 : _a.size) ?? 0;
60
- }
61
- /**
62
- * Remove all event listeners
63
- */
64
- dispose() {
65
- for (const [type, typeMap] of this._listenerMap) {
66
- for (const wrappedListener of typeMap.values()) {
67
- this._target.removeEventListener(type, wrappedListener);
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
- export {
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
- * Asynchronous serial queue
2
+ * 비동기 직렬
3
3
  *
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.
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"); }); // executed after 1 completes
12
- * queue.run(async () => { await fetch("/api/3"); }); // executed after 2 completes
11
+ * queue.run(async () => { await fetch("/api/2"); }); // 1 완료 실행
12
+ * queue.run(async () => { await fetch("/api/3"); }); // 2 완료 실행
13
13
  *
14
14
  * @example
15
- * // Error handling
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 Gap between each task (ms)
29
+ * @param _gap 작업 사이의 간격 (ms)
30
30
  */
31
31
  constructor(_gap?: number);
32
32
  /**
33
- * Clear pending queue (currently executing task will complete)
33
+ * 대기 중인 비우기 (현재 실행 중인 작업은 완료됨)
34
34
  */
35
35
  dispose(): void;
36
36
  /**
37
- * Supports using statement
37
+ * using 문 지원
38
38
  */
39
39
  [Symbol.dispose](): void;
40
40
  /**
41
- * Add a function to the queue and execute it
41
+ * 큐에 함수를 추가하고 실행
42
42
  */
43
43
  run(fn: () => void | Promise<void>): void;
44
44
  private _process;