@livestore/livestore 0.0.39-dev.3 → 0.0.40

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 (215) hide show
  1. package/README.md +15 -24
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/react/fixture.d.ts +210 -35
  4. package/dist/__tests__/react/fixture.d.ts.map +1 -1
  5. package/dist/__tests__/react/fixture.js +10 -29
  6. package/dist/__tests__/react/fixture.js.map +1 -1
  7. package/dist/cud.d.ts +28 -0
  8. package/dist/cud.d.ts.map +1 -0
  9. package/dist/cud.js +50 -0
  10. package/dist/cud.js.map +1 -0
  11. package/dist/cud.test.d.ts +2 -0
  12. package/dist/cud.test.d.ts.map +1 -0
  13. package/dist/cud.test.js +47 -0
  14. package/dist/cud.test.js.map +1 -0
  15. package/dist/inMemoryDatabase.d.ts +1 -1
  16. package/dist/inMemoryDatabase.d.ts.map +1 -1
  17. package/dist/inMemoryDatabase.js +1 -4
  18. package/dist/inMemoryDatabase.js.map +1 -1
  19. package/dist/index.d.ts +4 -4
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +3 -3
  22. package/dist/index.js.map +1 -1
  23. package/dist/migrations.d.ts.map +1 -1
  24. package/dist/migrations.js +11 -7
  25. package/dist/migrations.js.map +1 -1
  26. package/dist/query-info.d.ts +49 -0
  27. package/dist/query-info.d.ts.map +1 -0
  28. package/dist/{update-path.js → query-info.js} +4 -3
  29. package/dist/query-info.js.map +1 -0
  30. package/dist/react/LiveStoreContext.d.ts +0 -6
  31. package/dist/react/LiveStoreContext.d.ts.map +1 -1
  32. package/dist/react/LiveStoreContext.js.map +1 -1
  33. package/dist/react/useAtom.d.ts +2 -2
  34. package/dist/react/useAtom.d.ts.map +1 -1
  35. package/dist/react/useAtom.js +3 -3
  36. package/dist/react/useAtom.js.map +1 -1
  37. package/dist/react/useQuery.d.ts.map +1 -1
  38. package/dist/react/useQuery.test.d.ts.map +1 -0
  39. package/dist/{__tests__/react → react}/useQuery.test.js +8 -11
  40. package/dist/react/useQuery.test.js.map +1 -0
  41. package/dist/react/useRow.d.ts +2 -2
  42. package/dist/react/useRow.d.ts.map +1 -1
  43. package/dist/react/useRow.js +5 -5
  44. package/dist/react/useRow.js.map +1 -1
  45. package/dist/react/useRow.test.d.ts.map +1 -0
  46. package/dist/{__tests__/react → react}/useRow.test.js +14 -38
  47. package/dist/react/useRow.test.js.map +1 -0
  48. package/dist/react/useTemporaryQuery.d.ts +2 -2
  49. package/dist/react/useTemporaryQuery.d.ts.map +1 -1
  50. package/dist/reactive.d.ts +2 -2
  51. package/dist/reactive.d.ts.map +1 -1
  52. package/dist/reactive.js +50 -15
  53. package/dist/reactive.js.map +1 -1
  54. package/dist/reactive.test.d.ts.map +1 -0
  55. package/dist/{__tests__/reactive.test.js → reactive.test.js} +1 -1
  56. package/dist/reactive.test.js.map +1 -0
  57. package/dist/reactiveQueries/base-class.d.ts +16 -8
  58. package/dist/reactiveQueries/base-class.d.ts.map +1 -1
  59. package/dist/reactiveQueries/base-class.js +2 -1
  60. package/dist/reactiveQueries/base-class.js.map +1 -1
  61. package/dist/reactiveQueries/graphql.d.ts +15 -9
  62. package/dist/reactiveQueries/graphql.d.ts.map +1 -1
  63. package/dist/reactiveQueries/graphql.js +29 -8
  64. package/dist/reactiveQueries/graphql.js.map +1 -1
  65. package/dist/reactiveQueries/js.d.ts +8 -8
  66. package/dist/reactiveQueries/js.d.ts.map +1 -1
  67. package/dist/reactiveQueries/js.js +5 -4
  68. package/dist/reactiveQueries/js.js.map +1 -1
  69. package/dist/reactiveQueries/sql.d.ts +11 -11
  70. package/dist/reactiveQueries/sql.d.ts.map +1 -1
  71. package/dist/reactiveQueries/sql.js +7 -6
  72. package/dist/reactiveQueries/sql.js.map +1 -1
  73. package/dist/reactiveQueries/sql.test.d.ts.map +1 -0
  74. package/dist/{__tests__/reactiveQueries → reactiveQueries}/sql.test.js +44 -34
  75. package/dist/reactiveQueries/sql.test.js.map +1 -0
  76. package/dist/row-query.d.ts +5 -5
  77. package/dist/row-query.d.ts.map +1 -1
  78. package/dist/row-query.js +11 -9
  79. package/dist/row-query.js.map +1 -1
  80. package/dist/schema/index.d.ts +20 -7
  81. package/dist/schema/index.d.ts.map +1 -1
  82. package/dist/schema/index.js +18 -3
  83. package/dist/schema/index.js.map +1 -1
  84. package/dist/schema/mutations.d.ts +81 -0
  85. package/dist/schema/mutations.d.ts.map +1 -0
  86. package/dist/schema/mutations.js +29 -0
  87. package/dist/schema/mutations.js.map +1 -0
  88. package/dist/schema/parse-utils.d.ts +3 -6
  89. package/dist/schema/parse-utils.d.ts.map +1 -1
  90. package/dist/schema/parse-utils.js +2 -27
  91. package/dist/schema/parse-utils.js.map +1 -1
  92. package/dist/schema/system-tables.d.ts +8 -8
  93. package/dist/schema/table-def.d.ts +6 -6
  94. package/dist/schema/table-def.d.ts.map +1 -1
  95. package/dist/schema/table-def.js +2 -2
  96. package/dist/schema/table-def.js.map +1 -1
  97. package/dist/storage/in-memory/index.d.ts +4 -0
  98. package/dist/storage/in-memory/index.d.ts.map +1 -1
  99. package/dist/storage/in-memory/index.js +3 -0
  100. package/dist/storage/in-memory/index.js.map +1 -1
  101. package/dist/storage/index.d.ts +4 -0
  102. package/dist/storage/index.d.ts.map +1 -1
  103. package/dist/storage/tauri/index.d.ts +4 -0
  104. package/dist/storage/tauri/index.d.ts.map +1 -1
  105. package/dist/storage/tauri/index.js +6 -0
  106. package/dist/storage/tauri/index.js.map +1 -1
  107. package/dist/storage/utils/idb.d.ts +1 -0
  108. package/dist/storage/utils/idb.d.ts.map +1 -1
  109. package/dist/storage/utils/idb.js +11 -0
  110. package/dist/storage/utils/idb.js.map +1 -1
  111. package/dist/storage/web-worker/common.d.ts +11 -0
  112. package/dist/storage/web-worker/common.d.ts.map +1 -0
  113. package/dist/storage/web-worker/common.js +2 -0
  114. package/dist/storage/web-worker/common.js.map +1 -0
  115. package/dist/storage/web-worker/index.d.ts +14 -7
  116. package/dist/storage/web-worker/index.d.ts.map +1 -1
  117. package/dist/storage/web-worker/index.js +70 -14
  118. package/dist/storage/web-worker/index.js.map +1 -1
  119. package/dist/storage/web-worker/make-worker.d.ts +20 -0
  120. package/dist/storage/web-worker/make-worker.d.ts.map +1 -0
  121. package/dist/storage/web-worker/make-worker.js +155 -0
  122. package/dist/storage/web-worker/make-worker.js.map +1 -0
  123. package/dist/storage/web-worker/vite-dev-polyfill.d.ts +2 -0
  124. package/dist/storage/web-worker/vite-dev-polyfill.d.ts.map +1 -0
  125. package/dist/storage/web-worker/vite-dev-polyfill.js +35 -0
  126. package/dist/storage/web-worker/vite-dev-polyfill.js.map +1 -0
  127. package/dist/store.d.ts +32 -42
  128. package/dist/store.d.ts.map +1 -1
  129. package/dist/store.js +82 -131
  130. package/dist/store.js.map +1 -1
  131. package/dist/utils/dev.d.ts +3 -0
  132. package/dist/utils/dev.d.ts.map +1 -0
  133. package/dist/utils/dev.js +16 -0
  134. package/dist/utils/dev.js.map +1 -0
  135. package/dist/utils/util.d.ts +2 -0
  136. package/dist/utils/util.d.ts.map +1 -1
  137. package/dist/utils/util.js +2 -0
  138. package/dist/utils/util.js.map +1 -1
  139. package/package.json +26 -14
  140. package/src/__tests__/react/fixture.tsx +12 -30
  141. package/src/cud.test.ts +52 -0
  142. package/src/cud.ts +92 -0
  143. package/src/inMemoryDatabase.ts +2 -7
  144. package/src/index.ts +14 -8
  145. package/src/migrations.ts +10 -7
  146. package/src/{update-path.ts → query-info.ts} +18 -21
  147. package/src/react/LiveStoreContext.ts +0 -9
  148. package/src/react/useAtom.ts +6 -6
  149. package/src/{__tests__/react → react}/useQuery.test.tsx +11 -11
  150. package/src/react/useQuery.ts +1 -1
  151. package/src/{__tests__/react → react}/useRow.test.tsx +21 -39
  152. package/src/react/useRow.ts +10 -10
  153. package/src/{__tests__/reactive.test.ts → reactive.test.ts} +1 -1
  154. package/src/reactive.ts +60 -19
  155. package/src/reactiveQueries/base-class.ts +23 -9
  156. package/src/reactiveQueries/graphql.ts +49 -13
  157. package/src/reactiveQueries/js.ts +15 -13
  158. package/src/{__tests__/reactiveQueries → reactiveQueries}/sql.test.ts +44 -34
  159. package/src/reactiveQueries/sql.ts +24 -22
  160. package/src/row-query.ts +24 -22
  161. package/src/schema/index.ts +47 -11
  162. package/src/schema/mutations.ts +129 -0
  163. package/src/schema/parse-utils.ts +3 -45
  164. package/src/schema/table-def.ts +9 -2
  165. package/src/storage/in-memory/index.ts +7 -0
  166. package/src/storage/index.ts +8 -0
  167. package/src/storage/tauri/index.ts +10 -0
  168. package/src/storage/utils/idb.ts +14 -0
  169. package/src/storage/web-worker/common.ts +6 -0
  170. package/src/storage/web-worker/index.ts +86 -17
  171. package/src/storage/web-worker/make-worker.ts +214 -0
  172. package/src/storage/web-worker/vite-dev-polyfill.ts +33 -0
  173. package/src/store.ts +142 -212
  174. package/src/utils/dev.ts +23 -0
  175. package/src/utils/util.ts +4 -0
  176. package/dist/__tests__/mutations.test.d.ts +0 -2
  177. package/dist/__tests__/mutations.test.d.ts.map +0 -1
  178. package/dist/__tests__/mutations.test.js +0 -40
  179. package/dist/__tests__/mutations.test.js.map +0 -1
  180. package/dist/__tests__/react/useQuery.test.d.ts.map +0 -1
  181. package/dist/__tests__/react/useQuery.test.js.map +0 -1
  182. package/dist/__tests__/react/useRow.test.d.ts.map +0 -1
  183. package/dist/__tests__/react/useRow.test.js.map +0 -1
  184. package/dist/__tests__/reactive.test.d.ts.map +0 -1
  185. package/dist/__tests__/reactive.test.js.map +0 -1
  186. package/dist/__tests__/reactiveQueries/sql.test.d.ts.map +0 -1
  187. package/dist/__tests__/reactiveQueries/sql.test.js.map +0 -1
  188. package/dist/events.d.ts +0 -7
  189. package/dist/events.d.ts.map +0 -1
  190. package/dist/events.js +0 -2
  191. package/dist/events.js.map +0 -1
  192. package/dist/mutations.d.ts +0 -33
  193. package/dist/mutations.d.ts.map +0 -1
  194. package/dist/mutations.js +0 -38
  195. package/dist/mutations.js.map +0 -1
  196. package/dist/schema/action.d.ts +0 -30
  197. package/dist/schema/action.d.ts.map +0 -1
  198. package/dist/schema/action.js +0 -3
  199. package/dist/schema/action.js.map +0 -1
  200. package/dist/storage/web-worker/worker.d.ts +0 -13
  201. package/dist/storage/web-worker/worker.d.ts.map +0 -1
  202. package/dist/storage/web-worker/worker.js +0 -110
  203. package/dist/storage/web-worker/worker.js.map +0 -1
  204. package/dist/update-path.d.ts +0 -52
  205. package/dist/update-path.d.ts.map +0 -1
  206. package/dist/update-path.js.map +0 -1
  207. package/src/__tests__/mutations.test.ts +0 -43
  208. package/src/events.ts +0 -8
  209. package/src/mutations.ts +0 -79
  210. package/src/schema/action.ts +0 -41
  211. package/src/storage/web-worker/worker.ts +0 -141
  212. /package/dist/{__tests__/react → react}/useQuery.test.d.ts +0 -0
  213. /package/dist/{__tests__/react → react}/useRow.test.d.ts +0 -0
  214. /package/dist/{__tests__/reactive.test.d.ts → reactive.test.d.ts} +0 -0
  215. /package/dist/{__tests__/reactiveQueries → reactiveQueries}/sql.test.d.ts +0 -0
@@ -1,27 +1,34 @@
1
1
  import type * as otel from '@opentelemetry/api';
2
2
  import * as Comlink from 'comlink';
3
+ import type { MutationEvent } from '../../index.js';
3
4
  import type { PreparedBindValues } from '../../utils/util.js';
4
5
  import type { Storage, StorageOtelProps } from '../index.js';
5
- import type { WrappedWorker } from './worker.js';
6
+ import type { ExecutionBacklogItem } from './common.js';
7
+ import type { WrappedWorker } from './make-worker.js';
6
8
  export type StorageType = 'opfs' | 'indexeddb';
7
9
  export type StorageOptionsWeb = {
8
10
  /** Specifies where to persist data for this storage */
9
11
  type: StorageType;
10
12
  fileName: string;
13
+ worker: Worker | (new (options?: {
14
+ name: string;
15
+ }) => Worker);
11
16
  };
12
17
  export declare class WebWorkerStorage implements Storage {
13
- worker: Comlink.Remote<WrappedWorker>;
18
+ worker: Worker;
19
+ wrappedWorker: Comlink.Remote<WrappedWorker>;
14
20
  options: StorageOptionsWeb;
15
21
  otelTracer: otel.Tracer;
16
- executionBacklog: {
17
- query: string;
18
- bindValues?: PreparedBindValues;
19
- }[];
22
+ executionBacklog: ExecutionBacklogItem[];
20
23
  executionPromise: Promise<void> | undefined;
21
24
  private constructor();
22
25
  static load: (options: StorageOptionsWeb) => ({ otelTracer }: StorageOtelProps) => WebWorkerStorage;
23
- execute: (query: string, bindValues?: PreparedBindValues) => void;
26
+ execute: (query: string, bindValues?: PreparedBindValues, _parentSpan?: otel.Span | undefined) => void;
27
+ mutate: (mutationEventEncoded: MutationEvent.Any, _parentSpan?: otel.Span | undefined) => void;
28
+ private scheduleExecution;
24
29
  private executeBacklog;
25
30
  getPersistedData: (_parentSpan?: otel.Span) => Promise<Uint8Array>;
31
+ getMutationLogData: (_parentSpan?: otel.Span) => Promise<Uint8Array>;
32
+ dangerouslyReset: () => Promise<void>;
26
33
  }
27
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/web-worker/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAElC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,CAAA;AAE9C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,uDAAuD;IACvD,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACrC,OAAO,EAAE,iBAAiB,CAAA;IAC1B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAA;IAEvB,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,kBAAkB,CAAA;KAAE,EAAE,CAAK;IAC3E,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;IAE3C,OAAO;IAmBP,MAAM,CAAC,IAAI,YAAa,iBAAiB,sBASf,gBAAgB,sBAOzC;IAED,OAAO,UAAW,MAAM,eAAe,kBAAkB,UAaxD;IAED,OAAO,CAAC,cAAc,CAIrB;IAED,gBAAgB,iBAAwB,KAAK,IAAI,KAAG,QAAQ,UAAU,CAAC,CAAkC;CAC1G"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/web-worker/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAElC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,CAAA;AAE9C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,uDAAuD;IACvD,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,GAAG,CAAC,KAAK,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC,CAAA;CAC9D,CAAA;AAED,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAC5C,OAAO,EAAE,iBAAiB,CAAA;IAC1B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAA;IAEvB,gBAAgB,EAAE,oBAAoB,EAAE,CAAK;IAC7C,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;IAE3C,OAAO;IAsBP,MAAM,CAAC,IAAI,YAAa,iBAAiB,sBAKf,gBAAgB,sBAQzC;IAED,OAAO,UAAW,MAAM,eAAe,kBAAkB,gBAAgB,KAAK,IAAI,GAAG,SAAS,UAG7F;IAED,MAAM,yBAA0B,cAAc,GAAG,gBAAgB,KAAK,IAAI,GAAG,SAAS,UAGrF;IAED,OAAO,CAAC,iBAAiB,CAWxB;IAED,OAAO,CAAC,cAAc,CAIrB;IAED,gBAAgB,iBAAwB,KAAK,IAAI,KAAG,QAAQ,UAAU,CAAC,CAAkC;IAEzG,kBAAkB,iBAAwB,KAAK,IAAI,KAAG,QAAQ,UAAU,CAAC,CAAoC;IAE7G,gBAAgB,sBAIf;CACF"}
@@ -1,36 +1,42 @@
1
- import { casesHandled } from '@livestore/utils';
1
+ import { casesHandled, notYetImplemented } from '@livestore/utils';
2
2
  import * as Comlink from 'comlink';
3
3
  import { IDB } from '../utils/idb.js';
4
4
  export class WebWorkerStorage {
5
5
  worker;
6
+ wrappedWorker;
6
7
  options;
7
8
  otelTracer;
8
9
  executionBacklog = [];
9
10
  executionPromise;
10
- constructor({ worker, options, otelTracer, executionPromise, }) {
11
+ constructor({ worker, wrappedWorker, options, otelTracer, executionPromise, }) {
11
12
  this.worker = worker;
13
+ this.wrappedWorker = wrappedWorker;
12
14
  this.options = options;
13
15
  this.otelTracer = otelTracer;
14
16
  this.executionPromise = executionPromise;
15
17
  executionPromise.then(() => this.executeBacklog());
16
18
  }
17
19
  static load = (options) => {
18
- // TODO: Importing the worker like this only works with Vite;
19
- // should this really be inside the LiveStore library?
20
- // Doesn't work with Firefox right now during dev https://bugzilla.mozilla.org/show_bug.cgi?id=1247687
21
- const worker = new Worker(new URL('./worker.js', import.meta.url), {
22
- type: 'module',
23
- });
20
+ const worker = options.worker instanceof Worker ? options.worker : new options.worker({ name: 'livestore-worker' });
21
+ // TODO replace Comlink with Effect worker
24
22
  const wrappedWorker = Comlink.wrap(worker);
25
23
  return ({ otelTracer }) => new WebWorkerStorage({
26
- worker: wrappedWorker,
24
+ worker,
25
+ wrappedWorker,
27
26
  options,
28
27
  otelTracer,
29
- executionPromise: wrappedWorker.initialize(options),
28
+ executionPromise: wrappedWorker.initialize({ fileName: options.fileName, type: options.type }),
30
29
  });
31
30
  };
32
- execute = (query, bindValues) => {
33
- this.executionBacklog.push({ query, bindValues });
31
+ execute = (query, bindValues, _parentSpan) => {
32
+ this.executionBacklog.push({ _tag: 'execute', query, bindValues });
33
+ this.scheduleExecution();
34
+ };
35
+ mutate = (mutationEventEncoded, _parentSpan) => {
36
+ this.executionBacklog.push({ _tag: 'mutate', mutationEventEncoded });
37
+ this.scheduleExecution();
38
+ };
39
+ scheduleExecution = () => {
34
40
  // Instead of sending the queries to the worker immediately, we wait a bit and batch them up (which reduces the number of messages sent to the worker)
35
41
  if (this.executionPromise === undefined) {
36
42
  this.executionPromise = new Promise((resolve) => {
@@ -42,18 +48,24 @@ export class WebWorkerStorage {
42
48
  }
43
49
  };
44
50
  executeBacklog = () => {
45
- void this.worker.executeBulk(this.executionBacklog);
51
+ void this.wrappedWorker.executeBulk(this.executionBacklog);
46
52
  this.executionBacklog = [];
47
53
  this.executionPromise = undefined;
48
54
  };
49
55
  getPersistedData = async (_parentSpan) => getPersistedData(this.options);
56
+ getMutationLogData = async (_parentSpan) => getMutationLogData(this.options);
57
+ dangerouslyReset = async () => {
58
+ // TODO implement graceful shutdown
59
+ this.worker.terminate();
60
+ await resetPersistedData(this.options);
61
+ };
50
62
  }
51
63
  const getPersistedData = async (options) => {
52
64
  switch (options.type) {
53
65
  case 'opfs': {
54
66
  try {
55
67
  const rootHandle = await navigator.storage.getDirectory();
56
- const fileHandle = await rootHandle.getFileHandle(options.fileName + '.db');
68
+ const fileHandle = await rootHandle.getFileHandle(options.fileName);
57
69
  const file = await fileHandle.getFile();
58
70
  const buffer = await file.arrayBuffer();
59
71
  const data = new Uint8Array(buffer);
@@ -75,4 +87,48 @@ const getPersistedData = async (options) => {
75
87
  }
76
88
  }
77
89
  };
90
+ const getMutationLogData = async (options) => {
91
+ switch (options.type) {
92
+ case 'opfs': {
93
+ try {
94
+ const rootHandle = await navigator.storage.getDirectory();
95
+ const fileHandle = await rootHandle.getFileHandle(`${options.fileName}-log.db`);
96
+ const file = await fileHandle.getFile();
97
+ const buffer = await file.arrayBuffer();
98
+ const data = new Uint8Array(buffer);
99
+ return data;
100
+ }
101
+ catch (error) {
102
+ if (error instanceof DOMException && error.name === 'NotFoundError') {
103
+ return new Uint8Array();
104
+ }
105
+ throw error;
106
+ }
107
+ }
108
+ case 'indexeddb': {
109
+ return notYetImplemented();
110
+ }
111
+ default: {
112
+ casesHandled(options.type);
113
+ }
114
+ }
115
+ };
116
+ const resetPersistedData = async (options) => {
117
+ switch (options.type) {
118
+ case 'opfs': {
119
+ const rootHandle = await navigator.storage.getDirectory();
120
+ await rootHandle.removeEntry(options.fileName);
121
+ await rootHandle.removeEntry(`${options.fileName}-log.db`);
122
+ break;
123
+ }
124
+ case 'indexeddb': {
125
+ const idb = new IDB(options.fileName);
126
+ await idb.deleteDb();
127
+ break;
128
+ }
129
+ default: {
130
+ casesHandled(options.type);
131
+ }
132
+ }
133
+ };
78
134
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/web-worker/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/web-worker/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { LiveStoreSchema } from '../../index.js';
2
+ import type { ExecutionBacklogItem } from './common.js';
3
+ import type { StorageOptionsWeb } from './index.js';
4
+ export type WorkerOptions<TSchema extends LiveStoreSchema = LiveStoreSchema> = {
5
+ schema: TSchema;
6
+ mutationLog?: {
7
+ /**
8
+ * Mutations to exclude in the mutation log
9
+ *
10
+ * @default new Set(['livestore.RawSql'])
11
+ */
12
+ exclude?: ReadonlySet<keyof TSchema['_MutationDefMapType']>;
13
+ };
14
+ };
15
+ export declare const makeWorker: <TSchema extends LiveStoreSchema = LiveStoreSchema>({ schema, mutationLog, }: WorkerOptions<TSchema>) => {
16
+ initialize: (options: Omit<StorageOptionsWeb, 'worker'>) => Promise<void>;
17
+ executeBulk: (executionItems: ExecutionBacklogItem[]) => void;
18
+ };
19
+ export type WrappedWorker = ReturnType<typeof makeWorker>;
20
+ //# sourceMappingURL=make-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-worker.d.ts","sourceRoot":"","sources":["../../../src/storage/web-worker/make-worker.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAIrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,MAAM,MAAM,aAAa,CAAC,OAAO,SAAS,eAAe,GAAG,eAAe,IAAI;IAC7E,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE;QACZ;;;;WAIG;QACH,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAA;KAC5D,CAAA;CACF,CAAA;AAED,eAAO,MAAM,UAAU;0BAgCc,KAAK,iBAAiB,EAAE,QAAQ,CAAC;kCA2D/B,oBAAoB,EAAE,KAAG,IAAI;CA6FnE,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA"}
@@ -0,0 +1,155 @@
1
+ // TODO: create types for these libraries? SQL.js already should have types;
2
+ // we just need the types to apply to the fork.
3
+ import { memoize, shouldNeverHappen } from '@livestore/utils';
4
+ import { Schema } from '@livestore/utils/effect';
5
+ import * as Comlink from 'comlink';
6
+ import sqlite3InitModule from 'sqlite-esm';
7
+ import { makeMutationEventSchema } from '../../schema/mutations.js';
8
+ import { casesHandled, prepareBindValues, sql } from '../../utils/util.js';
9
+ import { IDB } from '../utils/idb.js';
10
+ export const makeWorker = ({ schema, mutationLog, }) => {
11
+ // A global variable to hold the database connection.
12
+ let db;
13
+ let dbLog;
14
+ let sqlite3;
15
+ const mutationLogExclude = mutationLog?.exclude ?? new Set(['livestore.RawSql']);
16
+ // TODO refactor
17
+ const mutationArgsSchema = makeMutationEventSchema(Object.fromEntries(schema.mutations.entries()));
18
+ const schemaHashMap = new Map([...schema.mutations.entries()].map(([k, v]) => [k, Schema.hash(v.schema)]));
19
+ // TODO get rid of this in favour of a "proper" IDB SQLite storage
20
+ let idb;
21
+ /** The location where this database storage persists its data */
22
+ let options_;
23
+ const configureConnection = () => db.exec(sql `
24
+ PRAGMA page_size=8192;
25
+ PRAGMA journal_mode=MEMORY;
26
+ PRAGMA foreign_keys='ON'; -- we want foreign key constraints to be enforced
27
+ `);
28
+ /** A full virtual filename in the IDB FS */
29
+ const initialize = async (options) => {
30
+ options_ = options;
31
+ sqlite3 = await sqlite3InitModule({
32
+ print: (message) => console.log(`[sql-client] ${message}`),
33
+ printErr: (message) => console.error(`[sql-client] ${message}`),
34
+ });
35
+ switch (options.type) {
36
+ case 'opfs': {
37
+ try {
38
+ db = new sqlite3.oo1.OpfsDb(options.fileName); // , 'c'
39
+ dbLog = new sqlite3.oo1.OpfsDb(options.fileName + '-log.db'); // , 'c'
40
+ }
41
+ catch (e) {
42
+ debugger;
43
+ }
44
+ break;
45
+ }
46
+ case 'indexeddb': {
47
+ try {
48
+ db = new sqlite3.oo1.DB({ filename: ':memory:', flags: 'c' });
49
+ idb = new IDB(options.fileName);
50
+ const bytes = await idb.get('db');
51
+ if (bytes !== undefined) {
52
+ // Based on https://sqlite.org/forum/forumpost/2119230da8ac5357a13b731f462dc76e08621a4a29724f7906d5f35bb8508465
53
+ // TODO find cleaner way to do this once possible in sqlite3-wasm
54
+ const p = sqlite3.wasm.allocFromTypedArray(bytes);
55
+ const _rc = sqlite3.capi.sqlite3_deserialize(db.pointer, 'main', p, bytes.length, bytes.length, 0);
56
+ }
57
+ }
58
+ catch (e) {
59
+ debugger;
60
+ }
61
+ break;
62
+ }
63
+ default: {
64
+ casesHandled(options.type);
65
+ }
66
+ }
67
+ // Creates `mutation_log` table if it doesn't exist
68
+ dbLog.exec(sql `
69
+ CREATE TABLE IF NOT EXISTS mutation_log (
70
+ id TEXT PRIMARY KEY NOT NULL,
71
+ mutation TEXT NOT NULL,
72
+ args_json TEXT NOT NULL,
73
+ schema_hash INTEGER NOT NULL,
74
+ created_at TEXT NOT NULL
75
+ );
76
+ `);
77
+ configureConnection();
78
+ };
79
+ // TODO get rid of this in favour of a "proper" IDB SQLite storage
80
+ let idbPersistTimeout;
81
+ const executeBulk = (executionItems) => {
82
+ let batchItems = [];
83
+ const createdAtMemo = memoize(() => new Date().toISOString());
84
+ while (executionItems.length > 0) {
85
+ try {
86
+ db.exec('BEGIN TRANSACTION'); // Start the transaction
87
+ dbLog.exec('BEGIN TRANSACTION'); // Start the transaction
88
+ batchItems = executionItems.splice(0, 50);
89
+ // console.debug('livestore-webworker: executing batch', batchItems)
90
+ for (const item of batchItems) {
91
+ if (item._tag === 'execute') {
92
+ const { query, bindValues } = item;
93
+ db.exec({ sql: query, bind: bindValues });
94
+ // NOTE we're not writing `execute` events to the mutation_log
95
+ }
96
+ else {
97
+ const { mutation, args } = Schema.decodeUnknownSync(mutationArgsSchema)(item.mutationEventEncoded);
98
+ const mutationDef = schema.mutations.get(mutation) ?? shouldNeverHappen(`Unknown mutation: ${mutation}`);
99
+ const statementRes = typeof mutationDef.sql === 'function' ? mutationDef.sql(args) : mutationDef.sql;
100
+ const statementSql = typeof statementRes === 'string' ? statementRes : statementRes.sql;
101
+ const bindValues = typeof statementRes === 'string' ? item.mutationEventEncoded.args : statementRes.bindValues;
102
+ db.exec({ sql: statementSql, bind: prepareBindValues(bindValues ?? {}, statementSql) });
103
+ // write to mutation_log
104
+ if (options_.type === 'opfs' && mutationLogExclude.has(mutation) === false) {
105
+ const schemaHash = schemaHashMap.get(mutation) ?? shouldNeverHappen(`Unknown mutation: ${mutation}`);
106
+ const argsJson = JSON.stringify(item.mutationEventEncoded.args ?? {});
107
+ dbLog.exec({
108
+ sql: `INSERT INTO mutation_log (id, mutation, args_json, schema_hash, created_at) VALUES (?, ?, ?, ?, ?)`,
109
+ bind: [
110
+ item.mutationEventEncoded.id,
111
+ item.mutationEventEncoded.mutation,
112
+ argsJson,
113
+ schemaHash,
114
+ createdAtMemo(),
115
+ ],
116
+ });
117
+ }
118
+ }
119
+ }
120
+ db.exec('COMMIT'); // Commit the transaction
121
+ dbLog.exec('COMMIT'); // Commit the transaction
122
+ }
123
+ catch (error) {
124
+ try {
125
+ db.exec('ROLLBACK'); // Rollback in case of an error
126
+ dbLog.exec('ROLLBACK'); // Rollback in case of an error
127
+ }
128
+ catch (e) {
129
+ console.error('Error rolling back transaction', e);
130
+ }
131
+ shouldNeverHappen(`Error executing query: ${error} \n ${JSON.stringify(batchItems)}`);
132
+ }
133
+ }
134
+ // TODO get rid of this in favour of a "proper" IDB SQLite storage
135
+ if (options_.type === 'indexeddb') {
136
+ if (idbPersistTimeout !== undefined) {
137
+ clearTimeout(idbPersistTimeout);
138
+ }
139
+ idbPersistTimeout = setTimeout(() => {
140
+ const data = sqlite3.capi.sqlite3_js_db_export(db.pointer);
141
+ void idb.put('db', data);
142
+ }, 1000);
143
+ }
144
+ };
145
+ const wrappedWorker = { initialize, executeBulk };
146
+ Comlink.expose(wrappedWorker);
147
+ // NOTE keep this around for debugging
148
+ // db.exec({
149
+ // sql: `select * from sqlite_master where name = 'library_tracks'`,
150
+ // callback: (_: TODO) => console.log(_),
151
+ // rowMode: 'object',
152
+ // } as TODO)
153
+ return wrappedWorker;
154
+ };
155
+ //# sourceMappingURL=make-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-worker.js","sourceRoot":"","sources":["../../../src/storage/web-worker/make-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=vite-dev-polyfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-dev-polyfill.d.ts","sourceRoot":"","sources":["../../../src/storage/web-worker/vite-dev-polyfill.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ // @ts-expect-error TODO remove when Vite does proper treeshaking during dev
2
+ globalThis.$RefreshReg$ = () => { };
3
+ // @ts-expect-error TODO remove when Vite does proper treeshaking during dev
4
+ globalThis.$RefreshSig$ = () => (type) => type;
5
+ globalThis.document = globalThis?.document ?? {
6
+ querySelectorAll: () => [],
7
+ addEventListener: () => { },
8
+ createElement: () => ({
9
+ setAttribute: () => { },
10
+ pathname: '',
11
+ style: {},
12
+ }),
13
+ body: {
14
+ addEventListener: () => { },
15
+ },
16
+ head: {
17
+ appendChild: () => { },
18
+ },
19
+ };
20
+ globalThis.window = globalThis?.window ?? {
21
+ AnimationEvent: class AnimationEvent {
22
+ },
23
+ TransitionEvent: class TransitionEvent {
24
+ },
25
+ addEventListener: () => { },
26
+ location: {
27
+ href: '',
28
+ pathname: '',
29
+ },
30
+ document: globalThis.document,
31
+ };
32
+ globalThis.HTMLElement = globalThis?.HTMLElement ?? class HTMLElement {
33
+ };
34
+ export {};
35
+ //# sourceMappingURL=vite-dev-polyfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-dev-polyfill.js","sourceRoot":"","sources":["../../../src/storage/web-worker/vite-dev-polyfill.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;AAClC,4EAA4E;AAC5E,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAA;AAEnD,UAAU,CAAC,QAAQ,GAAI,UAAkB,EAAE,QAAQ,IAAI;IACrD,gBAAgB,EAAE,GAAG,EAAE,CAAC,EAAE;IAC1B,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC1B,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;QACpB,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;QACtB,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,EAAE;KACV,CAAC;IACF,IAAI,EAAE;QACJ,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;KAC3B;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;KACtB;CACF,CAAA;AAED,UAAU,CAAC,MAAM,GAAG,UAAU,EAAE,MAAM,IAAI;IACxC,cAAc,EAAE,MAAM,cAAc;KAAG;IACvC,eAAe,EAAE,MAAM,eAAe;KAAG;IACzC,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC1B,QAAQ,EAAE;QACR,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,EAAE;KACb;IACD,QAAQ,EAAE,UAAU,CAAC,QAAQ;CAC9B,CAAA;AAED,UAAU,CAAC,WAAW,GAAG,UAAU,EAAE,WAAW,IAAI,MAAM,WAAW;CAAG,CAAA"}
package/dist/store.d.ts CHANGED
@@ -1,12 +1,11 @@
1
1
  import * as otel from '@opentelemetry/api';
2
2
  import type { GraphQLSchema } from 'graphql';
3
3
  import type * as Sqlite from 'sqlite-esm';
4
- import type { LiveStoreEvent } from './events.js';
5
4
  import { InMemoryDatabase } from './inMemoryDatabase.js';
6
5
  import type { StackInfo } from './react/utils/stack-info.js';
7
6
  import type { DebugRefreshReasonBase, ReactiveGraph, Ref } from './reactive.js';
8
7
  import type { DbContext, DbGraph, LiveQuery } from './reactiveQueries/base-class.js';
9
- import type { GetActionArgs, LiveStoreSchema } from './schema/index.js';
8
+ import { type LiveStoreSchema, type MutationEvent } from './schema/index.js';
10
9
  import type { Storage, StorageInit } from './storage/index.js';
11
10
  import type { ParamsObject } from './utils/util.js';
12
11
  export type BaseGraphQLContext = {
@@ -18,11 +17,11 @@ export type GraphQLOptions<TContext> = {
18
17
  schema: GraphQLSchema;
19
18
  makeContext: (db: InMemoryDatabase, tracer: otel.Tracer) => TContext;
20
19
  };
21
- export type StoreOptions<TGraphQLContext extends BaseGraphQLContext> = {
20
+ export type StoreOptions<TGraphQLContext extends BaseGraphQLContext, TSchema extends LiveStoreSchema = LiveStoreSchema> = {
22
21
  db: InMemoryDatabase;
23
22
  /** A `Proxy`d version of `db` except that it also mirrors `execute` calls to the storage */
24
23
  dbProxy: InMemoryDatabase;
25
- schema: LiveStoreSchema;
24
+ schema: TSchema;
26
25
  storage?: Storage;
27
26
  graphQLOptions?: GraphQLOptions<TGraphQLContext>;
28
27
  otelTracer: otel.Tracer;
@@ -30,15 +29,9 @@ export type StoreOptions<TGraphQLContext extends BaseGraphQLContext> = {
30
29
  dbGraph?: DbGraph;
31
30
  };
32
31
  export type RefreshReason = DebugRefreshReasonBase | {
33
- _tag: 'applyEvent';
34
- /** The event that was applied */
35
- event: Omit<LiveStoreEvent, 'id'>;
36
- /** The tables that were written to by the event */
37
- writeTables: ReadonlyArray<string>;
38
- } | {
39
- _tag: 'applyEvents';
40
- /** The events that was applied */
41
- events: Omit<LiveStoreEvent, 'id'>[];
32
+ _tag: 'mutate';
33
+ /** The mutations that were applied */
34
+ mutations: ReadonlyArray<MutationEvent.Any>;
42
35
  /** The tables that were written to by the event */
43
36
  writeTables: ReadonlyArray<string>;
44
37
  } | {
@@ -58,10 +51,10 @@ export type QueryDebugInfo = {
58
51
  };
59
52
  export type StoreOtel = {
60
53
  tracer: otel.Tracer;
61
- applyEventsSpanContext: otel.Context;
54
+ mutationsSpanContext: otel.Context;
62
55
  queriesSpanContext: otel.Context;
63
56
  };
64
- export declare class Store<TGraphQLContext extends BaseGraphQLContext = BaseGraphQLContext> {
57
+ export declare class Store<TGraphQLContext extends BaseGraphQLContext = BaseGraphQLContext, TSchema extends LiveStoreSchema = LiveStoreSchema> {
65
58
  id: string;
66
59
  graph: ReactiveGraph<RefreshReason, QueryDebugInfo, DbContext>;
67
60
  inMemoryDB: InMemoryDatabase;
@@ -80,8 +73,9 @@ export declare class Store<TGraphQLContext extends BaseGraphQLContext = BaseGrap
80
73
  /** RC-based set to see which queries are currently subscribed to */
81
74
  activeQueries: ReferenceCountedSet<LiveQuery<any>>;
82
75
  storage?: Storage;
76
+ private mutationArgsSchema;
83
77
  private constructor();
84
- static createStore: <TGraphQLContext_1 extends BaseGraphQLContext>(storeOptions: StoreOptions<TGraphQLContext_1>, parentSpan: otel.Span) => Store<TGraphQLContext_1>;
78
+ static createStore: <TGraphQLContext_1 extends BaseGraphQLContext, TSchema_1 extends LiveStoreSchema = LiveStoreSchema>(storeOptions: StoreOptions<TGraphQLContext_1, TSchema_1>, parentSpan: otel.Span) => Store<TGraphQLContext_1, TSchema_1>;
85
79
  /**
86
80
  * Subscribe to the results of a query
87
81
  * Returns a function to cancel the subscription.
@@ -97,51 +91,47 @@ export declare class Store<TGraphQLContext extends BaseGraphQLContext = BaseGrap
97
91
  * Currently only used when shutting down the app for debugging purposes (e.g. to close Otel spans).
98
92
  */
99
93
  destroy: () => void;
100
- applyEvent: <TEventType extends string>(eventType: TEventType, args?: any, options?: {
101
- skipRefresh?: boolean;
102
- }) => {
103
- durationMs: number;
94
+ mutate: {
95
+ <const TMutationArg extends ReadonlyArray<MutationEvent.ForSchema<TSchema>>>(...list: TMutationArg): void;
96
+ (txn: <const TMutationArg extends ReadonlyArray<MutationEvent.ForSchema<TSchema>>>(...list: TMutationArg) => void): void;
97
+ <const TMutationArg extends ReadonlyArray<MutationEvent.ForSchema<TSchema>>>(options: {
98
+ label?: string;
99
+ skipRefresh?: boolean;
100
+ }, ...list: TMutationArg): void;
101
+ (options: {
102
+ label?: string;
103
+ skipRefresh?: boolean;
104
+ }, txn: <const TMutationArg extends ReadonlyArray<MutationEvent.ForSchema<TSchema>>>(...list: TMutationArg) => void): void;
104
105
  };
105
106
  /**
106
- * Apply multiple write events to the store, and refresh all queries in response.
107
- * This is faster than calling applyEvent many times in quick succession because
108
- * we can do a single refresh after all the events.
109
- */
110
- applyEvents: (events: Iterable<{
111
- eventType: string;
112
- args: any;
113
- }>, options?: {
114
- label?: string;
115
- skipRefresh?: boolean;
116
- }) => {
117
- durationMs: number;
118
- };
119
- /**
120
- * This can be used in combination with `skipRefresh` when applying events.
107
+ * This can be used in combination with `skipRefresh` when applying mutations.
121
108
  * We might need a better solution for this. Let's see.
122
109
  */
123
110
  manualRefresh: (options?: {
124
111
  label?: string;
125
112
  }) => void;
126
113
  /**
127
- * Apply an event to the store.
114
+ * Apply a mutation to the store.
128
115
  * Returns the tables that were affected by the event.
129
116
  * This is an internal method that doesn't trigger a refresh;
130
117
  * the caller must refresh queries after calling this method.
131
118
  */
132
- private applyEventWithoutRefresh;
119
+ private mutateWithoutRefresh;
133
120
  /**
134
121
  * Directly execute a SQL query on the Store.
135
122
  * This should only be used for framework-internal purposes;
136
- * all app writes should go through applyEvent.
123
+ * all app writes should go through mutate.
137
124
  */
138
- execute: (query: string, params?: ParamsObject, writeTables?: ReadonlyArray<string>, otelContext?: otel.Context) => void;
125
+ execute: (query: string, params?: ParamsObject, writeTables?: ReadonlySet<string>, otelContext?: otel.Context) => void;
139
126
  select: (query: string, params?: ParamsObject) => readonly any[];
140
127
  makeTableRef: (tableName: string) => Ref<null, DbContext, RefreshReason>;
128
+ __devDownloadDb: () => void;
129
+ __devDownloadMutationLogDb: () => Promise<void>;
130
+ dangerouslyResetStorage: () => Promise<void> | undefined;
141
131
  }
142
132
  /** Create a new LiveStore Store */
143
- export declare const createStore: <TGraphQLContext extends BaseGraphQLContext>({ schema, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, sqlite3, boot, dbGraph, }: {
144
- schema: LiveStoreSchema;
133
+ export declare const createStore: <TGraphQLContext extends BaseGraphQLContext, TSchema extends LiveStoreSchema = LiveStoreSchema>({ schema, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, sqlite3, boot, dbGraph, }: {
134
+ schema: TSchema;
145
135
  loadStorage: () => StorageInit | Promise<StorageInit>;
146
136
  graphQLOptions?: GraphQLOptions<TGraphQLContext> | undefined;
147
137
  otelTracer?: otel.Tracer | undefined;
@@ -149,7 +139,7 @@ export declare const createStore: <TGraphQLContext extends BaseGraphQLContext>({
149
139
  sqlite3: Sqlite.Sqlite3Static;
150
140
  boot?: ((db: InMemoryDatabase, parentSpan: otel.Span) => unknown | Promise<unknown>) | undefined;
151
141
  dbGraph?: DbGraph | undefined;
152
- }) => Promise<Store<TGraphQLContext>>;
142
+ }) => Promise<Store<TGraphQLContext, TSchema>>;
153
143
  declare class ReferenceCountedSet<T> {
154
144
  private map;
155
145
  constructor();
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}