@matter/general 0.13.0-alpha.0-20250318-c1aa38b08 → 0.13.0-alpha.0-20250323-770919c6a
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/dist/cjs/codec/DnsCodec.js +1 -1
- package/dist/cjs/codec/DnsCodec.js.map +1 -1
- package/dist/cjs/log/Console.d.ts +21 -0
- package/dist/cjs/log/Console.d.ts.map +1 -0
- package/dist/cjs/log/Console.js +58 -0
- package/dist/cjs/log/Console.js.map +6 -0
- package/dist/cjs/log/Diagnostic.d.ts +6 -0
- package/dist/cjs/log/Diagnostic.d.ts.map +1 -1
- package/dist/cjs/log/Diagnostic.js +16 -0
- package/dist/cjs/log/Diagnostic.js.map +1 -1
- package/dist/cjs/log/LogDestination.d.ts +67 -0
- package/dist/cjs/log/LogDestination.d.ts.map +1 -0
- package/dist/cjs/log/LogDestination.js +65 -0
- package/dist/cjs/log/LogDestination.js.map +6 -0
- package/dist/cjs/log/LogFormat.d.ts +18 -12
- package/dist/cjs/log/LogFormat.d.ts.map +1 -1
- package/dist/cjs/log/LogFormat.js +17 -24
- package/dist/cjs/log/LogFormat.js.map +1 -1
- package/dist/cjs/log/LogLevel.d.ts +19 -9
- package/dist/cjs/log/LogLevel.d.ts.map +1 -1
- package/dist/cjs/log/LogLevel.js +40 -25
- package/dist/cjs/log/LogLevel.js.map +1 -1
- package/dist/cjs/log/Logger.d.ts +165 -109
- package/dist/cjs/log/Logger.d.ts.map +1 -1
- package/dist/cjs/log/Logger.js +307 -254
- package/dist/cjs/log/Logger.js.map +2 -2
- package/dist/cjs/log/index.d.ts +1 -0
- package/dist/cjs/log/index.d.ts.map +1 -1
- package/dist/cjs/log/index.js +1 -0
- package/dist/cjs/log/index.js.map +1 -1
- package/dist/cjs/time/Time.d.ts +1 -0
- package/dist/cjs/time/Time.d.ts.map +1 -1
- package/dist/cjs/time/Time.js +3 -0
- package/dist/cjs/time/Time.js.map +1 -1
- package/dist/cjs/transaction/Participant.d.ts +3 -3
- package/dist/cjs/transaction/Participant.d.ts.map +1 -1
- package/dist/cjs/transaction/Transaction.d.ts +20 -20
- package/dist/cjs/transaction/Tx.js +3 -3
- package/dist/cjs/transaction/Tx.js.map +1 -1
- package/dist/cjs/util/Construction.js +2 -2
- package/dist/cjs/util/Construction.js.map +1 -1
- package/dist/cjs/util/DataReadQueue.d.ts +4 -0
- package/dist/cjs/util/DataReadQueue.d.ts.map +1 -1
- package/dist/cjs/util/DataReadQueue.js +6 -0
- package/dist/cjs/util/DataReadQueue.js.map +1 -1
- package/dist/cjs/util/FormattedText.js +4 -2
- package/dist/cjs/util/FormattedText.js.map +1 -1
- package/dist/cjs/util/Observable.d.ts +137 -12
- package/dist/cjs/util/Observable.d.ts.map +1 -1
- package/dist/cjs/util/Observable.js +297 -35
- package/dist/cjs/util/Observable.js.map +2 -2
- package/dist/esm/codec/DnsCodec.js +1 -1
- package/dist/esm/codec/DnsCodec.js.map +1 -1
- package/dist/esm/log/Console.d.ts +21 -0
- package/dist/esm/log/Console.d.ts.map +1 -0
- package/dist/esm/log/Console.js +38 -0
- package/dist/esm/log/Console.js.map +6 -0
- package/dist/esm/log/Diagnostic.d.ts +6 -0
- package/dist/esm/log/Diagnostic.d.ts.map +1 -1
- package/dist/esm/log/Diagnostic.js +16 -0
- package/dist/esm/log/Diagnostic.js.map +1 -1
- package/dist/esm/log/LogDestination.d.ts +67 -0
- package/dist/esm/log/LogDestination.d.ts.map +1 -0
- package/dist/esm/log/LogDestination.js +45 -0
- package/dist/esm/log/LogDestination.js.map +6 -0
- package/dist/esm/log/LogFormat.d.ts +18 -12
- package/dist/esm/log/LogFormat.d.ts.map +1 -1
- package/dist/esm/log/LogFormat.js +17 -24
- package/dist/esm/log/LogFormat.js.map +1 -1
- package/dist/esm/log/LogLevel.d.ts +19 -9
- package/dist/esm/log/LogLevel.d.ts.map +1 -1
- package/dist/esm/log/LogLevel.js +40 -25
- package/dist/esm/log/LogLevel.js.map +1 -1
- package/dist/esm/log/Logger.d.ts +165 -109
- package/dist/esm/log/Logger.d.ts.map +1 -1
- package/dist/esm/log/Logger.js +307 -254
- package/dist/esm/log/Logger.js.map +2 -2
- package/dist/esm/log/index.d.ts +1 -0
- package/dist/esm/log/index.d.ts.map +1 -1
- package/dist/esm/log/index.js +1 -0
- package/dist/esm/log/index.js.map +1 -1
- package/dist/esm/time/Time.d.ts +1 -0
- package/dist/esm/time/Time.d.ts.map +1 -1
- package/dist/esm/time/Time.js +3 -0
- package/dist/esm/time/Time.js.map +1 -1
- package/dist/esm/transaction/Participant.d.ts +3 -3
- package/dist/esm/transaction/Participant.d.ts.map +1 -1
- package/dist/esm/transaction/Transaction.d.ts +20 -20
- package/dist/esm/transaction/Tx.js +3 -3
- package/dist/esm/transaction/Tx.js.map +1 -1
- package/dist/esm/util/Construction.js +2 -2
- package/dist/esm/util/Construction.js.map +1 -1
- package/dist/esm/util/DataReadQueue.d.ts +4 -0
- package/dist/esm/util/DataReadQueue.d.ts.map +1 -1
- package/dist/esm/util/DataReadQueue.js +6 -0
- package/dist/esm/util/DataReadQueue.js.map +1 -1
- package/dist/esm/util/FormattedText.js +4 -2
- package/dist/esm/util/FormattedText.js.map +1 -1
- package/dist/esm/util/Observable.d.ts +137 -12
- package/dist/esm/util/Observable.d.ts.map +1 -1
- package/dist/esm/util/Observable.js +297 -35
- package/dist/esm/util/Observable.js.map +2 -2
- package/package.json +2 -2
- package/src/codec/DnsCodec.ts +1 -1
- package/src/log/Console.ts +52 -0
- package/src/log/Diagnostic.ts +21 -0
- package/src/log/LogDestination.ts +113 -0
- package/src/log/LogFormat.ts +39 -36
- package/src/log/LogLevel.ts +55 -25
- package/src/log/Logger.ts +394 -314
- package/src/log/index.ts +1 -0
- package/src/time/Time.ts +4 -0
- package/src/transaction/Participant.ts +3 -3
- package/src/transaction/Transaction.ts +1 -1
- package/src/transaction/Tx.ts +3 -3
- package/src/util/Construction.ts +2 -2
- package/src/util/DataReadQueue.ts +7 -0
- package/src/util/FormattedText.ts +4 -2
- package/src/util/Observable.ts +453 -47
|
@@ -55,11 +55,36 @@ export interface Observable<T extends any[] = any[], R = void> extends AsyncIter
|
|
|
55
55
|
*/
|
|
56
56
|
isObservedBy(observer: Observer<T, R>): boolean;
|
|
57
57
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
58
|
+
* Errors throw by observers will interrupt emitters unless an error handler is installed here and the handler does
|
|
59
|
+
* not rethrow.
|
|
60
|
+
*
|
|
61
|
+
* The only exception to this is if {@link handlePromise} is false and an observer is asynchronous. In this case
|
|
62
|
+
* the emitter cannot be made aware of the exception.
|
|
63
|
+
*/
|
|
64
|
+
handleError: ObserverErrorHandler;
|
|
65
|
+
/**
|
|
66
|
+
* We allow emitters to be async, but we do not want to overburden either the emitter or the observer with promise
|
|
67
|
+
* tracking if the lifetime of the observer is not relevant to the emitter.
|
|
68
|
+
*
|
|
69
|
+
* To facilitate this we allow observables to be configured in one of three promise handling modes:
|
|
70
|
+
*
|
|
71
|
+
* * If you set handlePromise, isAsync is true; the handler is invoked for any observer promise
|
|
72
|
+
*
|
|
73
|
+
* * If isAsync is true but you do not set handlePromise, any observer promise is returned to the emitter which must
|
|
74
|
+
* handle the promise
|
|
75
|
+
*
|
|
76
|
+
* * If isAsync is false, we log observer promise errors but the promise is otherwise untracked
|
|
77
|
+
*
|
|
78
|
+
* If the promiseHandler returns a promise or is true and the emitter returns a promise, the observable will emit to
|
|
79
|
+
* successive observers only after the promise resolves.
|
|
80
|
+
*/
|
|
81
|
+
isAsync: boolean;
|
|
82
|
+
/**
|
|
83
|
+
* A promise handler.
|
|
84
|
+
*
|
|
85
|
+
* If you set {@link isAsync} (either true or false) the promise handler is set by the Observable.
|
|
61
86
|
*/
|
|
62
|
-
|
|
87
|
+
handlePromise: ObserverPromiseHandler | boolean;
|
|
63
88
|
/**
|
|
64
89
|
* Observable supports standard "for await (const value of observable").
|
|
65
90
|
*
|
|
@@ -81,18 +106,22 @@ export declare const observant: unique symbol;
|
|
|
81
106
|
* An {@link Observable} that explicitly supports asynchronous observers.
|
|
82
107
|
*/
|
|
83
108
|
export interface AsyncObservable<T extends any[] = any[], R = void> extends Observable<T, MaybePromise<R>> {
|
|
84
|
-
isAsync: true;
|
|
85
109
|
}
|
|
86
110
|
export type ObserverErrorHandler = (error: Error, observer: Observer<any[], any>) => void;
|
|
111
|
+
export type ObserverPromiseHandler = (promise: Promise<unknown>, observer: Observer<any[], any>) => unknown;
|
|
87
112
|
/**
|
|
88
113
|
* A concrete {@link Observable} implementation.
|
|
89
114
|
*/
|
|
90
115
|
export declare class BasicObservable<T extends any[] = any[], R = void> implements Observable<T, R> {
|
|
91
116
|
#private;
|
|
92
|
-
constructor(
|
|
117
|
+
constructor(handleError?: ObserverErrorHandler, asyncConfig?: ObserverPromiseHandler | boolean);
|
|
93
118
|
[Symbol.dispose](): void;
|
|
94
|
-
|
|
95
|
-
|
|
119
|
+
set handleError(handleError: ObserverErrorHandler);
|
|
120
|
+
get handleError(): ObserverErrorHandler;
|
|
121
|
+
set isAsync(isAsync: boolean);
|
|
122
|
+
get isAsync(): boolean;
|
|
123
|
+
set handlePromise(handlePromise: ObserverPromiseHandler);
|
|
124
|
+
get handlePromise(): ObserverPromiseHandler;
|
|
96
125
|
get isObserved(): boolean;
|
|
97
126
|
isObservedBy(observer: Observer<T, R>): boolean;
|
|
98
127
|
emit(...payload: T): R | undefined;
|
|
@@ -113,8 +142,8 @@ export declare const Observable: {
|
|
|
113
142
|
* Create an {@link AsyncObservable} that explicitly supports asynchronous results
|
|
114
143
|
*/
|
|
115
144
|
export declare const AsyncObservable: {
|
|
116
|
-
new <T extends any[], R = void>(
|
|
117
|
-
<T extends any[], R = void>(
|
|
145
|
+
new <T extends any[], R = void>(handleError?: ObserverErrorHandler): AsyncObservable<T, R>;
|
|
146
|
+
<T extends any[], R = void>(handleError?: ObserverErrorHandler): AsyncObservable<T, R>;
|
|
118
147
|
};
|
|
119
148
|
/**
|
|
120
149
|
* A set of observables. You can bind events using individual observables or the methods emulating a subset Node's
|
|
@@ -123,9 +152,13 @@ export declare const AsyncObservable: {
|
|
|
123
152
|
* To maintain type safety, implementers define events as observable child properties.
|
|
124
153
|
*/
|
|
125
154
|
export declare class EventEmitter {
|
|
155
|
+
private events?;
|
|
126
156
|
emit<This, N extends EventEmitter.NamesOf<This>>(this: This, name: N, ...payload: EventEmitter.PayloadOf<This, N>): void;
|
|
127
157
|
addListener<This, N extends EventEmitter.NamesOf<This>>(this: This, name: N, handler: EventEmitter.ObserverOf<This, N>): void;
|
|
128
158
|
removeListener<This, N extends EventEmitter.NamesOf<This>>(this: This, name: N, handler: EventEmitter.ObserverOf<This, N>): void;
|
|
159
|
+
addEvent(name: string, event?: Observable): void;
|
|
160
|
+
getEvent(name: string): Observable<any[], void>;
|
|
161
|
+
hasEvent(name: string, onlyIfInitialized?: boolean): boolean | Observable<any[], void> | undefined;
|
|
129
162
|
get eventNames(): string[];
|
|
130
163
|
[Symbol.dispose](): void;
|
|
131
164
|
}
|
|
@@ -151,7 +184,7 @@ export declare namespace EventEmitter {
|
|
|
151
184
|
/**
|
|
152
185
|
* An {@link Observable} that proxies to another {@link Observable}.
|
|
153
186
|
*
|
|
154
|
-
*
|
|
187
|
+
* Events emitted here instead emit on the target {@link Observable}. Events emitted on the target emit locally via
|
|
155
188
|
* a listener installed by the proxy.
|
|
156
189
|
*
|
|
157
190
|
* This is useful for managing a subset of {@link Observer}s for an {@link Observable}.
|
|
@@ -162,9 +195,9 @@ export declare class ObservableProxy extends BasicObservable {
|
|
|
162
195
|
#private;
|
|
163
196
|
constructor(target: Observable);
|
|
164
197
|
[Symbol.dispose](): void;
|
|
165
|
-
get isAsync(): boolean | undefined;
|
|
166
198
|
get isObserved(): boolean;
|
|
167
199
|
emit: (...payload: any) => any | undefined;
|
|
200
|
+
protected get target(): Observable<any[], void>;
|
|
168
201
|
}
|
|
169
202
|
/**
|
|
170
203
|
* A collection of observers managed as a unit. This makes it convenient to deregister multiple observers when an
|
|
@@ -201,4 +234,96 @@ export declare namespace ObserverGroup {
|
|
|
201
234
|
*/
|
|
202
235
|
type VarArgs<T extends any[]> = T extends [...infer R, infer A] ? [...R, A] : T extends [infer A] ? A : [];
|
|
203
236
|
}
|
|
237
|
+
/**
|
|
238
|
+
* An {@link Observable} that emits an algorithmically-reduced number of events.
|
|
239
|
+
*/
|
|
240
|
+
export declare class QuietObservable<T extends any[] = any[]> extends BasicObservable<T> implements QuietObservable.State<T> {
|
|
241
|
+
#private;
|
|
242
|
+
constructor(config?: QuietObservable.Configuration<T>);
|
|
243
|
+
get config(): QuietObservable.Configuration<T>;
|
|
244
|
+
set config(config: QuietObservable.Configuration<T>);
|
|
245
|
+
get emitAutomatically(): boolean;
|
|
246
|
+
set emitAutomatically(value: boolean);
|
|
247
|
+
get suppressionEnabled(): boolean;
|
|
248
|
+
set suppressionEnabled(value: boolean);
|
|
249
|
+
get minimumEmitIntervalMs(): number;
|
|
250
|
+
set minimumEmitIntervalMs(value: number);
|
|
251
|
+
get source(): Observable<T> | undefined;
|
|
252
|
+
set source(source: Observable<T> | undefined);
|
|
253
|
+
get sink(): Observable<T> | undefined;
|
|
254
|
+
set sink(sink: Observable<T> | undefined);
|
|
255
|
+
get shouldEmit(): QuietObservable.EmitPredicate<T> | undefined;
|
|
256
|
+
set shouldEmit(shouldEmit: QuietObservable.EmitPredicate<T> | undefined);
|
|
257
|
+
get isObserved(): boolean;
|
|
258
|
+
isObservedBy(observer: Observer<T>): boolean;
|
|
259
|
+
emit(...payload: T): void;
|
|
260
|
+
/**
|
|
261
|
+
* Emit immediately, regardless of suppression configuration.
|
|
262
|
+
*/
|
|
263
|
+
emitNow(): void;
|
|
264
|
+
/**
|
|
265
|
+
* Emit as soon as allowed by suppression.
|
|
266
|
+
*/
|
|
267
|
+
emitSoon(): void;
|
|
268
|
+
[Symbol.dispose](): void;
|
|
269
|
+
}
|
|
270
|
+
export declare namespace QuietObservable {
|
|
271
|
+
interface State<T extends any[] = any[]> {
|
|
272
|
+
/**
|
|
273
|
+
* If true this observable will emit within the suppression constraints. If false it will only emit after calls
|
|
274
|
+
* to {@link emitSoon} or {@link emitNow}.
|
|
275
|
+
*/
|
|
276
|
+
emitAutomatically: boolean;
|
|
277
|
+
/**
|
|
278
|
+
* If true then emit rate is constrained. If false emits will occur immediately.
|
|
279
|
+
*/
|
|
280
|
+
suppressionEnabled: boolean;
|
|
281
|
+
/**
|
|
282
|
+
* The minimum time between emits in milliseconds.
|
|
283
|
+
*/
|
|
284
|
+
minimumEmitIntervalMs: number;
|
|
285
|
+
/**
|
|
286
|
+
* An input observable this observable will automatically observe to produce events.
|
|
287
|
+
*/
|
|
288
|
+
source?: Observable<T>;
|
|
289
|
+
/**
|
|
290
|
+
* An output observable this observable will automatically emit to whenever it emits.
|
|
291
|
+
*/
|
|
292
|
+
sink?: Observable<T>;
|
|
293
|
+
/**
|
|
294
|
+
* A predicate that determine whether a payload should emit.
|
|
295
|
+
*/
|
|
296
|
+
shouldEmit?: EmitPredicate<T>;
|
|
297
|
+
/**
|
|
298
|
+
* Handler for errors returned by observers.
|
|
299
|
+
*/
|
|
300
|
+
handleError?: ObserverErrorHandler;
|
|
301
|
+
/**
|
|
302
|
+
* Designates async support (overridden if you supply {@link handlePromise}).
|
|
303
|
+
*/
|
|
304
|
+
isAsync?: boolean;
|
|
305
|
+
/**
|
|
306
|
+
* Handler for promises returned by observers.
|
|
307
|
+
*/
|
|
308
|
+
handlePromise?: ObserverPromiseHandler;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* An emit predicate may emit this value to force immediate emit.
|
|
312
|
+
*/
|
|
313
|
+
const now = "now";
|
|
314
|
+
/**
|
|
315
|
+
* The return value of an emit predicate. "true" allows the event to emit as normal, "false" prevents the event
|
|
316
|
+
* from emitting, and {@link now} forces immediate emit regardless of interval configuration.
|
|
317
|
+
*/
|
|
318
|
+
type EmitDirective = true | false | typeof now;
|
|
319
|
+
/**
|
|
320
|
+
* A predicate that may filter emits manually.
|
|
321
|
+
*/
|
|
322
|
+
interface EmitPredicate<T extends any[] = any[]> {
|
|
323
|
+
(...payload: T): EmitDirective;
|
|
324
|
+
}
|
|
325
|
+
interface Configuration<T extends any[] = any[]> extends Partial<State<T>> {
|
|
326
|
+
}
|
|
327
|
+
const defaults: State;
|
|
328
|
+
}
|
|
204
329
|
//# sourceMappingURL=Observable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Observable.d.ts","sourceRoot":"","sources":["../../../src/util/Observable.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"Observable.d.ts","sourceRoot":"","sources":["../../../src/util/Observable.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Copyright 2022-2025 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { Time } from "#time/Time.js";
|
|
6
7
|
import { ImplementationError } from "../MatterError.js";
|
|
7
8
|
import { Logger } from "../log/Logger.js";
|
|
8
9
|
import "../polyfills/disposable.js";
|
|
@@ -14,26 +15,63 @@ function defaultErrorHandler(error) {
|
|
|
14
15
|
throw error;
|
|
15
16
|
}
|
|
16
17
|
class BasicObservable {
|
|
17
|
-
#
|
|
18
|
+
#handleError;
|
|
19
|
+
#isAsync;
|
|
20
|
+
#handlePromise;
|
|
18
21
|
#observers;
|
|
19
22
|
#once;
|
|
20
|
-
#isAsync;
|
|
21
23
|
#joinIteration;
|
|
22
24
|
#removeIterator;
|
|
23
25
|
#stopIteration;
|
|
24
|
-
constructor(
|
|
25
|
-
this
|
|
26
|
-
|
|
26
|
+
constructor(handleError, asyncConfig) {
|
|
27
|
+
this.handleError = handleError ?? defaultErrorHandler;
|
|
28
|
+
if (typeof asyncConfig === "function") {
|
|
29
|
+
this.handlePromise = asyncConfig;
|
|
30
|
+
} else {
|
|
31
|
+
this.isAsync = asyncConfig ?? false;
|
|
32
|
+
}
|
|
27
33
|
}
|
|
28
34
|
[Symbol.dispose]() {
|
|
29
35
|
this.#observers = this.#once = void 0;
|
|
30
36
|
this.#stopIteration?.();
|
|
31
37
|
}
|
|
32
|
-
|
|
33
|
-
|
|
38
|
+
set handleError(handleError) {
|
|
39
|
+
this.#handleError = handleError;
|
|
40
|
+
}
|
|
41
|
+
get handleError() {
|
|
42
|
+
return this.#handleError;
|
|
34
43
|
}
|
|
35
44
|
set isAsync(isAsync) {
|
|
36
45
|
this.#isAsync = isAsync;
|
|
46
|
+
if (isAsync) {
|
|
47
|
+
this.#handlePromise = (promise) => promise;
|
|
48
|
+
} else {
|
|
49
|
+
this.#handlePromise = (promise, observer) => {
|
|
50
|
+
promise.catch((error) => {
|
|
51
|
+
let identity;
|
|
52
|
+
if (observer.name) {
|
|
53
|
+
identity = ` "${observer.name}"`;
|
|
54
|
+
} else {
|
|
55
|
+
identity = "";
|
|
56
|
+
}
|
|
57
|
+
if (this.#handleError === defaultErrorHandler) {
|
|
58
|
+
logger.error(`Unhandled error in async observer${identity}:`, error);
|
|
59
|
+
} else {
|
|
60
|
+
this.#handleError(error, observer);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
get isAsync() {
|
|
67
|
+
return this.#isAsync;
|
|
68
|
+
}
|
|
69
|
+
set handlePromise(handlePromise) {
|
|
70
|
+
this.isAsync = true;
|
|
71
|
+
this.#handlePromise = handlePromise;
|
|
72
|
+
}
|
|
73
|
+
get handlePromise() {
|
|
74
|
+
return this.#handlePromise;
|
|
37
75
|
}
|
|
38
76
|
get isObserved() {
|
|
39
77
|
if (this.#observers) {
|
|
@@ -70,7 +108,7 @@ class BasicObservable {
|
|
|
70
108
|
try {
|
|
71
109
|
result = observer(...payload);
|
|
72
110
|
} catch (e) {
|
|
73
|
-
this.#
|
|
111
|
+
this.#handleError(asError(e), observer);
|
|
74
112
|
}
|
|
75
113
|
if (this.#once?.has(observer)) {
|
|
76
114
|
this.#once.delete(observer);
|
|
@@ -80,25 +118,18 @@ class BasicObservable {
|
|
|
80
118
|
continue;
|
|
81
119
|
}
|
|
82
120
|
if (MaybePromise.is(result)) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
);
|
|
121
|
+
result = this.#handlePromise(Promise.resolve(result), observer);
|
|
122
|
+
if (MaybePromise.is(result)) {
|
|
123
|
+
return result.then((result2) => {
|
|
124
|
+
if (result2 === void 0) {
|
|
125
|
+
return emitNext();
|
|
126
|
+
}
|
|
127
|
+
return result2;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
if (result === void 0) {
|
|
94
131
|
continue;
|
|
95
132
|
}
|
|
96
|
-
return result.then((result2) => {
|
|
97
|
-
if (result2 === void 0) {
|
|
98
|
-
return emitNext();
|
|
99
|
-
}
|
|
100
|
-
return result2;
|
|
101
|
-
});
|
|
102
133
|
}
|
|
103
134
|
return result;
|
|
104
135
|
}
|
|
@@ -175,12 +206,12 @@ class BasicObservable {
|
|
|
175
206
|
};
|
|
176
207
|
}
|
|
177
208
|
}
|
|
178
|
-
function constructObservable(
|
|
179
|
-
return new BasicObservable(
|
|
209
|
+
function constructObservable(handleError) {
|
|
210
|
+
return new BasicObservable(handleError);
|
|
180
211
|
}
|
|
181
212
|
const Observable = constructObservable;
|
|
182
|
-
function constructAsyncObservable(
|
|
183
|
-
return new BasicObservable(
|
|
213
|
+
function constructAsyncObservable(handleError) {
|
|
214
|
+
return new BasicObservable(handleError, true);
|
|
184
215
|
}
|
|
185
216
|
const AsyncObservable = constructAsyncObservable;
|
|
186
217
|
function event(emitter, name) {
|
|
@@ -191,6 +222,8 @@ function event(emitter, name) {
|
|
|
191
222
|
return observer;
|
|
192
223
|
}
|
|
193
224
|
class EventEmitter {
|
|
225
|
+
// True private screws up TS types
|
|
226
|
+
events;
|
|
194
227
|
emit(name, ...payload) {
|
|
195
228
|
event(this, name).emit(...payload);
|
|
196
229
|
}
|
|
@@ -200,13 +233,32 @@ class EventEmitter {
|
|
|
200
233
|
removeListener(name, handler) {
|
|
201
234
|
event(this, name).off(handler);
|
|
202
235
|
}
|
|
236
|
+
addEvent(name, event2) {
|
|
237
|
+
if (!this.events) {
|
|
238
|
+
this.events = {};
|
|
239
|
+
}
|
|
240
|
+
this.events[name] = event2;
|
|
241
|
+
}
|
|
242
|
+
getEvent(name) {
|
|
243
|
+
if (!this.events || !(name in this.events)) {
|
|
244
|
+
throw new ImplementationError(`No such event ${name}`);
|
|
245
|
+
}
|
|
246
|
+
return this.events[name] ?? (this.events[name] = Observable());
|
|
247
|
+
}
|
|
248
|
+
hasEvent(name, onlyIfInitialized = false) {
|
|
249
|
+
return this.events && (onlyIfInitialized ? this.events[name] : name in this.events);
|
|
250
|
+
}
|
|
203
251
|
get eventNames() {
|
|
204
|
-
return Object.keys(this
|
|
252
|
+
return this.events ? Object.keys(this.events) : [];
|
|
205
253
|
}
|
|
206
254
|
[Symbol.dispose]() {
|
|
207
|
-
|
|
208
|
-
|
|
255
|
+
if (!this.events) {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
for (const event2 of Object.values(this.events)) {
|
|
259
|
+
event2?.[Symbol.dispose]?.();
|
|
209
260
|
}
|
|
261
|
+
this.events = void 0;
|
|
210
262
|
}
|
|
211
263
|
}
|
|
212
264
|
class ObservableProxy extends BasicObservable {
|
|
@@ -227,13 +279,13 @@ class ObservableProxy extends BasicObservable {
|
|
|
227
279
|
this.#target.off(this.#emitter);
|
|
228
280
|
super[Symbol.dispose]();
|
|
229
281
|
}
|
|
230
|
-
get isAsync() {
|
|
231
|
-
return this.#target.isAsync;
|
|
232
|
-
}
|
|
233
282
|
get isObserved() {
|
|
234
283
|
return this.#target.isObserved;
|
|
235
284
|
}
|
|
236
285
|
emit;
|
|
286
|
+
get target() {
|
|
287
|
+
return this.#target;
|
|
288
|
+
}
|
|
237
289
|
}
|
|
238
290
|
class ObserverGroup {
|
|
239
291
|
#defaultTarget;
|
|
@@ -305,6 +357,215 @@ class ObserverGroup {
|
|
|
305
357
|
this.#boundObservers.clear();
|
|
306
358
|
}
|
|
307
359
|
}
|
|
360
|
+
class QuietObservable extends BasicObservable {
|
|
361
|
+
#emitAutomatically = QuietObservable.defaults.emitAutomatically;
|
|
362
|
+
#suppressionEnabled = QuietObservable.defaults.suppressionEnabled;
|
|
363
|
+
#minimumEmitIntervalMs = QuietObservable.defaults.minimumEmitIntervalMs;
|
|
364
|
+
#shouldEmit;
|
|
365
|
+
#source;
|
|
366
|
+
#sink;
|
|
367
|
+
#sourceObserver;
|
|
368
|
+
#sinkObserver;
|
|
369
|
+
#deferredPayload;
|
|
370
|
+
#lastEmitAt;
|
|
371
|
+
#emitTimer;
|
|
372
|
+
constructor(config) {
|
|
373
|
+
super();
|
|
374
|
+
if (config) {
|
|
375
|
+
this.config = config;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
get config() {
|
|
379
|
+
return this;
|
|
380
|
+
}
|
|
381
|
+
set config(config) {
|
|
382
|
+
const { suppressionEnabled, minimumEmitIntervalMs, emitAutomatically } = config;
|
|
383
|
+
if (emitAutomatically !== void 0) {
|
|
384
|
+
this.emitAutomatically = emitAutomatically;
|
|
385
|
+
}
|
|
386
|
+
if (suppressionEnabled !== void 0) {
|
|
387
|
+
this.suppressionEnabled = suppressionEnabled;
|
|
388
|
+
}
|
|
389
|
+
if (minimumEmitIntervalMs !== void 0) {
|
|
390
|
+
this.minimumEmitIntervalMs = minimumEmitIntervalMs;
|
|
391
|
+
}
|
|
392
|
+
if ("shouldEmit" in config) {
|
|
393
|
+
this.shouldEmit = config.shouldEmit;
|
|
394
|
+
}
|
|
395
|
+
if ("source" in config) {
|
|
396
|
+
this.source = config.source;
|
|
397
|
+
}
|
|
398
|
+
if ("sink" in config) {
|
|
399
|
+
this.sink = config.sink;
|
|
400
|
+
}
|
|
401
|
+
if ("handleError" in config) {
|
|
402
|
+
this.handleError = config.handleError ?? defaultErrorHandler;
|
|
403
|
+
}
|
|
404
|
+
if ("handlePromise" in config && config.handlePromise) {
|
|
405
|
+
this.handlePromise = config.handlePromise;
|
|
406
|
+
} else {
|
|
407
|
+
this.isAsync = config.isAsync ?? false;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
get emitAutomatically() {
|
|
411
|
+
return this.#emitAutomatically;
|
|
412
|
+
}
|
|
413
|
+
set emitAutomatically(value) {
|
|
414
|
+
this.#emitAutomatically = value;
|
|
415
|
+
if (value) {
|
|
416
|
+
this.emitSoon();
|
|
417
|
+
} else if (this.#emitTimer) {
|
|
418
|
+
this.#stop();
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
get suppressionEnabled() {
|
|
422
|
+
return this.#suppressionEnabled;
|
|
423
|
+
}
|
|
424
|
+
set suppressionEnabled(value) {
|
|
425
|
+
this.#suppressionEnabled = value;
|
|
426
|
+
}
|
|
427
|
+
get minimumEmitIntervalMs() {
|
|
428
|
+
return this.#minimumEmitIntervalMs;
|
|
429
|
+
}
|
|
430
|
+
set minimumEmitIntervalMs(value) {
|
|
431
|
+
if (this.#minimumEmitIntervalMs === value) {
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
const needStart = this.#emitTimer !== void 0;
|
|
435
|
+
if (needStart) {
|
|
436
|
+
this.#stop();
|
|
437
|
+
}
|
|
438
|
+
this.#minimumEmitIntervalMs = value;
|
|
439
|
+
if (needStart) {
|
|
440
|
+
this.#start();
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
get source() {
|
|
444
|
+
return this.#source;
|
|
445
|
+
}
|
|
446
|
+
set source(source) {
|
|
447
|
+
if (this.#source === source) {
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
if (this.#source && this.#sourceObserver) {
|
|
451
|
+
this.#source.off(this.#sourceObserver);
|
|
452
|
+
} else if (this.#sourceObserver === void 0) {
|
|
453
|
+
this.#sourceObserver = (...payload) => this.emit(...payload);
|
|
454
|
+
}
|
|
455
|
+
this.#source = source;
|
|
456
|
+
if (source) {
|
|
457
|
+
source.on(this.#sourceObserver);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
get sink() {
|
|
461
|
+
return this.#sink;
|
|
462
|
+
}
|
|
463
|
+
set sink(sink) {
|
|
464
|
+
if (this.#sink === sink) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
if (this.#sink && this.#sinkObserver) {
|
|
468
|
+
this.off(this.#sinkObserver);
|
|
469
|
+
}
|
|
470
|
+
this.#sink = sink;
|
|
471
|
+
if (sink) {
|
|
472
|
+
this.#sinkObserver = (...payload) => sink.emit(...payload);
|
|
473
|
+
this.#sinkObserver[observant] = false;
|
|
474
|
+
this.on(this.#sinkObserver);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
get shouldEmit() {
|
|
478
|
+
return this.#shouldEmit;
|
|
479
|
+
}
|
|
480
|
+
set shouldEmit(shouldEmit) {
|
|
481
|
+
this.#shouldEmit = shouldEmit;
|
|
482
|
+
if (this.#deferredPayload && shouldEmit?.(...this.#deferredPayload) === false) {
|
|
483
|
+
this.#deferredPayload = void 0;
|
|
484
|
+
this.#stop();
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
get isObserved() {
|
|
488
|
+
return super.isObserved || this.#sink?.isObserved || false;
|
|
489
|
+
}
|
|
490
|
+
isObservedBy(observer) {
|
|
491
|
+
return this.#sink?.isObservedBy(observer) || this.isObservedBy(observer) || false;
|
|
492
|
+
}
|
|
493
|
+
emit(...payload) {
|
|
494
|
+
const shouldEmit = this.#shouldEmit?.(...payload);
|
|
495
|
+
if (shouldEmit === false) {
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
const immediate = shouldEmit === "now";
|
|
499
|
+
if (!immediate && !this.#emitAutomatically) {
|
|
500
|
+
this.#deferredPayload = payload;
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
const now = Time.nowMs();
|
|
504
|
+
if (immediate || !this.#suppressionEnabled || this.#lastEmitAt === void 0 || this.#lastEmitAt + this.#minimumEmitIntervalMs < now) {
|
|
505
|
+
return this.#emit(payload, now);
|
|
506
|
+
}
|
|
507
|
+
this.#deferredPayload = payload;
|
|
508
|
+
this.#start(now);
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Emit immediately, regardless of suppression configuration.
|
|
512
|
+
*/
|
|
513
|
+
emitNow() {
|
|
514
|
+
this.#stop();
|
|
515
|
+
if (this.#deferredPayload) {
|
|
516
|
+
this.#emit(this.#deferredPayload);
|
|
517
|
+
this.#deferredPayload = void 0;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Emit as soon as allowed by suppression.
|
|
522
|
+
*/
|
|
523
|
+
emitSoon() {
|
|
524
|
+
if (this.#deferredPayload && this.#emitTimer === void 0) {
|
|
525
|
+
this.#start();
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
[Symbol.dispose]() {
|
|
529
|
+
this.#stop();
|
|
530
|
+
}
|
|
531
|
+
#emit(payload, now) {
|
|
532
|
+
this.#deferredPayload = void 0;
|
|
533
|
+
this.#lastEmitAt = now ?? Time.nowMs();
|
|
534
|
+
this.#stop();
|
|
535
|
+
super.emit(...payload);
|
|
536
|
+
}
|
|
537
|
+
#start(now) {
|
|
538
|
+
if (this.#emitTimer || this.#deferredPayload === void 0) {
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
let timeout;
|
|
542
|
+
if (this.#lastEmitAt === void 0) {
|
|
543
|
+
timeout = 0;
|
|
544
|
+
} else {
|
|
545
|
+
timeout = this.#minimumEmitIntervalMs - ((now ?? Time.nowMs()) - this.#lastEmitAt);
|
|
546
|
+
}
|
|
547
|
+
if (timeout <= 0) {
|
|
548
|
+
this.emitNow();
|
|
549
|
+
} else {
|
|
550
|
+
this.#emitTimer = Time.getTimer("delayed emit", timeout, this.emitNow.bind(this));
|
|
551
|
+
this.#emitTimer.start();
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
#stop() {
|
|
555
|
+
if (this.#emitTimer) {
|
|
556
|
+
this.#emitTimer.stop();
|
|
557
|
+
this.#emitTimer = void 0;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
((QuietObservable2) => {
|
|
562
|
+
QuietObservable2.now = "now";
|
|
563
|
+
QuietObservable2.defaults = {
|
|
564
|
+
emitAutomatically: true,
|
|
565
|
+
suppressionEnabled: true,
|
|
566
|
+
minimumEmitIntervalMs: 1e3
|
|
567
|
+
};
|
|
568
|
+
})(QuietObservable || (QuietObservable = {}));
|
|
308
569
|
export {
|
|
309
570
|
AsyncObservable,
|
|
310
571
|
BasicObservable,
|
|
@@ -312,6 +573,7 @@ export {
|
|
|
312
573
|
Observable,
|
|
313
574
|
ObservableProxy,
|
|
314
575
|
ObserverGroup,
|
|
576
|
+
QuietObservable,
|
|
315
577
|
observant
|
|
316
578
|
};
|
|
317
579
|
//# sourceMappingURL=Observable.js.map
|