@livestore/livestore 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/LiveRiffleStore.d.ts +42 -0
- package/dist/LiveRiffleStore.d.ts.map +1 -0
- package/dist/LiveRiffleStore.js +36 -0
- package/dist/LiveRiffleStore.js.map +1 -0
- package/dist/QueryCache.d.ts +20 -0
- package/dist/QueryCache.d.ts.map +1 -0
- package/dist/QueryCache.js +71 -0
- package/dist/QueryCache.js.map +1 -0
- package/dist/__tests__/react/fixture.d.ts +141 -0
- package/dist/__tests__/react/fixture.d.ts.map +1 -0
- package/dist/__tests__/react/fixture.js +72 -0
- package/dist/__tests__/react/fixture.js.map +1 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.d.ts +2 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.d.ts.map +1 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.js +78 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.js.map +1 -0
- package/dist/__tests__/react/useRiffleComponent.test.d.ts +2 -0
- package/dist/__tests__/react/useRiffleComponent.test.d.ts.map +1 -0
- package/dist/__tests__/react/useRiffleComponent.test.js +78 -0
- package/dist/__tests__/react/useRiffleComponent.test.js.map +1 -0
- package/dist/__tests__/reactive.test.d.ts +2 -0
- package/dist/__tests__/reactive.test.d.ts.map +1 -0
- package/dist/__tests__/reactive.test.js +167 -0
- package/dist/__tests__/reactive.test.js.map +1 -0
- package/dist/backends/base.d.ts +13 -0
- package/dist/backends/base.d.ts.map +1 -0
- package/dist/backends/base.js +53 -0
- package/dist/backends/base.js.map +1 -0
- package/dist/backends/index.d.ts +41 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +38 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/noop.d.ts +18 -0
- package/dist/backends/noop.d.ts.map +1 -0
- package/dist/backends/noop.js +21 -0
- package/dist/backends/noop.js.map +1 -0
- package/dist/backends/tauri.d.ts +24 -0
- package/dist/backends/tauri.d.ts.map +1 -0
- package/dist/backends/tauri.js +48 -0
- package/dist/backends/tauri.js.map +1 -0
- package/dist/backends/utils/idb.d.ts +10 -0
- package/dist/backends/utils/idb.d.ts.map +1 -0
- package/dist/backends/utils/idb.js +58 -0
- package/dist/backends/utils/idb.js.map +1 -0
- package/dist/backends/web-in-memory.d.ts +24 -0
- package/dist/backends/web-in-memory.d.ts.map +1 -0
- package/dist/backends/web-in-memory.js +46 -0
- package/dist/backends/web-in-memory.js.map +1 -0
- package/dist/backends/web-worker.d.ts +17 -0
- package/dist/backends/web-worker.d.ts.map +1 -0
- package/dist/backends/web-worker.js +139 -0
- package/dist/backends/web-worker.js.map +1 -0
- package/dist/backends/web.d.ts +28 -0
- package/dist/backends/web.d.ts.map +1 -0
- package/dist/backends/web.js +64 -0
- package/dist/backends/web.js.map +1 -0
- package/dist/bounded-collections.d.ts +34 -0
- package/dist/bounded-collections.d.ts.map +1 -0
- package/dist/bounded-collections.js +103 -0
- package/dist/bounded-collections.js.map +1 -0
- package/dist/componentKey.d.ts +20 -0
- package/dist/componentKey.d.ts.map +1 -0
- package/dist/componentKey.js +3 -0
- package/dist/componentKey.js.map +1 -0
- package/dist/effect/LiveStore.d.ts +42 -0
- package/dist/effect/LiveStore.d.ts.map +1 -0
- package/dist/effect/LiveStore.js +36 -0
- package/dist/effect/LiveStore.js.map +1 -0
- package/dist/effect/index.d.ts +2 -0
- package/dist/effect/index.d.ts.map +1 -0
- package/dist/effect/index.js +2 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/events.d.ts +7 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +2 -0
- package/dist/events.js.map +1 -0
- package/dist/inMemoryDatabase.d.ts +65 -0
- package/dist/inMemoryDatabase.d.ts.map +1 -0
- package/dist/inMemoryDatabase.js +241 -0
- package/dist/inMemoryDatabase.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/otel.d.ts +5 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +17 -0
- package/dist/otel.js.map +1 -0
- package/dist/react/LiveStoreContext.d.ts +11 -0
- package/dist/react/LiveStoreContext.d.ts.map +1 -0
- package/dist/react/LiveStoreContext.js +10 -0
- package/dist/react/LiveStoreContext.js.map +1 -0
- package/dist/react/LiveStoreProvider.d.ts +21 -0
- package/dist/react/LiveStoreProvider.d.ts.map +1 -0
- package/dist/react/LiveStoreProvider.js +48 -0
- package/dist/react/LiveStoreProvider.js.map +1 -0
- package/dist/react/RiffleProvider.d.ts +21 -0
- package/dist/react/RiffleProvider.d.ts.map +1 -0
- package/dist/react/RiffleProvider.js +48 -0
- package/dist/react/RiffleProvider.js.map +1 -0
- package/dist/react/StoreContext.d.ts +11 -0
- package/dist/react/StoreContext.d.ts.map +1 -0
- package/dist/react/StoreContext.js +10 -0
- package/dist/react/StoreContext.js.map +1 -0
- package/dist/react/index.d.ts +7 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +6 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/useGlobalQuery.d.ts +3 -0
- package/dist/react/useGlobalQuery.d.ts.map +1 -0
- package/dist/react/useGlobalQuery.js +25 -0
- package/dist/react/useGlobalQuery.js.map +1 -0
- package/dist/react/useGraphQL.d.ts +11 -0
- package/dist/react/useGraphQL.d.ts.map +1 -0
- package/dist/react/useGraphQL.js +68 -0
- package/dist/react/useGraphQL.js.map +1 -0
- package/dist/react/useLiveStoreComponent.d.ts +70 -0
- package/dist/react/useLiveStoreComponent.d.ts.map +1 -0
- package/dist/react/useLiveStoreComponent.js +261 -0
- package/dist/react/useLiveStoreComponent.js.map +1 -0
- package/dist/react/useRiffleComponent.d.ts +70 -0
- package/dist/react/useRiffleComponent.d.ts.map +1 -0
- package/dist/react/useRiffleComponent.js +261 -0
- package/dist/react/useRiffleComponent.js.map +1 -0
- package/dist/react/useRiffleJsonHook.d.ts +4 -0
- package/dist/react/useRiffleJsonHook.d.ts.map +1 -0
- package/dist/react/useRiffleJsonHook.js +21 -0
- package/dist/react/useRiffleJsonHook.js.map +1 -0
- package/dist/react/utils/useStateRefWithReactiveInput.d.ts +13 -0
- package/dist/react/utils/useStateRefWithReactiveInput.d.ts.map +1 -0
- package/dist/react/utils/useStateRefWithReactiveInput.js +38 -0
- package/dist/react/utils/useStateRefWithReactiveInput.js.map +1 -0
- package/dist/reactive.d.ts +140 -0
- package/dist/reactive.d.ts.map +1 -0
- package/dist/reactive.js +301 -0
- package/dist/reactive.js.map +1 -0
- package/dist/reactiveQueries/base-class.d.ts +24 -0
- package/dist/reactiveQueries/base-class.d.ts.map +1 -0
- package/dist/reactiveQueries/base-class.js +22 -0
- package/dist/reactiveQueries/base-class.js.map +1 -0
- package/dist/reactiveQueries/graphql.d.ts +25 -0
- package/dist/reactiveQueries/graphql.d.ts.map +1 -0
- package/dist/reactiveQueries/graphql.js +14 -0
- package/dist/reactiveQueries/graphql.js.map +1 -0
- package/dist/reactiveQueries/js.d.ts +19 -0
- package/dist/reactiveQueries/js.d.ts.map +1 -0
- package/dist/reactiveQueries/js.js +13 -0
- package/dist/reactiveQueries/js.js.map +1 -0
- package/dist/reactiveQueries/sql.d.ts +31 -0
- package/dist/reactiveQueries/sql.d.ts.map +1 -0
- package/dist/reactiveQueries/sql.js +28 -0
- package/dist/reactiveQueries/sql.js.map +1 -0
- package/dist/schema.d.ts +163 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +92 -0
- package/dist/schema.js.map +1 -0
- package/dist/store.d.ts +175 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +546 -0
- package/dist/store.js.map +1 -0
- package/dist/util.d.ts +24 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +51 -0
- package/dist/util.js.map +1 -0
- package/package.json +52 -0
- package/src/QueryCache.ts +81 -0
- package/src/__tests__/react/fixture.tsx +106 -0
- package/src/__tests__/react/useLiveStoreComponent.test.tsx +111 -0
- package/src/__tests__/reactive.test.ts +227 -0
- package/src/ambient.d.ts +7 -0
- package/src/backends/base.ts +67 -0
- package/src/backends/index.ts +94 -0
- package/src/backends/noop.ts +32 -0
- package/src/backends/tauri.ts +74 -0
- package/src/backends/utils/idb.ts +71 -0
- package/src/backends/web-in-memory.ts +65 -0
- package/src/backends/web-worker.ts +176 -0
- package/src/backends/web.ts +96 -0
- package/src/bounded-collections.ts +112 -0
- package/src/componentKey.ts +9 -0
- package/src/effect/LiveStore.ts +123 -0
- package/src/effect/index.ts +7 -0
- package/src/events.ts +8 -0
- package/src/inMemoryDatabase.ts +347 -0
- package/src/index.ts +47 -0
- package/src/otel.ts +20 -0
- package/src/react/LiveStoreContext.ts +23 -0
- package/src/react/LiveStoreProvider.tsx +93 -0
- package/src/react/index.ts +11 -0
- package/src/react/useGlobalQuery.ts +40 -0
- package/src/react/useGraphQL.ts +113 -0
- package/src/react/useLiveStoreComponent.ts +493 -0
- package/src/react/utils/useStateRefWithReactiveInput.ts +51 -0
- package/src/reactive.ts +538 -0
- package/src/reactiveQueries/base-class.ts +49 -0
- package/src/reactiveQueries/graphql.ts +52 -0
- package/src/reactiveQueries/js.ts +38 -0
- package/src/reactiveQueries/sql.ts +65 -0
- package/src/schema.ts +219 -0
- package/src/store.ts +889 -0
- package/src/util.ts +59 -0
- package/tsconfig.json +15 -0
- package/vitest.config.js +13 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { makeNoopTracer } from '@livestore/utils';
|
|
3
|
+
import sqlite3InitModule from 'sqlite-esm';
|
|
4
|
+
import { prepareBindValues } from '../util.js';
|
|
5
|
+
import { BaseBackend } from './base.js';
|
|
6
|
+
// NOTE: This backend is currently only used for testing
|
|
7
|
+
export class WebInMemoryBackend extends BaseBackend {
|
|
8
|
+
constructor(otelTracer, db) {
|
|
9
|
+
super();
|
|
10
|
+
this.otelTracer = otelTracer;
|
|
11
|
+
this.db = db;
|
|
12
|
+
this.execute = (query, bindValues) => {
|
|
13
|
+
this.db.exec({
|
|
14
|
+
sql: query,
|
|
15
|
+
bind: prepareBindValues(bindValues ?? {}, query),
|
|
16
|
+
returnValue: 'resultRows',
|
|
17
|
+
rowMode: 'object',
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
this.select = async (query, bindValues) => {
|
|
21
|
+
const resultRows = [];
|
|
22
|
+
this.db.exec({
|
|
23
|
+
sql: query,
|
|
24
|
+
bind: prepareBindValues(bindValues ?? {}, query),
|
|
25
|
+
rowMode: 'object',
|
|
26
|
+
resultRows,
|
|
27
|
+
// callback: (row: any) => console.log('select result', db.filename, query, row),
|
|
28
|
+
});
|
|
29
|
+
return { results: resultRows };
|
|
30
|
+
};
|
|
31
|
+
this.getPersistedData = async () => {
|
|
32
|
+
return this.db.capi.sqlite3_js_db_export(this.db.pointer);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
_a = WebInMemoryBackend;
|
|
37
|
+
WebInMemoryBackend.load = async (options) => {
|
|
38
|
+
const sqlite3 = await sqlite3InitModule({
|
|
39
|
+
print: (message) => console.log(`[sql-client] ${message}`),
|
|
40
|
+
printErr: (message) => console.error(`[sql-client] ${message}`),
|
|
41
|
+
});
|
|
42
|
+
const db = new sqlite3.oo1.DB({ filename: ':memory:', flags: 'c' });
|
|
43
|
+
db.capi = sqlite3.capi;
|
|
44
|
+
return new _a(options.otelTracer ?? makeNoopTracer(), db);
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=web-in-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-in-memory.js","sourceRoot":"","sources":["../../src/backends/web-in-memory.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAGjD,OAAO,iBAAiB,MAAM,YAAY,CAAA;AAG1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAWvC,wDAAwD;AACxD,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACjD,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,uBAAI,GAAG,KAAK,EAAE,OAAkC,EAA+B,EAAE;IACtF,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,IAAI,EAAkB,CAAC,OAAO,CAAC,UAAU,IAAI,cAAc,EAAE,EAAE,EAAE,CAAC,CAAA;AAC3E,CAAC,AATU,CASV"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Bindable } from '../util.js';
|
|
2
|
+
import type { SelectResponse, WritableDatabaseLocation } from './index.js';
|
|
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=web-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-worker.d.ts","sourceRoot":"","sources":["../../src/backends/web-worker.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AA6E1E,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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// Web Worker file for running SQLite in a web worker.
|
|
2
|
+
// TODO: create types for these libraries? SQL.js already should have types;
|
|
3
|
+
// we just need the types to apply to the fork.
|
|
4
|
+
import { shouldNeverHappen } from '@livestore/utils';
|
|
5
|
+
import * as Comlink from 'comlink';
|
|
6
|
+
import sqlite3InitModule from 'sqlite-esm';
|
|
7
|
+
import { casesHandled, sql } from '../util.js';
|
|
8
|
+
import { IDB } from './utils/idb.js';
|
|
9
|
+
// A global variable to hold the database connection.
|
|
10
|
+
// let db: SqliteWasm.Database
|
|
11
|
+
let db;
|
|
12
|
+
let sqlite3;
|
|
13
|
+
// TODO get rid of this in favour of a "proper" IDB SQLite backend
|
|
14
|
+
let idb;
|
|
15
|
+
/** The location where this database backend persists its data */
|
|
16
|
+
let persistentDatabaseLocation_;
|
|
17
|
+
const configureConnection = () => db.exec(sql `
|
|
18
|
+
PRAGMA page_size=8192;
|
|
19
|
+
PRAGMA journal_mode=MEMORY;
|
|
20
|
+
PRAGMA foreign_keys='ON'; -- we want foreign key constraints to be enforced
|
|
21
|
+
`);
|
|
22
|
+
/** A full virtual filename in the IDB FS */
|
|
23
|
+
const fullyQualifiedFilename = (name) => `${name}.db`;
|
|
24
|
+
const initialize = async ({ persistentDatabaseLocation }) => {
|
|
25
|
+
persistentDatabaseLocation_ = persistentDatabaseLocation;
|
|
26
|
+
sqlite3 = await sqlite3InitModule({
|
|
27
|
+
print: (message) => console.log(`[sql-client] ${message}`),
|
|
28
|
+
printErr: (message) => console.error(`[sql-client] ${message}`),
|
|
29
|
+
});
|
|
30
|
+
switch (persistentDatabaseLocation.type) {
|
|
31
|
+
case 'opfs': {
|
|
32
|
+
try {
|
|
33
|
+
db = new sqlite3.oo1.OpfsDb(fullyQualifiedFilename(persistentDatabaseLocation.virtualFilename)); // , 'c'
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
debugger;
|
|
37
|
+
}
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
case 'indexeddb': {
|
|
41
|
+
try {
|
|
42
|
+
db = new sqlite3.oo1.DB({ filename: ':memory:', flags: 'c' });
|
|
43
|
+
idb = new IDB(persistentDatabaseLocation.virtualFilename);
|
|
44
|
+
const bytes = await idb.get('db');
|
|
45
|
+
if (bytes !== undefined) {
|
|
46
|
+
// Based on https://sqlite.org/forum/forumpost/2119230da8ac5357a13b731f462dc76e08621a4a29724f7906d5f35bb8508465
|
|
47
|
+
// TODO find cleaner way to do this once possible in sqlite3-wasm
|
|
48
|
+
const p = sqlite3.wasm.allocFromTypedArray(bytes);
|
|
49
|
+
const _rc = sqlite3.capi.sqlite3_deserialize(db.pointer, 'main', p, bytes.length, bytes.length, 0);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
debugger;
|
|
54
|
+
}
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
case 'filesystem': {
|
|
58
|
+
throw new Error('Persisting to native FS is not supported in the web worker backend');
|
|
59
|
+
}
|
|
60
|
+
case 'volatile-in-memory': {
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
default: {
|
|
64
|
+
casesHandled(persistentDatabaseLocation);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
configureConnection();
|
|
68
|
+
};
|
|
69
|
+
// TODO get rid of this in favour of a "proper" IDB SQLite backend
|
|
70
|
+
let idbPersistTimeout;
|
|
71
|
+
const executeBulk = (executionItems) => {
|
|
72
|
+
let batchItems = [];
|
|
73
|
+
while (executionItems.length > 0) {
|
|
74
|
+
try {
|
|
75
|
+
db.exec('BEGIN TRANSACTION'); // Start the transaction
|
|
76
|
+
batchItems = executionItems.splice(0, 50);
|
|
77
|
+
for (const { query, bindValues } of batchItems) {
|
|
78
|
+
db.exec({
|
|
79
|
+
sql: query,
|
|
80
|
+
bind: bindValues,
|
|
81
|
+
returnValue: 'resultRows',
|
|
82
|
+
rowMode: 'object',
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
db.exec('COMMIT'); // Commit the transaction
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
try {
|
|
89
|
+
db.exec('ROLLBACK'); // Rollback in case of an error
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
console.error('Error rolling back transaction', e);
|
|
93
|
+
}
|
|
94
|
+
shouldNeverHappen(`Error executing query: ${error} \n ${JSON.stringify(batchItems)}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// TODO get rid of this in favour of a "proper" IDB SQLite backend
|
|
98
|
+
if (persistentDatabaseLocation_.type === 'indexeddb') {
|
|
99
|
+
if (idbPersistTimeout !== undefined) {
|
|
100
|
+
clearTimeout(idbPersistTimeout);
|
|
101
|
+
}
|
|
102
|
+
idbPersistTimeout = setTimeout(() => {
|
|
103
|
+
const data = sqlite3.capi.sqlite3_js_db_export(db.pointer);
|
|
104
|
+
void idb.put('db', data);
|
|
105
|
+
}, 1000);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const select = (query, bindValues) => {
|
|
109
|
+
const resultRows = [];
|
|
110
|
+
db.exec({
|
|
111
|
+
sql: query,
|
|
112
|
+
bind: bindValues,
|
|
113
|
+
rowMode: 'object',
|
|
114
|
+
resultRows,
|
|
115
|
+
});
|
|
116
|
+
return { results: resultRows };
|
|
117
|
+
};
|
|
118
|
+
const getPersistedData = async () => {
|
|
119
|
+
// TODO get rid of this in favour of a "proper" IDB SQLite backend
|
|
120
|
+
if (persistentDatabaseLocation_.type === 'indexeddb') {
|
|
121
|
+
const data = sqlite3.capi.sqlite3_js_db_export(db.pointer);
|
|
122
|
+
return Comlink.transfer(data, [data.buffer]);
|
|
123
|
+
}
|
|
124
|
+
const rootHandle = await navigator.storage.getDirectory();
|
|
125
|
+
const fileHandle = await rootHandle.getFileHandle(db.filename);
|
|
126
|
+
const file = await fileHandle.getFile();
|
|
127
|
+
const buffer = await file.arrayBuffer();
|
|
128
|
+
const data = new Uint8Array(buffer);
|
|
129
|
+
return Comlink.transfer(data, [data.buffer]);
|
|
130
|
+
};
|
|
131
|
+
const wrappedWorker = { initialize, executeBulk, select, getPersistedData };
|
|
132
|
+
Comlink.expose(wrappedWorker);
|
|
133
|
+
// NOTE keep this around for debugging
|
|
134
|
+
// db.exec({
|
|
135
|
+
// sql: `select * from sqlite_master where name = 'library_tracks'`,
|
|
136
|
+
// callback: (_: TODO) => console.log(_),
|
|
137
|
+
// rowMode: 'object',
|
|
138
|
+
// } as TODO)
|
|
139
|
+
//# sourceMappingURL=web-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-worker.js","sourceRoot":"","sources":["../../src/backends/web-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type * as otel from '@opentelemetry/api';
|
|
2
|
+
import * as Comlink from 'comlink';
|
|
3
|
+
import type { ParamsObject } from '../util.js';
|
|
4
|
+
import { BaseBackend } from './base.js';
|
|
5
|
+
import type { SelectResponse, WritableDatabaseLocation } from './index.js';
|
|
6
|
+
import type { WrappedWorker } from './web-worker.js';
|
|
7
|
+
export type BackendOptionsWeb = {
|
|
8
|
+
type: 'web';
|
|
9
|
+
/** Specifies where to persist data for this backend */
|
|
10
|
+
persistentDatabaseLocation: WritableDatabaseLocation;
|
|
11
|
+
otelTracer?: otel.Tracer;
|
|
12
|
+
};
|
|
13
|
+
export declare class WebWorkerBackend extends BaseBackend {
|
|
14
|
+
worker: Comlink.Remote<WrappedWorker>;
|
|
15
|
+
persistentDatabaseLocation: WritableDatabaseLocation;
|
|
16
|
+
otelTracer: otel.Tracer;
|
|
17
|
+
executionBacklog: {
|
|
18
|
+
query: string;
|
|
19
|
+
bindValues?: ParamsObject;
|
|
20
|
+
}[];
|
|
21
|
+
executionPromise: Promise<void> | undefined;
|
|
22
|
+
private constructor();
|
|
23
|
+
static load: ({ persistentDatabaseLocation, otelTracer }: BackendOptionsWeb) => Promise<WebWorkerBackend>;
|
|
24
|
+
execute: (query: string, bindValues_?: ParamsObject) => void;
|
|
25
|
+
select: <T>(query: string, bindValues?: ParamsObject) => Promise<SelectResponse<T>>;
|
|
26
|
+
getPersistedData: (_parentSpan?: otel.Span) => Promise<Uint8Array>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=web.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/backends/web.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAElC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,KAAK,CAAA;IACX,uDAAuD;IACvD,0BAA0B,EAAE,wBAAwB,CAAA;IACpD,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;CACzB,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,+CAAsD,iBAAiB,KAAG,QAAQ,gBAAgB,CAAC,CAgB7G;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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { makeNoopTracer } from '@livestore/utils';
|
|
3
|
+
import * as Comlink from 'comlink';
|
|
4
|
+
import { prepareBindValues } from '../util.js';
|
|
5
|
+
import { BaseBackend } from './base.js';
|
|
6
|
+
export class WebWorkerBackend extends BaseBackend {
|
|
7
|
+
constructor({ worker, persistentDatabaseLocation, otelTracer, }) {
|
|
8
|
+
super();
|
|
9
|
+
this.executionBacklog = [];
|
|
10
|
+
this.executionPromise = undefined;
|
|
11
|
+
this.execute = (query, bindValues_) => {
|
|
12
|
+
const bindValues = prepareBindValues(bindValues_ ?? {}, query);
|
|
13
|
+
this.executionBacklog.push({ query, bindValues });
|
|
14
|
+
// 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)
|
|
15
|
+
if (this.executionPromise === undefined) {
|
|
16
|
+
this.executionPromise = new Promise((resolve) => {
|
|
17
|
+
setTimeout(() => {
|
|
18
|
+
void this.worker.executeBulk(this.executionBacklog);
|
|
19
|
+
this.executionBacklog = [];
|
|
20
|
+
this.executionPromise = undefined;
|
|
21
|
+
resolve();
|
|
22
|
+
}, 10);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
this.select = async (query, bindValues) => {
|
|
27
|
+
// 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)
|
|
28
|
+
await this.executionPromise;
|
|
29
|
+
try {
|
|
30
|
+
const response = (await this.worker.select(query, bindValues));
|
|
31
|
+
return response;
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
console.error(`Error while executing query via "select": ${query}`);
|
|
35
|
+
throw e;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
this.getPersistedData = async (_parentSpan) => {
|
|
39
|
+
// NOTE we need to wait for the executionBacklog to be worked off
|
|
40
|
+
await this.executionPromise;
|
|
41
|
+
return this.worker.getPersistedData();
|
|
42
|
+
};
|
|
43
|
+
this.worker = worker;
|
|
44
|
+
this.persistentDatabaseLocation = persistentDatabaseLocation;
|
|
45
|
+
this.otelTracer = otelTracer;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
_a = WebWorkerBackend;
|
|
49
|
+
WebWorkerBackend.load = async ({ persistentDatabaseLocation, otelTracer }) => {
|
|
50
|
+
// TODO: Importing the worker like this only works with Vite;
|
|
51
|
+
// should this really be inside the LiveStore library?
|
|
52
|
+
// Doesn't work with Firefox right now during dev https://bugzilla.mozilla.org/show_bug.cgi?id=1247687
|
|
53
|
+
const worker = new Worker(new URL('./web-worker.js', import.meta.url), {
|
|
54
|
+
type: 'module',
|
|
55
|
+
});
|
|
56
|
+
const wrappedWorker = Comlink.wrap(worker);
|
|
57
|
+
await wrappedWorker.initialize({ persistentDatabaseLocation });
|
|
58
|
+
return new _a({
|
|
59
|
+
worker: wrappedWorker,
|
|
60
|
+
persistentDatabaseLocation,
|
|
61
|
+
otelTracer: otelTracer ?? makeNoopTracer(),
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/backends/web.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAGlC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAWvC,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;QAmCvD,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;QA3DC,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,EAAE,UAAU,EAAqB,EAA6B,EAAE;IAC/G,6DAA6D;IAC7D,sDAAsD;IACtD,sGAAsG;IACtG,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACrE,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,IAAI,EAAgB,CAAC;QAC1B,MAAM,EAAE,aAAa;QACrB,0BAA0B;QAC1B,UAAU,EAAE,UAAU,IAAI,cAAc,EAAE;KAC3C,CAAC,CAAA;AACJ,CAAC,AAhBU,CAgBV"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a map that has a fixed number of entries.
|
|
3
|
+
* Once hitting the bound, earliest insertions are removed
|
|
4
|
+
*/
|
|
5
|
+
export default class BoundMap<K, V> {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(sizeLimit: number);
|
|
8
|
+
onEvict: ((key: K) => void) | undefined;
|
|
9
|
+
set: (key: K, value: V) => void;
|
|
10
|
+
get: (key: K) => V | undefined;
|
|
11
|
+
delete: (key: K) => void;
|
|
12
|
+
keys: () => IterableIterator<K>;
|
|
13
|
+
}
|
|
14
|
+
export declare class BoundSet<V> {
|
|
15
|
+
#private;
|
|
16
|
+
constructor(sizeLimit: number);
|
|
17
|
+
onEvict: ((key: V) => void) | undefined;
|
|
18
|
+
add: (v: V) => void;
|
|
19
|
+
[Symbol.iterator]: () => IterableIterator<V>;
|
|
20
|
+
}
|
|
21
|
+
export declare class BoundArray<V> {
|
|
22
|
+
#private;
|
|
23
|
+
constructor(sizeLimit: number);
|
|
24
|
+
onEvict: ((key: V) => void) | undefined;
|
|
25
|
+
push: (v: V) => void;
|
|
26
|
+
get: (index: number) => V | undefined;
|
|
27
|
+
delete: (index: number) => void;
|
|
28
|
+
get length(): number;
|
|
29
|
+
[Symbol.iterator]: () => IterableIterator<V>;
|
|
30
|
+
map: <T>(fn: (v: V) => T) => T[];
|
|
31
|
+
clear: () => void;
|
|
32
|
+
sort: (fn?: ((a: V, b: V) => number) | undefined) => V[];
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=bounded-collections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-collections.d.ts","sourceRoot":"","sources":["../src/bounded-collections.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,QAAQ,CAAC,CAAC,EAAE,CAAC;;gBAIpB,SAAS,EAAE,MAAM;IAI7B,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;IAEvC,GAAG,QAAS,CAAC,SAAS,CAAC,UAUtB;IAED,GAAG,QAAS,CAAC,KAAG,CAAC,GAAG,SAAS,CAE5B;IAED,MAAM,QAAS,CAAC,UAEf;IAED,IAAI,4BAEH;CACF;AAED,qBAAa,QAAQ,CAAC,CAAC;;gBAGT,SAAS,EAAE,MAAM;IAW7B,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;IAEvC,GAAG,MAAO,CAAC,UAET;IAEF,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAEhB;CACF;AAED,qBAAa,UAAU,CAAC,CAAC;;gBAIX,SAAS,EAAE,MAAM;IAI7B,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;IAEvC,IAAI,MAAO,CAAC,UAQX;IAED,GAAG,UAAW,MAAM,KAAG,CAAC,GAAG,SAAS,CAEnC;IAED,MAAM,UAAW,MAAM,UAEtB;IAED,IAAI,MAAM,WAET;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAEhB;IAED,GAAG,cAAe,CAAC,eAElB;IAED,KAAK,aAEJ;IAED,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,MAAM,sBAElC;CACF"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _BoundMap_map, _BoundMap_sizeLimit, _BoundSet_map, _BoundSet_onEvict, _a, _BoundArray_array, _BoundArray_sizeLimit, _b;
|
|
13
|
+
/**
|
|
14
|
+
* Creates a map that has a fixed number of entries.
|
|
15
|
+
* Once hitting the bound, earliest insertions are removed
|
|
16
|
+
*/
|
|
17
|
+
class BoundMap {
|
|
18
|
+
constructor(sizeLimit) {
|
|
19
|
+
_BoundMap_map.set(this, new Map());
|
|
20
|
+
_BoundMap_sizeLimit.set(this, void 0);
|
|
21
|
+
this.set = (key, value) => {
|
|
22
|
+
__classPrivateFieldGet(this, _BoundMap_map, "f").set(key, value);
|
|
23
|
+
// console.log(this.#map.size, this.#sizeLimit);
|
|
24
|
+
if (__classPrivateFieldGet(this, _BoundMap_map, "f").size > __classPrivateFieldGet(this, _BoundMap_sizeLimit, "f")) {
|
|
25
|
+
const firstKey = __classPrivateFieldGet(this, _BoundMap_map, "f").keys().next().value;
|
|
26
|
+
__classPrivateFieldGet(this, _BoundMap_map, "f").delete(firstKey);
|
|
27
|
+
if (this.onEvict) {
|
|
28
|
+
this.onEvict(firstKey);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
this.get = (key) => {
|
|
33
|
+
return __classPrivateFieldGet(this, _BoundMap_map, "f").get(key);
|
|
34
|
+
};
|
|
35
|
+
this.delete = (key) => {
|
|
36
|
+
__classPrivateFieldGet(this, _BoundMap_map, "f").delete(key);
|
|
37
|
+
};
|
|
38
|
+
this.keys = () => {
|
|
39
|
+
return __classPrivateFieldGet(this, _BoundMap_map, "f").keys();
|
|
40
|
+
};
|
|
41
|
+
__classPrivateFieldSet(this, _BoundMap_sizeLimit, sizeLimit, "f");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
_BoundMap_map = new WeakMap(), _BoundMap_sizeLimit = new WeakMap();
|
|
45
|
+
export default BoundMap;
|
|
46
|
+
export class BoundSet {
|
|
47
|
+
constructor(sizeLimit) {
|
|
48
|
+
_BoundSet_map.set(this, void 0);
|
|
49
|
+
_BoundSet_onEvict.set(this, (v) => {
|
|
50
|
+
if (this.onEvict) {
|
|
51
|
+
this.onEvict(v);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
this.add = (v) => {
|
|
55
|
+
__classPrivateFieldGet(this, _BoundSet_map, "f").set(v, v);
|
|
56
|
+
};
|
|
57
|
+
this[_a] = () => {
|
|
58
|
+
return __classPrivateFieldGet(this, _BoundSet_map, "f").keys();
|
|
59
|
+
};
|
|
60
|
+
__classPrivateFieldSet(this, _BoundSet_map, new BoundMap(sizeLimit), "f");
|
|
61
|
+
__classPrivateFieldGet(this, _BoundSet_map, "f").onEvict = __classPrivateFieldGet(this, _BoundSet_onEvict, "f");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
_BoundSet_map = new WeakMap(), _BoundSet_onEvict = new WeakMap(), _a = Symbol.iterator;
|
|
65
|
+
export class BoundArray {
|
|
66
|
+
constructor(sizeLimit) {
|
|
67
|
+
_BoundArray_array.set(this, []);
|
|
68
|
+
_BoundArray_sizeLimit.set(this, void 0);
|
|
69
|
+
this.push = (v) => {
|
|
70
|
+
__classPrivateFieldGet(this, _BoundArray_array, "f").push(v);
|
|
71
|
+
if (__classPrivateFieldGet(this, _BoundArray_array, "f").length > __classPrivateFieldGet(this, _BoundArray_sizeLimit, "f")) {
|
|
72
|
+
const first = __classPrivateFieldGet(this, _BoundArray_array, "f").shift();
|
|
73
|
+
if (first && this.onEvict) {
|
|
74
|
+
this.onEvict(first);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
this.get = (index) => {
|
|
79
|
+
return __classPrivateFieldGet(this, _BoundArray_array, "f")[index];
|
|
80
|
+
};
|
|
81
|
+
this.delete = (index) => {
|
|
82
|
+
__classPrivateFieldGet(this, _BoundArray_array, "f").splice(index, 1);
|
|
83
|
+
};
|
|
84
|
+
this[_b] = () => {
|
|
85
|
+
return __classPrivateFieldGet(this, _BoundArray_array, "f")[Symbol.iterator]();
|
|
86
|
+
};
|
|
87
|
+
this.map = (fn) => {
|
|
88
|
+
return __classPrivateFieldGet(this, _BoundArray_array, "f").map(fn);
|
|
89
|
+
};
|
|
90
|
+
this.clear = () => {
|
|
91
|
+
__classPrivateFieldSet(this, _BoundArray_array, [], "f");
|
|
92
|
+
};
|
|
93
|
+
this.sort = (fn) => {
|
|
94
|
+
return __classPrivateFieldGet(this, _BoundArray_array, "f").sort(fn);
|
|
95
|
+
};
|
|
96
|
+
__classPrivateFieldSet(this, _BoundArray_sizeLimit, sizeLimit, "f");
|
|
97
|
+
}
|
|
98
|
+
get length() {
|
|
99
|
+
return __classPrivateFieldGet(this, _BoundArray_array, "f").length;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
_BoundArray_array = new WeakMap(), _BoundArray_sizeLimit = new WeakMap(), _b = Symbol.iterator;
|
|
103
|
+
//# sourceMappingURL=bounded-collections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-collections.js","sourceRoot":"","sources":["../src/bounded-collections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
type SingletonKey = {
|
|
2
|
+
_tag: 'singleton';
|
|
3
|
+
componentName: string;
|
|
4
|
+
id: 'singleton';
|
|
5
|
+
};
|
|
6
|
+
type EphemeralKey = {
|
|
7
|
+
_tag: 'ephemeral';
|
|
8
|
+
componentName: string;
|
|
9
|
+
id: string;
|
|
10
|
+
};
|
|
11
|
+
type CustomKey = {
|
|
12
|
+
_tag: 'custom';
|
|
13
|
+
componentName: string;
|
|
14
|
+
id: string;
|
|
15
|
+
};
|
|
16
|
+
export type ComponentKey = SingletonKey | EphemeralKey | CustomKey;
|
|
17
|
+
export declare const labelForKey: (key: ComponentKey) => string;
|
|
18
|
+
export declare const tableNameForComponentKey: (componentKey: ComponentKey) => string;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=componentKey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentKey.d.ts","sourceRoot":"","sources":["../src/componentKey.ts"],"names":[],"mappings":"AAAA,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,WAAW,CAAA;CAAE,CAAA;AACjF,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAC5E,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtE,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,CAAA;AAElE,eAAO,MAAM,WAAW,QAAS,YAAY,KAAG,MAA0C,CAAA;AAE1F,eAAO,MAAM,wBAAwB,iBAAkB,YAAY,WAAgD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentKey.js","sourceRoot":"","sources":["../src/componentKey.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAiB,EAAU,EAAE,CAAC,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,EAAE,EAAE,CAAA;AAE1F,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,YAA0B,EAAE,EAAE,CAAC,eAAe,YAAY,CAAC,aAAa,EAAE,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Scope } from '@livestore/utils/effect';
|
|
2
|
+
import { Context, Deferred, Effect, Layer, Otel } from '@livestore/utils/effect';
|
|
3
|
+
import type * as otel from '@opentelemetry/api';
|
|
4
|
+
import type { GraphQLSchema } from 'graphql';
|
|
5
|
+
import type { Backend, BackendOptions } from '../backends/index.js';
|
|
6
|
+
import type { InMemoryDatabase } from '../inMemoryDatabase.js';
|
|
7
|
+
import type { Schema } from '../schema.js';
|
|
8
|
+
import type { BaseGraphQLContext, GraphQLOptions, LiveStoreQuery, Store } from '../store.js';
|
|
9
|
+
export type LiveStoreContext = {
|
|
10
|
+
store: Store<any>;
|
|
11
|
+
globalQueries: LiveStoreQueryTypes;
|
|
12
|
+
};
|
|
13
|
+
export type QueryDefinition = (store: Store<any>) => LiveStoreQuery;
|
|
14
|
+
export type GlobalQueryDefs = {
|
|
15
|
+
[key: string]: QueryDefinition;
|
|
16
|
+
};
|
|
17
|
+
export type LiveStoreCreateStoreOptions<GraphQLContext extends BaseGraphQLContext> = {
|
|
18
|
+
schema: Schema;
|
|
19
|
+
globalQueryDefs: GlobalQueryDefs;
|
|
20
|
+
backendOptions: BackendOptions;
|
|
21
|
+
graphQLOptions?: GraphQLOptions<GraphQLContext>;
|
|
22
|
+
otelTracer?: otel.Tracer;
|
|
23
|
+
otelRootSpanContext?: otel.Context;
|
|
24
|
+
boot?: (backend: Backend, parentSpan: otel.Span) => Promise<void>;
|
|
25
|
+
};
|
|
26
|
+
export declare const LiveStoreContext: Context.Tag<LiveStoreContext, LiveStoreContext>;
|
|
27
|
+
export type DeferredStoreContext = Deferred.Deferred<never, LiveStoreContext>;
|
|
28
|
+
export declare const DeferredStoreContext: Context.Tag<DeferredStoreContext, DeferredStoreContext>;
|
|
29
|
+
export type LiveStoreContextProps<GraphQLContext extends BaseGraphQLContext> = {
|
|
30
|
+
schema: Schema;
|
|
31
|
+
globalQueryDefs?: Effect.Effect<Otel.Tracer | Otel.Span, never, GlobalQueryDefs>;
|
|
32
|
+
backendOptions: Effect.Effect<Otel.Tracer | Otel.Span, never, BackendOptions>;
|
|
33
|
+
graphQLOptions?: {
|
|
34
|
+
schema: Effect.Effect<Otel.Tracer, never, GraphQLSchema>;
|
|
35
|
+
makeContext: (db: InMemoryDatabase) => GraphQLContext;
|
|
36
|
+
};
|
|
37
|
+
boot?: (backend: Backend) => Effect.Effect<Otel.Tracer, never, void>;
|
|
38
|
+
};
|
|
39
|
+
export declare const LiveStoreContextLayer: <GraphQLContext extends BaseGraphQLContext>(props: LiveStoreContextProps<GraphQLContext>) => Layer.Layer<Otel.Tracer, never, LiveStoreContext>;
|
|
40
|
+
export declare const LiveStoreContextDeferred: Layer.Layer<never, never, DeferredStoreContext>;
|
|
41
|
+
export declare const makeLiveStoreContext: <GraphQLContext extends BaseGraphQLContext>({ globalQueryDefs, schema, backendOptions: backendOptions_, graphQLOptions: graphQLOptions_, boot: boot_, }: LiveStoreContextProps<GraphQLContext>) => Effect.Effect<Otel.Tracer | Otel.Span | DeferredStoreContext | Scope.Scope, never, LiveStoreContext>;
|
|
42
|
+
//# sourceMappingURL=LiveStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveStore.d.ts","sourceRoot":"","sources":["../../src/effect/LiveStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAY,MAAM,EAAE,KAAK,EAAE,IAAI,EAAQ,MAAM,yBAAyB,CAAA;AAChG,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAG5C,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAG5F,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;IACjB,aAAa,EAAE,mBAAmB,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,cAAc,CAAA;AACnE,MAAM,MAAM,eAAe,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAA;CAAE,CAAA;AAEhE,MAAM,MAAM,2BAA2B,CAAC,cAAc,SAAS,kBAAkB,IAAI;IACnF,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,eAAe,CAAA;IAChC,cAAc,EAAE,cAAc,CAAA;IAC9B,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAA;IAC/C,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IACxB,mBAAmB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;IAClC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAClE,CAAA;AAED,eAAO,MAAM,gBAAgB,iDAAyE,CAAA;AAEtG,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAA;AAC7E,eAAO,MAAM,oBAAoB,yDAEhC,CAAA;AAID,MAAM,MAAM,qBAAqB,CAAC,cAAc,SAAS,kBAAkB,IAAI;IAC7E,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,CAAA;IAChF,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,CAAA;IAC7E,cAAc,CAAC,EAAE;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAA;QACxD,WAAW,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,cAAc,CAAA;KACtD,CAAA;IACD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;CACrE,CAAA;AAED,eAAO,MAAM,qBAAqB,+FAE/B,WAAW,CAAC,KAAK,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAIhD,CAAA;AAEH,eAAO,MAAM,wBAAwB,iDAA+E,CAAA;AAEpH,eAAO,MAAM,oBAAoB,qMAMU,aAAa,CACtD,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,oBAAoB,GAAG,WAAW,EAC5D,KAAK,EACL,gBAAgB,CAqDf,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Context, Deferred, Duration, Effect, Layer, Otel, pipe } from '@livestore/utils/effect';
|
|
2
|
+
import { mapValues } from 'lodash-es';
|
|
3
|
+
import { createStore } from '../store.js';
|
|
4
|
+
export const LiveStoreContext = Context.Tag('@livestore/livestore/LiveStoreContext');
|
|
5
|
+
export const DeferredStoreContext = Context.Tag(Symbol.for('@livestore/livestore/DeferredStoreContext'));
|
|
6
|
+
export const LiveStoreContextLayer = (props) => Layer.provide(LiveStoreContextDeferred, pipe(Layer.scoped(LiveStoreContext, makeLiveStoreContext(props)), Otel.withSpanLayer('LiveStoreContext')));
|
|
7
|
+
export const LiveStoreContextDeferred = Layer.effect(DeferredStoreContext, Deferred.make());
|
|
8
|
+
export const makeLiveStoreContext = ({ globalQueryDefs, schema, backendOptions: backendOptions_, graphQLOptions: graphQLOptions_, boot: boot_, }) => pipe(Effect.gen(function* ($) {
|
|
9
|
+
const ctx = yield* $(Effect.context());
|
|
10
|
+
const otelRootSpanContext = yield* $(Otel.activeContext);
|
|
11
|
+
const { tracer: otelTracer } = yield* $(Otel.Tracer);
|
|
12
|
+
const graphQLOptions = yield* $(graphQLOptions_
|
|
13
|
+
? Effect.all({ schema: graphQLOptions_.schema, makeContext: Effect.succeed(graphQLOptions_.makeContext) })
|
|
14
|
+
: Effect.succeed(undefined));
|
|
15
|
+
const backendOptions = yield* $(backendOptions_ ?? Effect.succeed(undefined));
|
|
16
|
+
const boot = boot_
|
|
17
|
+
? (db) => pipe(boot_(db), Effect.provideContext(ctx), Effect.tapCauseLogPretty, Effect.runPromise)
|
|
18
|
+
: undefined;
|
|
19
|
+
const store = yield* $(Effect.tryPromise(() => createStore({
|
|
20
|
+
schema,
|
|
21
|
+
backendOptions,
|
|
22
|
+
graphQLOptions,
|
|
23
|
+
otelTracer,
|
|
24
|
+
otelRootSpanContext,
|
|
25
|
+
boot,
|
|
26
|
+
})), Effect.acquireRelease((store) => Effect.sync(() => store.destroy())));
|
|
27
|
+
window.__debugLiveStore = store;
|
|
28
|
+
const globalQueries = yield* $(globalQueryDefs ?? Effect.succeed({}), Effect.map((defs) => mapValues(defs, (queryDef) => queryDef(store))), Otel.withSpan('LiveStore:makeGlobalQueries', {}, store.otel.queriesSpanContext));
|
|
29
|
+
// NOTE give main thread a chance to render
|
|
30
|
+
yield* $(Effect.yieldNow());
|
|
31
|
+
return { store, globalQueries };
|
|
32
|
+
}), Effect.tap((storeCtx) => Effect.flatMap(DeferredStoreContext, (def) => Deferred.succeed(def, storeCtx))), Effect.timeoutFail({
|
|
33
|
+
onTimeout: () => new Error('Timed out while creating LiveStore store after 10sec'),
|
|
34
|
+
duration: Duration.seconds(10),
|
|
35
|
+
}), Effect.orDie);
|
|
36
|
+
//# sourceMappingURL=LiveStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveStore.js","sourceRoot":"","sources":["../../src/effect/LiveStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,GAErB,MAAM,gBAAgB,CAAA"}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,GAAG,CAAA;CACX,CAAA;AAED,eAAO,MAAM,iBAAiB,aAAa,CAAA"}
|