@livestore/livestore 0.1.0-dev.9 → 0.2.0-dev.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.
Files changed (112) hide show
  1. package/README.md +3 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/global-state.d.ts +1 -1
  4. package/dist/global-state.d.ts.map +1 -1
  5. package/dist/global-state.js +1 -1
  6. package/dist/global-state.js.map +1 -1
  7. package/dist/index.d.ts +6 -6
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +5 -5
  10. package/dist/index.js.map +1 -1
  11. package/dist/live-queries/base-class.d.ts +64 -0
  12. package/dist/live-queries/base-class.d.ts.map +1 -0
  13. package/dist/live-queries/base-class.js +31 -0
  14. package/dist/live-queries/base-class.js.map +1 -0
  15. package/dist/live-queries/computed.d.ts +26 -0
  16. package/dist/live-queries/computed.d.ts.map +1 -0
  17. package/dist/{reactiveQueries/js.js → live-queries/computed.js} +7 -26
  18. package/dist/live-queries/computed.js.map +1 -0
  19. package/dist/live-queries/db.d.ts +66 -0
  20. package/dist/live-queries/db.d.ts.map +1 -0
  21. package/dist/live-queries/db.js +199 -0
  22. package/dist/live-queries/db.js.map +1 -0
  23. package/dist/live-queries/db.test.d.ts +2 -0
  24. package/dist/live-queries/db.test.d.ts.map +1 -0
  25. package/dist/live-queries/db.test.js +117 -0
  26. package/dist/live-queries/db.test.js.map +1 -0
  27. package/dist/live-queries/graphql.d.ts +49 -0
  28. package/dist/live-queries/graphql.d.ts.map +1 -0
  29. package/dist/live-queries/graphql.js +122 -0
  30. package/dist/live-queries/graphql.js.map +1 -0
  31. package/dist/live-queries/sql.d.ts +62 -0
  32. package/dist/live-queries/sql.d.ts.map +1 -0
  33. package/dist/live-queries/sql.js +175 -0
  34. package/dist/live-queries/sql.js.map +1 -0
  35. package/dist/live-queries/sql.test.d.ts +2 -0
  36. package/dist/live-queries/sql.test.d.ts.map +1 -0
  37. package/{src/reactiveQueries/sql.test.ts → dist/live-queries/sql.test.js} +68 -91
  38. package/dist/live-queries/sql.test.js.map +1 -0
  39. package/dist/reactiveQueries/base-class.d.ts +6 -2
  40. package/dist/reactiveQueries/base-class.d.ts.map +1 -1
  41. package/dist/reactiveQueries/base-class.js +2 -0
  42. package/dist/reactiveQueries/base-class.js.map +1 -1
  43. package/dist/reactiveQueries/computed.d.ts +4 -13
  44. package/dist/reactiveQueries/computed.d.ts.map +1 -1
  45. package/dist/reactiveQueries/computed.js +2 -21
  46. package/dist/reactiveQueries/computed.js.map +1 -1
  47. package/dist/reactiveQueries/graphql.d.ts +4 -8
  48. package/dist/reactiveQueries/graphql.d.ts.map +1 -1
  49. package/dist/reactiveQueries/graphql.js +1 -15
  50. package/dist/reactiveQueries/graphql.js.map +1 -1
  51. package/dist/reactiveQueries/sql.d.ts +36 -23
  52. package/dist/reactiveQueries/sql.d.ts.map +1 -1
  53. package/dist/reactiveQueries/sql.js +100 -55
  54. package/dist/reactiveQueries/sql.js.map +1 -1
  55. package/dist/reactiveQueries/sql.test.js +12 -11
  56. package/dist/reactiveQueries/sql.test.js.map +1 -1
  57. package/dist/row-query-utils.d.ts +17 -0
  58. package/dist/row-query-utils.d.ts.map +1 -0
  59. package/dist/row-query-utils.js +30 -0
  60. package/dist/row-query-utils.js.map +1 -0
  61. package/dist/row-query.d.ts +10 -27
  62. package/dist/row-query.d.ts.map +1 -1
  63. package/dist/row-query.js +16 -66
  64. package/dist/row-query.js.map +1 -1
  65. package/dist/store/create-store.d.ts +1 -1
  66. package/dist/store/create-store.d.ts.map +1 -1
  67. package/dist/store/devtools.d.ts +1 -1
  68. package/dist/store/devtools.d.ts.map +1 -1
  69. package/dist/store/devtools.js.map +1 -1
  70. package/dist/store/store-types.d.ts +2 -2
  71. package/dist/store/store-types.d.ts.map +1 -1
  72. package/dist/store/store.d.ts +8 -3
  73. package/dist/store/store.d.ts.map +1 -1
  74. package/dist/store/store.js +32 -4
  75. package/dist/store/store.js.map +1 -1
  76. package/dist/utils/tests/fixture.d.ts +168 -132
  77. package/dist/utils/tests/fixture.d.ts.map +1 -1
  78. package/package.json +5 -5
  79. package/src/global-state.ts +1 -1
  80. package/src/index.ts +8 -5
  81. package/src/live-queries/__snapshots__/db.test.ts.snap +301 -0
  82. package/src/{reactiveQueries → live-queries}/base-class.ts +10 -5
  83. package/src/{reactiveQueries → live-queries}/computed.ts +5 -29
  84. package/src/live-queries/db.test.ts +153 -0
  85. package/src/live-queries/db.ts +350 -0
  86. package/src/{reactiveQueries → live-queries}/graphql.ts +6 -21
  87. package/src/row-query-utils.ts +65 -0
  88. package/src/store/create-store.ts +1 -1
  89. package/src/store/devtools.ts +1 -1
  90. package/src/store/store-types.ts +2 -2
  91. package/src/store/store.ts +44 -7
  92. package/dist/reactiveQueries/js.d.ts +0 -35
  93. package/dist/reactiveQueries/js.d.ts.map +0 -1
  94. package/dist/reactiveQueries/js.js.map +0 -1
  95. package/dist/store/store-context.d.ts +0 -26
  96. package/dist/store/store-context.d.ts.map +0 -1
  97. package/dist/store/store-context.js +0 -6
  98. package/dist/store/store-context.js.map +0 -1
  99. package/dist/store-context.d.ts +0 -26
  100. package/dist/store-context.d.ts.map +0 -1
  101. package/dist/store-context.js +0 -6
  102. package/dist/store-context.js.map +0 -1
  103. package/dist/store-devtools.d.ts +0 -19
  104. package/dist/store-devtools.d.ts.map +0 -1
  105. package/dist/store-devtools.js +0 -141
  106. package/dist/store-devtools.js.map +0 -1
  107. package/dist/store.d.ts +0 -175
  108. package/dist/store.d.ts.map +0 -1
  109. package/dist/store.js +0 -509
  110. package/dist/store.js.map +0 -1
  111. package/src/reactiveQueries/sql.ts +0 -226
  112. package/src/row-query.ts +0 -196
package/dist/store.js DELETED
@@ -1,509 +0,0 @@
1
- import { getExecArgsFromMutation, prepareBindValues, replaceSessionIdSymbol, UnexpectedError } from '@livestore/common';
2
- import { isPartialMutationEvent, makeMutationEventSchemaMemo, SCHEMA_META_TABLE, SCHEMA_MUTATIONS_META_TABLE, SESSION_CHANGESET_META_TABLE, } from '@livestore/common/schema';
3
- import { assertNever, makeNoopTracer, shouldNeverHappen } from '@livestore/utils';
4
- import { Cause, Data, Deferred, Duration, Effect, Exit, FiberSet, Inspectable, Layer, Logger, LogLevel, MutableHashMap, OtelTracer, Queue, Runtime, Schema, Scope, Stream, } from '@livestore/utils/effect';
5
- import * as otel from '@opentelemetry/api';
6
- import { globalReactivityGraph } from './global-state.js';
7
- import { connectDevtoolsToStore } from './store-devtools.js';
8
- import { SynchronousDatabaseWrapper } from './SynchronousDatabaseWrapper.js';
9
- import { ReferenceCountedSet } from './utils/data-structures.js';
10
- import { downloadBlob, exposeDebugUtils } from './utils/dev.js';
11
- import { getDurationMsFromSpan } from './utils/otel.js';
12
- if (import.meta.env.DEV) {
13
- exposeDebugUtils();
14
- }
15
- export class Store extends Inspectable.Class {
16
- storeId;
17
- reactivityGraph;
18
- syncDbWrapper;
19
- clientSession;
20
- schema;
21
- graphQLSchema;
22
- graphQLContext;
23
- otel;
24
- /**
25
- * Note we're using `Ref<null>` here as we don't care about the value but only about *that* something has changed.
26
- * This only works in combination with `equal: () => false` which will always trigger a refresh.
27
- */
28
- tableRefs;
29
- fiberSet;
30
- runtime;
31
- /** RC-based set to see which queries are currently subscribed to */
32
- activeQueries;
33
- // NOTE this is currently exposed for the Devtools databrowser to emit mutation events
34
- __mutationEventSchema;
35
- currentMutationEventIdRef;
36
- unsyncedMutationEvents;
37
- // #region constructor
38
- constructor({ clientSession, schema, graphQLOptions, reactivityGraph, otelOptions, disableDevtools, batchUpdates, currentMutationEventIdRef, unsyncedMutationEvents, storeId, fiberSet, runtime, }) {
39
- super();
40
- this.storeId = storeId;
41
- this.currentMutationEventIdRef = currentMutationEventIdRef;
42
- this.unsyncedMutationEvents = unsyncedMutationEvents;
43
- this.syncDbWrapper = new SynchronousDatabaseWrapper({ otel: otelOptions, db: clientSession.syncDb });
44
- this.clientSession = clientSession;
45
- this.schema = schema;
46
- this.fiberSet = fiberSet;
47
- this.runtime = runtime;
48
- // TODO refactor
49
- this.__mutationEventSchema = makeMutationEventSchemaMemo(schema);
50
- // TODO generalize the `tableRefs` concept to allow finer-grained refs
51
- this.tableRefs = {};
52
- this.activeQueries = new ReferenceCountedSet();
53
- const mutationsSpan = otelOptions.tracer.startSpan('LiveStore:mutations', {}, otelOptions.rootSpanContext);
54
- const otelMuationsSpanContext = otel.trace.setSpan(otel.context.active(), mutationsSpan);
55
- const queriesSpan = otelOptions.tracer.startSpan('LiveStore:queries', {}, otelOptions.rootSpanContext);
56
- const otelQueriesSpanContext = otel.trace.setSpan(otel.context.active(), queriesSpan);
57
- this.reactivityGraph = reactivityGraph;
58
- this.reactivityGraph.context = {
59
- store: this,
60
- otelTracer: otelOptions.tracer,
61
- rootOtelContext: otelQueriesSpanContext,
62
- effectsWrapper: batchUpdates,
63
- };
64
- this.otel = {
65
- tracer: otelOptions.tracer,
66
- mutationsSpanContext: otelMuationsSpanContext,
67
- queriesSpanContext: otelQueriesSpanContext,
68
- };
69
- // TODO find a better way to detect if we're running LiveStore in the LiveStore devtools
70
- // But for now this is a good enough approximation with little downsides
71
- const isRunningInDevtools = disableDevtools === true;
72
- // Need a set here since `schema.tables` might contain duplicates and some componentStateTables
73
- const allTableNames = new Set(
74
- // NOTE we're excluding the LiveStore schema and mutations tables as they are not user-facing
75
- // unless LiveStore is running in the devtools
76
- isRunningInDevtools
77
- ? this.schema.tables.keys()
78
- : Array.from(this.schema.tables.keys()).filter((_) => _ !== SCHEMA_META_TABLE && _ !== SCHEMA_MUTATIONS_META_TABLE && _ !== SESSION_CHANGESET_META_TABLE));
79
- const existingTableRefs = new Map(Array.from(this.reactivityGraph.atoms.values())
80
- .filter((_) => _._tag === 'ref' && _.label?.startsWith('tableRef:') === true)
81
- .map((_) => [_.label.slice('tableRef:'.length), _]));
82
- for (const tableName of allTableNames) {
83
- this.tableRefs[tableName] = existingTableRefs.get(tableName) ?? this.makeTableRef(tableName);
84
- }
85
- if (graphQLOptions) {
86
- this.graphQLSchema = graphQLOptions.schema;
87
- this.graphQLContext = graphQLOptions.makeContext(this.syncDbWrapper, this.otel.tracer, clientSession.coordinator.sessionId);
88
- }
89
- Effect.gen(this, function* () {
90
- yield* this.clientSession.coordinator.syncMutations.pipe(Stream.tapChunk((mutationsEventsDecodedChunk) => Effect.sync(() => {
91
- this.mutate({ wasSyncMessage: true }, ...mutationsEventsDecodedChunk);
92
- })), Stream.runDrain, Effect.interruptible, Effect.withSpan('LiveStore:syncMutations'), Effect.forkScoped);
93
- yield* Effect.addFinalizer(() => Effect.sync(() => {
94
- for (const tableRef of Object.values(this.tableRefs)) {
95
- for (const superComp of tableRef.super) {
96
- this.reactivityGraph.removeEdge(superComp, tableRef);
97
- }
98
- }
99
- otel.trace.getSpan(this.otel.mutationsSpanContext).end();
100
- otel.trace.getSpan(this.otel.queriesSpanContext).end();
101
- }));
102
- yield* Effect.never;
103
- }).pipe(Effect.scoped, Effect.withSpan('LiveStore:constructor'), this.runEffectFork);
104
- }
105
- // #endregion constructor
106
- static createStore = (storeOptions, parentSpan) => {
107
- const ctx = otel.trace.setSpan(otel.context.active(), parentSpan);
108
- return storeOptions.otelOptions.tracer.startActiveSpan('LiveStore:createStore', {}, ctx, (span) => {
109
- try {
110
- return new Store(storeOptions);
111
- }
112
- finally {
113
- span.end();
114
- }
115
- });
116
- };
117
- get sessionId() {
118
- return this.clientSession.coordinator.sessionId;
119
- }
120
- /**
121
- * Subscribe to the results of a query
122
- * Returns a function to cancel the subscription.
123
- */
124
- subscribe = (query$, onNewValue, onUnsubsubscribe, options) => this.otel.tracer.startActiveSpan(`LiveStore.subscribe`, { attributes: { label: options?.label, queryLabel: query$.label } }, options?.otelContext ?? this.otel.queriesSpanContext, (span) => {
125
- // console.debug('store sub', query$.id, query$.label)
126
- const otelContext = otel.trace.setSpan(otel.context.active(), span);
127
- const label = `subscribe:${options?.label}`;
128
- const effect = this.reactivityGraph.makeEffect((get) => onNewValue(get(query$.results$)), { label });
129
- this.activeQueries.add(query$);
130
- // Running effect right away to get initial value (unless `skipInitialRun` is set)
131
- if (options?.skipInitialRun !== true) {
132
- effect.doEffect(otelContext);
133
- }
134
- const unsubscribe = () => {
135
- // console.debug('store unsub', query$.id, query$.label)
136
- try {
137
- this.reactivityGraph.destroyNode(effect);
138
- this.activeQueries.remove(query$);
139
- onUnsubsubscribe?.();
140
- }
141
- finally {
142
- span.end();
143
- }
144
- };
145
- return unsubscribe;
146
- });
147
- // #region mutate
148
- mutate = (firstMutationOrTxnFnOrOptions, ...restMutations) => {
149
- let mutationsEvents;
150
- let options;
151
- if (typeof firstMutationOrTxnFnOrOptions === 'function') {
152
- // TODO ensure that function is synchronous and isn't called in a async way (also write tests for this)
153
- mutationsEvents = firstMutationOrTxnFnOrOptions((arg) => mutationsEvents.push(arg));
154
- }
155
- else if (firstMutationOrTxnFnOrOptions?.label !== undefined ||
156
- firstMutationOrTxnFnOrOptions?.skipRefresh !== undefined ||
157
- firstMutationOrTxnFnOrOptions?.wasSyncMessage !== undefined ||
158
- firstMutationOrTxnFnOrOptions?.persisted !== undefined) {
159
- options = firstMutationOrTxnFnOrOptions;
160
- mutationsEvents = restMutations;
161
- }
162
- else if (firstMutationOrTxnFnOrOptions === undefined) {
163
- // When `mutate` is called with no arguments (which sometimes happens when dynamically filtering mutations)
164
- mutationsEvents = [];
165
- }
166
- else {
167
- mutationsEvents = [firstMutationOrTxnFnOrOptions, ...restMutations];
168
- }
169
- mutationsEvents = mutationsEvents.filter((_) => _.id === undefined || !MutableHashMap.has(this.unsyncedMutationEvents, Data.struct(_.id)));
170
- if (mutationsEvents.length === 0) {
171
- return;
172
- }
173
- const label = options?.label ?? 'mutate';
174
- const skipRefresh = options?.skipRefresh ?? false;
175
- const wasSyncMessage = options?.wasSyncMessage ?? false;
176
- const persisted = options?.persisted ?? true;
177
- const mutationsSpan = otel.trace.getSpan(this.otel.mutationsSpanContext);
178
- mutationsSpan.addEvent('mutate');
179
- // console.group('LiveStore.mutate', { skipRefresh, wasSyncMessage, label })
180
- // mutationsEvents.forEach((_) => console.debug(_.mutation, _.id, _.args))
181
- // console.groupEnd()
182
- let durationMs;
183
- const res = this.otel.tracer.startActiveSpan('LiveStore:mutate', { attributes: { 'livestore.mutateLabel': label } }, this.otel.mutationsSpanContext, (span) => {
184
- const otelContext = otel.trace.setSpan(otel.context.active(), span);
185
- try {
186
- const writeTables = new Set();
187
- this.otel.tracer.startActiveSpan('LiveStore:processWrites', { attributes: { 'livestore.mutateLabel': label } }, otel.trace.setSpan(otel.context.active(), span), (span) => {
188
- try {
189
- const otelContext = otel.trace.setSpan(otel.context.active(), span);
190
- const applyMutations = () => {
191
- for (const mutationEvent of mutationsEvents) {
192
- try {
193
- const { writeTables: writeTablesForEvent } = this.mutateWithoutRefresh(mutationEvent, {
194
- otelContext,
195
- // NOTE if it was a sync message, it's already coming from the coordinator, so we can skip the coordinator
196
- coordinatorMode: wasSyncMessage ? 'skip-coordinator' : persisted ? 'default' : 'skip-persist',
197
- });
198
- for (const tableName of writeTablesForEvent) {
199
- writeTables.add(tableName);
200
- }
201
- }
202
- catch (e) {
203
- console.error(e, mutationEvent);
204
- throw e;
205
- }
206
- }
207
- };
208
- if (mutationsEvents.length > 1) {
209
- // TODO: what to do about coordinator transaction here?
210
- this.syncDbWrapper.txn(applyMutations);
211
- }
212
- else {
213
- applyMutations();
214
- }
215
- }
216
- catch (e) {
217
- console.error(e);
218
- span.setStatus({ code: otel.SpanStatusCode.ERROR, message: e.toString() });
219
- throw e;
220
- }
221
- finally {
222
- span.end();
223
- }
224
- });
225
- const tablesToUpdate = [];
226
- for (const tableName of writeTables) {
227
- const tableRef = this.tableRefs[tableName];
228
- assertNever(tableRef !== undefined, `No table ref found for ${tableName}`);
229
- tablesToUpdate.push([tableRef, null]);
230
- }
231
- const debugRefreshReason = {
232
- _tag: 'mutate',
233
- mutations: mutationsEvents,
234
- writeTables: Array.from(writeTables),
235
- };
236
- // Update all table refs together in a batch, to only trigger one reactive update
237
- this.reactivityGraph.setRefs(tablesToUpdate, { debugRefreshReason, otelContext, skipRefresh });
238
- }
239
- catch (e) {
240
- console.error(e);
241
- span.setStatus({ code: otel.SpanStatusCode.ERROR, message: e.toString() });
242
- throw e;
243
- }
244
- finally {
245
- span.end();
246
- durationMs = getDurationMsFromSpan(span);
247
- }
248
- return { durationMs };
249
- });
250
- // NOTE we need to add the mutation events to the unsynced mutation events map only after running the code above
251
- // so the short-circuiting in `mutateWithoutRefresh` doesn't kick in for those events
252
- for (const mutationEvent of mutationsEvents) {
253
- if (mutationEvent.id !== undefined) {
254
- MutableHashMap.set(this.unsyncedMutationEvents, Data.struct(mutationEvent.id), mutationEvent);
255
- }
256
- }
257
- return res;
258
- };
259
- // #endregion mutate
260
- /**
261
- * This can be used in combination with `skipRefresh` when applying mutations.
262
- * We might need a better solution for this. Let's see.
263
- */
264
- manualRefresh = (options) => {
265
- const { label } = options ?? {};
266
- this.otel.tracer.startActiveSpan('LiveStore:manualRefresh', { attributes: { 'livestore.manualRefreshLabel': label } }, this.otel.mutationsSpanContext, (span) => {
267
- const otelContext = otel.trace.setSpan(otel.context.active(), span);
268
- this.reactivityGraph.runDeferredEffects({ otelContext });
269
- span.end();
270
- });
271
- };
272
- // #region mutateWithoutRefresh
273
- /**
274
- * Apply a mutation to the store.
275
- * Returns the tables that were affected by the event.
276
- * This is an internal method that doesn't trigger a refresh;
277
- * the caller must refresh queries after calling this method.
278
- */
279
- mutateWithoutRefresh = (mutationEventDecoded_, options) => {
280
- const mutationDef = this.schema.mutations.get(mutationEventDecoded_.mutation) ??
281
- shouldNeverHappen(`Unknown mutation type: ${mutationEventDecoded_.mutation}`);
282
- // Needs to happen only for partial mutation events (thus a function)
283
- const nextMutationEventId = () => {
284
- const { id, parentId } = this.clientSession.coordinator
285
- .nextMutationEventIdPair({ localOnly: mutationDef.options.localOnly })
286
- .pipe(Effect.runSync);
287
- this.currentMutationEventIdRef.current = id;
288
- return { id, parentId };
289
- };
290
- const mutationEventDecoded = isPartialMutationEvent(mutationEventDecoded_)
291
- ? { ...mutationEventDecoded_, ...nextMutationEventId() }
292
- : mutationEventDecoded_;
293
- // NOTE we also need this temporary workaround here since some code-paths use `mutateWithoutRefresh` directly
294
- // e.g. the row-query functionality
295
- if (MutableHashMap.has(this.unsyncedMutationEvents, Data.struct(mutationEventDecoded.id))) {
296
- // NOTE this data should never be used
297
- return { writeTables: new Set(), durationMs: 0 };
298
- }
299
- else {
300
- MutableHashMap.set(this.unsyncedMutationEvents, Data.struct(mutationEventDecoded.id), mutationEventDecoded);
301
- }
302
- const { otelContext, coordinatorMode = 'default' } = options;
303
- return this.otel.tracer.startActiveSpan('LiveStore:mutateWithoutRefresh', {
304
- attributes: {
305
- 'livestore.mutation': mutationEventDecoded.mutation,
306
- 'livestore.args': JSON.stringify(mutationEventDecoded.args, null, 2),
307
- },
308
- }, otelContext, (span) => {
309
- const otelContext = otel.trace.setSpan(otel.context.active(), span);
310
- const allWriteTables = new Set();
311
- let durationMsTotal = 0;
312
- replaceSessionIdSymbol(mutationEventDecoded.args, this.clientSession.coordinator.sessionId);
313
- const execArgsArr = getExecArgsFromMutation({ mutationDef, mutationEventDecoded });
314
- for (const { statementSql, bindValues, writeTables = this.syncDbWrapper.getTablesUsed(statementSql), } of execArgsArr) {
315
- // TODO when the store doesn't have the lock, we need wait for the coordinator to confirm the mutation
316
- // before executing the mutation on the main db
317
- const { durationMs } = this.syncDbWrapper.execute(statementSql, bindValues, writeTables, { otelContext });
318
- durationMsTotal += durationMs;
319
- writeTables.forEach((table) => allWriteTables.add(table));
320
- }
321
- const mutationEventEncoded = Schema.encodeUnknownSync(this.__mutationEventSchema)(mutationEventDecoded);
322
- if (coordinatorMode !== 'skip-coordinator') {
323
- // Asynchronously apply mutation to a persistent storage (we're not awaiting this promise here)
324
- this.clientSession.coordinator
325
- .mutate(mutationEventEncoded, { persisted: coordinatorMode !== 'skip-persist' })
326
- .pipe(this.runEffectFork);
327
- }
328
- // Uncomment to print a list of queries currently registered on the store
329
- // console.debug(JSON.parse(JSON.stringify([...this.queries].map((q) => `${labelForKey(q.componentKey)}/${q.label}`))))
330
- span.end();
331
- return { writeTables: allWriteTables, durationMs: durationMsTotal };
332
- });
333
- };
334
- // #endregion mutateWithoutRefresh
335
- /**
336
- * Directly execute a SQL query on the Store.
337
- * This should only be used for framework-internal purposes;
338
- * all app writes should go through mutate.
339
- */
340
- __execute = (query, params = {}, writeTables, otelContext) => {
341
- this.syncDbWrapper.execute(query, prepareBindValues(params, query), writeTables, { otelContext });
342
- this.clientSession.coordinator.execute(query, prepareBindValues(params, query)).pipe(this.runEffectFork);
343
- };
344
- __select = (query, params = {}) => {
345
- return this.syncDbWrapper.select(query, { bindValues: prepareBindValues(params, query) });
346
- };
347
- makeTableRef = (tableName) => this.reactivityGraph.makeRef(null, {
348
- equal: () => false,
349
- label: `tableRef:${tableName}`,
350
- meta: { liveStoreRefType: 'table' },
351
- });
352
- __devDownloadDb = () => {
353
- const data = this.syncDbWrapper.export();
354
- downloadBlob(data, `livestore-${Date.now()}.db`);
355
- };
356
- __devDownloadMutationLogDb = () => Effect.gen(this, function* () {
357
- const data = yield* this.clientSession.coordinator.getMutationLogData;
358
- downloadBlob(data, `livestore-mutationlog-${Date.now()}.db`);
359
- }).pipe(this.runEffectFork);
360
- // NOTE This is needed because when booting a Store via Effect it seems to call `toJSON` in the error path
361
- toJSON = () => {
362
- return {
363
- _tag: 'livestore.Store',
364
- reactivityGraph: this.reactivityGraph.getSnapshot({ includeResults: true }),
365
- };
366
- };
367
- runEffectFork = (effect) => effect.pipe(Effect.tapCauseLogPretty, FiberSet.run(this.fiberSet), Runtime.runFork(this.runtime));
368
- }
369
- /** Create a new LiveStore Store */
370
- export const createStorePromise = async ({ signal, ...options }) => Effect.gen(function* () {
371
- const scope = yield* Scope.make();
372
- const runtime = yield* Effect.runtime();
373
- if (signal !== undefined) {
374
- signal.addEventListener('abort', () => {
375
- Scope.close(scope, Exit.void).pipe(Effect.tapCauseLogPretty, Runtime.runFork(runtime));
376
- });
377
- }
378
- return yield* FiberSet.make().pipe(Effect.andThen((fiberSet) => createStore({ ...options, fiberSet })), Scope.extend(scope));
379
- }).pipe(Effect.withSpan('createStore'), Effect.tapCauseLogPretty, Effect.annotateLogs({ thread: 'window' }), Effect.provide(Logger.pretty), Logger.withMinimumLogLevel(LogLevel.Debug), Effect.runPromise);
380
- // #region createStore
381
- export const createStore = ({ schema, adapter, storeId, graphQLOptions, otelOptions, boot, reactivityGraph = globalReactivityGraph, batchUpdates, disableDevtools, onBootStatus, fiberSet, }) => {
382
- const otelTracer = otelOptions?.tracer ?? makeNoopTracer();
383
- const otelRootSpanContext = otelOptions?.rootSpanContext ?? otel.context.active();
384
- const TracingLive = Layer.unwrapEffect(Effect.map(OtelTracer.make, Layer.setTracer)).pipe(Layer.provide(Layer.sync(OtelTracer.Tracer, () => otelTracer)));
385
- return Effect.gen(function* () {
386
- const span = yield* OtelTracer.currentOtelSpan.pipe(Effect.orDie);
387
- const bootStatusQueue = yield* Queue.unbounded().pipe(Effect.acquireRelease(Queue.shutdown));
388
- yield* Queue.take(bootStatusQueue).pipe(Effect.tapSync((status) => onBootStatus?.(status)), Effect.tap((status) => (status.stage === 'done' ? Queue.shutdown(bootStatusQueue) : Effect.void)), Effect.forever, Effect.tapCauseLogPretty, Effect.forkScoped);
389
- const storeDeferred = yield* Deferred.make();
390
- const connectDevtoolsToStore_ = (storeDevtoolsChannel) => Effect.gen(function* () {
391
- const store = yield* Deferred.await(storeDeferred);
392
- yield* connectDevtoolsToStore({ storeDevtoolsChannel, store });
393
- });
394
- const runtime = yield* Effect.runtime();
395
- const runEffectFork = (effect) => effect.pipe(Effect.tapCauseLogPretty, FiberSet.run(fiberSet), Runtime.runFork(runtime));
396
- // TODO close parent scope? (Needs refactor with Mike A)
397
- const shutdown = (cause) => Effect.gen(function* () {
398
- // NOTE we're calling `cause.toString()` here to avoid triggering a `console.error` in the grouped log
399
- const logCause = Cause.isFailType(cause) && cause.error._tag === 'LiveStore.IntentionalShutdownCause'
400
- ? cause.toString()
401
- : cause;
402
- yield* Effect.logDebug(`Shutting down LiveStore`, logCause);
403
- FiberSet.clear(fiberSet).pipe(Effect.andThen(() => FiberSet.run(fiberSet, Effect.failCause(cause))), Effect.timeout(Duration.seconds(1)), Effect.logWarnIfTakesLongerThan({ label: '@livestore/livestore:shutdown:clear-fiber-set', duration: 500 }), Effect.catchTag('TimeoutException', (err) => Effect.logError('Store shutdown timed out. Forcing shutdown.', err).pipe(Effect.andThen(FiberSet.run(fiberSet, Effect.failCause(cause))))), Runtime.runFork(runtime));
404
- }).pipe(Effect.withSpan('livestore:shutdown'));
405
- const clientSession = yield* adapter({
406
- schema,
407
- storeId,
408
- devtoolsEnabled: disableDevtools !== true,
409
- bootStatusQueue,
410
- shutdown,
411
- connectDevtoolsToStore: connectDevtoolsToStore_,
412
- }).pipe(Effect.withPerformanceMeasure('livestore:makeAdapter'), Effect.withSpan('createStore:makeAdapter'));
413
- const mutationEventSchema = makeMutationEventSchemaMemo(schema);
414
- // TODO get rid of this
415
- // const __processedMutationIds = new Set<number>()
416
- const currentMutationEventIdRef = { current: yield* clientSession.coordinator.getCurrentMutationEventId };
417
- // TODO fill up with unsynced mutation events from the coordinator
418
- const unsyncedMutationEvents = MutableHashMap.empty();
419
- // TODO consider moving booting into the clientSession
420
- if (boot !== undefined) {
421
- let isInTxn = false;
422
- let txnExecuteStmnts = [];
423
- const bootDbImpl = {
424
- _tag: 'BootDb',
425
- execute: (queryStr, bindValues) => {
426
- const stmt = clientSession.syncDb.prepare(queryStr);
427
- stmt.execute(bindValues);
428
- if (isInTxn === true) {
429
- txnExecuteStmnts.push([queryStr, bindValues]);
430
- }
431
- else {
432
- clientSession.coordinator.execute(queryStr, bindValues).pipe(runEffectFork);
433
- }
434
- },
435
- mutate: (...list) => {
436
- for (const mutationEventDecoded_ of list) {
437
- const mutationDef = schema.mutations.get(mutationEventDecoded_.mutation) ??
438
- shouldNeverHappen(`Unknown mutation type: ${mutationEventDecoded_.mutation}`);
439
- const { id, parentId } = clientSession.coordinator
440
- .nextMutationEventIdPair({ localOnly: mutationDef.options.localOnly })
441
- .pipe(Effect.runSync);
442
- currentMutationEventIdRef.current = id;
443
- const mutationEventDecoded = { ...mutationEventDecoded_, id, parentId };
444
- replaceSessionIdSymbol(mutationEventDecoded.args, clientSession.coordinator.sessionId);
445
- MutableHashMap.set(unsyncedMutationEvents, Data.struct(mutationEventDecoded.id), mutationEventDecoded);
446
- // __processedMutationIds.add(mutationEventDecoded.id.global)
447
- const execArgsArr = getExecArgsFromMutation({ mutationDef, mutationEventDecoded });
448
- // const { bindValues, statementSql } = getExecArgsFromMutation({ mutationDef, mutationEventDecoded })
449
- for (const { statementSql, bindValues } of execArgsArr) {
450
- clientSession.syncDb.execute(statementSql, bindValues);
451
- }
452
- const mutationEventEncoded = Schema.encodeUnknownSync(mutationEventSchema)(mutationEventDecoded);
453
- clientSession.coordinator
454
- .mutate(mutationEventEncoded, { persisted: true })
455
- .pipe(runEffectFork);
456
- }
457
- },
458
- select: (queryStr, bindValues) => {
459
- const stmt = clientSession.syncDb.prepare(queryStr);
460
- return stmt.select(bindValues);
461
- },
462
- txn: (callback) => {
463
- try {
464
- isInTxn = true;
465
- // clientSession.syncDb.execute('BEGIN TRANSACTION', undefined)
466
- callback();
467
- // clientSession.syncDb.execute('COMMIT', undefined)
468
- // clientSession.coordinator.execute('BEGIN', undefined, undefined)
469
- for (const [queryStr, bindValues] of txnExecuteStmnts) {
470
- clientSession.coordinator.execute(queryStr, bindValues).pipe(runEffectFork);
471
- }
472
- // clientSession.coordinator.execute('COMMIT', undefined, undefined)
473
- }
474
- catch (e) {
475
- // clientSession.syncDb.execute('ROLLBACK', undefined)
476
- throw e;
477
- }
478
- finally {
479
- isInTxn = false;
480
- txnExecuteStmnts = [];
481
- }
482
- },
483
- };
484
- yield* Effect.tryAll(() => boot(bootDbImpl, span)).pipe(UnexpectedError.mapToUnexpectedError, Effect.withSpan('createStore:boot'));
485
- }
486
- const store = Store.createStore({
487
- clientSession,
488
- schema,
489
- graphQLOptions,
490
- otelOptions: { tracer: otelTracer, rootSpanContext: otelRootSpanContext },
491
- reactivityGraph,
492
- disableDevtools,
493
- currentMutationEventIdRef,
494
- unsyncedMutationEvents,
495
- fiberSet,
496
- runtime,
497
- batchUpdates: batchUpdates ?? ((run) => run()),
498
- storeId,
499
- }, span);
500
- yield* Deferred.succeed(storeDeferred, store);
501
- return store;
502
- }).pipe(Effect.withSpan('createStore', {
503
- parent: otelOptions?.rootSpanContext
504
- ? OtelTracer.makeExternalSpan(otel.trace.getSpanContext(otelOptions.rootSpanContext))
505
- : undefined,
506
- }), Effect.provide(TracingLive));
507
- };
508
- // #endregion createStore
509
- //# sourceMappingURL=store.js.map
package/dist/store.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}