@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
|
@@ -1,91 +1,128 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import { assert, expect } from 'vitest';
|
|
2
|
+
import { Vitest } from '@livestore/utils-dev/node-vitest';
|
|
3
|
+
import { Cause, Effect, Exit, Schema } from '@livestore/utils/effect';
|
|
4
|
+
import * as EventSequenceNumber from "../schema/EventSequenceNumber/mod.js";
|
|
5
|
+
import * as LiveStoreEvent from "../schema/LiveStoreEvent/mod.js";
|
|
4
6
|
import * as SyncState from "./syncstate.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const e1_0 =
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
7
|
+
/** Module-scoped JSON codecs; keeping the sync codecs out of Effect generators avoids `schemaSyncInEffect`. */
|
|
8
|
+
const jsonStringify = Schema.encodeSync(Schema.fromJsonString(Schema.Unknown));
|
|
9
|
+
const jsonParse = Schema.decodeUnknownSync(Schema.fromJsonString(Schema.Unknown));
|
|
10
|
+
const makeTestEvent = ({ seqNum, parentSeqNum, payload, isClientOnly, }) => new LiveStoreEvent.Client.EncodedWithMeta({
|
|
11
|
+
seqNum: EventSequenceNumber.Client.Composite.make(seqNum),
|
|
12
|
+
parentSeqNum: EventSequenceNumber.Client.Composite.make(parentSeqNum),
|
|
13
|
+
name: 'a',
|
|
14
|
+
// Effect v4 normalizes nested Schema.Class values to their declared schema fields.
|
|
15
|
+
// Keep this test-only flag inside `args`, which is part of EncodedWithMeta,
|
|
16
|
+
// instead of relying on subclass fields that are stripped during parsing.
|
|
17
|
+
args: { payload, isClientOnly },
|
|
18
|
+
clientId: 'static-local-id',
|
|
19
|
+
sessionId: 'static-session-id',
|
|
20
|
+
});
|
|
21
|
+
const e0_1 = makeTestEvent({
|
|
22
|
+
seqNum: { global: 0, client: 1 },
|
|
23
|
+
parentSeqNum: EventSequenceNumber.Client.ROOT,
|
|
24
|
+
payload: 'a',
|
|
25
|
+
isClientOnly: true,
|
|
26
|
+
});
|
|
27
|
+
const e1_0 = makeTestEvent({
|
|
28
|
+
seqNum: { global: 1, client: 0 },
|
|
29
|
+
parentSeqNum: EventSequenceNumber.Client.ROOT,
|
|
30
|
+
payload: 'a',
|
|
31
|
+
isClientOnly: false,
|
|
32
|
+
});
|
|
33
|
+
const e1_1 = makeTestEvent({
|
|
34
|
+
seqNum: { global: 1, client: 1 },
|
|
35
|
+
parentSeqNum: e1_0.seqNum,
|
|
36
|
+
payload: 'a',
|
|
37
|
+
isClientOnly: true,
|
|
38
|
+
});
|
|
39
|
+
const e1_2 = makeTestEvent({
|
|
40
|
+
seqNum: { global: 1, client: 2 },
|
|
41
|
+
parentSeqNum: e1_1.seqNum,
|
|
42
|
+
payload: 'a',
|
|
43
|
+
isClientOnly: true,
|
|
44
|
+
});
|
|
45
|
+
const e1_3 = makeTestEvent({
|
|
46
|
+
seqNum: { global: 1, client: 3 },
|
|
47
|
+
parentSeqNum: e1_2.seqNum,
|
|
48
|
+
payload: 'a',
|
|
49
|
+
isClientOnly: true,
|
|
50
|
+
});
|
|
51
|
+
const e2_0 = makeTestEvent({
|
|
52
|
+
seqNum: { global: 2, client: 0 },
|
|
53
|
+
parentSeqNum: e1_0.seqNum,
|
|
54
|
+
payload: 'a',
|
|
55
|
+
isClientOnly: false,
|
|
56
|
+
});
|
|
57
|
+
const e2_1 = makeTestEvent({
|
|
58
|
+
seqNum: { global: 2, client: 1 },
|
|
59
|
+
parentSeqNum: e2_0.seqNum,
|
|
60
|
+
payload: 'a',
|
|
61
|
+
isClientOnly: true,
|
|
62
|
+
});
|
|
63
|
+
const isEqualEvent = LiveStoreEvent.Client.isEqualEncoded;
|
|
64
|
+
const isClientOnlyEvent = (event) => typeof event.args === 'object' &&
|
|
65
|
+
event.args !== null &&
|
|
66
|
+
'isClientOnly' in event.args &&
|
|
67
|
+
event.args.isClientOnly === true;
|
|
68
|
+
const rebaseTestEvent = ({ event, parentSeqNum, rebaseGeneration, }) => event.rebase({ parentSeqNum, isClientOnly: isClientOnlyEvent(event), rebaseGeneration });
|
|
69
|
+
/** Verifies: LS.SYS.SYNC.SS-R01, LS.SYS.SYNC.SS-R02, LS.SYS.SYNC.SS-R03, LS.SYS.SYNC.SS-R05, LS.SYS.SYNC.SS-R06 */
|
|
70
|
+
Vitest.describe('syncstate', () => {
|
|
71
|
+
Vitest.describe('merge', () => {
|
|
72
|
+
const merge = ({ syncState, payload, ignoreClientOnlyEvents = false, }) => SyncState.merge({ syncState, payload, isClientOnlyEvent, isEqualEvent, ignoreClientOnlyEvents });
|
|
73
|
+
Vitest.describe('upstream-rebase', () => {
|
|
74
|
+
Vitest.it.effect('should rollback until start', () => Effect.gen(function* () {
|
|
38
75
|
const syncState = new SyncState.SyncState({
|
|
39
76
|
pending: [e2_0],
|
|
40
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
77
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
41
78
|
localHead: e2_0.seqNum,
|
|
42
79
|
});
|
|
43
|
-
const e1_0_e2_0 = e1_0
|
|
44
|
-
const e1_1_e2_1 = e1_1
|
|
45
|
-
const result = merge({
|
|
80
|
+
const e1_0_e2_0 = rebaseTestEvent({ event: e1_0, parentSeqNum: e2_0.seqNum, rebaseGeneration: 0 });
|
|
81
|
+
const e1_1_e2_1 = rebaseTestEvent({ event: e1_1, parentSeqNum: e1_0_e2_0.seqNum, rebaseGeneration: 0 });
|
|
82
|
+
const result = yield* merge({
|
|
46
83
|
syncState,
|
|
47
84
|
payload: SyncState.PayloadUpstreamRebase.make({
|
|
48
85
|
rollbackEvents: [e1_0, e1_1],
|
|
49
86
|
newEvents: [e1_0_e2_0, e1_1_e2_1],
|
|
50
87
|
}),
|
|
51
88
|
});
|
|
52
|
-
const e2_0_e3_0 = e2_0
|
|
89
|
+
const e2_0_e3_0 = rebaseTestEvent({ event: e2_0, parentSeqNum: e1_0_e2_0.seqNum, rebaseGeneration: 1 });
|
|
53
90
|
expectRebase(result);
|
|
54
91
|
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
|
|
55
92
|
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_1.seqNum);
|
|
56
93
|
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum);
|
|
57
94
|
expectEventArraysEqual(result.newEvents, [e1_0_e2_0, e1_1_e2_1, e2_0_e3_0]);
|
|
58
95
|
expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1, e2_0]);
|
|
59
|
-
});
|
|
60
|
-
it('should rollback only to specified point', () => {
|
|
96
|
+
}));
|
|
97
|
+
Vitest.it.effect('should rollback only to specified point', () => Effect.gen(function* () {
|
|
61
98
|
const syncState = new SyncState.SyncState({
|
|
62
99
|
pending: [e2_0],
|
|
63
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
100
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
64
101
|
localHead: e2_0.seqNum,
|
|
65
102
|
});
|
|
66
|
-
const e1_1_e2_0 = e1_1
|
|
67
|
-
const result = merge({
|
|
103
|
+
const e1_1_e2_0 = rebaseTestEvent({ event: e1_1, parentSeqNum: e1_0.seqNum, rebaseGeneration: 0 });
|
|
104
|
+
const result = yield* merge({
|
|
68
105
|
syncState,
|
|
69
106
|
payload: SyncState.PayloadUpstreamRebase.make({
|
|
70
107
|
newEvents: [e1_1_e2_0],
|
|
71
108
|
rollbackEvents: [e1_1],
|
|
72
109
|
}),
|
|
73
110
|
});
|
|
74
|
-
const e2_0_e3_0 = e2_0
|
|
111
|
+
const e2_0_e3_0 = rebaseTestEvent({ event: e2_0, parentSeqNum: e1_1_e2_0.seqNum, rebaseGeneration: 1 });
|
|
75
112
|
expectRebase(result);
|
|
76
113
|
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
|
|
77
114
|
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_0.seqNum);
|
|
78
115
|
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum);
|
|
79
116
|
expectEventArraysEqual(result.newEvents, [e1_1_e2_0, e2_0_e3_0]);
|
|
80
117
|
expectEventArraysEqual(result.rollbackEvents, [e1_1, e2_0]);
|
|
81
|
-
});
|
|
82
|
-
it('should work for empty pending', () => {
|
|
118
|
+
}));
|
|
119
|
+
Vitest.it.effect('should work for empty pending', () => Effect.gen(function* () {
|
|
83
120
|
const syncState = new SyncState.SyncState({
|
|
84
121
|
pending: [],
|
|
85
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
122
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
86
123
|
localHead: e1_0.seqNum,
|
|
87
124
|
});
|
|
88
|
-
const result = merge({
|
|
125
|
+
const result = yield* merge({
|
|
89
126
|
syncState,
|
|
90
127
|
payload: SyncState.PayloadUpstreamRebase.make({ rollbackEvents: [e1_0], newEvents: [e2_0] }),
|
|
91
128
|
});
|
|
@@ -93,95 +130,102 @@ describe('syncstate', () => {
|
|
|
93
130
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
94
131
|
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
|
|
95
132
|
expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
|
|
96
|
-
|
|
97
|
-
});
|
|
133
|
+
expectEventArraysEqual(result.newEvents, [e2_0]);
|
|
134
|
+
}));
|
|
98
135
|
});
|
|
99
|
-
describe('upstream-advance: advance', () => {
|
|
100
|
-
it('should
|
|
136
|
+
Vitest.describe('upstream-advance: advance', () => {
|
|
137
|
+
Vitest.it.effect('should die if newEvents are not sorted in ascending order by event number (client)', () => Effect.gen(function* () {
|
|
101
138
|
const syncState = new SyncState.SyncState({
|
|
102
139
|
pending: [e1_0],
|
|
103
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
140
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
104
141
|
localHead: e1_0.seqNum,
|
|
105
142
|
});
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
143
|
+
const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_0] } }).pipe(Effect.exit);
|
|
144
|
+
assert(Exit.isFailure(exit));
|
|
145
|
+
expect(Cause.hasDies(exit.cause)).toBe(true);
|
|
146
|
+
}));
|
|
147
|
+
Vitest.it.effect('should die if newEvents are not sorted in ascending order by event number (global)', () => Effect.gen(function* () {
|
|
110
148
|
const syncState = new SyncState.SyncState({
|
|
111
149
|
pending: [e1_0],
|
|
112
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
150
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
113
151
|
localHead: e1_0.seqNum,
|
|
114
152
|
});
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
153
|
+
const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0, e1_0] } }).pipe(Effect.exit);
|
|
154
|
+
assert(Exit.isFailure(exit));
|
|
155
|
+
expect(Cause.hasDies(exit.cause)).toBe(true);
|
|
156
|
+
}));
|
|
157
|
+
Vitest.it.effect('should die if incoming event is < expected upstream head', () => Effect.gen(function* () {
|
|
119
158
|
const syncState = new SyncState.SyncState({
|
|
120
159
|
pending: [],
|
|
121
160
|
upstreamHead: e2_0.seqNum,
|
|
122
161
|
localHead: e2_0.seqNum,
|
|
123
162
|
});
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
163
|
+
const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } }).pipe(Effect.exit);
|
|
164
|
+
assert(Exit.isFailure(exit));
|
|
165
|
+
expect(Cause.hasDies(exit.cause)).toBe(true);
|
|
166
|
+
}));
|
|
167
|
+
Vitest.it.effect('should die if incoming event is = expected upstream head', () => Effect.gen(function* () {
|
|
128
168
|
const syncState = new SyncState.SyncState({
|
|
129
169
|
pending: [],
|
|
130
170
|
upstreamHead: e2_0.seqNum,
|
|
131
171
|
localHead: e2_0.seqNum,
|
|
132
172
|
});
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
173
|
+
const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0] } }).pipe(Effect.exit);
|
|
174
|
+
assert(Exit.isFailure(exit));
|
|
175
|
+
expect(Cause.hasDies(exit.cause)).toBe(true);
|
|
176
|
+
}));
|
|
177
|
+
Vitest.it.effect('should confirm pending event when receiving matching event', () => Effect.gen(function* () {
|
|
137
178
|
const syncState = new SyncState.SyncState({
|
|
138
179
|
pending: [e1_0],
|
|
139
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
180
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
140
181
|
localHead: e1_0.seqNum,
|
|
141
182
|
});
|
|
142
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
|
|
183
|
+
const result = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
|
|
143
184
|
expectAdvance(result);
|
|
144
185
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
145
186
|
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum);
|
|
146
187
|
expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum);
|
|
147
188
|
expectEventArraysEqual(result.newEvents, []);
|
|
148
189
|
expectEventArraysEqual(result.confirmedEvents, [e1_0]);
|
|
149
|
-
});
|
|
150
|
-
it('should confirm partial pending event when receiving matching event', () => {
|
|
190
|
+
}));
|
|
191
|
+
Vitest.it.effect('should confirm partial pending event when receiving matching event', () => Effect.gen(function* () {
|
|
151
192
|
const syncState = new SyncState.SyncState({
|
|
152
193
|
pending: [e1_0, e2_0],
|
|
153
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
194
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
154
195
|
localHead: e2_0.seqNum,
|
|
155
196
|
});
|
|
156
|
-
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
|
|
197
|
+
const result = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } });
|
|
157
198
|
expectAdvance(result);
|
|
158
199
|
expectEventArraysEqual(result.newSyncState.pending, [e2_0]);
|
|
159
200
|
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.seqNum);
|
|
160
201
|
expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
|
|
161
202
|
expectEventArraysEqual(result.newEvents, []);
|
|
162
203
|
expectEventArraysEqual(result.confirmedEvents, [e1_0]);
|
|
163
|
-
});
|
|
164
|
-
it('should confirm pending event and add new event', () => {
|
|
204
|
+
}));
|
|
205
|
+
Vitest.it.effect('should confirm pending event and add new event', () => Effect.gen(function* () {
|
|
165
206
|
const syncState = new SyncState.SyncState({
|
|
166
207
|
pending: [e1_0],
|
|
167
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
208
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
168
209
|
localHead: e1_0.seqNum,
|
|
169
210
|
});
|
|
170
|
-
const result = merge({
|
|
211
|
+
const result = yield* merge({
|
|
212
|
+
syncState,
|
|
213
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0, e1_1] },
|
|
214
|
+
});
|
|
171
215
|
expectAdvance(result);
|
|
172
216
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
173
217
|
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.seqNum);
|
|
174
218
|
expect(result.newSyncState.localHead).toMatchObject(e1_1.seqNum);
|
|
175
|
-
|
|
219
|
+
expectEventArraysEqual(result.newEvents, [e1_1]);
|
|
176
220
|
expectEventArraysEqual(result.confirmedEvents, [e1_0]);
|
|
177
|
-
});
|
|
178
|
-
it('should confirm pending event and add multiple new events', () => {
|
|
221
|
+
}));
|
|
222
|
+
Vitest.it.effect('should confirm pending event and add multiple new events', () => Effect.gen(function* () {
|
|
179
223
|
const syncState = new SyncState.SyncState({
|
|
180
224
|
pending: [e1_1],
|
|
181
225
|
upstreamHead: e1_0.seqNum,
|
|
182
226
|
localHead: e1_1.seqNum,
|
|
183
227
|
});
|
|
184
|
-
const result = merge({
|
|
228
|
+
const result = yield* merge({
|
|
185
229
|
syncState,
|
|
186
230
|
payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_2, e1_3, e2_0, e2_1] },
|
|
187
231
|
});
|
|
@@ -189,16 +233,16 @@ describe('syncstate', () => {
|
|
|
189
233
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
190
234
|
expect(result.newSyncState.upstreamHead).toMatchObject(e2_1.seqNum);
|
|
191
235
|
expect(result.newSyncState.localHead).toMatchObject(e2_1.seqNum);
|
|
192
|
-
|
|
236
|
+
expectEventArraysEqual(result.newEvents, [e1_2, e1_3, e2_0, e2_1]);
|
|
193
237
|
expectEventArraysEqual(result.confirmedEvents, [e1_1]);
|
|
194
|
-
});
|
|
195
|
-
it('should confirm pending global event while keep pending client events', () => {
|
|
238
|
+
}));
|
|
239
|
+
Vitest.it.effect('should confirm pending global event while keep pending client events', () => Effect.gen(function* () {
|
|
196
240
|
const syncState = new SyncState.SyncState({
|
|
197
241
|
pending: [e1_0, e1_1],
|
|
198
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
242
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
199
243
|
localHead: e1_1.seqNum,
|
|
200
244
|
});
|
|
201
|
-
const result = merge({
|
|
245
|
+
const result = yield* merge({
|
|
202
246
|
syncState,
|
|
203
247
|
payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
|
|
204
248
|
});
|
|
@@ -208,17 +252,17 @@ describe('syncstate', () => {
|
|
|
208
252
|
expect(result.newSyncState.localHead).toMatchObject(e1_1.seqNum);
|
|
209
253
|
expectEventArraysEqual(result.newEvents, []);
|
|
210
254
|
expectEventArraysEqual(result.confirmedEvents, [e1_0]);
|
|
211
|
-
});
|
|
212
|
-
it('should ignore client events (incoming is subset of pending)', () => {
|
|
255
|
+
}));
|
|
256
|
+
Vitest.it.effect('should ignore client events (incoming is subset of pending)', () => Effect.gen(function* () {
|
|
213
257
|
const syncState = new SyncState.SyncState({
|
|
214
258
|
pending: [e0_1, e1_0],
|
|
215
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
259
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
216
260
|
localHead: e1_0.seqNum,
|
|
217
261
|
});
|
|
218
|
-
const result = merge({
|
|
262
|
+
const result = yield* merge({
|
|
219
263
|
syncState,
|
|
220
264
|
payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
|
|
221
|
-
|
|
265
|
+
ignoreClientOnlyEvents: true,
|
|
222
266
|
});
|
|
223
267
|
expectAdvance(result);
|
|
224
268
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
@@ -226,17 +270,17 @@ describe('syncstate', () => {
|
|
|
226
270
|
expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum);
|
|
227
271
|
expectEventArraysEqual(result.newEvents, []);
|
|
228
272
|
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0]);
|
|
229
|
-
});
|
|
230
|
-
it('should ignore client events (incoming is subset of pending case 2)', () => {
|
|
273
|
+
}));
|
|
274
|
+
Vitest.it.effect('should ignore client events (incoming is subset of pending case 2)', () => Effect.gen(function* () {
|
|
231
275
|
const syncState = new SyncState.SyncState({
|
|
232
276
|
pending: [e0_1, e1_0, e2_0],
|
|
233
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
277
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
234
278
|
localHead: e1_0.seqNum,
|
|
235
279
|
});
|
|
236
|
-
const result = merge({
|
|
280
|
+
const result = yield* merge({
|
|
237
281
|
syncState,
|
|
238
282
|
payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
|
|
239
|
-
|
|
283
|
+
ignoreClientOnlyEvents: true,
|
|
240
284
|
});
|
|
241
285
|
expectAdvance(result);
|
|
242
286
|
expectEventArraysEqual(result.newSyncState.pending, [e2_0]);
|
|
@@ -244,154 +288,238 @@ describe('syncstate', () => {
|
|
|
244
288
|
expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
|
|
245
289
|
expectEventArraysEqual(result.newEvents, []);
|
|
246
290
|
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0]);
|
|
247
|
-
});
|
|
248
|
-
it('should ignore client events (incoming goes beyond pending)', () => {
|
|
291
|
+
}));
|
|
292
|
+
Vitest.it.effect('should ignore client events (incoming goes beyond pending)', () => Effect.gen(function* () {
|
|
249
293
|
const syncState = new SyncState.SyncState({
|
|
250
294
|
pending: [e0_1, e1_0, e1_1],
|
|
251
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
295
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
252
296
|
localHead: e1_1.seqNum,
|
|
253
297
|
});
|
|
254
|
-
const result = merge({
|
|
298
|
+
const result = yield* merge({
|
|
255
299
|
syncState,
|
|
256
300
|
payload: { _tag: 'upstream-advance', newEvents: [e1_0, e2_0] },
|
|
257
|
-
|
|
301
|
+
ignoreClientOnlyEvents: true,
|
|
258
302
|
});
|
|
259
303
|
expectAdvance(result);
|
|
260
304
|
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
261
305
|
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
|
|
262
306
|
expect(result.newSyncState.localHead).toMatchObject(e2_0.seqNum);
|
|
263
|
-
|
|
307
|
+
expectEventArraysEqual(result.newEvents, [e2_0]);
|
|
264
308
|
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0, e1_1]);
|
|
265
|
-
});
|
|
266
|
-
it('should
|
|
309
|
+
}));
|
|
310
|
+
Vitest.it.effect('should die if incoming event is ≤ local head', () => Effect.gen(function* () {
|
|
267
311
|
const syncState = new SyncState.SyncState({
|
|
268
312
|
pending: [],
|
|
269
313
|
upstreamHead: e2_0.seqNum,
|
|
270
314
|
localHead: e2_0.seqNum,
|
|
271
315
|
});
|
|
272
|
-
const
|
|
273
|
-
|
|
274
|
-
|
|
316
|
+
const exit = yield* merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } }).pipe(Effect.exit);
|
|
317
|
+
assert(Exit.isFailure(exit));
|
|
318
|
+
expect(Cause.hasDies(exit.cause)).toBe(true);
|
|
319
|
+
}));
|
|
320
|
+
Vitest.it.effect('should advance (not rebase) when pending event has undefined-valued key dropped by JSON wire round-trip', () => Effect.gen(function* () {
|
|
321
|
+
const argsSchema = Schema.Struct({
|
|
322
|
+
id: Schema.String,
|
|
323
|
+
flag: Schema.optional(Schema.Boolean),
|
|
324
|
+
});
|
|
325
|
+
const localArgs = yield* Schema.encodeUnknownEffect(argsSchema)({ id: 'abc' }).pipe(Effect.orDie);
|
|
326
|
+
const wireArgs = jsonParse(jsonStringify(localArgs));
|
|
327
|
+
const localPending = new LiveStoreEvent.Client.EncodedWithMeta({
|
|
328
|
+
seqNum: e1_0.seqNum,
|
|
329
|
+
parentSeqNum: e1_0.parentSeqNum,
|
|
330
|
+
name: e1_0.name,
|
|
331
|
+
args: localArgs,
|
|
332
|
+
clientId: e1_0.clientId,
|
|
333
|
+
sessionId: e1_0.sessionId,
|
|
334
|
+
});
|
|
335
|
+
const fromUpstream = new LiveStoreEvent.Client.EncodedWithMeta({
|
|
336
|
+
seqNum: e1_0.seqNum,
|
|
337
|
+
parentSeqNum: e1_0.parentSeqNum,
|
|
338
|
+
name: e1_0.name,
|
|
339
|
+
args: wireArgs,
|
|
340
|
+
clientId: e1_0.clientId,
|
|
341
|
+
sessionId: e1_0.sessionId,
|
|
342
|
+
});
|
|
343
|
+
const syncState = new SyncState.SyncState({
|
|
344
|
+
pending: [localPending],
|
|
345
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
346
|
+
localHead: localPending.seqNum,
|
|
347
|
+
});
|
|
348
|
+
const result = yield* merge({
|
|
349
|
+
syncState,
|
|
350
|
+
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [fromUpstream] }),
|
|
351
|
+
});
|
|
352
|
+
expectAdvance(result);
|
|
353
|
+
expect(result.confirmedEvents).toHaveLength(1);
|
|
354
|
+
expect(result.newSyncState.pending).toHaveLength(0);
|
|
355
|
+
}));
|
|
275
356
|
});
|
|
276
|
-
describe('upstream-advance: rebase', () => {
|
|
277
|
-
it('should rebase single client event to end', () => {
|
|
357
|
+
Vitest.describe('upstream-advance: rebase', () => {
|
|
358
|
+
Vitest.it.effect('should rebase single client event to end', () => Effect.gen(function* () {
|
|
278
359
|
const syncState = new SyncState.SyncState({
|
|
279
360
|
pending: [e1_0],
|
|
280
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
361
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
281
362
|
localHead: e1_0.seqNum,
|
|
282
363
|
});
|
|
283
|
-
const result = merge({
|
|
284
|
-
|
|
364
|
+
const result = yield* merge({
|
|
365
|
+
syncState,
|
|
366
|
+
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1] }),
|
|
367
|
+
});
|
|
368
|
+
const e1_0_e1_2 = rebaseTestEvent({ event: e1_0, parentSeqNum: e1_1.seqNum, rebaseGeneration: 1 });
|
|
285
369
|
expectRebase(result);
|
|
286
370
|
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e1_2]);
|
|
287
371
|
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.seqNum);
|
|
288
372
|
expect(result.newSyncState.localHead).toMatchObject(e1_0_e1_2.seqNum);
|
|
289
373
|
expectEventArraysEqual(result.rollbackEvents, [e1_0]);
|
|
290
374
|
expectEventArraysEqual(result.newEvents, [e1_1, e1_0_e1_2]);
|
|
291
|
-
});
|
|
292
|
-
it('should rebase different event with same id', () => {
|
|
293
|
-
const e2_0_b =
|
|
375
|
+
}));
|
|
376
|
+
Vitest.it.effect('should rebase different event with same id', () => Effect.gen(function* () {
|
|
377
|
+
const e2_0_b = makeTestEvent({
|
|
378
|
+
seqNum: { global: 1, client: 0 },
|
|
379
|
+
parentSeqNum: e1_0.seqNum,
|
|
380
|
+
payload: '1_0_b',
|
|
381
|
+
isClientOnly: false,
|
|
382
|
+
});
|
|
294
383
|
const syncState = new SyncState.SyncState({
|
|
295
384
|
pending: [e2_0_b],
|
|
296
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
385
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
297
386
|
localHead: e2_0_b.seqNum,
|
|
298
387
|
});
|
|
299
|
-
const result = merge({
|
|
300
|
-
|
|
388
|
+
const result = yield* merge({
|
|
389
|
+
syncState,
|
|
390
|
+
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e2_0] }),
|
|
391
|
+
});
|
|
392
|
+
const e2_0_e3_0 = rebaseTestEvent({ event: e2_0_b, parentSeqNum: e2_0.seqNum, rebaseGeneration: 1 });
|
|
301
393
|
expectRebase(result);
|
|
302
394
|
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0]);
|
|
303
395
|
expectEventArraysEqual(result.newEvents, [e2_0, e2_0_e3_0]);
|
|
304
396
|
expectEventArraysEqual(result.rollbackEvents, [e2_0_b]);
|
|
305
397
|
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
|
|
306
398
|
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.seqNum);
|
|
307
|
-
});
|
|
308
|
-
it('should rebase single client event to end (more incoming events)', () => {
|
|
399
|
+
}));
|
|
400
|
+
Vitest.it.effect('should rebase single client event to end (more incoming events)', () => Effect.gen(function* () {
|
|
309
401
|
const syncState = new SyncState.SyncState({
|
|
310
402
|
pending: [e1_0],
|
|
311
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
403
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
312
404
|
localHead: e1_0.seqNum,
|
|
313
405
|
});
|
|
314
|
-
const result = merge({
|
|
406
|
+
const result = yield* merge({
|
|
315
407
|
syncState,
|
|
316
408
|
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
|
|
317
409
|
});
|
|
318
|
-
const e1_0_e3_0 = e1_0
|
|
410
|
+
const e1_0_e3_0 = rebaseTestEvent({ event: e1_0, parentSeqNum: e2_0.seqNum, rebaseGeneration: 1 });
|
|
319
411
|
expectRebase(result);
|
|
320
412
|
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e3_0]);
|
|
321
413
|
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
|
|
322
414
|
expect(result.newSyncState.localHead).toMatchObject(e1_0_e3_0.seqNum);
|
|
323
|
-
});
|
|
324
|
-
it('should only rebase divergent events when first event matches', () => {
|
|
415
|
+
}));
|
|
416
|
+
Vitest.it.effect('should only rebase divergent events when first event matches', () => Effect.gen(function* () {
|
|
325
417
|
const syncState = new SyncState.SyncState({
|
|
326
418
|
pending: [e1_0, e1_1],
|
|
327
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
419
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
328
420
|
localHead: e1_0.seqNum,
|
|
329
421
|
});
|
|
330
|
-
const result = merge({
|
|
422
|
+
const result = yield* merge({
|
|
331
423
|
syncState,
|
|
332
424
|
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_0, e1_2, e1_3, e2_0] }),
|
|
333
425
|
});
|
|
334
|
-
const e1_1_e2_1 = e1_1
|
|
426
|
+
const e1_1_e2_1 = rebaseTestEvent({ event: e1_1, parentSeqNum: e2_0.seqNum, rebaseGeneration: 1 });
|
|
335
427
|
expectRebase(result);
|
|
336
428
|
expectEventArraysEqual(result.newSyncState.pending, [e1_1_e2_1]);
|
|
337
429
|
expectEventArraysEqual(result.rollbackEvents, [e1_1]);
|
|
338
430
|
expectEventArraysEqual(result.newEvents, [e1_2, e1_3, e2_0, e1_1_e2_1]);
|
|
339
431
|
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
|
|
340
432
|
expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_1.seqNum);
|
|
341
|
-
});
|
|
342
|
-
it('should rebase all client events when incoming chain starts differently', () => {
|
|
433
|
+
}));
|
|
434
|
+
Vitest.it.effect('should rebase all client events when incoming chain starts differently', () => Effect.gen(function* () {
|
|
343
435
|
const syncState = new SyncState.SyncState({
|
|
344
436
|
pending: [e1_0, e1_1],
|
|
345
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
437
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
346
438
|
localHead: e1_1.seqNum,
|
|
347
439
|
});
|
|
348
|
-
const result = merge({
|
|
440
|
+
const result = yield* merge({
|
|
349
441
|
syncState,
|
|
350
442
|
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
|
|
351
443
|
});
|
|
352
|
-
const e1_0_e2_1 = e1_0
|
|
353
|
-
const e1_1_e2_2 = e1_1
|
|
444
|
+
const e1_0_e2_1 = rebaseTestEvent({ event: e1_0, parentSeqNum: e2_0.seqNum, rebaseGeneration: 1 });
|
|
445
|
+
const e1_1_e2_2 = rebaseTestEvent({ event: e1_1, parentSeqNum: e1_0_e2_1.seqNum, rebaseGeneration: 1 });
|
|
354
446
|
expectRebase(result);
|
|
355
447
|
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e2_1, e1_1_e2_2]);
|
|
356
448
|
expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3, e2_0, e1_0_e2_1, e1_1_e2_2]);
|
|
357
449
|
expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1]);
|
|
358
450
|
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.seqNum);
|
|
359
451
|
expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_2.seqNum);
|
|
360
|
-
});
|
|
361
|
-
describe('local-push', () => {
|
|
362
|
-
describe('advance', () => {
|
|
363
|
-
it('should advance with new events', () => {
|
|
452
|
+
}));
|
|
453
|
+
Vitest.describe('local-push', () => {
|
|
454
|
+
Vitest.describe('advance', () => {
|
|
455
|
+
Vitest.it.effect('should advance with new events', () => Effect.gen(function* () {
|
|
364
456
|
const syncState = new SyncState.SyncState({
|
|
365
457
|
pending: [e1_0],
|
|
366
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
458
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
367
459
|
localHead: e1_0.seqNum,
|
|
368
460
|
});
|
|
369
|
-
const result = merge({
|
|
461
|
+
const result = yield* merge({
|
|
370
462
|
syncState,
|
|
371
463
|
payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2, e1_3] }),
|
|
372
464
|
});
|
|
373
465
|
expectAdvance(result);
|
|
374
466
|
expectEventArraysEqual(result.newSyncState.pending, [e1_0, e1_1, e1_2, e1_3]);
|
|
375
|
-
expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.ROOT);
|
|
467
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.Client.ROOT);
|
|
376
468
|
expect(result.newSyncState.localHead).toMatchObject(e1_3.seqNum);
|
|
377
469
|
expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3]);
|
|
378
470
|
expectEventArraysEqual(result.confirmedEvents, []);
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
it('
|
|
471
|
+
}));
|
|
472
|
+
// Leaders can choose to ignore client-only events while still returning them for broadcast.
|
|
473
|
+
// Ensure pending/local head only reflects events that must be pushed upstream.
|
|
474
|
+
Vitest.it.effect('keeps pending empty when pushing only client-only events that are being ignored', () => Effect.gen(function* () {
|
|
475
|
+
const syncState = new SyncState.SyncState({
|
|
476
|
+
pending: [],
|
|
477
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
478
|
+
localHead: EventSequenceNumber.Client.ROOT,
|
|
479
|
+
});
|
|
480
|
+
const result = yield* merge({
|
|
481
|
+
syncState,
|
|
482
|
+
payload: SyncState.PayloadLocalPush.make({ newEvents: [e0_1] }),
|
|
483
|
+
ignoreClientOnlyEvents: true,
|
|
484
|
+
});
|
|
485
|
+
expectAdvance(result);
|
|
486
|
+
expectEventArraysEqual(result.newSyncState.pending, []);
|
|
487
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.Client.ROOT);
|
|
488
|
+
expect(result.newSyncState.localHead).toMatchObject(EventSequenceNumber.Client.ROOT);
|
|
489
|
+
expectEventArraysEqual(result.newEvents, [e0_1]);
|
|
490
|
+
}));
|
|
491
|
+
Vitest.it.effect('appends only upstream-bound events to pending when ignoring client-only pushes', () => Effect.gen(function* () {
|
|
492
|
+
const syncState = new SyncState.SyncState({
|
|
493
|
+
pending: [],
|
|
494
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
495
|
+
localHead: EventSequenceNumber.Client.ROOT,
|
|
496
|
+
});
|
|
497
|
+
const result = yield* merge({
|
|
498
|
+
syncState,
|
|
499
|
+
payload: SyncState.PayloadLocalPush.make({ newEvents: [e0_1, e1_0] }),
|
|
500
|
+
ignoreClientOnlyEvents: true,
|
|
501
|
+
});
|
|
502
|
+
expectAdvance(result);
|
|
503
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0]);
|
|
504
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(EventSequenceNumber.Client.ROOT);
|
|
505
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0.seqNum);
|
|
506
|
+
expectEventArraysEqual(result.newEvents, [e0_1, e1_0]);
|
|
507
|
+
}));
|
|
508
|
+
});
|
|
509
|
+
Vitest.describe('reject', () => {
|
|
510
|
+
Vitest.it.effect('should reject when new events are greater than pending events', () => Effect.gen(function* () {
|
|
383
511
|
const syncState = new SyncState.SyncState({
|
|
384
512
|
pending: [e1_0, e1_1],
|
|
385
|
-
upstreamHead: EventSequenceNumber.ROOT,
|
|
513
|
+
upstreamHead: EventSequenceNumber.Client.ROOT,
|
|
386
514
|
localHead: e1_1.seqNum,
|
|
387
515
|
});
|
|
388
|
-
const result = merge({
|
|
516
|
+
const result = yield* merge({
|
|
389
517
|
syncState,
|
|
390
518
|
payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2] }),
|
|
391
519
|
});
|
|
392
520
|
expectReject(result);
|
|
393
521
|
expect(result.expectedMinimumId).toMatchObject(e1_2.seqNum);
|
|
394
|
-
});
|
|
522
|
+
}));
|
|
395
523
|
});
|
|
396
524
|
});
|
|
397
525
|
});
|
|
@@ -406,13 +534,13 @@ const expectEventArraysEqual = (actual, expected) => {
|
|
|
406
534
|
expect(event.args).toStrictEqual(expected[i].args);
|
|
407
535
|
});
|
|
408
536
|
};
|
|
409
|
-
|
|
537
|
+
const expectAdvance = (result) => {
|
|
410
538
|
expect(result._tag).toBe('advance');
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
expect(result._tag, `Expected rebase, got ${result}`).toBe('rebase');
|
|
414
|
-
}
|
|
415
|
-
|
|
539
|
+
};
|
|
540
|
+
const expectRebase = (result) => {
|
|
541
|
+
expect(result._tag, `Expected rebase, got ${result._tag}`).toBe('rebase');
|
|
542
|
+
};
|
|
543
|
+
const expectReject = (result) => {
|
|
416
544
|
expect(result._tag).toBe('reject');
|
|
417
|
-
}
|
|
545
|
+
};
|
|
418
546
|
//# sourceMappingURL=syncstate.test.js.map
|