@livestore/common 0.4.0-dev.2 → 0.4.0-dev.21
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 +20 -12
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
- package/dist/adapter-types.d.ts +14 -6
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js.map +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +33 -6
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +28 -23
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +2 -2
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +7 -14
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +1 -6
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +38 -29
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +9 -8
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
- package/dist/devtools/devtools-sessioninfo.js +7 -4
- package/dist/devtools/devtools-sessioninfo.js.map +1 -1
- package/dist/devtools/mod.d.ts +13 -2
- package/dist/devtools/mod.d.ts.map +1 -1
- package/dist/devtools/mod.js +10 -3
- package/dist/devtools/mod.js.map +1 -1
- package/dist/errors.d.ts +52 -10
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +25 -6
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +41 -4
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +158 -75
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +21 -22
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +77 -20
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +2 -2
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +56 -45
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +6 -6
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +79 -27
- 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 -3
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +25 -11
- 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 -3
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +5 -5
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -2
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -2
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/stream-events.d.ts +56 -0
- package/dist/leader-thread/stream-events.d.ts.map +1 -0
- package/dist/leader-thread/stream-events.js +166 -0
- package/dist/leader-thread/stream-events.js.map +1 -0
- package/dist/leader-thread/types.d.ts +98 -20
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +13 -0
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.d.ts +40 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +33 -0
- package/dist/logging.js.map +1 -0
- package/dist/make-client-session.d.ts +5 -3
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +5 -2
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts +6 -6
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +20 -4
- package/dist/materializer-helper.js.map +1 -1
- package/dist/otel.d.ts +2 -1
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +5 -0
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +2 -2
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +29 -20
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +147 -0
- package/dist/schema/EventDef/define.d.ts.map +1 -0
- package/dist/schema/EventDef/define.js +139 -0
- package/dist/schema/EventDef/define.js.map +1 -0
- package/dist/schema/EventDef/event-def.d.ts +106 -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 +5 -0
- package/dist/schema/EventDef/mod.d.ts.map +1 -0
- package/dist/schema/EventDef/mod.js +5 -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 +193 -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 +43 -43
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +89 -106
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
- package/dist/schema/{LiveStoreEvent.js → LiveStoreEvent/client.js} +74 -58
- package/dist/schema/LiveStoreEvent/client.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 +6 -4
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +5 -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 +27 -2
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +36 -6
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +97 -6
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +16 -0
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.js +14 -6
- package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +69 -22
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +48 -10
- 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 +23 -14
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +23 -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 +14 -8
- 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 +5 -3
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +2 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +3 -3
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +3 -3
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/api.d.ts +19 -11
- 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 +22 -15
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +6 -3
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +252 -88
- 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 +22 -12
- 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.d.ts → system-tables/eventlog-tables.d.ts} +63 -456
- 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 +456 -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 +55 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
- package/dist/schema/state/sqlite/table-def.d.ts +4 -4
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +2 -2
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +80 -0
- 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 +69 -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/migrations.d.ts +32 -2
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +37 -5
- 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/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +11 -1
- 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 +2 -1
- package/dist/sql-queries/sql-query-builder.js.map +1 -1
- package/dist/sqlite-types.d.ts +3 -3
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +11 -13
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +45 -42
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +66 -0
- package/dist/sync/errors.d.ts.map +1 -0
- package/dist/sync/errors.js +36 -0
- package/dist/sync/errors.js.map +1 -0
- package/dist/sync/index.d.ts +3 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +3 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +23 -0
- package/dist/sync/mock-sync-backend.d.ts.map +1 -0
- package/dist/sync/mock-sync-backend.js +114 -0
- package/dist/sync/mock-sync-backend.js.map +1 -0
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +6 -7
- 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 +1 -2
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +54 -15
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +198 -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 +10 -8
- 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 +5 -5
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts +2 -2
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +9 -9
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync-backend-kv.d.ts +7 -0
- package/dist/sync/sync-backend-kv.d.ts.map +1 -0
- package/dist/sync/sync-backend-kv.js +18 -0
- package/dist/sync/sync-backend-kv.js.map +1 -0
- package/dist/sync/sync-backend.d.ts +105 -0
- package/dist/sync/sync-backend.d.ts.map +1 -0
- package/dist/sync/sync-backend.js +61 -0
- package/dist/sync/sync-backend.js.map +1 -0
- package/dist/sync/sync.d.ts +9 -86
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +2 -27
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +57 -44
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +50 -45
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +83 -46
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/transport-chunking.d.ts +36 -0
- package/dist/sync/transport-chunking.d.ts.map +1 -0
- package/dist/sync/transport-chunking.js +56 -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 +6 -6
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/testing/event-factory.d.ts +68 -0
- package/dist/testing/event-factory.d.ts.map +1 -0
- package/dist/testing/event-factory.js +78 -0
- package/dist/testing/event-factory.js.map +1 -0
- package/dist/testing/mod.d.ts +2 -0
- package/dist/testing/mod.d.ts.map +1 -0
- package/dist/testing/mod.js +2 -0
- package/dist/testing/mod.js.map +1 -0
- package/dist/version.d.ts +16 -6
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +16 -6
- package/dist/version.js.map +1 -1
- package/package.json +7 -8
- package/src/ClientSessionLeaderThreadProxy.ts +20 -12
- package/src/adapter-types.ts +18 -6
- package/src/debug-info.ts +37 -6
- package/src/devtools/devtools-messages-client-session.ts +2 -2
- package/src/devtools/devtools-messages-common.ts +1 -8
- package/src/devtools/devtools-messages-leader.ts +9 -8
- package/src/devtools/devtools-sessioninfo.ts +8 -5
- package/src/devtools/mod.ts +11 -2
- package/src/errors.ts +38 -11
- package/src/index.ts +2 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +277 -105
- package/src/leader-thread/eventlog.ts +113 -38
- package/src/leader-thread/leader-worker-devtools.ts +86 -55
- package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
- package/src/leader-thread/make-leader-thread-layer.ts +156 -37
- package/src/leader-thread/materialize-event.ts +37 -12
- package/src/leader-thread/mod.ts +1 -0
- package/src/leader-thread/recreate-db.ts +15 -7
- package/src/leader-thread/shutdown-channel.ts +16 -2
- package/src/leader-thread/stream-events.ts +201 -0
- package/src/leader-thread/types.ts +70 -20
- package/src/logging.ts +62 -0
- package/src/make-client-session.ts +9 -3
- package/src/materializer-helper.ts +27 -10
- package/src/otel.ts +10 -0
- package/src/rematerialize-from-eventlog.ts +37 -27
- package/src/schema/EventDef/define.ts +201 -0
- package/src/schema/EventDef/event-def.ts +120 -0
- package/src/schema/EventDef/facts.ts +135 -0
- package/src/schema/EventDef/materializer.ts +172 -0
- package/src/schema/EventDef/mod.ts +4 -0
- package/src/schema/EventSequenceNumber/client.ts +257 -0
- package/src/schema/EventSequenceNumber/global.ts +19 -0
- package/src/schema/EventSequenceNumber/mod.ts +37 -0
- package/src/schema/EventSequenceNumber.test.ts +70 -52
- package/src/schema/LiveStoreEvent/client.ts +221 -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 +6 -4
- package/src/schema/schema.ts +39 -3
- package/src/schema/state/sqlite/client-document-def.test.ts +19 -2
- package/src/schema/state/sqlite/client-document-def.ts +127 -25
- package/src/schema/state/sqlite/column-annotations.test.ts +1 -1
- package/src/schema/state/sqlite/column-annotations.ts +16 -6
- package/src/schema/state/sqlite/column-def.test.ts +62 -10
- package/src/schema/state/sqlite/column-def.ts +88 -21
- package/src/schema/state/sqlite/column-spec.test.ts +29 -16
- package/src/schema/state/sqlite/column-spec.ts +36 -11
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +26 -6
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +29 -12
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +12 -17
- package/src/schema/state/sqlite/mod.ts +4 -3
- package/src/schema/state/sqlite/query-builder/api.ts +25 -11
- package/src/schema/state/sqlite/query-builder/astToSql.ts +23 -14
- package/src/schema/state/sqlite/query-builder/impl.test.ts +305 -92
- package/src/schema/state/sqlite/query-builder/impl.ts +8 -3
- package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
- package/src/schema/state/sqlite/schema-helpers.ts +28 -20
- 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 +69 -0
- package/src/schema/state/sqlite/table-def.test.ts +101 -0
- package/src/schema/state/sqlite/table-def.ts +8 -6
- package/src/schema/unknown-events.ts +131 -0
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +86 -0
- package/src/schema-management/migrations.ts +41 -8
- package/src/schema-management/validate-schema.ts +3 -3
- package/src/sql-queries/sql-queries.ts +9 -1
- package/src/sql-queries/sql-query-builder.ts +2 -1
- package/src/sqlite-types.ts +3 -3
- package/src/sync/ClientSessionSyncProcessor.ts +69 -62
- package/src/sync/errors.ts +38 -0
- package/src/sync/index.ts +3 -0
- package/src/sync/mock-sync-backend.ts +184 -0
- package/src/sync/next/compact-events.ts +6 -7
- package/src/sync/next/facts.ts +7 -9
- package/src/sync/next/history-dag-common.ts +277 -26
- package/src/sync/next/history-dag.ts +16 -10
- package/src/sync/next/rebase-events.ts +11 -11
- package/src/sync/next/test/event-fixtures.ts +11 -11
- package/src/sync/sync-backend-kv.ts +22 -0
- package/src/sync/sync-backend.ts +185 -0
- package/src/sync/sync.ts +9 -91
- package/src/sync/syncstate.test.ts +96 -52
- package/src/sync/syncstate.ts +69 -58
- package/src/sync/transport-chunking.ts +90 -0
- package/src/sync/validate-push-payload.ts +8 -9
- package/src/testing/event-factory.ts +131 -0
- package/src/testing/mod.ts +1 -0
- package/src/version.ts +16 -6
- package/dist/schema/EventDef.d.ts +0 -123
- 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.map +0 -1
- package/dist/schema/LiveStoreEvent.js.map +0 -1
- package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
- package/dist/schema/state/sqlite/system-tables.js +0 -79
- package/dist/schema/state/sqlite/system-tables.js.map +0 -1
- package/dist/schema-management/migrations.test.d.ts +0 -2
- package/dist/schema-management/migrations.test.d.ts.map +0 -1
- package/dist/schema-management/migrations.test.js +0 -52
- package/dist/schema-management/migrations.test.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 -219
- package/src/schema/EventSequenceNumber.ts +0 -199
- package/src/schema/LiveStoreEvent.ts +0 -287
- package/src/schema/state/sqlite/system-tables.ts +0 -104
- 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/dist/sync/sync.js
CHANGED
|
@@ -1,28 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export class IsOfflineError extends Schema.TaggedError()('IsOfflineError', {}) {
|
|
4
|
-
}
|
|
5
|
-
// TODO gt rid of this error in favour of SyncError
|
|
6
|
-
export class InvalidPushError extends Schema.TaggedError()('InvalidPushError', {
|
|
7
|
-
reason: Schema.Union(Schema.TaggedStruct('Unexpected', {
|
|
8
|
-
message: Schema.String,
|
|
9
|
-
}), Schema.TaggedStruct('ServerAhead', {
|
|
10
|
-
minimumExpectedNum: Schema.Number,
|
|
11
|
-
providedNum: Schema.Number,
|
|
12
|
-
})),
|
|
13
|
-
}) {
|
|
14
|
-
}
|
|
15
|
-
// TODO gt rid of this error in favour of SyncError
|
|
16
|
-
export class InvalidPullError extends Schema.TaggedError()('InvalidPullError', {
|
|
17
|
-
message: Schema.String,
|
|
18
|
-
}) {
|
|
19
|
-
}
|
|
20
|
-
// TODO gt rid of this error in favour of SyncError
|
|
21
|
-
export class LeaderAheadError extends Schema.TaggedError()('LeaderAheadError', {
|
|
22
|
-
minimumExpectedNum: EventSequenceNumber.EventSequenceNumber,
|
|
23
|
-
providedNum: EventSequenceNumber.EventSequenceNumber,
|
|
24
|
-
/** Generation number the client session should use for subsequent pushes */
|
|
25
|
-
// nextGeneration: Schema.Number,
|
|
26
|
-
}) {
|
|
27
|
-
}
|
|
1
|
+
export * from "./errors.js";
|
|
2
|
+
export * as SyncBackend from "./sync-backend.js";
|
|
28
3
|
//# sourceMappingURL=sync.js.map
|
package/dist/sync/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync/sync.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAA"}
|
package/dist/sync/syncstate.d.ts
CHANGED
|
@@ -1,33 +1,42 @@
|
|
|
1
1
|
import { Schema } from '@livestore/utils/effect';
|
|
2
|
-
import * as
|
|
2
|
+
import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts';
|
|
3
|
+
import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts';
|
|
3
4
|
declare const SyncState_base: Schema.Class<SyncState, {
|
|
4
|
-
pending: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
5
|
+
pending: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
5
6
|
/** What this node expects the next upstream node to have as its own local head */
|
|
6
7
|
upstreamHead: Schema.Struct<{
|
|
7
8
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
|
8
9
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
|
9
10
|
rebaseGeneration: typeof Schema.Int;
|
|
10
|
-
}
|
|
11
|
+
}> & {
|
|
12
|
+
make: (seqNum: EventSequenceNumber.Client.CompositeInput) => EventSequenceNumber.Client.Composite;
|
|
13
|
+
};
|
|
11
14
|
/** Equivalent to `pending.at(-1)?.id` if there are pending events */
|
|
12
15
|
localHead: Schema.Struct<{
|
|
13
16
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
|
14
17
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
|
15
18
|
rebaseGeneration: typeof Schema.Int;
|
|
16
|
-
}
|
|
19
|
+
}> & {
|
|
20
|
+
make: (seqNum: EventSequenceNumber.Client.CompositeInput) => EventSequenceNumber.Client.Composite;
|
|
21
|
+
};
|
|
17
22
|
}, Schema.Struct.Encoded<{
|
|
18
|
-
pending: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
23
|
+
pending: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
19
24
|
/** What this node expects the next upstream node to have as its own local head */
|
|
20
25
|
upstreamHead: Schema.Struct<{
|
|
21
26
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
|
22
27
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
|
23
28
|
rebaseGeneration: typeof Schema.Int;
|
|
24
|
-
}
|
|
29
|
+
}> & {
|
|
30
|
+
make: (seqNum: EventSequenceNumber.Client.CompositeInput) => EventSequenceNumber.Client.Composite;
|
|
31
|
+
};
|
|
25
32
|
/** Equivalent to `pending.at(-1)?.id` if there are pending events */
|
|
26
33
|
localHead: Schema.Struct<{
|
|
27
34
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
|
28
35
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
|
29
36
|
rebaseGeneration: typeof Schema.Int;
|
|
30
|
-
}
|
|
37
|
+
}> & {
|
|
38
|
+
make: (seqNum: EventSequenceNumber.Client.CompositeInput) => EventSequenceNumber.Client.Composite;
|
|
39
|
+
};
|
|
31
40
|
}>, never, {
|
|
32
41
|
readonly upstreamHead: {
|
|
33
42
|
readonly global: number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">;
|
|
@@ -41,7 +50,7 @@ declare const SyncState_base: Schema.Class<SyncState, {
|
|
|
41
50
|
readonly rebaseGeneration: number;
|
|
42
51
|
};
|
|
43
52
|
} & {
|
|
44
|
-
readonly pending: readonly LiveStoreEvent.EncodedWithMeta[];
|
|
53
|
+
readonly pending: readonly LiveStoreEvent.Client.EncodedWithMeta[];
|
|
45
54
|
}, {}, {}>;
|
|
46
55
|
/**
|
|
47
56
|
* SyncState represents the current sync state of a sync node relative to an upstream node.
|
|
@@ -54,7 +63,7 @@ declare const SyncState_base: Schema.Class<SyncState, {
|
|
|
54
63
|
* +------------------------+
|
|
55
64
|
* ▼ ▼
|
|
56
65
|
* Upstream Head Local Head
|
|
57
|
-
*
|
|
66
|
+
* e1 e1.1, e1.2, e2
|
|
58
67
|
* ```
|
|
59
68
|
*
|
|
60
69
|
* **Pending Events**: Events awaiting acknowledgment from the upstream.
|
|
@@ -70,7 +79,7 @@ declare const SyncState_base: Schema.Class<SyncState, {
|
|
|
70
79
|
* Invariants:
|
|
71
80
|
* 1. **Chain Continuity**: Each event must reference its immediate parent.
|
|
72
81
|
* 2. **Head Ordering**: Upstream Head ≤ Local Head.
|
|
73
|
-
* 3. **Event number sequence**: Must follow the pattern
|
|
82
|
+
* 3. **Event number sequence**: Must follow the pattern e1→e1.1→e1.2→e2.
|
|
74
83
|
*
|
|
75
84
|
* A few further notes to help form an intuition:
|
|
76
85
|
* - The goal is to keep the pending events as small as possible (i.e. to have synced with the next upstream node)
|
|
@@ -85,9 +94,9 @@ export declare class SyncState extends SyncState_base {
|
|
|
85
94
|
}
|
|
86
95
|
declare const PayloadUpstreamRebase_base: Schema.TaggedStruct<"upstream-rebase", {
|
|
87
96
|
/** Events which need to be rolled back */
|
|
88
|
-
rollbackEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
97
|
+
rollbackEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
89
98
|
/** Events which need to be applied after the rollback (already rebased by the upstream node) */
|
|
90
|
-
newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
99
|
+
newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
91
100
|
}>;
|
|
92
101
|
/**
|
|
93
102
|
* This payload propagates a rebase from the upstream node
|
|
@@ -95,12 +104,12 @@ declare const PayloadUpstreamRebase_base: Schema.TaggedStruct<"upstream-rebase",
|
|
|
95
104
|
export declare class PayloadUpstreamRebase extends PayloadUpstreamRebase_base {
|
|
96
105
|
}
|
|
97
106
|
declare const PayloadUpstreamAdvance_base: Schema.TaggedStruct<"upstream-advance", {
|
|
98
|
-
newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
107
|
+
newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
99
108
|
}>;
|
|
100
109
|
export declare class PayloadUpstreamAdvance extends PayloadUpstreamAdvance_base {
|
|
101
110
|
}
|
|
102
111
|
declare const PayloadLocalPush_base: Schema.TaggedStruct<"local-push", {
|
|
103
|
-
newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
112
|
+
newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
104
113
|
}>;
|
|
105
114
|
export declare class PayloadLocalPush extends PayloadLocalPush_base {
|
|
106
115
|
}
|
|
@@ -119,14 +128,14 @@ declare const MergeContext_base: Schema.Class<MergeContext, {
|
|
|
119
128
|
}>, never, {
|
|
120
129
|
readonly payload: {
|
|
121
130
|
readonly _tag: "upstream-rebase";
|
|
122
|
-
readonly rollbackEvents: readonly LiveStoreEvent.EncodedWithMeta[];
|
|
123
|
-
readonly newEvents: readonly LiveStoreEvent.EncodedWithMeta[];
|
|
131
|
+
readonly rollbackEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
|
|
132
|
+
readonly newEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
|
|
124
133
|
} | {
|
|
125
134
|
readonly _tag: "upstream-advance";
|
|
126
|
-
readonly newEvents: readonly LiveStoreEvent.EncodedWithMeta[];
|
|
135
|
+
readonly newEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
|
|
127
136
|
} | {
|
|
128
137
|
readonly _tag: "local-push";
|
|
129
|
-
readonly newEvents: readonly LiveStoreEvent.EncodedWithMeta[];
|
|
138
|
+
readonly newEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
|
|
130
139
|
};
|
|
131
140
|
} & {
|
|
132
141
|
readonly syncState: SyncState;
|
|
@@ -138,27 +147,27 @@ export declare class MergeContext extends MergeContext_base {
|
|
|
138
147
|
declare const MergeResultAdvance_base: Schema.Class<MergeResultAdvance, {
|
|
139
148
|
_tag: Schema.Literal<["advance"]>;
|
|
140
149
|
newSyncState: typeof SyncState;
|
|
141
|
-
newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
150
|
+
newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
142
151
|
/** Events which were previously pending but are now confirmed */
|
|
143
|
-
confirmedEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
152
|
+
confirmedEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
144
153
|
mergeContext: typeof MergeContext;
|
|
145
154
|
}, Schema.Struct.Encoded<{
|
|
146
155
|
_tag: Schema.Literal<["advance"]>;
|
|
147
156
|
newSyncState: typeof SyncState;
|
|
148
|
-
newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
157
|
+
newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
149
158
|
/** Events which were previously pending but are now confirmed */
|
|
150
|
-
confirmedEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
159
|
+
confirmedEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
151
160
|
mergeContext: typeof MergeContext;
|
|
152
161
|
}>, never, {
|
|
153
162
|
readonly _tag: "advance";
|
|
154
163
|
} & {
|
|
155
|
-
readonly newEvents: readonly LiveStoreEvent.EncodedWithMeta[];
|
|
164
|
+
readonly newEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
|
|
156
165
|
} & {
|
|
157
166
|
readonly newSyncState: SyncState;
|
|
158
167
|
} & {
|
|
159
168
|
readonly mergeContext: MergeContext;
|
|
160
169
|
} & {
|
|
161
|
-
readonly confirmedEvents: readonly LiveStoreEvent.EncodedWithMeta[];
|
|
170
|
+
readonly confirmedEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
|
|
162
171
|
}, {}, {}>;
|
|
163
172
|
export declare class MergeResultAdvance extends MergeResultAdvance_base {
|
|
164
173
|
toJSON: () => any;
|
|
@@ -166,23 +175,23 @@ export declare class MergeResultAdvance extends MergeResultAdvance_base {
|
|
|
166
175
|
declare const MergeResultRebase_base: Schema.Class<MergeResultRebase, {
|
|
167
176
|
_tag: Schema.Literal<["rebase"]>;
|
|
168
177
|
newSyncState: typeof SyncState;
|
|
169
|
-
newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
178
|
+
newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
170
179
|
/** Events which need to be rolled back */
|
|
171
|
-
rollbackEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
180
|
+
rollbackEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
172
181
|
mergeContext: typeof MergeContext;
|
|
173
182
|
}, Schema.Struct.Encoded<{
|
|
174
183
|
_tag: Schema.Literal<["rebase"]>;
|
|
175
184
|
newSyncState: typeof SyncState;
|
|
176
|
-
newEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
185
|
+
newEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
177
186
|
/** Events which need to be rolled back */
|
|
178
|
-
rollbackEvents: Schema.Array$<typeof LiveStoreEvent.EncodedWithMeta>;
|
|
187
|
+
rollbackEvents: Schema.Array$<typeof LiveStoreEvent.Client.EncodedWithMeta>;
|
|
179
188
|
mergeContext: typeof MergeContext;
|
|
180
189
|
}>, never, {
|
|
181
190
|
readonly _tag: "rebase";
|
|
182
191
|
} & {
|
|
183
|
-
readonly rollbackEvents: readonly LiveStoreEvent.EncodedWithMeta[];
|
|
192
|
+
readonly rollbackEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
|
|
184
193
|
} & {
|
|
185
|
-
readonly newEvents: readonly LiveStoreEvent.EncodedWithMeta[];
|
|
194
|
+
readonly newEvents: readonly LiveStoreEvent.Client.EncodedWithMeta[];
|
|
186
195
|
} & {
|
|
187
196
|
readonly newSyncState: SyncState;
|
|
188
197
|
} & {
|
|
@@ -198,7 +207,9 @@ declare const MergeResultReject_base: Schema.Class<MergeResultReject, {
|
|
|
198
207
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
|
199
208
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
|
200
209
|
rebaseGeneration: typeof Schema.Int;
|
|
201
|
-
}
|
|
210
|
+
}> & {
|
|
211
|
+
make: (seqNum: EventSequenceNumber.Client.CompositeInput) => EventSequenceNumber.Client.Composite;
|
|
212
|
+
};
|
|
202
213
|
mergeContext: typeof MergeContext;
|
|
203
214
|
}, Schema.Struct.Encoded<{
|
|
204
215
|
_tag: Schema.Literal<["reject"]>;
|
|
@@ -207,7 +218,9 @@ declare const MergeResultReject_base: Schema.Class<MergeResultReject, {
|
|
|
207
218
|
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
|
208
219
|
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
|
209
220
|
rebaseGeneration: typeof Schema.Int;
|
|
210
|
-
}
|
|
221
|
+
}> & {
|
|
222
|
+
make: (seqNum: EventSequenceNumber.Client.CompositeInput) => EventSequenceNumber.Client.Composite;
|
|
223
|
+
};
|
|
211
224
|
mergeContext: typeof MergeContext;
|
|
212
225
|
}>, never, {
|
|
213
226
|
readonly _tag: "reject";
|
|
@@ -223,28 +236,28 @@ declare const MergeResultReject_base: Schema.Class<MergeResultReject, {
|
|
|
223
236
|
export declare class MergeResultReject extends MergeResultReject_base {
|
|
224
237
|
toJSON: () => any;
|
|
225
238
|
}
|
|
226
|
-
declare const
|
|
227
|
-
_tag: Schema.Literal<["
|
|
239
|
+
declare const MergeResultUnknownError_base: Schema.Class<MergeResultUnknownError, {
|
|
240
|
+
_tag: Schema.Literal<["unknown-error"]>;
|
|
228
241
|
message: typeof Schema.String;
|
|
229
242
|
}, Schema.Struct.Encoded<{
|
|
230
|
-
_tag: Schema.Literal<["
|
|
243
|
+
_tag: Schema.Literal<["unknown-error"]>;
|
|
231
244
|
message: typeof Schema.String;
|
|
232
245
|
}>, never, {
|
|
233
|
-
readonly _tag: "
|
|
246
|
+
readonly _tag: "unknown-error";
|
|
234
247
|
} & {
|
|
235
248
|
readonly message: string;
|
|
236
249
|
}, {}, {}>;
|
|
237
|
-
export declare class
|
|
250
|
+
export declare class MergeResultUnknownError extends MergeResultUnknownError_base {
|
|
238
251
|
}
|
|
239
|
-
declare const MergeResult_base: Schema.Union<[typeof MergeResultAdvance, typeof MergeResultRebase, typeof MergeResultReject, typeof
|
|
252
|
+
declare const MergeResult_base: Schema.Union<[typeof MergeResultAdvance, typeof MergeResultRebase, typeof MergeResultReject, typeof MergeResultUnknownError]>;
|
|
240
253
|
export declare class MergeResult extends MergeResult_base {
|
|
241
254
|
}
|
|
242
255
|
export declare const payloadFromMergeResult: (mergeResult: typeof MergeResultAdvance.Type | typeof MergeResultRebase.Type) => typeof PayloadUpstream.Type;
|
|
243
256
|
export declare const merge: ({ syncState, payload, isClientEvent, isEqualEvent, ignoreClientEvents, }: {
|
|
244
257
|
syncState: SyncState;
|
|
245
258
|
payload: typeof Payload.Type;
|
|
246
|
-
isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean;
|
|
247
|
-
isEqualEvent: (a: LiveStoreEvent.EncodedWithMeta, b: LiveStoreEvent.EncodedWithMeta) => boolean;
|
|
259
|
+
isClientEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean;
|
|
260
|
+
isEqualEvent: (a: LiveStoreEvent.Client.EncodedWithMeta, b: LiveStoreEvent.Client.EncodedWithMeta) => boolean;
|
|
248
261
|
/** This is used in the leader which should ignore client events when receiving an upstream-advance payload */
|
|
249
262
|
ignoreClientEvents?: boolean;
|
|
250
263
|
}) => typeof MergeResult.Type;
|
|
@@ -253,10 +266,10 @@ export declare const merge: ({ syncState, payload, isClientEvent, isEqualEvent,
|
|
|
253
266
|
* by comparing each event in `existingEvents` to the corresponding event in `incomingEvents`
|
|
254
267
|
*/
|
|
255
268
|
export declare const findDivergencePoint: ({ existingEvents, incomingEvents, isEqualEvent, isClientEvent, ignoreClientEvents, }: {
|
|
256
|
-
existingEvents: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>;
|
|
257
|
-
incomingEvents: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>;
|
|
258
|
-
isEqualEvent: (a: LiveStoreEvent.EncodedWithMeta, b: LiveStoreEvent.EncodedWithMeta) => boolean;
|
|
259
|
-
isClientEvent: (event: LiveStoreEvent.EncodedWithMeta) => boolean;
|
|
269
|
+
existingEvents: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>;
|
|
270
|
+
incomingEvents: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>;
|
|
271
|
+
isEqualEvent: (a: LiveStoreEvent.Client.EncodedWithMeta, b: LiveStoreEvent.Client.EncodedWithMeta) => boolean;
|
|
272
|
+
isClientEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean;
|
|
260
273
|
ignoreClientEvents: boolean;
|
|
261
274
|
}) => number;
|
|
262
275
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncstate.d.ts","sourceRoot":"","sources":["../../src/sync/syncstate.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,MAAM,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"syncstate.d.ts","sourceRoot":"","sources":["../../src/sync/syncstate.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEtE,OAAO,KAAK,mBAAmB,MAAM,sCAAsC,CAAA;AAC3E,OAAO,KAAK,cAAc,MAAM,iCAAiC,CAAA;;;IAyC/D,kFAAkF;;;;;;;;IAElF,qEAAqE;;;;;;;;;;IAFrE,kFAAkF;;;;;;;;IAElF,qEAAqE;;;;;;;;;;;;;;;;;;;;;;;AAzCvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,qBAAa,SAAU,SAAQ,cAM7B;IACA,MAAM,QAAO,GAAG,CAId;CACH;;IAMC,0CAA0C;;IAE1C,gGAAgG;;;AANlG;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,0BAKzC;CAAG;;;;AAEL,qBAAa,sBAAuB,SAAQ,2BAE1C;CAAG;;;;AAEL,qBAAa,gBAAiB,SAAQ,qBAEpC;CAAG;;AAEL,qBAAa,OAAQ,SAAQ,YAA6E;CAAG;;AAE7G,qBAAa,eAAgB,SAAQ,oBAA2D;CAAG;;;;;;;;;;;;;;;;;;;;;;AAEnG,uCAAuC;AACvC,qBAAa,YAAa,SAAQ,iBAGhC;IACA,MAAM,QAAO,GAAG,CAqBf;CACF;;;;;IAMC,iEAAiE;;;;;;;IAAjE,iEAAiE;;;;;;;;;;;;;;AAJnE,qBAAa,kBAAmB,SAAQ,uBAOtC;IACA,MAAM,QAAO,GAAG,CAQf;CACF;;;;;IAMC,0CAA0C;;;;;;;IAA1C,0CAA0C;;;;;;;;;;;;;;AAJ5C,qBAAa,iBAAkB,SAAQ,sBAOrC;IACA,MAAM,QAAO,GAAG,CAQf;CACF;;;IAIC,mDAAmD;;;;;;;;;;;IAAnD,mDAAmD;;;;;;;;;;;;;;;;;;;;AAFrD,qBAAa,iBAAkB,SAAQ,sBAKrC;IACA,MAAM,QAAO,GAAG,CAMf;CACF;;;;;;;;;;;;AAED,qBAAa,uBAAwB,SAAQ,4BAG3C;CAAG;;AAEL,qBAAa,WAAY,SAAQ,gBAKhC;CAAG;AAEJ,eAAO,MAAM,sBAAsB,GACjC,aAAa,OAAO,kBAAkB,CAAC,IAAI,GAAG,OAAO,iBAAiB,CAAC,IAAI,KAC1E,OAAO,eAAe,CAAC,IAYvB,CAAA;AAkBH,eAAO,MAAM,KAAK,GAAI,0EAMnB;IACD,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,OAAO,OAAO,CAAC,IAAI,CAAA;IAC5B,aAAa,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,KAAK,OAAO,CAAA;IACxE,YAAY,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,KAAK,OAAO,CAAA;IAC7G,8GAA8G;IAC9G,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,KAAG,OAAO,WAAW,CAAC,IA0NtB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,sFAMjC;IACD,cAAc,EAAE,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IACpE,cAAc,EAAE,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IACpE,YAAY,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,KAAK,OAAO,CAAA;IAC7G,aAAa,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,eAAe,KAAK,OAAO,CAAA;IACxE,kBAAkB,EAAE,OAAO,CAAA;CAC5B,KAAG,MAyBH,CAAA"}
|
package/dist/sync/syncstate.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { casesHandled, LS_DEV, shouldNeverHappen } from '@livestore/utils';
|
|
2
2
|
import { Match, ReadonlyArray, Schema } from '@livestore/utils/effect';
|
|
3
|
-
import * as EventSequenceNumber from "../schema/EventSequenceNumber.js";
|
|
4
|
-
import * as LiveStoreEvent from "../schema/LiveStoreEvent.js";
|
|
3
|
+
import * as EventSequenceNumber from "../schema/EventSequenceNumber/mod.js";
|
|
4
|
+
import * as LiveStoreEvent from "../schema/LiveStoreEvent/mod.js";
|
|
5
5
|
/**
|
|
6
6
|
* SyncState represents the current sync state of a sync node relative to an upstream node.
|
|
7
7
|
* Events flow from local to upstream, with each state maintaining its own event head.
|
|
@@ -13,7 +13,7 @@ import * as LiveStoreEvent from "../schema/LiveStoreEvent.js";
|
|
|
13
13
|
* +------------------------+
|
|
14
14
|
* ▼ ▼
|
|
15
15
|
* Upstream Head Local Head
|
|
16
|
-
*
|
|
16
|
+
* e1 e1.1, e1.2, e2
|
|
17
17
|
* ```
|
|
18
18
|
*
|
|
19
19
|
* **Pending Events**: Events awaiting acknowledgment from the upstream.
|
|
@@ -29,7 +29,7 @@ import * as LiveStoreEvent from "../schema/LiveStoreEvent.js";
|
|
|
29
29
|
* Invariants:
|
|
30
30
|
* 1. **Chain Continuity**: Each event must reference its immediate parent.
|
|
31
31
|
* 2. **Head Ordering**: Upstream Head ≤ Local Head.
|
|
32
|
-
* 3. **Event number sequence**: Must follow the pattern
|
|
32
|
+
* 3. **Event number sequence**: Must follow the pattern e1→e1.1→e1.2→e2.
|
|
33
33
|
*
|
|
34
34
|
* A few further notes to help form an intuition:
|
|
35
35
|
* - The goal is to keep the pending events as small as possible (i.e. to have synced with the next upstream node)
|
|
@@ -40,16 +40,16 @@ import * as LiveStoreEvent from "../schema/LiveStoreEvent.js";
|
|
|
40
40
|
* handling cases such as upstream rebase, advance and local push.
|
|
41
41
|
*/
|
|
42
42
|
export class SyncState extends Schema.Class('SyncState')({
|
|
43
|
-
pending: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
43
|
+
pending: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
44
44
|
/** What this node expects the next upstream node to have as its own local head */
|
|
45
|
-
upstreamHead: EventSequenceNumber.
|
|
45
|
+
upstreamHead: EventSequenceNumber.Client.Composite,
|
|
46
46
|
/** Equivalent to `pending.at(-1)?.id` if there are pending events */
|
|
47
|
-
localHead: EventSequenceNumber.
|
|
47
|
+
localHead: EventSequenceNumber.Client.Composite,
|
|
48
48
|
}) {
|
|
49
49
|
toJSON = () => ({
|
|
50
50
|
pending: this.pending.map((e) => e.toJSON()),
|
|
51
|
-
upstreamHead: EventSequenceNumber.toString(this.upstreamHead),
|
|
52
|
-
localHead: EventSequenceNumber.toString(this.localHead),
|
|
51
|
+
upstreamHead: EventSequenceNumber.Client.toString(this.upstreamHead),
|
|
52
|
+
localHead: EventSequenceNumber.Client.toString(this.localHead),
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
@@ -57,17 +57,17 @@ export class SyncState extends Schema.Class('SyncState')({
|
|
|
57
57
|
*/
|
|
58
58
|
export class PayloadUpstreamRebase extends Schema.TaggedStruct('upstream-rebase', {
|
|
59
59
|
/** Events which need to be rolled back */
|
|
60
|
-
rollbackEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
60
|
+
rollbackEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
61
61
|
/** Events which need to be applied after the rollback (already rebased by the upstream node) */
|
|
62
|
-
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
62
|
+
newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
63
63
|
}) {
|
|
64
64
|
}
|
|
65
65
|
export class PayloadUpstreamAdvance extends Schema.TaggedStruct('upstream-advance', {
|
|
66
|
-
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
66
|
+
newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
67
67
|
}) {
|
|
68
68
|
}
|
|
69
69
|
export class PayloadLocalPush extends Schema.TaggedStruct('local-push', {
|
|
70
|
-
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
70
|
+
newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
71
71
|
}) {
|
|
72
72
|
}
|
|
73
73
|
export class Payload extends Schema.Union(PayloadUpstreamRebase, PayloadUpstreamAdvance, PayloadLocalPush) {
|
|
@@ -100,9 +100,9 @@ export class MergeContext extends Schema.Class('MergeContext')({
|
|
|
100
100
|
export class MergeResultAdvance extends Schema.Class('MergeResultAdvance')({
|
|
101
101
|
_tag: Schema.Literal('advance'),
|
|
102
102
|
newSyncState: SyncState,
|
|
103
|
-
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
103
|
+
newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
104
104
|
/** Events which were previously pending but are now confirmed */
|
|
105
|
-
confirmedEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
105
|
+
confirmedEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
106
106
|
mergeContext: MergeContext,
|
|
107
107
|
}) {
|
|
108
108
|
toJSON = () => {
|
|
@@ -118,9 +118,9 @@ export class MergeResultAdvance extends Schema.Class('MergeResultAdvance')({
|
|
|
118
118
|
export class MergeResultRebase extends Schema.Class('MergeResultRebase')({
|
|
119
119
|
_tag: Schema.Literal('rebase'),
|
|
120
120
|
newSyncState: SyncState,
|
|
121
|
-
newEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
121
|
+
newEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
122
122
|
/** Events which need to be rolled back */
|
|
123
|
-
rollbackEvents: Schema.Array(LiveStoreEvent.EncodedWithMeta),
|
|
123
|
+
rollbackEvents: Schema.Array(LiveStoreEvent.Client.EncodedWithMeta),
|
|
124
124
|
mergeContext: MergeContext,
|
|
125
125
|
}) {
|
|
126
126
|
toJSON = () => {
|
|
@@ -136,23 +136,23 @@ export class MergeResultRebase extends Schema.Class('MergeResultRebase')({
|
|
|
136
136
|
export class MergeResultReject extends Schema.Class('MergeResultReject')({
|
|
137
137
|
_tag: Schema.Literal('reject'),
|
|
138
138
|
/** The minimum id that the new events must have */
|
|
139
|
-
expectedMinimumId: EventSequenceNumber.
|
|
139
|
+
expectedMinimumId: EventSequenceNumber.Client.Composite,
|
|
140
140
|
mergeContext: MergeContext,
|
|
141
141
|
}) {
|
|
142
142
|
toJSON = () => {
|
|
143
143
|
return {
|
|
144
144
|
_tag: this._tag,
|
|
145
|
-
expectedMinimumId: EventSequenceNumber.toString(this.expectedMinimumId),
|
|
145
|
+
expectedMinimumId: EventSequenceNumber.Client.toString(this.expectedMinimumId),
|
|
146
146
|
mergeContext: this.mergeContext.toJSON(),
|
|
147
147
|
};
|
|
148
148
|
};
|
|
149
149
|
}
|
|
150
|
-
export class
|
|
151
|
-
_tag: Schema.Literal('
|
|
150
|
+
export class MergeResultUnknownError extends Schema.Class('MergeResultUnknownError')({
|
|
151
|
+
_tag: Schema.Literal('unknown-error'),
|
|
152
152
|
message: Schema.String,
|
|
153
153
|
}) {
|
|
154
154
|
}
|
|
155
|
-
export class MergeResult extends Schema.Union(MergeResultAdvance, MergeResultRebase, MergeResultReject,
|
|
155
|
+
export class MergeResult extends Schema.Union(MergeResultAdvance, MergeResultRebase, MergeResultReject, MergeResultUnknownError) {
|
|
156
156
|
}
|
|
157
157
|
export const payloadFromMergeResult = (mergeResult) => Match.value(mergeResult).pipe(Match.tag('advance', (result) => ({
|
|
158
158
|
_tag: 'upstream-advance',
|
|
@@ -162,12 +162,12 @@ export const payloadFromMergeResult = (mergeResult) => Match.value(mergeResult).
|
|
|
162
162
|
newEvents: result.newEvents,
|
|
163
163
|
rollbackEvents: result.rollbackEvents,
|
|
164
164
|
})), Match.exhaustive);
|
|
165
|
-
const
|
|
165
|
+
const unknownError = (message) => {
|
|
166
166
|
if (LS_DEV) {
|
|
167
167
|
// biome-ignore lint/suspicious/noDebugger: debug
|
|
168
168
|
debugger;
|
|
169
169
|
}
|
|
170
|
-
return
|
|
170
|
+
return MergeResultUnknownError.make({ _tag: 'unknown-error', message });
|
|
171
171
|
};
|
|
172
172
|
// TODO Idea: call merge recursively through hierarchy levels
|
|
173
173
|
/*
|
|
@@ -220,14 +220,14 @@ export const merge = ({ syncState, payload, isClientEvent, isEqualEvent, ignoreC
|
|
|
220
220
|
}
|
|
221
221
|
// Validate that newEvents are sorted in ascending order by eventNum
|
|
222
222
|
for (let i = 1; i < payload.newEvents.length; i++) {
|
|
223
|
-
if (EventSequenceNumber.isGreaterThan(payload.newEvents[i - 1].seqNum, payload.newEvents[i].seqNum)) {
|
|
224
|
-
return
|
|
223
|
+
if (EventSequenceNumber.Client.isGreaterThan(payload.newEvents[i - 1].seqNum, payload.newEvents[i].seqNum)) {
|
|
224
|
+
return unknownError(`Events must be sorted in ascending order by event number. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`);
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
227
|
// Validate that incoming events are larger than upstream head
|
|
228
|
-
if (EventSequenceNumber.isGreaterThan(syncState.upstreamHead, payload.newEvents[0].seqNum) ||
|
|
229
|
-
EventSequenceNumber.isEqual(syncState.upstreamHead, payload.newEvents[0].seqNum)) {
|
|
230
|
-
return
|
|
228
|
+
if (EventSequenceNumber.Client.isGreaterThan(syncState.upstreamHead, payload.newEvents[0].seqNum) ||
|
|
229
|
+
EventSequenceNumber.Client.isEqual(syncState.upstreamHead, payload.newEvents[0].seqNum)) {
|
|
230
|
+
return unknownError(`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(', ')}]`);
|
|
231
231
|
}
|
|
232
232
|
const newUpstreamHead = payload.newEvents.at(-1).seqNum;
|
|
233
233
|
const divergentPendingIndex = findDivergencePoint({
|
|
@@ -263,7 +263,7 @@ export const merge = ({ syncState, payload, isClientEvent, isEqualEvent, ignoreC
|
|
|
263
263
|
newSyncState: new SyncState({
|
|
264
264
|
pending: pendingRemaining,
|
|
265
265
|
upstreamHead: newUpstreamHead,
|
|
266
|
-
localHead: pendingRemaining.at(-1)?.seqNum ?? EventSequenceNumber.max(syncState.localHead, newUpstreamHead),
|
|
266
|
+
localHead: pendingRemaining.at(-1)?.seqNum ?? EventSequenceNumber.Client.max(syncState.localHead, newUpstreamHead),
|
|
267
267
|
}),
|
|
268
268
|
newEvents,
|
|
269
269
|
confirmedEvents: pendingMatching,
|
|
@@ -310,9 +310,9 @@ export const merge = ({ syncState, payload, isClientEvent, isEqualEvent, ignoreC
|
|
|
310
310
|
}));
|
|
311
311
|
}
|
|
312
312
|
const newEventsFirst = payload.newEvents.at(0);
|
|
313
|
-
const invalidEventSequenceNumber = EventSequenceNumber.isGreaterThan(newEventsFirst.seqNum, syncState.localHead) === false;
|
|
313
|
+
const invalidEventSequenceNumber = EventSequenceNumber.Client.isGreaterThan(newEventsFirst.seqNum, syncState.localHead) === false;
|
|
314
314
|
if (invalidEventSequenceNumber) {
|
|
315
|
-
const expectedMinimumId = EventSequenceNumber.nextPair({
|
|
315
|
+
const expectedMinimumId = EventSequenceNumber.Client.nextPair({
|
|
316
316
|
seqNum: syncState.localHead,
|
|
317
317
|
isClient: true,
|
|
318
318
|
}).seqNum;
|
|
@@ -323,12 +323,17 @@ export const merge = ({ syncState, payload, isClientEvent, isEqualEvent, ignoreC
|
|
|
323
323
|
}));
|
|
324
324
|
}
|
|
325
325
|
else {
|
|
326
|
+
const nonClientEvents = ignoreClientEvents
|
|
327
|
+
? payload.newEvents.filter((event) => !isClientEvent(event))
|
|
328
|
+
: payload.newEvents;
|
|
329
|
+
const newPending = [...syncState.pending, ...nonClientEvents];
|
|
330
|
+
const newLocalHead = newPending.at(-1)?.seqNum ?? EventSequenceNumber.Client.max(syncState.localHead, syncState.upstreamHead);
|
|
326
331
|
return validateMergeResult(MergeResultAdvance.make({
|
|
327
332
|
_tag: 'advance',
|
|
328
333
|
newSyncState: new SyncState({
|
|
329
|
-
pending:
|
|
334
|
+
pending: newPending,
|
|
330
335
|
upstreamHead: syncState.upstreamHead,
|
|
331
|
-
localHead:
|
|
336
|
+
localHead: newLocalHead,
|
|
332
337
|
}),
|
|
333
338
|
newEvents: payload.newEvents,
|
|
334
339
|
confirmedEvents: [],
|
|
@@ -359,7 +364,7 @@ export const findDivergencePoint = ({ existingEvents, incomingEvents, isEqualEve
|
|
|
359
364
|
return -1;
|
|
360
365
|
const divergencePointEventSequenceNumber = existingEvents[divergencePointWithoutClientEvents].seqNum;
|
|
361
366
|
// Now find the divergence point in the original array
|
|
362
|
-
return existingEvents.findIndex((event) => EventSequenceNumber.isEqual(event.seqNum, divergencePointEventSequenceNumber));
|
|
367
|
+
return existingEvents.findIndex((event) => EventSequenceNumber.Client.isEqual(event.seqNum, divergencePointEventSequenceNumber));
|
|
363
368
|
}
|
|
364
369
|
return existingEvents.findIndex((existingEvent, index) => {
|
|
365
370
|
const incomingEvent = incomingEvents[index];
|
|
@@ -391,8 +396,8 @@ const rebaseEvents = ({ events, baseEventSequenceNumber, isClientEvent, }) => {
|
|
|
391
396
|
const _flattenMergeResults = (_updateResults) => { };
|
|
392
397
|
const validatePayload = (payload) => {
|
|
393
398
|
for (let i = 1; i < payload.newEvents.length; i++) {
|
|
394
|
-
if (EventSequenceNumber.isGreaterThanOrEqual(payload.newEvents[i - 1].seqNum, payload.newEvents[i].seqNum)) {
|
|
395
|
-
return
|
|
399
|
+
if (EventSequenceNumber.Client.isGreaterThanOrEqual(payload.newEvents[i - 1].seqNum, payload.newEvents[i].seqNum)) {
|
|
400
|
+
return unknownError(`Events must be ordered in monotonically ascending order by eventNum. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`);
|
|
396
401
|
}
|
|
397
402
|
}
|
|
398
403
|
};
|
|
@@ -402,8 +407,8 @@ const validateSyncState = (syncState) => {
|
|
|
402
407
|
const nextEvent = syncState.pending[i + 1];
|
|
403
408
|
if (nextEvent === undefined)
|
|
404
409
|
break; // Reached end of chain
|
|
405
|
-
if (EventSequenceNumber.isGreaterThanOrEqual(event.seqNum, nextEvent.seqNum)) {
|
|
406
|
-
shouldNeverHappen(`Events must be ordered in monotonically ascending order by eventNum. Received: [${syncState.pending.map((e) => EventSequenceNumber.toString(e.seqNum)).join(', ')}]`, {
|
|
410
|
+
if (EventSequenceNumber.Client.isGreaterThanOrEqual(event.seqNum, nextEvent.seqNum)) {
|
|
411
|
+
shouldNeverHappen(`Events must be ordered in monotonically ascending order by eventNum. Received: [${syncState.pending.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`, {
|
|
407
412
|
event,
|
|
408
413
|
nextEvent,
|
|
409
414
|
});
|
|
@@ -412,7 +417,7 @@ const validateSyncState = (syncState) => {
|
|
|
412
417
|
const globalIdHasIncreased = nextEvent.seqNum.global > event.seqNum.global;
|
|
413
418
|
if (globalIdHasIncreased) {
|
|
414
419
|
if (nextEvent.seqNum.client !== 0) {
|
|
415
|
-
shouldNeverHappen(`New global events must point to clientId 0 in the parentSeqNum. Received: (${EventSequenceNumber.toString(nextEvent.seqNum)})`, syncState.pending, {
|
|
420
|
+
shouldNeverHappen(`New global events must point to clientId 0 in the parentSeqNum. Received: (${EventSequenceNumber.Client.toString(nextEvent.seqNum)})`, syncState.pending, {
|
|
416
421
|
event,
|
|
417
422
|
nextEvent,
|
|
418
423
|
});
|
|
@@ -420,7 +425,7 @@ const validateSyncState = (syncState) => {
|
|
|
420
425
|
}
|
|
421
426
|
else {
|
|
422
427
|
// Otherwise, the parentSeqNum must be the same as the previous event's id
|
|
423
|
-
if (EventSequenceNumber.isEqual(nextEvent.parentSeqNum, event.seqNum) === false) {
|
|
428
|
+
if (EventSequenceNumber.Client.isEqual(nextEvent.parentSeqNum, event.seqNum) === false) {
|
|
424
429
|
shouldNeverHappen('Events must be linked in a continuous chain via the parentSeqNum', syncState.pending, {
|
|
425
430
|
event,
|
|
426
431
|
nextEvent,
|
|
@@ -430,25 +435,25 @@ const validateSyncState = (syncState) => {
|
|
|
430
435
|
}
|
|
431
436
|
};
|
|
432
437
|
const validateMergeResult = (mergeResult) => {
|
|
433
|
-
if (mergeResult._tag === '
|
|
438
|
+
if (mergeResult._tag === 'unknown-error' || mergeResult._tag === 'reject')
|
|
434
439
|
return mergeResult;
|
|
435
440
|
validateSyncState(mergeResult.newSyncState);
|
|
436
441
|
// Ensure local head is always greater than or equal to upstream head
|
|
437
|
-
if (EventSequenceNumber.isGreaterThan(mergeResult.newSyncState.upstreamHead, mergeResult.newSyncState.localHead)) {
|
|
442
|
+
if (EventSequenceNumber.Client.isGreaterThan(mergeResult.newSyncState.upstreamHead, mergeResult.newSyncState.localHead)) {
|
|
438
443
|
shouldNeverHappen('Local head must be greater than or equal to upstream head', {
|
|
439
444
|
localHead: mergeResult.newSyncState.localHead,
|
|
440
445
|
upstreamHead: mergeResult.newSyncState.upstreamHead,
|
|
441
446
|
});
|
|
442
447
|
}
|
|
443
448
|
// Ensure new local head is greater than or equal to the previous local head
|
|
444
|
-
if (EventSequenceNumber.isGreaterThanOrEqual(mergeResult.newSyncState.localHead, mergeResult.mergeContext.syncState.localHead) === false) {
|
|
449
|
+
if (EventSequenceNumber.Client.isGreaterThanOrEqual(mergeResult.newSyncState.localHead, mergeResult.mergeContext.syncState.localHead) === false) {
|
|
445
450
|
shouldNeverHappen('New local head must be greater than or equal to the previous local head', {
|
|
446
451
|
localHead: mergeResult.newSyncState.localHead,
|
|
447
452
|
previousLocalHead: mergeResult.mergeContext.syncState.localHead,
|
|
448
453
|
});
|
|
449
454
|
}
|
|
450
455
|
// Ensure new upstream head is greater than or equal to the previous upstream head
|
|
451
|
-
if (EventSequenceNumber.isGreaterThanOrEqual(mergeResult.newSyncState.upstreamHead, mergeResult.mergeContext.syncState.upstreamHead) === false) {
|
|
456
|
+
if (EventSequenceNumber.Client.isGreaterThanOrEqual(mergeResult.newSyncState.upstreamHead, mergeResult.mergeContext.syncState.upstreamHead) === false) {
|
|
452
457
|
shouldNeverHappen('New upstream head must be greater than or equal to the previous upstream head', {
|
|
453
458
|
upstreamHead: mergeResult.newSyncState.upstreamHead,
|
|
454
459
|
previousUpstreamHead: mergeResult.mergeContext.syncState.upstreamHead,
|