@livestore/livestore 0.0.12 → 0.0.14

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