@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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/bus.ts +28 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-archimedes/core",
3
- "version": "1.4.1",
3
+ "version": "1.5.0",
4
4
  "type": "module",
5
5
  "keywords": [
6
6
  "pi-package"
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
- const queue = getGlobal<Array<{ event: string; payload: unknown }>>(QUEUE_KEY);
72
- if (queue && queue.length > 0) {
73
- for (const { event, payload } of queue) {
74
- bus.emit(event, payload);
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