@furystack/utils 4.0.17 → 6.0.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/esm/event-hub.d.ts +16 -0
- package/esm/event-hub.d.ts.map +1 -0
- package/esm/event-hub.js +27 -0
- package/esm/event-hub.js.map +1 -0
- package/esm/event-hub.spec.d.ts +2 -0
- package/esm/event-hub.spec.d.ts.map +1 -0
- package/esm/event-hub.spec.js +73 -0
- package/esm/event-hub.spec.js.map +1 -0
- package/esm/index.d.ts +1 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/observable-value.d.ts +15 -3
- package/esm/observable-value.d.ts.map +1 -1
- package/esm/observable-value.js +20 -14
- package/esm/observable-value.js.map +1 -1
- package/esm/observable-value.spec.d.ts.map +1 -1
- package/esm/observable-value.spec.js +43 -17
- package/esm/observable-value.spec.js.map +1 -1
- package/esm/trace.d.ts.map +1 -1
- package/esm/trace.js +16 -3
- package/esm/trace.js.map +1 -1
- package/esm/value-observer.d.ts +6 -1
- package/esm/value-observer.d.ts.map +1 -1
- package/esm/value-observer.js +4 -1
- package/esm/value-observer.js.map +1 -1
- package/package.json +2 -2
- package/src/event-hub.spec.ts +106 -0
- package/src/event-hub.ts +35 -0
- package/src/index.ts +1 -0
- package/src/observable-value.spec.ts +54 -18
- package/src/observable-value.ts +33 -14
- package/src/trace.ts +17 -4
- package/src/value-observer.ts +6 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Disposable } from './disposable.js';
|
|
2
|
+
type ListenerFunction<T extends string, EventTypeMap extends {
|
|
3
|
+
[K in T]: any;
|
|
4
|
+
}> = (arg: EventTypeMap[T]) => void;
|
|
5
|
+
export declare class EventHub<T extends string, EventTypeMap extends {
|
|
6
|
+
[K in T]: any;
|
|
7
|
+
}> implements Disposable {
|
|
8
|
+
private listeners;
|
|
9
|
+
addListener<TEvent extends T>(event: TEvent, listener: ListenerFunction<TEvent, EventTypeMap>): void;
|
|
10
|
+
removeListener<TEvent extends T>(event: TEvent, listener: ListenerFunction<TEvent, EventTypeMap>): void;
|
|
11
|
+
subscribe<TEvent extends T>(event: TEvent, listener: ListenerFunction<TEvent, EventTypeMap>): Disposable;
|
|
12
|
+
emit<TEvent extends T>(event: TEvent, arg: EventTypeMap[TEvent]): void;
|
|
13
|
+
dispose(): void;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=event-hub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-hub.d.ts","sourceRoot":"","sources":["../src/event-hub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,KAAK,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,YAAY,SAAS;KAAG,CAAC,IAAI,CAAC,GAAG,GAAG;CAAE,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;AAEhH,qBAAa,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,YAAY,SAAS;KAAG,CAAC,IAAI,CAAC,GAAG,GAAG;CAAE,CAAE,YAAW,UAAU;IACnG,OAAO,CAAC,SAAS,CAAuD;IAEjE,WAAW,CAAC,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC;IAO7F,cAAc,CAAC,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC;IAMhG,SAAS,CAAC,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,UAAU;IAKxG,IAAI,CAAC,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC;IAM/D,OAAO;CAGf"}
|
package/esm/event-hub.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export class EventHub {
|
|
2
|
+
listeners = new Map();
|
|
3
|
+
addListener(event, listener) {
|
|
4
|
+
if (!this.listeners.has(event)) {
|
|
5
|
+
this.listeners.set(event, new Set());
|
|
6
|
+
}
|
|
7
|
+
this.listeners.get(event).add(listener);
|
|
8
|
+
}
|
|
9
|
+
removeListener(event, listener) {
|
|
10
|
+
if (this.listeners.has(event)) {
|
|
11
|
+
this.listeners.get(event).delete(listener);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
subscribe(event, listener) {
|
|
15
|
+
this.addListener(event, listener);
|
|
16
|
+
return { dispose: () => this.removeListener(event, listener) };
|
|
17
|
+
}
|
|
18
|
+
emit(event, arg) {
|
|
19
|
+
if (this.listeners.has(event)) {
|
|
20
|
+
this.listeners.get(event).forEach((listener) => listener(arg));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
dispose() {
|
|
24
|
+
this.listeners.clear();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=event-hub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-hub.js","sourceRoot":"","sources":["../src/event-hub.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,QAAQ;IACX,SAAS,GAAG,IAAI,GAAG,EAA6C,CAAA;IAEjE,WAAW,CAAmB,KAAa,EAAE,QAAgD;QAClG,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,QAA6C,CAAC,CAAA;IAC/E,CAAC;IAEM,cAAc,CAAmB,KAAa,EAAE,QAAgD;QACrG,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC,QAA6C,CAAC,CAAA;QAClF,CAAC;IACH,CAAC;IAEM,SAAS,CAAmB,KAAa,EAAE,QAAgD;QAChG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QACjC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAA;IAChE,CAAC;IAEM,IAAI,CAAmB,KAAa,EAAE,GAAyB;QACpE,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,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-hub.spec.d.ts","sourceRoot":"","sources":["../src/event-hub.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { EventHub } from './event-hub.js';
|
|
2
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
3
|
+
describe('EventHub', () => {
|
|
4
|
+
it('Should fail on type errors', () => {
|
|
5
|
+
const eventHub = new EventHub();
|
|
6
|
+
const numberListener = vi.fn((_val) => { });
|
|
7
|
+
const stringListener = vi.fn((_val) => { });
|
|
8
|
+
// @ts-expect-error Type 'string' is not assignable to type 'number'
|
|
9
|
+
eventHub.addListener('ExampleNumberEvent', stringListener);
|
|
10
|
+
// @ts-expect-error Type 'string' is not assignable to type 'number'
|
|
11
|
+
eventHub.emit('ExampleNumberEvent', '1');
|
|
12
|
+
// @ts-expect-error Type 'number' is not assignable to type 'string'
|
|
13
|
+
eventHub.addListener('ExampleStringEvent', numberListener);
|
|
14
|
+
// @ts-expect-error Type 'number' is not assignable to type 'string'
|
|
15
|
+
eventHub.emit('ExampleStringEvent', 1);
|
|
16
|
+
});
|
|
17
|
+
it('Should remove a listener', () => {
|
|
18
|
+
// Arrange
|
|
19
|
+
const eventHub = new EventHub();
|
|
20
|
+
const numberListener = vi.fn((_val) => { });
|
|
21
|
+
// Act
|
|
22
|
+
eventHub.addListener('ExampleNumberEvent', numberListener);
|
|
23
|
+
eventHub.removeListener('ExampleNumberEvent', numberListener);
|
|
24
|
+
eventHub.emit('ExampleNumberEvent', 1);
|
|
25
|
+
// Assert
|
|
26
|
+
expect(numberListener).not.toBeCalled();
|
|
27
|
+
});
|
|
28
|
+
it('should distribute events through listeners', () => {
|
|
29
|
+
// Arrange
|
|
30
|
+
const eventHub = new EventHub();
|
|
31
|
+
const numberListener = vi.fn((_val) => { });
|
|
32
|
+
const stringListener = vi.fn((_val) => { });
|
|
33
|
+
const objectListener1 = vi.fn((_val) => { });
|
|
34
|
+
const objectListener2 = vi.fn((_val) => { });
|
|
35
|
+
// Act
|
|
36
|
+
eventHub.addListener('ExampleNumberEvent', numberListener);
|
|
37
|
+
eventHub.emit('ExampleNumberEvent', 1);
|
|
38
|
+
eventHub.addListener('ExampleStringEvent', stringListener);
|
|
39
|
+
eventHub.emit('ExampleStringEvent', '1');
|
|
40
|
+
eventHub.addListener('ExampleObjectEvent1', objectListener1);
|
|
41
|
+
eventHub.emit('ExampleObjectEvent1', { a: 1 });
|
|
42
|
+
eventHub.addListener('ExampleObjectEvent2', objectListener2);
|
|
43
|
+
eventHub.emit('ExampleObjectEvent2', { b: '1' });
|
|
44
|
+
// Assert
|
|
45
|
+
expect(numberListener).toBeCalledWith(1);
|
|
46
|
+
expect(numberListener).toBeCalledTimes(1);
|
|
47
|
+
expect(stringListener).toBeCalledWith('1');
|
|
48
|
+
expect(stringListener).toBeCalledTimes(1);
|
|
49
|
+
expect(objectListener1).toBeCalledWith({ a: 1 });
|
|
50
|
+
expect(objectListener1).toBeCalledTimes(1);
|
|
51
|
+
expect(objectListener2).toBeCalledWith({ b: '1' });
|
|
52
|
+
expect(objectListener2).toBeCalledTimes(1);
|
|
53
|
+
});
|
|
54
|
+
it('Should add and remove a listener with subscription', () => {
|
|
55
|
+
const eventHub = new EventHub();
|
|
56
|
+
const numberListener = vi.fn((_val) => { });
|
|
57
|
+
const subscription = eventHub.subscribe('ExampleNumberEvent', numberListener);
|
|
58
|
+
eventHub.emit('ExampleNumberEvent', 1);
|
|
59
|
+
expect(numberListener).toBeCalledWith(1);
|
|
60
|
+
subscription.dispose();
|
|
61
|
+
eventHub.emit('ExampleNumberEvent', 2);
|
|
62
|
+
expect(numberListener).toBeCalledTimes(1);
|
|
63
|
+
});
|
|
64
|
+
it('should clear all listeners on dispose', () => {
|
|
65
|
+
const hub = new EventHub();
|
|
66
|
+
const listener = vi.fn((_val) => { });
|
|
67
|
+
hub.addListener('test', listener);
|
|
68
|
+
hub.dispose();
|
|
69
|
+
hub.emit('test', 'test');
|
|
70
|
+
expect(listener).not.toBeCalled();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=event-hub.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-hub.spec.js","sourceRoot":"","sources":["../src/event-hub.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEjD,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAG1B,CAAA;QACH,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,EAAwD,CAAA;QACrF,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,EAQ1B,CAAA;QACH,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,CAAC,IAAmB,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;QAE1D,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,GAAG,EAAE;QAC5D,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAwD,CAAA;QACrF,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,OAAO,EAAE,CAAA;QACtB,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,EAA4B,CAAA;QAEpD,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,GAAG,CAAC,OAAO,EAAE,CAAA;QACb,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACxB,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/esm/index.d.ts
CHANGED
package/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
|
package/esm/index.js
CHANGED
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Disposable } from './disposable.js';
|
|
2
|
+
import type { ValueObserverOptions } from './value-observer.js';
|
|
2
3
|
import { ValueObserver } from './value-observer.js';
|
|
3
4
|
/**
|
|
4
5
|
* Error thrown when you try to retrieve or set an observable value that is already disposed.
|
|
@@ -10,6 +11,15 @@ export declare class ObservableAlreadyDisposedError extends Error {
|
|
|
10
11
|
* Callback type for observable value changes
|
|
11
12
|
*/
|
|
12
13
|
export type ValueChangeCallback<T> = (next: T) => void;
|
|
14
|
+
export type ObservableValueOptions<T> = {
|
|
15
|
+
/**
|
|
16
|
+
* Defines a custom compare function to determine if the value should be updated and the observers should be notified
|
|
17
|
+
* @param lastValue the last value
|
|
18
|
+
* @param nextValue the next value
|
|
19
|
+
* @returns if the value should be updated and the observers should be notified
|
|
20
|
+
*/
|
|
21
|
+
compare: (lastValue: T, nextValue: T) => boolean;
|
|
22
|
+
};
|
|
13
23
|
/**
|
|
14
24
|
* Defines an ObservableValue value object.
|
|
15
25
|
*
|
|
@@ -42,10 +52,10 @@ export declare class ObservableValue<T> implements Disposable {
|
|
|
42
52
|
/**
|
|
43
53
|
* Subscribes to a value changes
|
|
44
54
|
* @param callback The callback method that will be called on each change
|
|
45
|
-
* @param
|
|
55
|
+
* @param options Additional ObservableValue options
|
|
46
56
|
* @returns The ValueObserver instance
|
|
47
57
|
*/
|
|
48
|
-
subscribe(callback: ValueChangeCallback<T>,
|
|
58
|
+
subscribe(callback: ValueChangeCallback<T>, options?: ValueObserverOptions<T>): ValueObserver<T>;
|
|
49
59
|
/**
|
|
50
60
|
* The observer will unsubscribe from the Observable
|
|
51
61
|
* @param observer The ValueObserver instance
|
|
@@ -67,9 +77,11 @@ export declare class ObservableValue<T> implements Disposable {
|
|
|
67
77
|
* @returns The subscribed observers
|
|
68
78
|
*/
|
|
69
79
|
getObservers(): readonly ValueObserver<T>[];
|
|
80
|
+
private readonly options;
|
|
70
81
|
/**
|
|
71
82
|
* @param initialValue Optional initial value
|
|
83
|
+
* @param options Additional options
|
|
72
84
|
*/
|
|
73
|
-
constructor(initialValue?: T);
|
|
85
|
+
constructor(initialValue: T, options?: Partial<ObservableValueOptions<T>>);
|
|
74
86
|
}
|
|
75
87
|
//# sourceMappingURL=observable-value.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable-value.d.ts","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,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,CAAA;AAEtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAe,CAAC,CAAC,CAAE,YAAW,UAAU;IACnD,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,OAAO,CAAC,WAAW,CAAQ;IAE3B;;OAEG;IACI,OAAO;
|
|
1
|
+
{"version":3,"file":"observable-value.d.ts","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,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,CAAA;AAEtD,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,OAAO;IAMd,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;IAInB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAEnD;;;OAGG;gBACS,YAAY,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;CAO1E"}
|
package/esm/observable-value.js
CHANGED
|
@@ -7,6 +7,7 @@ export class ObservableAlreadyDisposedError extends Error {
|
|
|
7
7
|
super('Observable already disposed');
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
+
const defaultComparer = (a, b) => a !== b;
|
|
10
11
|
/**
|
|
11
12
|
* Defines an ObservableValue value object.
|
|
12
13
|
*
|
|
@@ -38,24 +39,23 @@ export class ObservableValue {
|
|
|
38
39
|
dispose() {
|
|
39
40
|
this.observers.clear();
|
|
40
41
|
this._isDisposed = true;
|
|
42
|
+
// @ts-expect-error getting currentValue after disposing is not allowed
|
|
43
|
+
this.currentValue = null;
|
|
41
44
|
}
|
|
42
45
|
observers = new Set();
|
|
43
46
|
currentValue;
|
|
44
47
|
/**
|
|
45
48
|
* Subscribes to a value changes
|
|
46
49
|
* @param callback The callback method that will be called on each change
|
|
47
|
-
* @param
|
|
50
|
+
* @param options Additional ObservableValue options
|
|
48
51
|
* @returns The ValueObserver instance
|
|
49
52
|
*/
|
|
50
|
-
subscribe(callback,
|
|
53
|
+
subscribe(callback, options) {
|
|
51
54
|
if (this._isDisposed) {
|
|
52
55
|
throw new ObservableAlreadyDisposedError();
|
|
53
56
|
}
|
|
54
|
-
const observer = new ValueObserver(this, callback);
|
|
57
|
+
const observer = new ValueObserver(this, callback, options);
|
|
55
58
|
this.observers.add(observer);
|
|
56
|
-
if (getLast) {
|
|
57
|
-
callback(this.currentValue);
|
|
58
|
-
}
|
|
59
59
|
return observer;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
@@ -84,11 +84,13 @@ export class ObservableValue {
|
|
|
84
84
|
if (this._isDisposed) {
|
|
85
85
|
throw new ObservableAlreadyDisposedError();
|
|
86
86
|
}
|
|
87
|
-
if (this.currentValue
|
|
87
|
+
if (this.options.compare(this.currentValue, newValue)) {
|
|
88
88
|
this.currentValue = newValue;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
this.observers.forEach((observer) => {
|
|
90
|
+
if (observer.options?.filter?.(this.currentValue, newValue) !== false) {
|
|
91
|
+
observer.callback(newValue);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
92
94
|
}
|
|
93
95
|
}
|
|
94
96
|
/**
|
|
@@ -98,13 +100,17 @@ export class ObservableValue {
|
|
|
98
100
|
getObservers() {
|
|
99
101
|
return [...this.observers];
|
|
100
102
|
}
|
|
103
|
+
options;
|
|
101
104
|
/**
|
|
102
105
|
* @param initialValue Optional initial value
|
|
106
|
+
* @param options Additional options
|
|
103
107
|
*/
|
|
104
|
-
constructor(initialValue) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
+
constructor(initialValue, options) {
|
|
109
|
+
this.options = {
|
|
110
|
+
compare: defaultComparer,
|
|
111
|
+
...options,
|
|
112
|
+
};
|
|
113
|
+
this.currentValue = initialValue;
|
|
108
114
|
}
|
|
109
115
|
}
|
|
110
116
|
//# sourceMappingURL=observable-value.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable-value.js","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"observable-value.js","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"AAEA,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,OAAO;QACZ,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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable-value.spec.d.ts","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"observable-value.spec.d.ts","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,eAAe,qCA6K1B,CAAA"}
|
|
@@ -4,24 +4,14 @@ import { ObservableValue } from './observable-value.js';
|
|
|
4
4
|
* Observable Value tests
|
|
5
5
|
*/
|
|
6
6
|
export const observableTests = describe('Observable', () => {
|
|
7
|
-
it('should be constructed
|
|
8
|
-
const v = new ObservableValue();
|
|
9
|
-
const doneCallback = vi.fn();
|
|
10
|
-
v.subscribe(() => {
|
|
11
|
-
expect(v.getValue()).toBe(undefined);
|
|
12
|
-
doneCallback();
|
|
13
|
-
}, true);
|
|
7
|
+
it('should be constructed with an undefined initial value', () => {
|
|
8
|
+
const v = new ObservableValue(undefined);
|
|
14
9
|
expect(v).toBeInstanceOf(ObservableValue);
|
|
15
|
-
expect(
|
|
10
|
+
expect(v.getValue()).toBe(undefined);
|
|
16
11
|
});
|
|
17
12
|
it('should be constructed with initial value', () => {
|
|
18
13
|
const v = new ObservableValue(1);
|
|
19
|
-
|
|
20
|
-
v.subscribe(() => {
|
|
21
|
-
expect(v.getValue()).toBe(1);
|
|
22
|
-
doneCallback();
|
|
23
|
-
}, true);
|
|
24
|
-
expect(doneCallback).toBeCalled();
|
|
14
|
+
expect(v.getValue()).toBe(1);
|
|
25
15
|
});
|
|
26
16
|
describe('Subscription callback', () => {
|
|
27
17
|
it('should be triggered only when a value is changed', () => {
|
|
@@ -30,19 +20,19 @@ export const observableTests = describe('Observable', () => {
|
|
|
30
20
|
v.subscribe(() => {
|
|
31
21
|
expect(v.getValue()).toBe(2);
|
|
32
22
|
doneCallback();
|
|
33
|
-
}
|
|
23
|
+
});
|
|
34
24
|
v.setValue(1);
|
|
35
25
|
v.setValue(1);
|
|
36
26
|
v.setValue(2);
|
|
37
27
|
expect(doneCallback).toBeCalledTimes(1);
|
|
38
28
|
});
|
|
39
|
-
it('should be triggered only on change
|
|
29
|
+
it('should be triggered only on change', () => {
|
|
40
30
|
const v = new ObservableValue(1);
|
|
41
31
|
const doneCallback = vi.fn();
|
|
42
32
|
v.subscribe((value) => {
|
|
43
33
|
expect(value).toBe(2);
|
|
44
34
|
doneCallback();
|
|
45
|
-
}
|
|
35
|
+
});
|
|
46
36
|
v.setValue(2);
|
|
47
37
|
expect(doneCallback).toBeCalledTimes(1);
|
|
48
38
|
});
|
|
@@ -119,5 +109,41 @@ export const observableTests = describe('Observable', () => {
|
|
|
119
109
|
expect(doneCallback).toBeCalledTimes(1);
|
|
120
110
|
});
|
|
121
111
|
});
|
|
112
|
+
describe('Custom Compare function', () => {
|
|
113
|
+
it('Should compare the values with the custom compare function', () => {
|
|
114
|
+
const v = new ObservableValue({ value: 2 }, {
|
|
115
|
+
compare: (a, b) => a.value !== b.value,
|
|
116
|
+
});
|
|
117
|
+
const onChange = vi.fn();
|
|
118
|
+
v.subscribe(onChange);
|
|
119
|
+
v.setValue({ value: 2 });
|
|
120
|
+
expect(v.getValue()).toEqual({ value: 2 });
|
|
121
|
+
expect(onChange).not.toBeCalled();
|
|
122
|
+
v.setValue({ value: 3 });
|
|
123
|
+
expect(v.getValue()).toEqual({ value: 3 });
|
|
124
|
+
expect(onChange).toBeCalledTimes(1);
|
|
125
|
+
expect(onChange).toBeCalledWith({ value: 3 });
|
|
126
|
+
v.setValue({ value: 3 });
|
|
127
|
+
expect(v.getValue()).toEqual({ value: 3 });
|
|
128
|
+
expect(onChange).toBeCalledTimes(1);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe('Filtered subscriptions', () => {
|
|
132
|
+
it('should not trigger the callback if the filter returns false', () => {
|
|
133
|
+
const v = new ObservableValue({ shouldNotify: true, value: 1 });
|
|
134
|
+
const onChange = vi.fn();
|
|
135
|
+
v.subscribe(onChange, {
|
|
136
|
+
filter: (nextValue) => nextValue.shouldNotify,
|
|
137
|
+
});
|
|
138
|
+
v.setValue({ shouldNotify: false, value: 1 });
|
|
139
|
+
expect(onChange).not.toBeCalled();
|
|
140
|
+
v.setValue({ shouldNotify: false, value: 2 });
|
|
141
|
+
expect(onChange).not.toBeCalled();
|
|
142
|
+
expect(v.getValue()).toEqual({ shouldNotify: false, value: 2 });
|
|
143
|
+
v.setValue({ shouldNotify: true, value: 3 });
|
|
144
|
+
expect(onChange).toBeCalledTimes(1);
|
|
145
|
+
expect(onChange).toBeCalledWith({ shouldNotify: true, value: 3 });
|
|
146
|
+
});
|
|
147
|
+
});
|
|
122
148
|
});
|
|
123
149
|
//# 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,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,
|
|
1
|
+
{"version":3,"file":"observable-value.spec.js","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"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"}
|
package/esm/trace.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,EAAE,OAAO,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,EAAE,KAAK,SAAS,OAAO,EAAE;IACzG;;OAEG;IACH,MAAM,EAAE,CAAC,CAAA;IACT;;OAEG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;IACrD;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,CAAA;IAChF;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;IAErD;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK,SAAS,GAAG,EAAE;IAClD;;OAEG;IACH,aAAa,EAAE,IAAI,CAAA;IAEnB;;OAEG;IACH,eAAe,EAAE,KAAK,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,QAAQ,EAAE,KAAK,SAAS,GAAG,EAAE,CAAE,SAAQ,eAAe,CAAC,KAAK,CAAC;IAChG,QAAQ,EAAE,QAAQ,CAAA;IAClB,gBAAgB,EAAE,IAAI,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,GAAG,EAAE,CAAE,SAAQ,eAAe,CAAC,KAAK,CAAC;IACnF,KAAK,EAAE,GAAG,CAAA;IACV,aAAa,EAAE,IAAI,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,QAAQ,EAAE,KAAK,SAAS,GAAG,EAAE;IAC1D;;OAEG;IACH,cAAc,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAA;IAC5C;;OAEG;IACH,cAAc,EAAE,eAAe,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;IAEvD,kBAAkB,EAAE,eAAe,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IACpE,eAAe,EAAE,eAAe,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAA;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;CACvD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAC,YAAY,CAAsC;IAEjE,OAAO,CAAC,MAAM,CAAC,cAAc;IAQ7B,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB,OAAO,CAAC,MAAM,CAAC,aAAa;IAe5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAgBzB,OAAO,CAAC,MAAM,CAAC,UAAU;mBAiBJ,eAAe;IAiBpC;;;;OAIG;WACW,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,GAAG,EAAE,KAAK,SAAS,GAAG,EAAE,EACjG,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAC7C,UAAU;
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,EAAE,OAAO,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,EAAE,KAAK,SAAS,OAAO,EAAE;IACzG;;OAEG;IACH,MAAM,EAAE,CAAC,CAAA;IACT;;OAEG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;IACrD;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,CAAA;IAChF;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;IAErD;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK,SAAS,GAAG,EAAE;IAClD;;OAEG;IACH,aAAa,EAAE,IAAI,CAAA;IAEnB;;OAEG;IACH,eAAe,EAAE,KAAK,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,QAAQ,EAAE,KAAK,SAAS,GAAG,EAAE,CAAE,SAAQ,eAAe,CAAC,KAAK,CAAC;IAChG,QAAQ,EAAE,QAAQ,CAAA;IAClB,gBAAgB,EAAE,IAAI,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,GAAG,EAAE,CAAE,SAAQ,eAAe,CAAC,KAAK,CAAC;IACnF,KAAK,EAAE,GAAG,CAAA;IACV,aAAa,EAAE,IAAI,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,QAAQ,EAAE,KAAK,SAAS,GAAG,EAAE;IAC1D;;OAEG;IACH,cAAc,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAA;IAC5C;;OAEG;IACH,cAAc,EAAE,eAAe,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;IAEvD,kBAAkB,EAAE,eAAe,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IACpE,eAAe,EAAE,eAAe,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAA;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;CACvD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAC,YAAY,CAAsC;IAEjE,OAAO,CAAC,MAAM,CAAC,cAAc;IAQ7B,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB,OAAO,CAAC,MAAM,CAAC,aAAa;IAe5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAgBzB,OAAO,CAAC,MAAM,CAAC,UAAU;mBAiBJ,eAAe;IAiBpC;;;;OAIG;WACW,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,GAAG,EAAE,KAAK,SAAS,GAAG,EAAE,EACjG,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAC7C,UAAU;CAuDd"}
|
package/esm/trace.js
CHANGED
|
@@ -106,9 +106,22 @@ export class Trace {
|
|
|
106
106
|
if (!objectTrace.methodMappings.has(options.method.name)) {
|
|
107
107
|
objectTrace.methodMappings.set(options.method.name, {
|
|
108
108
|
originalMethod: options.method,
|
|
109
|
-
callObservable: new ObservableValue(
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
callObservable: new ObservableValue({
|
|
110
|
+
methodArguments: [],
|
|
111
|
+
startDateTime: new Date(''),
|
|
112
|
+
}),
|
|
113
|
+
finishedObservable: new ObservableValue({
|
|
114
|
+
methodArguments: [],
|
|
115
|
+
startDateTime: new Date(''),
|
|
116
|
+
finishedDateTime: new Date(''),
|
|
117
|
+
returned: undefined,
|
|
118
|
+
}),
|
|
119
|
+
errorObservable: new ObservableValue({
|
|
120
|
+
methodArguments: [],
|
|
121
|
+
startDateTime: new Date(''),
|
|
122
|
+
errorDateTime: new Date(''),
|
|
123
|
+
error: undefined,
|
|
124
|
+
}),
|
|
112
125
|
});
|
|
113
126
|
}
|
|
114
127
|
const methodTrace = objectTrace.methodMappings.get(options.method.name);
|
package/esm/trace.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
|
package/esm/value-observer.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { Disposable } from './disposable.js';
|
|
2
2
|
import type { ObservableValue, ValueChangeCallback } from './observable-value.js';
|
|
3
|
+
export type ValueObserverOptions<T> = {
|
|
4
|
+
filter?: (nextValue: T, lastValue: T) => boolean;
|
|
5
|
+
};
|
|
3
6
|
/**
|
|
4
7
|
* Defines a generic ValueObserver instance
|
|
5
8
|
*
|
|
@@ -25,6 +28,7 @@ import type { ObservableValue, ValueChangeCallback } from './observable-value.js
|
|
|
25
28
|
export declare class ValueObserver<T> implements Disposable {
|
|
26
29
|
readonly observable: ObservableValue<T>;
|
|
27
30
|
callback: ValueChangeCallback<T>;
|
|
31
|
+
readonly options?: ValueObserverOptions<T> | undefined;
|
|
28
32
|
/**
|
|
29
33
|
* Disposes the ValueObserver instance. Unsubscribes from the observable
|
|
30
34
|
*/
|
|
@@ -33,7 +37,8 @@ export declare class ValueObserver<T> implements Disposable {
|
|
|
33
37
|
* @constructs ValueObserver<T> the ValueObserver instance
|
|
34
38
|
* @param observable The related Observable object
|
|
35
39
|
* @param callback The callback that will be fired on change
|
|
40
|
+
* @param options Additional options
|
|
36
41
|
*/
|
|
37
|
-
constructor(observable: ObservableValue<T>, callback: ValueChangeCallback<T>);
|
|
42
|
+
constructor(observable: ObservableValue<T>, callback: ValueChangeCallback<T>, options?: ValueObserverOptions<T> | undefined);
|
|
38
43
|
}
|
|
39
44
|
//# sourceMappingURL=value-observer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-observer.d.ts","sourceRoot":"","sources":["../src/value-observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAEjF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,aAAa,CAAC,CAAC,CAAE,YAAW,UAAU;
|
|
1
|
+
{"version":3,"file":"value-observer.d.ts","sourceRoot":"","sources":["../src/value-observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAEjF,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI;IACpC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,OAAO,CAAA;CACjD,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,aAAa,CAAC,CAAC,CAAE,YAAW,UAAU;aAe/B,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;IACvC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC;aACvB,OAAO,CAAC;IAhB1B;;OAEG;IACI,OAAO;IAId;;;;;OAKG;gBAEe,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EACvC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACvB,OAAO,CAAC,qCAAyB;CAEpD"}
|
package/esm/value-observer.js
CHANGED
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
export class ValueObserver {
|
|
24
24
|
observable;
|
|
25
25
|
callback;
|
|
26
|
+
options;
|
|
26
27
|
/**
|
|
27
28
|
* Disposes the ValueObserver instance. Unsubscribes from the observable
|
|
28
29
|
*/
|
|
@@ -33,10 +34,12 @@ export class ValueObserver {
|
|
|
33
34
|
* @constructs ValueObserver<T> the ValueObserver instance
|
|
34
35
|
* @param observable The related Observable object
|
|
35
36
|
* @param callback The callback that will be fired on change
|
|
37
|
+
* @param options Additional options
|
|
36
38
|
*/
|
|
37
|
-
constructor(observable, callback) {
|
|
39
|
+
constructor(observable, callback, options) {
|
|
38
40
|
this.observable = observable;
|
|
39
41
|
this.callback = callback;
|
|
42
|
+
this.options = options;
|
|
40
43
|
}
|
|
41
44
|
}
|
|
42
45
|
//# sourceMappingURL=value-observer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-observer.js","sourceRoot":"","sources":["../src/value-observer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"value-observer.js","sourceRoot":"","sources":["../src/value-observer.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,aAAa;IAeN;IACT;IACS;IAhBlB;;OAEG;IACI,OAAO;QACZ,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;IAED;;;;;OAKG;IACH,YACkB,UAA8B,EACvC,QAAgC,EACvB,OAAiC;QAFjC,eAAU,GAAV,UAAU,CAAoB;QACvC,aAAQ,GAAR,QAAQ,CAAwB;QACvB,YAAO,GAAP,OAAO,CAA0B;IAChD,CAAC;CACL"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"description": "General utilities",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -35,6 +35,6 @@
|
|
|
35
35
|
"homepage": "https://github.com/furystack/furystack",
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"typescript": "^5.4.2",
|
|
38
|
-
"vitest": "^1.
|
|
38
|
+
"vitest": "^1.4.0"
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { EventHub } from './event-hub.js'
|
|
2
|
+
import { describe, expect, it, vi } from 'vitest'
|
|
3
|
+
|
|
4
|
+
describe('EventHub', () => {
|
|
5
|
+
it('Should fail on type errors', () => {
|
|
6
|
+
const eventHub = new EventHub<
|
|
7
|
+
'ExampleNumberEvent' | 'ExampleStringEvent',
|
|
8
|
+
{ ExampleNumberEvent: number; ExampleStringEvent: string }
|
|
9
|
+
>()
|
|
10
|
+
const numberListener = vi.fn((_val: number) => {})
|
|
11
|
+
const stringListener = vi.fn((_val: string) => {})
|
|
12
|
+
// @ts-expect-error Type 'string' is not assignable to type 'number'
|
|
13
|
+
eventHub.addListener('ExampleNumberEvent', stringListener)
|
|
14
|
+
// @ts-expect-error Type 'string' is not assignable to type 'number'
|
|
15
|
+
eventHub.emit('ExampleNumberEvent', '1')
|
|
16
|
+
|
|
17
|
+
// @ts-expect-error Type 'number' is not assignable to type 'string'
|
|
18
|
+
eventHub.addListener('ExampleStringEvent', numberListener)
|
|
19
|
+
// @ts-expect-error Type 'number' is not assignable to type 'string'
|
|
20
|
+
eventHub.emit('ExampleStringEvent', 1)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it('Should remove a listener', () => {
|
|
24
|
+
// Arrange
|
|
25
|
+
const eventHub = new EventHub<'ExampleNumberEvent', { ExampleNumberEvent: number }>()
|
|
26
|
+
const numberListener = vi.fn((_val: number) => {})
|
|
27
|
+
|
|
28
|
+
// Act
|
|
29
|
+
eventHub.addListener('ExampleNumberEvent', numberListener)
|
|
30
|
+
eventHub.removeListener('ExampleNumberEvent', numberListener)
|
|
31
|
+
eventHub.emit('ExampleNumberEvent', 1)
|
|
32
|
+
|
|
33
|
+
// Assert
|
|
34
|
+
expect(numberListener).not.toBeCalled()
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('should distribute events through listeners', () => {
|
|
38
|
+
// Arrange
|
|
39
|
+
const eventHub = new EventHub<
|
|
40
|
+
'ExampleNumberEvent' | 'ExampleStringEvent' | 'ExampleObjectEvent1' | 'ExampleObjectEvent2',
|
|
41
|
+
{
|
|
42
|
+
ExampleNumberEvent: number
|
|
43
|
+
ExampleStringEvent: string
|
|
44
|
+
ExampleObjectEvent1: { a: number }
|
|
45
|
+
ExampleObjectEvent2: { b: string }
|
|
46
|
+
}
|
|
47
|
+
>()
|
|
48
|
+
const numberListener = vi.fn((_val: number) => {})
|
|
49
|
+
|
|
50
|
+
const stringListener = vi.fn((_val: string) => {})
|
|
51
|
+
|
|
52
|
+
const objectListener1 = vi.fn((_val: { a: number }) => {})
|
|
53
|
+
|
|
54
|
+
const objectListener2 = vi.fn((_val: { b: string }) => {})
|
|
55
|
+
|
|
56
|
+
// Act
|
|
57
|
+
eventHub.addListener('ExampleNumberEvent', numberListener)
|
|
58
|
+
eventHub.emit('ExampleNumberEvent', 1)
|
|
59
|
+
|
|
60
|
+
eventHub.addListener('ExampleStringEvent', stringListener)
|
|
61
|
+
eventHub.emit('ExampleStringEvent', '1')
|
|
62
|
+
|
|
63
|
+
eventHub.addListener('ExampleObjectEvent1', objectListener1)
|
|
64
|
+
eventHub.emit('ExampleObjectEvent1', { a: 1 })
|
|
65
|
+
|
|
66
|
+
eventHub.addListener('ExampleObjectEvent2', objectListener2)
|
|
67
|
+
eventHub.emit('ExampleObjectEvent2', { b: '1' })
|
|
68
|
+
|
|
69
|
+
// Assert
|
|
70
|
+
expect(numberListener).toBeCalledWith(1)
|
|
71
|
+
expect(numberListener).toBeCalledTimes(1)
|
|
72
|
+
|
|
73
|
+
expect(stringListener).toBeCalledWith('1')
|
|
74
|
+
expect(stringListener).toBeCalledTimes(1)
|
|
75
|
+
|
|
76
|
+
expect(objectListener1).toBeCalledWith({ a: 1 })
|
|
77
|
+
expect(objectListener1).toBeCalledTimes(1)
|
|
78
|
+
|
|
79
|
+
expect(objectListener2).toBeCalledWith({ b: '1' })
|
|
80
|
+
expect(objectListener2).toBeCalledTimes(1)
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('Should add and remove a listener with subscription', () => {
|
|
84
|
+
const eventHub = new EventHub<'ExampleNumberEvent', { ExampleNumberEvent: number }>()
|
|
85
|
+
const numberListener = vi.fn((_val: number) => {})
|
|
86
|
+
|
|
87
|
+
const subscription = eventHub.subscribe('ExampleNumberEvent', numberListener)
|
|
88
|
+
eventHub.emit('ExampleNumberEvent', 1)
|
|
89
|
+
|
|
90
|
+
expect(numberListener).toBeCalledWith(1)
|
|
91
|
+
subscription.dispose()
|
|
92
|
+
eventHub.emit('ExampleNumberEvent', 2)
|
|
93
|
+
expect(numberListener).toBeCalledTimes(1)
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
it('should clear all listeners on dispose', () => {
|
|
97
|
+
const hub = new EventHub<'test', { test: string }>()
|
|
98
|
+
|
|
99
|
+
const listener = vi.fn((_val: string) => {})
|
|
100
|
+
|
|
101
|
+
hub.addListener('test', listener)
|
|
102
|
+
hub.dispose()
|
|
103
|
+
hub.emit('test', 'test')
|
|
104
|
+
expect(listener).not.toBeCalled()
|
|
105
|
+
})
|
|
106
|
+
})
|
package/src/event-hub.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Disposable } from './disposable.js'
|
|
2
|
+
|
|
3
|
+
type ListenerFunction<T extends string, EventTypeMap extends { [K in T]: any }> = (arg: EventTypeMap[T]) => void
|
|
4
|
+
|
|
5
|
+
export class EventHub<T extends string, EventTypeMap extends { [K in T]: any }> implements Disposable {
|
|
6
|
+
private listeners = new Map<T, Set<ListenerFunction<T, EventTypeMap>>>()
|
|
7
|
+
|
|
8
|
+
public addListener<TEvent extends T>(event: TEvent, listener: ListenerFunction<TEvent, EventTypeMap>) {
|
|
9
|
+
if (!this.listeners.has(event)) {
|
|
10
|
+
this.listeners.set(event, new Set())
|
|
11
|
+
}
|
|
12
|
+
this.listeners.get(event)!.add(listener as ListenerFunction<T, EventTypeMap>)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public removeListener<TEvent extends T>(event: TEvent, listener: ListenerFunction<TEvent, EventTypeMap>) {
|
|
16
|
+
if (this.listeners.has(event)) {
|
|
17
|
+
this.listeners.get(event)!.delete(listener as ListenerFunction<T, EventTypeMap>)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public subscribe<TEvent extends T>(event: TEvent, listener: ListenerFunction<TEvent, EventTypeMap>): Disposable {
|
|
22
|
+
this.addListener(event, listener)
|
|
23
|
+
return { dispose: () => this.removeListener(event, listener) }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public emit<TEvent extends T>(event: TEvent, arg: EventTypeMap[TEvent]) {
|
|
27
|
+
if (this.listeners.has(event)) {
|
|
28
|
+
this.listeners.get(event)!.forEach((listener) => listener(arg))
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public dispose() {
|
|
33
|
+
this.listeners.clear()
|
|
34
|
+
}
|
|
35
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -5,26 +5,15 @@ import { ObservableValue } from './observable-value.js'
|
|
|
5
5
|
* Observable Value tests
|
|
6
6
|
*/
|
|
7
7
|
export const observableTests = describe('Observable', () => {
|
|
8
|
-
it('should be constructed
|
|
9
|
-
const v = new ObservableValue()
|
|
10
|
-
const doneCallback = vi.fn()
|
|
11
|
-
v.subscribe(() => {
|
|
12
|
-
expect(v.getValue()).toBe(undefined)
|
|
13
|
-
doneCallback()
|
|
14
|
-
}, true)
|
|
8
|
+
it('should be constructed with an undefined initial value', () => {
|
|
9
|
+
const v = new ObservableValue(undefined)
|
|
15
10
|
expect(v).toBeInstanceOf(ObservableValue)
|
|
16
|
-
expect(
|
|
11
|
+
expect(v.getValue()).toBe(undefined)
|
|
17
12
|
})
|
|
18
13
|
|
|
19
14
|
it('should be constructed with initial value', () => {
|
|
20
15
|
const v = new ObservableValue(1)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
v.subscribe(() => {
|
|
24
|
-
expect(v.getValue()).toBe(1)
|
|
25
|
-
doneCallback()
|
|
26
|
-
}, true)
|
|
27
|
-
expect(doneCallback).toBeCalled()
|
|
16
|
+
expect(v.getValue()).toBe(1)
|
|
28
17
|
})
|
|
29
18
|
|
|
30
19
|
describe('Subscription callback', () => {
|
|
@@ -35,21 +24,21 @@ export const observableTests = describe('Observable', () => {
|
|
|
35
24
|
v.subscribe(() => {
|
|
36
25
|
expect(v.getValue()).toBe(2)
|
|
37
26
|
doneCallback()
|
|
38
|
-
}
|
|
27
|
+
})
|
|
39
28
|
v.setValue(1)
|
|
40
29
|
v.setValue(1)
|
|
41
30
|
v.setValue(2)
|
|
42
31
|
expect(doneCallback).toBeCalledTimes(1)
|
|
43
32
|
})
|
|
44
33
|
|
|
45
|
-
it('should be triggered only on change
|
|
34
|
+
it('should be triggered only on change', () => {
|
|
46
35
|
const v = new ObservableValue(1)
|
|
47
36
|
const doneCallback = vi.fn()
|
|
48
37
|
|
|
49
38
|
v.subscribe((value) => {
|
|
50
39
|
expect(value).toBe(2)
|
|
51
40
|
doneCallback()
|
|
52
|
-
}
|
|
41
|
+
})
|
|
53
42
|
v.setValue(2)
|
|
54
43
|
expect(doneCallback).toBeCalledTimes(1)
|
|
55
44
|
})
|
|
@@ -141,4 +130,51 @@ export const observableTests = describe('Observable', () => {
|
|
|
141
130
|
expect(doneCallback).toBeCalledTimes(1)
|
|
142
131
|
})
|
|
143
132
|
})
|
|
133
|
+
|
|
134
|
+
describe('Custom Compare function', () => {
|
|
135
|
+
it('Should compare the values with the custom compare function', () => {
|
|
136
|
+
const v = new ObservableValue(
|
|
137
|
+
{ value: 2 },
|
|
138
|
+
{
|
|
139
|
+
compare: (a, b) => a.value !== b.value,
|
|
140
|
+
},
|
|
141
|
+
)
|
|
142
|
+
const onChange = vi.fn()
|
|
143
|
+
v.subscribe(onChange)
|
|
144
|
+
|
|
145
|
+
v.setValue({ value: 2 })
|
|
146
|
+
expect(v.getValue()).toEqual({ value: 2 })
|
|
147
|
+
expect(onChange).not.toBeCalled()
|
|
148
|
+
|
|
149
|
+
v.setValue({ value: 3 })
|
|
150
|
+
expect(v.getValue()).toEqual({ value: 3 })
|
|
151
|
+
expect(onChange).toBeCalledTimes(1)
|
|
152
|
+
expect(onChange).toBeCalledWith({ value: 3 })
|
|
153
|
+
|
|
154
|
+
v.setValue({ value: 3 })
|
|
155
|
+
expect(v.getValue()).toEqual({ value: 3 })
|
|
156
|
+
expect(onChange).toBeCalledTimes(1)
|
|
157
|
+
})
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
describe('Filtered subscriptions', () => {
|
|
161
|
+
it('should not trigger the callback if the filter returns false', () => {
|
|
162
|
+
const v = new ObservableValue({ shouldNotify: true, value: 1 })
|
|
163
|
+
const onChange = vi.fn()
|
|
164
|
+
v.subscribe(onChange, {
|
|
165
|
+
filter: (nextValue) => nextValue.shouldNotify,
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
v.setValue({ shouldNotify: false, value: 1 })
|
|
169
|
+
expect(onChange).not.toBeCalled()
|
|
170
|
+
|
|
171
|
+
v.setValue({ shouldNotify: false, value: 2 })
|
|
172
|
+
expect(onChange).not.toBeCalled()
|
|
173
|
+
expect(v.getValue()).toEqual({ shouldNotify: false, value: 2 })
|
|
174
|
+
|
|
175
|
+
v.setValue({ shouldNotify: true, value: 3 })
|
|
176
|
+
expect(onChange).toBeCalledTimes(1)
|
|
177
|
+
expect(onChange).toBeCalledWith({ shouldNotify: true, value: 3 })
|
|
178
|
+
})
|
|
179
|
+
})
|
|
144
180
|
})
|
package/src/observable-value.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Disposable } from './disposable.js'
|
|
2
|
+
import type { ValueObserverOptions } from './value-observer.js'
|
|
2
3
|
import { ValueObserver } from './value-observer.js'
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -15,6 +16,18 @@ export class ObservableAlreadyDisposedError extends Error {
|
|
|
15
16
|
*/
|
|
16
17
|
export type ValueChangeCallback<T> = (next: T) => void
|
|
17
18
|
|
|
19
|
+
export type ObservableValueOptions<T> = {
|
|
20
|
+
/**
|
|
21
|
+
* Defines a custom compare function to determine if the value should be updated and the observers should be notified
|
|
22
|
+
* @param lastValue the last value
|
|
23
|
+
* @param nextValue the next value
|
|
24
|
+
* @returns if the value should be updated and the observers should be notified
|
|
25
|
+
*/
|
|
26
|
+
compare: (lastValue: T, nextValue: T) => boolean
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const defaultComparer = <T>(a: T, b: T) => a !== b
|
|
30
|
+
|
|
18
31
|
/**
|
|
19
32
|
* Defines an ObservableValue value object.
|
|
20
33
|
*
|
|
@@ -48,25 +61,24 @@ export class ObservableValue<T> implements Disposable {
|
|
|
48
61
|
public dispose() {
|
|
49
62
|
this.observers.clear()
|
|
50
63
|
this._isDisposed = true
|
|
64
|
+
// @ts-expect-error getting currentValue after disposing is not allowed
|
|
65
|
+
this.currentValue = null
|
|
51
66
|
}
|
|
52
67
|
private observers: Set<ValueObserver<T>> = new Set()
|
|
53
|
-
private currentValue
|
|
68
|
+
private currentValue: T
|
|
54
69
|
|
|
55
70
|
/**
|
|
56
71
|
* Subscribes to a value changes
|
|
57
72
|
* @param callback The callback method that will be called on each change
|
|
58
|
-
* @param
|
|
73
|
+
* @param options Additional ObservableValue options
|
|
59
74
|
* @returns The ValueObserver instance
|
|
60
75
|
*/
|
|
61
|
-
public subscribe(callback: ValueChangeCallback<T>,
|
|
76
|
+
public subscribe(callback: ValueChangeCallback<T>, options?: ValueObserverOptions<T>) {
|
|
62
77
|
if (this._isDisposed) {
|
|
63
78
|
throw new ObservableAlreadyDisposedError()
|
|
64
79
|
}
|
|
65
|
-
const observer = new ValueObserver<T>(this, callback)
|
|
80
|
+
const observer = new ValueObserver<T>(this, callback, options)
|
|
66
81
|
this.observers.add(observer)
|
|
67
|
-
if (getLast) {
|
|
68
|
-
callback(this.currentValue)
|
|
69
|
-
}
|
|
70
82
|
return observer
|
|
71
83
|
}
|
|
72
84
|
|
|
@@ -98,11 +110,13 @@ export class ObservableValue<T> implements Disposable {
|
|
|
98
110
|
if (this._isDisposed) {
|
|
99
111
|
throw new ObservableAlreadyDisposedError()
|
|
100
112
|
}
|
|
101
|
-
if (this.currentValue
|
|
113
|
+
if (this.options.compare(this.currentValue, newValue)) {
|
|
102
114
|
this.currentValue = newValue
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
115
|
+
this.observers.forEach((observer) => {
|
|
116
|
+
if (observer.options?.filter?.(this.currentValue, newValue) !== false) {
|
|
117
|
+
observer.callback(newValue)
|
|
118
|
+
}
|
|
119
|
+
})
|
|
106
120
|
}
|
|
107
121
|
}
|
|
108
122
|
|
|
@@ -114,12 +128,17 @@ export class ObservableValue<T> implements Disposable {
|
|
|
114
128
|
return [...this.observers] as ReadonlyArray<ValueObserver<T>>
|
|
115
129
|
}
|
|
116
130
|
|
|
131
|
+
private readonly options: ObservableValueOptions<T>
|
|
132
|
+
|
|
117
133
|
/**
|
|
118
134
|
* @param initialValue Optional initial value
|
|
135
|
+
* @param options Additional options
|
|
119
136
|
*/
|
|
120
|
-
constructor(initialValue?: T) {
|
|
121
|
-
|
|
122
|
-
|
|
137
|
+
constructor(initialValue: T, options?: Partial<ObservableValueOptions<T>>) {
|
|
138
|
+
this.options = {
|
|
139
|
+
compare: defaultComparer,
|
|
140
|
+
...options,
|
|
123
141
|
}
|
|
142
|
+
this.currentValue = initialValue
|
|
124
143
|
}
|
|
125
144
|
}
|
package/src/trace.ts
CHANGED
|
@@ -229,10 +229,23 @@ export class Trace {
|
|
|
229
229
|
if (!objectTrace.methodMappings.has(options.method.name)) {
|
|
230
230
|
objectTrace.methodMappings.set(options.method.name, {
|
|
231
231
|
originalMethod: options.method,
|
|
232
|
-
callObservable: new ObservableValue<TraceMethodCall<
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
232
|
+
callObservable: new ObservableValue<TraceMethodCall<any>>({
|
|
233
|
+
methodArguments: [],
|
|
234
|
+
startDateTime: new Date(''),
|
|
235
|
+
}),
|
|
236
|
+
finishedObservable: new ObservableValue<TraceMethodFinished<ReturnType<TMethod>, any>>({
|
|
237
|
+
methodArguments: [],
|
|
238
|
+
startDateTime: new Date(''),
|
|
239
|
+
finishedDateTime: new Date(''),
|
|
240
|
+
returned: undefined as ReturnType<TMethod>,
|
|
241
|
+
}),
|
|
242
|
+
errorObservable: new ObservableValue<TraceMethodError<any>>({
|
|
243
|
+
methodArguments: [],
|
|
244
|
+
startDateTime: new Date(''),
|
|
245
|
+
errorDateTime: new Date(''),
|
|
246
|
+
error: undefined,
|
|
247
|
+
}),
|
|
248
|
+
})
|
|
236
249
|
}
|
|
237
250
|
const methodTrace = objectTrace.methodMappings.get(options.method.name) as any as MethodMapping<
|
|
238
251
|
ReturnType<TMethod>,
|
package/src/value-observer.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { Disposable } from './disposable.js'
|
|
2
2
|
import type { ObservableValue, ValueChangeCallback } from './observable-value.js'
|
|
3
3
|
|
|
4
|
+
export type ValueObserverOptions<T> = {
|
|
5
|
+
filter?: (nextValue: T, lastValue: T) => boolean
|
|
6
|
+
}
|
|
7
|
+
|
|
4
8
|
/**
|
|
5
9
|
* Defines a generic ValueObserver instance
|
|
6
10
|
*
|
|
@@ -35,9 +39,11 @@ export class ValueObserver<T> implements Disposable {
|
|
|
35
39
|
* @constructs ValueObserver<T> the ValueObserver instance
|
|
36
40
|
* @param observable The related Observable object
|
|
37
41
|
* @param callback The callback that will be fired on change
|
|
42
|
+
* @param options Additional options
|
|
38
43
|
*/
|
|
39
44
|
constructor(
|
|
40
45
|
public readonly observable: ObservableValue<T>,
|
|
41
46
|
public callback: ValueChangeCallback<T>,
|
|
47
|
+
public readonly options?: ValueObserverOptions<T>,
|
|
42
48
|
) {}
|
|
43
49
|
}
|