@livestore/common 0.3.0-dev.11 → 0.3.0-dev.12
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/adapter-types.d.ts +41 -18
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +12 -0
- package/dist/adapter-types.js.map +1 -1
- package/dist/devtools/devtools-bridge.d.ts +10 -7
- package/dist/devtools/devtools-bridge.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +101 -28
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +19 -3
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +24 -32
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +19 -10
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +210 -34
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +53 -6
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-messages.d.ts +2 -2
- package/dist/devtools/devtools-messages.d.ts.map +1 -1
- package/dist/devtools/devtools-messages.js +2 -2
- package/dist/devtools/devtools-messages.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +26 -13
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/connection.d.ts +31 -3
- package/dist/leader-thread/connection.d.ts.map +1 -1
- package/dist/leader-thread/connection.js +18 -3
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +51 -20
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +17 -5
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/pull-queue-set.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +4 -2
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +13 -8
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/types.d.ts +15 -12
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +0 -2
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/query-builder/api.d.ts +2 -2
- package/dist/query-builder/api.d.ts.map +1 -1
- package/dist/query-builder/impl.js.map +1 -1
- package/dist/query-builder/impl.test.js +16 -1
- package/dist/query-builder/impl.test.js.map +1 -1
- package/dist/query-info.d.ts +3 -3
- package/dist/query-info.d.ts.map +1 -1
- package/dist/schema/EventId.d.ts +1 -0
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +3 -0
- package/dist/schema/EventId.js.map +1 -1
- package/dist/schema/mutations.d.ts +1 -1
- package/dist/schema/system-tables.d.ts +1 -1
- package/dist/schema-management/migrations.d.ts +2 -2
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +6 -1
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +3 -5
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +20 -9
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/src/adapter-types.ts +35 -17
- package/src/devtools/devtools-bridge.ts +10 -7
- package/src/devtools/devtools-messages-client-session.ts +26 -10
- package/src/devtools/devtools-messages-common.ts +37 -8
- package/src/devtools/devtools-messages-leader.ts +73 -12
- package/src/devtools/devtools-messages.ts +2 -2
- package/src/leader-thread/LeaderSyncProcessor.ts +31 -16
- package/src/leader-thread/connection.ts +48 -3
- package/src/leader-thread/leader-worker-devtools.ts +80 -23
- package/src/leader-thread/make-leader-thread-layer.ts +20 -8
- package/src/leader-thread/recreate-db.ts +19 -10
- package/src/leader-thread/types.ts +16 -13
- package/src/query-builder/api.ts +3 -3
- package/src/query-builder/impl.test.ts +22 -1
- package/src/query-builder/impl.ts +2 -2
- package/src/query-info.ts +3 -3
- package/src/schema/EventId.ts +4 -0
- package/src/schema-management/migrations.ts +9 -5
- package/src/sync/ClientSessionSyncProcessor.ts +22 -11
- package/src/version.ts +1 -1
@@ -41,6 +41,7 @@ export const migrateDb = ({ db, schema, onProgress, }) => Effect.gen(function* (
|
|
41
41
|
...Array.from(schema.tables.values()).filter((_) => _.sqliteDef.name !== SCHEMA_META_TABLE),
|
42
42
|
]);
|
43
43
|
const tablesToMigrate = new Set();
|
44
|
+
const migrationsReportEntries = [];
|
44
45
|
for (const tableDef of tableDefs) {
|
45
46
|
const tableAst = tableDef.sqliteDef.ast;
|
46
47
|
const tableName = tableAst.name;
|
@@ -48,7 +49,10 @@ export const migrateDb = ({ db, schema, onProgress, }) => Effect.gen(function* (
|
|
48
49
|
const schemaHash = SqliteAst.hash(tableAst);
|
49
50
|
if (schemaHash !== dbSchemaHash) {
|
50
51
|
tablesToMigrate.add({ tableAst, schemaHash });
|
51
|
-
|
52
|
+
migrationsReportEntries.push({
|
53
|
+
tableName,
|
54
|
+
hashes: { expected: schemaHash, actual: dbSchemaHash },
|
55
|
+
});
|
52
56
|
}
|
53
57
|
}
|
54
58
|
let processedTables = 0;
|
@@ -60,6 +64,7 @@ export const migrateDb = ({ db, schema, onProgress, }) => Effect.gen(function* (
|
|
60
64
|
yield* onProgress({ done: processedTables, total: tablesCount });
|
61
65
|
}
|
62
66
|
}
|
67
|
+
return { migrations: migrationsReportEntries };
|
63
68
|
});
|
64
69
|
export const migrateTable = ({ db, tableAst, schemaHash = SqliteAst.hash(tableAst), behaviour, skipMetaTable = false, }) => Effect.gen(function* () {
|
65
70
|
// console.log(`Migrating table '${tableAst.name}'...`)
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/schema-management/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAKxE,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,eAAe,EACf,wBAAwB,EACxB,YAAY,GACb,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAEhC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAE5D,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;AAEnF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAY,EAAgC,EAAE,CAC9E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,KAAK,CAAC,CAAC,YAAY,CAAC;QAClB,EAAE;QACF,QAAQ,EAAE,wBAAwB,CAAC,SAAS,CAAC,GAAG;QAChD,SAAS,EAAE,sBAAsB;KAClC,CAAC,CAAA;IAEF,OAAO;QACL,mBAAmB,EAAE,GAAG,EAAE,CACxB,QAAQ,CAAyB,EAAE,EAAE,GAAG,CAAA,iBAAiB,2BAA2B,EAAE,CAAC;QAEzF,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE;YAC3B,SAAS,CACP,EAAE,EACF,GAAG,CAAA,0BAA0B,2BAA2B,wFAAwF,EAChJ;gBACE,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CACF,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC,CAAC,CAAA;AAEJ,iFAAiF;AACjF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EACxB,EAAE,EACF,MAAM,EACN,UAAU,GAKX,
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/schema-management/migrations.ts"],"names":[],"mappings":"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"}
|
@@ -1,10 +1,10 @@
|
|
1
1
|
import type { Runtime, Scope } from '@livestore/utils/effect';
|
2
|
-
import { Effect } from '@livestore/utils/effect';
|
2
|
+
import { Effect, Subscribable } from '@livestore/utils/effect';
|
3
3
|
import * as otel from '@opentelemetry/api';
|
4
4
|
import type { ClientSession, UnexpectedError } from '../adapter-types.js';
|
5
5
|
import { type LiveStoreSchema } from '../schema/mod.js';
|
6
6
|
import * as MutationEvent from '../schema/MutationEvent.js';
|
7
|
-
import
|
7
|
+
import * as SyncState from './syncstate.js';
|
8
8
|
/**
|
9
9
|
* Rebase behaviour:
|
10
10
|
* - We continously pull mutations from the leader and apply them to the local store.
|
@@ -36,8 +36,6 @@ export interface ClientSessionSyncProcessor {
|
|
36
36
|
writeTables: Set<string>;
|
37
37
|
};
|
38
38
|
boot: Effect.Effect<void, UnexpectedError, Scope.Scope>;
|
39
|
-
|
40
|
-
current: SyncState;
|
41
|
-
};
|
39
|
+
syncState: Subscribable.Subscribable<SyncState.SyncState>;
|
42
40
|
}
|
43
41
|
//# sourceMappingURL=ClientSessionSyncProcessor.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ClientSessionSyncProcessor.d.ts","sourceRoot":"","sources":["../../src/sync/ClientSessionSyncProcessor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,MAAM,
|
1
|
+
{"version":3,"file":"ClientSessionSyncProcessor.d.ts","sourceRoot":"","sources":["../../src/sync/ClientSessionSyncProcessor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,MAAM,EAAyB,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACrF,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAEzE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAC3D,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B,sFAQxC;IACD,MAAM,EAAE,eAAe,CAAA;IACvB,aAAa,EAAE,aAAa,CAAA;IAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACrC,aAAa,EAAE,CACb,oBAAoB,EAAE,aAAa,CAAC,iBAAiB,EACrD,OAAO,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC;QAAC,aAAa,EAAE,OAAO,CAAA;KAAE,KAC3D;QACH,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;QACxB,gBAAgB,EAAE,UAAU,GAAG,SAAS,CAAA;KACzC,CAAA;IACD,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,IAAI,CAAA;IACzC,aAAa,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;IAC5C,IAAI,EAAE,IAAI,CAAC,IAAI,CAAA;CAChB,KAAG,0BA0KH,CAAA;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,CACJ,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,iBAAiB,CAAC,EACrD,OAAO,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAAE,KACnC;QACH,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;KACzB,CAAA;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IAEvD,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;CAC1D"}
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import { LS_DEV, shouldNeverHappen, TRACE_VERBOSE } from '@livestore/utils';
|
2
|
-
import { Effect, Schema, Stream } from '@livestore/utils/effect';
|
2
|
+
import { Effect, Queue, Schema, Stream, Subscribable } from '@livestore/utils/effect';
|
3
3
|
import * as otel from '@opentelemetry/api';
|
4
4
|
import * as EventId from '../schema/EventId.js';
|
5
5
|
import * as MutationEvent from '../schema/MutationEvent.js';
|
6
|
-
import
|
6
|
+
import * as SyncState from './syncstate.js';
|
7
7
|
/**
|
8
8
|
* Rebase behaviour:
|
9
9
|
* - We continously pull mutations from the leader and apply them to the local store.
|
@@ -16,14 +16,15 @@ import { SyncState, updateSyncState } from './syncstate.js';
|
|
16
16
|
export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime, applyMutation, rollback, refreshTables, span, }) => {
|
17
17
|
const mutationEventSchema = MutationEvent.makeMutationEventSchemaMemo(schema);
|
18
18
|
const syncStateRef = {
|
19
|
-
current: new SyncState({
|
20
|
-
localHead: clientSession.leaderThread.
|
21
|
-
upstreamHead: clientSession.leaderThread.
|
19
|
+
current: new SyncState.SyncState({
|
20
|
+
localHead: clientSession.leaderThread.initialState.leaderHead,
|
21
|
+
upstreamHead: clientSession.leaderThread.initialState.leaderHead,
|
22
22
|
pending: [],
|
23
23
|
// TODO init rollbackTail from leader to be ready for backend rebasing
|
24
24
|
rollbackTail: [],
|
25
25
|
}),
|
26
26
|
};
|
27
|
+
const syncStateUpdateQueue = Queue.unbounded().pipe(Effect.runSync);
|
27
28
|
const isLocalEvent = (mutationEventEncoded) => {
|
28
29
|
const mutationDef = schema.mutations.get(mutationEventEncoded.mutation);
|
29
30
|
return mutationDef.options.localOnly;
|
@@ -37,7 +38,7 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
37
38
|
baseEventId = nextIdPair.id;
|
38
39
|
return new MutationEvent.EncodedWithMeta(Schema.encodeUnknownSync(mutationEventSchema)({ ...mutationEvent, ...nextIdPair }));
|
39
40
|
});
|
40
|
-
const updateResult = updateSyncState({
|
41
|
+
const updateResult = SyncState.updateSyncState({
|
41
42
|
syncState: syncStateRef.current,
|
42
43
|
payload: { _tag: 'local-push', newEvents: encodedMutationEvents },
|
43
44
|
isLocalEvent,
|
@@ -51,6 +52,7 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
51
52
|
return shouldNeverHappen(`Expected advance, got ${updateResult._tag}`);
|
52
53
|
}
|
53
54
|
syncStateRef.current = updateResult.newSyncState;
|
55
|
+
syncStateUpdateQueue.offer(updateResult.newSyncState).pipe(Effect.runSync);
|
54
56
|
const writeTables = new Set();
|
55
57
|
for (const mutationEvent of updateResult.newEvents) {
|
56
58
|
// TODO avoid encoding and decoding here again
|
@@ -74,7 +76,7 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
74
76
|
if (clientSession.devtools.enabled) {
|
75
77
|
yield* clientSession.devtools.pullLatch.await;
|
76
78
|
}
|
77
|
-
const updateResult = updateSyncState({
|
79
|
+
const updateResult = SyncState.updateSyncState({
|
78
80
|
syncState: syncStateRef.current,
|
79
81
|
payload,
|
80
82
|
isLocalEvent,
|
@@ -85,6 +87,7 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
85
87
|
throw new Error('TODO: implement reject in client-session-sync-queue for pull');
|
86
88
|
}
|
87
89
|
syncStateRef.current = updateResult.newSyncState;
|
90
|
+
syncStateUpdateQueue.offer(updateResult.newSyncState).pipe(Effect.runSync);
|
88
91
|
if (updateResult._tag === 'rebase') {
|
89
92
|
span.addEvent('pull:rebase', {
|
90
93
|
payloadTag: payload._tag,
|
@@ -95,7 +98,7 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
95
98
|
remaining,
|
96
99
|
});
|
97
100
|
if (LS_DEV) {
|
98
|
-
|
101
|
+
Effect.logDebug('pull:rebase: rollback', updateResult.eventsToRollback.length, ...updateResult.eventsToRollback.map((_) => _.toJSON())).pipe(Effect.provide(runtime), Effect.runSync);
|
99
102
|
}
|
100
103
|
for (let i = updateResult.eventsToRollback.length - 1; i >= 0; i--) {
|
101
104
|
const event = updateResult.eventsToRollback[i];
|
@@ -135,7 +138,15 @@ export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime,
|
|
135
138
|
return {
|
136
139
|
push,
|
137
140
|
boot,
|
138
|
-
|
141
|
+
syncState: Subscribable.make({
|
142
|
+
get: Effect.gen(function* () {
|
143
|
+
const syncState = syncStateRef.current;
|
144
|
+
if (syncStateRef === undefined)
|
145
|
+
return shouldNeverHappen('Not initialized');
|
146
|
+
return syncState;
|
147
|
+
}),
|
148
|
+
changes: Stream.fromQueue(syncStateUpdateQueue),
|
149
|
+
}),
|
139
150
|
};
|
140
151
|
};
|
141
152
|
//# sourceMappingURL=ClientSessionSyncProcessor.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ClientSessionSyncProcessor.js","sourceRoot":"","sources":["../../src/sync/ClientSessionSyncProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAE3E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;
|
1
|
+
{"version":3,"file":"ClientSessionSyncProcessor.js","sourceRoot":"","sources":["../../src/sync/ClientSessionSyncProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAE3E,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACrF,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAG1C,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAE/C,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAC3D,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,EAC7C,MAAM,EACN,aAAa,EACb,OAAO,EACP,aAAa,EACb,QAAQ,EACR,aAAa,EACb,IAAI,GAeL,EAA8B,EAAE;IAC/B,MAAM,mBAAmB,GAAG,aAAa,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAA;IAE7E,MAAM,YAAY,GAAG;QACnB,OAAO,EAAE,IAAI,SAAS,CAAC,SAAS,CAAC;YAC/B,SAAS,EAAE,aAAa,CAAC,YAAY,CAAC,YAAY,CAAC,UAAU;YAC7D,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,YAAY,CAAC,UAAU;YAChE,OAAO,EAAE,EAAE;YACX,sEAAsE;YACtE,YAAY,EAAE,EAAE;SACjB,CAAC;KACH,CAAA;IAED,MAAM,oBAAoB,GAAG,KAAK,CAAC,SAAS,EAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAExF,MAAM,YAAY,GAAG,CAAC,oBAAmD,EAAE,EAAE;QAC3E,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,QAAQ,CAAE,CAAA;QACxE,OAAO,WAAW,CAAC,OAAO,CAAC,SAAS,CAAA;IACtC,CAAC,CAAA;IAED,MAAM,IAAI,GAAuC,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;QAC1E,sBAAsB;QAEtB,IAAI,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAA;QAChD,MAAM,qBAAqB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE;YACxD,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAE,CAAA;YACjE,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAC/E,WAAW,GAAG,UAAU,CAAC,EAAE,CAAA;YAC3B,OAAO,IAAI,aAAa,CAAC,eAAe,CACtC,MAAM,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,aAAa,EAAE,GAAG,UAAU,EAAE,CAAC,CACnF,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,SAAS,CAAC,eAAe,CAAC;YAC7C,SAAS,EAAE,YAAY,CAAC,OAAO;YAC/B,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,qBAAqB,EAAE;YACjE,YAAY;YACZ,YAAY,EAAE,aAAa,CAAC,cAAc;SAC3C,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;YAC1B,SAAS,EAAE,qBAAqB,CAAC,MAAM;YACvC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;SACvE,CAAC,CAAA;QAEF,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,iBAAiB,CAAC,yBAAyB,YAAY,CAAC,IAAI,EAAE,CAAC,CAAA;QACxE,CAAC;QAED,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC,YAAY,CAAA;QAChD,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAE1E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;QACrC,KAAK,MAAM,aAAa,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;YACnD,8CAA8C;YAC9C,MAAM,oBAAoB,GAAG,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,aAAa,CAAC,CAAA;YAClF,MAAM,GAAG,GAAG,aAAa,CAAC,oBAAoB,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;YACrF,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;gBACpC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACxB,CAAC;YACD,aAAa,CAAC,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,CAAA;QAC5D,CAAC;QAED,+GAA+G;QAC/G,aAAa,CAAC,YAAY,CAAC,SAAS;aACjC,IAAI,CAAC,qBAAqB,CAAC;aAC3B,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QAE1E,OAAO,EAAE,WAAW,EAAE,CAAA;IACxB,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;IAEnE,MAAM,IAAI,GAAuC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnE,KAAK,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CACnD,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CACpC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,oEAAoE;YACpE,IAAI,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACnC,KAAK,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAA;YAC/C,CAAC;YAED,MAAM,YAAY,GAAG,SAAS,CAAC,eAAe,CAAC;gBAC7C,SAAS,EAAE,YAAY,CAAC,OAAO;gBAC/B,OAAO;gBACP,YAAY;gBACZ,YAAY,EAAE,aAAa,CAAC,cAAc;aAC3C,CAAC,CAAA;YAEF,IAAI,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACnC,QAAQ,CAAA;gBACR,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;YACjF,CAAC;YAED,YAAY,CAAC,OAAO,GAAG,YAAY,CAAC,YAAY,CAAA;YAChD,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAE1E,IAAI,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACnC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;oBAC3B,UAAU,EAAE,OAAO,CAAC,IAAI;oBACxB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC5D,cAAc,EAAE,YAAY,CAAC,SAAS,CAAC,MAAM;oBAC7C,aAAa,EAAE,YAAY,CAAC,gBAAgB,CAAC,MAAM;oBACnD,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC7D,SAAS;iBACV,CAAC,CAAA;gBACF,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,QAAQ,CACb,uBAAuB,EACvB,YAAY,CAAC,gBAAgB,CAAC,MAAM,EACpC,GAAG,YAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CACxD,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;gBACjD,CAAC;gBAED,KAAK,IAAI,CAAC,GAAG,YAAY,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnE,MAAM,KAAK,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAE,CAAA;oBAC/C,IAAI,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;wBAChC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;wBACrC,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAA;oBACzC,CAAC;gBACH,CAAC;gBAED,aAAa,CAAC,YAAY,CAAC,SAAS;qBACjC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC;qBACvC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;YAC5E,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;oBAC5B,UAAU,EAAE,OAAO,CAAC,IAAI;oBACxB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC5D,cAAc,EAAE,YAAY,CAAC,SAAS,CAAC,MAAM;oBAC7C,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC7D,SAAS;iBACV,CAAC,CAAA;YACJ,CAAC;YAED,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAM;YAE/C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;YACrC,KAAK,MAAM,aAAa,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;gBACnD,MAAM,oBAAoB,GAAG,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,aAAa,CAAC,CAAA;gBAClF,MAAM,GAAG,GAAG,aAAa,CAAC,oBAAoB,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;gBACrF,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;oBACpC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBACxB,CAAC;gBAED,aAAa,CAAC,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,CAAA;YAC5D,CAAC;YAED,aAAa,CAAC,WAAW,CAAC,CAAA;QAC5B,CAAC,CAAC,CACH,EACD,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,OAAO,EAAE,mEAAmE;QACnF,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,UAAU,CAClB,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC;YAC3B,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACvB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAA;gBACtC,IAAI,YAAY,KAAK,SAAS;oBAAE,OAAO,iBAAiB,CAAC,iBAAiB,CAAC,CAAA;gBAC3E,OAAO,SAAS,CAAA;YAClB,CAAC,CAAC;YACF,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC;SAChD,CAAC;KACkC,CAAA;AACxC,CAAC,CAAA"}
|
package/dist/version.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
export declare const liveStoreVersion: "0.3.0-dev.
|
1
|
+
export declare const liveStoreVersion: "0.3.0-dev.12";
|
2
2
|
/**
|
3
3
|
* This version number is incremented whenever the internal storage format changes in a breaking way.
|
4
4
|
* Whenever this version changes, LiveStore will start with fresh database files. Old database files are not deleted.
|
package/dist/version.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
// TODO bring back when Expo and Playwright supports `with` imports
|
2
2
|
// import packageJson from '../package.json' with { type: 'json' }
|
3
3
|
// export const liveStoreVersion = packageJson.version
|
4
|
-
export const liveStoreVersion = '0.3.0-dev.
|
4
|
+
export const liveStoreVersion = '0.3.0-dev.12';
|
5
5
|
/**
|
6
6
|
* This version number is incremented whenever the internal storage format changes in a breaking way.
|
7
7
|
* Whenever this version changes, LiveStore will start with fresh database files. Old database files are not deleted.
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@livestore/common",
|
3
|
-
"version": "0.3.0-dev.
|
3
|
+
"version": "0.3.0-dev.12",
|
4
4
|
"type": "module",
|
5
5
|
"sideEffects": false,
|
6
6
|
"exports": {
|
@@ -54,8 +54,8 @@
|
|
54
54
|
"graphology": "0.26.0-alpha1",
|
55
55
|
"graphology-dag": "0.4.1",
|
56
56
|
"graphology-types": "0.24.8",
|
57
|
-
"@livestore/db-schema": "0.3.0-dev.
|
58
|
-
"@livestore/utils": "0.3.0-dev.
|
57
|
+
"@livestore/db-schema": "0.3.0-dev.12",
|
58
|
+
"@livestore/utils": "0.3.0-dev.12"
|
59
59
|
},
|
60
60
|
"devDependencies": {
|
61
61
|
"vitest": "^2.1.4"
|
package/src/adapter-types.ts
CHANGED
@@ -2,8 +2,7 @@ import type { Cause, Queue, Scope, SubscriptionRef, WebChannel } from '@livestor
|
|
2
2
|
import { Effect, Schema, Stream } from '@livestore/utils/effect'
|
3
3
|
|
4
4
|
import type * as Devtools from './devtools/index.js'
|
5
|
-
import type { EventId } from './schema/
|
6
|
-
import type { LiveStoreSchema, MutationEvent } from './schema/mod.js'
|
5
|
+
import type { EventId, LiveStoreSchema, MutationEvent } from './schema/mod.js'
|
7
6
|
import type { InvalidPushError } from './sync/sync.js'
|
8
7
|
import type { PayloadUpstream, SyncState } from './sync/syncstate.js'
|
9
8
|
import type { PreparedBindValues } from './util.js'
|
@@ -26,7 +25,7 @@ export type SqliteDbChangeset = {
|
|
26
25
|
apply: () => void
|
27
26
|
}
|
28
27
|
|
29
|
-
export
|
28
|
+
export interface ClientSession {
|
30
29
|
/** SQLite database with synchronous API running in the same thread (usually in-memory) */
|
31
30
|
sqliteDb: SqliteDb
|
32
31
|
devtools: { enabled: false } | { enabled: true; pullLatch: Effect.Latch; pushLatch: Effect.Latch }
|
@@ -39,18 +38,24 @@ export type ClientSession = {
|
|
39
38
|
leaderThread: ClientSessionLeaderThreadProxy
|
40
39
|
}
|
41
40
|
|
42
|
-
export
|
41
|
+
export interface ClientSessionLeaderThreadProxy {
|
43
42
|
mutations: {
|
44
43
|
pull: Stream.Stream<{ payload: PayloadUpstream; remaining: number }, UnexpectedError>
|
45
44
|
push(batch: ReadonlyArray<MutationEvent.AnyEncoded>): Effect.Effect<void, UnexpectedError | InvalidPushError>
|
46
|
-
|
45
|
+
}
|
46
|
+
/** The initial state after the leader thread has booted */
|
47
|
+
readonly initialState: {
|
48
|
+
/** The latest mutation event id during boot. Used for the client session to resume syncing. */
|
49
|
+
readonly leaderHead: EventId.EventId
|
50
|
+
/** The migrations report from the leader thread */
|
51
|
+
readonly migrationsReport: MigrationsReport
|
47
52
|
}
|
48
53
|
export: Effect.Effect<Uint8Array, UnexpectedError>
|
49
54
|
getMutationLogData: Effect.Effect<Uint8Array, UnexpectedError>
|
50
55
|
getSyncState: Effect.Effect<SyncState, UnexpectedError>
|
51
56
|
networkStatus: SubscriptionRef.SubscriptionRef<NetworkStatus>
|
52
57
|
/** For debugging purposes it can be useful to manually trigger devtools messages (e.g. to reset the database) */
|
53
|
-
sendDevtoolsMessage: (message: Devtools.
|
58
|
+
sendDevtoolsMessage: (message: Devtools.Leader.MessageToApp) => Effect.Effect<void, UnexpectedError>
|
54
59
|
}
|
55
60
|
|
56
61
|
/**
|
@@ -58,7 +63,7 @@ export type ClientSessionLeaderThreadProxy = {
|
|
58
63
|
* Always assumes a synchronous SQLite build with the `bytecode` and `session` extensions enabled.
|
59
64
|
* Can be either in-memory or persisted to disk.
|
60
65
|
*/
|
61
|
-
export
|
66
|
+
export interface SqliteDb<TReq = any, TMetadata extends TReq = TReq> {
|
62
67
|
_tag: 'SqliteDb'
|
63
68
|
metadata: TMetadata
|
64
69
|
prepare(queryStr: string): PreparedStatement
|
@@ -102,12 +107,11 @@ export type ResetMode = 'all-data' | 'only-app-db'
|
|
102
107
|
export const NetworkStatus = Schema.Struct({
|
103
108
|
isConnected: Schema.Boolean,
|
104
109
|
timestampMs: Schema.Number,
|
110
|
+
/** Whether the network status devtools latch is closed. Used to simulate network disconnection. */
|
111
|
+
latchClosed: Schema.Boolean,
|
105
112
|
})
|
106
113
|
|
107
|
-
export type NetworkStatus =
|
108
|
-
isConnected: boolean
|
109
|
-
timestampMs: number
|
110
|
-
}
|
114
|
+
export type NetworkStatus = typeof NetworkStatus.Type
|
111
115
|
|
112
116
|
export const BootStateProgress = Schema.Struct({
|
113
117
|
done: Schema.Number,
|
@@ -199,7 +203,7 @@ export type MigrationHooks = {
|
|
199
203
|
|
200
204
|
export type MigrationHook = (db: SqliteDb) => void | Promise<void> | Effect.Effect<void, unknown>
|
201
205
|
|
202
|
-
export
|
206
|
+
export interface MigrationOptionsFromMutationLog<TSchema extends LiveStoreSchema = LiveStoreSchema> {
|
203
207
|
strategy: 'from-mutation-log'
|
204
208
|
/**
|
205
209
|
* Mutations to exclude in the mutation log
|
@@ -213,13 +217,11 @@ export type MigrationOptionsFromMutationLog<TSchema extends LiveStoreSchema = Li
|
|
213
217
|
}
|
214
218
|
}
|
215
219
|
|
216
|
-
export
|
217
|
-
Devtools.
|
218
|
-
Devtools.MessageFromAppClientSession
|
219
|
-
>
|
220
|
+
export interface ClientSessionDevtoolsChannel
|
221
|
+
extends WebChannel.WebChannel<Devtools.ClientSession.MessageToApp, Devtools.ClientSession.MessageFromApp> {}
|
220
222
|
|
221
223
|
export type ConnectDevtoolsToStore = (
|
222
|
-
storeDevtoolsChannel:
|
224
|
+
storeDevtoolsChannel: ClientSessionDevtoolsChannel,
|
223
225
|
) => Effect.Effect<void, UnexpectedError, Scope.Scope>
|
224
226
|
|
225
227
|
export type Adapter = (opts: {
|
@@ -231,3 +233,19 @@ export type Adapter = (opts: {
|
|
231
233
|
shutdown: (cause: Cause.Cause<any>) => Effect.Effect<void>
|
232
234
|
connectDevtoolsToStore: ConnectDevtoolsToStore
|
233
235
|
}) => Effect.Effect<ClientSession, UnexpectedError, Scope.Scope>
|
236
|
+
|
237
|
+
export const MigrationsReportEntry = Schema.Struct({
|
238
|
+
tableName: Schema.String,
|
239
|
+
hashes: Schema.Struct({
|
240
|
+
expected: Schema.Number,
|
241
|
+
actual: Schema.optional(Schema.Number),
|
242
|
+
}),
|
243
|
+
})
|
244
|
+
|
245
|
+
export const MigrationsReport = Schema.Struct({
|
246
|
+
migrations: Schema.Array(MigrationsReportEntry),
|
247
|
+
})
|
248
|
+
|
249
|
+
export type MigrationsReport = typeof MigrationsReport.Type
|
250
|
+
|
251
|
+
export type MigrationsReportEntry = typeof MigrationsReportEntry.Type
|
@@ -1,14 +1,17 @@
|
|
1
|
-
import type { Effect,
|
1
|
+
import type { Effect, WebChannel } from '@livestore/utils/effect'
|
2
2
|
|
3
3
|
import type * as Devtools from './devtools-messages.js'
|
4
4
|
|
5
5
|
export type PrepareDevtoolsBridge = {
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
webchannels: {
|
7
|
+
leader: WebChannel.WebChannel<Devtools.Leader.MessageFromApp, Devtools.Leader.MessageToApp>
|
8
|
+
clientSession: WebChannel.WebChannel<Devtools.ClientSession.MessageFromApp, Devtools.ClientSession.MessageToApp>
|
9
|
+
}
|
10
|
+
clientInfo: {
|
11
|
+
clientId: string
|
12
|
+
sessionId: string
|
13
|
+
isLeader: boolean
|
14
|
+
}
|
11
15
|
copyToClipboard: (text: string) => Effect.Effect<void>
|
12
16
|
sendEscapeKey?: Effect.Effect<void>
|
13
|
-
isLeader: boolean
|
14
17
|
}
|
@@ -1,8 +1,9 @@
|
|
1
1
|
import { Schema } from '@livestore/utils/effect'
|
2
2
|
|
3
3
|
import { DebugInfo } from '../debug-info.js'
|
4
|
+
import { EventId } from '../schema/mod.js'
|
4
5
|
import { PreparedBindValues } from '../util.js'
|
5
|
-
import {
|
6
|
+
import { LSDClientSessionChannelMessage, LSDClientSessionReqResMessage } from './devtools-messages-common.js'
|
6
7
|
|
7
8
|
export class DebugInfoReq extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoReq', {}) {}
|
8
9
|
|
@@ -39,6 +40,13 @@ export class DebugInfoRerunQueryRes extends LSDClientSessionReqResMessage(
|
|
39
40
|
{},
|
40
41
|
) {}
|
41
42
|
|
43
|
+
export class SyncHeadSubscribe extends LSDClientSessionReqResMessage('LSD.ClientSession.SyncHeadSubscribe', {}) {}
|
44
|
+
export class SyncHeadUnsubscribe extends LSDClientSessionReqResMessage('LSD.ClientSession.SyncHeadUnsubscribe', {}) {}
|
45
|
+
export class SyncHeadRes extends LSDClientSessionReqResMessage('LSD.ClientSession.SyncHeadRes', {
|
46
|
+
local: EventId.EventId,
|
47
|
+
upstream: EventId.EventId,
|
48
|
+
}) {}
|
49
|
+
|
42
50
|
export class ReactivityGraphSubscribe extends LSDClientSessionReqResMessage(
|
43
51
|
'LSD.ClientSession.ReactivityGraphSubscribe',
|
44
52
|
{
|
@@ -78,7 +86,13 @@ export class LiveQueriesRes extends LSDClientSessionReqResMessage('LSD.ClientSes
|
|
78
86
|
liveQueries: Schema.Array(SerializedLiveQuery),
|
79
87
|
}) {}
|
80
88
|
|
81
|
-
export
|
89
|
+
export class Ping extends LSDClientSessionReqResMessage('LSD.ClientSession.Ping', {}) {}
|
90
|
+
|
91
|
+
export class Pong extends LSDClientSessionReqResMessage('LSD.ClientSession.Pong', {}) {}
|
92
|
+
|
93
|
+
export class Disconnect extends LSDClientSessionChannelMessage('LSD.ClientSession.Disconnect', {}) {}
|
94
|
+
|
95
|
+
export const MessageToApp = Schema.Union(
|
82
96
|
DebugInfoReq,
|
83
97
|
DebugInfoHistorySubscribe,
|
84
98
|
DebugInfoHistoryUnsubscribe,
|
@@ -89,13 +103,14 @@ export const MessageToAppClientSession = Schema.Union(
|
|
89
103
|
LiveQueriesSubscribe,
|
90
104
|
LiveQueriesUnsubscribe,
|
91
105
|
Disconnect,
|
92
|
-
|
93
|
-
|
94
|
-
|
106
|
+
Ping,
|
107
|
+
SyncHeadSubscribe,
|
108
|
+
SyncHeadUnsubscribe,
|
109
|
+
).annotations({ identifier: 'LSD.ClientSession.MessageToApp' })
|
95
110
|
|
96
|
-
export type
|
111
|
+
export type MessageToApp = typeof MessageToApp.Type
|
97
112
|
|
98
|
-
export const
|
113
|
+
export const MessageFromApp = Schema.Union(
|
99
114
|
DebugInfoRes,
|
100
115
|
DebugInfoHistoryRes,
|
101
116
|
DebugInfoResetRes,
|
@@ -103,7 +118,8 @@ export const MessageFromAppClientSession = Schema.Union(
|
|
103
118
|
ReactivityGraphRes,
|
104
119
|
LiveQueriesRes,
|
105
120
|
Disconnect,
|
106
|
-
|
107
|
-
|
121
|
+
Pong,
|
122
|
+
SyncHeadRes,
|
123
|
+
).annotations({ identifier: 'LSD.ClientSession.MessageFromApp' })
|
108
124
|
|
109
|
-
export type
|
125
|
+
export type MessageFromApp = typeof MessageFromApp.Type
|
@@ -2,10 +2,10 @@ import { Schema } from '@livestore/utils/effect'
|
|
2
2
|
|
3
3
|
import { liveStoreVersion as pkgVersion } from '../version.js'
|
4
4
|
|
5
|
-
const requestId = Schema.String
|
6
|
-
const clientId = Schema.String
|
7
|
-
const sessionId = Schema.String
|
8
|
-
const liveStoreVersion = Schema.Literal(pkgVersion)
|
5
|
+
export const requestId = Schema.String
|
6
|
+
export const clientId = Schema.String
|
7
|
+
export const sessionId = Schema.String
|
8
|
+
export const liveStoreVersion = Schema.Literal(pkgVersion)
|
9
9
|
|
10
10
|
export const LSDMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(tag: Tag, fields: Fields) =>
|
11
11
|
Schema.TaggedStruct(tag, {
|
@@ -15,6 +15,7 @@ export const LSDMessage = <Tag extends string, Fields extends Schema.Struct.Fiel
|
|
15
15
|
|
16
16
|
export const LSDChannelMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(tag: Tag, fields: Fields) =>
|
17
17
|
LSDMessage(tag, {
|
18
|
+
clientId,
|
18
19
|
...fields,
|
19
20
|
})
|
20
21
|
|
@@ -45,8 +46,36 @@ export const LSDReqResMessage = <Tag extends string, Fields extends Schema.Struc
|
|
45
46
|
...fields,
|
46
47
|
})
|
47
48
|
|
48
|
-
|
49
|
-
|
50
|
-
|
49
|
+
type DefaultFields = {
|
50
|
+
readonly requestId: typeof Schema.String
|
51
|
+
readonly liveStoreVersion: typeof liveStoreVersion
|
52
|
+
readonly clientId: typeof Schema.String
|
53
|
+
}
|
51
54
|
|
52
|
-
export
|
55
|
+
export const LeaderReqResMessage = <
|
56
|
+
Tag extends string,
|
57
|
+
ReqFields extends Schema.Struct.Fields,
|
58
|
+
ResFields extends Schema.Struct.Fields,
|
59
|
+
>(
|
60
|
+
tag: Tag,
|
61
|
+
fields: {
|
62
|
+
payload: ReqFields
|
63
|
+
success: ResFields
|
64
|
+
},
|
65
|
+
): {
|
66
|
+
Request: Schema.TaggedStruct<`${Tag}.Request`, ReqFields & DefaultFields>
|
67
|
+
Response: Schema.TaggedStruct<`${Tag}.Response`, ResFields & DefaultFields>
|
68
|
+
} => {
|
69
|
+
return {
|
70
|
+
Request: Schema.TaggedStruct(`${tag}.Request`, {
|
71
|
+
requestId,
|
72
|
+
liveStoreVersion,
|
73
|
+
...fields.payload,
|
74
|
+
}).annotations({ identifier: `${tag}.Request` }),
|
75
|
+
Response: Schema.TaggedStruct(`${tag}.Response`, {
|
76
|
+
requestId,
|
77
|
+
liveStoreVersion,
|
78
|
+
...fields.success,
|
79
|
+
}).annotations({ identifier: `${tag}.Response` }),
|
80
|
+
} as any
|
81
|
+
}
|