@livestore/livestore 0.0.13 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/__tests__/react/fixture.d.ts.map +1 -1
  3. package/dist/__tests__/react/fixture.js +8 -9
  4. package/dist/__tests__/react/fixture.js.map +1 -1
  5. package/dist/__tests__/reactive.test.js +3 -4
  6. package/dist/__tests__/reactive.test.js.map +1 -1
  7. package/dist/effect/LiveStore.d.ts +3 -9
  8. package/dist/effect/LiveStore.d.ts.map +1 -1
  9. package/dist/effect/LiveStore.js +11 -7
  10. package/dist/effect/LiveStore.js.map +1 -1
  11. package/dist/inMemoryDatabase.d.ts +15 -19
  12. package/dist/inMemoryDatabase.d.ts.map +1 -1
  13. package/dist/inMemoryDatabase.js +2 -9
  14. package/dist/inMemoryDatabase.js.map +1 -1
  15. package/dist/index.d.ts +4 -4
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +3 -3
  18. package/dist/index.js.map +1 -1
  19. package/dist/migrations.d.ts +7 -0
  20. package/dist/migrations.d.ts.map +1 -1
  21. package/dist/migrations.js +18 -13
  22. package/dist/migrations.js.map +1 -1
  23. package/dist/react/LiveStoreProvider.d.ts +1 -3
  24. package/dist/react/LiveStoreProvider.d.ts.map +1 -1
  25. package/dist/react/LiveStoreProvider.js +13 -10
  26. package/dist/react/LiveStoreProvider.js.map +1 -1
  27. package/dist/react/index.d.ts +1 -1
  28. package/dist/react/index.d.ts.map +1 -1
  29. package/dist/react/index.js +1 -1
  30. package/dist/react/index.js.map +1 -1
  31. package/dist/react/useGraphQL.d.ts +3 -1
  32. package/dist/react/useGraphQL.d.ts.map +1 -1
  33. package/dist/react/useGraphQL.js +19 -1
  34. package/dist/react/useGraphQL.js.map +1 -1
  35. package/dist/react/useLiveStoreComponent.d.ts +12 -12
  36. package/dist/react/useLiveStoreComponent.d.ts.map +1 -1
  37. package/dist/react/useLiveStoreComponent.js +23 -7
  38. package/dist/react/useLiveStoreComponent.js.map +1 -1
  39. package/dist/react/useQuery.d.ts +3 -0
  40. package/dist/react/useQuery.d.ts.map +1 -0
  41. package/dist/react/useQuery.js +38 -0
  42. package/dist/react/useQuery.js.map +1 -0
  43. package/dist/reactive.d.ts.map +1 -1
  44. package/dist/reactive.js +3 -3
  45. package/dist/reactive.js.map +1 -1
  46. package/dist/reactiveQueries/base-class.d.ts +6 -3
  47. package/dist/reactiveQueries/base-class.d.ts.map +1 -1
  48. package/dist/reactiveQueries/base-class.js +1 -0
  49. package/dist/reactiveQueries/base-class.js.map +1 -1
  50. package/dist/reactiveQueries/graphql.d.ts +4 -4
  51. package/dist/reactiveQueries/graphql.d.ts.map +1 -1
  52. package/dist/reactiveQueries/graphql.js.map +1 -1
  53. package/dist/reactiveQueries/js.d.ts +2 -2
  54. package/dist/reactiveQueries/js.d.ts.map +1 -1
  55. package/dist/reactiveQueries/js.js.map +1 -1
  56. package/dist/reactiveQueries/sql.d.ts +5 -5
  57. package/dist/reactiveQueries/sql.d.ts.map +1 -1
  58. package/dist/reactiveQueries/sql.js +2 -2
  59. package/dist/reactiveQueries/sql.js.map +1 -1
  60. package/dist/schema.d.ts +0 -2
  61. package/dist/schema.d.ts.map +1 -1
  62. package/dist/schema.js +3 -6
  63. package/dist/schema.js.map +1 -1
  64. package/dist/storage/in-memory/index.d.ts +2 -2
  65. package/dist/storage/in-memory/index.d.ts.map +1 -1
  66. package/dist/storage/in-memory/index.js.map +1 -1
  67. package/dist/storage/index.d.ts +2 -2
  68. package/dist/storage/index.d.ts.map +1 -1
  69. package/dist/storage/tauri/index.d.ts +2 -2
  70. package/dist/storage/tauri/index.d.ts.map +1 -1
  71. package/dist/storage/tauri/index.js.map +1 -1
  72. package/dist/storage/web-worker/index.d.ts +4 -4
  73. package/dist/storage/web-worker/index.d.ts.map +1 -1
  74. package/dist/storage/web-worker/index.js +3 -5
  75. package/dist/storage/web-worker/index.js.map +1 -1
  76. package/dist/storage/web-worker/worker.js +2 -2
  77. package/dist/storage/web-worker/worker.js.map +1 -1
  78. package/dist/store.d.ts +14 -7
  79. package/dist/store.d.ts.map +1 -1
  80. package/dist/store.js +80 -46
  81. package/dist/store.js.map +1 -1
  82. package/dist/util.d.ts +3 -1
  83. package/dist/util.d.ts.map +1 -1
  84. package/dist/util.js +2 -0
  85. package/dist/util.js.map +1 -1
  86. package/package.json +1 -1
  87. package/src/__tests__/react/fixture.tsx +9 -9
  88. package/src/__tests__/reactive.test.ts +3 -4
  89. package/src/effect/LiveStore.ts +14 -18
  90. package/src/inMemoryDatabase.ts +20 -28
  91. package/src/index.ts +10 -4
  92. package/src/migrations.ts +39 -21
  93. package/src/react/LiveStoreProvider.tsx +13 -16
  94. package/src/react/index.ts +1 -1
  95. package/src/react/useGraphQL.ts +28 -2
  96. package/src/react/useLiveStoreComponent.ts +50 -24
  97. package/src/react/useQuery.ts +56 -0
  98. package/src/reactive.ts +6 -4
  99. package/src/reactiveQueries/base-class.ts +9 -3
  100. package/src/reactiveQueries/graphql.ts +4 -4
  101. package/src/reactiveQueries/js.ts +2 -2
  102. package/src/reactiveQueries/sql.ts +6 -6
  103. package/src/schema.ts +2 -5
  104. package/src/storage/in-memory/index.ts +2 -2
  105. package/src/storage/index.ts +2 -2
  106. package/src/storage/tauri/index.ts +2 -2
  107. package/src/storage/web-worker/index.ts +6 -8
  108. package/src/storage/web-worker/worker.ts +2 -2
  109. package/src/store.ts +99 -59
  110. package/src/util.ts +8 -2
  111. package/dist/backends/base.d.ts +0 -13
  112. package/dist/backends/base.d.ts.map +0 -1
  113. package/dist/backends/base.js +0 -53
  114. package/dist/backends/base.js.map +0 -1
  115. package/dist/backends/in-memory/index.d.ts +0 -22
  116. package/dist/backends/in-memory/index.d.ts.map +0 -1
  117. package/dist/backends/in-memory/index.js +0 -45
  118. package/dist/backends/in-memory/index.js.map +0 -1
  119. package/dist/backends/index.d.ts +0 -41
  120. package/dist/backends/index.d.ts.map +0 -1
  121. package/dist/backends/index.js +0 -16
  122. package/dist/backends/index.js.map +0 -1
  123. package/dist/backends/tauri/index.d.ts +0 -21
  124. package/dist/backends/tauri/index.d.ts.map +0 -1
  125. package/dist/backends/tauri/index.js +0 -48
  126. package/dist/backends/tauri/index.js.map +0 -1
  127. package/dist/backends/utils/idb.d.ts +0 -10
  128. package/dist/backends/utils/idb.d.ts.map +0 -1
  129. package/dist/backends/utils/idb.js +0 -58
  130. package/dist/backends/utils/idb.js.map +0 -1
  131. package/dist/backends/web-worker/index.d.ts +0 -26
  132. package/dist/backends/web-worker/index.d.ts.map +0 -1
  133. package/dist/backends/web-worker/index.js +0 -63
  134. package/dist/backends/web-worker/index.js.map +0 -1
  135. package/dist/backends/web-worker/worker.d.ts +0 -17
  136. package/dist/backends/web-worker/worker.d.ts.map +0 -1
  137. package/dist/backends/web-worker/worker.js +0 -139
  138. package/dist/backends/web-worker/worker.js.map +0 -1
  139. package/dist/react/useGlobalQuery.d.ts +0 -3
  140. package/dist/react/useGlobalQuery.d.ts.map +0 -1
  141. package/dist/react/useGlobalQuery.js +0 -23
  142. package/dist/react/useGlobalQuery.js.map +0 -1
  143. package/dist/storage/base.d.ts +0 -10
  144. package/dist/storage/base.d.ts.map +0 -1
  145. package/dist/storage/base.js +0 -14
  146. package/dist/storage/base.js.map +0 -1
  147. package/src/react/useGlobalQuery.ts +0 -37
@@ -1,13 +0,0 @@
1
- import * as otel from '@opentelemetry/api';
2
- import type { LiveStoreEvent } from '../../src/events.ts';
3
- import type { ActionDefinition } from '../../src/schema.ts';
4
- import type { ParamsObject } from '../../src/util.ts';
5
- import type { Backend, SelectResponse } from './index.ts';
6
- export declare abstract class BaseBackend implements Backend {
7
- abstract otelTracer: otel.Tracer;
8
- select: <T = any>(query: string, bindValues?: ParamsObject) => Promise<SelectResponse<T>>;
9
- execute: (query: string, bindValues?: ParamsObject, parentSpan?: otel.Span) => void;
10
- getPersistedData: (parentSpan?: otel.Span) => Promise<Uint8Array>;
11
- applyEvent: (event: LiveStoreEvent, eventDefinition: ActionDefinition, parentSpan?: otel.Span) => void;
12
- }
13
- //# sourceMappingURL=base.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/backends/base.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAElD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEzD,8BAAsB,WAAY,YAAW,OAAO;IAClD,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAA;IAEhC,MAAM,mBAA0B,MAAM,eAAe,YAAY,gCAEhE;IAED,OAAO,UAAW,MAAM,eAAe,YAAY,eAAe,KAAK,IAAI,KAAG,IAAI,CAEjF;IAED,gBAAgB,gBAAuB,KAAK,IAAI,KAAG,QAAQ,UAAU,CAAC,CAErE;IAGD,UAAU,UAAW,cAAc,mBAAmB,gBAAgB,eAAe,KAAK,IAAI,KAAG,IAAI,CAsCpG;CACF"}
@@ -1,53 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-unused-vars */
2
- import { errorToString } from '@livestore/utils';
3
- import { identity } from '@livestore/utils/effect';
4
- import * as otel from '@opentelemetry/api';
5
- export class BaseBackend {
6
- constructor() {
7
- this.select = async (query, bindValues) => {
8
- throw new Error('Method not implemented.');
9
- };
10
- this.execute = (query, bindValues, parentSpan) => {
11
- throw new Error('Method not implemented.');
12
- };
13
- this.getPersistedData = async (parentSpan) => {
14
- throw new Error('Method not implemented.');
15
- };
16
- // TODO move `applyEvent` logic to Store and only call `execute` here
17
- this.applyEvent = (event, eventDefinition, parentSpan) => {
18
- const ctx = parentSpan ? otel.trace.setSpan(otel.context.active(), parentSpan) : otel.context.active();
19
- this.otelTracer.startActiveSpan('LiveStore:backend:applyEvent', {}, ctx, (span) => {
20
- try {
21
- // Careful: this SQL statement is duplicated in the backend.
22
- // Remember to update it in src-tauri/src/store.rs:apply_event as well.
23
- // await this.execute(sql`insert into ${EVENTS_TABLE_NAME} (id, type, args) values ($id, $type, $args)`, {
24
- // id: event.id,
25
- // type: event.type,
26
- // args: JSON.stringify(event.args ?? {}),
27
- // })
28
- const statement = typeof eventDefinition.statement === 'function'
29
- ? eventDefinition.statement(event.args)
30
- : eventDefinition.statement;
31
- const prepareBindValues = eventDefinition.prepareBindValues ?? identity;
32
- const bindValues = typeof eventDefinition.statement === 'function' && statement.argsAlreadyBound
33
- ? {}
34
- : prepareBindValues(event.args);
35
- span.setAttributes({
36
- 'livestore.statement.sql': statement.sql,
37
- 'livestore.statement.writeTables': statement.writeTables,
38
- 'livestore.statement.bindVales': JSON.stringify(bindValues),
39
- });
40
- this.execute(statement.sql, bindValues, span);
41
- }
42
- catch (e) {
43
- span.setStatus({ code: otel.SpanStatusCode.ERROR, message: errorToString(e) });
44
- throw e;
45
- }
46
- finally {
47
- span.end();
48
- }
49
- });
50
- };
51
- }
52
- }
53
- //# sourceMappingURL=base.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/backends/base.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAQ1C,MAAM,OAAgB,WAAW;IAAjC;QAGE,WAAM,GAAG,KAAK,EAAW,KAAa,EAAE,UAAyB,EAA8B,EAAE;YAC/F,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAC5C,CAAC,CAAA;QAED,YAAO,GAAG,CAAC,KAAa,EAAE,UAAyB,EAAE,UAAsB,EAAQ,EAAE;YACnF,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAC5C,CAAC,CAAA;QAED,qBAAgB,GAAG,KAAK,EAAE,UAAsB,EAAuB,EAAE;YACvE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAC5C,CAAC,CAAA;QAED,qEAAqE;QACrE,eAAU,GAAG,CAAC,KAAqB,EAAE,eAAiC,EAAE,UAAsB,EAAQ,EAAE;YACtG,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;YACtG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,8BAA8B,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChF,IAAI;oBACF,4DAA4D;oBAC5D,uEAAuE;oBACvE,0GAA0G;oBAC1G,kBAAkB;oBAClB,sBAAsB;oBACtB,4CAA4C;oBAC5C,KAAK;oBAEL,MAAM,SAAS,GACb,OAAO,eAAe,CAAC,SAAS,KAAK,UAAU;wBAC7C,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;wBACvC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAA;oBAE/B,MAAM,iBAAiB,GAAG,eAAe,CAAC,iBAAiB,IAAI,QAAQ,CAAA;oBAEvE,MAAM,UAAU,GACd,OAAO,eAAe,CAAC,SAAS,KAAK,UAAU,IAAI,SAAS,CAAC,gBAAgB;wBAC3E,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;oBAEnC,IAAI,CAAC,aAAa,CAAC;wBACjB,yBAAyB,EAAE,SAAS,CAAC,GAAG;wBACxC,iCAAiC,EAAE,SAAS,CAAC,WAAW;wBACxD,+BAA+B,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;qBAC5D,CAAC,CAAA;oBAEF,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;iBAC9C;gBAAC,OAAO,CAAM,EAAE;oBACf,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;oBAC9E,MAAM,CAAC,CAAA;iBACR;wBAAS;oBACR,IAAI,CAAC,GAAG,EAAE,CAAA;iBACX;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;IACH,CAAC;CAAA"}
@@ -1,22 +0,0 @@
1
- import type * as otel from '@opentelemetry/api';
2
- import type * as SqliteWasm from 'sqlite-esm';
3
- import type { ParamsObject } from '../../util.js';
4
- import { BaseBackend } from '../base.js';
5
- import type { BackendOtelProps, SelectResponse } from '../index.js';
6
- export type BackendOptionsWebInMemory = {
7
- type: 'web-in-memory';
8
- };
9
- declare type DatabaseWithCAPI = SqliteWasm.Database & {
10
- capi: SqliteWasm.CAPI;
11
- };
12
- export declare class InMemoryBackend extends BaseBackend {
13
- readonly otelTracer: otel.Tracer;
14
- readonly db: DatabaseWithCAPI;
15
- constructor(otelTracer: otel.Tracer, db: DatabaseWithCAPI);
16
- static load: (_options?: BackendOptionsWebInMemory) => Promise<({ otelTracer }: BackendOtelProps) => InMemoryBackend>;
17
- execute: (query: string, bindValues?: ParamsObject) => void;
18
- select: <T>(query: string, bindValues?: ParamsObject) => Promise<SelectResponse<T>>;
19
- getPersistedData: () => Promise<Uint8Array>;
20
- }
21
- export {};
22
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/backends/in-memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,KAAK,UAAU,MAAM,YAAY,CAAA;AAG7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEnE,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,eAAe,CAAA;CACtB,CAAA;AAED,OAAO,MAAM,gBAAgB,GAAG,UAAU,CAAC,QAAQ,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAA;CAAE,CAAA;AAG/E,qBAAa,eAAgB,SAAQ,WAAW;IAE5C,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM;IAChC,QAAQ,CAAC,EAAE,EAAE,gBAAgB;gBADpB,UAAU,EAAE,IAAI,CAAC,MAAM,EACvB,EAAE,EAAE,gBAAgB;IAK/B,MAAM,CAAC,IAAI,cAAqB,yBAAyB,8BAQ/B,gBAAgB,sBACzC;IAED,OAAO,UAAW,MAAM,eAAe,YAAY,KAAG,IAAI,CAOzD;IAED,MAAM,aAAoB,MAAM,eAAe,YAAY,gCAY1D;IAED,gBAAgB,QAAa,QAAQ,UAAU,CAAC,CAE/C;CACF"}
@@ -1,45 +0,0 @@
1
- var _a;
2
- import sqlite3InitModule from 'sqlite-esm';
3
- import { prepareBindValues } from '../../util.js';
4
- import { BaseBackend } from '../base.js';
5
- // NOTE: This backend is currently only used for testing
6
- export class InMemoryBackend extends BaseBackend {
7
- constructor(otelTracer, db) {
8
- super();
9
- this.otelTracer = otelTracer;
10
- this.db = db;
11
- this.execute = (query, bindValues) => {
12
- this.db.exec({
13
- sql: query,
14
- bind: prepareBindValues(bindValues ?? {}, query),
15
- returnValue: 'resultRows',
16
- rowMode: 'object',
17
- });
18
- };
19
- this.select = async (query, bindValues) => {
20
- const resultRows = [];
21
- this.db.exec({
22
- sql: query,
23
- bind: prepareBindValues(bindValues ?? {}, query),
24
- rowMode: 'object',
25
- resultRows,
26
- // callback: (row: any) => console.log('select result', db.filename, query, row),
27
- });
28
- return { results: resultRows };
29
- };
30
- this.getPersistedData = async () => {
31
- return this.db.capi.sqlite3_js_db_export(this.db.pointer);
32
- };
33
- }
34
- }
35
- _a = InMemoryBackend;
36
- InMemoryBackend.load = async (_options) => {
37
- const sqlite3 = await sqlite3InitModule({
38
- print: (message) => console.log(`[sql-client] ${message}`),
39
- printErr: (message) => console.error(`[sql-client] ${message}`),
40
- });
41
- const db = new sqlite3.oo1.DB({ filename: ':memory:', flags: 'c' });
42
- db.capi = sqlite3.capi;
43
- return ({ otelTracer }) => new _a(otelTracer, db);
44
- };
45
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backends/in-memory/index.ts"],"names":[],"mappings":";AAEA,OAAO,iBAAiB,MAAM,YAAY,CAAA;AAG1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AASxC,wDAAwD;AACxD,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAC9C,YACW,UAAuB,EACvB,EAAoB;QAE7B,KAAK,EAAE,CAAA;QAHE,eAAU,GAAV,UAAU,CAAa;QACvB,OAAE,GAAF,EAAE,CAAkB;QAgB/B,YAAO,GAAG,CAAC,KAAa,EAAE,UAAyB,EAAQ,EAAE;YAC3D,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;gBACX,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,iBAAiB,CAAC,UAAU,IAAI,EAAE,EAAE,KAAK,CAAS;gBACxD,WAAW,EAAE,YAAY;gBACzB,OAAO,EAAE,QAAQ;aAClB,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,WAAM,GAAG,KAAK,EAAK,KAAa,EAAE,UAAyB,EAA8B,EAAE;YACzF,MAAM,UAAU,GAAQ,EAAE,CAAA;YAE1B,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;gBACX,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,iBAAiB,CAAC,UAAU,IAAI,EAAE,EAAE,KAAK,CAAS;gBACxD,OAAO,EAAE,QAAQ;gBACjB,UAAU;gBACV,iFAAiF;aAC1E,CAAC,CAAA;YAEV,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;QAChC,CAAC,CAAA;QAED,qBAAgB,GAAG,KAAK,IAAyB,EAAE;YACjD,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;QAC3D,CAAC,CAAA;IAtCD,CAAC;;;AAEM,oBAAI,GAAG,KAAK,EAAE,QAAoC,EAAE,EAAE;IAC3D,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC;QACtC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,EAAE,CAAC;QAC1D,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,OAAO,EAAE,CAAC;KAChE,CAAC,CAAA;IACF,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAqB,CAAA;IACvF,EAAE,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;IAEtB,OAAO,CAAC,EAAE,UAAU,EAAoB,EAAE,EAAE,CAAC,IAAI,EAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;AAClF,CAAC,AATU,CASV"}
@@ -1,41 +0,0 @@
1
- import type * as otel from '@opentelemetry/api';
2
- import type { LiveStoreEvent } from '../../src/events.ts';
3
- import type { ActionDefinition } from '../../src/schema.ts';
4
- import type { ParamsObject } from '../../src/util.ts';
5
- export type WritableDatabaseLocation = {
6
- type: 'opfs';
7
- virtualFilename: string;
8
- } | {
9
- type: 'indexeddb';
10
- virtualFilename: string;
11
- } | {
12
- type: 'filesystem';
13
- directory: string;
14
- filename: string;
15
- } | {
16
- type: 'volatile-in-memory';
17
- };
18
- export type BackendInit = (otelProps: BackendOtelProps) => Promise<Backend> | Backend;
19
- export interface Backend {
20
- select<T = any>(query: string, bindValues?: ParamsObject, parentSpan?: otel.Span): Promise<SelectResponse<T>>;
21
- execute(query: string, bindValues?: ParamsObject, parentSpan?: otel.Span): void;
22
- /** Apply an event to the backend */
23
- applyEvent(event: LiveStoreEvent, eventDefiniton: ActionDefinition, parentSpan?: otel.Span): void;
24
- /** Return a snapshot of persisted data from the backend */
25
- getPersistedData(parentSpan?: otel.Span): Promise<Uint8Array>;
26
- }
27
- export type BackendType = 'tauri' | 'web' | 'web-in-memory';
28
- export declare const isBackendType: (type: string) => type is BackendType;
29
- export type SelectResponse<T = any> = {
30
- results: T[];
31
- [key: string]: any;
32
- };
33
- export declare enum IndexType {
34
- Basic = "Basic",
35
- FullText = "FullText"
36
- }
37
- export type BackendOtelProps = {
38
- otelTracer: otel.Tracer;
39
- parentSpan: otel.Span;
40
- };
41
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAG9C,MAAM,MAAM,wBAAwB,GAChC;IACE,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe,EAAE,MAAM,CAAA;CACxB,GACD;IACE,IAAI,EAAE,WAAW,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;CACxB,GACD;IACE,IAAI,EAAE,YAAY,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB,GACD;IACE,IAAI,EAAE,oBAAoB,CAAA;CAC3B,CAAA;AAEL,MAAM,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;AAErF,MAAM,WAAW,OAAO;IAGtB,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;IAI7G,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAE/E,oCAAoC;IACpC,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAEjG,2DAA2D;IAC3D,gBAAgB,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;CAC9D;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,KAAK,GAAG,eAAe,CAAA;AAE3D,eAAO,MAAM,aAAa,SAAU,MAAM,wBAEzC,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,GAAG,IAAI;IACpC,OAAO,EAAE,CAAC,EAAE,CAAA;IAGZ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB,CAAA;AAED,oBAAY,SAAS;IACnB,KAAK,UAAU;IACf,QAAQ,aAAa;CACtB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAA;IACvB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAA;CACtB,CAAA"}
@@ -1,16 +0,0 @@
1
- // A backend represents a raw SQLite database.
2
- // Examples include:
3
- // - A native SQLite process running in a Tauri Rust process
4
- // - A SQL.js WASM version of SQLite running in a web worker
5
- //
6
- // We can send commands to execute various kinds of queries,
7
- // and respond to various events from the database.
8
- export const isBackendType = (type) => {
9
- return type === 'tauri' || type === 'web' || type === 'web-in-memory';
10
- };
11
- export var IndexType;
12
- (function (IndexType) {
13
- IndexType["Basic"] = "Basic";
14
- IndexType["FullText"] = "FullText";
15
- })(IndexType || (IndexType = {}));
16
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,oBAAoB;AACpB,4DAA4D;AAC5D,4DAA4D;AAC5D,EAAE;AACF,4DAA4D;AAC5D,mDAAmD;AA+CnD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAuB,EAAE;IACjE,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,eAAe,CAAA;AACvE,CAAC,CAAA;AASD,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,4BAAe,CAAA;IACf,kCAAqB,CAAA;AACvB,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB"}
@@ -1,21 +0,0 @@
1
- import type * as otel from '@opentelemetry/api';
2
- import type { ParamsObject } from '../../util.js';
3
- import { BaseBackend } from '../base.js';
4
- import type { BackendOtelProps, SelectResponse } from '../index.js';
5
- export type BackendOptionsTauri = {
6
- dbDirPath: string;
7
- appDbFileName: string;
8
- };
9
- export declare class TauriBackend extends BaseBackend {
10
- readonly dbFilePath: string;
11
- readonly dbDirPath: string;
12
- readonly otelTracer: otel.Tracer;
13
- readonly parentSpan: otel.Span;
14
- constructor(dbFilePath: string, dbDirPath: string, otelTracer: otel.Tracer, parentSpan: otel.Span);
15
- static load: ({ dbDirPath, appDbFileName }: BackendOptionsTauri) => ({ otelTracer, parentSpan }: BackendOtelProps) => Promise<TauriBackend>;
16
- execute: (query: string, bindValues?: ParamsObject, parentSpan?: otel.Span) => void;
17
- select: <T>(query: string, bindValues?: ParamsObject, parentSpan?: otel.Span) => Promise<SelectResponse<T>>;
18
- getPersistedData: (parentSpan?: otel.Span) => Promise<Uint8Array>;
19
- private getOtelData;
20
- }
21
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/backends/tauri/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAG/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEnE,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,qBAAa,YAAa,SAAQ,WAAW;IAEzC,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM;IAChC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI;gBAHrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,IAAI,CAAC,MAAM,EACvB,UAAU,EAAE,IAAI,CAAC,IAAI;IAKhC,MAAM,CAAC,IAAI,iCACsB,mBAAmB,kCACf,gBAAgB,2BAKlD;IAEH,OAAO,UAAW,MAAM,eAAe,YAAY,eAAe,KAAK,IAAI,KAAG,IAAI,CAQjF;IAED,MAAM,aAAoB,MAAM,eAAe,YAAY,eAAe,KAAK,IAAI,gCAOlF;IAED,gBAAgB,gBAAuB,KAAK,IAAI,KAAG,QAAQ,UAAU,CAAC,CAOrE;IAED,OAAO,CAAC,WAAW,CAA2E;CAC/F"}
@@ -1,48 +0,0 @@
1
- var _a;
2
- import { getTraceParentHeader } from '@livestore/utils';
3
- import { invoke } from '@tauri-apps/api';
4
- import { prepareBindValues } from '../../util.js';
5
- import { BaseBackend } from '../base.js';
6
- export class TauriBackend extends BaseBackend {
7
- constructor(dbFilePath, dbDirPath, otelTracer, parentSpan) {
8
- super();
9
- this.dbFilePath = dbFilePath;
10
- this.dbDirPath = dbDirPath;
11
- this.otelTracer = otelTracer;
12
- this.parentSpan = parentSpan;
13
- this.execute = (query, bindValues, parentSpan) => {
14
- // console.log({ query, bindValues, prepared: prepareBindValues(bindValues ?? {}, query) })
15
- void invoke('execute', {
16
- dbName: this.dbFilePath,
17
- query,
18
- values: prepareBindValues(bindValues ?? {}, query),
19
- otelData: this.getOtelData(parentSpan),
20
- });
21
- };
22
- this.select = async (query, bindValues, parentSpan) => {
23
- return invoke('select', {
24
- db: this.dbFilePath,
25
- query,
26
- values: bindValues ?? {},
27
- otelData: this.getOtelData(parentSpan),
28
- });
29
- };
30
- this.getPersistedData = async (parentSpan) => {
31
- const headers = new Headers();
32
- headers.set('traceparent', getTraceParentHeader(parentSpan ?? this.parentSpan));
33
- return fetch(`http://localhost:38787/get-persisted-data?file_path=${this.dbFilePath}`, { headers }).then((response) => response.arrayBuffer().then((buffer) => new Uint8Array(buffer)));
34
- };
35
- this.getOtelData = (parentSpan) => getOtelData_(parentSpan ?? this.parentSpan);
36
- }
37
- }
38
- _a = TauriBackend;
39
- TauriBackend.load = ({ dbDirPath, appDbFileName }) => async ({ otelTracer, parentSpan }) => {
40
- const dbFilePath = `${dbDirPath}/${appDbFileName}`;
41
- await invoke('initialize_connection', { dbName: dbFilePath, otelData: getOtelData_(parentSpan) });
42
- return new _a(dbFilePath, dbDirPath, otelTracer, parentSpan);
43
- };
44
- const getOtelData_ = (parentSpan) => {
45
- const spanContext = parentSpan?.spanContext();
46
- return spanContext ? { trace_id: spanContext.traceId, span_id: spanContext.spanId } : undefined;
47
- };
48
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backends/tauri/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAGxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAQxC,MAAM,OAAO,YAAa,SAAQ,WAAW;IAC3C,YACW,UAAkB,EAClB,SAAiB,EACjB,UAAuB,EACvB,UAAqB;QAE9B,KAAK,EAAE,CAAA;QALE,eAAU,GAAV,UAAU,CAAQ;QAClB,cAAS,GAAT,SAAS,CAAQ;QACjB,eAAU,GAAV,UAAU,CAAa;QACvB,eAAU,GAAV,UAAU,CAAW;QAchC,YAAO,GAAG,CAAC,KAAa,EAAE,UAAyB,EAAE,UAAsB,EAAQ,EAAE;YACnF,2FAA2F;YAC3F,KAAK,MAAM,CAAC,SAAS,EAAE;gBACrB,MAAM,EAAE,IAAI,CAAC,UAAU;gBACvB,KAAK;gBACL,MAAM,EAAE,iBAAiB,CAAC,UAAU,IAAI,EAAE,EAAE,KAAK,CAAC;gBAClD,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;aACvC,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,WAAM,GAAG,KAAK,EAAK,KAAa,EAAE,UAAyB,EAAE,UAAsB,EAA8B,EAAE;YACjH,OAAO,MAAM,CAAC,QAAQ,EAAE;gBACtB,EAAE,EAAE,IAAI,CAAC,UAAU;gBACnB,KAAK;gBACL,MAAM,EAAE,UAAU,IAAI,EAAE;gBACxB,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;aACvC,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,qBAAgB,GAAG,KAAK,EAAE,UAAsB,EAAuB,EAAE;YACvE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;YAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,oBAAoB,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;YAE/E,OAAO,KAAK,CAAC,uDAAuD,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CACtG,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAC9E,CAAA;QACH,CAAC,CAAA;QAEO,gBAAW,GAAG,CAAC,UAAsB,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAE,CAAA;IAvC9F,CAAC;;;AAEM,iBAAI,GACT,CAAC,EAAE,SAAS,EAAE,aAAa,EAAuB,EAAE,EAAE,CACtD,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAoB,EAAE,EAAE;IACrD,MAAM,UAAU,GAAG,GAAG,SAAS,IAAI,aAAa,EAAE,CAAA;IAClD,MAAM,MAAM,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IAEjG,OAAO,IAAI,EAAY,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;AACxE,CAAC,AAPQ,CAOR;AAiCL,MAAM,YAAY,GAAG,CAAC,UAAiC,EAAE,EAAE;IACzD,MAAM,WAAW,GAAG,UAAU,EAAE,WAAW,EAAE,CAAA;IAC7C,OAAO,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AACjG,CAAC,CAAA"}
@@ -1,10 +0,0 @@
1
- export declare class IDB {
2
- private dbName;
3
- private storeName;
4
- private db;
5
- constructor(dbName: string, storeName?: string);
6
- private open;
7
- get(key: string): Promise<Uint8Array | undefined>;
8
- put(key: string, value: Uint8Array): Promise<void>;
9
- }
10
- //# sourceMappingURL=idb.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"idb.d.ts","sourceRoot":"","sources":["../../../src/backends/utils/idb.ts"],"names":[],"mappings":"AAGA,qBAAa,GAAG;IAIZ,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS;IAJnB,OAAO,CAAC,EAAE,CAA2B;gBAG3B,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,MAAuB;YAG9B,IAAI;IAwBL,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAkBjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBhE"}
@@ -1,58 +0,0 @@
1
- /* eslint-disable unicorn/prefer-add-event-listener */
2
- /* eslint-disable prefer-arrow/prefer-arrow-functions */
3
- export class IDB {
4
- constructor(dbName, storeName = 'binary_store') {
5
- this.dbName = dbName;
6
- this.storeName = storeName;
7
- this.db = null;
8
- }
9
- async open() {
10
- if (this.db)
11
- return this.db;
12
- return new Promise((resolve, reject) => {
13
- const openRequest = indexedDB.open(this.dbName, 1);
14
- openRequest.onupgradeneeded = () => {
15
- const db = openRequest.result;
16
- if (!db.objectStoreNames.contains(this.storeName)) {
17
- db.createObjectStore(this.storeName);
18
- }
19
- };
20
- openRequest.onsuccess = () => {
21
- this.db = openRequest.result;
22
- resolve(this.db);
23
- };
24
- openRequest.onerror = () => {
25
- reject(new Error('Failed to open database.'));
26
- };
27
- });
28
- }
29
- async get(key) {
30
- const db = await this.open();
31
- return new Promise((resolve, reject) => {
32
- const transaction = db.transaction(this.storeName, 'readonly');
33
- const store = transaction.objectStore(this.storeName);
34
- const getRequest = store.get(key);
35
- getRequest.onsuccess = () => {
36
- resolve(getRequest.result);
37
- };
38
- getRequest.onerror = () => {
39
- reject(new Error('Failed to get data.'));
40
- };
41
- });
42
- }
43
- async put(key, value) {
44
- const db = await this.open();
45
- return new Promise((resolve, reject) => {
46
- const transaction = db.transaction(this.storeName, 'readwrite');
47
- const store = transaction.objectStore(this.storeName);
48
- const putRequest = store.put(value, key);
49
- putRequest.onsuccess = () => {
50
- resolve();
51
- };
52
- putRequest.onerror = () => {
53
- reject(new Error('Failed to write data.'));
54
- };
55
- });
56
- }
57
- }
58
- //# sourceMappingURL=idb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"idb.js","sourceRoot":"","sources":["../../../src/backends/utils/idb.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import type * as otel from '@opentelemetry/api';
2
- import * as Comlink from 'comlink';
3
- import type { ParamsObject } from '../../../src/util.ts';
4
- import { BaseBackend } from '../base.ts';
5
- import type { BackendOtelProps, SelectResponse, WritableDatabaseLocation } from '../index.ts';
6
- import type { WrappedWorker } from './worker.ts';
7
- export type BackendOptionsWeb = {
8
- /** Specifies where to persist data for this backend */
9
- persistentDatabaseLocation: WritableDatabaseLocation;
10
- };
11
- export declare class WebWorkerBackend extends BaseBackend {
12
- worker: Comlink.Remote<WrappedWorker>;
13
- persistentDatabaseLocation: WritableDatabaseLocation;
14
- otelTracer: otel.Tracer;
15
- executionBacklog: {
16
- query: string;
17
- bindValues?: ParamsObject;
18
- }[];
19
- executionPromise: Promise<void> | undefined;
20
- private constructor();
21
- static load: ({ persistentDatabaseLocation }: BackendOptionsWeb) => Promise<({ otelTracer }: BackendOtelProps) => WebWorkerBackend>;
22
- execute: (query: string, bindValues_?: ParamsObject) => void;
23
- select: <T>(query: string, bindValues?: ParamsObject) => Promise<SelectResponse<T>>;
24
- getPersistedData: (_parentSpan?: otel.Span) => Promise<Uint8Array>;
25
- }
26
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/backends/web-worker/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAElC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,uDAAuD;IACvD,0BAA0B,EAAE,wBAAwB,CAAA;CACrD,CAAA;AAED,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACrC,0BAA0B,EAAE,wBAAwB,CAAA;IACpD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAA;IAEvB,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,YAAY,CAAA;KAAE,EAAE,CAAK;IACrE,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAY;IAEvD,OAAO;IAeP,MAAM,CAAC,IAAI,mCAA0C,iBAAiB,8BAW5C,gBAAgB,uBAMzC;IAED,OAAO,UAAW,MAAM,gBAAgB,YAAY,UAgBnD;IAED,MAAM,aAAoB,MAAM,eAAe,YAAY,gCAW1D;IAED,gBAAgB,iBAAwB,KAAK,IAAI,KAAG,QAAQ,UAAU,CAAC,CAKtE;CACF"}
@@ -1,63 +0,0 @@
1
- var _a;
2
- import * as Comlink from 'comlink';
3
- import { prepareBindValues } from '../../util.js';
4
- import { BaseBackend } from '../base.js';
5
- export class WebWorkerBackend extends BaseBackend {
6
- constructor({ worker, persistentDatabaseLocation, otelTracer, }) {
7
- super();
8
- this.executionBacklog = [];
9
- this.executionPromise = undefined;
10
- this.execute = (query, bindValues_) => {
11
- const bindValues = prepareBindValues(bindValues_ ?? {}, query);
12
- this.executionBacklog.push({ query, bindValues });
13
- // 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)
14
- if (this.executionPromise === undefined) {
15
- this.executionPromise = new Promise((resolve) => {
16
- setTimeout(() => {
17
- void this.worker.executeBulk(this.executionBacklog);
18
- this.executionBacklog = [];
19
- this.executionPromise = undefined;
20
- resolve();
21
- }, 10);
22
- });
23
- }
24
- };
25
- this.select = async (query, bindValues) => {
26
- // NOTE we need to wait for the executionBacklog to be worked off, before we run the select query (as it might depend on the previous execution queries)
27
- await this.executionPromise;
28
- try {
29
- const response = (await this.worker.select(query, bindValues));
30
- return response;
31
- }
32
- catch (e) {
33
- console.error(`Error while executing query via "select": ${query}`);
34
- throw e;
35
- }
36
- };
37
- this.getPersistedData = async (_parentSpan) => {
38
- // NOTE we need to wait for the executionBacklog to be worked off
39
- await this.executionPromise;
40
- return this.worker.getPersistedData();
41
- };
42
- this.worker = worker;
43
- this.persistentDatabaseLocation = persistentDatabaseLocation;
44
- this.otelTracer = otelTracer;
45
- }
46
- }
47
- _a = WebWorkerBackend;
48
- WebWorkerBackend.load = async ({ persistentDatabaseLocation }) => {
49
- // TODO: Importing the worker like this only works with Vite;
50
- // should this really be inside the LiveStore library?
51
- // Doesn't work with Firefox right now during dev https://bugzilla.mozilla.org/show_bug.cgi?id=1247687
52
- const worker = new Worker(new URL('./worker.js', import.meta.url), {
53
- type: 'module',
54
- });
55
- const wrappedWorker = Comlink.wrap(worker);
56
- await wrappedWorker.initialize({ persistentDatabaseLocation });
57
- return ({ otelTracer }) => new _a({
58
- worker: wrappedWorker,
59
- persistentDatabaseLocation,
60
- otelTracer,
61
- });
62
- };
63
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backends/web-worker/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAGlC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AASxC,MAAM,OAAO,gBAAiB,SAAQ,WAAW;IAQ/C,YAAoB,EAClB,MAAM,EACN,0BAA0B,EAC1B,UAAU,GAKX;QACC,KAAK,EAAE,CAAA;QAZT,qBAAgB,GAAmD,EAAE,CAAA;QACrE,qBAAgB,GAA8B,SAAS,CAAA;QAoCvD,YAAO,GAAG,CAAC,KAAa,EAAE,WAA0B,EAAE,EAAE;YACtD,MAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;YAC9D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;YAEjD,sJAAsJ;YACtJ,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE;gBACvC,IAAI,CAAC,gBAAgB,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBAC9C,UAAU,CAAC,GAAG,EAAE;wBACd,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;wBACnD,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;wBAC1B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAA;wBAEjC,OAAO,EAAE,CAAA;oBACX,CAAC,EAAE,EAAE,CAAC,CAAA;gBACR,CAAC,CAAC,CAAA;aACH;QACH,CAAC,CAAA;QAED,WAAM,GAAG,KAAK,EAAK,KAAa,EAAE,UAAyB,EAA8B,EAAE;YACzF,wJAAwJ;YACxJ,MAAM,IAAI,CAAC,gBAAgB,CAAA;YAE3B,IAAI;gBACF,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAsB,CAAA;gBACnF,OAAO,QAAQ,CAAA;aAChB;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC,6CAA6C,KAAK,EAAE,CAAC,CAAA;gBACnE,MAAM,CAAC,CAAA;aACR;QACH,CAAC,CAAA;QAED,qBAAgB,GAAG,KAAK,EAAE,WAAuB,EAAuB,EAAE;YACxE,iEAAiE;YACjE,MAAM,IAAI,CAAC,gBAAgB,CAAA;YAE3B,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAA;QACvC,CAAC,CAAA;QA5DC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,0BAA0B,GAAG,0BAA0B,CAAA;QAC5D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;;;AAEM,qBAAI,GAAG,KAAK,EAAE,EAAE,0BAA0B,EAAqB,EAAE,EAAE;IACxE,6DAA6D;IAC7D,sDAAsD;IACtD,sGAAsG;IACtG,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACjE,IAAI,EAAE,QAAQ;KACf,CAAC,CAAA;IACF,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAgB,MAAM,CAAC,CAAA;IAEzD,MAAM,aAAa,CAAC,UAAU,CAAC,EAAE,0BAA0B,EAAE,CAAC,CAAA;IAE9D,OAAO,CAAC,EAAE,UAAU,EAAoB,EAAE,EAAE,CAC1C,IAAI,EAAgB,CAAC;QACnB,MAAM,EAAE,aAAa;QACrB,0BAA0B;QAC1B,UAAU;KACX,CAAC,CAAA;AACN,CAAC,AAjBU,CAiBV"}
@@ -1,17 +0,0 @@
1
- import type { Bindable } from '../../../src/util.ts';
2
- import type { SelectResponse, WritableDatabaseLocation } from '../index.ts';
3
- type ExecutionQueueItem = {
4
- query: string;
5
- bindValues?: Bindable;
6
- };
7
- declare const wrappedWorker: {
8
- initialize: ({ persistentDatabaseLocation }: {
9
- persistentDatabaseLocation: WritableDatabaseLocation;
10
- }) => Promise<void>;
11
- executeBulk: (executionItems: ExecutionQueueItem[]) => void;
12
- select: <T = any>(query: string, bindValues?: Bindable) => SelectResponse<T>;
13
- getPersistedData: () => Promise<Uint8Array>;
14
- };
15
- export type WrappedWorker = typeof wrappedWorker;
16
- export {};
17
- //# sourceMappingURL=worker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/backends/web-worker/worker.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AA6E3E,KAAK,kBAAkB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAA;AA2ElE,QAAA,MAAM,aAAa;;oCA/HqE,wBAAwB;;kCAsD3E,kBAAkB,EAAE,KAAG,IAAI;6BA4ChC,MAAM,eAAe,QAAQ;4BAa1B,QAAQ,UAAU,CAAC;CAgBqB,CAAA;AAE3E,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAA"}