@pi-archimedes/core 1.4.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/bus.ts +28 -7
package/package.json
CHANGED
package/src/bus.ts
CHANGED
|
@@ -34,12 +34,18 @@ function createBus(): Bus {
|
|
|
34
34
|
if (subs) {
|
|
35
35
|
for (const fn of subs) {
|
|
36
36
|
try {
|
|
37
|
-
fn(payload)
|
|
37
|
+
Promise.resolve(fn(payload)).catch((err) =>
|
|
38
|
+
console.error(`[archimedes:bus] Async error in listener for "${event}":`, err));
|
|
38
39
|
} catch (err) {
|
|
39
40
|
// Listener errors should not crash other listeners
|
|
40
41
|
console.error(`[archimedes:bus] Error in listener for "${event}":`, err);
|
|
41
42
|
}
|
|
42
43
|
}
|
|
44
|
+
} else {
|
|
45
|
+
// Queue event for future subscribers
|
|
46
|
+
const queue = getGlobal<Array<{ event: string; payload: unknown }>>(QUEUE_KEY) ?? [];
|
|
47
|
+
queue.push({ event, payload });
|
|
48
|
+
setGlobal(QUEUE_KEY, queue);
|
|
43
49
|
}
|
|
44
50
|
},
|
|
45
51
|
on(event: string, listener: (payload: unknown) => void): () => void {
|
|
@@ -48,6 +54,22 @@ function createBus(): Bus {
|
|
|
48
54
|
}
|
|
49
55
|
const subs = listeners.get(event)!;
|
|
50
56
|
subs.push(listener);
|
|
57
|
+
|
|
58
|
+
// Drain any queued events for this specific event
|
|
59
|
+
const queue = getGlobal<Array<{ event: string; payload: unknown }>>(QUEUE_KEY);
|
|
60
|
+
if (queue) {
|
|
61
|
+
for (const { event: queuedEvent, payload } of queue) {
|
|
62
|
+
if (queuedEvent === event) {
|
|
63
|
+
try {
|
|
64
|
+
Promise.resolve(listener(payload)).catch((err) =>
|
|
65
|
+
console.error(`[archimedes:bus] Async error in listener for "${event}":`, err));
|
|
66
|
+
} catch (err) {
|
|
67
|
+
console.error(`[archimedes:bus] Error in listener for "${event}":`, err);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
51
73
|
return () => {
|
|
52
74
|
const idx = subs.indexOf(listener);
|
|
53
75
|
if (idx !== -1) subs.splice(idx, 1);
|
|
@@ -68,12 +90,11 @@ export function getBus(): Bus {
|
|
|
68
90
|
export function initBus(): void {
|
|
69
91
|
const bus = getBus();
|
|
70
92
|
// Flush queued events (if any were emitted before init)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
setGlobal(QUEUE_KEY, []);
|
|
93
|
+
// Snapshot and clear before iterating to prevent infinite loops from re-queueing
|
|
94
|
+
const queue = getGlobal<Array<{ event: string; payload: unknown }>>(QUEUE_KEY) ?? [];
|
|
95
|
+
setGlobal(QUEUE_KEY, []);
|
|
96
|
+
for (const { event, payload } of queue) {
|
|
97
|
+
bus.emit(event, payload);
|
|
77
98
|
}
|
|
78
99
|
}
|
|
79
100
|
|