@furystack/utils 8.1.10 → 8.2.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/CHANGELOG.md CHANGED
@@ -1,5 +1,68 @@
1
1
  # Changelog
2
2
 
3
+ ## [8.2.1] - 2026-03-06
4
+
5
+ ### 🧪 Tests
6
+
7
+ - Refactored all `Semaphore` tests to use `using()` / `usingAsync()` wrappers for proper disposal, ensuring cleanup even if assertions fail
8
+ - Added `eslint-disable` comment in `EventHub` test for intentional post-disposal behavior verification
9
+
10
+ ## [8.2.0] - 2026-03-03
11
+
12
+ ### ✨ Features
13
+
14
+ ### Error handling in `EventHub` listeners
15
+
16
+ `EventHub.emit()` now catches synchronous throws and asynchronous rejections from listeners. Errors are routed to `onListenerError` subscribers when present, or logged via `console.error` otherwise.
17
+
18
+ A new `ListenerErrorPayload` type is exported for typing the error event:
19
+
20
+ ```typescript
21
+ type MyEvents = {
22
+ dataReceived: { items: string[] }
23
+ onListenerError: ListenerErrorPayload
24
+ }
25
+
26
+ const hub = new EventHub<MyEvents>()
27
+
28
+ hub.subscribe('onListenerError', ({ event, error }) => {
29
+ console.error(`Listener for "${String(event)}" failed:`, error)
30
+ })
31
+ ```
32
+
33
+ ### Configurable error handling in `ObservableValue`
34
+
35
+ `ObservableValueOptions` now accepts an `onError` callback, invoked when an observer callback or filter throws (sync) or rejects (async). All remaining observers are still notified even when one fails. Defaults to `console.error`.
36
+
37
+ ```typescript
38
+ const value = new ObservableValue('initial', {
39
+ onError: ({ error, observer }) => {
40
+ myLogger.error('Observer failed', { error })
41
+ },
42
+ })
43
+ ```
44
+
45
+ ### `Semaphore` for concurrent task limiting
46
+
47
+ New `Semaphore` class limits concurrent async task execution to a configurable number of slots. Extends `EventHub` with `taskStarted`, `taskCompleted`, and `taskFailed` events. Exposes `pendingCount`, `runningCount`, `completedCount`, and `failedCount` as `ObservableValue` counters for reactive state monitoring. Supports `AbortSignal` for cancellation of pending and running tasks.
48
+
49
+ ```typescript
50
+ const semaphore = new Semaphore(3)
51
+
52
+ semaphore.pendingCount.subscribe((count) => console.log('Pending:', count))
53
+ semaphore.subscribe('taskCompleted', () => console.log('A task completed'))
54
+
55
+ const results = await Promise.all(urls.map((url) => semaphore.execute(({ signal }) => fetch(url, { signal }))))
56
+
57
+ semaphore[Symbol.dispose]()
58
+ ```
59
+
60
+ ### 🧪 Tests
61
+
62
+ - Added tests for `EventHub` listener error routing (sync throws, async rejections, `onListenerError` dispatch)
63
+ - Added tests for `ObservableValue` observer error handling (sync throws, async rejections, custom `onError` callback)
64
+ - Added tests for `Semaphore` (concurrent execution, abort signals, disposal, EventHub events, ObservableValue counters)
65
+
3
66
  ## [8.1.10] - 2026-02-11
4
67
 
5
68
  ### 🧪 Tests
@@ -1,8 +1,22 @@
1
1
  type ListenerFunction<EventTypeMap extends object, T extends keyof EventTypeMap> = (arg: EventTypeMap[T]) => void | PromiseLike<void>;
2
+ /**
3
+ * Payload emitted when a listener throws or rejects during {@link EventHub.emit}.
4
+ * Subscribe to the `onListenerError` event to receive these.
5
+ */
6
+ export type ListenerErrorPayload = {
7
+ /** The event name that was being emitted when the error occurred */
8
+ event: string | number | symbol;
9
+ /** The error thrown or rejected by the listener */
10
+ error: unknown;
11
+ };
2
12
  /**
3
13
  * A typed event emitter that provides type-safe event subscription and emission.
4
14
  * Use this to create strongly-typed pub/sub patterns in your application.
5
15
  *
16
+ * Listener errors (sync throws and async rejections) are caught automatically.
17
+ * If `onListenerError` listeners are registered, errors are routed there.
18
+ * Otherwise, they are logged via `console.error`.
19
+ *
6
20
  * @typeParam EventTypeMap - An object type where keys are event names and values are event payload types
7
21
  * @example
8
22
  * ```ts
@@ -10,6 +24,7 @@ type ListenerFunction<EventTypeMap extends object, T extends keyof EventTypeMap>
10
24
  * userLoggedIn: { userId: string }
11
25
  * userLoggedOut: { userId: string }
12
26
  * dataUpdated: { items: string[] }
27
+ * onListenerError: ListenerErrorPayload
13
28
  * }
14
29
  *
15
30
  * const hub = new EventHub<MyEvents>()
@@ -19,6 +34,11 @@ type ListenerFunction<EventTypeMap extends object, T extends keyof EventTypeMap>
19
34
  * console.log('User logged in:', event.userId)
20
35
  * })
21
36
  *
37
+ * // Handle listener errors
38
+ * hub.subscribe('onListenerError', ({ event, error }) => {
39
+ * console.error(`Listener for "${String(event)}" failed:`, error)
40
+ * })
41
+ *
22
42
  * // Emit events
23
43
  * hub.emit('userLoggedIn', { userId: '123' })
24
44
  *
@@ -31,6 +51,7 @@ export declare class EventHub<EventTypeMap extends object> implements Disposable
31
51
  addListener<TEvent extends keyof EventTypeMap>(event: TEvent, listener: ListenerFunction<EventTypeMap, TEvent>): void;
32
52
  removeListener<TEvent extends keyof EventTypeMap>(event: TEvent, listener: ListenerFunction<EventTypeMap, TEvent>): void;
33
53
  subscribe<TEvent extends keyof EventTypeMap>(event: TEvent, listener: ListenerFunction<EventTypeMap, TEvent>): Disposable;
54
+ private handleListenerError;
34
55
  emit<TEvent extends keyof EventTypeMap>(event: TEvent, arg: EventTypeMap[TEvent]): void;
35
56
  [Symbol.dispose](): void;
36
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"event-hub.d.ts","sourceRoot":"","sources":["../src/event-hub.ts"],"names":[],"mappings":"AAAA,KAAK,gBAAgB,CAAC,YAAY,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,YAAY,IAAI,CACjF,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,KACjB,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;AAE7B;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,QAAQ,CAAC,YAAY,SAAS,MAAM,CAAE,YAAW,UAAU;IACtE,OAAO,CAAC,SAAS,CAAyF;IAEnG,WAAW,CAAC,MAAM,SAAS,MAAM,YAAY,EAClD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC;IAQ3C,cAAc,CAAC,MAAM,SAAS,MAAM,YAAY,EACrD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC;IAO3C,SAAS,CAAC,MAAM,SAAS,MAAM,YAAY,EAChD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,GAC/C,UAAU;IAKN,IAAI,CAAC,MAAM,SAAS,MAAM,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC;IAMhF,CAAC,MAAM,CAAC,OAAO,CAAC;CAGxB"}
1
+ {"version":3,"file":"event-hub.d.ts","sourceRoot":"","sources":["../src/event-hub.ts"],"names":[],"mappings":"AAAA,KAAK,gBAAgB,CAAC,YAAY,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,YAAY,IAAI,CACjF,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,KACjB,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;AAE7B;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,oEAAoE;IACpE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IAC/B,mDAAmD;IACnD,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,qBAAa,QAAQ,CAAC,YAAY,SAAS,MAAM,CAAE,YAAW,UAAU;IACtE,OAAO,CAAC,SAAS,CAAyF;IAEnG,WAAW,CAAC,MAAM,SAAS,MAAM,YAAY,EAClD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC;IAQ3C,cAAc,CAAC,MAAM,SAAS,MAAM,YAAY,EACrD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC;IAO3C,SAAS,CAAC,MAAM,SAAS,MAAM,YAAY,EAChD,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,GAC/C,UAAU;IAKb,OAAO,CAAC,mBAAmB;IAwBpB,IAAI,CAAC,MAAM,SAAS,MAAM,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC;IAiBhF,CAAC,MAAM,CAAC,OAAO,CAAC;CAGxB"}
package/esm/event-hub.js CHANGED
@@ -2,6 +2,10 @@
2
2
  * A typed event emitter that provides type-safe event subscription and emission.
3
3
  * Use this to create strongly-typed pub/sub patterns in your application.
4
4
  *
5
+ * Listener errors (sync throws and async rejections) are caught automatically.
6
+ * If `onListenerError` listeners are registered, errors are routed there.
7
+ * Otherwise, they are logged via `console.error`.
8
+ *
5
9
  * @typeParam EventTypeMap - An object type where keys are event names and values are event payload types
6
10
  * @example
7
11
  * ```ts
@@ -9,6 +13,7 @@
9
13
  * userLoggedIn: { userId: string }
10
14
  * userLoggedOut: { userId: string }
11
15
  * dataUpdated: { items: string[] }
16
+ * onListenerError: ListenerErrorPayload
12
17
  * }
13
18
  *
14
19
  * const hub = new EventHub<MyEvents>()
@@ -18,6 +23,11 @@
18
23
  * console.log('User logged in:', event.userId)
19
24
  * })
20
25
  *
26
+ * // Handle listener errors
27
+ * hub.subscribe('onListenerError', ({ event, error }) => {
28
+ * console.error(`Listener for "${String(event)}" failed:`, error)
29
+ * })
30
+ *
21
31
  * // Emit events
22
32
  * hub.emit('userLoggedIn', { userId: '123' })
23
33
  *
@@ -42,9 +52,46 @@ export class EventHub {
42
52
  this.addListener(event, listener);
43
53
  return { [Symbol.dispose]: () => this.removeListener(event, listener) };
44
54
  }
55
+ handleListenerError(event, error) {
56
+ if (event === 'onListenerError') {
57
+ console.error('Error in onListenerError handler', error);
58
+ return;
59
+ }
60
+ const errorListeners = this.listeners.get('onListenerError');
61
+ if (errorListeners?.size) {
62
+ for (const errorListener of errorListeners) {
63
+ try {
64
+ const result = errorListener({ event, error });
65
+ if (result && typeof result.then === 'function') {
66
+ result.then(undefined, (err) => {
67
+ console.error('Error in onListenerError handler', err);
68
+ });
69
+ }
70
+ }
71
+ catch (err) {
72
+ console.error('Error in onListenerError handler', err);
73
+ }
74
+ }
75
+ }
76
+ else {
77
+ console.error('Unhandled EventHub listener error', { event, error });
78
+ }
79
+ }
45
80
  emit(event, arg) {
46
81
  if (this.listeners.has(event)) {
47
- this.listeners.get(event).forEach((listener) => void listener(arg));
82
+ this.listeners.get(event).forEach((listener) => {
83
+ try {
84
+ const result = listener(arg);
85
+ if (result && typeof result.then === 'function') {
86
+ result.then(undefined, (error) => {
87
+ this.handleListenerError(event, error);
88
+ });
89
+ }
90
+ }
91
+ catch (error) {
92
+ this.handleListenerError(event, error);
93
+ }
94
+ });
48
95
  }
49
96
  }
50
97
  [Symbol.dispose]() {
@@ -1 +1 @@
1
- {"version":3,"file":"event-hub.js","sourceRoot":"","sources":["../src/event-hub.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,QAAQ;IACX,SAAS,GAAG,IAAI,GAAG,EAA+E,CAAA;IAEnG,WAAW,CAChB,KAAa,EACb,QAAgD;QAEhD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;QACtC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,QAA8D,CAAC,CAAA;IAChG,CAAC;IAEM,cAAc,CACnB,KAAa,EACb,QAAgD;QAEhD,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC,QAA8D,CAAC,CAAA;QACnG,CAAC;IACH,CAAC;IAEM,SAAS,CACd,KAAa,EACb,QAAgD;QAEhD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QACjC,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAA;IACzE,CAAC;IAEM,IAAI,CAAoC,KAAa,EAAE,GAAyB;QACrF,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QACtE,CAAC;IACH,CAAC;IAEM,CAAC,MAAM,CAAC,OAAO,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC;CACF"}
1
+ {"version":3,"file":"event-hub.js","sourceRoot":"","sources":["../src/event-hub.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { describe, expect, it, vi } from 'vitest';
2
2
  import { EventHub } from './event-hub.js';
3
+ import { sleepAsync } from './sleep-async.js';
3
4
  describe('EventHub', () => {
4
5
  it('Should fail on type errors', () => {
5
6
  const eventHub = new EventHub();
@@ -65,9 +66,122 @@ describe('EventHub', () => {
65
66
  const hub = new EventHub();
66
67
  const listener = vi.fn((_val) => { });
67
68
  hub.addListener('test', listener);
69
+ // We want to test the dispose behavior, so we need to disable the rule
70
+ // eslint-disable-next-line furystack/prefer-using-wrapper
68
71
  hub[Symbol.dispose]();
69
72
  hub.emit('test', 'test');
70
73
  expect(listener).not.toBeCalled();
71
74
  });
75
+ describe('Error resilience', () => {
76
+ it('should catch sync throws from listeners and still notify other listeners', () => {
77
+ const hub = new EventHub();
78
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
79
+ const throwingListener = () => {
80
+ throw new Error('listener error');
81
+ };
82
+ const goodListener = vi.fn();
83
+ hub.addListener('test', throwingListener);
84
+ hub.addListener('test', goodListener);
85
+ hub.emit('test', 42);
86
+ expect(goodListener).toBeCalledWith(42);
87
+ expect(goodListener).toBeCalledTimes(1);
88
+ expect(consoleErrorSpy).toHaveBeenCalled();
89
+ consoleErrorSpy.mockRestore();
90
+ });
91
+ it('should catch async rejections from listeners', async () => {
92
+ const hub = new EventHub();
93
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
94
+ const rejectingListener = async () => {
95
+ throw new Error('async listener error');
96
+ };
97
+ hub.addListener('test', rejectingListener);
98
+ hub.emit('test', 42);
99
+ await sleepAsync(10);
100
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Unhandled EventHub listener error', {
101
+ event: 'test',
102
+ error: expect.any(Error),
103
+ });
104
+ consoleErrorSpy.mockRestore();
105
+ });
106
+ it('should route sync errors to onListenerError listeners when registered', () => {
107
+ const hub = new EventHub();
108
+ const errorHandler = vi.fn();
109
+ hub.addListener('onListenerError', errorHandler);
110
+ hub.addListener('test', () => {
111
+ throw new Error('boom');
112
+ });
113
+ hub.emit('test', 1);
114
+ expect(errorHandler).toBeCalledTimes(1);
115
+ expect(errorHandler).toBeCalledWith({
116
+ event: 'test',
117
+ error: expect.any(Error),
118
+ });
119
+ });
120
+ it('should route async rejections to onListenerError listeners when registered', async () => {
121
+ const hub = new EventHub();
122
+ const errorHandler = vi.fn();
123
+ hub.addListener('onListenerError', errorHandler);
124
+ hub.addListener('test', async () => {
125
+ throw new Error('async boom');
126
+ });
127
+ hub.emit('test', 1);
128
+ await sleepAsync(10);
129
+ expect(errorHandler).toBeCalledTimes(1);
130
+ expect(errorHandler).toBeCalledWith({
131
+ event: 'test',
132
+ error: expect.any(Error),
133
+ });
134
+ });
135
+ it('should fall back to console.error if onListenerError handler returns a rejected promise', async () => {
136
+ const hub = new EventHub();
137
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
138
+ hub.addListener('onListenerError', async () => {
139
+ throw new Error('async error handler fails');
140
+ });
141
+ hub.addListener('test', () => {
142
+ throw new Error('original error');
143
+ });
144
+ hub.emit('test', 1);
145
+ await sleepAsync(10);
146
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error in onListenerError handler', expect.any(Error));
147
+ consoleErrorSpy.mockRestore();
148
+ });
149
+ it('should fall back to console.error if onListenerError handler itself throws', () => {
150
+ const hub = new EventHub();
151
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
152
+ hub.addListener('onListenerError', () => {
153
+ throw new Error('error handler also fails');
154
+ });
155
+ hub.addListener('test', () => {
156
+ throw new Error('original error');
157
+ });
158
+ hub.emit('test', 1);
159
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error in onListenerError handler', expect.any(Error));
160
+ consoleErrorSpy.mockRestore();
161
+ });
162
+ it('should go straight to console.error when onListenerError event itself has a failing listener', () => {
163
+ const hub = new EventHub();
164
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
165
+ hub.addListener('onListenerError', () => {
166
+ throw new Error('meta error');
167
+ });
168
+ hub.emit('onListenerError', { event: 'test', error: new Error('original') });
169
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error in onListenerError handler', expect.any(Error));
170
+ consoleErrorSpy.mockRestore();
171
+ });
172
+ it('should fall back to console.error when no onListenerError listeners are registered', () => {
173
+ const hub = new EventHub();
174
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
175
+ hub.addListener('test', () => {
176
+ throw new Error('no handler');
177
+ });
178
+ hub.emit('test', 1);
179
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Unhandled EventHub listener error', {
180
+ event: 'test',
181
+ error: expect.any(Error),
182
+ });
183
+ consoleErrorSpy.mockRestore();
184
+ });
185
+ });
72
186
  });
73
187
  //# sourceMappingURL=event-hub.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-hub.spec.js","sourceRoot":"","sources":["../src/event-hub.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-hub.spec.js","sourceRoot":"","sources":["../src/event-hub.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAA8D,CAAA;QAC3F,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;QAClD,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;QAClD,oEAAoE;QACpE,QAAQ,CAAC,WAAW,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAA;QAC1D,oEAAoE;QACpE,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAA;QAExC,oEAAoE;QACpE,QAAQ,CAAC,WAAW,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAA;QAC1D,oEAAoE;QACpE,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,UAAU;QACV,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAkC,CAAA;QAC/D,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;QAElD,MAAM;QACN,QAAQ,CAAC,WAAW,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAA;QAC1D,QAAQ,CAAC,cAAc,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAA;QAC7D,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAA;QAEtC,SAAS;QACT,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,UAAU;QACV,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAKzB,CAAA;QACJ,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;QAElD,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;QAElD,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAmB,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;QAE1D,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAmB,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;QAEhE,MAAM;QACN,QAAQ,CAAC,WAAW,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAA;QAC1D,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAA;QAEtC,QAAQ,CAAC,WAAW,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAA;QAC1D,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAA;QAExC,QAAQ,CAAC,WAAW,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAA;QAC5D,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAE9C,QAAQ,CAAC,WAAW,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAA;QAC5D,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;QAEhD,SAAS;QACT,MAAM,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;QACxC,MAAM,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAEzC,MAAM,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;QAC1C,MAAM,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAEzC,MAAM,CAAC,eAAe,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAChD,MAAM,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAE1C,MAAM,CAAC,eAAe,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;QAClD,MAAM,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAkC,CAAA;QAC/D,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;QAElD,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAA;QAC7E,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAA;QAEtC,MAAM,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;QACxC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QAC9B,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAA;QACtC,MAAM,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAoB,CAAA;QAE5C,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;QAE5C,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACjC,uEAAuE;QACvE,0DAA0D;QAC1D,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QACrB,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACxB,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAoB,CAAA;YAC5C,MAAM,eAAe,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAE/E,MAAM,gBAAgB,GAAG,GAAG,EAAE;gBAC5B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;YACnC,CAAC,CAAA;YACD,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;YACzC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;YAErC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;YAEpB,MAAM,CAAC,YAAY,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,CAAA;YACvC,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,CAAC,eAAe,CAAC,CAAC,gBAAgB,EAAE,CAAA;YAE1C,eAAe,CAAC,WAAW,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAoB,CAAA;YAC5C,MAAM,eAAe,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAE/E,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE;gBACnC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;YACzC,CAAC,CAAA;YAED,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;YAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;YAEpB,MAAM,UAAU,CAAC,EAAE,CAAC,CAAA;YAEpB,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,mCAAmC,EAAE;gBAChF,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAU;aAClC,CAAC,CAAA;YAEF,eAAe,CAAC,WAAW,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;YAC/E,MAAM,GAAG,GAAG,IAAI,QAAQ,EAA2D,CAAA;YACnF,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,GAAG,CAAC,WAAW,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAA;YAChD,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC3B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;YACzB,CAAC,CAAC,CAAA;YAEF,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YAEnB,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,CAAC,YAAY,CAAC,CAAC,cAAc,CAAC;gBAClC,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAU;aAClC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,GAAG,GAAG,IAAI,QAAQ,EAA2D,CAAA;YACnF,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,GAAG,CAAC,WAAW,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAA;YAChD,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;gBACjC,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;YAC/B,CAAC,CAAC,CAAA;YAEF,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YACnB,MAAM,UAAU,CAAC,EAAE,CAAC,CAAA;YAEpB,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,CAAC,YAAY,CAAC,CAAC,cAAc,CAAC;gBAClC,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAU;aAClC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;YACvG,MAAM,GAAG,GAAG,IAAI,QAAQ,EAA2D,CAAA;YACnF,MAAM,eAAe,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAE/E,GAAG,CAAC,WAAW,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;gBAC5C,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;YAC9C,CAAC,CAAC,CAAA;YACF,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC3B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;YACnC,CAAC,CAAC,CAAA;YAEF,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YACnB,MAAM,UAAU,CAAC,EAAE,CAAC,CAAA;YAEpB,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,kCAAkC,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;YAEnG,eAAe,CAAC,WAAW,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;YACpF,MAAM,GAAG,GAAG,IAAI,QAAQ,EAA2D,CAAA;YACnF,MAAM,eAAe,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAE/E,GAAG,CAAC,WAAW,CAAC,iBAAiB,EAAE,GAAG,EAAE;gBACtC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;YAC7C,CAAC,CAAC,CAAA;YACF,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC3B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;YACnC,CAAC,CAAC,CAAA;YAEF,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YAEnB,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,kCAAkC,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;YAEnG,eAAe,CAAC,WAAW,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8FAA8F,EAAE,GAAG,EAAE;YACtG,MAAM,GAAG,GAAG,IAAI,QAAQ,EAA6C,CAAA;YACrE,MAAM,eAAe,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAE/E,GAAG,CAAC,WAAW,CAAC,iBAAiB,EAAE,GAAG,EAAE;gBACtC,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;YAC/B,CAAC,CAAC,CAAA;YAEF,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YAE5E,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,kCAAkC,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;YAEnG,eAAe,CAAC,WAAW,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;YAC5F,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAoB,CAAA;YAC5C,MAAM,eAAe,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAE/E,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC3B,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA;YAC/B,CAAC,CAAC,CAAA;YAEF,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YAEnB,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,mCAAmC,EAAE;gBAChF,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAU;aAClC,CAAC,CAAA;YAEF,eAAe,CAAC,WAAW,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/esm/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export * from './is-async-disposable.js';
5
5
  export * from './is-disposable.js';
6
6
  export * from './observable-value.js';
7
7
  export * from './path-helper.js';
8
+ export * from './semaphore.js';
8
9
  export * from './sleep-async.js';
9
10
  export * from './sort-by.js';
10
11
  export * from './tuple.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,qBAAqB,CAAA"}
package/esm/index.js CHANGED
@@ -5,6 +5,7 @@ export * from './is-async-disposable.js';
5
5
  export * from './is-disposable.js';
6
6
  export * from './observable-value.js';
7
7
  export * from './path-helper.js';
8
+ export * from './semaphore.js';
8
9
  export * from './sleep-async.js';
9
10
  export * from './sort-by.js';
10
11
  export * from './tuple.js';
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,qBAAqB,CAAA"}
@@ -18,6 +18,15 @@ export type ObservableValueOptions<T> = {
18
18
  * @returns whether the value should be updated and the observers should be notified
19
19
  */
20
20
  compare: (lastValue: T, nextValue: T) => boolean;
21
+ /**
22
+ * Called when an observer callback or filter throws (sync) or rejects (async).
23
+ * All remaining observers are still notified even when one fails.
24
+ * Defaults to logging the error via `console.error`.
25
+ */
26
+ onError: (options: {
27
+ error: unknown;
28
+ observer: ValueObserver<T>;
29
+ }) => void;
21
30
  };
22
31
  /**
23
32
  * Defines an ObservableValue value object.
@@ -1 +1 @@
1
- {"version":3,"file":"observable-value.d.ts","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,KAAK;;CAIxD;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;AAE1E,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI;IACtC;;;;;OAKG;IACH,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,OAAO,CAAA;CACjD,CAAA;AAID;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAe,CAAC,CAAC,CAAE,YAAW,UAAU;IACnD,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,OAAO,CAAC,WAAW,CAAQ;IAE3B;;OAEG;IACI,CAAC,MAAM,CAAC,OAAO,CAAC;IAMvB,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,YAAY,CAAG;IAEvB;;;;;OAKG;IACI,SAAS,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC;IASpF;;;;OAIG;IACI,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IAI7C;;;OAGG;IACI,QAAQ,IAAI,CAAC;IAOpB;;;OAGG;IACI,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAc3B;;;OAGG;IACI,YAAY,IACa,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAG/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAEnD;;;OAGG;gBACS,YAAY,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;CAO1E"}
1
+ {"version":3,"file":"observable-value.d.ts","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,KAAK;;CAIxD;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;AAE1E,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI;IACtC;;;;;OAKG;IACH,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,OAAO,CAAA;IAChD;;;;OAIG;IACH,OAAO,EAAE,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;KAAE,KAAK,IAAI,CAAA;CAC3E,CAAA;AAID;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAe,CAAC,CAAC,CAAE,YAAW,UAAU;IACnD,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,OAAO,CAAC,WAAW,CAAQ;IAE3B;;OAEG;IACI,CAAC,MAAM,CAAC,OAAO,CAAC;IAMvB,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,YAAY,CAAG;IAEvB;;;;;OAKG;IACI,SAAS,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC;IASpF;;;;OAIG;IACI,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IAI7C;;;OAGG;IACI,QAAQ,IAAI,CAAC;IAOpB;;;OAGG;IACI,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAuB3B;;;OAGG;IACI,YAAY,IACa,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAG/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAEnD;;;OAGG;gBACS,YAAY,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;CAQ1E"}
@@ -87,8 +87,18 @@ export class ObservableValue {
87
87
  if (this.options.compare(this.currentValue, newValue)) {
88
88
  this.currentValue = newValue;
89
89
  this.observers.forEach((observer) => {
90
- if (observer.options?.filter?.(this.currentValue, newValue) !== false) {
91
- observer.callback(newValue);
90
+ try {
91
+ if (observer.options?.filter?.(this.currentValue, newValue) !== false) {
92
+ const result = observer.callback(newValue);
93
+ if (result && typeof result.then === 'function') {
94
+ result.then(undefined, (error) => {
95
+ this.options.onError({ error, observer });
96
+ });
97
+ }
98
+ }
99
+ }
100
+ catch (error) {
101
+ this.options.onError({ error, observer });
92
102
  }
93
103
  });
94
104
  }
@@ -108,6 +118,7 @@ export class ObservableValue {
108
118
  constructor(initialValue, options) {
109
119
  this.options = {
110
120
  compare: defaultComparer,
121
+ onError: ({ error }) => console.error('Error in ObservableValue observer', error),
111
122
  ...options,
112
123
  };
113
124
  this.currentValue = initialValue;
@@ -1 +1 @@
1
- {"version":3,"file":"observable-value.js","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD;;GAEG;AACH,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD;QACE,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACtC,CAAC;CACF;AAiBD,MAAM,eAAe,GAAG,CAAI,CAAI,EAAE,CAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;AAElD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,eAAe;IAC1B,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAEO,WAAW,GAAG,KAAK,CAAA;IAE3B;;OAEG;IACI,CAAC,MAAM,CAAC,OAAO,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,uEAAuE;QACvE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;IAC1B,CAAC;IACO,SAAS,GAA0B,IAAI,GAAG,EAAE,CAAA;IAC5C,YAAY,CAAG;IAEvB;;;;;OAKG;IACI,SAAS,CAAC,QAAgC,EAAE,OAAiC;QAClF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,8BAA8B,EAAE,CAAA;QAC5C,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAI,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC9D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,QAA0B;QAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC;IAED;;;OAGG;IACI,QAAQ;QACb,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,8BAA8B,EAAE,CAAA;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,QAAW;QACzB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,8BAA8B,EAAE,CAAA;QAC5C,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAA;YAC5B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAClC,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;oBACtE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBAC7B,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,YAAY;QACjB,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAoC,CAAA;IAC/D,CAAC;IAEgB,OAAO,CAA2B;IAEnD;;;OAGG;IACH,YAAY,YAAe,EAAE,OAA4C;QACvE,IAAI,CAAC,OAAO,GAAG;YACb,OAAO,EAAE,eAAe;YACxB,GAAG,OAAO;SACX,CAAA;QACD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IAClC,CAAC;CACF"}
1
+ {"version":3,"file":"observable-value.js","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"observable-value.spec.d.ts","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,eAAO,MAAM,eAAe,yCAwM1B,CAAA"}
1
+ {"version":3,"file":"observable-value.spec.d.ts","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,eAAe,yCA6S1B,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { describe, expect, it, vi } from 'vitest';
2
2
  import { ObservableValue } from './observable-value.js';
3
+ import { sleepAsync } from './sleep-async.js';
3
4
  import { using } from './using.js';
4
5
  /**
5
6
  * Observable Value tests
@@ -167,5 +168,77 @@ export const observableTests = describe('Observable', () => {
167
168
  });
168
169
  });
169
170
  });
171
+ describe('Observer error handling', () => {
172
+ it('should catch sync throws from observer callbacks and still notify other observers', () => {
173
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
174
+ using(new ObservableValue(0), (v) => {
175
+ const goodCallback = vi.fn();
176
+ v.subscribe(() => {
177
+ throw new Error('observer error');
178
+ });
179
+ v.subscribe(goodCallback);
180
+ v.setValue(1);
181
+ expect(goodCallback).toBeCalledWith(1);
182
+ expect(goodCallback).toBeCalledTimes(1);
183
+ expect(consoleErrorSpy).toHaveBeenCalled();
184
+ });
185
+ consoleErrorSpy.mockRestore();
186
+ });
187
+ it('should catch async rejections from observer callbacks', async () => {
188
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
189
+ using(new ObservableValue(0), (v) => {
190
+ v.subscribe(async () => {
191
+ throw new Error('async observer error');
192
+ });
193
+ v.setValue(1);
194
+ });
195
+ await sleepAsync(10);
196
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error in ObservableValue observer', expect.any(Error));
197
+ consoleErrorSpy.mockRestore();
198
+ });
199
+ it('should catch errors thrown by filter functions', () => {
200
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
201
+ using(new ObservableValue(0), (v) => {
202
+ const goodCallback = vi.fn();
203
+ v.subscribe(() => {
204
+ /* never reached */
205
+ }, {
206
+ filter: () => {
207
+ throw new Error('filter error');
208
+ },
209
+ });
210
+ v.subscribe(goodCallback);
211
+ v.setValue(1);
212
+ expect(goodCallback).toBeCalledWith(1);
213
+ expect(consoleErrorSpy).toHaveBeenCalled();
214
+ });
215
+ consoleErrorSpy.mockRestore();
216
+ });
217
+ it('should use custom onError callback when provided', () => {
218
+ const onError = vi.fn();
219
+ using(new ObservableValue(0, { onError }), (v) => {
220
+ v.subscribe(() => {
221
+ throw new Error('custom error');
222
+ });
223
+ v.setValue(1);
224
+ expect(onError).toBeCalledTimes(1);
225
+ expect(onError).toBeCalledWith({
226
+ error: expect.any(Error),
227
+ observer: expect.objectContaining({ callback: expect.any(Function) }),
228
+ });
229
+ });
230
+ });
231
+ it('should update the value even when observers throw', () => {
232
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
233
+ using(new ObservableValue(0), (v) => {
234
+ v.subscribe(() => {
235
+ throw new Error('error');
236
+ });
237
+ v.setValue(42);
238
+ expect(v.getValue()).toBe(42);
239
+ });
240
+ consoleErrorSpy.mockRestore();
241
+ });
242
+ });
170
243
  });
171
244
  //# sourceMappingURL=observable-value.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"observable-value.spec.js","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"observable-value.spec.js","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"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"}