@develia/commons 0.4.16 → 0.4.19
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/cjs/array.js +22 -2
- package/dist/cjs/array.js.map +1 -1
- package/dist/cjs/async-pool-executor.js +26 -11
- package/dist/cjs/async-pool-executor.js.map +1 -1
- package/dist/cjs/browser/form-utilities.js +35 -34
- package/dist/cjs/browser/form-utilities.js.map +1 -1
- package/dist/cjs/browser/geo-location.js +1 -1
- package/dist/cjs/browser/geo-location.js.map +1 -1
- package/dist/cjs/browser/index.js +0 -0
- package/dist/cjs/browser/index.js.map +0 -0
- package/dist/cjs/browser/native-bridge.js +3 -1
- package/dist/cjs/browser/native-bridge.js.map +1 -1
- package/dist/cjs/cancellable-promise.js +34 -13
- package/dist/cjs/cancellable-promise.js.map +1 -1
- package/dist/cjs/clean-url-search-params.js +26 -3
- package/dist/cjs/clean-url-search-params.js.map +1 -1
- package/dist/cjs/collections/cache-dictionary.js +3 -3
- package/dist/cjs/collections/cache-dictionary.js.map +1 -1
- package/dist/cjs/collections/default-map.js +0 -0
- package/dist/cjs/collections/default-map.js.map +1 -1
- package/dist/cjs/collections/default-weak-map.js +0 -0
- package/dist/cjs/collections/default-weak-map.js.map +1 -1
- package/dist/cjs/collections/from.js +3 -3
- package/dist/cjs/collections/from.js.map +1 -1
- package/dist/cjs/collections/index.js +0 -0
- package/dist/cjs/collections/index.js.map +1 -1
- package/dist/cjs/draft.js +46 -11
- package/dist/cjs/draft.js.map +1 -1
- package/dist/cjs/event-bus.js +1 -1
- package/dist/cjs/event-bus.js.map +1 -1
- package/dist/cjs/functions.js +348 -0
- package/dist/cjs/functions.js.map +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/key-value-pair.js +0 -0
- package/dist/cjs/key-value-pair.js.map +1 -1
- package/dist/cjs/lazy.js +0 -0
- package/dist/cjs/lazy.js.map +1 -1
- package/dist/cjs/math.js +3 -0
- package/dist/cjs/math.js.map +1 -1
- package/dist/cjs/order.js +0 -0
- package/dist/cjs/order.js.map +1 -1
- package/dist/cjs/parse.js +10 -1
- package/dist/cjs/parse.js.map +1 -1
- package/dist/cjs/patch.js +0 -0
- package/dist/cjs/patch.js.map +1 -1
- package/dist/cjs/range.js +0 -0
- package/dist/cjs/range.js.map +0 -0
- package/dist/cjs/stopwatch.js +0 -0
- package/dist/cjs/stopwatch.js.map +1 -1
- package/dist/cjs/string.js +8 -5
- package/dist/cjs/string.js.map +1 -1
- package/dist/cjs/timer.js +1 -1
- package/dist/cjs/timer.js.map +1 -1
- package/dist/cjs/timespan.js +21 -8
- package/dist/cjs/timespan.js.map +1 -1
- package/dist/cjs/type-code.js +0 -0
- package/dist/cjs/type-code.js.map +1 -1
- package/dist/cjs/type.js +20 -19
- package/dist/cjs/type.js.map +1 -1
- package/dist/cjs/types.js +0 -0
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utilities.js +175 -39
- package/dist/cjs/utilities.js.map +1 -1
- package/dist/esm/array.js +21 -2
- package/dist/esm/array.js.map +1 -1
- package/dist/esm/async-pool-executor.js +26 -11
- package/dist/esm/async-pool-executor.js.map +1 -1
- package/dist/esm/browser/form-utilities.js +35 -34
- package/dist/esm/browser/form-utilities.js.map +1 -1
- package/dist/esm/browser/geo-location.js +1 -1
- package/dist/esm/browser/geo-location.js.map +1 -1
- package/dist/esm/browser/index.js +0 -0
- package/dist/esm/browser/index.js.map +0 -0
- package/dist/esm/browser/native-bridge.js +3 -1
- package/dist/esm/browser/native-bridge.js.map +1 -1
- package/dist/esm/cancellable-promise.js +34 -13
- package/dist/esm/cancellable-promise.js.map +1 -1
- package/dist/esm/clean-url-search-params.js +26 -3
- package/dist/esm/clean-url-search-params.js.map +1 -1
- package/dist/esm/collections/cache-dictionary.js +3 -3
- package/dist/esm/collections/cache-dictionary.js.map +1 -1
- package/dist/esm/collections/default-map.js +0 -0
- package/dist/esm/collections/default-map.js.map +1 -1
- package/dist/esm/collections/default-weak-map.js +0 -0
- package/dist/esm/collections/default-weak-map.js.map +1 -1
- package/dist/esm/collections/from.js +3 -3
- package/dist/esm/collections/from.js.map +1 -1
- package/dist/esm/collections/index.js +0 -0
- package/dist/esm/collections/index.js.map +1 -1
- package/dist/esm/draft.js +46 -11
- package/dist/esm/draft.js.map +1 -1
- package/dist/esm/event-bus.js +1 -1
- package/dist/esm/event-bus.js.map +1 -1
- package/dist/esm/functions.js +336 -0
- package/dist/esm/functions.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/key-value-pair.js +0 -0
- package/dist/esm/key-value-pair.js.map +1 -1
- package/dist/esm/lazy.js +0 -0
- package/dist/esm/lazy.js.map +1 -1
- package/dist/esm/math.js +3 -0
- package/dist/esm/math.js.map +1 -1
- package/dist/esm/order.js +0 -0
- package/dist/esm/order.js.map +1 -1
- package/dist/esm/parse.js +10 -1
- package/dist/esm/parse.js.map +1 -1
- package/dist/esm/patch.js +0 -0
- package/dist/esm/patch.js.map +1 -1
- package/dist/esm/range.js +0 -0
- package/dist/esm/range.js.map +0 -0
- package/dist/esm/stopwatch.js +0 -0
- package/dist/esm/stopwatch.js.map +1 -1
- package/dist/esm/string.js +8 -5
- package/dist/esm/string.js.map +1 -1
- package/dist/esm/timer.js +1 -1
- package/dist/esm/timer.js.map +1 -1
- package/dist/esm/timespan.js +21 -8
- package/dist/esm/timespan.js.map +1 -1
- package/dist/esm/type-code.js +0 -0
- package/dist/esm/type-code.js.map +1 -1
- package/dist/esm/type.js +20 -19
- package/dist/esm/type.js.map +1 -1
- package/dist/esm/types.js +0 -0
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utilities.js +174 -39
- package/dist/esm/utilities.js.map +1 -1
- package/dist/types/array.d.ts +20 -0
- package/dist/types/array.d.ts.map +1 -1
- package/dist/types/async-pool-executor.d.ts +2 -2
- package/dist/types/async-pool-executor.d.ts.map +1 -1
- package/dist/types/browser/form-utilities.d.ts +0 -0
- package/dist/types/browser/form-utilities.d.ts.map +1 -1
- package/dist/types/browser/geo-location.d.ts +0 -0
- package/dist/types/browser/geo-location.d.ts.map +0 -0
- package/dist/types/browser/index.d.ts +0 -0
- package/dist/types/browser/index.d.ts.map +0 -0
- package/dist/types/browser/native-bridge.d.ts +0 -0
- package/dist/types/browser/native-bridge.d.ts.map +1 -1
- package/dist/types/cancellable-promise.d.ts +0 -0
- package/dist/types/cancellable-promise.d.ts.map +1 -1
- package/dist/types/clean-url-search-params.d.ts +3 -1
- package/dist/types/clean-url-search-params.d.ts.map +1 -1
- package/dist/types/collections/cache-dictionary.d.ts +0 -0
- package/dist/types/collections/cache-dictionary.d.ts.map +0 -0
- package/dist/types/collections/default-map.d.ts +0 -0
- package/dist/types/collections/default-map.d.ts.map +0 -0
- package/dist/types/collections/default-weak-map.d.ts +0 -0
- package/dist/types/collections/default-weak-map.d.ts.map +0 -0
- package/dist/types/collections/from.d.ts +1 -1
- package/dist/types/collections/from.d.ts.map +0 -0
- package/dist/types/collections/index.d.ts +0 -0
- package/dist/types/collections/index.d.ts.map +0 -0
- package/dist/types/draft.d.ts +0 -0
- package/dist/types/draft.d.ts.map +1 -1
- package/dist/types/event-bus.d.ts +0 -0
- package/dist/types/event-bus.d.ts.map +0 -0
- package/dist/types/functions.d.ts +231 -0
- package/dist/types/functions.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/key-value-pair.d.ts +0 -0
- package/dist/types/key-value-pair.d.ts.map +0 -0
- package/dist/types/lazy.d.ts +0 -0
- package/dist/types/lazy.d.ts.map +0 -0
- package/dist/types/math.d.ts +0 -0
- package/dist/types/math.d.ts.map +1 -1
- package/dist/types/order.d.ts +0 -0
- package/dist/types/order.d.ts.map +0 -0
- package/dist/types/parse.d.ts +0 -0
- package/dist/types/parse.d.ts.map +1 -1
- package/dist/types/patch.d.ts +0 -0
- package/dist/types/patch.d.ts.map +0 -0
- package/dist/types/range.d.ts +0 -0
- package/dist/types/range.d.ts.map +0 -0
- package/dist/types/stopwatch.d.ts +0 -0
- package/dist/types/stopwatch.d.ts.map +0 -0
- package/dist/types/string.d.ts +0 -0
- package/dist/types/string.d.ts.map +1 -1
- package/dist/types/timer.d.ts +1 -1
- package/dist/types/timer.d.ts.map +0 -0
- package/dist/types/timespan.d.ts +0 -0
- package/dist/types/timespan.d.ts.map +1 -1
- package/dist/types/type-code.d.ts +0 -0
- package/dist/types/type-code.d.ts.map +0 -0
- package/dist/types/type.d.ts +2 -0
- package/dist/types/type.d.ts.map +1 -1
- package/dist/types/types.d.ts +1 -1
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utilities.d.ts +21 -3
- package/dist/types/utilities.d.ts.map +1 -1
- package/dist/web/array.js +21 -2
- package/dist/web/array.js.map +1 -1
- package/dist/web/async-pool-executor.js +26 -11
- package/dist/web/async-pool-executor.js.map +1 -1
- package/dist/web/browser/form-utilities.js +35 -34
- package/dist/web/browser/form-utilities.js.map +1 -1
- package/dist/web/browser/geo-location.js +1 -1
- package/dist/web/browser/geo-location.js.map +1 -1
- package/dist/web/browser/index.js +0 -0
- package/dist/web/browser/index.js.map +0 -0
- package/dist/web/browser/native-bridge.js +3 -1
- package/dist/web/browser/native-bridge.js.map +1 -1
- package/dist/web/cancellable-promise.js +34 -13
- package/dist/web/cancellable-promise.js.map +1 -1
- package/dist/web/clean-url-search-params.js +26 -3
- package/dist/web/clean-url-search-params.js.map +1 -1
- package/dist/web/collections/cache-dictionary.js +3 -3
- package/dist/web/collections/cache-dictionary.js.map +1 -1
- package/dist/web/collections/default-map.js +0 -0
- package/dist/web/collections/default-map.js.map +1 -1
- package/dist/web/collections/default-weak-map.js +0 -0
- package/dist/web/collections/default-weak-map.js.map +1 -1
- package/dist/web/collections/from.js +3 -3
- package/dist/web/collections/from.js.map +1 -1
- package/dist/web/collections/index.js +0 -0
- package/dist/web/collections/index.js.map +1 -1
- package/dist/web/draft.js +46 -11
- package/dist/web/draft.js.map +1 -1
- package/dist/web/event-bus.js +1 -1
- package/dist/web/event-bus.js.map +1 -1
- package/dist/web/functions.js +336 -0
- package/dist/web/functions.js.map +1 -0
- package/dist/web/index.js +1 -0
- package/dist/web/index.js.map +1 -1
- package/dist/web/key-value-pair.js +0 -0
- package/dist/web/key-value-pair.js.map +1 -1
- package/dist/web/lazy.js +0 -0
- package/dist/web/lazy.js.map +1 -1
- package/dist/web/math.js +3 -0
- package/dist/web/math.js.map +1 -1
- package/dist/web/order.js +0 -0
- package/dist/web/order.js.map +1 -1
- package/dist/web/parse.js +10 -1
- package/dist/web/parse.js.map +1 -1
- package/dist/web/patch.js +0 -0
- package/dist/web/patch.js.map +1 -1
- package/dist/web/range.js +0 -0
- package/dist/web/range.js.map +0 -0
- package/dist/web/stopwatch.js +0 -0
- package/dist/web/stopwatch.js.map +1 -1
- package/dist/web/string.js +8 -5
- package/dist/web/string.js.map +1 -1
- package/dist/web/timer.js +1 -1
- package/dist/web/timer.js.map +1 -1
- package/dist/web/timespan.js +21 -8
- package/dist/web/timespan.js.map +1 -1
- package/dist/web/type-code.js +0 -0
- package/dist/web/type-code.js.map +1 -1
- package/dist/web/type.js +20 -19
- package/dist/web/type.js.map +1 -1
- package/dist/web/types.js +0 -0
- package/dist/web/types.js.map +1 -1
- package/dist/web/utilities.js +174 -39
- package/dist/web/utilities.js.map +1 -1
- package/package.json +84 -60
- package/src/array.ts +116 -84
- package/src/async-pool-executor.ts +107 -85
- package/src/browser/form-utilities.ts +32 -31
- package/src/browser/geo-location.ts +113 -113
- package/src/browser/native-bridge.ts +118 -116
- package/src/cancellable-promise.ts +102 -76
- package/src/clean-url-search-params.ts +36 -11
- package/src/collections/cache-dictionary.ts +115 -115
- package/src/collections/default-map.ts +48 -48
- package/src/collections/default-weak-map.ts +51 -51
- package/src/collections/from.ts +859 -859
- package/src/collections/index.ts +3 -3
- package/src/draft.ts +55 -16
- package/src/event-bus.ts +83 -83
- package/src/functions.ts +496 -0
- package/src/index.ts +1 -0
- package/src/key-value-pair.ts +24 -24
- package/src/lazy.ts +32 -32
- package/src/math.ts +33 -30
- package/src/order.ts +5 -5
- package/src/parse.ts +251 -240
- package/src/patch.ts +79 -79
- package/src/stopwatch.ts +43 -43
- package/src/string.ts +8 -5
- package/src/timer.ts +67 -67
- package/src/timespan.ts +412 -398
- package/src/type-code.ts +15 -15
- package/src/type.ts +372 -371
- package/src/types.ts +34 -30
- package/src/utilities.ts +653 -480
package/src/collections/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {default as DefaultWeakMap} from './default-weak-map.js';
|
|
2
|
-
export {default as DefaultMap} from './default-map.js';
|
|
3
|
-
export {default as CacheDictionary} from './cache-dictionary.js';
|
|
1
|
+
export {default as DefaultWeakMap} from './default-weak-map.js';
|
|
2
|
+
export {default as DefaultMap} from './default-map.js';
|
|
3
|
+
export {default as CacheDictionary} from './cache-dictionary.js';
|
|
4
4
|
export {default as from} from './from.js';
|
package/src/draft.ts
CHANGED
|
@@ -69,6 +69,53 @@ type ParentLink = {
|
|
|
69
69
|
keyInParent: PropertyKey;
|
|
70
70
|
};
|
|
71
71
|
|
|
72
|
+
const DRAFT_MATERIALIZE = Symbol("draft.materialize");
|
|
73
|
+
|
|
74
|
+
type InternalDraft = Draft<any> & {
|
|
75
|
+
[DRAFT_MATERIALIZE]: () => any;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
function isDraftValue(value: any): value is InternalDraft {
|
|
79
|
+
return value !== null &&
|
|
80
|
+
typeof value === "object" &&
|
|
81
|
+
typeof value[DRAFT_MATERIALIZE] === "function";
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function materializeDraftValue(value: any): any {
|
|
85
|
+
if (isDraftValue(value)) return value[DRAFT_MATERIALIZE]();
|
|
86
|
+
if (value === null || typeof value !== "object") return value;
|
|
87
|
+
|
|
88
|
+
const objectValue = value as any;
|
|
89
|
+
if (objectValue instanceof Date) return new Date(objectValue);
|
|
90
|
+
if (objectValue instanceof RegExp) return new RegExp(objectValue);
|
|
91
|
+
|
|
92
|
+
if (objectValue instanceof Map) {
|
|
93
|
+
const copy = new Map();
|
|
94
|
+
for (const [k, v] of objectValue) {
|
|
95
|
+
copy.set(materializeDraftValue(k), materializeDraftValue(v));
|
|
96
|
+
}
|
|
97
|
+
return copy;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (objectValue instanceof Set) {
|
|
101
|
+
const copy = new Set();
|
|
102
|
+
for (const v of objectValue) {
|
|
103
|
+
copy.add(materializeDraftValue(v));
|
|
104
|
+
}
|
|
105
|
+
return copy;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const copy: any = Array.isArray(objectValue)
|
|
109
|
+
? []
|
|
110
|
+
: Object.create(Object.getPrototypeOf(objectValue));
|
|
111
|
+
|
|
112
|
+
for (const key of Reflect.ownKeys(objectValue)) {
|
|
113
|
+
copy[key] = materializeDraftValue(objectValue[key]);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return copy;
|
|
117
|
+
}
|
|
118
|
+
|
|
72
119
|
// ─────────────────────────────────────────────
|
|
73
120
|
// deepDraft (internal)
|
|
74
121
|
// ─────────────────────────────────────────────
|
|
@@ -143,12 +190,9 @@ export default function draft<T extends object>(
|
|
|
143
190
|
*/
|
|
144
191
|
const applyCommit = (key: PropertyKey): void => {
|
|
145
192
|
const val = copy[key];
|
|
146
|
-
if (
|
|
147
|
-
val
|
|
148
|
-
|
|
149
|
-
"commit" in val
|
|
150
|
-
) {
|
|
151
|
-
(val as Draft<any>).commit();
|
|
193
|
+
if (isDraftValue(val)) {
|
|
194
|
+
val.commit();
|
|
195
|
+
(original as any)[key] = materializeDraftValue(val);
|
|
152
196
|
return;
|
|
153
197
|
}
|
|
154
198
|
if (key in copy) {
|
|
@@ -162,17 +206,11 @@ export default function draft<T extends object>(
|
|
|
162
206
|
* otherwise restore the value from `original`.
|
|
163
207
|
*/
|
|
164
208
|
const applyRollback = (key: PropertyKey): void => {
|
|
165
|
-
const val = copy[key];
|
|
166
|
-
if (
|
|
167
|
-
val !== null &&
|
|
168
|
-
typeof val === "object" &&
|
|
169
|
-
"rollback" in val
|
|
170
|
-
) {
|
|
171
|
-
(val as Draft<any>).rollback();
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
209
|
if (key in original) {
|
|
175
|
-
copy[key] = (original as any)[key]
|
|
210
|
+
copy[key] = deepDraft((original as any)[key], {
|
|
211
|
+
parent: methods,
|
|
212
|
+
keyInParent: key,
|
|
213
|
+
});
|
|
176
214
|
} else {
|
|
177
215
|
delete copy[key];
|
|
178
216
|
}
|
|
@@ -239,6 +277,7 @@ export default function draft<T extends object>(
|
|
|
239
277
|
|
|
240
278
|
return new Proxy(copy, {
|
|
241
279
|
get(target, prop, receiver) {
|
|
280
|
+
if (prop === DRAFT_MATERIALIZE) return () => materializeDraftValue(target);
|
|
242
281
|
if (isMethodKey(prop)) return (methods as any)[prop];
|
|
243
282
|
return Reflect.get(target, prop, receiver);
|
|
244
283
|
},
|
package/src/event-bus.ts
CHANGED
|
@@ -1,84 +1,84 @@
|
|
|
1
|
-
// event.ts
|
|
2
|
-
|
|
3
|
-
export abstract class Event {
|
|
4
|
-
readonly timestamp: Date;
|
|
5
|
-
|
|
6
|
-
protected constructor() {
|
|
7
|
-
this.timestamp = new Date();
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
toString(): string {
|
|
11
|
-
return `${this.constructor.name}(${this.timestamp.toISOString()})`;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
type EventClass<T extends Event> = new (...args: any[]) => T;
|
|
16
|
-
type Handler<T extends Event> = (event: T) => void;
|
|
17
|
-
|
|
18
|
-
interface HandlerWrapper {
|
|
19
|
-
original: Function;
|
|
20
|
-
wrapped: (event: Event) => void;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export class EventBus {
|
|
24
|
-
private static _instance: EventBus | null = null;
|
|
25
|
-
|
|
26
|
-
static get shared(): EventBus {
|
|
27
|
-
return this._instance ??= new EventBus();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
private _handlers = new Map<Function, HandlerWrapper[]>();
|
|
31
|
-
|
|
32
|
-
on<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {
|
|
33
|
-
if (!this._handlers.has(type)) {
|
|
34
|
-
this._handlers.set(type, []);
|
|
35
|
-
}
|
|
36
|
-
this._handlers.get(type)!.push({
|
|
37
|
-
original: handler,
|
|
38
|
-
wrapped: (event: Event) => handler(event as T),
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
off<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {
|
|
43
|
-
const handlers = this._handlers.get(type);
|
|
44
|
-
if (!handlers) return;
|
|
45
|
-
|
|
46
|
-
let index = handlers.findIndex((h) => h.original === handler);
|
|
47
|
-
if (index !== -1) {
|
|
48
|
-
handlers.splice(index, 1);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
emit<T extends Event>(event: T): void {
|
|
53
|
-
const handlers = this._handlers.get(event.constructor);
|
|
54
|
-
if (!handlers) return;
|
|
55
|
-
|
|
56
|
-
for (const handler of [...handlers]) {
|
|
57
|
-
try {
|
|
58
|
-
handler.wrapped(event);
|
|
59
|
-
} catch (e) {
|
|
60
|
-
console.error(`[EventBus] Error en handler de ${event.constructor.name}:`, e);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
once<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {
|
|
66
|
-
const wrapper: Handler<T> = (event: T) => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
};
|
|
70
|
-
this.on(type, wrapper);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
clear<T extends Event>(type: EventClass<T>): void {
|
|
74
|
-
this._handlers.delete(type);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
clearAll(): void {
|
|
78
|
-
this._handlers.clear();
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
hasListeners<T extends Event>(type: EventClass<T>): boolean {
|
|
82
|
-
return (this._handlers.get(type)?.length ?? 0) > 0;
|
|
83
|
-
}
|
|
1
|
+
// event.ts
|
|
2
|
+
|
|
3
|
+
export abstract class Event {
|
|
4
|
+
readonly timestamp: Date;
|
|
5
|
+
|
|
6
|
+
protected constructor() {
|
|
7
|
+
this.timestamp = new Date();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
toString(): string {
|
|
11
|
+
return `${this.constructor.name}(${this.timestamp.toISOString()})`;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
type EventClass<T extends Event> = new (...args: any[]) => T;
|
|
16
|
+
type Handler<T extends Event> = (event: T) => void;
|
|
17
|
+
|
|
18
|
+
interface HandlerWrapper {
|
|
19
|
+
original: Function;
|
|
20
|
+
wrapped: (event: Event) => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class EventBus {
|
|
24
|
+
private static _instance: EventBus | null = null;
|
|
25
|
+
|
|
26
|
+
static get shared(): EventBus {
|
|
27
|
+
return this._instance ??= new EventBus();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private _handlers = new Map<Function, HandlerWrapper[]>();
|
|
31
|
+
|
|
32
|
+
on<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {
|
|
33
|
+
if (!this._handlers.has(type)) {
|
|
34
|
+
this._handlers.set(type, []);
|
|
35
|
+
}
|
|
36
|
+
this._handlers.get(type)!.push({
|
|
37
|
+
original: handler,
|
|
38
|
+
wrapped: (event: Event) => handler(event as T),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
off<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {
|
|
43
|
+
const handlers = this._handlers.get(type);
|
|
44
|
+
if (!handlers) return;
|
|
45
|
+
|
|
46
|
+
let index = handlers.findIndex((h) => h.original === handler);
|
|
47
|
+
if (index !== -1) {
|
|
48
|
+
handlers.splice(index, 1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
emit<T extends Event>(event: T): void {
|
|
53
|
+
const handlers = this._handlers.get(event.constructor);
|
|
54
|
+
if (!handlers) return;
|
|
55
|
+
|
|
56
|
+
for (const handler of [...handlers]) {
|
|
57
|
+
try {
|
|
58
|
+
handler.wrapped(event);
|
|
59
|
+
} catch (e) {
|
|
60
|
+
console.error(`[EventBus] Error en handler de ${event.constructor.name}:`, e);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
once<T extends Event>(type: EventClass<T>, handler: Handler<T>): void {
|
|
66
|
+
const wrapper: Handler<T> = (event: T) => {
|
|
67
|
+
this.off(type, wrapper);
|
|
68
|
+
handler(event);
|
|
69
|
+
};
|
|
70
|
+
this.on(type, wrapper);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
clear<T extends Event>(type: EventClass<T>): void {
|
|
74
|
+
this._handlers.delete(type);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
clearAll(): void {
|
|
78
|
+
this._handlers.clear();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
hasListeners<T extends Event>(type: EventClass<T>): boolean {
|
|
82
|
+
return (this._handlers.get(type)?.length ?? 0) > 0;
|
|
83
|
+
}
|
|
84
84
|
}
|