@livestore/common 0.4.0-dev.9 → 0.5.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/ClientSessionLeaderThreadProxy.d.ts +27 -12
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
- package/dist/MaterializationJournal.d.ts +44 -0
- package/dist/MaterializationJournal.d.ts.map +1 -0
- package/dist/MaterializationJournal.js +112 -0
- package/dist/MaterializationJournal.js.map +1 -0
- package/dist/StateHead.d.ts +26 -0
- package/dist/StateHead.d.ts.map +1 -0
- package/dist/StateHead.js +50 -0
- package/dist/StateHead.js.map +1 -0
- package/dist/WorkerTransportError.d.ts +11 -0
- package/dist/WorkerTransportError.d.ts.map +1 -0
- package/dist/WorkerTransportError.js +11 -0
- package/dist/WorkerTransportError.js.map +1 -0
- package/dist/__tests__/fixture.d.ts +1 -1
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/__tests__/fixture.js +3 -3
- package/dist/__tests__/fixture.js.map +1 -1
- package/dist/adapter-types.d.ts +59 -57
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +31 -22
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/bounded-collections.js +6 -4
- package/dist/bounded-collections.js.map +1 -1
- package/dist/debug-info.d.ts +56 -56
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +46 -32
- package/dist/debug-info.js.map +1 -1
- package/dist/defs.d.ts +9 -9
- package/dist/defs.js +2 -2
- package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
- package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
- package/dist/devtools/devtools-compatibility.test.js +16 -0
- package/dist/devtools/devtools-compatibility.test.js.map +1 -0
- package/dist/devtools/devtools-messages-client-session.d.ts +531 -312
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +86 -67
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +32 -35
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +12 -14
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +417 -320
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +117 -87
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +28 -17
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
- package/dist/devtools/devtools-sessioninfo.js +12 -6
- package/dist/devtools/devtools-sessioninfo.js.map +1 -1
- package/dist/devtools/mod.d.ts +17 -7
- package/dist/devtools/mod.d.ts.map +1 -1
- package/dist/devtools/mod.js +19 -8
- package/dist/devtools/mod.js.map +1 -1
- package/dist/errors.d.ts +52 -46
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +31 -21
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +116 -21
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +596 -470
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/RejectedPushError.d.ts +138 -0
- package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
- package/dist/leader-thread/RejectedPushError.js +97 -0
- package/dist/leader-thread/RejectedPushError.js.map +1 -0
- package/dist/leader-thread/connection.d.ts +1 -0
- package/dist/leader-thread/connection.d.ts.map +1 -1
- package/dist/leader-thread/connection.js +10 -9
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +20 -15
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +80 -20
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +110 -62
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +19 -7
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +67 -45
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
- package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
- package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
- package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
- package/dist/leader-thread/materialize-event.d.ts +3 -2
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +32 -9
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/mod.d.ts +1 -0
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -0
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +2 -2
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +19 -40
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +3 -7
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -3
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/stream-events.d.ts +53 -0
- package/dist/leader-thread/stream-events.d.ts.map +1 -0
- package/dist/leader-thread/stream-events.js +164 -0
- package/dist/leader-thread/stream-events.js.map +1 -0
- package/dist/leader-thread/types.d.ts +92 -51
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +17 -4
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.d.ts +15 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +2 -0
- package/dist/logging.js.map +1 -0
- package/dist/make-client-session.d.ts +6 -5
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +10 -7
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts +6 -7
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +22 -40
- package/dist/materializer-helper.js.map +1 -1
- package/dist/otel.d.ts +4 -4
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +8 -8
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +3 -3
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +52 -39
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +161 -0
- package/dist/schema/EventDef/define.d.ts.map +1 -0
- package/dist/schema/EventDef/define.js +140 -0
- package/dist/schema/EventDef/define.js.map +1 -0
- package/dist/schema/EventDef/define.test.d.ts +2 -0
- package/dist/schema/EventDef/define.test.d.ts.map +1 -0
- package/dist/schema/EventDef/define.test.js +23 -0
- package/dist/schema/EventDef/define.test.js.map +1 -0
- package/dist/schema/EventDef/deprecated.d.ts +94 -0
- package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
- package/dist/schema/EventDef/deprecated.js +143 -0
- package/dist/schema/EventDef/deprecated.js.map +1 -0
- package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
- package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
- package/dist/schema/EventDef/deprecated.test.js +95 -0
- package/dist/schema/EventDef/deprecated.test.js.map +1 -0
- package/dist/schema/EventDef/event-def.d.ts +110 -0
- package/dist/schema/EventDef/event-def.d.ts.map +1 -0
- package/dist/schema/EventDef/event-def.js +2 -0
- package/dist/schema/EventDef/event-def.js.map +1 -0
- package/dist/schema/EventDef/facts.d.ts +118 -0
- package/dist/schema/EventDef/facts.d.ts.map +1 -0
- package/dist/schema/EventDef/facts.js +53 -0
- package/dist/schema/EventDef/facts.js.map +1 -0
- package/dist/schema/EventDef/materializer.d.ts +155 -0
- package/dist/schema/EventDef/materializer.d.ts.map +1 -0
- package/dist/schema/EventDef/materializer.js +83 -0
- package/dist/schema/EventDef/materializer.js.map +1 -0
- package/dist/schema/EventDef/mod.d.ts +6 -0
- package/dist/schema/EventDef/mod.d.ts.map +1 -0
- package/dist/schema/EventDef/mod.js +6 -0
- package/dist/schema/EventDef/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/client.js +192 -0
- package/dist/schema/EventSequenceNumber/client.js.map +1 -0
- package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
- package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/global.js +14 -0
- package/dist/schema/EventSequenceNumber/global.js.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.js +37 -0
- package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +44 -44
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.d.ts +168 -0
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/client.js +179 -0
- package/dist/schema/LiveStoreEvent/client.js.map +1 -0
- package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
- package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/client.test.js +120 -0
- package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
- package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
- package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/global.js +31 -0
- package/dist/schema/LiveStoreEvent/global.js.map +1 -0
- package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
- package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/input.js +26 -0
- package/dist/schema/LiveStoreEvent/input.js.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.js +5 -0
- package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
- package/dist/schema/events.d.ts +1 -1
- package/dist/schema/events.d.ts.map +1 -1
- package/dist/schema/events.js +1 -1
- package/dist/schema/events.js.map +1 -1
- package/dist/schema/mod.d.ts +7 -4
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +6 -4
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +16 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +34 -5
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +14 -18
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +54 -30
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +146 -6
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
- package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.js +13 -15
- package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
- package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.d.ts +1 -1
- package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +132 -57
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +155 -70
- package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-spec.js +30 -12
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +26 -17
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +15 -6
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +25 -19
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +22 -16
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +14 -12
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +3 -5
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +6 -8
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/persistence.d.ts +11 -0
- package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
- package/dist/schema/state/sqlite/persistence.js +10 -0
- package/dist/schema/state/sqlite/persistence.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/api.d.ts +58 -29
- package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/astToSql.js +105 -24
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts +4 -2
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +42 -27
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +402 -498
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +24 -14
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +515 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
- package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
- package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +678 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js +87 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
- package/dist/schema/state/sqlite/table-def.d.ts +19 -20
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +54 -4
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +226 -20
- package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
- package/dist/schema/unknown-events.d.ts +47 -0
- package/dist/schema/unknown-events.d.ts.map +1 -0
- package/dist/schema/unknown-events.js +70 -0
- package/dist/schema/unknown-events.js.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
- package/dist/schema-management/common.js +2 -2
- package/dist/schema-management/common.js.map +1 -1
- package/dist/schema-management/migrations.d.ts +32 -2
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +38 -6
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts +3 -3
- package/dist/schema-management/validate-schema.d.ts.map +1 -1
- package/dist/schema-management/validate-schema.js +2 -2
- package/dist/schema-management/validate-schema.js.map +1 -1
- package/dist/session-id-symbol.d.ts +29 -0
- package/dist/session-id-symbol.d.ts.map +1 -0
- package/dist/session-id-symbol.js +44 -0
- package/dist/session-id-symbol.js.map +1 -0
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +26 -16
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
- package/dist/sql-queries/sql-query-builder.js.map +1 -1
- package/dist/sql-queries/types.d.ts +6 -7
- package/dist/sql-queries/types.d.ts.map +1 -1
- package/dist/sql-queries/types.js.map +1 -1
- package/dist/sqlite-db-helper.d.ts +21 -1
- package/dist/sqlite-db-helper.d.ts.map +1 -1
- package/dist/sqlite-db-helper.js +40 -5
- package/dist/sqlite-db-helper.js.map +1 -1
- package/dist/sqlite-types.d.ts +8 -11
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sqlite-types.js +3 -3
- package/dist/sqlite-types.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +47 -25
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +269 -154
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +12 -51
- package/dist/sync/errors.d.ts.map +1 -1
- package/dist/sync/errors.js +7 -24
- package/dist/sync/errors.js.map +1 -1
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +2 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +11 -10
- package/dist/sync/mock-sync-backend.d.ts.map +1 -1
- package/dist/sync/mock-sync-backend.js +97 -74
- package/dist/sync/mock-sync-backend.js.map +1 -1
- package/dist/sync/mock-sync-backend.test.d.ts +2 -0
- package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
- package/dist/sync/mock-sync-backend.test.js +49 -0
- package/dist/sync/mock-sync-backend.test.js.map +1 -0
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +11 -12
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +5 -5
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +7 -8
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +58 -15
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +219 -9
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.d.ts.map +1 -1
- package/dist/sync/next/history-dag.js +12 -11
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +5 -5
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +6 -6
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +4 -4
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +2 -2
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts +9 -9
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +12 -12
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
- package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
- package/dist/sync/next/test/history-dag-common.test.js +73 -0
- package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
- package/dist/sync/sync-backend-kv.d.ts +3 -3
- package/dist/sync/sync-backend-kv.d.ts.map +1 -1
- package/dist/sync/sync-backend-kv.js +6 -4
- package/dist/sync/sync-backend-kv.js.map +1 -1
- package/dist/sync/sync-backend.d.ts +41 -21
- package/dist/sync/sync-backend.d.ts.map +1 -1
- package/dist/sync/sync-backend.js +45 -4
- package/dist/sync/sync-backend.js.map +1 -1
- package/dist/sync/sync.d.ts +23 -2
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/syncstate.d.ts +115 -191
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +108 -129
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +289 -161
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/transport-chunking.d.ts +35 -0
- package/dist/sync/transport-chunking.d.ts.map +1 -0
- package/dist/sync/transport-chunking.js +47 -0
- package/dist/sync/transport-chunking.js.map +1 -0
- 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 +4 -6
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/testing/event-factory.d.ts +3 -3
- package/dist/testing/event-factory.d.ts.map +1 -1
- package/dist/testing/event-factory.js +5 -7
- package/dist/testing/event-factory.js.map +1 -1
- package/dist/util.d.ts +11 -4
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +21 -4
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +24 -5
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +25 -8
- package/dist/version.js.map +1 -1
- package/package.json +50 -16
- package/src/ClientSessionLeaderThreadProxy.ts +27 -12
- package/src/MaterializationJournal.ts +184 -0
- package/src/StateHead.ts +80 -0
- package/src/WorkerTransportError.ts +12 -0
- package/src/__tests__/fixture.ts +3 -3
- package/src/adapter-types.ts +62 -56
- package/src/bounded-collections.ts +6 -5
- package/src/debug-info.ts +54 -43
- package/src/defs.ts +2 -2
- package/src/devtools/devtools-compatibility.test.ts +19 -0
- package/src/devtools/devtools-messages-client-session.ts +72 -63
- package/src/devtools/devtools-messages-common.ts +18 -22
- package/src/devtools/devtools-messages-leader.ts +89 -68
- package/src/devtools/devtools-sessioninfo.ts +17 -12
- package/src/devtools/mod.ts +15 -7
- package/src/errors.ts +58 -38
- package/src/index.ts +11 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +927 -674
- package/src/leader-thread/RejectedPushError.ts +119 -0
- package/src/leader-thread/connection.ts +13 -9
- package/src/leader-thread/eventlog.ts +114 -41
- package/src/leader-thread/leader-worker-devtools.ts +223 -124
- package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
- package/src/leader-thread/make-leader-thread-layer.ts +170 -82
- package/src/leader-thread/materialize-event.ts +51 -16
- package/src/leader-thread/mod.ts +1 -0
- package/src/leader-thread/recreate-db.ts +26 -61
- package/src/leader-thread/shutdown-channel.ts +3 -18
- package/src/leader-thread/stream-events.ts +209 -0
- package/src/leader-thread/types.ts +77 -65
- package/src/logging.ts +15 -0
- package/src/make-client-session.ts +16 -10
- package/src/materializer-helper.ts +31 -49
- package/src/otel.ts +15 -13
- package/src/rematerialize-from-eventlog.ts +106 -93
- package/src/schema/EventDef/define.test.ts +28 -0
- package/src/schema/EventDef/define.ts +218 -0
- package/src/schema/EventDef/deprecated.test.ts +122 -0
- package/src/schema/EventDef/deprecated.ts +172 -0
- package/src/schema/EventDef/event-def.ts +123 -0
- package/src/schema/EventDef/facts.ts +135 -0
- package/src/schema/EventDef/materializer.ts +172 -0
- package/src/schema/EventDef/mod.ts +5 -0
- package/src/schema/EventSequenceNumber/client.ts +256 -0
- package/src/schema/EventSequenceNumber/global.ts +19 -0
- package/src/schema/EventSequenceNumber/mod.ts +37 -0
- package/src/schema/EventSequenceNumber.test.ts +72 -53
- package/src/schema/LiveStoreEvent/client.test.ts +142 -0
- package/src/schema/LiveStoreEvent/client.ts +236 -0
- package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
- package/src/schema/LiveStoreEvent/global.ts +45 -0
- package/src/schema/LiveStoreEvent/input.ts +63 -0
- package/src/schema/LiveStoreEvent/mod.ts +4 -0
- package/src/schema/events.ts +1 -1
- package/src/schema/mod.ts +7 -4
- package/src/schema/schema.ts +48 -6
- package/src/schema/state/sqlite/client-document-def.test.ts +172 -14
- package/src/schema/state/sqlite/client-document-def.ts +126 -98
- package/src/schema/state/sqlite/column-annotations.test.ts +27 -45
- package/src/schema/state/sqlite/column-annotations.ts +27 -30
- package/src/schema/state/sqlite/column-def.test.ts +186 -77
- package/src/schema/state/sqlite/column-def.ts +169 -62
- package/src/schema/state/sqlite/column-spec.test.ts +34 -19
- package/src/schema/state/sqlite/column-spec.ts +38 -11
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +17 -7
- package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +37 -17
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +65 -45
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +48 -40
- package/src/schema/state/sqlite/mod.ts +9 -12
- package/src/schema/state/sqlite/persistence.ts +11 -0
- package/src/schema/state/sqlite/query-builder/api.ts +61 -23
- package/src/schema/state/sqlite/query-builder/astToSql.ts +117 -23
- package/src/schema/state/sqlite/query-builder/impl.test.ts +489 -551
- package/src/schema/state/sqlite/query-builder/impl.ts +43 -26
- package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
- package/src/schema/state/sqlite/schema-helpers.ts +30 -22
- package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
- package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
- package/src/schema/state/sqlite/system-tables/state-tables.ts +109 -0
- package/src/schema/state/sqlite/table-def.test.ts +295 -46
- package/src/schema/state/sqlite/table-def.ts +109 -64
- package/src/schema/unknown-events.ts +132 -0
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
- package/src/schema-management/common.ts +2 -2
- package/src/schema-management/migrations.ts +42 -9
- package/src/schema-management/validate-schema.ts +3 -3
- package/src/session-id-symbol.ts +59 -0
- package/src/sql-queries/sql-queries.ts +26 -18
- package/src/sql-queries/sql-query-builder.ts +1 -0
- package/src/sql-queries/types.ts +6 -7
- package/src/sqlite-db-helper.ts +67 -5
- package/src/sqlite-types.ts +9 -11
- package/src/sync/ClientSessionSyncProcessor.ts +388 -194
- package/src/sync/errors.ts +18 -28
- package/src/sync/index.ts +2 -0
- package/src/sync/mock-sync-backend.test.ts +78 -0
- package/src/sync/mock-sync-backend.ts +196 -108
- package/src/sync/next/compact-events.ts +10 -11
- package/src/sync/next/facts.ts +13 -14
- package/src/sync/next/history-dag-common.ts +306 -26
- package/src/sync/next/history-dag.ts +20 -13
- package/src/sync/next/rebase-events.ts +12 -12
- package/src/sync/next/test/compact-events.calculator.test.ts +5 -4
- package/src/sync/next/test/compact-events.test.ts +4 -3
- package/src/sync/next/test/event-fixtures.ts +14 -14
- package/src/sync/next/test/history-dag-common.test.ts +87 -0
- package/src/sync/sync-backend-kv.ts +7 -4
- package/src/sync/sync-backend.ts +75 -26
- package/src/sync/sync.ts +24 -2
- package/src/sync/syncstate.test.ts +657 -442
- package/src/sync/syncstate.ts +175 -160
- package/src/sync/transport-chunking.ts +85 -0
- package/src/sync/validate-push-payload.ts +6 -8
- package/src/testing/event-factory.ts +10 -12
- package/src/util.ts +20 -11
- package/src/version.ts +32 -8
- package/dist/schema/EventDef.d.ts +0 -126
- package/dist/schema/EventDef.d.ts.map +0 -1
- package/dist/schema/EventDef.js +0 -46
- package/dist/schema/EventDef.js.map +0 -1
- package/dist/schema/EventSequenceNumber.d.ts +0 -80
- package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
- package/dist/schema/EventSequenceNumber.js +0 -139
- package/dist/schema/EventSequenceNumber.js.map +0 -1
- package/dist/schema/LiveStoreEvent.d.ts +0 -306
- package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
- package/dist/schema/LiveStoreEvent.js +0 -147
- package/dist/schema/LiveStoreEvent.js.map +0 -1
- package/dist/schema/state/sqlite/system-tables.d.ts +0 -976
- package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
- package/dist/schema/state/sqlite/system-tables.js +0 -81
- package/dist/schema/state/sqlite/system-tables.js.map +0 -1
- package/dist/sql-queries/misc.d.ts +0 -2
- package/dist/sql-queries/misc.d.ts.map +0 -1
- package/dist/sql-queries/misc.js +0 -2
- package/dist/sql-queries/misc.js.map +0 -1
- package/dist/sync/next/graphology.d.ts +0 -8
- package/dist/sync/next/graphology.d.ts.map +0 -1
- package/dist/sync/next/graphology.js +0 -30
- package/dist/sync/next/graphology.js.map +0 -1
- package/dist/sync/next/graphology_.d.ts +0 -3
- package/dist/sync/next/graphology_.d.ts.map +0 -1
- package/dist/sync/next/graphology_.js +0 -3
- package/dist/sync/next/graphology_.js.map +0 -1
- package/src/schema/EventDef.ts +0 -222
- package/src/schema/EventSequenceNumber.ts +0 -199
- package/src/schema/LiveStoreEvent.ts +0 -286
- package/src/schema/state/sqlite/system-tables.ts +0 -106
- package/src/sql-queries/misc.ts +0 -2
- package/src/sync/next/ambient.d.ts +0 -3
- package/src/sync/next/graphology.ts +0 -41
- package/src/sync/next/graphology_.ts +0 -2
package/src/sync/syncstate.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { casesHandled
|
|
2
|
-
import { Match, ReadonlyArray, Schema } from '@livestore/utils/effect'
|
|
1
|
+
import { casesHandled } from '@livestore/utils'
|
|
2
|
+
import { Effect, Match, ReadonlyArray, Schema } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
|
-
import * as EventSequenceNumber from '../schema/EventSequenceNumber.ts'
|
|
5
|
-
import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
|
|
4
|
+
import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts'
|
|
5
|
+
import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* SyncState represents the current sync state of a sync node relative to an upstream node.
|
|
@@ -15,7 +15,7 @@ import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
|
|
|
15
15
|
* +------------------------+
|
|
16
16
|
* ▼ ▼
|
|
17
17
|
* Upstream Head Local Head
|
|
18
|
-
*
|
|
18
|
+
* e1 e1.1, e1.2, e2
|
|
19
19
|
* ```
|
|
20
20
|
*
|
|
21
21
|
* **Pending Events**: Events awaiting acknowledgment from the upstream.
|
|
@@ -31,7 +31,7 @@ import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
|
|
|
31
31
|
* Invariants:
|
|
32
32
|
* 1. **Chain Continuity**: Each event must reference its immediate parent.
|
|
33
33
|
* 2. **Head Ordering**: Upstream Head ≤ Local Head.
|
|
34
|
-
* 3. **Event number sequence**: Must follow the pattern
|
|
34
|
+
* 3. **Event number sequence**: Must follow the pattern e1→e1.1→e1.2→e2.
|
|
35
35
|
*
|
|
36
36
|
* A few further notes to help form an intuition:
|
|
37
37
|
* - The goal is to keep the pending events as small as possible (i.e. to have synced with the next upstream node)
|
|
@@ -42,40 +42,40 @@ import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
|
|
|
42
42
|
* handling cases such as upstream rebase, advance and local push.
|
|
43
43
|
*/
|
|
44
44
|
export class SyncState extends Schema.Class<SyncState>('SyncState')({
|
|
45
|
-
pending: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
45
|
+
pending: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
46
46
|
/** What this node expects the next upstream node to have as its own local head */
|
|
47
|
-
upstreamHead: EventSequenceNumber.
|
|
47
|
+
upstreamHead: EventSequenceNumber.Client.Composite,
|
|
48
48
|
/** Equivalent to `pending.at(-1)?.id` if there are pending events */
|
|
49
|
-
localHead: EventSequenceNumber.
|
|
49
|
+
localHead: EventSequenceNumber.Client.Composite,
|
|
50
50
|
}) {
|
|
51
51
|
toJSON = (): any => ({
|
|
52
52
|
pending: this.pending.map((e) => e.toJSON()),
|
|
53
|
-
upstreamHead: EventSequenceNumber.toString(this.upstreamHead),
|
|
54
|
-
localHead: EventSequenceNumber.toString(this.localHead),
|
|
53
|
+
upstreamHead: EventSequenceNumber.Client.toString(this.upstreamHead),
|
|
54
|
+
localHead: EventSequenceNumber.Client.toString(this.localHead),
|
|
55
55
|
})
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
59
|
* This payload propagates a rebase from the upstream node
|
|
60
60
|
*/
|
|
61
|
-
export
|
|
61
|
+
export const PayloadUpstreamRebase = Schema.TaggedStruct('upstream-rebase', {
|
|
62
62
|
/** Events which need to be rolled back */
|
|
63
|
-
rollbackEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
63
|
+
rollbackEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
64
64
|
/** Events which need to be applied after the rollback (already rebased by the upstream node) */
|
|
65
|
-
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
66
|
-
})
|
|
65
|
+
newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
66
|
+
})
|
|
67
67
|
|
|
68
|
-
export
|
|
69
|
-
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
70
|
-
})
|
|
68
|
+
export const PayloadUpstreamAdvance = Schema.TaggedStruct('upstream-advance', {
|
|
69
|
+
newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
70
|
+
})
|
|
71
71
|
|
|
72
|
-
export
|
|
73
|
-
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
74
|
-
})
|
|
72
|
+
export const PayloadLocalPush = Schema.TaggedStruct('local-push', {
|
|
73
|
+
newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
74
|
+
})
|
|
75
75
|
|
|
76
|
-
export
|
|
76
|
+
export const Payload = Schema.Union([PayloadUpstreamRebase, PayloadUpstreamAdvance, PayloadLocalPush])
|
|
77
77
|
|
|
78
|
-
export
|
|
78
|
+
export const PayloadUpstream = Schema.Union([PayloadUpstreamRebase, PayloadUpstreamAdvance])
|
|
79
79
|
|
|
80
80
|
/** Only used for debugging purposes */
|
|
81
81
|
export class MergeContext extends Schema.Class<MergeContext>('MergeContext')({
|
|
@@ -109,9 +109,9 @@ export class MergeContext extends Schema.Class<MergeContext>('MergeContext')({
|
|
|
109
109
|
export class MergeResultAdvance extends Schema.Class<MergeResultAdvance>('MergeResultAdvance')({
|
|
110
110
|
_tag: Schema.Literal('advance'),
|
|
111
111
|
newSyncState: SyncState,
|
|
112
|
-
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
112
|
+
newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
113
113
|
/** Events which were previously pending but are now confirmed */
|
|
114
|
-
confirmedEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
114
|
+
confirmedEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
115
115
|
mergeContext: MergeContext,
|
|
116
116
|
}) {
|
|
117
117
|
toJSON = (): any => {
|
|
@@ -128,9 +128,9 @@ export class MergeResultAdvance extends Schema.Class<MergeResultAdvance>('MergeR
|
|
|
128
128
|
export class MergeResultRebase extends Schema.Class<MergeResultRebase>('MergeResultRebase')({
|
|
129
129
|
_tag: Schema.Literal('rebase'),
|
|
130
130
|
newSyncState: SyncState,
|
|
131
|
-
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
131
|
+
newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
132
132
|
/** Events which need to be rolled back */
|
|
133
|
-
rollbackEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
133
|
+
rollbackEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
134
134
|
mergeContext: MergeContext,
|
|
135
135
|
}) {
|
|
136
136
|
toJSON = (): any => {
|
|
@@ -147,32 +147,22 @@ export class MergeResultRebase extends Schema.Class<MergeResultRebase>('MergeRes
|
|
|
147
147
|
export class MergeResultReject extends Schema.Class<MergeResultReject>('MergeResultReject')({
|
|
148
148
|
_tag: Schema.Literal('reject'),
|
|
149
149
|
/** The minimum id that the new events must have */
|
|
150
|
-
expectedMinimumId: EventSequenceNumber.
|
|
150
|
+
expectedMinimumId: EventSequenceNumber.Client.Composite,
|
|
151
151
|
mergeContext: MergeContext,
|
|
152
152
|
}) {
|
|
153
153
|
toJSON = (): any => {
|
|
154
154
|
return {
|
|
155
155
|
_tag: this._tag,
|
|
156
|
-
expectedMinimumId: EventSequenceNumber.toString(this.expectedMinimumId),
|
|
156
|
+
expectedMinimumId: EventSequenceNumber.Client.toString(this.expectedMinimumId),
|
|
157
157
|
mergeContext: this.mergeContext.toJSON(),
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
export
|
|
163
|
-
_tag: Schema.Literal('unexpected-error'),
|
|
164
|
-
message: Schema.String,
|
|
165
|
-
}) {}
|
|
166
|
-
|
|
167
|
-
export class MergeResult extends Schema.Union(
|
|
168
|
-
MergeResultAdvance,
|
|
169
|
-
MergeResultRebase,
|
|
170
|
-
MergeResultReject,
|
|
171
|
-
MergeResultUnexpectedError,
|
|
172
|
-
) {}
|
|
162
|
+
export const MergeResult = Schema.Union([MergeResultAdvance, MergeResultRebase, MergeResultReject])
|
|
173
163
|
|
|
174
164
|
export const payloadFromMergeResult = (
|
|
175
|
-
mergeResult:
|
|
165
|
+
mergeResult: MergeResultAdvance | MergeResultRebase,
|
|
176
166
|
): typeof PayloadUpstream.Type =>
|
|
177
167
|
Match.value(mergeResult).pipe(
|
|
178
168
|
Match.tag('advance', (result) => ({
|
|
@@ -187,15 +177,6 @@ export const payloadFromMergeResult = (
|
|
|
187
177
|
Match.exhaustive,
|
|
188
178
|
)
|
|
189
179
|
|
|
190
|
-
const unexpectedError = (message: string): MergeResultUnexpectedError => {
|
|
191
|
-
if (LS_DEV) {
|
|
192
|
-
// biome-ignore lint/suspicious/noDebugger: debug
|
|
193
|
-
debugger
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
return MergeResultUnexpectedError.make({ _tag: 'unexpected-error', message })
|
|
197
|
-
}
|
|
198
|
-
|
|
199
180
|
// TODO Idea: call merge recursively through hierarchy levels
|
|
200
181
|
/*
|
|
201
182
|
Idea: have a map that maps from `globalEventSequenceNumber` to Array<ClientEvents>
|
|
@@ -203,22 +184,37 @@ The same applies to even further hierarchy levels
|
|
|
203
184
|
|
|
204
185
|
TODO: possibly even keep the client events in a separate table in the client leader
|
|
205
186
|
*/
|
|
206
|
-
export const merge = ({
|
|
187
|
+
export const merge = Effect.fnUntraced(function* ({
|
|
207
188
|
syncState,
|
|
208
189
|
payload,
|
|
209
|
-
|
|
190
|
+
isClientOnlyEvent,
|
|
210
191
|
isEqualEvent,
|
|
211
|
-
|
|
192
|
+
ignoreClientOnlyEvents = false,
|
|
212
193
|
}: {
|
|
213
194
|
syncState: SyncState
|
|
214
195
|
payload: typeof Payload.Type
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
196
|
+
/**
|
|
197
|
+
* `LiveStoreEvent.Client.EncodedWithMeta` does not carry the event definition's
|
|
198
|
+
* `clientOnly` flag. The caller supplies this schema-aware predicate so `merge`
|
|
199
|
+
* can preserve the correct sequence-number shape when rebasing: client-only
|
|
200
|
+
* events advance the client component, synced events advance the global component.
|
|
201
|
+
*/
|
|
202
|
+
isClientOnlyEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
|
|
203
|
+
/**
|
|
204
|
+
* Pending events are confirmed by comparing their logical encoded identity with
|
|
205
|
+
* upstream events. This is caller-supplied because comparing encoded args may
|
|
206
|
+
* require event-schema knowledge that the generic merge algorithm does not own.
|
|
207
|
+
* Implementations should ignore transport/runtime metadata.
|
|
208
|
+
*/
|
|
209
|
+
isEqualEvent: (a: LiveStoreEvent.Client.EncodedWithMeta, b: LiveStoreEvent.Client.EncodedWithMeta) => boolean
|
|
210
|
+
/**
|
|
211
|
+
* This is used in the leader which should ignore client events when
|
|
212
|
+
* receiving an upstream-advance payload
|
|
213
|
+
*/
|
|
214
|
+
ignoreClientOnlyEvents?: boolean
|
|
215
|
+
}) {
|
|
216
|
+
yield* validateSyncState(syncState)
|
|
217
|
+
yield* validatePayload(payload)
|
|
222
218
|
|
|
223
219
|
const mergeContext = MergeContext.make({ payload, syncState })
|
|
224
220
|
|
|
@@ -233,10 +229,10 @@ export const merge = ({
|
|
|
233
229
|
const rebasedPending = rebaseEvents({
|
|
234
230
|
events: syncState.pending,
|
|
235
231
|
baseEventSequenceNumber: newUpstreamHead,
|
|
236
|
-
|
|
232
|
+
isClientOnlyEvent,
|
|
237
233
|
})
|
|
238
234
|
|
|
239
|
-
return validateMergeResult(
|
|
235
|
+
return yield* validateMergeResult(
|
|
240
236
|
MergeResultRebase.make({
|
|
241
237
|
_tag: 'rebase',
|
|
242
238
|
newSyncState: new SyncState({
|
|
@@ -251,10 +247,10 @@ export const merge = ({
|
|
|
251
247
|
)
|
|
252
248
|
}
|
|
253
249
|
|
|
254
|
-
|
|
250
|
+
//#region upstream-advance
|
|
255
251
|
case 'upstream-advance': {
|
|
256
252
|
if (payload.newEvents.length === 0) {
|
|
257
|
-
return validateMergeResult(
|
|
253
|
+
return yield* validateMergeResult(
|
|
258
254
|
MergeResultAdvance.make({
|
|
259
255
|
_tag: 'advance',
|
|
260
256
|
newSyncState: new SyncState({
|
|
@@ -271,20 +267,23 @@ export const merge = ({
|
|
|
271
267
|
|
|
272
268
|
// Validate that newEvents are sorted in ascending order by eventNum
|
|
273
269
|
for (let i = 1; i < payload.newEvents.length; i++) {
|
|
274
|
-
if (
|
|
275
|
-
|
|
276
|
-
|
|
270
|
+
if (
|
|
271
|
+
EventSequenceNumber.Client.isGreaterThan(payload.newEvents[i - 1]!.seqNum, payload.newEvents[i]!.seqNum) ===
|
|
272
|
+
true
|
|
273
|
+
) {
|
|
274
|
+
return yield* Effect.dieDebugger(
|
|
275
|
+
`Events must be sorted in ascending order by event number. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
|
|
277
276
|
)
|
|
278
277
|
}
|
|
279
278
|
}
|
|
280
279
|
|
|
281
280
|
// Validate that incoming events are larger than upstream head
|
|
282
281
|
if (
|
|
283
|
-
EventSequenceNumber.isGreaterThan(syncState.upstreamHead, payload.newEvents[0]!.seqNum) ||
|
|
284
|
-
EventSequenceNumber.isEqual(syncState.upstreamHead, payload.newEvents[0]!.seqNum)
|
|
282
|
+
EventSequenceNumber.Client.isGreaterThan(syncState.upstreamHead, payload.newEvents[0]!.seqNum) === true ||
|
|
283
|
+
EventSequenceNumber.Client.isEqual(syncState.upstreamHead, payload.newEvents[0]!.seqNum) === true
|
|
285
284
|
) {
|
|
286
|
-
return
|
|
287
|
-
`Incoming events must be greater than upstream head. Expected greater than: ${EventSequenceNumber.toString(syncState.upstreamHead)}. Received: [${payload.newEvents.map((e) => EventSequenceNumber.toString(e.seqNum)).join(', ')}]`,
|
|
285
|
+
return yield* Effect.dieDebugger(
|
|
286
|
+
`Incoming events must be greater than upstream head. Expected greater than: ${EventSequenceNumber.Client.toString(syncState.upstreamHead)}. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
|
|
288
287
|
)
|
|
289
288
|
}
|
|
290
289
|
|
|
@@ -294,8 +293,8 @@ export const merge = ({
|
|
|
294
293
|
existingEvents: syncState.pending,
|
|
295
294
|
incomingEvents: payload.newEvents,
|
|
296
295
|
isEqualEvent,
|
|
297
|
-
|
|
298
|
-
|
|
296
|
+
isClientOnlyEvent,
|
|
297
|
+
ignoreClientOnlyEvents,
|
|
299
298
|
})
|
|
300
299
|
|
|
301
300
|
// No divergent pending events, thus we can just advance (some of) the pending events
|
|
@@ -316,27 +315,27 @@ export const merge = ({
|
|
|
316
315
|
const [pendingMatching, pendingRemaining] = ReadonlyArray.splitWhere(
|
|
317
316
|
syncState.pending,
|
|
318
317
|
(pendingEvent, index) => {
|
|
319
|
-
if (
|
|
318
|
+
if (ignoreClientOnlyEvents === true && isClientOnlyEvent(pendingEvent) === true) {
|
|
320
319
|
clientIndexOffset++
|
|
321
320
|
return false
|
|
322
321
|
}
|
|
323
322
|
|
|
324
323
|
const newEvent = payload.newEvents.at(index - clientIndexOffset)
|
|
325
|
-
if (
|
|
324
|
+
if (newEvent == null) {
|
|
326
325
|
return true
|
|
327
326
|
}
|
|
328
|
-
return isEqualEvent(pendingEvent, newEvent)
|
|
327
|
+
return !isEqualEvent(pendingEvent, newEvent)
|
|
329
328
|
},
|
|
330
329
|
)
|
|
331
330
|
|
|
332
|
-
return validateMergeResult(
|
|
331
|
+
return yield* validateMergeResult(
|
|
333
332
|
MergeResultAdvance.make({
|
|
334
333
|
_tag: 'advance',
|
|
335
334
|
newSyncState: new SyncState({
|
|
336
335
|
pending: pendingRemaining,
|
|
337
336
|
upstreamHead: newUpstreamHead,
|
|
338
337
|
localHead:
|
|
339
|
-
pendingRemaining.at(-1)?.seqNum ?? EventSequenceNumber.max(syncState.localHead, newUpstreamHead),
|
|
338
|
+
pendingRemaining.at(-1)?.seqNum ?? EventSequenceNumber.Client.max(syncState.localHead, newUpstreamHead),
|
|
340
339
|
}),
|
|
341
340
|
newEvents,
|
|
342
341
|
confirmedEvents: pendingMatching,
|
|
@@ -348,18 +347,18 @@ export const merge = ({
|
|
|
348
347
|
const rebasedPending = rebaseEvents({
|
|
349
348
|
events: divergentPending,
|
|
350
349
|
baseEventSequenceNumber: newUpstreamHead,
|
|
351
|
-
|
|
350
|
+
isClientOnlyEvent: isClientOnlyEvent,
|
|
352
351
|
})
|
|
353
352
|
|
|
354
353
|
const divergentNewEventsIndex = findDivergencePoint({
|
|
355
354
|
existingEvents: payload.newEvents,
|
|
356
355
|
incomingEvents: syncState.pending,
|
|
357
356
|
isEqualEvent,
|
|
358
|
-
|
|
359
|
-
|
|
357
|
+
isClientOnlyEvent: isClientOnlyEvent,
|
|
358
|
+
ignoreClientOnlyEvents: ignoreClientOnlyEvents,
|
|
360
359
|
})
|
|
361
360
|
|
|
362
|
-
return validateMergeResult(
|
|
361
|
+
return yield* validateMergeResult(
|
|
363
362
|
MergeResultRebase.make({
|
|
364
363
|
_tag: 'rebase',
|
|
365
364
|
newSyncState: new SyncState({
|
|
@@ -374,12 +373,12 @@ export const merge = ({
|
|
|
374
373
|
)
|
|
375
374
|
}
|
|
376
375
|
}
|
|
377
|
-
|
|
376
|
+
//#endregion upstream-advance
|
|
378
377
|
|
|
379
378
|
// This is the same as what's running in the sync backend
|
|
380
379
|
case 'local-push': {
|
|
381
380
|
if (payload.newEvents.length === 0) {
|
|
382
|
-
return validateMergeResult(
|
|
381
|
+
return yield* validateMergeResult(
|
|
383
382
|
MergeResultAdvance.make({
|
|
384
383
|
_tag: 'advance',
|
|
385
384
|
newSyncState: syncState,
|
|
@@ -391,15 +390,17 @@ export const merge = ({
|
|
|
391
390
|
}
|
|
392
391
|
|
|
393
392
|
const newEventsFirst = payload.newEvents.at(0)!
|
|
394
|
-
const invalidEventSequenceNumber =
|
|
395
|
-
|
|
393
|
+
const invalidEventSequenceNumber = !EventSequenceNumber.Client.isGreaterThan(
|
|
394
|
+
newEventsFirst.seqNum,
|
|
395
|
+
syncState.localHead,
|
|
396
|
+
)
|
|
396
397
|
|
|
397
|
-
if (invalidEventSequenceNumber) {
|
|
398
|
-
const expectedMinimumId = EventSequenceNumber.nextPair({
|
|
398
|
+
if (invalidEventSequenceNumber === true) {
|
|
399
|
+
const expectedMinimumId = EventSequenceNumber.Client.nextPair({
|
|
399
400
|
seqNum: syncState.localHead,
|
|
400
|
-
|
|
401
|
+
isClientOnly: true,
|
|
401
402
|
}).seqNum
|
|
402
|
-
return validateMergeResult(
|
|
403
|
+
return yield* validateMergeResult(
|
|
403
404
|
MergeResultReject.make({
|
|
404
405
|
_tag: 'reject',
|
|
405
406
|
expectedMinimumId,
|
|
@@ -407,13 +408,21 @@ export const merge = ({
|
|
|
407
408
|
}),
|
|
408
409
|
)
|
|
409
410
|
} else {
|
|
410
|
-
|
|
411
|
+
const nonClientOnlyEvents =
|
|
412
|
+
ignoreClientOnlyEvents === true
|
|
413
|
+
? payload.newEvents.filter((event) => !isClientOnlyEvent(event))
|
|
414
|
+
: payload.newEvents
|
|
415
|
+
const newPending = [...syncState.pending, ...nonClientOnlyEvents]
|
|
416
|
+
const newLocalHead =
|
|
417
|
+
newPending.at(-1)?.seqNum ?? EventSequenceNumber.Client.max(syncState.localHead, syncState.upstreamHead)
|
|
418
|
+
|
|
419
|
+
return yield* validateMergeResult(
|
|
411
420
|
MergeResultAdvance.make({
|
|
412
421
|
_tag: 'advance',
|
|
413
422
|
newSyncState: new SyncState({
|
|
414
|
-
pending:
|
|
423
|
+
pending: newPending,
|
|
415
424
|
upstreamHead: syncState.upstreamHead,
|
|
416
|
-
localHead:
|
|
425
|
+
localHead: newLocalHead,
|
|
417
426
|
}),
|
|
418
427
|
newEvents: payload.newEvents,
|
|
419
428
|
confirmedEvents: [],
|
|
@@ -423,11 +432,10 @@ export const merge = ({
|
|
|
423
432
|
}
|
|
424
433
|
}
|
|
425
434
|
|
|
426
|
-
default:
|
|
427
|
-
casesHandled(payload)
|
|
428
|
-
}
|
|
435
|
+
default:
|
|
436
|
+
return casesHandled(payload)
|
|
429
437
|
}
|
|
430
|
-
}
|
|
438
|
+
})
|
|
431
439
|
|
|
432
440
|
/**
|
|
433
441
|
* Gets the index relative to `existingEvents` where the divergence point is
|
|
@@ -437,57 +445,58 @@ export const findDivergencePoint = ({
|
|
|
437
445
|
existingEvents,
|
|
438
446
|
incomingEvents,
|
|
439
447
|
isEqualEvent,
|
|
440
|
-
|
|
441
|
-
|
|
448
|
+
isClientOnlyEvent,
|
|
449
|
+
ignoreClientOnlyEvents,
|
|
442
450
|
}: {
|
|
443
|
-
existingEvents: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
|
|
444
|
-
incomingEvents: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
|
|
445
|
-
isEqualEvent: (a: LiveStoreEvent.EncodedWithMeta, b: LiveStoreEvent.EncodedWithMeta) => boolean
|
|
446
|
-
|
|
447
|
-
|
|
451
|
+
existingEvents: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>
|
|
452
|
+
incomingEvents: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>
|
|
453
|
+
isEqualEvent: (a: LiveStoreEvent.Client.EncodedWithMeta, b: LiveStoreEvent.Client.EncodedWithMeta) => boolean
|
|
454
|
+
isClientOnlyEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
|
|
455
|
+
ignoreClientOnlyEvents: boolean
|
|
448
456
|
}): number => {
|
|
449
|
-
if (
|
|
450
|
-
const filteredExistingEvents = existingEvents.filter((event) => !
|
|
451
|
-
const
|
|
457
|
+
if (ignoreClientOnlyEvents === true) {
|
|
458
|
+
const filteredExistingEvents = existingEvents.filter((event) => !isClientOnlyEvent(event))
|
|
459
|
+
const divergencePointWithoutClientOnlyEvents = findDivergencePoint({
|
|
452
460
|
existingEvents: filteredExistingEvents,
|
|
453
461
|
incomingEvents,
|
|
454
462
|
isEqualEvent,
|
|
455
|
-
|
|
456
|
-
|
|
463
|
+
isClientOnlyEvent,
|
|
464
|
+
ignoreClientOnlyEvents: false,
|
|
457
465
|
})
|
|
458
466
|
|
|
459
|
-
if (
|
|
467
|
+
if (divergencePointWithoutClientOnlyEvents === -1) return -1
|
|
460
468
|
|
|
461
|
-
const divergencePointEventSequenceNumber = existingEvents[
|
|
469
|
+
const divergencePointEventSequenceNumber = existingEvents[divergencePointWithoutClientOnlyEvents]!.seqNum
|
|
462
470
|
// Now find the divergence point in the original array
|
|
463
471
|
return existingEvents.findIndex((event) =>
|
|
464
|
-
EventSequenceNumber.isEqual(event.seqNum, divergencePointEventSequenceNumber),
|
|
472
|
+
EventSequenceNumber.Client.isEqual(event.seqNum, divergencePointEventSequenceNumber),
|
|
465
473
|
)
|
|
466
474
|
}
|
|
467
475
|
|
|
468
476
|
return existingEvents.findIndex((existingEvent, index) => {
|
|
469
477
|
const incomingEvent = incomingEvents[index]
|
|
470
478
|
// return !incomingEvent || !isEqualEvent(existingEvent, incomingEvent)
|
|
471
|
-
return incomingEvent &&
|
|
479
|
+
return incomingEvent !== undefined && isEqualEvent(existingEvent, incomingEvent) === false
|
|
472
480
|
})
|
|
473
481
|
}
|
|
474
482
|
|
|
475
483
|
const rebaseEvents = ({
|
|
476
484
|
events,
|
|
477
485
|
baseEventSequenceNumber,
|
|
478
|
-
|
|
486
|
+
isClientOnlyEvent,
|
|
479
487
|
}: {
|
|
480
|
-
events: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
|
|
481
|
-
baseEventSequenceNumber: EventSequenceNumber.
|
|
482
|
-
|
|
483
|
-
}): ReadonlyArray<LiveStoreEvent.EncodedWithMeta> => {
|
|
488
|
+
events: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>
|
|
489
|
+
baseEventSequenceNumber: EventSequenceNumber.Client.Composite
|
|
490
|
+
isClientOnlyEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
|
|
491
|
+
}): ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta> => {
|
|
484
492
|
let prevEventSequenceNumber = baseEventSequenceNumber
|
|
485
493
|
const rebaseGeneration = baseEventSequenceNumber.rebaseGeneration + 1
|
|
486
494
|
return events.map((event) => {
|
|
487
|
-
|
|
495
|
+
// Rebasing must preserve whether an event is client-only: client-only
|
|
496
|
+
// events become eN.1/eN.2, while synced events become eN+1.
|
|
488
497
|
const newEvent = event.rebase({
|
|
489
498
|
parentSeqNum: prevEventSequenceNumber,
|
|
490
|
-
|
|
499
|
+
isClientOnly: isClientOnlyEvent(event),
|
|
491
500
|
rebaseGeneration,
|
|
492
501
|
})
|
|
493
502
|
prevEventSequenceNumber = newEvent.seqNum
|
|
@@ -502,67 +511,73 @@ const rebaseEvents = ({
|
|
|
502
511
|
* it could make sense to "flatten" update results into a single update result which the client session
|
|
503
512
|
* can process more efficiently which avoids push-threshing
|
|
504
513
|
*/
|
|
505
|
-
const _flattenMergeResults = (_updateResults: ReadonlyArray<MergeResult>) => {}
|
|
514
|
+
const _flattenMergeResults = (_updateResults: ReadonlyArray<typeof MergeResult>) => {}
|
|
506
515
|
|
|
507
|
-
const validatePayload = (payload: typeof Payload.Type) =>
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
516
|
+
const validatePayload = (payload: typeof Payload.Type) =>
|
|
517
|
+
Effect.gen(function* () {
|
|
518
|
+
for (let i = 1; i < payload.newEvents.length; i++) {
|
|
519
|
+
if (
|
|
520
|
+
EventSequenceNumber.Client.isGreaterThanOrEqual(
|
|
521
|
+
payload.newEvents[i - 1]!.seqNum,
|
|
522
|
+
payload.newEvents[i]!.seqNum,
|
|
523
|
+
) === true
|
|
524
|
+
) {
|
|
525
|
+
return yield* Effect.dieDebugger(
|
|
526
|
+
`Events must be ordered in monotonically ascending order by eventNum. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
|
|
527
|
+
)
|
|
528
|
+
}
|
|
513
529
|
}
|
|
514
|
-
}
|
|
515
|
-
}
|
|
530
|
+
})
|
|
516
531
|
|
|
517
|
-
const validateSyncState = (syncState: SyncState)
|
|
532
|
+
const validateSyncState = Effect.fnUntraced(function* (syncState: SyncState) {
|
|
518
533
|
for (let i = 0; i < syncState.pending.length; i++) {
|
|
519
534
|
const event = syncState.pending[i]!
|
|
520
535
|
const nextEvent = syncState.pending[i + 1]
|
|
521
536
|
if (nextEvent === undefined) break // Reached end of chain
|
|
522
537
|
|
|
523
|
-
if (EventSequenceNumber.isGreaterThanOrEqual(event.seqNum, nextEvent.seqNum)) {
|
|
524
|
-
|
|
525
|
-
`Events must be ordered in monotonically ascending order by eventNum. Received: [${syncState.pending.map((e) => EventSequenceNumber.toString(e.seqNum)).join(', ')}]`,
|
|
526
|
-
{
|
|
527
|
-
event,
|
|
528
|
-
nextEvent,
|
|
529
|
-
},
|
|
538
|
+
if (EventSequenceNumber.Client.isGreaterThanOrEqual(event.seqNum, nextEvent.seqNum) === true) {
|
|
539
|
+
return yield* Effect.dieDebugger(
|
|
540
|
+
`Events must be ordered in monotonically ascending order by eventNum. Received: [${syncState.pending.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
|
|
541
|
+
{ event, nextEvent },
|
|
530
542
|
)
|
|
531
543
|
}
|
|
532
544
|
|
|
533
545
|
// If the global id has increased, then the client id must be 0
|
|
534
546
|
const globalIdHasIncreased = nextEvent.seqNum.global > event.seqNum.global
|
|
535
|
-
if (globalIdHasIncreased) {
|
|
547
|
+
if (globalIdHasIncreased === true) {
|
|
536
548
|
if (nextEvent.seqNum.client !== 0) {
|
|
537
|
-
|
|
538
|
-
`New global events must point to clientId 0 in the parentSeqNum. Received: (${EventSequenceNumber.toString(nextEvent.seqNum)})`,
|
|
549
|
+
return yield* Effect.dieDebugger(
|
|
550
|
+
`New global events must point to clientId 0 in the parentSeqNum. Received: (${EventSequenceNumber.Client.toString(nextEvent.seqNum)})`,
|
|
539
551
|
syncState.pending,
|
|
540
|
-
{
|
|
541
|
-
event,
|
|
542
|
-
nextEvent,
|
|
543
|
-
},
|
|
552
|
+
{ event, nextEvent },
|
|
544
553
|
)
|
|
545
554
|
}
|
|
546
555
|
} else {
|
|
547
556
|
// Otherwise, the parentSeqNum must be the same as the previous event's id
|
|
548
|
-
if (EventSequenceNumber.isEqual(nextEvent.parentSeqNum, event.seqNum) === false) {
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
557
|
+
if (EventSequenceNumber.Client.isEqual(nextEvent.parentSeqNum, event.seqNum) === false) {
|
|
558
|
+
return yield* Effect.dieDebugger(
|
|
559
|
+
'Events must be linked in a continuous chain via the parentSeqNum',
|
|
560
|
+
syncState.pending,
|
|
561
|
+
{ event, nextEvent },
|
|
562
|
+
)
|
|
553
563
|
}
|
|
554
564
|
}
|
|
555
565
|
}
|
|
556
|
-
}
|
|
566
|
+
})
|
|
557
567
|
|
|
558
|
-
const validateMergeResult = (mergeResult: typeof MergeResult.Type)
|
|
559
|
-
if (mergeResult._tag === '
|
|
568
|
+
const validateMergeResult = Effect.fnUntraced(function* (mergeResult: typeof MergeResult.Type) {
|
|
569
|
+
if (mergeResult._tag === 'reject') return mergeResult
|
|
560
570
|
|
|
561
|
-
validateSyncState(mergeResult.newSyncState)
|
|
571
|
+
yield* validateSyncState(mergeResult.newSyncState)
|
|
562
572
|
|
|
563
573
|
// Ensure local head is always greater than or equal to upstream head
|
|
564
|
-
if (
|
|
565
|
-
|
|
574
|
+
if (
|
|
575
|
+
EventSequenceNumber.Client.isGreaterThan(
|
|
576
|
+
mergeResult.newSyncState.upstreamHead,
|
|
577
|
+
mergeResult.newSyncState.localHead,
|
|
578
|
+
) === true
|
|
579
|
+
) {
|
|
580
|
+
return yield* Effect.dieDebugger('Local head must be greater than or equal to upstream head', {
|
|
566
581
|
localHead: mergeResult.newSyncState.localHead,
|
|
567
582
|
upstreamHead: mergeResult.newSyncState.upstreamHead,
|
|
568
583
|
})
|
|
@@ -570,12 +585,12 @@ const validateMergeResult = (mergeResult: typeof MergeResult.Type) => {
|
|
|
570
585
|
|
|
571
586
|
// Ensure new local head is greater than or equal to the previous local head
|
|
572
587
|
if (
|
|
573
|
-
EventSequenceNumber.isGreaterThanOrEqual(
|
|
588
|
+
EventSequenceNumber.Client.isGreaterThanOrEqual(
|
|
574
589
|
mergeResult.newSyncState.localHead,
|
|
575
590
|
mergeResult.mergeContext.syncState.localHead,
|
|
576
591
|
) === false
|
|
577
592
|
) {
|
|
578
|
-
|
|
593
|
+
return yield* Effect.dieDebugger('New local head must be greater than or equal to the previous local head', {
|
|
579
594
|
localHead: mergeResult.newSyncState.localHead,
|
|
580
595
|
previousLocalHead: mergeResult.mergeContext.syncState.localHead,
|
|
581
596
|
})
|
|
@@ -583,16 +598,16 @@ const validateMergeResult = (mergeResult: typeof MergeResult.Type) => {
|
|
|
583
598
|
|
|
584
599
|
// Ensure new upstream head is greater than or equal to the previous upstream head
|
|
585
600
|
if (
|
|
586
|
-
EventSequenceNumber.isGreaterThanOrEqual(
|
|
601
|
+
EventSequenceNumber.Client.isGreaterThanOrEqual(
|
|
587
602
|
mergeResult.newSyncState.upstreamHead,
|
|
588
603
|
mergeResult.mergeContext.syncState.upstreamHead,
|
|
589
604
|
) === false
|
|
590
605
|
) {
|
|
591
|
-
|
|
606
|
+
return yield* Effect.dieDebugger('New upstream head must be greater than or equal to the previous upstream head', {
|
|
592
607
|
upstreamHead: mergeResult.newSyncState.upstreamHead,
|
|
593
608
|
previousUpstreamHead: mergeResult.mergeContext.syncState.upstreamHead,
|
|
594
609
|
})
|
|
595
610
|
}
|
|
596
611
|
|
|
597
612
|
return mergeResult
|
|
598
|
-
}
|
|
613
|
+
})
|