@livestore/livestore 0.3.0-dev.31 → 0.3.0-dev.33

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 (38) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/SynchronousDatabaseWrapper.d.ts +36 -0
  3. package/dist/SynchronousDatabaseWrapper.d.ts.map +1 -0
  4. package/dist/SynchronousDatabaseWrapper.js +176 -0
  5. package/dist/SynchronousDatabaseWrapper.js.map +1 -0
  6. package/dist/effect/index.d.ts +2 -0
  7. package/dist/effect/index.d.ts.map +1 -0
  8. package/dist/effect/index.js +2 -0
  9. package/dist/effect/index.js.map +1 -0
  10. package/dist/global-state.d.ts +14 -0
  11. package/dist/global-state.d.ts.map +1 -0
  12. package/dist/global-state.js +16 -0
  13. package/dist/global-state.js.map +1 -0
  14. package/dist/index.d.ts +20 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +16 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/live-queries/db.d.ts +66 -0
  19. package/dist/live-queries/db.d.ts.map +1 -0
  20. package/dist/live-queries/db.js +199 -0
  21. package/dist/live-queries/db.js.map +1 -0
  22. package/dist/live-queries/db.test.d.ts +2 -0
  23. package/dist/live-queries/db.test.d.ts.map +1 -0
  24. package/dist/live-queries/db.test.js +117 -0
  25. package/dist/live-queries/db.test.js.map +1 -0
  26. package/dist/live-queries/graphql.d.ts +49 -0
  27. package/dist/live-queries/graphql.d.ts.map +1 -0
  28. package/dist/live-queries/graphql.js +122 -0
  29. package/dist/live-queries/graphql.js.map +1 -0
  30. package/dist/row-query-utils.d.ts +17 -0
  31. package/dist/row-query-utils.d.ts.map +1 -0
  32. package/dist/row-query-utils.js +30 -0
  33. package/dist/row-query-utils.js.map +1 -0
  34. package/dist/utils/otel.d.ts +4 -0
  35. package/dist/utils/otel.d.ts.map +1 -0
  36. package/dist/utils/otel.js +6 -0
  37. package/dist/utils/otel.js.map +1 -0
  38. package/package.json +4 -4
@@ -0,0 +1,36 @@
1
+ import type { DebugInfo, MutableDebugInfo, PreparedBindValues, SynchronousDatabase } from '@livestore/common';
2
+ import type * as otel from '@opentelemetry/api';
3
+ export declare const emptyDebugInfo: () => DebugInfo;
4
+ export declare class SynchronousDatabaseWrapper {
5
+ private cachedStmts;
6
+ private tablesUsedCache;
7
+ private resultCache;
8
+ private db;
9
+ private otelTracer;
10
+ private otelRootSpanContext;
11
+ private tablesUsedStmt;
12
+ debugInfo: MutableDebugInfo;
13
+ constructor({ db, otel, }: {
14
+ db: SynchronousDatabase;
15
+ otel: {
16
+ tracer: otel.Tracer;
17
+ rootSpanContext: otel.Context;
18
+ };
19
+ });
20
+ txn<TRes>(callback: () => TRes): TRes;
21
+ getTablesUsed(query: string): Set<string>;
22
+ execute(queryStr: string, bindValues?: PreparedBindValues, writeTables?: ReadonlySet<string>, options?: {
23
+ hasNoEffects?: boolean;
24
+ otelContext?: otel.Context;
25
+ }): {
26
+ durationMs: number;
27
+ };
28
+ select<T = any>(queryStr: string, options?: {
29
+ queriedTables?: ReadonlySet<string>;
30
+ bindValues?: PreparedBindValues;
31
+ skipCache?: boolean;
32
+ otelContext?: otel.Context;
33
+ }): ReadonlyArray<T>;
34
+ export(): Uint8Array<ArrayBufferLike>;
35
+ }
36
+ //# sourceMappingURL=SynchronousDatabaseWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SynchronousDatabaseWrapper.d.ts","sourceRoot":"","sources":["../src/SynchronousDatabaseWrapper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAElB,mBAAmB,EACpB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAK/C,eAAO,MAAM,cAAc,QAAO,SAKhC,CAAA;AAEF,qBAAa,0BAA0B;IAErC,OAAO,CAAC,WAAW,CAA+C;IAClE,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,mBAAmB,CAAc;IACzC,OAAO,CAAC,cAAc,CAAA;IACf,SAAS,EAAE,gBAAgB,CAAmB;gBAEzC,EACV,EAAE,EACF,IAAI,GACL,EAAE;QACD,EAAE,EAAE,mBAAmB,CAAA;QACvB,IAAI,EAAE;YACJ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;YACnB,eAAe,EAAE,IAAI,CAAC,OAAO,CAAA;SAC9B,CAAA;KACF;IAcD,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAqBrC,aAAa,CAAC,KAAK,EAAE,MAAM;IA4B3B,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,kBAAkB,EAC/B,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EACjC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;KAAE,GAC/D;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE;IA8CzB,MAAM,CAAC,CAAC,GAAG,GAAG,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;QACnC,UAAU,CAAC,EAAE,kBAAkB,CAAA;QAC/B,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;KAC3B,GACA,aAAa,CAAC,CAAC,CAAC;IA+DnB,MAAM;CAQP"}
@@ -0,0 +1,176 @@
1
+ /* eslint-disable prefer-arrow/prefer-arrow-functions */
2
+ import { BoundArray, BoundMap, sql } from '@livestore/common';
3
+ import QueryCache from './QueryCache.js';
4
+ import { getDurationMsFromSpan, getStartTimeHighResFromSpan } from './utils/otel.js';
5
+ export const emptyDebugInfo = () => ({
6
+ slowQueries: new BoundArray(200),
7
+ queryFrameDuration: 0,
8
+ queryFrameCount: 0,
9
+ events: new BoundArray(1000),
10
+ });
11
+ export class SynchronousDatabaseWrapper {
12
+ // TODO: how many unique active statements are expected?
13
+ cachedStmts = new BoundMap(200);
14
+ tablesUsedCache = new BoundMap(200);
15
+ resultCache = new QueryCache();
16
+ db;
17
+ otelTracer;
18
+ otelRootSpanContext;
19
+ tablesUsedStmt;
20
+ debugInfo = emptyDebugInfo();
21
+ constructor({ db, otel, }) {
22
+ this.db = db;
23
+ this.otelTracer = otel.tracer;
24
+ this.otelRootSpanContext = otel.rootSpanContext;
25
+ this.tablesUsedStmt = db.prepare(`SELECT tbl_name FROM tables_used(?) AS u JOIN sqlite_master ON sqlite_master.name = u.name WHERE u.schema = 'main';`);
26
+ this.cachedStmts.onEvict = (_queryStr, stmt) => stmt.finalize();
27
+ configureSQLite(this);
28
+ }
29
+ txn(callback) {
30
+ this.execute(sql `begin transaction;`);
31
+ let errored = false;
32
+ let result;
33
+ try {
34
+ result = callback();
35
+ }
36
+ catch (e) {
37
+ errored = true;
38
+ this.execute(sql `rollback;`);
39
+ throw e;
40
+ }
41
+ if (!errored) {
42
+ this.execute(sql `commit;`);
43
+ }
44
+ return result;
45
+ }
46
+ getTablesUsed(query) {
47
+ // It seems that SQLite doesn't properly handle `DELETE FROM SOME_TABLE` queries without a WHERE clause
48
+ // So we need to handle these queries separately
49
+ const tableNameFromPlainDeleteQuery = tryGetTableNameFromPlainDeleteQuery(query);
50
+ if (tableNameFromPlainDeleteQuery !== undefined) {
51
+ return new Set([tableNameFromPlainDeleteQuery]);
52
+ }
53
+ const cached = this.tablesUsedCache.get(query);
54
+ if (cached) {
55
+ return cached;
56
+ }
57
+ const stmt = this.tablesUsedStmt;
58
+ const tablesUsed = new Set();
59
+ try {
60
+ const results = stmt.select([query]);
61
+ for (const row of results) {
62
+ tablesUsed.add(row.tbl_name);
63
+ }
64
+ }
65
+ catch (e) {
66
+ console.error('Error getting tables used', e, 'for query', query);
67
+ return new Set();
68
+ }
69
+ this.tablesUsedCache.set(query, tablesUsed);
70
+ return tablesUsed;
71
+ }
72
+ execute(queryStr, bindValues, writeTables, options) {
73
+ // console.debug('in-memory-db:execute', query, bindValues)
74
+ return this.otelTracer.startActiveSpan('livestore.in-memory-db:execute',
75
+ // TODO truncate query string
76
+ { attributes: { 'sql.query': queryStr } }, options?.otelContext ?? this.otelRootSpanContext, (span) => {
77
+ let stmt = this.cachedStmts.get(queryStr);
78
+ if (stmt === undefined) {
79
+ stmt = this.db.prepare(queryStr);
80
+ this.cachedStmts.set(queryStr, stmt);
81
+ }
82
+ stmt.execute(bindValues);
83
+ if (options?.hasNoEffects !== true && !this.resultCache.ignoreQuery(queryStr)) {
84
+ // TODO use write tables instead
85
+ // check what queries actually end up here.
86
+ this.resultCache.invalidate(writeTables ?? this.getTablesUsed(queryStr));
87
+ }
88
+ span.end();
89
+ const durationMs = getDurationMsFromSpan(span);
90
+ this.debugInfo.queryFrameDuration += durationMs;
91
+ this.debugInfo.queryFrameCount++;
92
+ if (durationMs > 5 && import.meta.env.DEV) {
93
+ this.debugInfo.slowQueries.push({
94
+ queryStr,
95
+ bindValues,
96
+ durationMs,
97
+ rowsCount: undefined,
98
+ queriedTables: new Set(),
99
+ startTimePerfNow: getStartTimeHighResFromSpan(span),
100
+ });
101
+ }
102
+ return { durationMs };
103
+ });
104
+ }
105
+ select(queryStr, options) {
106
+ const { queriedTables, bindValues, skipCache = false, otelContext } = options ?? {};
107
+ // console.debug('in-memory-db:select', query, bindValues)
108
+ return this.otelTracer.startActiveSpan('sql-in-memory-select', {}, otelContext ?? this.otelRootSpanContext, (span) => {
109
+ try {
110
+ span.setAttribute('sql.query', queryStr);
111
+ const key = this.resultCache.getKey(queryStr, bindValues);
112
+ const cachedResult = this.resultCache.get(key);
113
+ if (skipCache === false && cachedResult !== undefined) {
114
+ span.setAttribute('sql.rowsCount', cachedResult.length);
115
+ span.setAttribute('sql.cached', true);
116
+ span.end();
117
+ return cachedResult;
118
+ }
119
+ let stmt = this.cachedStmts.get(queryStr);
120
+ if (stmt === undefined) {
121
+ stmt = this.db.prepare(queryStr);
122
+ this.cachedStmts.set(queryStr, stmt);
123
+ }
124
+ const result = stmt.select(bindValues);
125
+ span.setAttribute('sql.rowsCount', result.length);
126
+ span.setAttribute('sql.cached', false);
127
+ const queriedTables_ = queriedTables ?? this.getTablesUsed(queryStr);
128
+ this.resultCache.set(queriedTables_, key, result);
129
+ span.end();
130
+ const durationMs = getDurationMsFromSpan(span);
131
+ this.debugInfo.queryFrameDuration += durationMs;
132
+ this.debugInfo.queryFrameCount++;
133
+ // TODO also enable in non-dev mode
134
+ if (durationMs > 5 && import.meta.env.DEV) {
135
+ this.debugInfo.slowQueries.push({
136
+ queryStr,
137
+ bindValues,
138
+ durationMs,
139
+ rowsCount: result.length,
140
+ queriedTables: queriedTables_,
141
+ startTimePerfNow: getStartTimeHighResFromSpan(span),
142
+ });
143
+ }
144
+ return result;
145
+ }
146
+ finally {
147
+ span.end();
148
+ }
149
+ });
150
+ }
151
+ export() {
152
+ // Clear statement cache because exporting frees statements
153
+ for (const key of this.cachedStmts.keys()) {
154
+ this.cachedStmts.delete(key);
155
+ }
156
+ return this.db.export();
157
+ }
158
+ }
159
+ /** Set up SQLite performance; hasn't been super carefully optimized yet. */
160
+ const configureSQLite = (db) => {
161
+ db.execute(
162
+ // TODO: revisit these tuning parameters for max performance
163
+ sql `
164
+ PRAGMA page_size=32768;
165
+ PRAGMA cache_size=10000;
166
+ PRAGMA journal_mode='MEMORY'; -- we don't flush to disk before committing a write
167
+ PRAGMA synchronous='OFF';
168
+ PRAGMA temp_store='MEMORY';
169
+ PRAGMA foreign_keys='ON'; -- we want foreign key constraints to be enforced
170
+ `);
171
+ };
172
+ const tryGetTableNameFromPlainDeleteQuery = (query) => {
173
+ const [_, tableName] = query.trim().match(/^delete\s+from\s+(\w+)$/i) ?? [];
174
+ return tableName;
175
+ };
176
+ //# sourceMappingURL=SynchronousDatabaseWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SynchronousDatabaseWrapper.js","sourceRoot":"","sources":["../src/SynchronousDatabaseWrapper.ts"],"names":[],"mappings":"AAAA,wDAAwD;AASxD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAG7D,OAAO,UAAU,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAEpF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAc,EAAE,CAAC,CAAC;IAC9C,WAAW,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC;IAChC,kBAAkB,EAAE,CAAC;IACrB,eAAe,EAAE,CAAC;IAClB,MAAM,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC;CAC7B,CAAC,CAAA;AAEF,MAAM,OAAO,0BAA0B;IACrC,wDAAwD;IAChD,WAAW,GAAG,IAAI,QAAQ,CAA4B,GAAG,CAAC,CAAA;IAC1D,eAAe,GAAG,IAAI,QAAQ,CAAsB,GAAG,CAAC,CAAA;IACxD,WAAW,GAAG,IAAI,UAAU,EAAE,CAAA;IAC9B,EAAE,CAAqB;IACvB,UAAU,CAAa;IACvB,mBAAmB,CAAc;IACjC,cAAc,CAAA;IACf,SAAS,GAAqB,cAAc,EAAE,CAAA;IAErD,YAAY,EACV,EAAE,EACF,IAAI,GAOL;QACC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACZ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAA;QAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,eAAe,CAAA;QAE/C,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,OAAO,CAC9B,qHAAqH,CACtH,CAAA;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;QAE/D,eAAe,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAED,GAAG,CAAO,QAAoB;QAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA,oBAAoB,CAAC,CAAA;QAErC,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,MAAY,CAAA;QAEhB,IAAI,CAAC;YACH,MAAM,GAAG,QAAQ,EAAE,CAAA;QACrB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,GAAG,IAAI,CAAA;YACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA,WAAW,CAAC,CAAA;YAC5B,MAAM,CAAC,CAAA;QACT,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA,SAAS,CAAC,CAAA;QAC5B,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,uGAAuG;QACvG,gDAAgD;QAChD,MAAM,6BAA6B,GAAG,mCAAmC,CAAC,KAAK,CAAC,CAAA;QAChF,IAAI,6BAA6B,KAAK,SAAS,EAAE,CAAC;YAChD,OAAO,IAAI,GAAG,CAAS,CAAC,6BAA6B,CAAC,CAAC,CAAA;QACzD,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC9C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAA;QACf,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAA;QAChC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAuB,CAAC,KAAK,CAAkC,CAAC,CAAA;YAE3F,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC9B,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAA;YACjE,OAAO,IAAI,GAAG,EAAU,CAAA;QAC1B,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;QAC3C,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,OAAO,CACL,QAAgB,EAChB,UAA+B,EAC/B,WAAiC,EACjC,OAAgE;QAEhE,2DAA2D;QAE3D,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CACpC,gCAAgC;QAChC,6BAA6B;QAC7B,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EACzC,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,mBAAmB,EAChD,CAAC,IAAI,EAAE,EAAE;YACP,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACzC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;gBAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YAExB,IAAI,OAAO,EAAE,YAAY,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9E,gCAAgC;gBAChC,2CAA2C;gBAC3C,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAA;YAC1E,CAAC;YAED,IAAI,CAAC,GAAG,EAAE,CAAA;YAEV,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;YAE9C,IAAI,CAAC,SAAS,CAAC,kBAAkB,IAAI,UAAU,CAAA;YAC/C,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAA;YAEhC,IAAI,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBAC1C,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;oBAC9B,QAAQ;oBACR,UAAU;oBACV,UAAU;oBACV,SAAS,EAAE,SAAS;oBACpB,aAAa,EAAE,IAAI,GAAG,EAAE;oBACxB,gBAAgB,EAAE,2BAA2B,CAAC,IAAI,CAAC;iBACpD,CAAC,CAAA;YACJ,CAAC;YAED,OAAO,EAAE,UAAU,EAAE,CAAA;QACvB,CAAC,CACF,CAAA;IACH,CAAC;IAED,MAAM,CACJ,QAAgB,EAChB,OAKC;QAED,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,GAAG,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;QAEnF,0DAA0D;QAE1D,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CACpC,sBAAsB,EACtB,EAAE,EACF,WAAW,IAAI,IAAI,CAAC,mBAAmB,EACvC,CAAC,IAAI,EAAE,EAAE;YACP,IAAI,CAAC;gBACH,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;gBAExC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;gBACzD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAC9C,IAAI,SAAS,KAAK,KAAK,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBACtD,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,YAAY,CAAC,MAAM,CAAC,CAAA;oBACvD,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;oBACrC,IAAI,CAAC,GAAG,EAAE,CAAA;oBACV,OAAO,YAAY,CAAA;gBACrB,CAAC;gBAED,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACzC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;oBAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBACtC,CAAC;gBAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAI,UAAU,CAAC,CAAA;gBAEzC,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;gBACjD,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;gBAEtC,MAAM,cAAc,GAAG,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;gBACpE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;gBAEjD,IAAI,CAAC,GAAG,EAAE,CAAA;gBAEV,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;gBAE9C,IAAI,CAAC,SAAS,CAAC,kBAAkB,IAAI,UAAU,CAAA;gBAC/C,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAA;gBAEhC,mCAAmC;gBACnC,IAAI,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;oBAC1C,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;wBAC9B,QAAQ;wBACR,UAAU;wBACV,UAAU;wBACV,SAAS,EAAE,MAAM,CAAC,MAAM;wBACxB,aAAa,EAAE,cAAc;wBAC7B,gBAAgB,EAAE,2BAA2B,CAAC,IAAI,CAAC;qBACpD,CAAC,CAAA;gBACJ,CAAC;gBAED,OAAO,MAAM,CAAA;YACf,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAA;YACZ,CAAC;QACH,CAAC,CACF,CAAA;IACH,CAAC;IAED,MAAM;QACJ,2DAA2D;QAC3D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC9B,CAAC;QAED,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAA;IACzB,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,eAAe,GAAG,CAAC,EAA8B,EAAE,EAAE;IACzD,EAAE,CAAC,OAAO;IACR,4DAA4D;IAC5D,GAAG,CAAA;;;;;;;KAOF,CACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,mCAAmC,GAAG,CAAC,KAAa,EAAE,EAAE;IAC5D,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,0BAA0B,CAAC,IAAI,EAAE,CAAA;IAC3E,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { LiveStoreContextLayer, LiveStoreContextRunning as LiveStoreContext, LiveStoreContextRunning, LiveStoreContextDeferred, DeferredStoreContext, type LiveStoreContextProps, } from './LiveStore.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,IAAI,gBAAgB,EAC3C,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { LiveStoreContextLayer, LiveStoreContextRunning as LiveStoreContext, LiveStoreContextRunning, LiveStoreContextDeferred, DeferredStoreContext, } from './LiveStore.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,IAAI,gBAAgB,EAC3C,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,GAErB,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ *
3
+ * LiveStore currently relies on some global state in order to simplify the end-user API.
4
+ * This however also has the downside that LiveStore can't be used in multiple instances in the same app.
5
+ * It could possibly also lead to some other problems.
6
+ *
7
+ * We should find some better way to do this and ideally remove this global state.
8
+ *
9
+ * Another approach could be to use the global state by default but provide an additional way to let the user
10
+ * explicitly pass instances of state below into the LiveStore constructors.
11
+ *
12
+ */
13
+ export declare const globalReactivityGraph: import("./live-queries/base-class.js").ReactivityGraph;
14
+ //# sourceMappingURL=global-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-state.d.ts","sourceRoot":"","sources":["../src/global-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,eAAO,MAAM,qBAAqB,wDAEjC,CAAA"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ *
3
+ * LiveStore currently relies on some global state in order to simplify the end-user API.
4
+ * This however also has the downside that LiveStore can't be used in multiple instances in the same app.
5
+ * It could possibly also lead to some other problems.
6
+ *
7
+ * We should find some better way to do this and ideally remove this global state.
8
+ *
9
+ * Another approach could be to use the global state by default but provide an additional way to let the user
10
+ * explicitly pass instances of state below into the LiveStore constructors.
11
+ *
12
+ */
13
+ import { GlobalValue } from '@livestore/utils/effect';
14
+ import { makeReactivityGraph } from './live-queries/base-class.js';
15
+ export const globalReactivityGraph = GlobalValue.globalValue('livestore-global-reactivityGraph', () => makeReactivityGraph());
16
+ //# sourceMappingURL=global-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-state.js","sourceRoot":"","sources":["../src/global-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAErD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAElE,MAAM,CAAC,MAAM,qBAAqB,GAAG,WAAW,CAAC,WAAW,CAAC,kCAAkC,EAAE,GAAG,EAAE,CACpG,mBAAmB,EAAE,CACtB,CAAA"}
@@ -0,0 +1,20 @@
1
+ export { Store } from './store/store.js';
2
+ export { createStore, createStorePromise, type CreateStoreOptions } from './store/create-store.js';
3
+ export type { BaseGraphQLContext, QueryDebugInfo, RefreshReason, GraphQLOptions, OtelOptions, } from './store/store-types.js';
4
+ export type { LiveStoreContextRunning } from './effect/LiveStore.js';
5
+ export { StoreAbort, StoreInterrupted, type LiveStoreContext } from './store/store-types.js';
6
+ export { SynchronousDatabaseWrapper, emptyDebugInfo } from './SynchronousDatabaseWrapper.js';
7
+ export type { GetAtom, AtomDebugInfo, RefreshDebugInfo, ReactiveGraphSnapshot, SerializedAtom, SerializedEffect, Atom, Node, Ref, Effect, } from './reactive.js';
8
+ export { LiveStoreComputedQuery, computed } from './live-queries/computed.js';
9
+ export { LiveStoreDbQuery, queryDb } from './live-queries/db.js';
10
+ export { LiveStoreGraphQLQuery, queryGraphQL } from './live-queries/graphql.js';
11
+ export { type GetAtomResult, type ReactivityGraph, makeReactivityGraph, type LiveQuery, type GetResult, type LiveQueryAny, } from './live-queries/base-class.js';
12
+ export { globalReactivityGraph } from './global-state.js';
13
+ export { deriveColQuery } from './row-query-utils.js';
14
+ export * from '@livestore/common/schema';
15
+ export { sql, SessionIdSymbol, type BootStatus, type SynchronousDatabase, type DebugInfo, type MutableDebugInfo, prepareBindValues, type Bindable, type PreparedBindValues, type QueryBuilderAst, type QueryBuilder, type RowQuery, } from '@livestore/common';
16
+ export { SqliteAst, SqliteDsl } from '@livestore/db-schema';
17
+ export { deepEqual } from '@livestore/utils';
18
+ export * from './utils/stack-info.js';
19
+ export type { ClientSession, Adapter, PreparedStatement } from '@livestore/common';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAClG,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,GACZ,MAAM,wBAAwB,CAAA;AAE/B,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAE5F,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAE5F,YAAY,EACV,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,MAAM,GACP,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC7E,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC/E,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,mBAAmB,EACnB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,YAAY,GAClB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,cAAc,0BAA0B,CAAA;AACxC,OAAO,EACL,GAAG,EACH,eAAe,EACf,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,iBAAiB,EACjB,KAAK,QAAQ,EACb,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,QAAQ,GACd,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,cAAc,uBAAuB,CAAA;AAErC,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ export { Store } from './store/store.js';
2
+ export { createStore, createStorePromise } from './store/create-store.js';
3
+ export { StoreAbort, StoreInterrupted } from './store/store-types.js';
4
+ export { SynchronousDatabaseWrapper, emptyDebugInfo } from './SynchronousDatabaseWrapper.js';
5
+ export { LiveStoreComputedQuery, computed } from './live-queries/computed.js';
6
+ export { LiveStoreDbQuery, queryDb } from './live-queries/db.js';
7
+ export { LiveStoreGraphQLQuery, queryGraphQL } from './live-queries/graphql.js';
8
+ export { makeReactivityGraph, } from './live-queries/base-class.js';
9
+ export { globalReactivityGraph } from './global-state.js';
10
+ export { deriveColQuery } from './row-query-utils.js';
11
+ export * from '@livestore/common/schema';
12
+ export { sql, SessionIdSymbol, prepareBindValues, } from '@livestore/common';
13
+ export { SqliteAst, SqliteDsl } from '@livestore/db-schema';
14
+ export { deepEqual } from '@livestore/utils';
15
+ export * from './utils/stack-info.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAA2B,MAAM,yBAAyB,CAAA;AAUlG,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAyB,MAAM,wBAAwB,CAAA;AAE5F,OAAO,EAAE,0BAA0B,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAc5F,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC7E,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC/E,OAAO,EAGL,mBAAmB,GAIpB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,cAAc,0BAA0B,CAAA;AACxC,OAAO,EACL,GAAG,EACH,eAAe,EAKf,iBAAiB,GAMlB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,cAAc,uBAAuB,CAAA"}
@@ -0,0 +1,66 @@
1
+ import type { Bindable, QueryBuilder, QueryInfo } from '@livestore/common';
2
+ import { Schema } from '@livestore/utils/effect';
3
+ import * as otel from '@opentelemetry/api';
4
+ import type { Thunk } from '../reactive.js';
5
+ import type { RefreshReason } from '../store/store-types.js';
6
+ import type { GetAtomResult, LiveQuery, QueryContext, ReactivityGraph } from './base-class.js';
7
+ import { LiveStoreQueryBase } from './base-class.js';
8
+ export type QueryInputRaw<TDecoded, TEncoded, TQueryInfo extends QueryInfo> = {
9
+ query: string;
10
+ schema: Schema.Schema<TDecoded, TEncoded>;
11
+ bindValues?: Bindable;
12
+ /**
13
+ * Can be provided explicitly to slightly speed up initial query performance
14
+ *
15
+ * NOTE In the future we want to do this automatically at build time
16
+ */
17
+ queriedTables?: Set<string>;
18
+ queryInfo?: TQueryInfo;
19
+ execBeforeFirstRun?: (ctx: QueryContext) => void;
20
+ };
21
+ export type QueryInput<TDecoded, TEncoded, TQueryInfo extends QueryInfo> = QueryInputRaw<TDecoded, TEncoded, TQueryInfo> | QueryBuilder<TDecoded, any, any, TQueryInfo>;
22
+ /**
23
+ * NOTE `query` is only supposed to read data. Don't use it to insert/update/delete data but use mutations instead.
24
+ */
25
+ export declare const queryDb: {
26
+ <TResultSchema, TResult = TResultSchema, TQueryInfo extends QueryInfo = QueryInfo.None>(queryInput: QueryInputRaw<TResultSchema, ReadonlyArray<any>, TQueryInfo> | QueryBuilder<TResultSchema, any, any, TQueryInfo>, options?: {
27
+ map?: (rows: TResultSchema) => TResult;
28
+ /**
29
+ * Used for debugging / devtools
30
+ */
31
+ label?: string;
32
+ reactivityGraph?: ReactivityGraph;
33
+ otelContext?: otel.Context;
34
+ }): LiveQuery<TResult, TQueryInfo>;
35
+ <TResultSchema, TResult = TResultSchema, TQueryInfo extends QueryInfo = QueryInfo.None>(queryInput: ((get: GetAtomResult) => QueryInputRaw<TResultSchema, ReadonlyArray<any>, TQueryInfo>) | ((get: GetAtomResult) => QueryBuilder<TResultSchema, any, any, TQueryInfo>), options?: {
36
+ map?: (rows: TResultSchema) => TResult;
37
+ /**
38
+ * Used for debugging / devtools
39
+ */
40
+ label?: string;
41
+ reactivityGraph?: ReactivityGraph;
42
+ queryInfo?: TQueryInfo;
43
+ otelContext?: otel.Context;
44
+ }): LiveQuery<TResult, TQueryInfo>;
45
+ };
46
+ export declare class LiveStoreDbQuery<TResultSchema, TResult = TResultSchema, TQueryInfo extends QueryInfo = QueryInfo.None> extends LiveStoreQueryBase<TResult, TQueryInfo> {
47
+ _tag: 'db';
48
+ /** A reactive thunk representing the query text */
49
+ queryInput$: Thunk<QueryInput<TResultSchema, ReadonlyArray<any>, TQueryInfo>, QueryContext, RefreshReason> | undefined;
50
+ /** A reactive thunk representing the query results */
51
+ results$: Thunk<TResult, QueryContext, RefreshReason>;
52
+ label: string;
53
+ queryInfo: TQueryInfo;
54
+ protected reactivityGraph: ReactivityGraph;
55
+ private mapResult;
56
+ constructor({ queryInput, label: inputLabel, reactivityGraph, map, queryInfo: inputQueryInfo, otelContext, }: {
57
+ label?: string;
58
+ queryInput: QueryInput<TResultSchema, ReadonlyArray<any>, TQueryInfo> | ((get: GetAtomResult, ctx: QueryContext) => QueryInput<TResultSchema, ReadonlyArray<any>, TQueryInfo>);
59
+ reactivityGraph?: ReactivityGraph;
60
+ map?: (rows: TResultSchema) => TResult;
61
+ queryInfo?: TQueryInfo;
62
+ otelContext?: otel.Context;
63
+ });
64
+ destroy: () => void;
65
+ }
66
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/live-queries/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ import { getResultSchema, isQueryBuilder, prepareBindValues, QueryBuilderAstSymbol, replaceSessionIdSymbol, } from '@livestore/common';
2
+ import { deepEqual, shouldNeverHappen } from '@livestore/utils';
3
+ import { Predicate, Schema, TreeFormatter } from '@livestore/utils/effect';
4
+ import * as otel from '@opentelemetry/api';
5
+ import { globalReactivityGraph } from '../global-state.js';
6
+ import { isThunk, NOT_REFRESHED_YET } from '../reactive.js';
7
+ import { makeExecBeforeFirstRun, rowQueryLabel } from '../row-query-utils.js';
8
+ import { getDurationMsFromSpan } from '../utils/otel.js';
9
+ import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
10
+ /**
11
+ * NOTE `query` is only supposed to read data. Don't use it to insert/update/delete data but use mutations instead.
12
+ */
13
+ export const queryDb = (queryInput, options) => new LiveStoreDbQuery({
14
+ queryInput,
15
+ label: options?.label,
16
+ reactivityGraph: options?.reactivityGraph,
17
+ map: options?.map,
18
+ queryInfo: Predicate.hasProperty(options, 'queryInfo') ? options.queryInfo : undefined,
19
+ otelContext: options?.otelContext,
20
+ });
21
+ /* An object encapsulating a reactive SQL query */
22
+ export class LiveStoreDbQuery extends LiveStoreQueryBase {
23
+ _tag = 'db';
24
+ /** A reactive thunk representing the query text */
25
+ queryInput$;
26
+ /** A reactive thunk representing the query results */
27
+ results$;
28
+ label;
29
+ queryInfo;
30
+ reactivityGraph;
31
+ mapResult;
32
+ constructor({ queryInput, label: inputLabel, reactivityGraph, map, queryInfo: inputQueryInfo, otelContext, }) {
33
+ super();
34
+ let label = inputLabel ?? 'db(unknown)';
35
+ let queryInfo = inputQueryInfo ?? { _tag: 'None' };
36
+ this.reactivityGraph = reactivityGraph ?? globalReactivityGraph;
37
+ this.mapResult = map === undefined ? (rows) => rows : map;
38
+ const schemaRef = {
39
+ current: typeof queryInput === 'function' ? undefined : isQueryBuilder(queryInput) ? undefined : queryInput.schema,
40
+ };
41
+ const execBeforeFirstRunRef = {
42
+ current: undefined,
43
+ };
44
+ let queryInputRaw$OrQueryInputRaw;
45
+ const fromQueryBuilder = (qb, otelContext) => {
46
+ const qbRes = qb.asSql();
47
+ const schema = getResultSchema(qb);
48
+ const ast = qb[QueryBuilderAstSymbol];
49
+ return {
50
+ queryInputRaw: {
51
+ query: qbRes.query,
52
+ schema,
53
+ bindValues: qbRes.bindValues,
54
+ queriedTables: new Set([ast.tableDef.sqliteDef.name]),
55
+ queryInfo: ast._tag === 'RowQuery' ? { _tag: 'Row', table: ast.tableDef, id: ast.id } : { _tag: 'None' },
56
+ },
57
+ label: ast._tag === 'RowQuery' ? rowQueryLabel(ast.tableDef, ast.id) : qb.toString(),
58
+ execBeforeFirstRun: ast._tag === 'RowQuery'
59
+ ? makeExecBeforeFirstRun({
60
+ table: ast.tableDef,
61
+ insertValues: ast.insertValues,
62
+ id: ast.id,
63
+ otelContext,
64
+ })
65
+ : undefined,
66
+ };
67
+ };
68
+ if (typeof queryInput === 'function') {
69
+ queryInputRaw$OrQueryInputRaw = this.reactivityGraph.makeThunk((get, setDebugInfo, ctx, otelContext) => {
70
+ const startMs = performance.now();
71
+ const queryInputResult = queryInput(makeGetAtomResult(get, otelContext ?? ctx.rootOtelContext), ctx);
72
+ const durationMs = performance.now() - startMs;
73
+ let queryInputRaw;
74
+ if (isQueryBuilder(queryInputResult)) {
75
+ const res = fromQueryBuilder(queryInputResult, otelContext);
76
+ queryInputRaw = res.queryInputRaw;
77
+ // setting label dynamically here
78
+ this.label = res.label;
79
+ execBeforeFirstRunRef.current = res.execBeforeFirstRun;
80
+ }
81
+ else {
82
+ queryInputRaw = queryInputResult;
83
+ }
84
+ setDebugInfo({ _tag: 'computed', label: `${this.label}:queryInput`, query: queryInputRaw.query, durationMs });
85
+ schemaRef.current = queryInputRaw.schema;
86
+ if (inputQueryInfo === undefined && queryInputRaw.queryInfo !== undefined) {
87
+ queryInfo = queryInputRaw.queryInfo;
88
+ }
89
+ return queryInputRaw;
90
+ }, {
91
+ label: `${label}:query`,
92
+ meta: { liveStoreThunkType: 'db.query' },
93
+ // NOTE we're not checking the schema here as we assume the query string to always change when the schema might change
94
+ equal: (a, b) => a.query === b.query && deepEqual(a.bindValues, b.bindValues),
95
+ });
96
+ }
97
+ else {
98
+ let queryInputRaw;
99
+ if (isQueryBuilder(queryInput)) {
100
+ const res = fromQueryBuilder(queryInput, otelContext);
101
+ queryInputRaw = res.queryInputRaw;
102
+ label = res.label;
103
+ execBeforeFirstRunRef.current = res.execBeforeFirstRun;
104
+ }
105
+ else {
106
+ queryInputRaw = queryInput;
107
+ }
108
+ schemaRef.current = queryInputRaw.schema;
109
+ queryInputRaw$OrQueryInputRaw = queryInputRaw;
110
+ // this.label = inputLabel ? this.label : `db(${})`
111
+ if (inputLabel === undefined && isQueryBuilder(queryInput)) {
112
+ const ast = queryInput[QueryBuilderAstSymbol];
113
+ if (ast._tag === 'RowQuery') {
114
+ label = `db(${rowQueryLabel(ast.tableDef, ast.id)})`;
115
+ }
116
+ }
117
+ if (inputQueryInfo === undefined && queryInputRaw.queryInfo !== undefined) {
118
+ queryInfo = queryInputRaw.queryInfo;
119
+ }
120
+ }
121
+ const queriedTablesRef = { current: undefined };
122
+ const makeResultsEqual = (resultSchema) => (a, b) => a === NOT_REFRESHED_YET || b === NOT_REFRESHED_YET ? false : Schema.equivalence(resultSchema)(a, b);
123
+ // NOTE we try to create the equality function eagerly as it might be expensive
124
+ // TODO also support derived equality for `map` (probably will depend on having an easy way to transform a schema without an `encode` step)
125
+ // This would mean dropping the `map` option
126
+ const resultsEqual = map === undefined
127
+ ? schemaRef.current === undefined
128
+ ? (a, b) => makeResultsEqual(schemaRef.current)(a, b)
129
+ : makeResultsEqual(schemaRef.current)
130
+ : undefined;
131
+ const results$ = this.reactivityGraph.makeThunk((get, setDebugInfo, queryContext, otelContext) => queryContext.otelTracer.startActiveSpan('db:...', // NOTE span name will be overridden further down
132
+ {}, otelContext ?? queryContext.rootOtelContext, (span) => {
133
+ const otelContext = otel.trace.setSpan(otel.context.active(), span);
134
+ const { store } = queryContext;
135
+ if (execBeforeFirstRunRef.current !== undefined) {
136
+ execBeforeFirstRunRef.current(queryContext, otelContext);
137
+ execBeforeFirstRunRef.current = undefined;
138
+ }
139
+ const queryInputResult = isThunk(queryInputRaw$OrQueryInputRaw)
140
+ ? get(queryInputRaw$OrQueryInputRaw, otelContext)
141
+ : queryInputRaw$OrQueryInputRaw;
142
+ const sqlString = queryInputResult.query;
143
+ const bindValues = queryInputResult.bindValues;
144
+ if (queriedTablesRef.current === undefined) {
145
+ queriedTablesRef.current = store.syncDbWrapper.getTablesUsed(sqlString);
146
+ }
147
+ if (bindValues !== undefined) {
148
+ replaceSessionIdSymbol(bindValues, store.clientSession.coordinator.sessionId);
149
+ }
150
+ // Establish a reactive dependency on the tables used in the query
151
+ for (const tableName of queriedTablesRef.current) {
152
+ const tableRef = store.tableRefs[tableName] ?? shouldNeverHappen(`No table ref found for ${tableName}`);
153
+ get(tableRef, otelContext);
154
+ }
155
+ span.setAttribute('sql.query', sqlString);
156
+ span.updateName(`db:${sqlString.slice(0, 50)}`);
157
+ const rawDbResults = store.syncDbWrapper.select(sqlString, {
158
+ queriedTables: queriedTablesRef.current,
159
+ bindValues: bindValues ? prepareBindValues(bindValues, sqlString) : undefined,
160
+ otelContext,
161
+ });
162
+ span.setAttribute('sql.rowsCount', rawDbResults.length);
163
+ const parsedResult = Schema.decodeEither(schemaRef.current)(rawDbResults);
164
+ if (parsedResult._tag === 'Left') {
165
+ const parseErrorStr = TreeFormatter.formatErrorSync(parsedResult.left);
166
+ const expectedSchemaStr = String(schemaRef.current.ast);
167
+ const bindValuesStr = bindValues === undefined ? '' : `\nBind values: ${JSON.stringify(bindValues)}`;
168
+ console.error(`\
169
+ Error parsing SQL query result.
170
+
171
+ Query: ${sqlString}\
172
+ ${bindValuesStr}
173
+
174
+ Expected schema: ${expectedSchemaStr}
175
+
176
+ Error: ${parseErrorStr}
177
+
178
+ Result:`, rawDbResults);
179
+ return shouldNeverHappen(`Error parsing SQL query result: ${parsedResult.left}`);
180
+ }
181
+ const result = this.mapResult(parsedResult.right);
182
+ span.end();
183
+ const durationMs = getDurationMsFromSpan(span);
184
+ this.executionTimes.push(durationMs);
185
+ setDebugInfo({ _tag: 'db', label: `${label}:results`, query: sqlString, durationMs });
186
+ return result;
187
+ }), { label: `${label}:results`, meta: { liveStoreThunkType: 'db.result' }, equal: resultsEqual });
188
+ this.results$ = results$;
189
+ this.label = label;
190
+ this.queryInfo = queryInfo;
191
+ }
192
+ destroy = () => {
193
+ if (this.queryInput$ !== undefined) {
194
+ this.reactivityGraph.destroyNode(this.queryInput$);
195
+ }
196
+ this.reactivityGraph.destroyNode(this.results$);
197
+ };
198
+ }
199
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/live-queries/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=db.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.test.d.ts","sourceRoot":"","sources":["../../src/live-queries/db.test.ts"],"names":[],"mappings":""}