@livestore/livestore 0.0.12 → 0.0.15
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 +7 -7
- package/dist/.tsbuildinfo +1 -0
- package/dist/QueryCache.d.ts +20 -0
- package/dist/QueryCache.d.ts.map +1 -0
- package/dist/QueryCache.js +71 -0
- package/dist/QueryCache.js.map +1 -0
- package/dist/__tests__/react/fixture.d.ts +25 -0
- package/dist/__tests__/react/fixture.d.ts.map +1 -0
- package/dist/__tests__/react/fixture.js +60 -0
- package/dist/__tests__/react/fixture.js.map +1 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.d.ts +2 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.d.ts.map +1 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.js +78 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.js.map +1 -0
- package/dist/__tests__/reactive.test.d.ts +2 -0
- package/dist/__tests__/reactive.test.d.ts.map +1 -0
- package/dist/__tests__/reactive.test.js +197 -0
- package/dist/__tests__/reactive.test.js.map +1 -0
- package/dist/bounded-collections.d.ts +34 -0
- package/dist/bounded-collections.d.ts.map +1 -0
- package/dist/bounded-collections.js +103 -0
- package/dist/bounded-collections.js.map +1 -0
- package/dist/componentKey.d.ts +20 -0
- package/dist/componentKey.d.ts.map +1 -0
- package/dist/componentKey.js +3 -0
- package/dist/componentKey.js.map +1 -0
- package/dist/effect/LiveStore.d.ts +36 -0
- package/dist/effect/LiveStore.d.ts.map +1 -0
- package/dist/effect/LiveStore.js +41 -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/events.d.ts +7 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +2 -0
- package/dist/events.js.map +1 -0
- package/dist/inMemoryDatabase.d.ts +56 -0
- package/dist/inMemoryDatabase.d.ts.map +1 -0
- package/dist/inMemoryDatabase.js +223 -0
- package/dist/inMemoryDatabase.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations.d.ts +16 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +67 -0
- package/dist/migrations.js.map +1 -0
- package/dist/otel.d.ts +4 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +6 -0
- package/dist/otel.js.map +1 -0
- package/dist/react/LiveStoreContext.d.ts +11 -0
- package/dist/react/LiveStoreContext.d.ts.map +1 -0
- package/dist/react/LiveStoreContext.js +10 -0
- package/dist/react/LiveStoreContext.js.map +1 -0
- package/dist/react/LiveStoreProvider.d.ts +20 -0
- package/dist/react/LiveStoreProvider.d.ts.map +1 -0
- package/dist/react/LiveStoreProvider.js +52 -0
- package/dist/react/LiveStoreProvider.js.map +1 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +6 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/useGraphQL.d.ts +13 -0
- package/dist/react/useGraphQL.d.ts.map +1 -0
- package/dist/react/useGraphQL.js +85 -0
- package/dist/react/useGraphQL.js.map +1 -0
- package/dist/react/useLiveStoreComponent.d.ts +75 -0
- package/dist/react/useLiveStoreComponent.d.ts.map +1 -0
- package/dist/react/useLiveStoreComponent.js +317 -0
- package/dist/react/useLiveStoreComponent.js.map +1 -0
- package/dist/react/useQuery.d.ts +3 -0
- package/dist/react/useQuery.d.ts.map +1 -0
- package/dist/react/useQuery.js +38 -0
- package/dist/react/useQuery.js.map +1 -0
- package/dist/react/utils/useStateRefWithReactiveInput.d.ts +13 -0
- package/dist/react/utils/useStateRefWithReactiveInput.d.ts.map +1 -0
- package/dist/react/utils/useStateRefWithReactiveInput.js +38 -0
- package/dist/react/utils/useStateRefWithReactiveInput.js.map +1 -0
- package/dist/reactive.d.ts +140 -0
- package/dist/reactive.d.ts.map +1 -0
- package/dist/reactive.js +302 -0
- package/dist/reactive.js.map +1 -0
- package/dist/reactiveQueries/base-class.d.ts +27 -0
- package/dist/reactiveQueries/base-class.d.ts.map +1 -0
- package/dist/reactiveQueries/base-class.js +23 -0
- package/dist/reactiveQueries/base-class.js.map +1 -0
- package/dist/reactiveQueries/graphql.d.ts +25 -0
- package/dist/reactiveQueries/graphql.d.ts.map +1 -0
- package/dist/reactiveQueries/graphql.js +18 -0
- package/dist/reactiveQueries/graphql.js.map +1 -0
- package/dist/reactiveQueries/js.d.ts +19 -0
- package/dist/reactiveQueries/js.d.ts.map +1 -0
- package/dist/reactiveQueries/js.js +13 -0
- package/dist/reactiveQueries/js.js.map +1 -0
- package/dist/reactiveQueries/sql.d.ts +31 -0
- package/dist/reactiveQueries/sql.d.ts.map +1 -0
- package/dist/reactiveQueries/sql.js +32 -0
- package/dist/reactiveQueries/sql.js.map +1 -0
- package/dist/schema.d.ts +81 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +46 -0
- package/dist/schema.js.map +1 -0
- package/dist/storage/in-memory/index.d.ts +15 -0
- package/dist/storage/in-memory/index.d.ts.map +1 -0
- package/dist/storage/in-memory/index.js +14 -0
- package/dist/storage/in-memory/index.js.map +1 -0
- package/dist/storage/index.d.ts +14 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +9 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/tauri/index.d.ts +19 -0
- package/dist/storage/tauri/index.d.ts.map +1 -0
- package/dist/storage/tauri/index.js +38 -0
- package/dist/storage/tauri/index.js.map +1 -0
- package/dist/storage/utils/idb.d.ts +10 -0
- package/dist/storage/utils/idb.d.ts.map +1 -0
- package/dist/storage/utils/idb.js +58 -0
- package/dist/storage/utils/idb.js.map +1 -0
- package/dist/storage/web-worker/index.d.ts +27 -0
- package/dist/storage/web-worker/index.d.ts.map +1 -0
- package/dist/storage/web-worker/index.js +74 -0
- package/dist/storage/web-worker/index.js.map +1 -0
- package/dist/storage/web-worker/worker.d.ts +13 -0
- package/dist/storage/web-worker/worker.d.ts.map +1 -0
- package/dist/storage/web-worker/worker.js +110 -0
- package/dist/storage/web-worker/worker.js.map +1 -0
- package/dist/store.d.ts +199 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +603 -0
- package/dist/store.js.map +1 -0
- package/dist/util.d.ts +28 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +55 -0
- package/dist/util.js.map +1 -0
- package/package.json +46 -19
- package/src/__tests__/react/fixture.tsx +23 -32
- package/src/__tests__/reactive.test.ts +3 -4
- package/src/effect/LiveStore.ts +22 -31
- package/src/events.ts +1 -1
- package/src/inMemoryDatabase.ts +115 -140
- package/src/index.ts +20 -20
- package/src/migrations.ts +119 -0
- package/src/otel.ts +0 -11
- package/src/react/LiveStoreProvider.tsx +24 -23
- package/src/react/index.ts +10 -1
- package/src/react/useGraphQL.ts +28 -2
- package/src/react/useLiveStoreComponent.ts +134 -50
- package/src/react/useQuery.ts +56 -0
- package/src/reactive.ts +6 -4
- package/src/reactiveQueries/base-class.ts +9 -3
- package/src/reactiveQueries/graphql.ts +4 -4
- package/src/reactiveQueries/js.ts +2 -2
- package/src/reactiveQueries/sql.ts +6 -6
- package/src/schema.ts +69 -145
- package/src/storage/in-memory/index.ts +21 -0
- package/src/storage/index.ts +27 -0
- package/src/{backends/tauri.ts → storage/tauri/index.ts} +14 -28
- package/src/storage/web-worker/index.ts +116 -0
- package/src/{backends/web-worker.ts → storage/web-worker/worker.ts} +17 -52
- package/src/store.ts +171 -98
- package/src/util.ts +13 -3
- package/tsconfig.json +1 -3
- package/src/backends/base.ts +0 -67
- package/src/backends/index.ts +0 -98
- package/src/backends/noop.ts +0 -32
- package/src/backends/web-in-memory.ts +0 -65
- package/src/backends/web.ts +0 -97
- package/src/react/useGlobalQuery.ts +0 -40
- /package/src/{backends → storage}/utils/idb.ts +0 -0
package/dist/store.js
ADDED
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
import { assertNever, makeNoopSpan, makeNoopTracer, shouldNeverHappen } from '@livestore/utils';
|
|
2
|
+
import { identity } from '@livestore/utils/effect';
|
|
3
|
+
import * as otel from '@opentelemetry/api';
|
|
4
|
+
import * as graphql from 'graphql';
|
|
5
|
+
import { uniqueId } from 'lodash-es';
|
|
6
|
+
import * as ReactDOM from 'react-dom';
|
|
7
|
+
import { v4 as uuid } from 'uuid';
|
|
8
|
+
import { tableNameForComponentKey } from './componentKey.js';
|
|
9
|
+
import { InMemoryDatabase } from './inMemoryDatabase.js';
|
|
10
|
+
import { migrateDb } from './migrations.js';
|
|
11
|
+
import { getDurationMsFromSpan } from './otel.js';
|
|
12
|
+
import { ReactiveGraph } from './reactive.js';
|
|
13
|
+
import { LiveStoreGraphQLQuery } from './reactiveQueries/graphql.js';
|
|
14
|
+
import { LiveStoreJSQuery } from './reactiveQueries/js.js';
|
|
15
|
+
import { LiveStoreSQLQuery } from './reactiveQueries/sql.js';
|
|
16
|
+
import { componentStateTables } from './schema.js';
|
|
17
|
+
import { isPromise, prepareBindValues, sql } from './util.js';
|
|
18
|
+
const globalComponentKey = { _tag: 'singleton', componentName: '__global', id: 'singleton' };
|
|
19
|
+
export class Store {
|
|
20
|
+
constructor({ db, dbProxy, schema, storage, graphQLOptions, otelTracer, otelRootSpanContext, }) {
|
|
21
|
+
/**
|
|
22
|
+
* Creates a reactive LiveStore SQL query
|
|
23
|
+
*
|
|
24
|
+
* NOTE The query is actually running (even if no one has subscribed to it yet) and will be kept up to date.
|
|
25
|
+
*/
|
|
26
|
+
this.querySQL = (genQueryString, { queriedTables, bindValues, componentKey, label, otelContext = otel.context.active(), }) => this.otel.tracer.startActiveSpan('querySQL', // NOTE span name will be overridden further down
|
|
27
|
+
{ attributes: { label } }, otelContext, (span) => {
|
|
28
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
29
|
+
const queryString$ = this.graph.makeThunk((get, addDebugInfo) => {
|
|
30
|
+
if (typeof genQueryString === 'function') {
|
|
31
|
+
const getAtom = (atom) => {
|
|
32
|
+
if (atom._tag === 'thunk' || atom._tag === 'ref')
|
|
33
|
+
return get(atom);
|
|
34
|
+
return get(atom.results$);
|
|
35
|
+
};
|
|
36
|
+
const queryString = genQueryString(getAtom);
|
|
37
|
+
addDebugInfo({ _tag: 'js', label: `${label}:queryString`, query: queryString });
|
|
38
|
+
return queryString;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
return genQueryString;
|
|
42
|
+
}
|
|
43
|
+
}, { label: `${label}:queryString`, meta: { liveStoreThunkType: 'sqlQueryString' } }, otelContext);
|
|
44
|
+
label = label ?? queryString$.result;
|
|
45
|
+
span.updateName(`querySQL:${label}`);
|
|
46
|
+
const queryLabel = `${label}:results` + (this.temporaryQueries ? ':temp' : '');
|
|
47
|
+
const results$ = this.graph.makeThunk((get, addDebugInfo) => this.otel.tracer.startActiveSpan('sql:', // NOTE span name will be overridden further down
|
|
48
|
+
{}, otelContext, (span) => {
|
|
49
|
+
try {
|
|
50
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
51
|
+
// Establish a reactive dependency on the tables used in the query
|
|
52
|
+
for (const tableName of queriedTables) {
|
|
53
|
+
const tableRef = this.tableRefs[tableName] ?? shouldNeverHappen(`No table ref found for ${tableName}`);
|
|
54
|
+
get(tableRef);
|
|
55
|
+
}
|
|
56
|
+
const sqlString = get(queryString$);
|
|
57
|
+
span.setAttribute('sql.query', sqlString);
|
|
58
|
+
span.updateName(`sql:${sqlString.slice(0, 50)}`);
|
|
59
|
+
const results = this.inMemoryDB.select(sqlString, {
|
|
60
|
+
queriedTables,
|
|
61
|
+
bindValues: bindValues ? prepareBindValues(bindValues, sqlString) : undefined,
|
|
62
|
+
otelContext,
|
|
63
|
+
});
|
|
64
|
+
span.setAttribute('sql.rowsCount', results.length);
|
|
65
|
+
addDebugInfo({ _tag: 'sql', label: label ?? '', query: sqlString });
|
|
66
|
+
return results;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
span.end();
|
|
70
|
+
}
|
|
71
|
+
}), { label: queryLabel }, otelContext);
|
|
72
|
+
const query = new LiveStoreSQLQuery({
|
|
73
|
+
label,
|
|
74
|
+
queryString$,
|
|
75
|
+
results$,
|
|
76
|
+
componentKey: componentKey ?? globalComponentKey,
|
|
77
|
+
store: this,
|
|
78
|
+
otelContext,
|
|
79
|
+
});
|
|
80
|
+
this.activeQueries.add(query);
|
|
81
|
+
// TODO get rid of temporary query workaround
|
|
82
|
+
if (this.temporaryQueries !== undefined) {
|
|
83
|
+
this.temporaryQueries.add(query);
|
|
84
|
+
}
|
|
85
|
+
// NOTE we are not ending the span here but in the query `destroy` method
|
|
86
|
+
return query;
|
|
87
|
+
});
|
|
88
|
+
this.queryJS = (genResults, { componentKey = globalComponentKey, label = `js${uniqueId()}`, otelContext = otel.context.active(), }) => this.otel.tracer.startActiveSpan(`queryJS:${label}`, { attributes: { label } }, otelContext, (span) => {
|
|
89
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
90
|
+
const queryLabel = `${label}:results` + (this.temporaryQueries ? ':temp' : '');
|
|
91
|
+
const results$ = this.graph.makeThunk((get, addDebugInfo) => {
|
|
92
|
+
const getAtom = (atom) => {
|
|
93
|
+
if (atom._tag === 'thunk' || atom._tag === 'ref')
|
|
94
|
+
return get(atom);
|
|
95
|
+
return get(atom.results$);
|
|
96
|
+
};
|
|
97
|
+
addDebugInfo({ _tag: 'js', label, query: genResults.toString() });
|
|
98
|
+
return genResults(getAtom);
|
|
99
|
+
}, { label: queryLabel, meta: { liveStoreThunkType: 'jsResults' } }, otelContext);
|
|
100
|
+
const query = new LiveStoreJSQuery({
|
|
101
|
+
label,
|
|
102
|
+
results$,
|
|
103
|
+
componentKey,
|
|
104
|
+
store: this,
|
|
105
|
+
otelContext,
|
|
106
|
+
});
|
|
107
|
+
this.activeQueries.add(query);
|
|
108
|
+
// TODO get rid of temporary query workaround
|
|
109
|
+
if (this.temporaryQueries !== undefined) {
|
|
110
|
+
this.temporaryQueries.add(query);
|
|
111
|
+
}
|
|
112
|
+
// NOTE we are not ending the span here but in the query `destroy` method
|
|
113
|
+
return query;
|
|
114
|
+
});
|
|
115
|
+
this.queryGraphQL = (document, genVariableValues, { componentKey, label, otelContext = otel.context.active(), }) => this.otel.tracer.startActiveSpan(`queryGraphQL:`, // NOTE span name will be overridden further down
|
|
116
|
+
{}, otelContext, (span) => {
|
|
117
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
118
|
+
if (this.graphQLContext === undefined) {
|
|
119
|
+
return shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL context");
|
|
120
|
+
}
|
|
121
|
+
const labelWithDefault = label ?? graphql.getOperationAST(document)?.name?.value ?? 'graphql';
|
|
122
|
+
span.updateName(`queryGraphQL:${labelWithDefault}`);
|
|
123
|
+
const variableValues$ = this.graph.makeThunk((get) => {
|
|
124
|
+
if (typeof genVariableValues === 'function') {
|
|
125
|
+
const getAtom = (atom) => {
|
|
126
|
+
if (atom._tag === 'thunk' || atom._tag === 'ref')
|
|
127
|
+
return get(atom);
|
|
128
|
+
return get(atom.results$);
|
|
129
|
+
};
|
|
130
|
+
return genVariableValues(getAtom);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
return genVariableValues;
|
|
134
|
+
}
|
|
135
|
+
}, { label: `${labelWithDefault}:variableValues`, meta: { liveStoreThunkType: 'graphqlVariableValues' } }, otelContext);
|
|
136
|
+
const resultsLabel = `${labelWithDefault}:results` + (this.temporaryQueries ? ':temp' : '');
|
|
137
|
+
const results$ = this.graph.makeThunk((get, addDebugInfo) => {
|
|
138
|
+
const variableValues = get(variableValues$);
|
|
139
|
+
const { result, queriedTables } = this.queryGraphQLOnce(document, variableValues, otelContext);
|
|
140
|
+
// Add dependencies on any tables that were used
|
|
141
|
+
for (const tableName of queriedTables) {
|
|
142
|
+
const tableRef = this.tableRefs[tableName];
|
|
143
|
+
assertNever(tableRef !== undefined, `No table ref found for ${tableName}`);
|
|
144
|
+
get(tableRef);
|
|
145
|
+
}
|
|
146
|
+
addDebugInfo({ _tag: 'graphql', label: resultsLabel, query: graphql.print(document) });
|
|
147
|
+
return result;
|
|
148
|
+
}, { label: resultsLabel, meta: { liveStoreThunkType: 'graphqlResults' } }, otelContext);
|
|
149
|
+
const query = new LiveStoreGraphQLQuery({
|
|
150
|
+
document,
|
|
151
|
+
context: this.graphQLContext,
|
|
152
|
+
results$,
|
|
153
|
+
componentKey,
|
|
154
|
+
label: labelWithDefault,
|
|
155
|
+
store: this,
|
|
156
|
+
otelContext,
|
|
157
|
+
});
|
|
158
|
+
this.activeQueries.add(query);
|
|
159
|
+
// TODO get rid of temporary query workaround
|
|
160
|
+
if (this.temporaryQueries !== undefined) {
|
|
161
|
+
this.temporaryQueries.add(query);
|
|
162
|
+
}
|
|
163
|
+
// NOTE we are not ending the span here but in the query `destroy` method
|
|
164
|
+
return query;
|
|
165
|
+
});
|
|
166
|
+
this.queryGraphQLOnce = (document, variableValues, otelContext = this.otel.queriesSpanContext) => {
|
|
167
|
+
const schema = this.graphQLSchema ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL schema");
|
|
168
|
+
const context = this.graphQLContext ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL context");
|
|
169
|
+
const tracer = this.otel.tracer;
|
|
170
|
+
const operationName = graphql.getOperationAST(document)?.name?.value;
|
|
171
|
+
return tracer.startActiveSpan(`executeGraphQLQuery: ${operationName}`, {}, otelContext, (span) => {
|
|
172
|
+
try {
|
|
173
|
+
span.setAttribute('graphql.variables', JSON.stringify(variableValues));
|
|
174
|
+
span.setAttribute('graphql.query', graphql.print(document));
|
|
175
|
+
context.queriedTables.clear();
|
|
176
|
+
context.otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
177
|
+
const res = graphql.executeSync({
|
|
178
|
+
document,
|
|
179
|
+
contextValue: context,
|
|
180
|
+
schema: schema,
|
|
181
|
+
variableValues,
|
|
182
|
+
});
|
|
183
|
+
// TODO track number of nested SQL queries via Otel + debug info
|
|
184
|
+
if (res.errors) {
|
|
185
|
+
span.setStatus({ code: otel.SpanStatusCode.ERROR, message: 'GraphQL error' });
|
|
186
|
+
span.setAttribute('graphql.error', res.errors.join('\n'));
|
|
187
|
+
span.setAttribute('graphql.error-detail', JSON.stringify(res.errors));
|
|
188
|
+
console.error(`graphql error (${operationName})`, res.errors);
|
|
189
|
+
}
|
|
190
|
+
return { result: res.data, queriedTables: Array.from(context.queriedTables.values()) };
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
span.end();
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* Subscribe to the results of a query
|
|
199
|
+
* Returns a function to cancel the subscription.
|
|
200
|
+
*/
|
|
201
|
+
this.subscribe = (query, onNewValue, onSubsubscribe, options) => this.otel.tracer.startActiveSpan(`LiveStore.subscribe`, { attributes: { label: options?.label } }, query.otelContext, (span) => {
|
|
202
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
203
|
+
const effect = this.graph.makeEffect((get) => {
|
|
204
|
+
const result = get(query.results$);
|
|
205
|
+
onNewValue(result);
|
|
206
|
+
}, { label: `subscribe:${options?.label}` }, otelContext);
|
|
207
|
+
const subscriptionKey = uuid();
|
|
208
|
+
const unsubscribe = () => {
|
|
209
|
+
try {
|
|
210
|
+
this.graph.destroy(effect);
|
|
211
|
+
query.activeSubscriptions.delete(subscriptionKey);
|
|
212
|
+
onSubsubscribe?.();
|
|
213
|
+
}
|
|
214
|
+
finally {
|
|
215
|
+
span.end();
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
query.activeSubscriptions.set(subscriptionKey, unsubscribe);
|
|
219
|
+
return unsubscribe;
|
|
220
|
+
});
|
|
221
|
+
/**
|
|
222
|
+
* Any queries created in the callback will be destroyed when the callback is complete.
|
|
223
|
+
* Useful for temporarily creating reactive queries, which is an idempotent operation
|
|
224
|
+
* that can be safely called inside a React useMemo hook.
|
|
225
|
+
*/
|
|
226
|
+
this.inTempQueryContext = (callback) => {
|
|
227
|
+
this.temporaryQueries = new Set();
|
|
228
|
+
// TODO: consider errors / try/finally here?
|
|
229
|
+
const result = callback();
|
|
230
|
+
for (const query of this.temporaryQueries) {
|
|
231
|
+
this.destroyQuery(query);
|
|
232
|
+
}
|
|
233
|
+
this.temporaryQueries = undefined;
|
|
234
|
+
return result;
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* Destroys the entire store, including all queries and subscriptions.
|
|
238
|
+
*
|
|
239
|
+
* Currently only used when shutting down the app for debugging purposes (e.g. to close Otel spans).
|
|
240
|
+
*/
|
|
241
|
+
this.destroy = () => {
|
|
242
|
+
for (const query of this.activeQueries) {
|
|
243
|
+
this.destroyQuery(query);
|
|
244
|
+
}
|
|
245
|
+
Object.values(this.tableRefs).forEach((tableRef) => this.graph.destroy(tableRef));
|
|
246
|
+
const applyEventsSpan = otel.trace.getSpan(this.otel.applyEventsSpanContext);
|
|
247
|
+
applyEventsSpan.end();
|
|
248
|
+
const queriesSpan = otel.trace.getSpan(this.otel.queriesSpanContext);
|
|
249
|
+
queriesSpan.end();
|
|
250
|
+
// TODO destroy active subscriptions
|
|
251
|
+
};
|
|
252
|
+
this.destroyQuery = (query) => {
|
|
253
|
+
if (query._tag === 'sql') {
|
|
254
|
+
// results are downstream of query string, so will automatically be destroyed together
|
|
255
|
+
this.graph.destroy(query.queryString$);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
this.graph.destroy(query.results$);
|
|
259
|
+
}
|
|
260
|
+
this.activeQueries.delete(query);
|
|
261
|
+
query.destroy();
|
|
262
|
+
};
|
|
263
|
+
/**
|
|
264
|
+
* Clean up queries and downstream subscriptions associated with a component.
|
|
265
|
+
* This is critical to avoid memory leaks.
|
|
266
|
+
*/
|
|
267
|
+
this.unmountComponent = (componentKey) => {
|
|
268
|
+
for (const query of this.activeQueries) {
|
|
269
|
+
if (query.componentKey === componentKey) {
|
|
270
|
+
this.destroyQuery(query);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
/* Apply a single write event to the store, and refresh all queries in response */
|
|
275
|
+
this.applyEvent = (eventType, args = {}, options) => {
|
|
276
|
+
const skipRefresh = options?.skipRefresh ?? false;
|
|
277
|
+
// console.log('applyEvent', { eventType, args, skipRefresh })
|
|
278
|
+
const applyEventsSpan = otel.trace.getSpan(this.otel.applyEventsSpanContext);
|
|
279
|
+
applyEventsSpan.addEvent('applyEvent');
|
|
280
|
+
return this.otel.tracer.startActiveSpan('LiveStore:applyEvent', { attributes: {} }, this.otel.applyEventsSpanContext, (span) => {
|
|
281
|
+
try {
|
|
282
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
283
|
+
const writeTables = this.applyEventWithoutRefresh(eventType, args, otelContext).writeTables;
|
|
284
|
+
const tablesToUpdate = [];
|
|
285
|
+
for (const tableName of writeTables) {
|
|
286
|
+
const tableRef = this.tableRefs[tableName];
|
|
287
|
+
assertNever(tableRef !== undefined, `No table ref found for ${tableName}`);
|
|
288
|
+
tablesToUpdate.push([tableRef, null]);
|
|
289
|
+
}
|
|
290
|
+
// Update all table refs together in a batch, to only trigger one reactive update
|
|
291
|
+
this.graph.setRefs(tablesToUpdate, {
|
|
292
|
+
otelHint: 'applyEvents',
|
|
293
|
+
skipRefresh,
|
|
294
|
+
debugRefreshReason: {
|
|
295
|
+
_tag: 'applyEvent',
|
|
296
|
+
event: { type: eventType, args },
|
|
297
|
+
writeTables: [...writeTables],
|
|
298
|
+
},
|
|
299
|
+
}, otelContext);
|
|
300
|
+
}
|
|
301
|
+
catch (e) {
|
|
302
|
+
span.setStatus({ code: otel.SpanStatusCode.ERROR, message: e.toString() });
|
|
303
|
+
console.error(e);
|
|
304
|
+
shouldNeverHappen(`Error applying event (${eventType}): ${e.toString()}`);
|
|
305
|
+
}
|
|
306
|
+
finally {
|
|
307
|
+
span.end();
|
|
308
|
+
return { durationMs: getDurationMsFromSpan(span) };
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
};
|
|
312
|
+
/**
|
|
313
|
+
* Apply multiple write events to the store, and refresh all queries in response.
|
|
314
|
+
* This is faster than calling applyEvent many times in quick succession because
|
|
315
|
+
* we can do a single refresh after all the events.
|
|
316
|
+
*/
|
|
317
|
+
this.applyEvents = (
|
|
318
|
+
// TODO make args type-safe in polymorphic array case
|
|
319
|
+
events, options) => {
|
|
320
|
+
const label = options?.label ?? 'applyEvents';
|
|
321
|
+
const skipRefresh = options?.skipRefresh ?? false;
|
|
322
|
+
const applyEventsSpan = otel.trace.getSpan(this.otel.applyEventsSpanContext);
|
|
323
|
+
applyEventsSpan.addEvent('applyEvents');
|
|
324
|
+
// console.log('applyEvents', { skipRefresh, events: [...events] })
|
|
325
|
+
return this.otel.tracer.startActiveSpan('LiveStore:applyEvents', { attributes: { 'livestore.applyEventsLabel': label } }, this.otel.applyEventsSpanContext, (span) => {
|
|
326
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
327
|
+
try {
|
|
328
|
+
const writeTables = new Set();
|
|
329
|
+
this.otel.tracer.startActiveSpan('LiveStore:processWrites', { attributes: { 'livestore.applyEventsLabel': label } }, otel.trace.setSpan(otel.context.active(), span), (span) => {
|
|
330
|
+
try {
|
|
331
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
332
|
+
// TODO: what to do about storage transaction here?
|
|
333
|
+
this.inMemoryDB.txn(() => {
|
|
334
|
+
for (const event of events) {
|
|
335
|
+
try {
|
|
336
|
+
const { writeTables: writeTablesForEvent } = this.applyEventWithoutRefresh(event.eventType, event.args, otelContext);
|
|
337
|
+
for (const tableName of writeTablesForEvent) {
|
|
338
|
+
writeTables.add(tableName);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
catch (e) {
|
|
342
|
+
console.error(e, event);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
catch (e) {
|
|
348
|
+
console.error(e);
|
|
349
|
+
span.setStatus({ code: otel.SpanStatusCode.ERROR, message: e.toString() });
|
|
350
|
+
}
|
|
351
|
+
finally {
|
|
352
|
+
span.end();
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
const tablesToUpdate = [];
|
|
356
|
+
for (const tableName of writeTables) {
|
|
357
|
+
const tableRef = this.tableRefs[tableName];
|
|
358
|
+
assertNever(tableRef !== undefined, `No table ref found for ${tableName}`);
|
|
359
|
+
tablesToUpdate.push([tableRef, null]);
|
|
360
|
+
}
|
|
361
|
+
// Update all table refs together in a batch, to only trigger one reactive update
|
|
362
|
+
this.graph.setRefs(tablesToUpdate, {
|
|
363
|
+
otelHint: 'applyEvents',
|
|
364
|
+
skipRefresh,
|
|
365
|
+
debugRefreshReason: {
|
|
366
|
+
_tag: 'applyEvents',
|
|
367
|
+
events: [...events].map((e) => ({ type: e.eventType, args: e.args })),
|
|
368
|
+
writeTables: [...writeTables],
|
|
369
|
+
},
|
|
370
|
+
}, otelContext);
|
|
371
|
+
}
|
|
372
|
+
catch (e) {
|
|
373
|
+
span.setStatus({ code: otel.SpanStatusCode.ERROR, message: e.toString() });
|
|
374
|
+
}
|
|
375
|
+
finally {
|
|
376
|
+
span.end();
|
|
377
|
+
return { durationMs: getDurationMsFromSpan(span) };
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
};
|
|
381
|
+
/**
|
|
382
|
+
* This can be used in combination with `skipRefresh` when applying events.
|
|
383
|
+
* We might need a better solution for this. Let's see.
|
|
384
|
+
*/
|
|
385
|
+
this.manualRefresh = (options) => {
|
|
386
|
+
const { label } = options ?? {};
|
|
387
|
+
this.otel.tracer.startActiveSpan('LiveStore:manualRefresh', { attributes: { 'livestore.manualRefreshLabel': label } }, this.otel.applyEventsSpanContext, (span) => {
|
|
388
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
389
|
+
this.graph.refresh({ otelHint: 'manualRefresh', debugRefreshReason: { _tag: 'manualRefresh' } }, otelContext);
|
|
390
|
+
span.end();
|
|
391
|
+
});
|
|
392
|
+
};
|
|
393
|
+
// TODO get rid of this as part of new query definition approach https://www.notion.so/schickling/New-query-definition-approach-1097a78ef0e9495bac25f90417374756?pvs=4
|
|
394
|
+
this.runOnce = (queryDef) => {
|
|
395
|
+
return this.inTempQueryContext(() => {
|
|
396
|
+
return queryDef(this).results$.result;
|
|
397
|
+
});
|
|
398
|
+
};
|
|
399
|
+
/**
|
|
400
|
+
* Apply an event to the store.
|
|
401
|
+
* Returns the tables that were affected by the event.
|
|
402
|
+
* This is an internal method that doesn't trigger a refresh;
|
|
403
|
+
* the caller must refresh queries after calling this method.
|
|
404
|
+
*/
|
|
405
|
+
this.applyEventWithoutRefresh = (eventType, args = {}, otelContext) => {
|
|
406
|
+
return this.otel.tracer.startActiveSpan('LiveStore:applyEventWithoutRefresh', {
|
|
407
|
+
attributes: {
|
|
408
|
+
'livestore.actionType': eventType,
|
|
409
|
+
'livestore.args': JSON.stringify(args, null, 2),
|
|
410
|
+
},
|
|
411
|
+
}, otelContext, (span) => {
|
|
412
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
413
|
+
const actionDefinitions = {
|
|
414
|
+
...this.schema.actions,
|
|
415
|
+
// Special LiveStore:defined actions
|
|
416
|
+
updateComponentState: {
|
|
417
|
+
statement: ({ componentKey, columnNames }) => {
|
|
418
|
+
const whereClause = componentKey._tag === 'singleton' ? '' : `where id = '${componentKey.id}'`;
|
|
419
|
+
const updateClause = columnNames.map((columnName) => `${columnName} = $${columnName}`).join(', ');
|
|
420
|
+
const stmt = sql `update ${tableNameForComponentKey(componentKey)} set ${updateClause} ${whereClause}`;
|
|
421
|
+
return {
|
|
422
|
+
sql: stmt,
|
|
423
|
+
writeTables: [tableNameForComponentKey(componentKey)],
|
|
424
|
+
};
|
|
425
|
+
},
|
|
426
|
+
},
|
|
427
|
+
RawSql: {
|
|
428
|
+
statement: ({ sql, writeTables }) => ({
|
|
429
|
+
sql,
|
|
430
|
+
writeTables,
|
|
431
|
+
argsAlreadyBound: false,
|
|
432
|
+
}),
|
|
433
|
+
prepareBindValues: ({ bindValues }) => bindValues,
|
|
434
|
+
},
|
|
435
|
+
};
|
|
436
|
+
const actionDefinition = actionDefinitions[eventType] ?? shouldNeverHappen(`Unknown event type: ${eventType}`);
|
|
437
|
+
// Generate a fresh ID for the event
|
|
438
|
+
const eventWithId = { id: uuid(), type: eventType, args };
|
|
439
|
+
// Synchronously apply the event to the in-memory database
|
|
440
|
+
// const { durationMs } = this.inMemoryDB.applyEvent(eventWithId, actionDefinition, otelContext)
|
|
441
|
+
const { statement, bindValues } = eventToSql(eventWithId, actionDefinition);
|
|
442
|
+
const { durationMs } = this.inMemoryDB.execute(statement.sql, prepareBindValues(bindValues, statement.sql), statement.writeTables, {
|
|
443
|
+
otelContext,
|
|
444
|
+
});
|
|
445
|
+
// Asynchronously apply the event to a persistent storage (we're not awaiting this promise here)
|
|
446
|
+
if (this.storage !== undefined) {
|
|
447
|
+
// this.storage.applyEvent(eventWithId, actionDefinition, span)
|
|
448
|
+
this.storage.execute(statement.sql, prepareBindValues(bindValues, statement.sql), span);
|
|
449
|
+
}
|
|
450
|
+
// Uncomment to print a list of queries currently registered on the store
|
|
451
|
+
// console.log(JSON.parse(JSON.stringify([...this.queries].map((q) => `${labelForKey(q.componentKey)}/${q.label}`))))
|
|
452
|
+
// const statement =
|
|
453
|
+
// typeof actionDefinition.statement === 'function'
|
|
454
|
+
// ? actionDefinition.statement(args)
|
|
455
|
+
// : actionDefinition.statement
|
|
456
|
+
span.end();
|
|
457
|
+
return { writeTables: statement.writeTables, durationMs };
|
|
458
|
+
});
|
|
459
|
+
};
|
|
460
|
+
/**
|
|
461
|
+
* Directly execute a SQL query on the Store.
|
|
462
|
+
* This should only be used for framework-internal purposes;
|
|
463
|
+
* all app writes should go through applyEvent.
|
|
464
|
+
*/
|
|
465
|
+
this.execute = async (query, params = {}, writeTables) => {
|
|
466
|
+
this.inMemoryDB.execute(query, prepareBindValues(params, query), writeTables);
|
|
467
|
+
if (this.storage !== undefined) {
|
|
468
|
+
const parentSpan = otel.trace.getSpan(otel.context.active());
|
|
469
|
+
this.storage.execute(query, prepareBindValues(params, query), parentSpan);
|
|
470
|
+
}
|
|
471
|
+
};
|
|
472
|
+
this.inMemoryDB = db;
|
|
473
|
+
this._proxyDb = dbProxy;
|
|
474
|
+
this.graph = new ReactiveGraph({
|
|
475
|
+
// TODO move this into React module
|
|
476
|
+
// Do all our updates inside a single React setState batch to avoid multiple UI re-renders
|
|
477
|
+
effectsWrapper: (run) => ReactDOM.unstable_batchedUpdates(() => run()),
|
|
478
|
+
otelTracer,
|
|
479
|
+
});
|
|
480
|
+
this.schema = schema;
|
|
481
|
+
// TODO generalize the `tableRefs` concept to allow finer-grained refs
|
|
482
|
+
this.tableRefs = {};
|
|
483
|
+
this.activeQueries = new Set();
|
|
484
|
+
this.storage = storage;
|
|
485
|
+
const applyEventsSpan = otelTracer.startSpan('LiveStore:applyEvents', {}, otelRootSpanContext);
|
|
486
|
+
const otelApplyEventsSpanContext = otel.trace.setSpan(otel.context.active(), applyEventsSpan);
|
|
487
|
+
const queriesSpan = otelTracer.startSpan('LiveStore:queries', {}, otelRootSpanContext);
|
|
488
|
+
const otelQueriesSpanContext = otel.trace.setSpan(otel.context.active(), queriesSpan);
|
|
489
|
+
this.otel = {
|
|
490
|
+
tracer: otelTracer,
|
|
491
|
+
applyEventsSpanContext: otelApplyEventsSpanContext,
|
|
492
|
+
queriesSpanContext: otelQueriesSpanContext,
|
|
493
|
+
};
|
|
494
|
+
const allTableNames = [
|
|
495
|
+
...Object.keys(this.schema.tables),
|
|
496
|
+
...Object.keys(this.schema.materializedViews),
|
|
497
|
+
...Object.keys(componentStateTables),
|
|
498
|
+
];
|
|
499
|
+
for (const tableName of allTableNames) {
|
|
500
|
+
this.tableRefs[tableName] = this.graph.makeRef(null, {
|
|
501
|
+
equal: () => false,
|
|
502
|
+
label: tableName,
|
|
503
|
+
meta: { liveStoreRefType: 'table' },
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
if (graphQLOptions) {
|
|
507
|
+
this.graphQLSchema = graphQLOptions.schema;
|
|
508
|
+
this.graphQLContext = graphQLOptions.makeContext(db, this.otel.tracer);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
Store.createStore = (storeOptions, parentSpan) => {
|
|
513
|
+
const ctx = otel.trace.setSpan(otel.context.active(), parentSpan);
|
|
514
|
+
return storeOptions.otelTracer.startActiveSpan('LiveStore:store-constructor', {}, ctx, (span) => {
|
|
515
|
+
try {
|
|
516
|
+
return new Store(storeOptions);
|
|
517
|
+
}
|
|
518
|
+
finally {
|
|
519
|
+
span.end();
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
};
|
|
523
|
+
/** Create a new LiveStore Store */
|
|
524
|
+
export const createStore = async ({ schema, loadStorage, graphQLOptions, otelTracer = makeNoopTracer(), otelRootSpanContext = otel.context.active(), boot, sqlite3, }) => {
|
|
525
|
+
return otelTracer.startActiveSpan('createStore', {}, otelRootSpanContext, async (span) => {
|
|
526
|
+
try {
|
|
527
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
528
|
+
const storage = await otelTracer.startActiveSpan('storage:load', {}, otelContext, async (span) => {
|
|
529
|
+
try {
|
|
530
|
+
const init = await loadStorage();
|
|
531
|
+
const parentSpan = otel.trace.getSpan(otel.context.active()) ?? makeNoopSpan();
|
|
532
|
+
return init({ otelTracer, parentSpan });
|
|
533
|
+
}
|
|
534
|
+
finally {
|
|
535
|
+
span.end();
|
|
536
|
+
}
|
|
537
|
+
});
|
|
538
|
+
const persistedData = await otelTracer.startActiveSpan('storage:getPersistedData', {}, otelContext, async (span) => {
|
|
539
|
+
try {
|
|
540
|
+
return await storage.getPersistedData(span);
|
|
541
|
+
}
|
|
542
|
+
finally {
|
|
543
|
+
span.end();
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
const db = InMemoryDatabase.load({ data: persistedData, otelTracer, otelRootSpanContext, sqlite3 });
|
|
547
|
+
// Proxy to `db` that also mirrors `execute` calls to `storage`
|
|
548
|
+
const dbProxy = new Proxy(db, {
|
|
549
|
+
get: (db, prop, receiver) => {
|
|
550
|
+
if (prop === 'execute') {
|
|
551
|
+
const execute = (query, bindValues, writeTables, options) => {
|
|
552
|
+
storage.execute(query, bindValues, span);
|
|
553
|
+
return db.execute(query, bindValues, writeTables, options);
|
|
554
|
+
};
|
|
555
|
+
return execute;
|
|
556
|
+
}
|
|
557
|
+
else if (prop === 'select') {
|
|
558
|
+
// NOTE we're even proxying `select` calls here as some apps (e.g. Overtone) currently rely on this
|
|
559
|
+
// TODO remove this once we've migrated all apps to use `execute` instead of `select`
|
|
560
|
+
const select = (query, options = {}) => {
|
|
561
|
+
storage.execute(query, options.bindValues);
|
|
562
|
+
return db.select(query, options);
|
|
563
|
+
};
|
|
564
|
+
return select;
|
|
565
|
+
}
|
|
566
|
+
else {
|
|
567
|
+
return Reflect.get(db, prop, receiver);
|
|
568
|
+
}
|
|
569
|
+
},
|
|
570
|
+
});
|
|
571
|
+
otelTracer.startActiveSpan('migrateDb', {}, otelContext, async (span) => {
|
|
572
|
+
try {
|
|
573
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
574
|
+
migrateDb({ db: dbProxy, schema, otelContext });
|
|
575
|
+
}
|
|
576
|
+
finally {
|
|
577
|
+
span.end();
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
if (boot !== undefined) {
|
|
581
|
+
const booting = boot(dbProxy, span);
|
|
582
|
+
// NOTE only awaiting if it's actually a promise to avoid unnecessary async/await
|
|
583
|
+
if (isPromise(booting)) {
|
|
584
|
+
await booting;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
// TODO: we can't apply the schema at this point, we've already loaded persisted data!
|
|
588
|
+
// Think about what to do about this case.
|
|
589
|
+
// await applySchema(db, schema)
|
|
590
|
+
return Store.createStore({ db, dbProxy, schema, storage, graphQLOptions, otelTracer, otelRootSpanContext }, span);
|
|
591
|
+
}
|
|
592
|
+
finally {
|
|
593
|
+
span.end();
|
|
594
|
+
}
|
|
595
|
+
});
|
|
596
|
+
};
|
|
597
|
+
const eventToSql = (event, eventDefinition) => {
|
|
598
|
+
const statement = typeof eventDefinition.statement === 'function' ? eventDefinition.statement(event.args) : eventDefinition.statement;
|
|
599
|
+
const prepareBindValues = eventDefinition.prepareBindValues ?? identity;
|
|
600
|
+
const bindValues = typeof eventDefinition.statement === 'function' && statement.argsAlreadyBound ? {} : prepareBindValues(event.args);
|
|
601
|
+
return { statement, bindValues };
|
|
602
|
+
};
|
|
603
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|