@livestore/livestore 0.0.0-snapshot-909cdd1ac2fd591945c2be2b0f53e14d87f3c9d4
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/README.md +1 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/QueryCache.d.ts +20 -0
- package/dist/QueryCache.d.ts.map +1 -0
- package/dist/QueryCache.js +61 -0
- package/dist/QueryCache.js.map +1 -0
- package/dist/SynchronousDatabaseWrapper.d.ts +36 -0
- package/dist/SynchronousDatabaseWrapper.d.ts.map +1 -0
- package/dist/SynchronousDatabaseWrapper.js +176 -0
- package/dist/SynchronousDatabaseWrapper.js.map +1 -0
- package/dist/effect/LiveStore.d.ts +38 -0
- package/dist/effect/LiveStore.d.ts.map +1 -0
- package/dist/effect/LiveStore.js +38 -0
- package/dist/effect/LiveStore.js.map +1 -0
- package/dist/effect/index.d.ts +2 -0
- package/dist/effect/index.d.ts.map +1 -0
- package/dist/effect/index.js +2 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/global-state.d.ts +14 -0
- package/dist/global-state.d.ts.map +1 -0
- package/dist/global-state.js +16 -0
- package/dist/global-state.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/reactive.d.ts +163 -0
- package/dist/reactive.d.ts.map +1 -0
- package/dist/reactive.js +382 -0
- package/dist/reactive.js.map +1 -0
- package/dist/reactive.test.d.ts +2 -0
- package/dist/reactive.test.d.ts.map +1 -0
- package/dist/reactive.test.js +345 -0
- package/dist/reactive.test.js.map +1 -0
- package/dist/reactiveQueries/base-class.d.ts +59 -0
- package/dist/reactiveQueries/base-class.d.ts.map +1 -0
- package/dist/reactiveQueries/base-class.js +29 -0
- package/dist/reactiveQueries/base-class.js.map +1 -0
- package/dist/reactiveQueries/graphql.d.ts +52 -0
- package/dist/reactiveQueries/graphql.d.ts.map +1 -0
- package/dist/reactiveQueries/graphql.js +136 -0
- package/dist/reactiveQueries/graphql.js.map +1 -0
- package/dist/reactiveQueries/js.d.ts +35 -0
- package/dist/reactiveQueries/js.d.ts.map +1 -0
- package/dist/reactiveQueries/js.js +57 -0
- package/dist/reactiveQueries/js.js.map +1 -0
- package/dist/reactiveQueries/sql.d.ts +49 -0
- package/dist/reactiveQueries/sql.d.ts.map +1 -0
- package/dist/reactiveQueries/sql.js +130 -0
- package/dist/reactiveQueries/sql.js.map +1 -0
- package/dist/reactiveQueries/sql.test.d.ts +2 -0
- package/dist/reactiveQueries/sql.test.d.ts.map +1 -0
- package/dist/reactiveQueries/sql.test.js +284 -0
- package/dist/reactiveQueries/sql.test.js.map +1 -0
- package/dist/row-query.d.ts +33 -0
- package/dist/row-query.d.ts.map +1 -0
- package/dist/row-query.js +84 -0
- package/dist/row-query.js.map +1 -0
- package/dist/store-context.d.ts +26 -0
- package/dist/store-context.d.ts.map +1 -0
- package/dist/store-context.js +6 -0
- package/dist/store-context.js.map +1 -0
- package/dist/store-devtools.d.ts +19 -0
- package/dist/store-devtools.d.ts.map +1 -0
- package/dist/store-devtools.js +141 -0
- package/dist/store-devtools.js.map +1 -0
- package/dist/store.d.ts +175 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +507 -0
- package/dist/store.js.map +1 -0
- package/dist/utils/data-structures.d.ts +10 -0
- package/dist/utils/data-structures.d.ts.map +1 -0
- package/dist/utils/data-structures.js +32 -0
- package/dist/utils/data-structures.js.map +1 -0
- package/dist/utils/dev.d.ts +3 -0
- package/dist/utils/dev.d.ts.map +1 -0
- package/dist/utils/dev.js +17 -0
- package/dist/utils/dev.js.map +1 -0
- package/dist/utils/otel.d.ts +4 -0
- package/dist/utils/otel.d.ts.map +1 -0
- package/dist/utils/otel.js +6 -0
- package/dist/utils/otel.js.map +1 -0
- package/dist/utils/stack-info.d.ts +10 -0
- package/dist/utils/stack-info.d.ts.map +1 -0
- package/dist/utils/stack-info.js +41 -0
- package/dist/utils/stack-info.js.map +1 -0
- package/dist/utils/stack-info.test.d.ts +2 -0
- package/dist/utils/stack-info.test.d.ts.map +1 -0
- package/dist/utils/stack-info.test.js +75 -0
- package/dist/utils/stack-info.test.js.map +1 -0
- package/dist/utils/tests/fixture.d.ts +259 -0
- package/dist/utils/tests/fixture.d.ts.map +1 -0
- package/dist/utils/tests/fixture.js +33 -0
- package/dist/utils/tests/fixture.js.map +1 -0
- package/dist/utils/tests/mod.d.ts +3 -0
- package/dist/utils/tests/mod.d.ts.map +1 -0
- package/dist/utils/tests/mod.js +3 -0
- package/dist/utils/tests/mod.js.map +1 -0
- package/dist/utils/tests/otel.d.ts +10 -0
- package/dist/utils/tests/otel.d.ts.map +1 -0
- package/dist/utils/tests/otel.js +42 -0
- package/dist/utils/tests/otel.js.map +1 -0
- package/package.json +60 -0
- package/src/QueryCache.ts +81 -0
- package/src/SynchronousDatabaseWrapper.ts +256 -0
- package/src/ambient.d.ts +10 -0
- package/src/effect/LiveStore.ts +112 -0
- package/src/effect/index.ts +8 -0
- package/src/global-state.ts +20 -0
- package/src/index.ts +64 -0
- package/src/reactive.test.ts +426 -0
- package/src/reactive.ts +661 -0
- package/src/reactiveQueries/base-class.ts +115 -0
- package/src/reactiveQueries/graphql.ts +233 -0
- package/src/reactiveQueries/js.ts +108 -0
- package/src/reactiveQueries/sql.test.ts +308 -0
- package/src/reactiveQueries/sql.ts +226 -0
- package/src/row-query.ts +200 -0
- package/src/store-context.ts +23 -0
- package/src/store-devtools.ts +217 -0
- package/src/store.ts +920 -0
- package/src/utils/data-structures.ts +36 -0
- package/src/utils/dev.ts +24 -0
- package/src/utils/otel.ts +9 -0
- package/src/utils/stack-info.test.ts +79 -0
- package/src/utils/stack-info.ts +54 -0
- package/src/utils/tests/fixture.ts +77 -0
- package/src/utils/tests/mod.ts +2 -0
- package/src/utils/tests/otel.ts +61 -0
- package/tsconfig.json +18 -0
- package/vitest.config.js +9 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { BoundArray } from '@livestore/common';
|
|
2
|
+
import type { PrettifyFlat } from '@livestore/utils';
|
|
3
|
+
import type * as otel from '@opentelemetry/api';
|
|
4
|
+
export declare const NOT_REFRESHED_YET: unique symbol;
|
|
5
|
+
export type NOT_REFRESHED_YET = typeof NOT_REFRESHED_YET;
|
|
6
|
+
export type GetAtom = <T>(atom: Atom<T, any, any>, otelContext?: otel.Context) => T;
|
|
7
|
+
export type Ref<T, TContext, TDebugRefreshReason extends DebugRefreshReason> = {
|
|
8
|
+
_tag: 'ref';
|
|
9
|
+
id: string;
|
|
10
|
+
isDirty: false;
|
|
11
|
+
isDestroyed: boolean;
|
|
12
|
+
previousResult: T;
|
|
13
|
+
computeResult: () => T;
|
|
14
|
+
sub: Set<Atom<any, TContext, TDebugRefreshReason>>;
|
|
15
|
+
super: Set<Thunk<any, TContext, TDebugRefreshReason> | Effect>;
|
|
16
|
+
label?: string;
|
|
17
|
+
/** Container for meta information (e.g. the LiveStore Store) */
|
|
18
|
+
meta?: any;
|
|
19
|
+
equal: (a: T, b: T) => boolean;
|
|
20
|
+
refreshes: number;
|
|
21
|
+
};
|
|
22
|
+
export type Thunk<TResult, TContext, TDebugRefreshReason extends DebugRefreshReason> = {
|
|
23
|
+
_tag: 'thunk';
|
|
24
|
+
id: string;
|
|
25
|
+
isDirty: boolean;
|
|
26
|
+
isDestroyed: boolean;
|
|
27
|
+
computeResult: (otelContext?: otel.Context, debugRefreshReason?: TDebugRefreshReason) => TResult;
|
|
28
|
+
previousResult: TResult | NOT_REFRESHED_YET;
|
|
29
|
+
sub: Set<Atom<any, TContext, TDebugRefreshReason>>;
|
|
30
|
+
super: Set<Thunk<any, TContext, TDebugRefreshReason> | Effect>;
|
|
31
|
+
label?: string;
|
|
32
|
+
/** Container for meta information (e.g. the LiveStore Store) */
|
|
33
|
+
meta?: any;
|
|
34
|
+
equal: (a: TResult, b: TResult) => boolean;
|
|
35
|
+
recomputations: number;
|
|
36
|
+
__getResult: any;
|
|
37
|
+
};
|
|
38
|
+
export type Atom<T, TContext, TDebugRefreshReason extends DebugRefreshReason> = Ref<T, TContext, TDebugRefreshReason> | Thunk<T, TContext, TDebugRefreshReason>;
|
|
39
|
+
export type Effect = {
|
|
40
|
+
_tag: 'effect';
|
|
41
|
+
id: string;
|
|
42
|
+
isDestroyed: boolean;
|
|
43
|
+
doEffect: (otelContext?: otel.Context) => void;
|
|
44
|
+
sub: Set<Atom<any, TODO, TODO>>;
|
|
45
|
+
label?: string;
|
|
46
|
+
invocations: number;
|
|
47
|
+
};
|
|
48
|
+
export type Node<T, TContext, TDebugRefreshReason extends DebugRefreshReason> = Atom<T, TContext, TDebugRefreshReason> | Effect;
|
|
49
|
+
export declare const isThunk: <T, TContext, TDebugRefreshReason extends DebugRefreshReason>(obj: unknown) => obj is Thunk<T, TContext, TDebugRefreshReason>;
|
|
50
|
+
export type DebugThunkInfo<T extends string = string> = {
|
|
51
|
+
_tag: T;
|
|
52
|
+
durationMs: number;
|
|
53
|
+
};
|
|
54
|
+
export type DebugRefreshReasonBase =
|
|
55
|
+
/** Usually in response to some `mutate` calls with `skipRefresh: true` */
|
|
56
|
+
{
|
|
57
|
+
_tag: 'runDeferredEffects';
|
|
58
|
+
originalRefreshReasons?: ReadonlyArray<DebugRefreshReasonBase>;
|
|
59
|
+
manualRefreshReason?: DebugRefreshReasonBase;
|
|
60
|
+
} | {
|
|
61
|
+
_tag: 'makeThunk';
|
|
62
|
+
label?: string;
|
|
63
|
+
} | {
|
|
64
|
+
_tag: 'unknown';
|
|
65
|
+
};
|
|
66
|
+
export type DebugRefreshReason<T extends string = string> = DebugRefreshReasonBase | {
|
|
67
|
+
_tag: T;
|
|
68
|
+
};
|
|
69
|
+
export type AtomDebugInfo<TDebugThunkInfo extends DebugThunkInfo> = {
|
|
70
|
+
atom: SerializedAtom;
|
|
71
|
+
resultChanged: boolean;
|
|
72
|
+
debugInfo: TDebugThunkInfo;
|
|
73
|
+
};
|
|
74
|
+
export type RefreshDebugInfo<TDebugRefreshReason extends DebugRefreshReason, TDebugThunkInfo extends DebugThunkInfo> = {
|
|
75
|
+
/** Currently only used for easier handling in React (e.g. as key) */
|
|
76
|
+
id: string;
|
|
77
|
+
reason: TDebugRefreshReason;
|
|
78
|
+
refreshedAtoms: AtomDebugInfo<TDebugThunkInfo>[];
|
|
79
|
+
skippedRefresh: boolean;
|
|
80
|
+
durationMs: number;
|
|
81
|
+
/** Note we're using a regular `Date.now()` timestamp here as it's faster to produce and we don't need the fine accuracy */
|
|
82
|
+
completedTimestamp: number;
|
|
83
|
+
graphSnapshot: ReactiveGraphSnapshot;
|
|
84
|
+
};
|
|
85
|
+
export type EncodedOption<A> = {
|
|
86
|
+
_tag: 'Some';
|
|
87
|
+
value?: A;
|
|
88
|
+
} | {
|
|
89
|
+
_tag: 'None';
|
|
90
|
+
};
|
|
91
|
+
export type SerializedAtom = SerializedRef | SerializedThunk;
|
|
92
|
+
export type SerializedRef = Readonly<PrettifyFlat<Pick<Ref<unknown, unknown, any>, '_tag' | 'id' | 'label' | 'meta' | 'isDirty' | 'isDestroyed' | 'refreshes'> & {
|
|
93
|
+
/** Is `None` if `getSnapshot` was called with `includeResults: false` which is the default */
|
|
94
|
+
previousResult: EncodedOption<string>;
|
|
95
|
+
sub: ReadonlyArray<string>;
|
|
96
|
+
super: ReadonlyArray<string>;
|
|
97
|
+
}>>;
|
|
98
|
+
export type SerializedThunk = Readonly<PrettifyFlat<Pick<Thunk<unknown, unknown, any>, '_tag' | 'id' | 'label' | 'meta' | 'isDirty' | 'isDestroyed' | 'recomputations'> & {
|
|
99
|
+
/** Is `None` if `getSnapshot` was called with `includeResults: false` which is the default */
|
|
100
|
+
previousResult: EncodedOption<string>;
|
|
101
|
+
sub: ReadonlyArray<string>;
|
|
102
|
+
super: ReadonlyArray<string>;
|
|
103
|
+
}>>;
|
|
104
|
+
export type SerializedEffect = Readonly<PrettifyFlat<Pick<Effect, '_tag' | 'id' | 'label' | 'invocations' | 'isDestroyed'> & {
|
|
105
|
+
sub: ReadonlyArray<string>;
|
|
106
|
+
}>>;
|
|
107
|
+
export type ReactiveGraphSnapshot = {
|
|
108
|
+
readonly atoms: ReadonlyArray<SerializedAtom>;
|
|
109
|
+
readonly effects: ReadonlyArray<SerializedEffect>;
|
|
110
|
+
/** IDs of deferred effects */
|
|
111
|
+
readonly deferredEffects: ReadonlyArray<string>;
|
|
112
|
+
};
|
|
113
|
+
export declare class ReactiveGraph<TDebugRefreshReason extends DebugRefreshReason, TDebugThunkInfo extends DebugThunkInfo, TContext extends {
|
|
114
|
+
effectsWrapper?: (runEffects: () => void) => void;
|
|
115
|
+
} = {}> {
|
|
116
|
+
id: string;
|
|
117
|
+
readonly atoms: Set<Atom<any, TContext, TDebugRefreshReason>>;
|
|
118
|
+
readonly effects: Set<Effect>;
|
|
119
|
+
context: TContext | undefined;
|
|
120
|
+
debugRefreshInfos: BoundArray<RefreshDebugInfo<TDebugRefreshReason, TDebugThunkInfo>>;
|
|
121
|
+
private currentDebugRefresh;
|
|
122
|
+
private deferredEffects;
|
|
123
|
+
private refreshCallbacks;
|
|
124
|
+
makeRef<T>(val: T, options?: {
|
|
125
|
+
label?: string;
|
|
126
|
+
meta?: unknown;
|
|
127
|
+
equal?: (a: T, b: T) => boolean;
|
|
128
|
+
}): Ref<T, TContext, TDebugRefreshReason>;
|
|
129
|
+
makeThunk<T>(getResult: (get: GetAtom, setDebugInfo: (debugInfo: TDebugThunkInfo) => void, ctx: TContext, otelContext: otel.Context | undefined) => T, options?: {
|
|
130
|
+
label?: string;
|
|
131
|
+
meta?: any;
|
|
132
|
+
equal?: (a: T, b: T) => boolean;
|
|
133
|
+
} | undefined): Thunk<T, TContext, TDebugRefreshReason>;
|
|
134
|
+
destroyNode(node: Node<any, TContext, TDebugRefreshReason>): void;
|
|
135
|
+
destroy(): void;
|
|
136
|
+
makeEffect(doEffect: (get: GetAtom, otelContext?: otel.Context) => void, options?: {
|
|
137
|
+
label?: string;
|
|
138
|
+
} | undefined): Effect;
|
|
139
|
+
setRef<T>(ref: Ref<T, TContext, TDebugRefreshReason>, val: T, options?: {
|
|
140
|
+
skipRefresh?: boolean;
|
|
141
|
+
debugRefreshReason?: TDebugRefreshReason;
|
|
142
|
+
otelContext?: otel.Context;
|
|
143
|
+
} | undefined): void;
|
|
144
|
+
setRefs<T>(refs: [Ref<T, TContext, TDebugRefreshReason>, T][], options?: {
|
|
145
|
+
skipRefresh?: boolean;
|
|
146
|
+
debugRefreshReason?: TDebugRefreshReason;
|
|
147
|
+
otelContext?: otel.Context;
|
|
148
|
+
} | undefined): void;
|
|
149
|
+
private runEffects;
|
|
150
|
+
runDeferredEffects: (options?: {
|
|
151
|
+
debugRefreshReason?: TDebugRefreshReason;
|
|
152
|
+
otelContext?: otel.Context;
|
|
153
|
+
}) => void;
|
|
154
|
+
runRefreshCallbacks: () => void;
|
|
155
|
+
addEdge(superComp: Thunk<any, TContext, TDebugRefreshReason> | Effect, subComp: Atom<any, TContext, TDebugRefreshReason>): void;
|
|
156
|
+
removeEdge(superComp: Thunk<any, TContext, TDebugRefreshReason> | Effect, subComp: Atom<any, TContext, TDebugRefreshReason>): void;
|
|
157
|
+
getSnapshot: (opts?: {
|
|
158
|
+
includeResults: boolean;
|
|
159
|
+
}) => ReactiveGraphSnapshot;
|
|
160
|
+
subscribeToRefresh: (cb: () => void) => () => void;
|
|
161
|
+
}
|
|
162
|
+
export declare const throwContextNotSetError: (graph: ReactiveGraph<any, any, any>) => never;
|
|
163
|
+
//# sourceMappingURL=reactive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../src/reactive.ts"],"names":[],"mappings":"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"}
|
package/dist/reactive.js
ADDED
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
// This is a simple implementation of a reactive dependency graph.
|
|
2
|
+
// Key Terminology:
|
|
3
|
+
// Ref: a mutable cell where values can be set
|
|
4
|
+
// Thunk: a pure computation that depends on other values
|
|
5
|
+
// Effect: a side effect that runs when a value changes; return value is ignored
|
|
6
|
+
// Atom: a node returning a value that can be depended on: Ref | Thunk
|
|
7
|
+
// Super computation: Nodes that depend on a given node ("downstream")
|
|
8
|
+
// Sub computation: Nodes that a given node depends on ("upstream")
|
|
9
|
+
// This vocabulary comes from the MiniAdapton paper linked below, although
|
|
10
|
+
// we don't actually implement the MiniAdapton algorithm because we don't need lazy recomputation.
|
|
11
|
+
// https://arxiv.org/abs/1609.05337
|
|
12
|
+
// Features:
|
|
13
|
+
// - Dependencies are tracked automatically in thunk computations by using a getter function
|
|
14
|
+
// to reference other atoms.
|
|
15
|
+
// - Whenever a ref is updated, the graph is eagerly refreshed to be consistent with the new values.
|
|
16
|
+
// - We minimize recomputation by refreshing the graph in topological sort order. (The topological height
|
|
17
|
+
// is maintained eagerly as edges are added and removed.)
|
|
18
|
+
// - At every thunk we check value equality with the previous value and cutoff propagation if possible.
|
|
19
|
+
/* eslint-disable prefer-arrow/prefer-arrow-functions */
|
|
20
|
+
import { BoundArray } from '@livestore/common';
|
|
21
|
+
import { deepEqual, shouldNeverHappen } from '@livestore/utils';
|
|
22
|
+
// import { getDurationMsFromSpan } from './otel.js'
|
|
23
|
+
export const NOT_REFRESHED_YET = Symbol.for('NOT_REFRESHED_YET');
|
|
24
|
+
export const isThunk = (obj) => {
|
|
25
|
+
return typeof obj === 'object' && obj !== null && '_tag' in obj && obj._tag === 'thunk';
|
|
26
|
+
};
|
|
27
|
+
const unknownRefreshReason = () => {
|
|
28
|
+
// debugger
|
|
29
|
+
return { _tag: 'unknown' };
|
|
30
|
+
};
|
|
31
|
+
const encodedOptionSome = (value) => ({ _tag: 'Some', value });
|
|
32
|
+
const encodedOptionNone = () => ({ _tag: 'None' });
|
|
33
|
+
let nodeIdCounter = 0;
|
|
34
|
+
const uniqueNodeId = () => `node-${++nodeIdCounter}`;
|
|
35
|
+
let refreshInfoIdCounter = 0;
|
|
36
|
+
const uniqueRefreshInfoId = () => `refresh-info-${++refreshInfoIdCounter}`;
|
|
37
|
+
let globalGraphIdCounter = 0;
|
|
38
|
+
const uniqueGraphId = () => `graph-${++globalGraphIdCounter}`;
|
|
39
|
+
export class ReactiveGraph {
|
|
40
|
+
id = uniqueGraphId();
|
|
41
|
+
atoms = new Set();
|
|
42
|
+
effects = new Set();
|
|
43
|
+
context;
|
|
44
|
+
debugRefreshInfos = new BoundArray(5000);
|
|
45
|
+
currentDebugRefresh;
|
|
46
|
+
deferredEffects = new Map();
|
|
47
|
+
refreshCallbacks = new Set();
|
|
48
|
+
makeRef(val, options) {
|
|
49
|
+
const ref = {
|
|
50
|
+
_tag: 'ref',
|
|
51
|
+
id: uniqueNodeId(),
|
|
52
|
+
isDirty: false,
|
|
53
|
+
isDestroyed: false,
|
|
54
|
+
previousResult: val,
|
|
55
|
+
computeResult: () => ref.previousResult,
|
|
56
|
+
sub: new Set(),
|
|
57
|
+
super: new Set(),
|
|
58
|
+
label: options?.label,
|
|
59
|
+
meta: options?.meta,
|
|
60
|
+
equal: options?.equal ?? deepEqual,
|
|
61
|
+
refreshes: 0,
|
|
62
|
+
};
|
|
63
|
+
this.atoms.add(ref);
|
|
64
|
+
return ref;
|
|
65
|
+
}
|
|
66
|
+
makeThunk(getResult, options) {
|
|
67
|
+
const thunk = {
|
|
68
|
+
_tag: 'thunk',
|
|
69
|
+
id: uniqueNodeId(),
|
|
70
|
+
previousResult: NOT_REFRESHED_YET,
|
|
71
|
+
isDirty: true,
|
|
72
|
+
isDestroyed: false,
|
|
73
|
+
computeResult: (otelContext, debugRefreshReason) => {
|
|
74
|
+
if (thunk.isDirty) {
|
|
75
|
+
const neededCurrentRefresh = this.currentDebugRefresh === undefined;
|
|
76
|
+
if (neededCurrentRefresh) {
|
|
77
|
+
this.currentDebugRefresh = { refreshedAtoms: [], startMs: performance.now() };
|
|
78
|
+
}
|
|
79
|
+
// Reset previous subcomputations as we're about to re-add them as part of the `doEffect` call below
|
|
80
|
+
thunk.sub = new Set();
|
|
81
|
+
const getAtom = (atom, otelContext) => {
|
|
82
|
+
this.addEdge(thunk, atom);
|
|
83
|
+
return compute(atom, otelContext);
|
|
84
|
+
};
|
|
85
|
+
let debugInfo = undefined;
|
|
86
|
+
const setDebugInfo = (debugInfo_) => {
|
|
87
|
+
debugInfo = debugInfo_;
|
|
88
|
+
};
|
|
89
|
+
const result = getResult(getAtom, setDebugInfo, this.context ?? throwContextNotSetError(this), otelContext);
|
|
90
|
+
const resultChanged = thunk.equal(thunk.previousResult, result) === false;
|
|
91
|
+
const debugInfoForAtom = {
|
|
92
|
+
atom: serializeAtom(thunk, false),
|
|
93
|
+
resultChanged,
|
|
94
|
+
debugInfo: debugInfo ?? unknownRefreshReason(),
|
|
95
|
+
};
|
|
96
|
+
this.currentDebugRefresh.refreshedAtoms.push(debugInfoForAtom);
|
|
97
|
+
thunk.isDirty = false;
|
|
98
|
+
thunk.previousResult = result;
|
|
99
|
+
thunk.recomputations++;
|
|
100
|
+
if (neededCurrentRefresh) {
|
|
101
|
+
const refreshedAtoms = this.currentDebugRefresh.refreshedAtoms;
|
|
102
|
+
const durationMs = performance.now() - this.currentDebugRefresh.startMs;
|
|
103
|
+
this.currentDebugRefresh = undefined;
|
|
104
|
+
this.debugRefreshInfos.push({
|
|
105
|
+
id: uniqueRefreshInfoId(),
|
|
106
|
+
reason: debugRefreshReason ?? { _tag: 'makeThunk', label: options?.label },
|
|
107
|
+
skippedRefresh: false,
|
|
108
|
+
refreshedAtoms,
|
|
109
|
+
durationMs,
|
|
110
|
+
completedTimestamp: Date.now(),
|
|
111
|
+
graphSnapshot: this.getSnapshot({ includeResults: false }),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
return thunk.previousResult;
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
sub: new Set(),
|
|
121
|
+
super: new Set(),
|
|
122
|
+
recomputations: 0,
|
|
123
|
+
label: options?.label,
|
|
124
|
+
meta: options?.meta,
|
|
125
|
+
equal: options?.equal ?? deepEqual,
|
|
126
|
+
__getResult: getResult,
|
|
127
|
+
};
|
|
128
|
+
this.atoms.add(thunk);
|
|
129
|
+
return thunk;
|
|
130
|
+
}
|
|
131
|
+
destroyNode(node) {
|
|
132
|
+
// console.debug(`destroying node (${node._tag})`, node.id, node.label)
|
|
133
|
+
// Recursively destroy any supercomputations
|
|
134
|
+
if (node._tag === 'ref' || node._tag === 'thunk') {
|
|
135
|
+
for (const superComp of node.super) {
|
|
136
|
+
this.destroyNode(superComp);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Destroy this node
|
|
140
|
+
if (node._tag !== 'ref') {
|
|
141
|
+
for (const subComp of node.sub) {
|
|
142
|
+
this.removeEdge(node, subComp);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (node._tag === 'effect') {
|
|
146
|
+
this.deferredEffects.delete(node);
|
|
147
|
+
this.effects.delete(node);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
this.atoms.delete(node);
|
|
151
|
+
}
|
|
152
|
+
node.isDestroyed = true;
|
|
153
|
+
}
|
|
154
|
+
destroy() {
|
|
155
|
+
// NOTE we don't need to sort the atoms first, as `destroyNode` will recursively destroy all supercomputations
|
|
156
|
+
for (const node of this.atoms) {
|
|
157
|
+
this.destroyNode(node);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
makeEffect(doEffect, options) {
|
|
161
|
+
const effect = {
|
|
162
|
+
_tag: 'effect',
|
|
163
|
+
id: uniqueNodeId(),
|
|
164
|
+
isDestroyed: false,
|
|
165
|
+
doEffect: (otelContext) => {
|
|
166
|
+
effect.invocations++;
|
|
167
|
+
// NOTE we're not tracking any debug refresh info for effects as they're tracked by the thunks they depend on
|
|
168
|
+
// Reset previous subcomputations as we're about to re-add them as part of the `doEffect` call below
|
|
169
|
+
effect.sub = new Set();
|
|
170
|
+
const getAtom = (atom, otelContext) => {
|
|
171
|
+
this.addEdge(effect, atom);
|
|
172
|
+
return compute(atom, otelContext);
|
|
173
|
+
};
|
|
174
|
+
doEffect(getAtom, otelContext);
|
|
175
|
+
},
|
|
176
|
+
sub: new Set(),
|
|
177
|
+
label: options?.label,
|
|
178
|
+
invocations: 0,
|
|
179
|
+
};
|
|
180
|
+
this.effects.add(effect);
|
|
181
|
+
return effect;
|
|
182
|
+
}
|
|
183
|
+
setRef(ref, val, options) {
|
|
184
|
+
this.setRefs([[ref, val]], options);
|
|
185
|
+
}
|
|
186
|
+
setRefs(refs, options) {
|
|
187
|
+
const effectsToRefresh = new Set();
|
|
188
|
+
for (const [ref, val] of refs) {
|
|
189
|
+
ref.previousResult = val;
|
|
190
|
+
ref.refreshes++;
|
|
191
|
+
markSuperCompDirtyRec(ref, effectsToRefresh);
|
|
192
|
+
}
|
|
193
|
+
if (options?.skipRefresh) {
|
|
194
|
+
for (const effect of effectsToRefresh) {
|
|
195
|
+
if (this.deferredEffects.has(effect) === false) {
|
|
196
|
+
this.deferredEffects.set(effect, new Set());
|
|
197
|
+
}
|
|
198
|
+
if (options?.debugRefreshReason !== undefined) {
|
|
199
|
+
this.deferredEffects.get(effect).add(options.debugRefreshReason);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.runEffects(effectsToRefresh, {
|
|
205
|
+
debugRefreshReason: options?.debugRefreshReason ?? unknownRefreshReason(),
|
|
206
|
+
otelContext: options?.otelContext,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
runEffects = (effectsToRefresh, options) => {
|
|
211
|
+
const effectsWrapper = this.context?.effectsWrapper ?? ((runEffects) => runEffects());
|
|
212
|
+
effectsWrapper(() => {
|
|
213
|
+
this.currentDebugRefresh = { refreshedAtoms: [], startMs: performance.now() };
|
|
214
|
+
for (const effect of effectsToRefresh) {
|
|
215
|
+
effect.doEffect(options?.otelContext);
|
|
216
|
+
}
|
|
217
|
+
const refreshedAtoms = this.currentDebugRefresh.refreshedAtoms;
|
|
218
|
+
const durationMs = performance.now() - this.currentDebugRefresh.startMs;
|
|
219
|
+
this.currentDebugRefresh = undefined;
|
|
220
|
+
const refreshDebugInfo = {
|
|
221
|
+
id: uniqueRefreshInfoId(),
|
|
222
|
+
reason: options.debugRefreshReason,
|
|
223
|
+
skippedRefresh: false,
|
|
224
|
+
refreshedAtoms,
|
|
225
|
+
durationMs,
|
|
226
|
+
completedTimestamp: Date.now(),
|
|
227
|
+
graphSnapshot: this.getSnapshot({ includeResults: false }),
|
|
228
|
+
};
|
|
229
|
+
this.debugRefreshInfos.push(refreshDebugInfo);
|
|
230
|
+
this.runRefreshCallbacks();
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
runDeferredEffects = (options) => {
|
|
234
|
+
// TODO improve how refresh reasons are propagated for deferred effect execution
|
|
235
|
+
// TODO also improve "batching" of running deferred effects (i.e. in a single `this.runEffects` call)
|
|
236
|
+
// but need to be careful to not overwhelm the main thread
|
|
237
|
+
for (const [effect, debugRefreshReasons] of this.deferredEffects) {
|
|
238
|
+
this.runEffects(new Set([effect]), {
|
|
239
|
+
debugRefreshReason: {
|
|
240
|
+
_tag: 'runDeferredEffects',
|
|
241
|
+
originalRefreshReasons: Array.from(debugRefreshReasons),
|
|
242
|
+
manualRefreshReason: options?.debugRefreshReason,
|
|
243
|
+
},
|
|
244
|
+
otelContext: options?.otelContext,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
runRefreshCallbacks = () => {
|
|
249
|
+
for (const cb of this.refreshCallbacks) {
|
|
250
|
+
cb();
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
addEdge(superComp, subComp) {
|
|
254
|
+
superComp.sub.add(subComp);
|
|
255
|
+
subComp.super.add(superComp);
|
|
256
|
+
if (this.currentDebugRefresh === undefined) {
|
|
257
|
+
this.runRefreshCallbacks();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
removeEdge(superComp, subComp) {
|
|
261
|
+
superComp.sub.delete(subComp);
|
|
262
|
+
const effectsToRefresh = new Set();
|
|
263
|
+
markSuperCompDirtyRec(subComp, effectsToRefresh);
|
|
264
|
+
for (const effect of effectsToRefresh) {
|
|
265
|
+
this.deferredEffects.set(effect, new Set());
|
|
266
|
+
}
|
|
267
|
+
subComp.super.delete(superComp);
|
|
268
|
+
if (this.currentDebugRefresh === undefined) {
|
|
269
|
+
this.runRefreshCallbacks();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// NOTE This function is performance-optimized (i.e. not using `Array.from`)
|
|
273
|
+
getSnapshot = (opts) => {
|
|
274
|
+
const { includeResults = false } = opts ?? {};
|
|
275
|
+
const atoms = [];
|
|
276
|
+
for (const atom of this.atoms) {
|
|
277
|
+
atoms.push(serializeAtom(atom, includeResults));
|
|
278
|
+
}
|
|
279
|
+
const effects = [];
|
|
280
|
+
for (const effect of this.effects) {
|
|
281
|
+
effects.push(serializeEffect(effect));
|
|
282
|
+
}
|
|
283
|
+
const deferredEffects = [];
|
|
284
|
+
for (const [effect] of this.deferredEffects) {
|
|
285
|
+
deferredEffects.push(effect.id);
|
|
286
|
+
}
|
|
287
|
+
return { atoms, effects, deferredEffects };
|
|
288
|
+
};
|
|
289
|
+
subscribeToRefresh = (cb) => {
|
|
290
|
+
this.refreshCallbacks.add(cb);
|
|
291
|
+
return () => {
|
|
292
|
+
this.refreshCallbacks.delete(cb);
|
|
293
|
+
};
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
const compute = (atom, otelContext) => {
|
|
297
|
+
// const __getResult = atom._tag === 'thunk' ? atom.__getResult.toString() : ''
|
|
298
|
+
if (atom.isDestroyed) {
|
|
299
|
+
shouldNeverHappen(`LiveStore Error: Attempted to compute destroyed ${atom._tag} (${atom.id}): ${atom.label ?? ''}`);
|
|
300
|
+
}
|
|
301
|
+
if (atom.isDirty) {
|
|
302
|
+
// console.log('atom is dirty', atom.id, atom.label ?? '', atom._tag, __getResult)
|
|
303
|
+
const result = atom.computeResult(otelContext);
|
|
304
|
+
atom.isDirty = false;
|
|
305
|
+
atom.previousResult = result;
|
|
306
|
+
return result;
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
// console.log('atom is clean', atom.id, atom.label ?? '', atom._tag, __getResult)
|
|
310
|
+
return atom.previousResult;
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
const markSuperCompDirtyRec = (atom, effectsToRefresh) => {
|
|
314
|
+
for (const superComp of atom.super) {
|
|
315
|
+
if (superComp._tag === 'thunk') {
|
|
316
|
+
superComp.isDirty = true;
|
|
317
|
+
markSuperCompDirtyRec(superComp, effectsToRefresh);
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
effectsToRefresh.add(superComp);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
export const throwContextNotSetError = (graph) => {
|
|
325
|
+
throw new Error(`LiveStore Error: \`context\` not set on ReactiveGraph (${graph.id})`);
|
|
326
|
+
};
|
|
327
|
+
// NOTE This function is performance-optimized (i.e. not using `pick` and `Array.from`)
|
|
328
|
+
const serializeAtom = (atom, includeResult) => {
|
|
329
|
+
const sub = [];
|
|
330
|
+
for (const a of atom.sub) {
|
|
331
|
+
sub.push(a.id);
|
|
332
|
+
}
|
|
333
|
+
const super_ = [];
|
|
334
|
+
for (const a of atom.super) {
|
|
335
|
+
super_.push(a.id);
|
|
336
|
+
}
|
|
337
|
+
const previousResult = includeResult
|
|
338
|
+
? encodedOptionSome(atom.previousResult === NOT_REFRESHED_YET ? '"SYMBOL_NOT_REFRESHED_YET"' : JSON.stringify(atom.previousResult))
|
|
339
|
+
: encodedOptionNone();
|
|
340
|
+
if (atom._tag === 'ref') {
|
|
341
|
+
return {
|
|
342
|
+
_tag: atom._tag,
|
|
343
|
+
id: atom.id,
|
|
344
|
+
label: atom.label,
|
|
345
|
+
meta: atom.meta,
|
|
346
|
+
isDirty: atom.isDirty,
|
|
347
|
+
sub,
|
|
348
|
+
super: super_,
|
|
349
|
+
isDestroyed: atom.isDestroyed,
|
|
350
|
+
refreshes: atom.refreshes,
|
|
351
|
+
previousResult,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
return {
|
|
355
|
+
_tag: 'thunk',
|
|
356
|
+
id: atom.id,
|
|
357
|
+
label: atom.label,
|
|
358
|
+
meta: atom.meta,
|
|
359
|
+
isDirty: atom.isDirty,
|
|
360
|
+
sub,
|
|
361
|
+
super: super_,
|
|
362
|
+
isDestroyed: atom.isDestroyed,
|
|
363
|
+
recomputations: atom.recomputations,
|
|
364
|
+
previousResult,
|
|
365
|
+
};
|
|
366
|
+
};
|
|
367
|
+
// NOTE This function is performance-optimized (i.e. not using `pick` and `Array.from`)
|
|
368
|
+
const serializeEffect = (effect) => {
|
|
369
|
+
const sub = [];
|
|
370
|
+
for (const a of effect.sub) {
|
|
371
|
+
sub.push(a.id);
|
|
372
|
+
}
|
|
373
|
+
return {
|
|
374
|
+
_tag: effect._tag,
|
|
375
|
+
id: effect.id,
|
|
376
|
+
label: effect.label,
|
|
377
|
+
sub,
|
|
378
|
+
invocations: effect.invocations,
|
|
379
|
+
isDestroyed: effect.isDestroyed,
|
|
380
|
+
};
|
|
381
|
+
};
|
|
382
|
+
//# sourceMappingURL=reactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactive.js","sourceRoot":"","sources":["../src/reactive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactive.test.d.ts","sourceRoot":"","sources":["../src/reactive.test.ts"],"names":[],"mappings":""}
|