@livestore/livestore 0.3.0-dev.5 → 0.3.0-dev.51
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/dist/.tsbuildinfo +1 -1
- package/dist/QueryCache.d.ts.map +1 -1
- package/dist/SqliteDbWrapper.d.ts +60 -0
- package/dist/SqliteDbWrapper.d.ts.map +1 -0
- package/dist/{SynchronousDatabaseWrapper.js → SqliteDbWrapper.js} +69 -34
- package/dist/SqliteDbWrapper.js.map +1 -0
- package/dist/effect/LiveStore.d.ts +6 -34
- package/dist/effect/LiveStore.d.ts.map +1 -1
- package/dist/effect/LiveStore.js +10 -12
- package/dist/effect/LiveStore.js.map +1 -1
- package/dist/effect/mod.d.ts +3 -0
- package/dist/effect/mod.d.ts.map +1 -0
- package/dist/effect/mod.js +3 -0
- package/dist/effect/mod.js.map +1 -0
- package/dist/internal/mod.d.ts +3 -0
- package/dist/internal/mod.d.ts.map +1 -0
- package/dist/internal/mod.js +3 -0
- package/dist/internal/mod.js.map +1 -0
- package/dist/live-queries/base-class.d.ts +69 -29
- package/dist/live-queries/base-class.d.ts.map +1 -1
- package/dist/live-queries/base-class.js +60 -14
- package/dist/live-queries/base-class.js.map +1 -1
- package/dist/live-queries/client-document-get-query.d.ts +12 -0
- package/dist/live-queries/client-document-get-query.d.ts.map +1 -0
- package/dist/live-queries/client-document-get-query.js +18 -0
- package/dist/live-queries/client-document-get-query.js.map +1 -0
- package/dist/live-queries/computed.d.ts +13 -15
- package/dist/live-queries/computed.d.ts.map +1 -1
- package/dist/live-queries/computed.js +37 -15
- package/dist/live-queries/computed.js.map +1 -1
- package/dist/live-queries/db-query.d.ts +93 -0
- package/dist/live-queries/db-query.d.ts.map +1 -0
- package/dist/live-queries/{db.js → db-query.js} +113 -40
- package/dist/live-queries/db-query.js.map +1 -0
- package/dist/live-queries/db-query.test.d.ts +2 -0
- package/dist/live-queries/db-query.test.d.ts.map +1 -0
- package/dist/live-queries/db-query.test.js +133 -0
- package/dist/live-queries/db-query.test.js.map +1 -0
- package/dist/live-queries/mod.d.ts +5 -0
- package/dist/live-queries/mod.d.ts.map +1 -0
- package/dist/live-queries/mod.js +5 -0
- package/dist/live-queries/mod.js.map +1 -0
- package/dist/live-queries/signal.d.ts +25 -0
- package/dist/live-queries/signal.d.ts.map +1 -0
- package/dist/live-queries/signal.js +50 -0
- package/dist/live-queries/signal.js.map +1 -0
- package/dist/live-queries/signal.test.d.ts +2 -0
- package/dist/live-queries/signal.test.d.ts.map +1 -0
- package/dist/live-queries/signal.test.js +25 -0
- package/dist/live-queries/signal.test.js.map +1 -0
- package/dist/mod.d.ts +14 -0
- package/dist/mod.d.ts.map +1 -0
- package/dist/mod.js +13 -0
- package/dist/mod.js.map +1 -0
- package/dist/reactive.d.ts +23 -17
- package/dist/reactive.d.ts.map +1 -1
- package/dist/reactive.js +23 -19
- package/dist/reactive.js.map +1 -1
- package/dist/reactive.test.js +1 -1
- package/dist/reactive.test.js.map +1 -1
- package/dist/store/create-store.d.ts +70 -12
- package/dist/store/create-store.d.ts.map +1 -1
- package/dist/store/create-store.js +68 -19
- package/dist/store/create-store.js.map +1 -1
- package/dist/store/devtools.d.ts +5 -4
- package/dist/store/devtools.d.ts.map +1 -1
- package/dist/store/devtools.js +92 -40
- package/dist/store/devtools.js.map +1 -1
- package/dist/store/store-types.d.ts +54 -42
- package/dist/store/store-types.d.ts.map +1 -1
- package/dist/store/store-types.js +2 -5
- package/dist/store/store-types.js.map +1 -1
- package/dist/store/store.d.ts +141 -35
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +322 -154
- package/dist/store/store.js.map +1 -1
- package/dist/utils/data-structures.d.ts.map +1 -1
- package/dist/utils/dev.d.ts.map +1 -1
- package/dist/utils/dev.js +6 -1
- package/dist/utils/dev.js.map +1 -1
- package/dist/utils/function-string.d.ts +7 -0
- package/dist/utils/function-string.d.ts.map +1 -0
- package/dist/utils/function-string.js +9 -0
- package/dist/utils/function-string.js.map +1 -0
- package/dist/utils/stack-info.d.ts.map +1 -1
- package/dist/utils/stack-info.js +6 -1
- package/dist/utils/stack-info.js.map +1 -1
- package/dist/utils/stack-info.test.js +54 -1
- package/dist/utils/stack-info.test.js.map +1 -1
- package/dist/utils/tests/fixture.d.ts +59 -216
- package/dist/utils/tests/fixture.d.ts.map +1 -1
- package/dist/utils/tests/fixture.js +23 -18
- package/dist/utils/tests/fixture.js.map +1 -1
- package/dist/utils/tests/mod.d.ts +1 -0
- package/dist/utils/tests/mod.d.ts.map +1 -1
- package/dist/utils/tests/mod.js +1 -0
- package/dist/utils/tests/mod.js.map +1 -1
- package/dist/utils/tests/otel.d.ts.map +1 -1
- package/dist/utils/tests/otel.js +8 -3
- package/dist/utils/tests/otel.js.map +1 -1
- package/package.json +29 -26
- package/src/{SynchronousDatabaseWrapper.ts → SqliteDbWrapper.ts} +92 -42
- package/src/effect/LiveStore.ts +27 -64
- package/src/effect/{index.ts → mod.ts} +2 -3
- package/src/internal/mod.ts +2 -0
- package/src/live-queries/__snapshots__/{db.test.ts.snap → db-query.test.ts.snap} +241 -45
- package/src/live-queries/base-class.ts +170 -53
- package/src/live-queries/client-document-get-query.ts +52 -0
- package/src/live-queries/computed.ts +51 -33
- package/src/live-queries/db-query.test.ts +192 -0
- package/src/live-queries/{db.ts → db-query.ts} +171 -82
- package/src/live-queries/mod.ts +4 -0
- package/src/live-queries/signal.test.ts +40 -0
- package/src/live-queries/signal.ts +81 -0
- package/src/mod.ts +51 -0
- package/src/reactive.test.ts +1 -1
- package/src/reactive.ts +66 -43
- package/src/store/create-store.ts +188 -62
- package/src/store/devtools.ts +124 -46
- package/src/store/store-types.ts +54 -43
- package/src/store/store.ts +457 -237
- package/src/utils/dev.ts +6 -1
- package/src/utils/function-string.ts +12 -0
- package/src/utils/stack-info.test.ts +58 -1
- package/src/utils/stack-info.ts +6 -1
- package/src/utils/tests/fixture.ts +22 -31
- package/src/utils/tests/mod.ts +1 -0
- package/src/utils/tests/otel.ts +10 -3
- package/dist/SynchronousDatabaseWrapper.d.ts +0 -41
- package/dist/SynchronousDatabaseWrapper.d.ts.map +0 -1
- package/dist/SynchronousDatabaseWrapper.js.map +0 -1
- package/dist/effect/index.d.ts +0 -2
- package/dist/effect/index.d.ts.map +0 -1
- package/dist/effect/index.js +0 -2
- package/dist/effect/index.js.map +0 -1
- package/dist/global-state.d.ts +0 -14
- package/dist/global-state.d.ts.map +0 -1
- package/dist/global-state.js +0 -16
- package/dist/global-state.js.map +0 -1
- package/dist/index.d.ts +0 -20
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -16
- package/dist/index.js.map +0 -1
- package/dist/live-queries/db.d.ts +0 -66
- package/dist/live-queries/db.d.ts.map +0 -1
- package/dist/live-queries/db.js.map +0 -1
- package/dist/live-queries/db.test.d.ts +0 -2
- package/dist/live-queries/db.test.d.ts.map +0 -1
- package/dist/live-queries/db.test.js +0 -118
- package/dist/live-queries/db.test.js.map +0 -1
- package/dist/live-queries/graphql.d.ts +0 -49
- package/dist/live-queries/graphql.d.ts.map +0 -1
- package/dist/live-queries/graphql.js +0 -122
- package/dist/live-queries/graphql.js.map +0 -1
- package/dist/row-query-utils.d.ts +0 -17
- package/dist/row-query-utils.d.ts.map +0 -1
- package/dist/row-query-utils.js +0 -30
- package/dist/row-query-utils.js.map +0 -1
- package/dist/utils/otel.d.ts +0 -4
- package/dist/utils/otel.d.ts.map +0 -1
- package/dist/utils/otel.js +0 -6
- package/dist/utils/otel.js.map +0 -1
- package/src/global-state.ts +0 -20
- package/src/index.ts +0 -66
- package/src/live-queries/db.test.ts +0 -154
- package/src/live-queries/graphql.ts +0 -219
- package/src/row-query-utils.ts +0 -65
- package/src/utils/otel.ts +0 -9
- package/tsconfig.json +0 -18
- package/vitest.config.js +0 -9
@@ -1,28 +1,33 @@
|
|
1
|
+
import { makeInMemoryAdapter } from '@livestore/adapter-web';
|
1
2
|
import { provideOtel } from '@livestore/common';
|
2
|
-
import { createStore,
|
3
|
-
import { Effect } from '@livestore/utils/effect';
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
3
|
+
import { createStore, makeSchema, State } from '@livestore/livestore';
|
4
|
+
import { Effect, Schema } from '@livestore/utils/effect';
|
5
|
+
export const todos = State.SQLite.table({
|
6
|
+
name: 'todos',
|
7
|
+
columns: {
|
8
|
+
id: State.SQLite.text({ primaryKey: true }),
|
9
|
+
text: State.SQLite.text({ default: '', nullable: false }),
|
10
|
+
completed: State.SQLite.boolean({ default: false, nullable: false }),
|
11
|
+
},
|
12
|
+
});
|
13
|
+
export const app = State.SQLite.clientDocument({
|
14
|
+
name: 'app',
|
15
|
+
schema: Schema.Struct({
|
16
|
+
newTodoText: Schema.String,
|
17
|
+
filter: Schema.String,
|
18
|
+
}),
|
19
|
+
default: { value: { newTodoText: '', filter: 'all' } },
|
20
|
+
});
|
15
21
|
export const tables = { todos, app };
|
16
|
-
export const
|
17
|
-
export const
|
18
|
-
|
22
|
+
export const state = State.SQLite.makeState({ tables, materializers: {} });
|
23
|
+
export const schema = makeSchema({ state, events: {} });
|
24
|
+
export const makeTodoMvc = ({ otelTracer, otelContext, } = {}) => Effect.gen(function* () {
|
19
25
|
const store = yield* createStore({
|
20
26
|
schema,
|
21
27
|
storeId: 'default',
|
22
28
|
adapter: makeInMemoryAdapter(),
|
23
|
-
reactivityGraph,
|
24
29
|
debug: { instanceId: 'test' },
|
25
30
|
});
|
26
|
-
return
|
31
|
+
return store;
|
27
32
|
}).pipe(provideOtel({ parentSpanContext: otelContext, otelTracer: otelTracer }));
|
28
33
|
//# sourceMappingURL=fixture.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"fixture.js","sourceRoot":"","sources":["../../../src/utils/tests/fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"fixture.js","sourceRoot":"","sources":["../../../src/utils/tests/fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAgBxD,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;IACtC,IAAI,EAAE,OAAO;IACb,OAAO,EAAE;QACP,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC3C,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACzD,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;KACrE;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC;IAC7C,IAAI,EAAE,KAAK;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IACF,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;CACvD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;AAEpC,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;AAC1E,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;AAEvD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,UAAU,EACV,WAAW,MAIT,EAAE,EAAE,EAAE,CACR,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;QAC/B,MAAM;QACN,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,mBAAmB,EAAE;QAC9B,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;KAC9B,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AACd,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../src/utils/tests/mod.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA"}
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../src/utils/tests/mod.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,KAAK,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/utils/tests/mod.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../../src/utils/tests/mod.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA"}
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../../src/utils/tests/mod.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,KAAK,EAAE,MAAM,mBAAmB,CAAA"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../../../src/utils/tests/otel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACvF,KAAK,oBAAoB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,oBAAoB,EAAE,CAAA;CAAE,CAAA;AAEhG,eAAO,MAAM,qBAAqB,
|
1
|
+
{"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../../../src/utils/tests/otel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACvF,KAAK,oBAAoB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,oBAAoB,EAAE,CAAA;CAAE,CAAA;AAEhG,eAAO,MAAM,qBAAqB,GAChC,UAAU,oBAAoB,EAC9B,gBAAgB,CAAC,UAAU,EAAE,UAAU,KAAK,UAAU,KACrD,oBA+CF,CAAA;AAqBD,eAAO,MAAM,WAAW,GAAI,OAAO,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDhD,CAAA"}
|
package/dist/utils/tests/otel.js
CHANGED
@@ -4,12 +4,17 @@ export const getSimplifiedRootSpan = (exporter, mapAttributes) => {
|
|
4
4
|
const spansMap = new Map(spans.map((span) => [span.spanContext().spanId, { span, children: [] }]));
|
5
5
|
const mapAttributesfn = mapAttributes ?? identity;
|
6
6
|
spansMap.forEach((nestedSpan) => {
|
7
|
-
const
|
7
|
+
const parentId = nestedSpan.span.parentSpanContext?.spanId;
|
8
|
+
const parentSpan = parentId ? spansMap.get(parentId) : undefined;
|
8
9
|
if (parentSpan) {
|
9
10
|
parentSpan.children.push(nestedSpan);
|
10
11
|
}
|
11
12
|
});
|
12
|
-
const
|
13
|
+
const createStoreSpanData = spans.find((_) => _.name === 'createStore');
|
14
|
+
if (createStoreSpanData === undefined) {
|
15
|
+
throw new Error("Could not find the root span named 'createStore'. Available spans: " + spans.map((s) => s.name).join(', '));
|
16
|
+
}
|
17
|
+
const rootSpan = spansMap.get(createStoreSpanData.spanContext().spanId);
|
13
18
|
const simplifySpanRec = (span) => omitEmpty({
|
14
19
|
_name: span.span.name,
|
15
20
|
attributes: mapAttributesfn(span.span.attributes),
|
@@ -64,7 +69,7 @@ export const toTraceFile = (spans) => {
|
|
64
69
|
spans: spans.map((span) => ({
|
65
70
|
traceId: span.spanContext().traceId,
|
66
71
|
spanId: span.spanContext().spanId,
|
67
|
-
...(span.
|
72
|
+
...(span.parentSpanContext?.spanId ? { parentSpanId: span.parentSpanContext.spanId } : {}),
|
68
73
|
// traceState: span.spanContext().traceState ?? '',
|
69
74
|
name: span.name,
|
70
75
|
kind: 'SPAN_KIND_INTERNAL',
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../../../src/utils/tests/otel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAKlD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAA8B,EAC9B,aAAsD,EAChC,EAAE;IACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAA;IACzC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAqB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAEtH,MAAM,eAAe,GAAG,aAAa,IAAI,QAAQ,CAAA;IAEjD,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;QAC9B,MAAM,
|
1
|
+
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../../../src/utils/tests/otel.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,56 +1,59 @@
|
|
1
1
|
{
|
2
2
|
"name": "@livestore/livestore",
|
3
|
-
"version": "0.3.0-dev.
|
3
|
+
"version": "0.3.0-dev.51",
|
4
4
|
"type": "module",
|
5
5
|
"sideEffects": false,
|
6
6
|
"exports": {
|
7
7
|
".": {
|
8
|
-
"types": "./dist/
|
9
|
-
"default": "./dist/
|
8
|
+
"types": "./dist/mod.d.ts",
|
9
|
+
"default": "./dist/mod.js"
|
10
|
+
},
|
11
|
+
"./internal": {
|
12
|
+
"types": "./dist/internal/mod.d.ts",
|
13
|
+
"default": "./dist/internal/mod.js"
|
10
14
|
},
|
11
15
|
"./internal/testing-utils": {
|
12
16
|
"types": "./dist/utils/tests/mod.d.ts",
|
13
17
|
"default": "./dist/utils/tests/mod.js"
|
14
18
|
},
|
15
19
|
"./effect": {
|
16
|
-
"types": "./dist/effect/
|
17
|
-
"default": "./dist/effect/
|
20
|
+
"types": "./dist/effect/mod.d.ts",
|
21
|
+
"default": "./dist/effect/mod.js"
|
18
22
|
}
|
19
23
|
},
|
20
|
-
"types": "./dist/
|
24
|
+
"types": "./dist/mod.d.ts",
|
21
25
|
"typesVersions": {
|
22
26
|
"*": {
|
27
|
+
"internal": [
|
28
|
+
"./dist/internal/mod.d.ts"
|
29
|
+
],
|
23
30
|
"testing-utils": [
|
24
31
|
"./dist/utils/tests/mod.d.ts"
|
25
32
|
],
|
26
33
|
"effect": [
|
27
|
-
"./dist/effect/
|
34
|
+
"./dist/effect/mod.d.ts"
|
28
35
|
]
|
29
36
|
}
|
30
37
|
},
|
31
38
|
"dependencies": {
|
32
|
-
"@
|
33
|
-
"@
|
34
|
-
"@livestore/
|
35
|
-
"@livestore/db-schema": "0.3.0-dev.5",
|
36
|
-
"@livestore/common": "0.3.0-dev.5"
|
39
|
+
"@opentelemetry/api": "1.9.0",
|
40
|
+
"@livestore/utils": "0.3.0-dev.51",
|
41
|
+
"@livestore/common": "0.3.0-dev.51"
|
37
42
|
},
|
38
43
|
"devDependencies": {
|
39
|
-
"@opentelemetry/sdk-trace-base": "
|
40
|
-
"jsdom": "^
|
41
|
-
"typescript": "5.
|
42
|
-
"vite": "
|
43
|
-
"vitest": "^
|
44
|
-
"@livestore/web": "0.3.0-dev.
|
45
|
-
|
46
|
-
"peerDependencies": {
|
47
|
-
"graphql": "16.x"
|
48
|
-
},
|
49
|
-
"peerDependenciesMeta": {
|
50
|
-
"graphql": {
|
51
|
-
"optional": true
|
52
|
-
}
|
44
|
+
"@opentelemetry/sdk-trace-base": "^2.0.0",
|
45
|
+
"jsdom": "^26.0.0",
|
46
|
+
"typescript": "^5.8.3",
|
47
|
+
"vite": "^6.3.4",
|
48
|
+
"vitest": "^3.1.2",
|
49
|
+
"@livestore/adapter-web": "0.3.0-dev.51",
|
50
|
+
"@livestore/utils-dev": "0.3.0-dev.51"
|
53
51
|
},
|
52
|
+
"files": [
|
53
|
+
"package.json",
|
54
|
+
"src",
|
55
|
+
"dist"
|
56
|
+
],
|
54
57
|
"publishConfig": {
|
55
58
|
"access": "public"
|
56
59
|
},
|
@@ -5,14 +5,22 @@ import type {
|
|
5
5
|
MutableDebugInfo,
|
6
6
|
PreparedBindValues,
|
7
7
|
PreparedStatement,
|
8
|
-
|
8
|
+
SqliteDb,
|
9
|
+
SqliteDbChangeset,
|
10
|
+
SqliteDbSession,
|
9
11
|
} from '@livestore/common'
|
10
|
-
import {
|
11
|
-
|
12
|
+
import {
|
13
|
+
BoundArray,
|
14
|
+
BoundMap,
|
15
|
+
getDurationMsFromSpan,
|
16
|
+
getStartTimeHighResFromSpan,
|
17
|
+
sql,
|
18
|
+
SqliteError,
|
19
|
+
} from '@livestore/common'
|
20
|
+
import { isDevEnv, LS_DEV } from '@livestore/utils'
|
12
21
|
import type * as otel from '@opentelemetry/api'
|
13
22
|
|
14
23
|
import QueryCache from './QueryCache.js'
|
15
|
-
import { getDurationMsFromSpan, getStartTimeHighResFromSpan } from './utils/otel.js'
|
16
24
|
|
17
25
|
export const emptyDebugInfo = (): DebugInfo => ({
|
18
26
|
slowQueries: new BoundArray(200),
|
@@ -21,12 +29,17 @@ export const emptyDebugInfo = (): DebugInfo => ({
|
|
21
29
|
events: new BoundArray(1000),
|
22
30
|
})
|
23
31
|
|
24
|
-
|
32
|
+
/**
|
33
|
+
* This class is mostly adding result caching around a SqliteDb which is used to speed up
|
34
|
+
* SQLite queries when used through the reactivity graph.
|
35
|
+
*/
|
36
|
+
export class SqliteDbWrapper implements SqliteDb {
|
37
|
+
_tag = 'SqliteDb' as const
|
25
38
|
// TODO: how many unique active statements are expected?
|
26
39
|
private cachedStmts = new BoundMap<string, PreparedStatement>(200)
|
27
40
|
private tablesUsedCache = new BoundMap<string, Set<string>>(200)
|
28
41
|
private resultCache = new QueryCache()
|
29
|
-
private db:
|
42
|
+
private db: SqliteDb
|
30
43
|
private otelTracer: otel.Tracer
|
31
44
|
private otelRootSpanContext: otel.Context
|
32
45
|
private tablesUsedStmt
|
@@ -36,7 +49,7 @@ export class SynchronousDatabaseWrapper {
|
|
36
49
|
db,
|
37
50
|
otel,
|
38
51
|
}: {
|
39
|
-
db:
|
52
|
+
db: SqliteDb
|
40
53
|
otel: {
|
41
54
|
tracer: otel.Tracer
|
42
55
|
rootSpanContext: otel.Context
|
@@ -54,6 +67,25 @@ export class SynchronousDatabaseWrapper {
|
|
54
67
|
|
55
68
|
configureSQLite(this)
|
56
69
|
}
|
70
|
+
metadata: any
|
71
|
+
prepare(queryStr: string): PreparedStatement {
|
72
|
+
return this.db.prepare(queryStr)
|
73
|
+
}
|
74
|
+
import(data: Uint8Array<ArrayBufferLike> | SqliteDb<any, any>) {
|
75
|
+
return this.db.import(data)
|
76
|
+
}
|
77
|
+
close(): void {
|
78
|
+
return this.db.close()
|
79
|
+
}
|
80
|
+
destroy(): void {
|
81
|
+
return this.db.destroy()
|
82
|
+
}
|
83
|
+
session(): SqliteDbSession {
|
84
|
+
return this.db.session()
|
85
|
+
}
|
86
|
+
makeChangeset(data: Uint8Array): SqliteDbChangeset {
|
87
|
+
return this.db.makeChangeset(data)
|
88
|
+
}
|
57
89
|
|
58
90
|
txn<TRes>(callback: () => TRes): TRes {
|
59
91
|
this.execute(sql`begin transaction;`)
|
@@ -76,14 +108,20 @@ export class SynchronousDatabaseWrapper {
|
|
76
108
|
return result
|
77
109
|
}
|
78
110
|
|
79
|
-
withChangeset<TRes>(callback: () => TRes): {
|
111
|
+
withChangeset<TRes>(callback: () => TRes): {
|
112
|
+
result: TRes
|
113
|
+
changeset: { _tag: 'sessionChangeset'; data: Uint8Array; debug: any } | { _tag: 'no-op' }
|
114
|
+
} {
|
80
115
|
const session = this.db.session()
|
81
116
|
const result = callback()
|
82
117
|
const changeset = session.changeset()
|
83
118
|
|
84
119
|
session.finish()
|
85
120
|
|
86
|
-
return {
|
121
|
+
return {
|
122
|
+
result,
|
123
|
+
changeset: changeset ? { _tag: 'sessionChangeset', data: changeset, debug: null } : { _tag: 'no-op' },
|
124
|
+
}
|
87
125
|
}
|
88
126
|
|
89
127
|
rollback(changeset: Uint8Array) {
|
@@ -121,9 +159,13 @@ export class SynchronousDatabaseWrapper {
|
|
121
159
|
|
122
160
|
execute(
|
123
161
|
queryStr: string,
|
124
|
-
bindValues?: PreparedBindValues,
|
125
|
-
|
126
|
-
|
162
|
+
bindValues?: PreparedBindValues | undefined,
|
163
|
+
options?: {
|
164
|
+
hasNoEffects?: boolean
|
165
|
+
otelContext?: otel.Context
|
166
|
+
writeTables?: ReadonlySet<string>
|
167
|
+
onRowsChanged?: (rowsChanged: number) => void
|
168
|
+
},
|
127
169
|
): { durationMs: number } {
|
128
170
|
// console.debug('in-memory-db:execute', query, bindValues)
|
129
171
|
|
@@ -133,53 +175,62 @@ export class SynchronousDatabaseWrapper {
|
|
133
175
|
{ attributes: { 'sql.query': queryStr } },
|
134
176
|
options?.otelContext ?? this.otelRootSpanContext,
|
135
177
|
(span) => {
|
136
|
-
|
137
|
-
|
138
|
-
stmt
|
139
|
-
|
140
|
-
|
178
|
+
try {
|
179
|
+
let stmt = this.cachedStmts.get(queryStr)
|
180
|
+
if (stmt === undefined) {
|
181
|
+
stmt = this.db.prepare(queryStr)
|
182
|
+
this.cachedStmts.set(queryStr, stmt)
|
183
|
+
}
|
141
184
|
|
142
|
-
|
185
|
+
stmt.execute(bindValues)
|
143
186
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
187
|
+
if (options?.hasNoEffects !== true && !this.resultCache.ignoreQuery(queryStr)) {
|
188
|
+
// TODO use write tables instead
|
189
|
+
// check what queries actually end up here.
|
190
|
+
this.resultCache.invalidate(options?.writeTables ?? this.getTablesUsed(queryStr))
|
191
|
+
}
|
149
192
|
|
150
|
-
|
193
|
+
span.end()
|
151
194
|
|
152
|
-
|
195
|
+
const durationMs = getDurationMsFromSpan(span)
|
153
196
|
|
154
|
-
|
155
|
-
|
197
|
+
this.debugInfo.queryFrameDuration += durationMs
|
198
|
+
this.debugInfo.queryFrameCount++
|
156
199
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
200
|
+
if (durationMs > 5 && isDevEnv()) {
|
201
|
+
this.debugInfo.slowQueries.push({
|
202
|
+
queryStr,
|
203
|
+
bindValues,
|
204
|
+
durationMs,
|
205
|
+
rowsCount: undefined,
|
206
|
+
queriedTables: new Set(),
|
207
|
+
startTimePerfNow: getStartTimeHighResFromSpan(span),
|
208
|
+
})
|
209
|
+
}
|
167
210
|
|
168
|
-
|
211
|
+
return { durationMs }
|
212
|
+
} catch (cause: any) {
|
213
|
+
span.recordException(cause)
|
214
|
+
span.end()
|
215
|
+
if (LS_DEV) {
|
216
|
+
debugger
|
217
|
+
}
|
218
|
+
throw new SqliteError({ cause, query: { bindValues: bindValues ?? {}, sql: queryStr } })
|
219
|
+
}
|
169
220
|
},
|
170
221
|
)
|
171
222
|
}
|
172
223
|
|
173
224
|
select<T = any>(
|
174
225
|
queryStr: string,
|
226
|
+
bindValues?: PreparedBindValues | undefined,
|
175
227
|
options?: {
|
176
228
|
queriedTables?: ReadonlySet<string>
|
177
|
-
bindValues?: PreparedBindValues
|
178
229
|
skipCache?: boolean
|
179
230
|
otelContext?: otel.Context
|
180
231
|
},
|
181
232
|
): ReadonlyArray<T> {
|
182
|
-
const { queriedTables,
|
233
|
+
const { queriedTables, skipCache = false, otelContext } = options ?? {}
|
183
234
|
|
184
235
|
// console.debug('in-memory-db:select', query, bindValues)
|
185
236
|
|
@@ -252,13 +303,12 @@ export class SynchronousDatabaseWrapper {
|
|
252
303
|
}
|
253
304
|
|
254
305
|
/** Set up SQLite performance; hasn't been super carefully optimized yet. */
|
255
|
-
const configureSQLite = (db:
|
306
|
+
const configureSQLite = (db: SqliteDbWrapper) => {
|
256
307
|
db.execute(
|
257
308
|
// TODO: revisit these tuning parameters for max performance
|
258
309
|
sql`
|
259
310
|
PRAGMA page_size=32768;
|
260
311
|
PRAGMA cache_size=10000;
|
261
|
-
PRAGMA journal_mode='MEMORY'; -- we don't flush to disk before committing a write
|
262
312
|
PRAGMA synchronous='OFF';
|
263
313
|
PRAGMA temp_store='MEMORY';
|
264
314
|
PRAGMA foreign_keys='ON'; -- we want foreign key constraints to be enforced
|
package/src/effect/LiveStore.ts
CHANGED
@@ -1,84 +1,31 @@
|
|
1
|
-
import type {
|
1
|
+
import type { UnexpectedError } from '@livestore/common'
|
2
2
|
import type { LiveStoreSchema } from '@livestore/common/schema'
|
3
3
|
import type { Cause, OtelTracer, Scope } from '@livestore/utils/effect'
|
4
|
-
import {
|
5
|
-
import type * as otel from '@opentelemetry/api'
|
6
|
-
import type { GraphQLSchema } from 'graphql'
|
4
|
+
import { Deferred, Duration, Effect, Layer, pipe } from '@livestore/utils/effect'
|
7
5
|
|
8
|
-
import {
|
9
|
-
import
|
10
|
-
import type { BaseGraphQLContext, LiveStoreContextRunning as LiveStoreContextRunning_ } from '../store/store-types.js'
|
11
|
-
import type { SynchronousDatabaseWrapper } from '../SynchronousDatabaseWrapper.js'
|
6
|
+
import type { LiveStoreContextProps } from '../store/create-store.js'
|
7
|
+
import { createStore, DeferredStoreContext, LiveStoreContextRunning } from '../store/create-store.js'
|
12
8
|
|
13
|
-
export
|
14
|
-
export const LiveStoreContextRunning = Context.GenericTag<LiveStoreContextRunning>(
|
15
|
-
'@livestore/livestore/effect/LiveStoreContextRunning',
|
16
|
-
)
|
17
|
-
|
18
|
-
export type DeferredStoreContext = Deferred.Deferred<LiveStoreContextRunning, UnexpectedError>
|
19
|
-
export const DeferredStoreContext = Context.GenericTag<DeferredStoreContext>(
|
20
|
-
'@livestore/livestore/effect/DeferredStoreContext',
|
21
|
-
)
|
22
|
-
|
23
|
-
export type LiveStoreContextProps<GraphQLContext extends BaseGraphQLContext> = {
|
24
|
-
schema: LiveStoreSchema
|
25
|
-
/**
|
26
|
-
* The `storeId` can be used to isolate multiple stores from each other.
|
27
|
-
* So it can be useful for multi-tenancy scenarios.
|
28
|
-
*
|
29
|
-
* The `storeId` is also used for persistence.
|
30
|
-
*
|
31
|
-
* @default 'default'
|
32
|
-
*/
|
33
|
-
storeId?: string
|
34
|
-
graphQLOptions?: {
|
35
|
-
schema: Effect.Effect<GraphQLSchema, never, OtelTracer.OtelTracer>
|
36
|
-
makeContext: (db: SynchronousDatabaseWrapper, tracer: otel.Tracer, sessionId: string) => GraphQLContext
|
37
|
-
}
|
38
|
-
boot?: (store: Store<GraphQLContext, LiveStoreSchema>) => Effect.Effect<void, unknown, OtelTracer.OtelTracer>
|
39
|
-
adapter: Adapter
|
40
|
-
disableDevtools?: boolean
|
41
|
-
onBootStatus?: (status: BootStatus) => void
|
42
|
-
batchUpdates: (run: () => void) => void
|
43
|
-
}
|
44
|
-
|
45
|
-
export const LiveStoreContextLayer = <GraphQLContext extends BaseGraphQLContext>(
|
46
|
-
props: LiveStoreContextProps<GraphQLContext>,
|
47
|
-
): Layer.Layer<LiveStoreContextRunning, UnexpectedError | Cause.TimeoutException, OtelTracer.OtelTracer> =>
|
48
|
-
Layer.scoped(LiveStoreContextRunning, makeLiveStoreContext(props)).pipe(
|
49
|
-
Layer.withSpan('LiveStore'),
|
50
|
-
Layer.provide(LiveStoreContextDeferred),
|
51
|
-
)
|
52
|
-
|
53
|
-
export const LiveStoreContextDeferred = Layer.effect(
|
54
|
-
DeferredStoreContext,
|
55
|
-
Deferred.make<LiveStoreContextRunning, UnexpectedError>(),
|
56
|
-
)
|
57
|
-
|
58
|
-
export const makeLiveStoreContext = <GraphQLContext extends BaseGraphQLContext>({
|
9
|
+
export const makeLiveStoreContext = <TSchema extends LiveStoreSchema, TContext = {}>({
|
59
10
|
schema,
|
60
11
|
storeId = 'default',
|
61
|
-
|
12
|
+
context,
|
62
13
|
boot,
|
63
14
|
adapter,
|
64
15
|
disableDevtools,
|
65
16
|
onBootStatus,
|
66
17
|
batchUpdates,
|
67
|
-
}: LiveStoreContextProps<
|
68
|
-
LiveStoreContextRunning,
|
18
|
+
}: LiveStoreContextProps<TSchema, TContext>): Effect.Effect<
|
19
|
+
LiveStoreContextRunning['Type'],
|
69
20
|
UnexpectedError | Cause.TimeoutException,
|
70
21
|
DeferredStoreContext | Scope.Scope | OtelTracer.OtelTracer
|
71
22
|
> =>
|
72
23
|
pipe(
|
73
24
|
Effect.gen(function* () {
|
74
|
-
const graphQLOptions = yield* graphQLOptions_
|
75
|
-
? Effect.all({ schema: graphQLOptions_.schema, makeContext: Effect.succeed(graphQLOptions_.makeContext) })
|
76
|
-
: Effect.succeed(undefined)
|
77
|
-
|
78
25
|
const store = yield* createStore({
|
79
26
|
schema,
|
80
27
|
storeId,
|
81
|
-
|
28
|
+
context,
|
82
29
|
boot,
|
83
30
|
adapter,
|
84
31
|
disableDevtools,
|
@@ -87,9 +34,12 @@ export const makeLiveStoreContext = <GraphQLContext extends BaseGraphQLContext>(
|
|
87
34
|
})
|
88
35
|
|
89
36
|
globalThis.__debugLiveStore ??= {}
|
90
|
-
|
37
|
+
if (Object.keys(globalThis.__debugLiveStore).length === 0) {
|
38
|
+
globalThis.__debugLiveStore['_'] = store
|
39
|
+
}
|
40
|
+
globalThis.__debugLiveStore[storeId] = store
|
91
41
|
|
92
|
-
return { stage: 'running', store }
|
42
|
+
return { stage: 'running', store } as any as LiveStoreContextRunning['Type']
|
93
43
|
}),
|
94
44
|
Effect.tapErrorCause((cause) => Effect.flatMap(DeferredStoreContext, (def) => Deferred.failCause(def, cause))),
|
95
45
|
Effect.tap((storeCtx) => Effect.flatMap(DeferredStoreContext, (def) => Deferred.succeed(def, storeCtx))),
|
@@ -98,3 +48,16 @@ export const makeLiveStoreContext = <GraphQLContext extends BaseGraphQLContext>(
|
|
98
48
|
Effect.timeout(Duration.minutes(5)),
|
99
49
|
Effect.withSpan('@livestore/livestore/effect:makeLiveStoreContext'),
|
100
50
|
)
|
51
|
+
|
52
|
+
export const LiveStoreContextLayer = <TSchema extends LiveStoreSchema, TContext = {}>(
|
53
|
+
props: LiveStoreContextProps<TSchema, TContext>,
|
54
|
+
): Layer.Layer<LiveStoreContextRunning, UnexpectedError | Cause.TimeoutException, OtelTracer.OtelTracer> =>
|
55
|
+
Layer.scoped(LiveStoreContextRunning, makeLiveStoreContext(props)).pipe(
|
56
|
+
Layer.withSpan('LiveStore'),
|
57
|
+
Layer.provide(LiveStoreContextDeferred),
|
58
|
+
)
|
59
|
+
|
60
|
+
export const LiveStoreContextDeferred = Layer.effect(
|
61
|
+
DeferredStoreContext,
|
62
|
+
Deferred.make<LiveStoreContextRunning['Type'], UnexpectedError>(),
|
63
|
+
)
|
@@ -1,8 +1,7 @@
|
|
1
|
+
export { LiveStoreContextLayer, LiveStoreContextDeferred } from './LiveStore.js'
|
1
2
|
export {
|
2
|
-
LiveStoreContextLayer,
|
3
3
|
LiveStoreContextRunning as LiveStoreContext,
|
4
4
|
LiveStoreContextRunning,
|
5
|
-
LiveStoreContextDeferred,
|
6
5
|
DeferredStoreContext,
|
7
6
|
type LiveStoreContextProps,
|
8
|
-
} from '
|
7
|
+
} from '../store/create-store.js'
|