signalium 0.3.7 → 1.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/.turbo/turbo-build.log +3 -3
- package/CHANGELOG.md +21 -0
- package/build/react.js +19 -0
- package/build/transform.js +19 -0
- package/dist/cjs/config.d.ts +8 -3
- package/dist/cjs/config.d.ts.map +1 -1
- package/dist/cjs/config.js +14 -8
- package/dist/cjs/config.js.map +1 -1
- package/dist/cjs/debug.d.ts +2 -2
- package/dist/cjs/debug.d.ts.map +1 -1
- package/dist/cjs/debug.js +3 -3
- package/dist/cjs/debug.js.map +1 -1
- package/dist/cjs/hooks.d.ts +14 -42
- package/dist/cjs/hooks.d.ts.map +1 -1
- package/dist/cjs/hooks.js +19 -240
- package/dist/cjs/hooks.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +18 -18
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internals/async.d.ts +50 -0
- package/dist/cjs/internals/async.d.ts.map +1 -0
- package/dist/cjs/internals/async.js +390 -0
- package/dist/cjs/internals/async.js.map +1 -0
- package/dist/cjs/internals/connect.d.ts +4 -0
- package/dist/cjs/internals/connect.d.ts.map +1 -0
- package/dist/cjs/internals/connect.js +37 -0
- package/dist/cjs/internals/connect.js.map +1 -0
- package/dist/cjs/internals/consumer.d.ts +6 -0
- package/dist/cjs/internals/consumer.d.ts.map +1 -0
- package/dist/cjs/internals/consumer.js +13 -0
- package/dist/cjs/internals/consumer.js.map +1 -0
- package/dist/cjs/internals/contexts.d.ts +33 -0
- package/dist/cjs/internals/contexts.d.ts.map +1 -0
- package/dist/cjs/internals/contexts.js +103 -0
- package/dist/cjs/internals/contexts.js.map +1 -0
- package/dist/cjs/internals/derived.d.ts +66 -0
- package/dist/cjs/internals/derived.d.ts.map +1 -0
- package/dist/cjs/internals/derived.js +128 -0
- package/dist/cjs/internals/derived.js.map +1 -0
- package/dist/cjs/internals/dirty.d.ts +5 -0
- package/dist/cjs/internals/dirty.d.ts.map +1 -0
- package/dist/cjs/internals/dirty.js +79 -0
- package/dist/cjs/internals/dirty.js.map +1 -0
- package/dist/cjs/internals/edge.d.ts +32 -0
- package/dist/cjs/internals/edge.d.ts.map +1 -0
- package/dist/cjs/internals/edge.js +59 -0
- package/dist/cjs/internals/edge.js.map +1 -0
- package/dist/cjs/internals/get.d.ts +10 -0
- package/dist/cjs/internals/get.d.ts.map +1 -0
- package/dist/cjs/internals/get.js +255 -0
- package/dist/cjs/internals/get.js.map +1 -0
- package/dist/cjs/internals/scheduling.d.ts +12 -0
- package/dist/cjs/internals/scheduling.d.ts.map +1 -0
- package/dist/cjs/internals/scheduling.js +117 -0
- package/dist/cjs/internals/scheduling.js.map +1 -0
- package/dist/cjs/internals/state.d.ts +18 -0
- package/dist/cjs/internals/state.d.ts.map +1 -0
- package/dist/cjs/internals/state.js +88 -0
- package/dist/cjs/internals/state.js.map +1 -0
- package/dist/cjs/internals/utils/debug-name.d.ts +2 -0
- package/dist/cjs/internals/utils/debug-name.d.ts.map +1 -0
- package/dist/cjs/internals/utils/debug-name.js +14 -0
- package/dist/cjs/internals/utils/debug-name.js.map +1 -0
- package/dist/cjs/internals/utils/equals.d.ts +3 -0
- package/dist/cjs/internals/utils/equals.d.ts.map +1 -0
- package/dist/cjs/internals/utils/equals.js +13 -0
- package/dist/cjs/internals/utils/equals.js.map +1 -0
- package/dist/cjs/internals/utils/hash.d.ts +7 -0
- package/dist/cjs/internals/utils/hash.d.ts.map +1 -0
- package/dist/cjs/internals/utils/hash.js +181 -0
- package/dist/cjs/internals/utils/hash.js.map +1 -0
- package/dist/cjs/internals/utils/stringify.d.ts +3 -0
- package/dist/cjs/internals/utils/stringify.d.ts.map +1 -0
- package/dist/cjs/{utils.js → internals/utils/stringify.js} +5 -27
- package/dist/cjs/internals/utils/stringify.js.map +1 -0
- package/dist/cjs/internals/utils/type-utils.d.ts +6 -0
- package/dist/cjs/internals/utils/type-utils.d.ts.map +1 -0
- package/dist/cjs/internals/utils/type-utils.js +22 -0
- package/dist/cjs/internals/utils/type-utils.js.map +1 -0
- package/dist/cjs/react/context.d.ts +1 -1
- package/dist/cjs/react/context.d.ts.map +1 -1
- package/dist/cjs/react/provider.d.ts +4 -3
- package/dist/cjs/react/provider.d.ts.map +1 -1
- package/dist/cjs/react/provider.js +7 -3
- package/dist/cjs/react/provider.js.map +1 -1
- package/dist/cjs/react/setup.d.ts.map +1 -1
- package/dist/cjs/react/setup.js +2 -1
- package/dist/cjs/react/setup.js.map +1 -1
- package/dist/cjs/react/signal-value.d.ts +5 -1
- package/dist/cjs/react/signal-value.d.ts.map +1 -1
- package/dist/cjs/react/signal-value.js +35 -45
- package/dist/cjs/react/signal-value.js.map +1 -1
- package/dist/cjs/trace.d.ts +32 -28
- package/dist/cjs/trace.d.ts.map +1 -1
- package/dist/cjs/trace.js +14 -16
- package/dist/cjs/trace.js.map +1 -1
- package/dist/cjs/transform.d.ts +6 -0
- package/dist/cjs/transform.d.ts.map +1 -0
- package/dist/cjs/transform.js +92 -0
- package/dist/cjs/transform.js.map +1 -0
- package/dist/cjs/types.d.ts +32 -40
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/config.d.ts +8 -3
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/config.js +12 -7
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/debug.d.ts +2 -2
- package/dist/esm/debug.d.ts.map +1 -1
- package/dist/esm/debug.js +2 -2
- package/dist/esm/debug.js.map +1 -1
- package/dist/esm/hooks.d.ts +14 -42
- package/dist/esm/hooks.d.ts.map +1 -1
- package/dist/esm/hooks.js +17 -226
- package/dist/esm/hooks.js.map +1 -1
- package/dist/esm/index.d.ts +5 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +5 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internals/async.d.ts +50 -0
- package/dist/esm/internals/async.d.ts.map +1 -0
- package/dist/esm/internals/async.js +383 -0
- package/dist/esm/internals/async.js.map +1 -0
- package/dist/esm/internals/connect.d.ts +4 -0
- package/dist/esm/internals/connect.d.ts.map +1 -0
- package/dist/esm/internals/connect.js +33 -0
- package/dist/esm/internals/connect.js.map +1 -0
- package/dist/esm/internals/consumer.d.ts +6 -0
- package/dist/esm/internals/consumer.d.ts.map +1 -0
- package/dist/esm/internals/consumer.js +9 -0
- package/dist/esm/internals/consumer.js.map +1 -0
- package/dist/esm/internals/contexts.d.ts +33 -0
- package/dist/esm/internals/contexts.d.ts.map +1 -0
- package/dist/esm/internals/contexts.js +92 -0
- package/dist/esm/internals/contexts.js.map +1 -0
- package/dist/esm/internals/derived.d.ts +66 -0
- package/dist/esm/internals/derived.d.ts.map +1 -0
- package/dist/esm/internals/derived.js +118 -0
- package/dist/esm/internals/derived.js.map +1 -0
- package/dist/esm/internals/dirty.d.ts +5 -0
- package/dist/esm/internals/dirty.d.ts.map +1 -0
- package/dist/esm/internals/dirty.js +75 -0
- package/dist/esm/internals/dirty.js.map +1 -0
- package/dist/esm/internals/edge.d.ts +32 -0
- package/dist/esm/internals/edge.d.ts.map +1 -0
- package/dist/esm/internals/edge.js +54 -0
- package/dist/esm/internals/edge.js.map +1 -0
- package/dist/esm/internals/get.d.ts +10 -0
- package/dist/esm/internals/get.d.ts.map +1 -0
- package/dist/esm/internals/get.js +247 -0
- package/dist/esm/internals/get.js.map +1 -0
- package/dist/esm/internals/scheduling.d.ts +12 -0
- package/dist/esm/internals/scheduling.d.ts.map +1 -0
- package/dist/esm/internals/scheduling.js +106 -0
- package/dist/esm/internals/scheduling.js.map +1 -0
- package/dist/esm/internals/state.d.ts +18 -0
- package/dist/esm/internals/state.d.ts.map +1 -0
- package/dist/esm/internals/state.js +82 -0
- package/dist/esm/internals/state.js.map +1 -0
- package/dist/esm/internals/utils/debug-name.d.ts +2 -0
- package/dist/esm/internals/utils/debug-name.d.ts.map +1 -0
- package/dist/esm/internals/utils/debug-name.js +11 -0
- package/dist/esm/internals/utils/debug-name.js.map +1 -0
- package/dist/esm/internals/utils/equals.d.ts +3 -0
- package/dist/esm/internals/utils/equals.d.ts.map +1 -0
- package/dist/esm/internals/utils/equals.js +9 -0
- package/dist/esm/internals/utils/equals.js.map +1 -0
- package/dist/esm/internals/utils/hash.d.ts +7 -0
- package/dist/esm/internals/utils/hash.d.ts.map +1 -0
- package/dist/esm/internals/utils/hash.js +174 -0
- package/dist/esm/internals/utils/hash.js.map +1 -0
- package/dist/esm/internals/utils/stringify.d.ts +3 -0
- package/dist/esm/internals/utils/stringify.d.ts.map +1 -0
- package/dist/esm/{utils.js → internals/utils/stringify.js} +4 -25
- package/dist/esm/internals/utils/stringify.js.map +1 -0
- package/dist/esm/internals/utils/type-utils.d.ts +6 -0
- package/dist/esm/internals/utils/type-utils.d.ts.map +1 -0
- package/dist/esm/internals/utils/type-utils.js +15 -0
- package/dist/esm/internals/utils/type-utils.js.map +1 -0
- package/dist/esm/react/context.d.ts +1 -1
- package/dist/esm/react/context.d.ts.map +1 -1
- package/dist/esm/react/provider.d.ts +4 -3
- package/dist/esm/react/provider.d.ts.map +1 -1
- package/dist/esm/react/provider.js +6 -2
- package/dist/esm/react/provider.js.map +1 -1
- package/dist/esm/react/setup.d.ts.map +1 -1
- package/dist/esm/react/setup.js +3 -2
- package/dist/esm/react/setup.js.map +1 -1
- package/dist/esm/react/signal-value.d.ts +5 -1
- package/dist/esm/react/signal-value.d.ts.map +1 -1
- package/dist/esm/react/signal-value.js +34 -45
- package/dist/esm/react/signal-value.js.map +1 -1
- package/dist/esm/trace.d.ts +32 -28
- package/dist/esm/trace.d.ts.map +1 -1
- package/dist/esm/trace.js +13 -15
- package/dist/esm/trace.js.map +1 -1
- package/dist/esm/transform.d.ts +6 -0
- package/dist/esm/transform.d.ts.map +1 -0
- package/dist/esm/transform.js +89 -0
- package/dist/esm/transform.js.map +1 -0
- package/dist/esm/types.d.ts +32 -40
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +23 -4
- package/src/__tests__/__snapshots__/context.test.ts.snap +2101 -0
- package/src/__tests__/__snapshots__/nesting.test.ts.snap +16201 -0
- package/src/__tests__/__snapshots__/params-and-state.test.ts.snap +1879 -0
- package/src/__tests__/async-task.test.ts +327 -0
- package/src/__tests__/context.test.ts +517 -0
- package/src/__tests__/nesting.test.ts +298 -0
- package/src/__tests__/params-and-state.test.ts +230 -0
- package/src/__tests__/reactive-async.test.ts +548 -0
- package/src/__tests__/reactive-sync.test.ts +130 -0
- package/src/__tests__/subscription.test.ts +510 -0
- package/src/__tests__/utils/async.ts +1 -1
- package/src/__tests__/utils/instrumented-hooks.ts +229 -124
- package/src/__tests__/utils/permute.ts +25 -14
- package/src/config.ts +19 -9
- package/src/debug.ts +2 -2
- package/src/hooks.ts +46 -380
- package/src/index.ts +7 -24
- package/src/internals/async.ts +556 -0
- package/src/internals/connect.ts +41 -0
- package/src/internals/consumer.ts +13 -0
- package/src/internals/contexts.ts +133 -0
- package/src/internals/derived.ts +208 -0
- package/src/internals/dirty.ts +91 -0
- package/src/internals/edge.ts +109 -0
- package/src/internals/get.ts +298 -0
- package/src/internals/scheduling.ts +140 -0
- package/src/internals/state.ts +111 -0
- package/src/internals/utils/debug-name.ts +14 -0
- package/src/internals/utils/equals.ts +12 -0
- package/src/internals/utils/hash.ts +221 -0
- package/src/{utils.ts → internals/utils/stringify.ts} +3 -29
- package/src/internals/utils/type-utils.ts +19 -0
- package/src/react/__tests__/async.test.tsx +704 -0
- package/src/react/__tests__/basic.test.tsx +95 -0
- package/src/react/__tests__/contexts.test.tsx +99 -0
- package/src/react/__tests__/subscriptions.test.tsx +49 -0
- package/src/react/__tests__/utils.tsx +40 -0
- package/src/react/context.ts +1 -1
- package/src/react/provider.tsx +12 -4
- package/src/react/setup.ts +3 -2
- package/src/react/signal-value.ts +47 -67
- package/src/trace.ts +43 -38
- package/src/transform.ts +113 -0
- package/src/types.ts +56 -46
- package/transform.js +19 -0
- package/vitest.workspace.ts +38 -2
- package/dist/cjs/scheduling.d.ts +0 -11
- package/dist/cjs/scheduling.d.ts.map +0 -1
- package/dist/cjs/scheduling.js +0 -108
- package/dist/cjs/scheduling.js.map +0 -1
- package/dist/cjs/signals.d.ts +0 -73
- package/dist/cjs/signals.d.ts.map +0 -1
- package/dist/cjs/signals.js +0 -632
- package/dist/cjs/signals.js.map +0 -1
- package/dist/cjs/utils.d.ts +0 -4
- package/dist/cjs/utils.d.ts.map +0 -1
- package/dist/cjs/utils.js.map +0 -1
- package/dist/esm/scheduling.d.ts +0 -11
- package/dist/esm/scheduling.d.ts.map +0 -1
- package/dist/esm/scheduling.js +0 -97
- package/dist/esm/scheduling.js.map +0 -1
- package/dist/esm/signals.d.ts +0 -73
- package/dist/esm/signals.d.ts.map +0 -1
- package/dist/esm/signals.js +0 -614
- package/dist/esm/signals.js.map +0 -1
- package/dist/esm/utils.d.ts +0 -4
- package/dist/esm/utils.d.ts.map +0 -1
- package/dist/esm/utils.js.map +0 -1
- package/src/__tests__/hooks/async-computed.test.ts +0 -190
- package/src/__tests__/hooks/async-task.test.ts +0 -334
- package/src/__tests__/hooks/computed.test.ts +0 -126
- package/src/__tests__/hooks/context.test.ts +0 -527
- package/src/__tests__/hooks/nesting.test.ts +0 -303
- package/src/__tests__/hooks/params-and-state.test.ts +0 -168
- package/src/__tests__/hooks/subscription.test.ts +0 -97
- package/src/__tests__/signals/async.test.ts +0 -416
- package/src/__tests__/signals/basic.test.ts +0 -399
- package/src/__tests__/signals/subscription.test.ts +0 -632
- package/src/__tests__/signals/watcher.test.ts +0 -253
- package/src/__tests__/utils/builders.ts +0 -22
- package/src/__tests__/utils/instrumented-signals.ts +0 -291
- package/src/react/__tests__/react.test.tsx +0 -227
- package/src/scheduling.ts +0 -130
- package/src/signals.ts +0 -824
@@ -0,0 +1,66 @@
|
|
1
|
+
import { Tracer, TracerMeta } from '../trace.js';
|
2
|
+
import { ReactiveValue, Signal, SignalEquals, SignalListener, SignalOptionsWithInit } from '../types.js';
|
3
|
+
import { SignalScope } from './contexts.js';
|
4
|
+
import { Edge } from './edge.js';
|
5
|
+
/**
|
6
|
+
* This file contains computed signal base types and struct definitions.
|
7
|
+
*
|
8
|
+
* Computed signals are monomorphic to make them more efficient, but this also
|
9
|
+
* means that multiple fields differ based on the type of the signal. Defining
|
10
|
+
* them using this pattern rather than a class allows us to switch on the `type`
|
11
|
+
* field to get strong typing in branches everywhere else.
|
12
|
+
*
|
13
|
+
* "Methods" for this struct are defined in other files for better organization.
|
14
|
+
*/
|
15
|
+
export type SignalId = number;
|
16
|
+
export declare const enum SignalState {
|
17
|
+
Clean = 0,
|
18
|
+
Pending = 1,
|
19
|
+
Dirty = 2,
|
20
|
+
MaybeDirty = 3
|
21
|
+
}
|
22
|
+
export declare const enum SignalFlags {
|
23
|
+
State = 3,
|
24
|
+
isSubscription = 4,
|
25
|
+
isListener = 8
|
26
|
+
}
|
27
|
+
interface ListenerMeta {
|
28
|
+
updatedAt: number;
|
29
|
+
current: Set<SignalListener>;
|
30
|
+
cachedBoundAdd: (listener: SignalListener) => () => void;
|
31
|
+
}
|
32
|
+
export declare class DerivedSignal<T, Args extends unknown[]> implements Signal<ReactiveValue<T>> {
|
33
|
+
private flags;
|
34
|
+
scope: SignalScope | undefined;
|
35
|
+
subs: Map<WeakRef<DerivedSignal<any, any>>, Edge>;
|
36
|
+
deps: Map<DerivedSignal<any, any>, Edge>;
|
37
|
+
ref: WeakRef<DerivedSignal<T, Args>>;
|
38
|
+
equals: SignalEquals<any>;
|
39
|
+
dirtyHead: Edge | undefined;
|
40
|
+
updatedCount: number;
|
41
|
+
computedCount: number;
|
42
|
+
watchCount: number;
|
43
|
+
_listeners: ListenerMeta | null;
|
44
|
+
compute: (...args: Args) => T;
|
45
|
+
args: Args;
|
46
|
+
value: ReactiveValue<T> | undefined;
|
47
|
+
tracerMeta?: TracerMeta;
|
48
|
+
constructor(isSubscription: boolean, compute: (...args: Args) => T, args: Args, key?: SignalId, scope?: SignalScope, opts?: Partial<SignalOptionsWithInit<T, Args>> & {
|
49
|
+
tracer?: Tracer;
|
50
|
+
});
|
51
|
+
get _state(): SignalState;
|
52
|
+
set _state(state: SignalState);
|
53
|
+
get _isListener(): boolean;
|
54
|
+
set _isListener(isListener: boolean);
|
55
|
+
get listeners(): ListenerMeta;
|
56
|
+
get(): ReactiveValue<T>;
|
57
|
+
addListener(listener: SignalListener): () => void;
|
58
|
+
addListenerLazy(): (listener: SignalListener) => () => void;
|
59
|
+
}
|
60
|
+
export declare const runListeners: (signal: DerivedSignal<any, any>) => void;
|
61
|
+
export declare const isSubscription: (signal: unknown) => boolean;
|
62
|
+
export declare function createDerivedSignal<T, Args extends unknown[]>(compute: (...args: Args) => T, args?: Args, key?: SignalId, scope?: SignalScope, opts?: Partial<SignalOptionsWithInit<T, Args>> & {
|
63
|
+
tracer?: Tracer;
|
64
|
+
}, isSubscription?: boolean): DerivedSignal<T, Args>;
|
65
|
+
export {};
|
66
|
+
//# sourceMappingURL=derived.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"derived.d.ts","sourceRoot":"","sources":["../../../src/internals/derived.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,118 @@
|
|
1
|
+
import WeakRef from '../weakref.js';
|
2
|
+
import { TRACER } from '../trace.js';
|
3
|
+
import { getUnknownSignalFnName } from './utils/debug-name.js';
|
4
|
+
import { getSignal } from './get.js';
|
5
|
+
import { schedulePull, scheduleUnwatch } from './scheduling.js';
|
6
|
+
import { hashValue } from './utils/hash.js';
|
7
|
+
import { stringifyValue } from './utils/stringify.js';
|
8
|
+
import { equalsFrom } from './utils/equals.js';
|
9
|
+
let ID = 0;
|
10
|
+
export class DerivedSignal {
|
11
|
+
// Bitmask containing state in the first 2 bits and boolean properties in the remaining bits
|
12
|
+
flags;
|
13
|
+
scope = undefined;
|
14
|
+
subs = new Map();
|
15
|
+
deps = new Map();
|
16
|
+
ref = new WeakRef(this);
|
17
|
+
equals;
|
18
|
+
dirtyHead = undefined;
|
19
|
+
updatedCount = 0;
|
20
|
+
computedCount = 0;
|
21
|
+
watchCount = 0;
|
22
|
+
_listeners = null;
|
23
|
+
compute;
|
24
|
+
args;
|
25
|
+
value;
|
26
|
+
tracerMeta;
|
27
|
+
constructor(isSubscription, compute, args, key, scope, opts) {
|
28
|
+
this.flags = (isSubscription ? 4 /* SignalFlags.isSubscription */ : 0) | 2 /* SignalState.Dirty */;
|
29
|
+
this.scope = scope;
|
30
|
+
this.compute = compute;
|
31
|
+
this.args = args;
|
32
|
+
this.equals = equalsFrom(opts?.equals);
|
33
|
+
this.value = opts?.initValue;
|
34
|
+
if (TRACER) {
|
35
|
+
this.tracerMeta = {
|
36
|
+
id: opts?.id ?? key ?? hashValue([compute, ID++]),
|
37
|
+
desc: opts?.desc ?? compute.name ?? getUnknownSignalFnName(compute),
|
38
|
+
params: args.map(arg => stringifyValue(arg)).join(', '),
|
39
|
+
tracer: opts?.tracer,
|
40
|
+
};
|
41
|
+
}
|
42
|
+
}
|
43
|
+
get _state() {
|
44
|
+
return this.flags & 3 /* SignalFlags.State */;
|
45
|
+
}
|
46
|
+
set _state(state) {
|
47
|
+
this.flags = (this.flags & ~3 /* SignalFlags.State */) | state;
|
48
|
+
}
|
49
|
+
get _isListener() {
|
50
|
+
return (this.flags & 8 /* SignalFlags.isListener */) !== 0;
|
51
|
+
}
|
52
|
+
set _isListener(isListener) {
|
53
|
+
if (isListener) {
|
54
|
+
this.flags |= 8 /* SignalFlags.isListener */;
|
55
|
+
}
|
56
|
+
else {
|
57
|
+
this.flags &= ~8 /* SignalFlags.isListener */;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
get listeners() {
|
61
|
+
return (this._listeners ??
|
62
|
+
(this._listeners = {
|
63
|
+
updatedAt: 0,
|
64
|
+
current: new Set(),
|
65
|
+
cachedBoundAdd: this.addListener.bind(this),
|
66
|
+
}));
|
67
|
+
}
|
68
|
+
get() {
|
69
|
+
return getSignal(this);
|
70
|
+
}
|
71
|
+
addListener(listener) {
|
72
|
+
const { current } = this.listeners;
|
73
|
+
if (!current.has(listener)) {
|
74
|
+
if (!this._isListener) {
|
75
|
+
this.watchCount++;
|
76
|
+
this.flags |= 8 /* SignalFlags.isListener */;
|
77
|
+
}
|
78
|
+
schedulePull(this);
|
79
|
+
current.add(listener);
|
80
|
+
}
|
81
|
+
return () => {
|
82
|
+
if (current.has(listener)) {
|
83
|
+
current.delete(listener);
|
84
|
+
if (current.size === 0) {
|
85
|
+
scheduleUnwatch(this);
|
86
|
+
this.flags &= ~8 /* SignalFlags.isListener */;
|
87
|
+
}
|
88
|
+
}
|
89
|
+
};
|
90
|
+
}
|
91
|
+
// This method is used in React hooks specifically. It returns a bound add method
|
92
|
+
// that is cached to avoid creating a new one on each call, and it eagerly sets
|
93
|
+
// the listener as watched so that subscriptions that are accessed will be activated.
|
94
|
+
addListenerLazy() {
|
95
|
+
if (!this._isListener) {
|
96
|
+
this.watchCount++;
|
97
|
+
this.flags |= 8 /* SignalFlags.isListener */;
|
98
|
+
}
|
99
|
+
return this.listeners.cachedBoundAdd;
|
100
|
+
}
|
101
|
+
}
|
102
|
+
export const runListeners = (signal) => {
|
103
|
+
const { listeners } = signal;
|
104
|
+
if (listeners === null) {
|
105
|
+
return;
|
106
|
+
}
|
107
|
+
const { current } = listeners;
|
108
|
+
for (const listener of current) {
|
109
|
+
listener();
|
110
|
+
}
|
111
|
+
};
|
112
|
+
export const isSubscription = (signal) => {
|
113
|
+
return (signal.flags & 4 /* SignalFlags.isSubscription */) !== 0;
|
114
|
+
};
|
115
|
+
export function createDerivedSignal(compute, args = [], key, scope, opts, isSubscription = false) {
|
116
|
+
return new DerivedSignal(isSubscription, compute, args, key, scope, opts);
|
117
|
+
}
|
118
|
+
//# sourceMappingURL=derived.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"derived.js","sourceRoot":"","sources":["../../../src/internals/derived.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
import { DerivedSignal } from './derived.js';
|
2
|
+
import { Edge } from './edge.js';
|
3
|
+
export declare function dirtySignal(signal: DerivedSignal<any, any>): void;
|
4
|
+
export declare function dirtySignalConsumers(map: Map<WeakRef<DerivedSignal<any, any>>, Edge>): void;
|
5
|
+
//# sourceMappingURL=dirty.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dirty.d.ts","sourceRoot":"","sources":["../../../src/internals/dirty.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAA+B,MAAM,cAAc,CAAC;AAE1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,QAY1D;AAyBD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAgDpF"}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import { scheduleAsyncPull, schedulePull } from './scheduling.js';
|
2
|
+
import { isSubscription } from './derived.js';
|
3
|
+
import { CURRENT_CONSUMER } from './get.js';
|
4
|
+
export function dirtySignal(signal) {
|
5
|
+
const prevState = signal._state;
|
6
|
+
if (prevState === 2 /* SignalState.Dirty */) {
|
7
|
+
return;
|
8
|
+
}
|
9
|
+
signal._state = 2 /* SignalState.Dirty */;
|
10
|
+
if (prevState !== 3 /* SignalState.MaybeDirty */) {
|
11
|
+
propagateDirty(signal);
|
12
|
+
}
|
13
|
+
}
|
14
|
+
function propagateDirty(signal) {
|
15
|
+
if (CURRENT_CONSUMER === signal) {
|
16
|
+
throw new Error('A signal was dirtied after it was consumed by the current function. This can cause race conditions and infinite rerenders and is not allowed.');
|
17
|
+
}
|
18
|
+
if (isSubscription(signal)) {
|
19
|
+
if (signal.watchCount > 0) {
|
20
|
+
scheduleAsyncPull(signal);
|
21
|
+
}
|
22
|
+
// else do nothing, only schedule if connected
|
23
|
+
}
|
24
|
+
else {
|
25
|
+
if (signal._isListener) {
|
26
|
+
schedulePull(signal);
|
27
|
+
}
|
28
|
+
dirtySignalConsumers(signal.subs);
|
29
|
+
signal.subs = new Map();
|
30
|
+
}
|
31
|
+
}
|
32
|
+
export function dirtySignalConsumers(map) {
|
33
|
+
for (const [subRef, edge] of map) {
|
34
|
+
const sub = subRef.deref();
|
35
|
+
if (sub === undefined || sub.computedCount !== edge.consumedAt)
|
36
|
+
continue;
|
37
|
+
const dirtyState = sub._state;
|
38
|
+
switch (dirtyState) {
|
39
|
+
case 0 /* SignalState.Clean */:
|
40
|
+
sub._state = 3 /* SignalState.MaybeDirty */;
|
41
|
+
sub.dirtyHead = edge;
|
42
|
+
edge.nextDirty = undefined;
|
43
|
+
propagateDirty(sub);
|
44
|
+
break;
|
45
|
+
case 1 /* SignalState.Pending */:
|
46
|
+
case 3 /* SignalState.MaybeDirty */: {
|
47
|
+
let subEdge = sub.dirtyHead;
|
48
|
+
const ord = edge.ord;
|
49
|
+
if (subEdge.ord > ord) {
|
50
|
+
sub.dirtyHead = edge;
|
51
|
+
edge.nextDirty = subEdge;
|
52
|
+
if (dirtyState === 1 /* SignalState.Pending */) {
|
53
|
+
// If the signal is pending, the first edge is the halt edge. If the
|
54
|
+
// new dirty edge is BEFORE the halt edge, then it means that something
|
55
|
+
// changed before the current halt, so we need to cancel the current computation
|
56
|
+
// and recompute.
|
57
|
+
sub._state = 3 /* SignalState.MaybeDirty */;
|
58
|
+
propagateDirty(sub);
|
59
|
+
}
|
60
|
+
}
|
61
|
+
else {
|
62
|
+
let nextDirty = subEdge.nextDirty;
|
63
|
+
while (nextDirty !== undefined && nextDirty.ord < ord) {
|
64
|
+
subEdge = nextDirty;
|
65
|
+
nextDirty = subEdge.nextDirty;
|
66
|
+
}
|
67
|
+
edge.nextDirty = nextDirty;
|
68
|
+
subEdge.nextDirty = edge;
|
69
|
+
}
|
70
|
+
break;
|
71
|
+
}
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
//# sourceMappingURL=dirty.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dirty.js","sourceRoot":"","sources":["../../../src/internals/dirty.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import { ReactivePromise } from './async.js';
|
2
|
+
import type { DerivedSignal } from './derived.js';
|
3
|
+
export declare const enum EdgeType {
|
4
|
+
Signal = 0,
|
5
|
+
Promise = 1
|
6
|
+
}
|
7
|
+
export interface EdgeTypeDep {
|
8
|
+
[EdgeType.Signal]: DerivedSignal<any, any>;
|
9
|
+
[EdgeType.Promise]: ReactivePromise<any>;
|
10
|
+
}
|
11
|
+
interface BaseEdge {
|
12
|
+
type: EdgeType;
|
13
|
+
dep: EdgeTypeDep[EdgeType];
|
14
|
+
ord: number;
|
15
|
+
updatedAt: number;
|
16
|
+
consumedAt: number;
|
17
|
+
nextDirty: Edge | undefined;
|
18
|
+
}
|
19
|
+
export interface SignalEdge extends BaseEdge {
|
20
|
+
type: EdgeType.Signal;
|
21
|
+
dep: DerivedSignal<any, any>;
|
22
|
+
}
|
23
|
+
export interface PromiseEdge extends BaseEdge {
|
24
|
+
type: EdgeType.Promise;
|
25
|
+
dep: ReactivePromise<any>;
|
26
|
+
}
|
27
|
+
export type Edge = SignalEdge | PromiseEdge;
|
28
|
+
export declare function createEdge<T extends EdgeType, R extends T extends EdgeType.Signal ? SignalEdge : PromiseEdge>(prevEdge: Edge | undefined, type: T, dep: EdgeTypeDep[T], updatedAt: number, consumedAt: number): R;
|
29
|
+
export declare function insertDirty(node: DerivedSignal<any, any>, edge: Edge): void;
|
30
|
+
export declare function findAndRemoveDirty(sub: DerivedSignal<any, any>, dep: DerivedSignal<any, any> | ReactivePromise<any>): Edge | undefined;
|
31
|
+
export {};
|
32
|
+
//# sourceMappingURL=edge.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../../../src/internals/edge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,0BAAkB,QAAQ;IACxB,MAAM,IAAI;IACV,OAAO,IAAI;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAC1C;AAED,UAAU,QAAQ;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,EAAE,IAAI,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAC1C,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;IACtB,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;IACvB,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,MAAM,IAAI,GAAG,UAAU,GAAG,WAAW,CAAC;AAE5C,wBAAgB,UAAU,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,CAAC,SAAS,QAAQ,CAAC,MAAM,GAAG,UAAU,GAAG,WAAW,EAC3G,QAAQ,EAAE,IAAI,GAAG,SAAS,EAC1B,IAAI,EAAE,CAAC,EACP,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,CAAC,CAiBH;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,QAgBpE;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAC5B,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,GAClD,IAAI,GAAG,SAAS,CAyBlB"}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
let CURRENT_ORD = 0;
|
2
|
+
export function createEdge(prevEdge, type, dep, updatedAt, consumedAt) {
|
3
|
+
if (prevEdge === undefined) {
|
4
|
+
return {
|
5
|
+
type,
|
6
|
+
dep,
|
7
|
+
ord: CURRENT_ORD++,
|
8
|
+
updatedAt,
|
9
|
+
consumedAt,
|
10
|
+
nextDirty: undefined,
|
11
|
+
};
|
12
|
+
}
|
13
|
+
prevEdge.ord = CURRENT_ORD++;
|
14
|
+
prevEdge.updatedAt = updatedAt;
|
15
|
+
prevEdge.consumedAt = consumedAt;
|
16
|
+
prevEdge.nextDirty = undefined;
|
17
|
+
return prevEdge;
|
18
|
+
}
|
19
|
+
export function insertDirty(node, edge) {
|
20
|
+
const ord = edge.ord;
|
21
|
+
let currentEdge = node.dirtyHead;
|
22
|
+
if (currentEdge === undefined || currentEdge.ord > ord) {
|
23
|
+
node.dirtyHead = edge;
|
24
|
+
}
|
25
|
+
else {
|
26
|
+
let nextEdge = currentEdge.nextDirty;
|
27
|
+
while (nextEdge !== undefined && nextEdge.ord < ord) {
|
28
|
+
currentEdge = nextEdge;
|
29
|
+
nextEdge = currentEdge.nextDirty;
|
30
|
+
}
|
31
|
+
currentEdge.nextDirty = edge;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
export function findAndRemoveDirty(sub, dep) {
|
35
|
+
let edge = sub.dirtyHead;
|
36
|
+
if (edge === undefined) {
|
37
|
+
return undefined;
|
38
|
+
}
|
39
|
+
if (edge.dep === dep) {
|
40
|
+
sub.dirtyHead = edge.nextDirty;
|
41
|
+
return edge;
|
42
|
+
}
|
43
|
+
let nextLink = edge.nextDirty;
|
44
|
+
while (nextLink !== undefined) {
|
45
|
+
if (nextLink.dep === dep) {
|
46
|
+
edge.nextDirty = nextLink.nextDirty;
|
47
|
+
return nextLink;
|
48
|
+
}
|
49
|
+
edge = nextLink;
|
50
|
+
nextLink = edge.nextDirty;
|
51
|
+
}
|
52
|
+
return undefined;
|
53
|
+
}
|
54
|
+
//# sourceMappingURL=edge.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"edge.js","sourceRoot":"","sources":["../../../src/internals/edge.ts"],"names":[],"mappings":"AAGA,IAAI,WAAW,GAAG,CAAC,CAAC;AAkCpB,MAAM,UAAU,UAAU,CACxB,QAA0B,EAC1B,IAAO,EACP,GAAmB,EACnB,SAAiB,EACjB,UAAkB;IAElB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI;YACJ,GAAG;YACH,GAAG,EAAE,WAAW,EAAE;YAClB,SAAS;YACT,UAAU;YACV,SAAS,EAAE,SAAS;SAChB,CAAC;IACT,CAAC;IAED,QAAQ,CAAC,GAAG,GAAG,WAAW,EAAE,CAAC;IAC7B,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,OAAO,QAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAA6B,EAAE,IAAU;IACnE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;IAEjC,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,IAAI,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC;QAErC,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;YACpD,WAAW,GAAG,QAAQ,CAAC;YACvB,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC;QACnC,CAAC;QAED,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAA4B,EAC5B,GAAmD;IAEnD,IAAI,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC;IAEzB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;QACrB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;IAE9B,OAAO,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,QAAQ,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;YACpC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,GAAG,QAAQ,CAAC;QAChB,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;IAC5B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { DerivedSignal } from './derived.js';
|
2
|
+
import { ReactiveValue } from '../types.js';
|
3
|
+
export declare let CURRENT_CONSUMER: DerivedSignal<any, any> | undefined;
|
4
|
+
export declare function getSignal<T, Args extends unknown[]>(signal: DerivedSignal<T, Args>): ReactiveValue<T>;
|
5
|
+
export declare function checkSignal(signal: DerivedSignal<any, any>): number;
|
6
|
+
export declare function runSignal(signal: DerivedSignal<any, any[]>): void;
|
7
|
+
export declare function checkAndRunListeners(signal: DerivedSignal<any, any>, willWatch?: boolean): number;
|
8
|
+
export declare function callback<T, Args extends unknown[]>(fn: (...args: Args) => T): (...args: Args) => T;
|
9
|
+
export declare function generatorResultToPromise<T, Args extends unknown[]>(generator: Generator<any, T>, savedConsumer: DerivedSignal<any, any> | undefined): Promise<T>;
|
10
|
+
//# sourceMappingURL=get.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/internals/get.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAA4B,MAAM,cAAc,CAAC;AAIvE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,eAAO,IAAI,gBAAgB,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;AAEjE,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAkCrG;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAiEnE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,QA8F1D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,UAAQ,UAiBtF;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,CAAC,CAmBlG;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,IAAI,SAAS,OAAO,EAAE,EAChE,SAAS,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,EAC5B,aAAa,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,GACjD,OAAO,CAAC,CAAC,CAAC,CA4CZ"}
|
@@ -0,0 +1,247 @@
|
|
1
|
+
import { scheduleListeners, scheduleTracer, scheduleUnwatch } from './scheduling.js';
|
2
|
+
import { SignalType, TRACER as TRACER, TracerEventType } from '../trace.js';
|
3
|
+
import { createEdge } from './edge.js';
|
4
|
+
import { watchSignal } from './connect.js';
|
5
|
+
import { ReactivePromise } from './async.js';
|
6
|
+
import { isGeneratorResult, isPromise, isReactivePromise } from './utils/type-utils.js';
|
7
|
+
export let CURRENT_CONSUMER;
|
8
|
+
export function getSignal(signal) {
|
9
|
+
if (CURRENT_CONSUMER !== undefined) {
|
10
|
+
const { ref, computedCount, deps } = CURRENT_CONSUMER;
|
11
|
+
const prevEdge = deps.get(signal);
|
12
|
+
const prevConsumedAt = prevEdge?.consumedAt;
|
13
|
+
if (prevConsumedAt !== computedCount) {
|
14
|
+
if (prevEdge === undefined) {
|
15
|
+
TRACER?.emit({
|
16
|
+
type: TracerEventType.Connected,
|
17
|
+
id: CURRENT_CONSUMER.tracerMeta.id,
|
18
|
+
childId: signal.tracerMeta.id,
|
19
|
+
name: signal.tracerMeta.desc,
|
20
|
+
params: signal.tracerMeta.params,
|
21
|
+
nodeType: SignalType.Reactive,
|
22
|
+
});
|
23
|
+
if (CURRENT_CONSUMER.watchCount > 0) {
|
24
|
+
watchSignal(signal);
|
25
|
+
}
|
26
|
+
}
|
27
|
+
const updatedAt = checkSignal(signal);
|
28
|
+
const newEdge = createEdge(prevEdge, 0 /* EdgeType.Signal */, signal, updatedAt, computedCount);
|
29
|
+
signal.subs.set(ref, newEdge);
|
30
|
+
deps.set(signal, newEdge);
|
31
|
+
}
|
32
|
+
}
|
33
|
+
else {
|
34
|
+
checkSignal(signal);
|
35
|
+
}
|
36
|
+
return signal.value;
|
37
|
+
}
|
38
|
+
export function checkSignal(signal) {
|
39
|
+
let { ref, _state: state } = signal;
|
40
|
+
if (state < 2 /* SignalState.Dirty */) {
|
41
|
+
return signal.updatedCount;
|
42
|
+
}
|
43
|
+
if (state === 3 /* SignalState.MaybeDirty */) {
|
44
|
+
let edge = signal.dirtyHead;
|
45
|
+
while (edge !== undefined) {
|
46
|
+
if (edge.type === 1 /* EdgeType.Promise */) {
|
47
|
+
const dep = edge.dep;
|
48
|
+
// If the dependency is pending, then we need to propagate the pending state to the
|
49
|
+
// parent signal, and we halt the computation here.
|
50
|
+
if (dep.isPending) {
|
51
|
+
const value = signal.value;
|
52
|
+
if (value instanceof ReactivePromise) {
|
53
|
+
// Propagate the pending state to the parent signal
|
54
|
+
value._setPending();
|
55
|
+
}
|
56
|
+
// Add the signal to the awaitSubs map to be notified when the promise is resolved
|
57
|
+
dep._awaitSubs.set(ref, edge);
|
58
|
+
state = 1 /* SignalState.Pending */;
|
59
|
+
signal.dirtyHead = edge;
|
60
|
+
// Early return to prevent the signal from being computed and to preserve the dirty state
|
61
|
+
return signal.updatedCount;
|
62
|
+
}
|
63
|
+
edge = edge.nextDirty;
|
64
|
+
continue;
|
65
|
+
}
|
66
|
+
const dep = edge.dep;
|
67
|
+
const updatedAt = checkSignal(dep);
|
68
|
+
dep.subs.set(ref, edge);
|
69
|
+
if (edge.updatedAt !== updatedAt) {
|
70
|
+
signal.dirtyHead = edge.nextDirty;
|
71
|
+
state = 2 /* SignalState.Dirty */;
|
72
|
+
break;
|
73
|
+
}
|
74
|
+
edge = edge.nextDirty;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
if (state === 2 /* SignalState.Dirty */) {
|
78
|
+
runSignal(signal);
|
79
|
+
}
|
80
|
+
signal._state = 0 /* SignalState.Clean */;
|
81
|
+
signal.dirtyHead = undefined;
|
82
|
+
if (TRACER !== undefined && signal.tracerMeta?.tracer) {
|
83
|
+
scheduleTracer(signal.tracerMeta.tracer);
|
84
|
+
}
|
85
|
+
return signal.updatedCount;
|
86
|
+
}
|
87
|
+
export function runSignal(signal) {
|
88
|
+
TRACER?.emit({
|
89
|
+
type: TracerEventType.StartUpdate,
|
90
|
+
id: signal.tracerMeta.id,
|
91
|
+
});
|
92
|
+
const prevConsumer = CURRENT_CONSUMER;
|
93
|
+
const updatedCount = signal.updatedCount;
|
94
|
+
const computedCount = ++signal.computedCount;
|
95
|
+
try {
|
96
|
+
CURRENT_CONSUMER = signal;
|
97
|
+
const initialized = updatedCount !== 0;
|
98
|
+
const prevValue = signal.value;
|
99
|
+
let nextValue = signal.compute(...signal.args);
|
100
|
+
let valueIsPromise = false;
|
101
|
+
if (nextValue !== null && typeof nextValue === 'object') {
|
102
|
+
if (isGeneratorResult(nextValue)) {
|
103
|
+
nextValue = generatorResultToPromise(nextValue, signal);
|
104
|
+
valueIsPromise = true;
|
105
|
+
}
|
106
|
+
else if (isPromise(nextValue)) {
|
107
|
+
valueIsPromise = true;
|
108
|
+
}
|
109
|
+
}
|
110
|
+
if (valueIsPromise) {
|
111
|
+
if (TRACER !== undefined) {
|
112
|
+
TRACER.emit({
|
113
|
+
type: TracerEventType.StartLoading,
|
114
|
+
id: signal.tracerMeta.id,
|
115
|
+
});
|
116
|
+
nextValue.finally(() => {
|
117
|
+
TRACER.emit({
|
118
|
+
type: TracerEventType.EndLoading,
|
119
|
+
id: signal.tracerMeta.id,
|
120
|
+
value: signal.value,
|
121
|
+
});
|
122
|
+
});
|
123
|
+
}
|
124
|
+
TRACER?.emit({
|
125
|
+
type: TracerEventType.StartLoading,
|
126
|
+
id: signal.tracerMeta.id,
|
127
|
+
});
|
128
|
+
if (prevValue !== null && typeof prevValue === 'object' && isReactivePromise(prevValue)) {
|
129
|
+
// Update the ReactivePromise with the new promise. Since the value
|
130
|
+
// returned from the function is the same ReactivePromise instance,
|
131
|
+
// we don't need to increment the updatedCount, because the returned
|
132
|
+
// value is the same. _setPromise will update the nested values on the
|
133
|
+
// ReactivePromise instance, and consumers of those values will be notified
|
134
|
+
// of the change through that.
|
135
|
+
prevValue._setPromise(nextValue);
|
136
|
+
}
|
137
|
+
else {
|
138
|
+
// If the signal has not been computed yet, we then the initValue was assigned
|
139
|
+
// in the constructor. Otherwise, we don't know what the initial value was, so
|
140
|
+
// we don't pass it to the ReactivePromise constructor.
|
141
|
+
const initValue = !initialized ? prevValue : undefined;
|
142
|
+
signal.value = ReactivePromise.createPromise(nextValue, signal, initValue);
|
143
|
+
signal.updatedCount = updatedCount + 1;
|
144
|
+
}
|
145
|
+
}
|
146
|
+
else if (!initialized || !signal.equals(prevValue, nextValue)) {
|
147
|
+
signal.value = nextValue;
|
148
|
+
signal.updatedCount = updatedCount + 1;
|
149
|
+
}
|
150
|
+
}
|
151
|
+
finally {
|
152
|
+
CURRENT_CONSUMER = prevConsumer;
|
153
|
+
TRACER?.emit({
|
154
|
+
type: TracerEventType.EndUpdate,
|
155
|
+
id: signal.tracerMeta.id,
|
156
|
+
value: signal.value,
|
157
|
+
});
|
158
|
+
const { ref, deps } = signal;
|
159
|
+
for (const [dep, edge] of deps) {
|
160
|
+
if (edge.consumedAt !== computedCount) {
|
161
|
+
scheduleUnwatch(dep);
|
162
|
+
dep.subs.delete(ref);
|
163
|
+
deps.delete(dep);
|
164
|
+
TRACER?.emit({
|
165
|
+
type: TracerEventType.Disconnected,
|
166
|
+
id: signal.tracerMeta.id,
|
167
|
+
childId: dep.tracerMeta.id,
|
168
|
+
});
|
169
|
+
}
|
170
|
+
}
|
171
|
+
}
|
172
|
+
}
|
173
|
+
export function checkAndRunListeners(signal, willWatch = false) {
|
174
|
+
const listeners = signal.listeners;
|
175
|
+
if (willWatch && (listeners === null || listeners.current.size === 0)) {
|
176
|
+
signal.watchCount++;
|
177
|
+
signal['flags'] |= 8 /* SignalFlags.isListener */;
|
178
|
+
}
|
179
|
+
let updatedCount = checkSignal(signal);
|
180
|
+
if (listeners !== null && listeners.updatedAt !== updatedCount) {
|
181
|
+
listeners.updatedAt = updatedCount;
|
182
|
+
scheduleListeners(signal);
|
183
|
+
}
|
184
|
+
return updatedCount;
|
185
|
+
}
|
186
|
+
export function callback(fn) {
|
187
|
+
const savedConsumer = CURRENT_CONSUMER;
|
188
|
+
return (...args) => {
|
189
|
+
const prevConsumer = CURRENT_CONSUMER;
|
190
|
+
CURRENT_CONSUMER = savedConsumer;
|
191
|
+
try {
|
192
|
+
const result = fn(...args);
|
193
|
+
if (result !== null && typeof result === 'object' && isGeneratorResult(result)) {
|
194
|
+
return generatorResultToPromise(result, savedConsumer);
|
195
|
+
}
|
196
|
+
return result;
|
197
|
+
}
|
198
|
+
finally {
|
199
|
+
CURRENT_CONSUMER = prevConsumer;
|
200
|
+
}
|
201
|
+
};
|
202
|
+
}
|
203
|
+
export function generatorResultToPromise(generator, savedConsumer) {
|
204
|
+
function adopt(value) {
|
205
|
+
return typeof value === 'object' && value !== null && (isPromise(value) || isReactivePromise(value))
|
206
|
+
? value
|
207
|
+
: Promise.resolve(value);
|
208
|
+
}
|
209
|
+
return new Promise((resolve, reject) => {
|
210
|
+
function step(result) {
|
211
|
+
if (result.done) {
|
212
|
+
resolve(result.value);
|
213
|
+
}
|
214
|
+
else {
|
215
|
+
adopt(result.value).then(fulfilled, rejected);
|
216
|
+
}
|
217
|
+
}
|
218
|
+
function fulfilled(value) {
|
219
|
+
const prevConsumer = CURRENT_CONSUMER;
|
220
|
+
try {
|
221
|
+
CURRENT_CONSUMER = savedConsumer;
|
222
|
+
step(generator.next(value));
|
223
|
+
}
|
224
|
+
catch (e) {
|
225
|
+
reject(e);
|
226
|
+
}
|
227
|
+
finally {
|
228
|
+
CURRENT_CONSUMER = prevConsumer;
|
229
|
+
}
|
230
|
+
}
|
231
|
+
function rejected(value) {
|
232
|
+
const prevConsumer = CURRENT_CONSUMER;
|
233
|
+
try {
|
234
|
+
CURRENT_CONSUMER = savedConsumer;
|
235
|
+
step(generator['throw'](value));
|
236
|
+
}
|
237
|
+
catch (e) {
|
238
|
+
reject(e);
|
239
|
+
}
|
240
|
+
finally {
|
241
|
+
CURRENT_CONSUMER = prevConsumer;
|
242
|
+
}
|
243
|
+
}
|
244
|
+
step(generator.next());
|
245
|
+
});
|
246
|
+
}
|
247
|
+
//# sourceMappingURL=get.js.map
|