@livestore/common 0.3.0-dev.1 → 0.3.0-dev.11
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 +47 -35
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js.map +1 -1
- package/dist/derived-mutations.d.ts +4 -4
- package/dist/derived-mutations.d.ts.map +1 -1
- package/dist/derived-mutations.test.js.map +1 -1
- package/dist/devtools/devtool-message-leader.d.ts +2 -0
- package/dist/devtools/devtool-message-leader.d.ts.map +1 -0
- package/dist/devtools/devtool-message-leader.js +2 -0
- package/dist/devtools/devtool-message-leader.js.map +1 -0
- package/dist/devtools/devtools-bridge.d.ts +2 -1
- package/dist/devtools/devtools-bridge.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +297 -0
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-client-session.js +61 -0
- package/dist/devtools/devtools-messages-client-session.js.map +1 -0
- package/dist/devtools/devtools-messages-common.d.ts +65 -0
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-common.js +35 -0
- package/dist/devtools/devtools-messages-common.js.map +1 -0
- package/dist/devtools/devtools-messages-leader.d.ts +261 -0
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-leader.js +85 -0
- package/dist/devtools/devtools-messages-leader.js.map +1 -0
- package/dist/devtools/devtools-messages.d.ts +3 -592
- package/dist/devtools/devtools-messages.d.ts.map +1 -1
- package/dist/devtools/devtools-messages.js +3 -171
- package/dist/devtools/devtools-messages.js.map +1 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/init-singleton-tables.d.ts +2 -2
- package/dist/init-singleton-tables.d.ts.map +1 -1
- package/dist/init-singleton-tables.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +37 -0
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -0
- package/dist/leader-thread/LeaderSyncProcessor.js +432 -0
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
- package/dist/leader-thread/apply-mutation.d.ts +5 -2
- package/dist/leader-thread/apply-mutation.d.ts.map +1 -1
- package/dist/leader-thread/apply-mutation.js +41 -29
- package/dist/leader-thread/apply-mutation.js.map +1 -1
- package/dist/leader-thread/connection.d.ts +4 -4
- package/dist/leader-thread/connection.d.ts.map +1 -1
- package/dist/leader-thread/connection.js +5 -5
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/leader-sync-processor.d.ts +2 -2
- package/dist/leader-thread/leader-sync-processor.d.ts.map +1 -1
- package/dist/leader-thread/leader-sync-processor.js +20 -12
- package/dist/leader-thread/leader-sync-processor.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +37 -81
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +12 -11
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +33 -14
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/mutationlog.d.ts +6 -19
- package/dist/leader-thread/mutationlog.d.ts.map +1 -1
- package/dist/leader-thread/mutationlog.js +7 -6
- package/dist/leader-thread/mutationlog.js.map +1 -1
- package/dist/leader-thread/pull-queue-set.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +24 -18
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/types.d.ts +36 -16
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/mutation.d.ts +9 -2
- package/dist/mutation.d.ts.map +1 -1
- package/dist/mutation.js +5 -5
- package/dist/mutation.js.map +1 -1
- package/dist/query-builder/impl.d.ts +1 -1
- package/dist/rehydrate-from-mutationlog.d.ts +5 -5
- package/dist/rehydrate-from-mutationlog.d.ts.map +1 -1
- package/dist/rehydrate-from-mutationlog.js +13 -19
- package/dist/rehydrate-from-mutationlog.js.map +1 -1
- package/dist/schema/EventId.d.ts +16 -14
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +15 -7
- package/dist/schema/EventId.js.map +1 -1
- package/dist/schema/EventId.test.d.ts +2 -0
- package/dist/schema/EventId.test.d.ts.map +1 -0
- package/dist/schema/EventId.test.js +11 -0
- package/dist/schema/EventId.test.js.map +1 -0
- package/dist/schema/MutationEvent.d.ts +49 -80
- package/dist/schema/MutationEvent.d.ts.map +1 -1
- package/dist/schema/MutationEvent.js +32 -15
- package/dist/schema/MutationEvent.js.map +1 -1
- package/dist/schema/MutationEvent.test.d.ts +2 -0
- package/dist/schema/MutationEvent.test.d.ts.map +1 -0
- package/dist/schema/MutationEvent.test.js +2 -0
- package/dist/schema/MutationEvent.test.js.map +1 -0
- package/dist/schema/system-tables.d.ts +26 -26
- package/dist/schema/system-tables.d.ts.map +1 -1
- package/dist/schema/system-tables.js +19 -11
- package/dist/schema/system-tables.js.map +1 -1
- package/dist/schema-management/common.d.ts +3 -3
- package/dist/schema-management/common.d.ts.map +1 -1
- package/dist/schema-management/common.js.map +1 -1
- package/dist/schema-management/migrations.d.ts +4 -4
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +6 -6
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +43 -0
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
- package/dist/sync/ClientSessionSyncProcessor.js +141 -0
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
- package/dist/sync/client-session-sync-processor.d.ts +4 -4
- package/dist/sync/client-session-sync-processor.d.ts.map +1 -1
- package/dist/sync/index.d.ts +1 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +1 -4
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +1 -1
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +3 -3
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +3 -2
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/mutation-fixtures.d.ts +7 -7
- package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/mutation-fixtures.js +3 -9
- package/dist/sync/next/test/mutation-fixtures.js.map +1 -1
- package/dist/sync/sync.d.ts +21 -11
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +45 -23
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +56 -12
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +125 -69
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +2 -2
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +6 -5
- package/src/adapter-types.ts +39 -40
- package/src/derived-mutations.test.ts +1 -1
- package/src/derived-mutations.ts +9 -5
- package/src/devtools/devtools-bridge.ts +2 -1
- package/src/devtools/devtools-messages-client-session.ts +109 -0
- package/src/devtools/devtools-messages-common.ts +52 -0
- package/src/devtools/devtools-messages-leader.ts +115 -0
- package/src/devtools/devtools-messages.ts +3 -243
- package/src/index.ts +0 -6
- package/src/init-singleton-tables.ts +2 -2
- package/src/leader-thread/{leader-sync-processor.ts → LeaderSyncProcessor.ts} +306 -268
- package/src/leader-thread/apply-mutation.ts +53 -35
- package/src/leader-thread/connection.ts +7 -7
- package/src/leader-thread/leader-worker-devtools.ts +52 -124
- package/src/leader-thread/make-leader-thread-layer.ts +62 -30
- package/src/leader-thread/mutationlog.ts +14 -10
- package/src/leader-thread/recreate-db.ts +24 -20
- package/src/leader-thread/types.ts +41 -20
- package/src/mutation.ts +17 -7
- package/src/rehydrate-from-mutationlog.ts +18 -26
- package/src/schema/EventId.test.ts +12 -0
- package/src/schema/EventId.ts +23 -9
- package/src/schema/MutationEvent.ts +46 -24
- package/src/schema/system-tables.ts +19 -11
- package/src/schema-management/common.ts +3 -3
- package/src/schema-management/migrations.ts +10 -10
- package/src/sync/{client-session-sync-processor.ts → ClientSessionSyncProcessor.ts} +26 -19
- package/src/sync/index.ts +1 -1
- package/src/sync/next/history-dag-common.ts +1 -1
- package/src/sync/next/rebase-events.ts +7 -7
- package/src/sync/next/test/mutation-fixtures.ts +3 -10
- package/src/sync/sync.ts +19 -6
- package/src/sync/syncstate.test.ts +127 -67
- package/src/sync/syncstate.ts +21 -19
- package/src/sync/validate-push-payload.ts +7 -4
- package/src/version.ts +1 -1
@@ -99,23 +99,23 @@ export declare const sessionChangesetMetaTable: import("./table-def.js").TableDe
|
|
99
99
|
columns: {
|
100
100
|
idGlobal: {
|
101
101
|
columnType: "integer";
|
102
|
-
schema: Schema.Schema<number
|
102
|
+
schema: Schema.Schema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
103
103
|
default: import("effect/Option").None<never>;
|
104
104
|
nullable: false;
|
105
105
|
primaryKey: false;
|
106
106
|
};
|
107
107
|
idLocal: {
|
108
108
|
columnType: "integer";
|
109
|
-
schema: Schema.Schema<number
|
109
|
+
schema: Schema.Schema<number & import("effect/Brand").Brand<"LocalEventId">, number, never>;
|
110
110
|
default: import("effect/Option").None<never>;
|
111
111
|
nullable: false;
|
112
112
|
primaryKey: false;
|
113
113
|
};
|
114
114
|
changeset: {
|
115
115
|
columnType: "blob";
|
116
|
-
schema: Schema.Schema<Uint8Array<ArrayBufferLike
|
116
|
+
schema: Schema.Schema<Uint8Array<ArrayBufferLike> | null, Uint8Array<ArrayBufferLike> | null, never>;
|
117
117
|
default: import("effect/Option").None<never>;
|
118
|
-
nullable:
|
118
|
+
nullable: true;
|
119
119
|
primaryKey: false;
|
120
120
|
};
|
121
121
|
debug: {
|
@@ -133,16 +133,16 @@ export declare const sessionChangesetMetaTable: import("./table-def.js").TableDe
|
|
133
133
|
disableAutomaticIdColumn: true;
|
134
134
|
deriveMutations: never;
|
135
135
|
isSingleColumn: false;
|
136
|
-
requiredInsertColumnNames: "idGlobal" | "idLocal"
|
136
|
+
requiredInsertColumnNames: "idGlobal" | "idLocal";
|
137
137
|
}, Schema.Schema<{
|
138
|
-
readonly idGlobal: number
|
139
|
-
readonly idLocal: number
|
140
|
-
readonly changeset: Uint8Array<ArrayBufferLike
|
138
|
+
readonly idGlobal: number & import("effect/Brand").Brand<"GlobalEventId">;
|
139
|
+
readonly idLocal: number & import("effect/Brand").Brand<"LocalEventId">;
|
140
|
+
readonly changeset: Uint8Array<ArrayBufferLike> | null;
|
141
141
|
readonly debug: unknown;
|
142
142
|
}, {
|
143
143
|
readonly idGlobal: number;
|
144
144
|
readonly idLocal: number;
|
145
|
-
readonly changeset: Uint8Array<ArrayBufferLike
|
145
|
+
readonly changeset: Uint8Array<ArrayBufferLike> | null;
|
146
146
|
readonly debug: string | null;
|
147
147
|
}, never>>;
|
148
148
|
export type SessionChangesetMetaRow = FromTable.RowDecoded<typeof sessionChangesetMetaTable>;
|
@@ -233,23 +233,23 @@ export declare const systemTables: (import("./table-def.js").TableDef<{
|
|
233
233
|
columns: {
|
234
234
|
idGlobal: {
|
235
235
|
columnType: "integer";
|
236
|
-
schema: Schema.Schema<number
|
236
|
+
schema: Schema.Schema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
237
237
|
default: import("effect/Option").None<never>;
|
238
238
|
nullable: false;
|
239
239
|
primaryKey: false;
|
240
240
|
};
|
241
241
|
idLocal: {
|
242
242
|
columnType: "integer";
|
243
|
-
schema: Schema.Schema<number
|
243
|
+
schema: Schema.Schema<number & import("effect/Brand").Brand<"LocalEventId">, number, never>;
|
244
244
|
default: import("effect/Option").None<never>;
|
245
245
|
nullable: false;
|
246
246
|
primaryKey: false;
|
247
247
|
};
|
248
248
|
changeset: {
|
249
249
|
columnType: "blob";
|
250
|
-
schema: Schema.Schema<Uint8Array<ArrayBufferLike
|
250
|
+
schema: Schema.Schema<Uint8Array<ArrayBufferLike> | null, Uint8Array<ArrayBufferLike> | null, never>;
|
251
251
|
default: import("effect/Option").None<never>;
|
252
|
-
nullable:
|
252
|
+
nullable: true;
|
253
253
|
primaryKey: false;
|
254
254
|
};
|
255
255
|
debug: {
|
@@ -267,16 +267,16 @@ export declare const systemTables: (import("./table-def.js").TableDef<{
|
|
267
267
|
disableAutomaticIdColumn: true;
|
268
268
|
deriveMutations: never;
|
269
269
|
isSingleColumn: false;
|
270
|
-
requiredInsertColumnNames: "idGlobal" | "idLocal"
|
270
|
+
requiredInsertColumnNames: "idGlobal" | "idLocal";
|
271
271
|
}, Schema.Schema<{
|
272
|
-
readonly idGlobal: number
|
273
|
-
readonly idLocal: number
|
274
|
-
readonly changeset: Uint8Array<ArrayBufferLike
|
272
|
+
readonly idGlobal: number & import("effect/Brand").Brand<"GlobalEventId">;
|
273
|
+
readonly idLocal: number & import("effect/Brand").Brand<"LocalEventId">;
|
274
|
+
readonly changeset: Uint8Array<ArrayBufferLike> | null;
|
275
275
|
readonly debug: unknown;
|
276
276
|
}, {
|
277
277
|
readonly idGlobal: number;
|
278
278
|
readonly idLocal: number;
|
279
|
-
readonly changeset: Uint8Array<ArrayBufferLike
|
279
|
+
readonly changeset: Uint8Array<ArrayBufferLike> | null;
|
280
280
|
readonly debug: string | null;
|
281
281
|
}, never>>)[];
|
282
282
|
export declare const SyncStatus: Schema.Literal<["synced", "pending", "error", "localOnly"]>;
|
@@ -287,28 +287,28 @@ export declare const mutationLogMetaTable: import("./table-def.js").TableDef<{
|
|
287
287
|
columns: {
|
288
288
|
idGlobal: {
|
289
289
|
columnType: "integer";
|
290
|
-
schema: Schema.Schema<number
|
290
|
+
schema: Schema.Schema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
291
291
|
default: import("effect/Option").None<never>;
|
292
292
|
nullable: false;
|
293
293
|
primaryKey: true;
|
294
294
|
};
|
295
295
|
idLocal: {
|
296
296
|
columnType: "integer";
|
297
|
-
schema: Schema.Schema<number
|
297
|
+
schema: Schema.Schema<number & import("effect/Brand").Brand<"LocalEventId">, number, never>;
|
298
298
|
default: import("effect/Option").None<never>;
|
299
299
|
nullable: false;
|
300
300
|
primaryKey: true;
|
301
301
|
};
|
302
302
|
parentIdGlobal: {
|
303
303
|
columnType: "integer";
|
304
|
-
schema: Schema.Schema<number
|
304
|
+
schema: Schema.Schema<number & import("effect/Brand").Brand<"GlobalEventId">, number, never>;
|
305
305
|
default: import("effect/Option").None<never>;
|
306
306
|
nullable: false;
|
307
307
|
primaryKey: false;
|
308
308
|
};
|
309
309
|
parentIdLocal: {
|
310
310
|
columnType: "integer";
|
311
|
-
schema: Schema.Schema<number
|
311
|
+
schema: Schema.Schema<number & import("effect/Brand").Brand<"LocalEventId">, number, never>;
|
312
312
|
default: import("effect/Option").None<never>;
|
313
313
|
nullable: false;
|
314
314
|
primaryKey: false;
|
@@ -351,10 +351,10 @@ export declare const mutationLogMetaTable: import("./table-def.js").TableDef<{
|
|
351
351
|
isSingleColumn: false;
|
352
352
|
requiredInsertColumnNames: "schemaHash" | "idGlobal" | "idLocal" | "parentIdGlobal" | "parentIdLocal" | "mutation" | "argsJson" | "syncMetadataJson";
|
353
353
|
}, Schema.Schema<{
|
354
|
-
readonly idGlobal: number
|
355
|
-
readonly idLocal: number
|
356
|
-
readonly parentIdGlobal: number
|
357
|
-
readonly parentIdLocal: number
|
354
|
+
readonly idGlobal: number & import("effect/Brand").Brand<"GlobalEventId">;
|
355
|
+
readonly idLocal: number & import("effect/Brand").Brand<"LocalEventId">;
|
356
|
+
readonly parentIdGlobal: number & import("effect/Brand").Brand<"GlobalEventId">;
|
357
|
+
readonly parentIdLocal: number & import("effect/Brand").Brand<"LocalEventId">;
|
358
358
|
readonly mutation: string;
|
359
359
|
readonly argsJson: any;
|
360
360
|
readonly schemaHash: number;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"system-tables.d.ts","sourceRoot":"","sources":["../../src/schema/system-tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,IAAI,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;
|
1
|
+
{"version":3,"file":"system-tables.d.ts","sourceRoot":"","sources":["../../src/schema/system-tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,IAAI,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAK/C,eAAO,MAAM,iBAAiB,uBAAuB,CAAA;AAErD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAS3B,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;AAExE,eAAO,MAAM,2BAA2B,iCAAiC,CAAA;AAEzE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UASpC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAE1F;;;GAGG;AACH,eAAO,MAAM,4BAA4B,kCAAkC,CAAA;AAE3E,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAarC,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE5F,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAAyE,CAAA;AAIlG,eAAO,MAAM,UAAU,6DAA4D,CAAA;AACnF,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C,eAAO,MAAM,uBAAuB,iBAAiB,CAAA;AAErD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAmBhC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAElF,eAAO,MAAM,iBAAiB,4BAA4B,CAAA;AAE1D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;UAM3B,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA"}
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import { SqliteDsl } from '@livestore/db-schema';
|
2
2
|
import { Schema } from '@livestore/utils/effect';
|
3
|
+
import * as EventId from './EventId.js';
|
3
4
|
import { table } from './table-def.js';
|
4
5
|
/// App DB
|
5
6
|
export const SCHEMA_META_TABLE = '__livestore_schema';
|
@@ -23,27 +24,34 @@ export const schemaMutationsMetaTable = table(SCHEMA_MUTATIONS_META_TABLE, {
|
|
23
24
|
export const SESSION_CHANGESET_META_TABLE = '__livestore_session_changeset';
|
24
25
|
export const sessionChangesetMetaTable = table(SESSION_CHANGESET_META_TABLE, {
|
25
26
|
// TODO bring back primary key
|
26
|
-
idGlobal: SqliteDsl.integer({}),
|
27
|
-
idLocal: SqliteDsl.integer({}),
|
28
|
-
|
29
|
-
// idLocal: SqliteDsl.integer({ primaryKey: true }),
|
30
|
-
changeset: SqliteDsl.blob({}),
|
27
|
+
idGlobal: SqliteDsl.integer({ schema: EventId.GlobalEventId }),
|
28
|
+
idLocal: SqliteDsl.integer({ schema: EventId.LocalEventId }),
|
29
|
+
changeset: SqliteDsl.blob({ nullable: true }),
|
31
30
|
debug: SqliteDsl.json({ nullable: true }),
|
32
|
-
}, {
|
31
|
+
}, {
|
32
|
+
disableAutomaticIdColumn: true,
|
33
|
+
indexes: [{ columns: ['idGlobal', 'idLocal'], name: 'idx_session_changeset_id' }],
|
34
|
+
});
|
33
35
|
export const systemTables = [schemaMetaTable, schemaMutationsMetaTable, sessionChangesetMetaTable];
|
34
36
|
/// Mutation log DB
|
35
37
|
export const SyncStatus = Schema.Literal('synced', 'pending', 'error', 'localOnly');
|
36
38
|
export const MUTATION_LOG_META_TABLE = 'mutation_log';
|
37
39
|
export const mutationLogMetaTable = table(MUTATION_LOG_META_TABLE, {
|
38
|
-
idGlobal: SqliteDsl.integer({ primaryKey: true }),
|
39
|
-
idLocal: SqliteDsl.integer({ primaryKey: true }),
|
40
|
-
parentIdGlobal: SqliteDsl.integer({}),
|
41
|
-
parentIdLocal: SqliteDsl.integer({}),
|
40
|
+
idGlobal: SqliteDsl.integer({ primaryKey: true, schema: EventId.GlobalEventId }),
|
41
|
+
idLocal: SqliteDsl.integer({ primaryKey: true, schema: EventId.LocalEventId }),
|
42
|
+
parentIdGlobal: SqliteDsl.integer({ schema: EventId.GlobalEventId }),
|
43
|
+
parentIdLocal: SqliteDsl.integer({ schema: EventId.LocalEventId }),
|
42
44
|
mutation: SqliteDsl.text({}),
|
43
45
|
argsJson: SqliteDsl.text({ schema: Schema.parseJson(Schema.Any) }),
|
44
46
|
schemaHash: SqliteDsl.integer({}),
|
45
47
|
syncMetadataJson: SqliteDsl.text({ schema: Schema.parseJson(Schema.Option(Schema.JsonValue)) }),
|
46
|
-
}, {
|
48
|
+
}, {
|
49
|
+
disableAutomaticIdColumn: true,
|
50
|
+
indexes: [
|
51
|
+
{ columns: ['idGlobal'], name: 'idx_idGlobal' },
|
52
|
+
{ columns: ['idGlobal', 'idLocal'], name: 'idx_mutationlog_id' },
|
53
|
+
],
|
54
|
+
});
|
47
55
|
export const SYNC_STATUS_TABLE = '__livestore_sync_status';
|
48
56
|
export const syncStatusTable = table(SYNC_STATUS_TABLE, {
|
49
57
|
head: SqliteDsl.integer({ primaryKey: true }),
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"system-tables.js","sourceRoot":"","sources":["../../src/schema/system-tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;
|
1
|
+
{"version":3,"file":"system-tables.js","sourceRoot":"","sources":["../../src/schema/system-tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAEtC,UAAU;AAEV,MAAM,CAAC,MAAM,iBAAiB,GAAG,oBAAoB,CAAA;AAErD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAClC,iBAAiB,EACjB;IACE,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/C,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClD,sBAAsB;IACtB,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;CAC/C,EACD,EAAE,wBAAwB,EAAE,IAAI,EAAE,CACnC,CAAA;AAID,MAAM,CAAC,MAAM,2BAA2B,GAAG,8BAA8B,CAAA;AAEzE,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAC3C,2BAA2B,EAC3B;IACE,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAClD,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClD,sBAAsB;IACtB,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;CAC/C,EACD,EAAE,wBAAwB,EAAE,IAAI,EAAE,CACnC,CAAA;AAID;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,+BAA+B,CAAA;AAE3E,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAC5C,4BAA4B,EAC5B;IACE,8BAA8B;IAC9B,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;IAC9D,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;IAC5D,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC7C,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;CAC1C,EACD;IACE,wBAAwB,EAAE,IAAI;IAC9B,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;CAClF,CACF,CAAA;AAID,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,eAAe,EAAE,wBAAwB,EAAE,yBAAyB,CAAC,CAAA;AAElG,mBAAmB;AAEnB,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;AAGnF,MAAM,CAAC,MAAM,uBAAuB,GAAG,cAAc,CAAA;AAErD,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CACvC,uBAAuB,EACvB;IACE,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;IAChF,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;IAC9E,cAAc,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;IACpE,aAAa,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;IAClE,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5B,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAClE,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IACjC,gBAAgB,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;CAChG,EACD;IACE,wBAAwB,EAAE,IAAI;IAC9B,OAAO,EAAE;QACP,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE;QAC/C,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE;KACjE;CACF,CACF,CAAA;AAID,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAA;AAE1D,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAClC,iBAAiB,EACjB;IACE,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;CAC9C,EACD,EAAE,wBAAwB,EAAE,IAAI,EAAE,CACnC,CAAA"}
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import type {
|
1
|
+
import type { SqliteDb } from '../adapter-types.js';
|
2
2
|
import type { ParamsObject } from '../util.js';
|
3
|
-
export declare const dbExecute: (db:
|
4
|
-
export declare const dbSelect: <T>(db:
|
3
|
+
export declare const dbExecute: (db: SqliteDb, queryStr: string, bindValues?: ParamsObject) => void;
|
4
|
+
export declare const dbSelect: <T>(db: SqliteDb, queryStr: string, bindValues?: ParamsObject) => readonly T[];
|
5
5
|
export interface SchemaManager {
|
6
6
|
getMutationDefInfos: () => ReadonlyArray<MutationDefInfo>;
|
7
7
|
setMutationDefInfo: (mutationDefInfo: MutationDefInfo) => void;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/schema-management/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/schema-management/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO9C,eAAO,MAAM,SAAS,OAAQ,QAAQ,YAAY,MAAM,eAAe,YAAY,SAYlF,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,CAAC,MAAM,QAAQ,YAAY,MAAM,eAAe,YAAY,iBAUpF,CAAA;AAED,MAAM,WAAW,aAAa;IAC5B,mBAAmB,EAAE,MAAM,aAAa,CAAC,eAAe,CAAC,CAAA;IAEzD,kBAAkB,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,CAAA;CAC/D;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schema-management/common.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE9C,oCAAoC;AACpC,uGAAuG;AACvG,2DAA2D;AAE3D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schema-management/common.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE9C,oCAAoC;AACpC,uGAAuG;AACvG,2DAA2D;AAE3D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAY,EAAE,QAAgB,EAAE,UAAyB,EAAE,EAAE;IACrF,uCAAuC;IACvC,eAAe;IACf,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACjC,kCAAkC;IAClC,IAAI;IAEJ,MAAM,kBAAkB,GAAG,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAE3F,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAEhC,IAAI,CAAC,QAAQ,EAAE,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAI,EAAY,EAAE,QAAgB,EAAE,UAAyB,EAAE,EAAE;IACvF,uCAAuC;IACvC,eAAe;IACf,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACjC,kCAAkC;IAClC,IAAI;IAEJ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAI,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC5F,IAAI,CAAC,QAAQ,EAAE,CAAA;IACf,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
|
@@ -1,11 +1,11 @@
|
|
1
1
|
import { SqliteAst } from '@livestore/db-schema';
|
2
2
|
import { Effect } from '@livestore/utils/effect';
|
3
|
-
import type {
|
3
|
+
import type { SqliteDb } from '../adapter-types.js';
|
4
4
|
import type { LiveStoreSchema } from '../schema/mod.js';
|
5
5
|
import type { SchemaManager } from './common.js';
|
6
|
-
export declare const makeSchemaManager: (db:
|
6
|
+
export declare const makeSchemaManager: (db: SqliteDb) => Effect.Effect<SchemaManager>;
|
7
7
|
export declare const migrateDb: ({ db, schema, onProgress, }: {
|
8
|
-
db:
|
8
|
+
db: SqliteDb;
|
9
9
|
schema: LiveStoreSchema;
|
10
10
|
onProgress?: (opts: {
|
11
11
|
done: number;
|
@@ -13,7 +13,7 @@ export declare const migrateDb: ({ db, schema, onProgress, }: {
|
|
13
13
|
}) => Effect.Effect<void>;
|
14
14
|
}) => Effect.Effect<void, import("../adapter-types.js").UnexpectedError, never>;
|
15
15
|
export declare const migrateTable: ({ db, tableAst, schemaHash, behaviour, skipMetaTable, }: {
|
16
|
-
db:
|
16
|
+
db: SqliteDb;
|
17
17
|
tableAst: SqliteAst.Table;
|
18
18
|
schemaHash?: number;
|
19
19
|
behaviour: "drop-and-recreate" | "create-if-not-exists";
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/schema-management/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,sBAAsB,CAAA;AAE3D,OAAO,EAAE,MAAM,EAA0B,MAAM,yBAAyB,CAAA;AAExE,OAAO,KAAK,EAAE,
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/schema-management/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,sBAAsB,CAAA;AAE3D,OAAO,EAAE,MAAM,EAA0B,MAAM,yBAAyB,CAAA;AAExE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAUvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMhD,eAAO,MAAM,iBAAiB,OAAQ,QAAQ,KAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAwBxE,CAAA;AAGJ,eAAO,MAAM,SAAS,gCAInB;IACD,EAAE,EAAE,QAAQ,CAAA;IACZ,MAAM,EAAE,eAAe,CAAA;IACvB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;CAC5E,8EAqDG,CAAA;AAEJ,eAAO,MAAM,YAAY,4DAMtB;IACD,EAAE,EAAE,QAAQ,CAAA;IACZ,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,mBAAmB,GAAG,sBAAsB,CAAA;IACvD,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,sCAqCE,CAAA;AAOH,eAAO,MAAM,cAAc,aAAc,SAAS,CAAC,KAAK,WAQvD,CAAA"}
|
@@ -67,11 +67,11 @@ export const migrateTable = ({ db, tableAst, schemaHash = SqliteAst.hash(tableAs
|
|
67
67
|
const columnSpec = makeColumnSpec(tableAst);
|
68
68
|
if (behaviour === 'drop-and-recreate') {
|
69
69
|
// TODO need to possibly handle cascading deletes due to foreign keys
|
70
|
-
dbExecute(db, sql `drop table if exists ${tableName}`);
|
71
|
-
dbExecute(db, sql `create table if not exists ${tableName} (${columnSpec}) strict`);
|
70
|
+
dbExecute(db, sql `drop table if exists '${tableName}'`);
|
71
|
+
dbExecute(db, sql `create table if not exists '${tableName}' (${columnSpec}) strict`);
|
72
72
|
}
|
73
73
|
else if (behaviour === 'create-if-not-exists') {
|
74
|
-
dbExecute(db, sql `create table if not exists ${tableName} (${columnSpec}) strict`);
|
74
|
+
dbExecute(db, sql `create table if not exists '${tableName}' (${columnSpec}) strict`);
|
75
75
|
}
|
76
76
|
for (const index of tableAst.indexes) {
|
77
77
|
dbExecute(db, createIndexFromDefinition(tableName, index));
|
@@ -91,10 +91,10 @@ export const migrateTable = ({ db, tableAst, schemaHash = SqliteAst.hash(tableAs
|
|
91
91
|
}));
|
92
92
|
const createIndexFromDefinition = (tableName, index) => {
|
93
93
|
const uniqueStr = index.unique ? 'UNIQUE' : '';
|
94
|
-
return sql `create ${uniqueStr} index if not exists ${index.name} on ${tableName} (${index.columns.join(', ')})`;
|
94
|
+
return sql `create ${uniqueStr} index if not exists '${index.name}' on '${tableName}' (${index.columns.join(', ')})`;
|
95
95
|
};
|
96
96
|
export const makeColumnSpec = (tableAst) => {
|
97
|
-
const primaryKeys = tableAst.columns.filter((_) => _.primaryKey).map((_) => _.name);
|
97
|
+
const primaryKeys = tableAst.columns.filter((_) => _.primaryKey).map((_) => `'${_.name}'`);
|
98
98
|
const columnDefStrs = tableAst.columns.map(toSqliteColumnSpec);
|
99
99
|
if (primaryKeys.length > 0) {
|
100
100
|
columnDefStrs.push(`PRIMARY KEY (${primaryKeys.join(', ')})`);
|
@@ -116,6 +116,6 @@ const toSqliteColumnSpec = (column) => {
|
|
116
116
|
return `default '${encodedDefaultValue}'`;
|
117
117
|
return `default ${encodedDefaultValue}`;
|
118
118
|
})();
|
119
|
-
return
|
119
|
+
return `'${column.name}' ${columnTypeStr} ${nullableStr} ${defaultValueStr}`;
|
120
120
|
};
|
121
121
|
//# sourceMappingURL=migrations.js.map
|
@@ -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,
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/schema-management/migrations.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import type { Runtime, Scope } from '@livestore/utils/effect';
|
2
|
+
import { Effect } from '@livestore/utils/effect';
|
3
|
+
import * as otel from '@opentelemetry/api';
|
4
|
+
import type { ClientSession, UnexpectedError } from '../adapter-types.js';
|
5
|
+
import { type LiveStoreSchema } from '../schema/mod.js';
|
6
|
+
import * as MutationEvent from '../schema/MutationEvent.js';
|
7
|
+
import { SyncState } from './syncstate.js';
|
8
|
+
/**
|
9
|
+
* Rebase behaviour:
|
10
|
+
* - We continously pull mutations from the leader and apply them to the local store.
|
11
|
+
* - If there was a race condition (i.e. the leader and client session have both advacned),
|
12
|
+
* we'll need to rebase the local pending mutations on top of the leader's head.
|
13
|
+
* - The goal is to never block the UI, so we'll interrupt rebasing if a new mutations is pushed by the client session.
|
14
|
+
* - We also want to avoid "backwards-jumping" in the UI, so we'll transactionally apply a read model changes during a rebase.
|
15
|
+
* - We might need to make the rebase behaviour configurable e.g. to let users manually trigger a rebase
|
16
|
+
*/
|
17
|
+
export declare const makeClientSessionSyncProcessor: ({ schema, clientSession, runtime, applyMutation, rollback, refreshTables, span, }: {
|
18
|
+
schema: LiveStoreSchema;
|
19
|
+
clientSession: ClientSession;
|
20
|
+
runtime: Runtime.Runtime<Scope.Scope>;
|
21
|
+
applyMutation: (mutationEventDecoded: MutationEvent.PartialAnyDecoded, options: {
|
22
|
+
otelContext: otel.Context;
|
23
|
+
withChangeset: boolean;
|
24
|
+
}) => {
|
25
|
+
writeTables: Set<string>;
|
26
|
+
sessionChangeset: Uint8Array | undefined;
|
27
|
+
};
|
28
|
+
rollback: (changeset: Uint8Array) => void;
|
29
|
+
refreshTables: (tables: Set<string>) => void;
|
30
|
+
span: otel.Span;
|
31
|
+
}) => ClientSessionSyncProcessor;
|
32
|
+
export interface ClientSessionSyncProcessor {
|
33
|
+
push: (batch: ReadonlyArray<MutationEvent.PartialAnyDecoded>, options: {
|
34
|
+
otelContext: otel.Context;
|
35
|
+
}) => {
|
36
|
+
writeTables: Set<string>;
|
37
|
+
};
|
38
|
+
boot: Effect.Effect<void, UnexpectedError, Scope.Scope>;
|
39
|
+
syncStateRef: {
|
40
|
+
current: SyncState;
|
41
|
+
};
|
42
|
+
}
|
43
|
+
//# sourceMappingURL=ClientSessionSyncProcessor.d.ts.map
|
@@ -0,0 +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,EAAkB,MAAM,yBAAyB,CAAA;AAChE,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,EAAE,SAAS,EAAmB,MAAM,gBAAgB,CAAA;AAE3D;;;;;;;;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,0BA+JH,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,YAAY,EAAE;QAAE,OAAO,EAAE,SAAS,CAAA;KAAE,CAAA;CACrC"}
|
@@ -0,0 +1,141 @@
|
|
1
|
+
import { LS_DEV, shouldNeverHappen, TRACE_VERBOSE } from '@livestore/utils';
|
2
|
+
import { Effect, Schema, Stream } from '@livestore/utils/effect';
|
3
|
+
import * as otel from '@opentelemetry/api';
|
4
|
+
import * as EventId from '../schema/EventId.js';
|
5
|
+
import * as MutationEvent from '../schema/MutationEvent.js';
|
6
|
+
import { SyncState, updateSyncState } from './syncstate.js';
|
7
|
+
/**
|
8
|
+
* Rebase behaviour:
|
9
|
+
* - We continously pull mutations from the leader and apply them to the local store.
|
10
|
+
* - If there was a race condition (i.e. the leader and client session have both advacned),
|
11
|
+
* we'll need to rebase the local pending mutations on top of the leader's head.
|
12
|
+
* - The goal is to never block the UI, so we'll interrupt rebasing if a new mutations is pushed by the client session.
|
13
|
+
* - We also want to avoid "backwards-jumping" in the UI, so we'll transactionally apply a read model changes during a rebase.
|
14
|
+
* - We might need to make the rebase behaviour configurable e.g. to let users manually trigger a rebase
|
15
|
+
*/
|
16
|
+
export const makeClientSessionSyncProcessor = ({ schema, clientSession, runtime, applyMutation, rollback, refreshTables, span, }) => {
|
17
|
+
const mutationEventSchema = MutationEvent.makeMutationEventSchemaMemo(schema);
|
18
|
+
const syncStateRef = {
|
19
|
+
current: new SyncState({
|
20
|
+
localHead: clientSession.leaderThread.mutations.initialMutationEventId,
|
21
|
+
upstreamHead: clientSession.leaderThread.mutations.initialMutationEventId,
|
22
|
+
pending: [],
|
23
|
+
// TODO init rollbackTail from leader to be ready for backend rebasing
|
24
|
+
rollbackTail: [],
|
25
|
+
}),
|
26
|
+
};
|
27
|
+
const isLocalEvent = (mutationEventEncoded) => {
|
28
|
+
const mutationDef = schema.mutations.get(mutationEventEncoded.mutation);
|
29
|
+
return mutationDef.options.localOnly;
|
30
|
+
};
|
31
|
+
const push = (batch, { otelContext }) => {
|
32
|
+
// TODO validate batch
|
33
|
+
let baseEventId = syncStateRef.current.localHead;
|
34
|
+
const encodedMutationEvents = batch.map((mutationEvent) => {
|
35
|
+
const mutationDef = schema.mutations.get(mutationEvent.mutation);
|
36
|
+
const nextIdPair = EventId.nextPair(baseEventId, mutationDef.options.localOnly);
|
37
|
+
baseEventId = nextIdPair.id;
|
38
|
+
return new MutationEvent.EncodedWithMeta(Schema.encodeUnknownSync(mutationEventSchema)({ ...mutationEvent, ...nextIdPair }));
|
39
|
+
});
|
40
|
+
const updateResult = updateSyncState({
|
41
|
+
syncState: syncStateRef.current,
|
42
|
+
payload: { _tag: 'local-push', newEvents: encodedMutationEvents },
|
43
|
+
isLocalEvent,
|
44
|
+
isEqualEvent: MutationEvent.isEqualEncoded,
|
45
|
+
});
|
46
|
+
span.addEvent('local-push', {
|
47
|
+
batchSize: encodedMutationEvents.length,
|
48
|
+
updateResult: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
|
49
|
+
});
|
50
|
+
if (updateResult._tag !== 'advance') {
|
51
|
+
return shouldNeverHappen(`Expected advance, got ${updateResult._tag}`);
|
52
|
+
}
|
53
|
+
syncStateRef.current = updateResult.newSyncState;
|
54
|
+
const writeTables = new Set();
|
55
|
+
for (const mutationEvent of updateResult.newEvents) {
|
56
|
+
// TODO avoid encoding and decoding here again
|
57
|
+
const decodedMutationEvent = Schema.decodeSync(mutationEventSchema)(mutationEvent);
|
58
|
+
const res = applyMutation(decodedMutationEvent, { otelContext, withChangeset: true });
|
59
|
+
for (const table of res.writeTables) {
|
60
|
+
writeTables.add(table);
|
61
|
+
}
|
62
|
+
mutationEvent.meta.sessionChangeset = res.sessionChangeset;
|
63
|
+
}
|
64
|
+
// console.debug('pushToLeader', encodedMutationEvents.length, ...encodedMutationEvents.map((_) => _.toJSON()))
|
65
|
+
clientSession.leaderThread.mutations
|
66
|
+
.push(encodedMutationEvents)
|
67
|
+
.pipe(Effect.tapCauseLogPretty, Effect.provide(runtime), Effect.runFork);
|
68
|
+
return { writeTables };
|
69
|
+
};
|
70
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
71
|
+
const boot = Effect.gen(function* () {
|
72
|
+
yield* clientSession.leaderThread.mutations.pull.pipe(Stream.tap(({ payload, remaining }) => Effect.gen(function* () {
|
73
|
+
// console.log('pulled payload from leader', { payload, remaining })
|
74
|
+
if (clientSession.devtools.enabled) {
|
75
|
+
yield* clientSession.devtools.pullLatch.await;
|
76
|
+
}
|
77
|
+
const updateResult = updateSyncState({
|
78
|
+
syncState: syncStateRef.current,
|
79
|
+
payload,
|
80
|
+
isLocalEvent,
|
81
|
+
isEqualEvent: MutationEvent.isEqualEncoded,
|
82
|
+
});
|
83
|
+
if (updateResult._tag === 'reject') {
|
84
|
+
debugger;
|
85
|
+
throw new Error('TODO: implement reject in client-session-sync-queue for pull');
|
86
|
+
}
|
87
|
+
syncStateRef.current = updateResult.newSyncState;
|
88
|
+
if (updateResult._tag === 'rebase') {
|
89
|
+
span.addEvent('pull:rebase', {
|
90
|
+
payloadTag: payload._tag,
|
91
|
+
payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
|
92
|
+
newEventsCount: updateResult.newEvents.length,
|
93
|
+
rollbackCount: updateResult.eventsToRollback.length,
|
94
|
+
res: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
|
95
|
+
remaining,
|
96
|
+
});
|
97
|
+
if (LS_DEV) {
|
98
|
+
console.debug('pull:rebase: rollback', updateResult.eventsToRollback.length, ...updateResult.eventsToRollback.map((_) => _.toJSON()));
|
99
|
+
}
|
100
|
+
for (let i = updateResult.eventsToRollback.length - 1; i >= 0; i--) {
|
101
|
+
const event = updateResult.eventsToRollback[i];
|
102
|
+
if (event.meta.sessionChangeset) {
|
103
|
+
rollback(event.meta.sessionChangeset);
|
104
|
+
event.meta.sessionChangeset = undefined;
|
105
|
+
}
|
106
|
+
}
|
107
|
+
clientSession.leaderThread.mutations
|
108
|
+
.push(updateResult.newSyncState.pending)
|
109
|
+
.pipe(Effect.tapCauseLogPretty, Effect.provide(runtime), Effect.runFork);
|
110
|
+
}
|
111
|
+
else {
|
112
|
+
span.addEvent('pull:advance', {
|
113
|
+
payloadTag: payload._tag,
|
114
|
+
payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
|
115
|
+
newEventsCount: updateResult.newEvents.length,
|
116
|
+
res: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
|
117
|
+
remaining,
|
118
|
+
});
|
119
|
+
}
|
120
|
+
if (updateResult.newEvents.length === 0)
|
121
|
+
return;
|
122
|
+
const writeTables = new Set();
|
123
|
+
for (const mutationEvent of updateResult.newEvents) {
|
124
|
+
const decodedMutationEvent = Schema.decodeSync(mutationEventSchema)(mutationEvent);
|
125
|
+
const res = applyMutation(decodedMutationEvent, { otelContext, withChangeset: true });
|
126
|
+
for (const table of res.writeTables) {
|
127
|
+
writeTables.add(table);
|
128
|
+
}
|
129
|
+
mutationEvent.meta.sessionChangeset = res.sessionChangeset;
|
130
|
+
}
|
131
|
+
refreshTables(writeTables);
|
132
|
+
})), Stream.runDrain, Effect.forever, // NOTE Whenever the leader changes, we need to re-start the stream
|
133
|
+
Effect.tapCauseLogPretty, Effect.forkScoped);
|
134
|
+
});
|
135
|
+
return {
|
136
|
+
push,
|
137
|
+
boot,
|
138
|
+
syncStateRef,
|
139
|
+
};
|
140
|
+
};
|
141
|
+
//# sourceMappingURL=ClientSessionSyncProcessor.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ClientSessionSyncProcessor.js","sourceRoot":"","sources":["../../src/sync/ClientSessionSyncProcessor.ts"],"names":[],"mappings":"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"}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import type { Scope } from '@livestore/utils/effect';
|
2
2
|
import { Effect } from '@livestore/utils/effect';
|
3
3
|
import * as otel from '@opentelemetry/api';
|
4
|
-
import type {
|
4
|
+
import type { ClientSessionLeaderThreadProxy, UnexpectedError } from '../adapter-types.js';
|
5
5
|
import * as EventId from '../schema/EventId.js';
|
6
6
|
import { type LiveStoreSchema } from '../schema/mod.js';
|
7
7
|
import * as MutationEvent from '../schema/MutationEvent.js';
|
@@ -19,8 +19,8 @@ export declare const makeClientSessionSyncProcessor: ({ schema, initialLeaderHea
|
|
19
19
|
schema: LiveStoreSchema;
|
20
20
|
initialLeaderHead: EventId.EventId;
|
21
21
|
pushToLeader: (batch: ReadonlyArray<MutationEvent.AnyEncoded>) => void;
|
22
|
-
pullFromLeader:
|
23
|
-
applyMutation: (mutationEventDecoded: MutationEvent.
|
22
|
+
pullFromLeader: ClientSessionLeaderThreadProxy["mutations"]["pull"];
|
23
|
+
applyMutation: (mutationEventDecoded: MutationEvent.PartialAnyDecoded, options: {
|
24
24
|
otelContext: otel.Context;
|
25
25
|
withChangeset: boolean;
|
26
26
|
}) => {
|
@@ -32,7 +32,7 @@ export declare const makeClientSessionSyncProcessor: ({ schema, initialLeaderHea
|
|
32
32
|
span: otel.Span;
|
33
33
|
}) => ClientSessionSyncProcessor;
|
34
34
|
export interface ClientSessionSyncProcessor {
|
35
|
-
push: (batch: ReadonlyArray<MutationEvent.
|
35
|
+
push: (batch: ReadonlyArray<MutationEvent.PartialAnyDecoded>, options: {
|
36
36
|
otelContext: otel.Context;
|
37
37
|
}) => {
|
38
38
|
writeTables: Set<string>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"client-session-sync-processor.d.ts","sourceRoot":"","sources":["../../src/sync/client-session-sync-processor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAkB,MAAM,yBAAyB,CAAA;AAChE,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,KAAK,EAAE,
|
1
|
+
{"version":3,"file":"client-session-sync-processor.d.ts","sourceRoot":"","sources":["../../src/sync/client-session-sync-processor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAkB,MAAM,yBAAyB,CAAA;AAChE,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,KAAK,EAAE,8BAA8B,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1F,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAA;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAG/C;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B,+GASxC;IACD,MAAM,EAAE,eAAe,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAA;IAClC,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,IAAI,CAAA;IACtE,cAAc,EAAE,8BAA8B,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;IACnE,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;IAE5C,IAAI,EAAE,IAAI,CAAC,IAAI,CAAA;CAChB,KAAG,0BAoJH,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,YAAY,EAAE;QAAE,OAAO,EAAE,SAAS,CAAA;KAAE,CAAA;CACrC"}
|
package/dist/sync/index.d.ts
CHANGED
package/dist/sync/index.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,4BAA4B,CAAA;AAC1C,cAAc,
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,4BAA4B,CAAA;AAC1C,cAAc,iCAAiC,CAAA"}
|
package/dist/sync/index.js
CHANGED
package/dist/sync/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,4BAA4B,CAAA;AAC1C,cAAc,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,4BAA4B,CAAA;AAC1C,cAAc,iCAAiC,CAAA"}
|