@furystack/utils 8.1.9 → 8.2.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.
@@ -1,50 +1,57 @@
1
1
  import { describe, expect, it, vi } from 'vitest';
2
2
  import { ObservableValue } from './observable-value.js';
3
+ import { sleepAsync } from './sleep-async.js';
4
+ import { using } from './using.js';
3
5
  /**
4
6
  * Observable Value tests
5
7
  */
6
8
  export const observableTests = describe('Observable', () => {
7
9
  it('should be constructed with an undefined initial value', () => {
8
- const v = new ObservableValue(undefined);
9
- expect(v).toBeInstanceOf(ObservableValue);
10
- expect(v.getValue()).toBe(undefined);
10
+ using(new ObservableValue(undefined), (v) => {
11
+ expect(v).toBeInstanceOf(ObservableValue);
12
+ expect(v.getValue()).toBe(undefined);
13
+ });
11
14
  });
12
15
  it('should be constructed with initial value', () => {
13
- const v = new ObservableValue(1);
14
- expect(v.getValue()).toBe(1);
16
+ using(new ObservableValue(1), (v) => {
17
+ expect(v.getValue()).toBe(1);
18
+ });
15
19
  });
16
20
  describe('Subscription callback', () => {
17
21
  it('should be triggered only when a value is changed', () => {
18
- const v = new ObservableValue(1);
19
- const doneCallback = vi.fn();
20
- v.subscribe(() => {
21
- expect(v.getValue()).toBe(2);
22
- doneCallback();
22
+ using(new ObservableValue(1), (v) => {
23
+ const doneCallback = vi.fn();
24
+ v.subscribe(() => {
25
+ expect(v.getValue()).toBe(2);
26
+ doneCallback();
27
+ });
28
+ v.setValue(1);
29
+ v.setValue(1);
30
+ v.setValue(2);
31
+ expect(doneCallback).toBeCalledTimes(1);
23
32
  });
24
- v.setValue(1);
25
- v.setValue(1);
26
- v.setValue(2);
27
- expect(doneCallback).toBeCalledTimes(1);
28
33
  });
29
34
  it('should be triggered only on change', () => {
30
- const v = new ObservableValue(1);
31
- const doneCallback = vi.fn();
32
- v.subscribe((value) => {
33
- expect(value).toBe(2);
34
- doneCallback();
35
+ using(new ObservableValue(1), (v) => {
36
+ const doneCallback = vi.fn();
37
+ v.subscribe((value) => {
38
+ expect(value).toBe(2);
39
+ doneCallback();
40
+ });
41
+ v.setValue(2);
42
+ expect(doneCallback).toBeCalledTimes(1);
35
43
  });
36
- v.setValue(2);
37
- expect(doneCallback).toBeCalledTimes(1);
38
44
  });
39
45
  it('should be triggered only on change in async manner', () => {
40
- const v = new ObservableValue(1);
41
- const doneCallback = vi.fn();
42
- v.subscribe(async (value) => {
43
- expect(value).toBe(2);
44
- doneCallback();
46
+ using(new ObservableValue(1), (v) => {
47
+ const doneCallback = vi.fn();
48
+ v.subscribe(async (value) => {
49
+ expect(value).toBe(2);
50
+ doneCallback();
51
+ });
52
+ v.setValue(2);
53
+ expect(doneCallback).toBeCalledTimes(1);
45
54
  });
46
- v.setValue(2);
47
- expect(doneCallback).toBeCalledTimes(1);
48
55
  });
49
56
  });
50
57
  describe('Unsubscribe', () => {
@@ -53,13 +60,14 @@ export const observableTests = describe('Observable', () => {
53
60
  const doneCallback = vi.fn((value) => {
54
61
  expect(value).toBe(2);
55
62
  });
56
- const v = new ObservableValue(1);
57
- const observer1 = v.subscribe(shouldNotCall);
58
- v.subscribe(doneCallback);
59
- v.unsubscribe(observer1);
60
- v.setValue(2);
61
- expect(doneCallback).toBeCalledTimes(1);
62
- expect(shouldNotCall).not.toBeCalled();
63
+ using(new ObservableValue(1), (v) => {
64
+ const observer1 = v.subscribe(shouldNotCall);
65
+ v.subscribe(doneCallback);
66
+ v.unsubscribe(observer1);
67
+ v.setValue(2);
68
+ expect(doneCallback).toBeCalledTimes(1);
69
+ expect(shouldNotCall).not.toBeCalled();
70
+ });
63
71
  });
64
72
  it('should remove the subscription on Observable dispose', () => {
65
73
  const callback1 = () => {
@@ -77,14 +85,15 @@ export const observableTests = describe('Observable', () => {
77
85
  expect(v.isDisposed).toBe(true);
78
86
  });
79
87
  it('should remove the subscription on Observer dispose', () => {
80
- const callback1 = () => {
81
- /** */
82
- };
83
- const v = new ObservableValue(1);
84
- const observer = v.subscribe(callback1);
85
- expect(v.getObservers().length).toBe(1);
86
- observer[Symbol.dispose]();
87
- expect(v.getObservers().length).toBe(0);
88
+ using(new ObservableValue(1), (v) => {
89
+ const callback1 = () => {
90
+ /** */
91
+ };
92
+ const observer = v.subscribe(callback1);
93
+ expect(v.getObservers().length).toBe(1);
94
+ observer[Symbol.dispose]();
95
+ expect(v.getObservers().length).toBe(0);
96
+ });
88
97
  });
89
98
  it('should throw an error for setValue() when the observer has been disposed', () => {
90
99
  const v = new ObservableValue(1);
@@ -110,50 +119,125 @@ export const observableTests = describe('Observable', () => {
110
119
  doneCallback();
111
120
  }
112
121
  }
113
- const v = new ObservableValue(1);
114
- const observer = v.subscribe(() => new Alma().Callback());
115
- v.subscribe(() => new Alma().Callback());
116
- expect(v.getObservers().length).toBe(2);
117
- observer[Symbol.dispose]();
118
- expect(v.getObservers().length).toBe(1);
119
- v.setValue(3);
120
- expect(doneCallback).toBeCalledTimes(1);
122
+ using(new ObservableValue(1), (v) => {
123
+ const observer = v.subscribe(() => new Alma().Callback());
124
+ v.subscribe(() => new Alma().Callback());
125
+ expect(v.getObservers().length).toBe(2);
126
+ observer[Symbol.dispose]();
127
+ expect(v.getObservers().length).toBe(1);
128
+ v.setValue(3);
129
+ expect(doneCallback).toBeCalledTimes(1);
130
+ });
121
131
  });
122
132
  });
123
133
  describe('Custom Compare function', () => {
124
134
  it('Should compare the values with the custom compare function', () => {
125
- const v = new ObservableValue({ value: 2 }, {
135
+ using(new ObservableValue({ value: 2 }, {
126
136
  compare: (a, b) => a.value !== b.value,
137
+ }), (v) => {
138
+ const onChange = vi.fn();
139
+ v.subscribe(onChange);
140
+ v.setValue({ value: 2 });
141
+ expect(v.getValue()).toEqual({ value: 2 });
142
+ expect(onChange).not.toBeCalled();
143
+ v.setValue({ value: 3 });
144
+ expect(v.getValue()).toEqual({ value: 3 });
145
+ expect(onChange).toBeCalledTimes(1);
146
+ expect(onChange).toBeCalledWith({ value: 3 });
147
+ v.setValue({ value: 3 });
148
+ expect(v.getValue()).toEqual({ value: 3 });
149
+ expect(onChange).toBeCalledTimes(1);
127
150
  });
128
- const onChange = vi.fn();
129
- v.subscribe(onChange);
130
- v.setValue({ value: 2 });
131
- expect(v.getValue()).toEqual({ value: 2 });
132
- expect(onChange).not.toBeCalled();
133
- v.setValue({ value: 3 });
134
- expect(v.getValue()).toEqual({ value: 3 });
135
- expect(onChange).toBeCalledTimes(1);
136
- expect(onChange).toBeCalledWith({ value: 3 });
137
- v.setValue({ value: 3 });
138
- expect(v.getValue()).toEqual({ value: 3 });
139
- expect(onChange).toBeCalledTimes(1);
140
151
  });
141
152
  });
142
153
  describe('Filtered subscriptions', () => {
143
154
  it('should not trigger the callback if the filter returns false', () => {
144
- const v = new ObservableValue({ shouldNotify: true, value: 1 });
145
- const onChange = vi.fn();
146
- v.subscribe(onChange, {
147
- filter: (nextValue) => nextValue.shouldNotify,
155
+ using(new ObservableValue({ shouldNotify: true, value: 1 }), (v) => {
156
+ const onChange = vi.fn();
157
+ v.subscribe(onChange, {
158
+ filter: (nextValue) => nextValue.shouldNotify,
159
+ });
160
+ v.setValue({ shouldNotify: false, value: 1 });
161
+ expect(onChange).not.toBeCalled();
162
+ v.setValue({ shouldNotify: false, value: 2 });
163
+ expect(onChange).not.toBeCalled();
164
+ expect(v.getValue()).toEqual({ shouldNotify: false, value: 2 });
165
+ v.setValue({ shouldNotify: true, value: 3 });
166
+ expect(onChange).toBeCalledTimes(1);
167
+ expect(onChange).toBeCalledWith({ shouldNotify: true, value: 3 });
168
+ });
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);
148
239
  });
149
- v.setValue({ shouldNotify: false, value: 1 });
150
- expect(onChange).not.toBeCalled();
151
- v.setValue({ shouldNotify: false, value: 2 });
152
- expect(onChange).not.toBeCalled();
153
- expect(v.getValue()).toEqual({ shouldNotify: false, value: 2 });
154
- v.setValue({ shouldNotify: true, value: 3 });
155
- expect(onChange).toBeCalledTimes(1);
156
- expect(onChange).toBeCalledWith({ shouldNotify: true, value: 3 });
240
+ consoleErrorSpy.mockRestore();
157
241
  });
158
242
  });
159
243
  });
@@ -1 +1 @@
1
- {"version":3,"file":"observable-value.spec.js","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,SAAS,CAAC,CAAA;QACxC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;QACzC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;gBACf,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAC5B,YAAY,EAAE,CAAA;YAChB,CAAC,CAAC,CAAA;YACF,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACb,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACb,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACb,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACrB,YAAY,EAAE,CAAA;YAChB,CAAC,CAAC,CAAA;YACF,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACb,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACrB,YAAY,EAAE,CAAA;YAChB,CAAC,CAAC,CAAA;YACF,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACb,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE7B,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,EAAE;gBAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvB,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;YAC5C,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;YAEzB,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;YACxB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAEb,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;QACxC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,SAAS,GAAG,GAAG,EAAE;gBACrB,MAAM;YACR,CAAC,CAAA;YACD,MAAM,SAAS,GAAG,GAAG,EAAE;gBACrB,MAAM;YACR,CAAC,CAAA;YACD,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;YACtB,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;YACtB,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YACnB,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAEvC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,SAAS,GAAG,GAAG,EAAE;gBACrB,MAAM;YACR,CAAC,CAAA;YACD,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;YACvC,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YAC1B,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YACnB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAA;QACzE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YACnB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAA;QACxE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;YACnF,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YACnB,MAAM,CAAC,GAAG,EAAE,CACV,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;gBACf,MAAM;YACR,CAAC,CAAC,CACH,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,MAAM,IAAI;gBACD,QAAQ;oBACb,YAAY,EAAE,CAAA;gBAChB,CAAC;aACF;YACD,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;YACzD,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;YACxC,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YAC1B,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAEb,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,CAAC,GAAG,IAAI,eAAe,CAC3B,EAAE,KAAK,EAAE,CAAC,EAAE,EACZ;gBACE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;aACvC,CACF,CAAA;YACD,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YACxB,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;YAErB,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YACxB,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;YAEjC,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YACxB,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YAE7C,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YACxB,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YAC/D,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YACxB,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE;gBACpB,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,YAAY;aAC9C,CAAC,CAAA;YAEF,CAAC,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;YAEjC,CAAC,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;YACjC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YAE/D,CAAC,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QACnE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"observable-value.spec.js","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import { EventHub, type ListenerErrorPayload } from './event-hub.js';
2
+ import { ObservableValue } from './observable-value.js';
3
+ /**
4
+ * Error thrown when you try to execute on a semaphore that is already disposed,
5
+ * or when pending tasks are rejected due to disposal.
6
+ */
7
+ export declare class SemaphoreDisposedError extends Error {
8
+ constructor();
9
+ }
10
+ /**
11
+ * Event map for the Semaphore's EventHub.
12
+ */
13
+ export type SemaphoreEvents = {
14
+ /** Fired when a queued task begins execution */
15
+ taskStarted: undefined;
16
+ /** Fired when a running task resolves successfully */
17
+ taskCompleted: undefined;
18
+ /** Fired when a running task rejects, carrying the thrown error */
19
+ taskFailed: {
20
+ error: unknown;
21
+ };
22
+ /** Fired when an event listener throws during emission */
23
+ onListenerError: ListenerErrorPayload;
24
+ };
25
+ /**
26
+ * An async semaphore that limits concurrent task execution to a fixed number of slots.
27
+ *
28
+ * Extends {@link EventHub} with {@link SemaphoreEvents} for per-task lifecycle events
29
+ * (`taskStarted`, `taskCompleted`, `taskFailed`).
30
+ *
31
+ * Exposes individual {@link ObservableValue} counters for reactive state monitoring.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * const results = await usingAsync(new Semaphore(3), async (semaphore) => {
36
+ * semaphore.pendingCount.subscribe((count) => console.log('Pending:', count))
37
+ * semaphore.subscribe('taskCompleted', () => console.log('A task completed'))
38
+ *
39
+ * return await Promise.all(
40
+ * urls.map((url) => semaphore.execute(({ signal }) => fetch(url, { signal }))),
41
+ * )
42
+ * })
43
+ * ```
44
+ */
45
+ export declare class Semaphore extends EventHub<SemaphoreEvents> {
46
+ private readonly queue;
47
+ private readonly running;
48
+ private disposed;
49
+ /** The number of tasks waiting in the queue to be started */
50
+ readonly pendingCount: ObservableValue<number>;
51
+ /** The number of tasks currently executing */
52
+ readonly runningCount: ObservableValue<number>;
53
+ /** The total number of tasks that have resolved successfully */
54
+ readonly completedCount: ObservableValue<number>;
55
+ /** The total number of tasks that have rejected */
56
+ readonly failedCount: ObservableValue<number>;
57
+ private _maxConcurrent;
58
+ /**
59
+ * @param maxConcurrent The maximum number of tasks that can run concurrently
60
+ */
61
+ constructor(maxConcurrent: number);
62
+ /**
63
+ * Returns the current maximum number of tasks that can run concurrently.
64
+ * @returns The current concurrency limit
65
+ */
66
+ getMaxConcurrent(): number;
67
+ /**
68
+ * Updates the maximum number of tasks that can run concurrently.
69
+ *
70
+ * If the new limit is higher than the current one, queued tasks will
71
+ * be started immediately to fill the new slots.
72
+ * If the new limit is lower, already-running tasks will not be aborted,
73
+ * but no new tasks will start until the running count drops below the new limit.
74
+ *
75
+ * @param value The new concurrency limit (must be a positive integer)
76
+ */
77
+ setMaxConcurrent(value: number): void;
78
+ /**
79
+ * Queues a task for execution. Resolves or rejects with the task's own result.
80
+ *
81
+ * The task function receives an `AbortSignal` that is aborted when:
82
+ * - the caller's signal aborts (if provided via `options.signal`)
83
+ * - the semaphore is disposed
84
+ *
85
+ * @param task The async function to execute
86
+ * @param options Optional configuration including an AbortSignal
87
+ * @returns A promise that resolves/rejects with the task's result
88
+ */
89
+ execute<T>(task: (options: {
90
+ signal: AbortSignal;
91
+ }) => Promise<T>, options?: {
92
+ signal?: AbortSignal;
93
+ }): Promise<T>;
94
+ private removePending;
95
+ private drain;
96
+ private cleanupCallerSignal;
97
+ private startTask;
98
+ /**
99
+ * Disposes the semaphore: rejects all pending tasks with {@link SemaphoreDisposedError},
100
+ * aborts the signal of every running task, and disposes all observable counters and event listeners.
101
+ */
102
+ [Symbol.dispose](): void;
103
+ }
104
+ //# sourceMappingURL=semaphore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semaphore.d.ts","sourceRoot":"","sources":["../src/semaphore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;;CAIhD;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,gDAAgD;IAChD,WAAW,EAAE,SAAS,CAAA;IACtB,sDAAsD;IACtD,aAAa,EAAE,SAAS,CAAA;IACxB,mEAAmE;IACnE,UAAU,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAA;IAC9B,0DAA0D;IAC1D,eAAe,EAAE,oBAAoB,CAAA;CACtC,CAAA;AAWD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,SAAU,SAAQ,QAAQ,CAAC,eAAe,CAAC;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAQ;IAExB,6DAA6D;IAC7D,SAAgB,YAAY,0BAAiC;IAC7D,8CAA8C;IAC9C,SAAgB,YAAY,0BAAiC;IAC7D,gEAAgE;IAChE,SAAgB,cAAc,0BAAiC;IAC/D,mDAAmD;IACnD,SAAgB,WAAW,0BAAiC;IAE5D,OAAO,CAAC,cAAc,CAAQ;IAE9B;;OAEG;gBACS,aAAa,EAAE,MAAM;IAKjC;;;OAGG;IACI,gBAAgB,IAAI,MAAM;IAIjC;;;;;;;;;OASG;IACI,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ5C;;;;;;;;;;OAUG;IACI,OAAO,CAAC,CAAC,EACd,IAAI,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EACtD,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACjC,OAAO,CAAC,CAAC,CAAC;IA+Bb,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,SAAS;IAoCjB;;;OAGG;IACa,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAoBzC"}
@@ -0,0 +1,185 @@
1
+ import { EventHub } from './event-hub.js';
2
+ import { ObservableValue } from './observable-value.js';
3
+ /**
4
+ * Error thrown when you try to execute on a semaphore that is already disposed,
5
+ * or when pending tasks are rejected due to disposal.
6
+ */
7
+ export class SemaphoreDisposedError extends Error {
8
+ constructor() {
9
+ super('Semaphore already disposed');
10
+ }
11
+ }
12
+ /**
13
+ * An async semaphore that limits concurrent task execution to a fixed number of slots.
14
+ *
15
+ * Extends {@link EventHub} with {@link SemaphoreEvents} for per-task lifecycle events
16
+ * (`taskStarted`, `taskCompleted`, `taskFailed`).
17
+ *
18
+ * Exposes individual {@link ObservableValue} counters for reactive state monitoring.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const results = await usingAsync(new Semaphore(3), async (semaphore) => {
23
+ * semaphore.pendingCount.subscribe((count) => console.log('Pending:', count))
24
+ * semaphore.subscribe('taskCompleted', () => console.log('A task completed'))
25
+ *
26
+ * return await Promise.all(
27
+ * urls.map((url) => semaphore.execute(({ signal }) => fetch(url, { signal }))),
28
+ * )
29
+ * })
30
+ * ```
31
+ */
32
+ export class Semaphore extends EventHub {
33
+ queue = [];
34
+ running = new Set();
35
+ disposed = false;
36
+ /** The number of tasks waiting in the queue to be started */
37
+ pendingCount = new ObservableValue(0);
38
+ /** The number of tasks currently executing */
39
+ runningCount = new ObservableValue(0);
40
+ /** The total number of tasks that have resolved successfully */
41
+ completedCount = new ObservableValue(0);
42
+ /** The total number of tasks that have rejected */
43
+ failedCount = new ObservableValue(0);
44
+ _maxConcurrent;
45
+ /**
46
+ * @param maxConcurrent The maximum number of tasks that can run concurrently
47
+ */
48
+ constructor(maxConcurrent) {
49
+ super();
50
+ this._maxConcurrent = maxConcurrent;
51
+ }
52
+ /**
53
+ * Returns the current maximum number of tasks that can run concurrently.
54
+ * @returns The current concurrency limit
55
+ */
56
+ getMaxConcurrent() {
57
+ return this._maxConcurrent;
58
+ }
59
+ /**
60
+ * Updates the maximum number of tasks that can run concurrently.
61
+ *
62
+ * If the new limit is higher than the current one, queued tasks will
63
+ * be started immediately to fill the new slots.
64
+ * If the new limit is lower, already-running tasks will not be aborted,
65
+ * but no new tasks will start until the running count drops below the new limit.
66
+ *
67
+ * @param value The new concurrency limit (must be a positive integer)
68
+ */
69
+ setMaxConcurrent(value) {
70
+ if (!Number.isInteger(value) || value < 1) {
71
+ throw new Error('maxConcurrent must be a positive integer');
72
+ }
73
+ this._maxConcurrent = value;
74
+ this.drain();
75
+ }
76
+ /**
77
+ * Queues a task for execution. Resolves or rejects with the task's own result.
78
+ *
79
+ * The task function receives an `AbortSignal` that is aborted when:
80
+ * - the caller's signal aborts (if provided via `options.signal`)
81
+ * - the semaphore is disposed
82
+ *
83
+ * @param task The async function to execute
84
+ * @param options Optional configuration including an AbortSignal
85
+ * @returns A promise that resolves/rejects with the task's result
86
+ */
87
+ execute(task, options) {
88
+ if (this.disposed) {
89
+ throw new SemaphoreDisposedError();
90
+ }
91
+ if (options?.signal?.aborted) {
92
+ return Promise.reject(options.signal.reason);
93
+ }
94
+ return new Promise((resolve, reject) => {
95
+ const abortController = new AbortController();
96
+ const entry = { task, resolve, reject, abortController };
97
+ if (options?.signal) {
98
+ const callerAbortHandler = () => {
99
+ abortController.abort(options.signal.reason);
100
+ this.removePending(entry);
101
+ };
102
+ entry.callerSignal = options.signal;
103
+ entry.callerAbortHandler = callerAbortHandler;
104
+ options.signal.addEventListener('abort', callerAbortHandler, { once: true });
105
+ }
106
+ this.queue.push(entry);
107
+ this.pendingCount.setValue(this.pendingCount.getValue() + 1);
108
+ this.drain();
109
+ });
110
+ }
111
+ removePending(entry) {
112
+ const idx = this.queue.indexOf(entry);
113
+ if (idx !== -1) {
114
+ this.queue.splice(idx, 1);
115
+ this.pendingCount.setValue(this.pendingCount.getValue() - 1);
116
+ entry.reject(entry.abortController.signal.reason);
117
+ }
118
+ }
119
+ drain() {
120
+ while (this.running.size < this._maxConcurrent && this.queue.length > 0) {
121
+ const entry = this.queue.shift();
122
+ this.pendingCount.setValue(this.pendingCount.getValue() - 1);
123
+ this.startTask(entry);
124
+ }
125
+ }
126
+ cleanupCallerSignal(entry) {
127
+ if (entry.callerSignal && entry.callerAbortHandler) {
128
+ entry.callerSignal.removeEventListener('abort', entry.callerAbortHandler);
129
+ entry.callerSignal = undefined;
130
+ entry.callerAbortHandler = undefined;
131
+ }
132
+ }
133
+ startTask(entry) {
134
+ this.running.add(entry);
135
+ this.runningCount.setValue(this.runningCount.getValue() + 1);
136
+ this.emit('taskStarted', undefined);
137
+ entry
138
+ .task({ signal: entry.abortController.signal })
139
+ .then((value) => {
140
+ this.running.delete(entry);
141
+ this.cleanupCallerSignal(entry);
142
+ if (!this.disposed) {
143
+ this.runningCount.setValue(this.runningCount.getValue() - 1);
144
+ this.completedCount.setValue(this.completedCount.getValue() + 1);
145
+ this.emit('taskCompleted', undefined);
146
+ }
147
+ entry.resolve(value);
148
+ }, (error) => {
149
+ this.running.delete(entry);
150
+ this.cleanupCallerSignal(entry);
151
+ if (!this.disposed) {
152
+ this.runningCount.setValue(this.runningCount.getValue() - 1);
153
+ this.failedCount.setValue(this.failedCount.getValue() + 1);
154
+ this.emit('taskFailed', { error });
155
+ }
156
+ entry.reject(error);
157
+ })
158
+ .finally(() => {
159
+ if (!this.disposed) {
160
+ this.drain();
161
+ }
162
+ });
163
+ }
164
+ /**
165
+ * Disposes the semaphore: rejects all pending tasks with {@link SemaphoreDisposedError},
166
+ * aborts the signal of every running task, and disposes all observable counters and event listeners.
167
+ */
168
+ [Symbol.dispose]() {
169
+ this.disposed = true;
170
+ for (const entry of [...this.queue]) {
171
+ this.queue.shift();
172
+ entry.reject(new SemaphoreDisposedError());
173
+ }
174
+ this.pendingCount.setValue(0);
175
+ for (const entry of this.running) {
176
+ entry.abortController.abort(new SemaphoreDisposedError());
177
+ }
178
+ this.pendingCount[Symbol.dispose]();
179
+ this.runningCount[Symbol.dispose]();
180
+ this.completedCount[Symbol.dispose]();
181
+ this.failedCount[Symbol.dispose]();
182
+ super[Symbol.dispose]();
183
+ }
184
+ }
185
+ //# sourceMappingURL=semaphore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semaphore.js","sourceRoot":"","sources":["../src/semaphore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const semaphoreTests: import("vitest").SuiteCollector<object>;
2
+ //# sourceMappingURL=semaphore.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semaphore.spec.d.ts","sourceRoot":"","sources":["../src/semaphore.spec.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc,yCA6czB,CAAA"}