@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
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { Brand, Schema as S } from '@livestore/utils/effect'
|
|
2
|
+
|
|
3
|
+
import { type Type as Global, Schema as GlobalSchema, make as makeGlobal } from './global.ts'
|
|
4
|
+
|
|
5
|
+
/** Branded integer type for client-local sequence numbers. */
|
|
6
|
+
export type Type = Brand.Branded<number, 'ClientEventSequenceNumber'>
|
|
7
|
+
|
|
8
|
+
const ClientBrand = Brand.nominal<Type>()
|
|
9
|
+
|
|
10
|
+
/** Effect Schema for encoding/decoding client sequence numbers. */
|
|
11
|
+
export const Schema = S.fromBrand(ClientBrand)(S.Int)
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Creates a branded client sequence number from a plain number.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const clientSeq = EventSequenceNumber.Client.make(1)
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export const make = ClientBrand
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Default client sequence number (0). Used for confirmed/synced events.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const defaultSeq = EventSequenceNumber.Client.DEFAULT // 0
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export const DEFAULT = 0 as any as Type
|
|
32
|
+
|
|
33
|
+
/** Default rebase generation (0). Increments each time the client rebases unconfirmed events. */
|
|
34
|
+
export const REBASE_GENERATION_DEFAULT = 0
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Composite event sequence number consisting of global + client + rebaseGeneration.
|
|
38
|
+
* Used for client-side event tracking with support for unconfirmed local events.
|
|
39
|
+
*
|
|
40
|
+
* For event notation documentation, see: contributor-docs/events-notation.md
|
|
41
|
+
*/
|
|
42
|
+
export type Composite = {
|
|
43
|
+
global: Global
|
|
44
|
+
client: Type
|
|
45
|
+
/**
|
|
46
|
+
* Generation integer that is incremented whenever the client rebased.
|
|
47
|
+
* Remains constant for all subsequent events until another rebase occurs.
|
|
48
|
+
*/
|
|
49
|
+
rebaseGeneration: number
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Input type for creating a Composite sequence number. Allows omitting rebaseGeneration (defaults to 0). */
|
|
53
|
+
export type CompositeInput =
|
|
54
|
+
| Composite
|
|
55
|
+
| (Omit<typeof CompositeSchema.Encoded, 'rebaseGeneration'> & { rebaseGeneration?: number })
|
|
56
|
+
|
|
57
|
+
/** A pair of sequence numbers representing an event and its parent. */
|
|
58
|
+
export type CompositePair = { seqNum: Composite; parentSeqNum: Composite }
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Compare two composite sequence numbers.
|
|
62
|
+
* Comparison hierarchy: global > client > rebaseGeneration
|
|
63
|
+
*/
|
|
64
|
+
export const compare = (a: Composite, b: Composite) => {
|
|
65
|
+
if (a.global !== b.global) {
|
|
66
|
+
return a.global - b.global
|
|
67
|
+
}
|
|
68
|
+
if (a.client !== b.client) {
|
|
69
|
+
return a.client - b.client
|
|
70
|
+
}
|
|
71
|
+
return a.rebaseGeneration - b.rebaseGeneration
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Convert a composite sequence number to a string representation.
|
|
76
|
+
*
|
|
77
|
+
* For notation documentation, see: contributor-docs/events-notation.md
|
|
78
|
+
*/
|
|
79
|
+
export const toString = (seqNum: Composite) => {
|
|
80
|
+
const rebaseGenerationStr = seqNum.rebaseGeneration > 0 ? `r${seqNum.rebaseGeneration}` : ''
|
|
81
|
+
return seqNum.client === 0
|
|
82
|
+
? `e${seqNum.global}${rebaseGenerationStr}`
|
|
83
|
+
: `e${seqNum.global}.${seqNum.client}${rebaseGenerationStr}`
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Convert a string representation of a sequence number to a Composite.
|
|
88
|
+
* Parses strings in the format: e{global}[.{client}][r{rebaseGeneration}]
|
|
89
|
+
* Examples: "e0", "e0r1", "e0.1", "e0.1r1"
|
|
90
|
+
*
|
|
91
|
+
* For full notation documentation, see: contributor-docs/events-notation.md
|
|
92
|
+
*/
|
|
93
|
+
export const fromString = (str: string): Composite => {
|
|
94
|
+
if (!str.startsWith('e')) {
|
|
95
|
+
throw new Error('Invalid event sequence number string: must start with "e"')
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Remove the 'e' prefix
|
|
99
|
+
const remaining = str.slice(1)
|
|
100
|
+
|
|
101
|
+
// Parse rebase generation if present
|
|
102
|
+
let rebaseGeneration = REBASE_GENERATION_DEFAULT
|
|
103
|
+
let withoutRebase = remaining
|
|
104
|
+
const rebaseMatch = remaining.match(/r(\d+)$/)
|
|
105
|
+
if (rebaseMatch !== null) {
|
|
106
|
+
rebaseGeneration = Number.parseInt(rebaseMatch[1]!, 10)
|
|
107
|
+
withoutRebase = remaining.slice(0, -rebaseMatch[0].length)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Parse global and client parts
|
|
111
|
+
const parts = withoutRebase.split('.')
|
|
112
|
+
|
|
113
|
+
// Validate that parts contain only digits (and possibly empty for client)
|
|
114
|
+
if (parts[0] === '' || !/^\d+$/.test(parts[0]!)) {
|
|
115
|
+
throw new Error('Invalid event sequence number string: invalid number format')
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (parts.length > 1 && parts[1] !== undefined && (parts[1] === '' || !/^\d+$/.test(parts[1]))) {
|
|
119
|
+
throw new Error('Invalid event sequence number string: invalid number format')
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const global = Number.parseInt(parts[0]!, 10)
|
|
123
|
+
const client = parts.length > 1 && parts[1] !== undefined ? Number.parseInt(parts[1], 10) : 0
|
|
124
|
+
|
|
125
|
+
if (Number.isNaN(global) || Number.isNaN(client) || Number.isNaN(rebaseGeneration)) {
|
|
126
|
+
throw new TypeError('Invalid event sequence number string: invalid number format')
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
global: global as any as Global,
|
|
131
|
+
client: client as any as Type,
|
|
132
|
+
rebaseGeneration,
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Creates a Composite sequence number from a global sequence number (client=0, rebaseGeneration=0). */
|
|
137
|
+
export const fromGlobal = (seqNum: Global): Composite => ({
|
|
138
|
+
global: seqNum,
|
|
139
|
+
client: DEFAULT,
|
|
140
|
+
rebaseGeneration: REBASE_GENERATION_DEFAULT,
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
/** Returns true if two Composite sequence numbers are structurally equal. */
|
|
144
|
+
export const isEqual = (a: Composite, b: Composite) =>
|
|
145
|
+
a.global === b.global && a.client === b.client && a.rebaseGeneration === b.rebaseGeneration
|
|
146
|
+
|
|
147
|
+
/** Returns true if `a` is strictly greater than `b` (compares global, then client). */
|
|
148
|
+
export const isGreaterThan = (a: Composite, b: Composite) => {
|
|
149
|
+
return a.global > b.global || (a.global === b.global && a.client > b.client)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Returns true if `a` is greater than or equal to `b` (compares global, then client). */
|
|
153
|
+
export const isGreaterThanOrEqual = (a: Composite, b: Composite) => {
|
|
154
|
+
return a.global > b.global || (a.global === b.global && a.client >= b.client)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** Returns the larger of two Composite sequence numbers. */
|
|
158
|
+
export const max = (a: Composite, b: Composite) => {
|
|
159
|
+
return a.global > b.global || (a.global === b.global && a.client > b.client) ? a : b
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Returns the difference between two Composite sequence numbers (a - b) for global and client components. */
|
|
163
|
+
export const diff = (a: Composite, b: Composite) => {
|
|
164
|
+
return {
|
|
165
|
+
global: a.global - b.global,
|
|
166
|
+
client: a.client - b.client,
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Schema for the composite event sequence number.
|
|
172
|
+
* NOTE: Client mutation events with a non-0 client id won't be synced to the sync backend.
|
|
173
|
+
*/
|
|
174
|
+
const CompositeSchema = S.Struct({
|
|
175
|
+
global: GlobalSchema,
|
|
176
|
+
/** Only increments for client-local events */
|
|
177
|
+
client: Schema,
|
|
178
|
+
// Client only
|
|
179
|
+
rebaseGeneration: S.Int,
|
|
180
|
+
}).annotations({
|
|
181
|
+
title: 'EventSequenceNumber.Composite',
|
|
182
|
+
pretty: () => (seqNum) => toString(seqNum),
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Creates a validated Composite sequence number from input.
|
|
187
|
+
* If rebaseGeneration is omitted, defaults to REBASE_GENERATION_DEFAULT (0).
|
|
188
|
+
*/
|
|
189
|
+
const makeComposite = (seqNum: CompositeInput): Composite => {
|
|
190
|
+
return S.is(CompositeSchema)(seqNum)
|
|
191
|
+
? seqNum
|
|
192
|
+
: S.decodeSync(CompositeSchema)({
|
|
193
|
+
...seqNum,
|
|
194
|
+
rebaseGeneration: seqNum.rebaseGeneration ?? REBASE_GENERATION_DEFAULT,
|
|
195
|
+
})
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Effect Schema for the composite event sequence number (global + client + rebaseGeneration).
|
|
200
|
+
* Also includes a `make` helper for creating validated Composite values.
|
|
201
|
+
*
|
|
202
|
+
* @example
|
|
203
|
+
* ```ts
|
|
204
|
+
* const seqNum: EventSequenceNumber.Client.Composite = {
|
|
205
|
+
* global: EventSequenceNumber.Global.make(5),
|
|
206
|
+
* client: EventSequenceNumber.Client.DEFAULT,
|
|
207
|
+
* rebaseGeneration: 0
|
|
208
|
+
* }
|
|
209
|
+
*
|
|
210
|
+
* const validated = EventSequenceNumber.Client.Composite.make({ global: 5, client: 0, rebaseGeneration: 0 })
|
|
211
|
+
* ```
|
|
212
|
+
*/
|
|
213
|
+
export const Composite = Object.assign(CompositeSchema, { make: makeComposite })
|
|
214
|
+
|
|
215
|
+
/** The root sequence number (global=0, client=0, rebaseGeneration=0). Parent of the first event. */
|
|
216
|
+
export const ROOT = {
|
|
217
|
+
global: makeGlobal(0),
|
|
218
|
+
client: DEFAULT,
|
|
219
|
+
rebaseGeneration: REBASE_GENERATION_DEFAULT,
|
|
220
|
+
} satisfies Composite
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Computes the next sequence number and its parent based on the current position.
|
|
224
|
+
*
|
|
225
|
+
* For client-local events (isClient=true): increments the client component, keeps global.
|
|
226
|
+
* For global events (isClient=false): increments global, resets client to 0.
|
|
227
|
+
*/
|
|
228
|
+
export const nextPair = ({
|
|
229
|
+
seqNum,
|
|
230
|
+
isClient,
|
|
231
|
+
rebaseGeneration,
|
|
232
|
+
}: {
|
|
233
|
+
seqNum: Composite
|
|
234
|
+
isClient: boolean
|
|
235
|
+
rebaseGeneration?: number
|
|
236
|
+
}): CompositePair => {
|
|
237
|
+
if (isClient) {
|
|
238
|
+
return {
|
|
239
|
+
seqNum: {
|
|
240
|
+
global: seqNum.global,
|
|
241
|
+
client: (seqNum.client + 1) as any as Type,
|
|
242
|
+
rebaseGeneration: rebaseGeneration ?? seqNum.rebaseGeneration,
|
|
243
|
+
},
|
|
244
|
+
parentSeqNum: seqNum,
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return {
|
|
249
|
+
seqNum: {
|
|
250
|
+
global: (seqNum.global + 1) as any as Global,
|
|
251
|
+
client: DEFAULT,
|
|
252
|
+
rebaseGeneration: rebaseGeneration ?? seqNum.rebaseGeneration,
|
|
253
|
+
},
|
|
254
|
+
// NOTE we always point to `client: 0` for non-client-local events
|
|
255
|
+
parentSeqNum: { global: seqNum.global, client: DEFAULT, rebaseGeneration: seqNum.rebaseGeneration },
|
|
256
|
+
}
|
|
257
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Brand, Schema as S } from '@livestore/utils/effect'
|
|
2
|
+
|
|
3
|
+
/** Branded integer type for global sequence numbers assigned by the sync backend. */
|
|
4
|
+
export type Type = Brand.Branded<number, 'GlobalEventSequenceNumber'>
|
|
5
|
+
|
|
6
|
+
const GlobalBrand = Brand.nominal<Type>()
|
|
7
|
+
|
|
8
|
+
/** Effect Schema for encoding/decoding global sequence numbers. */
|
|
9
|
+
export const Schema = S.fromBrand(GlobalBrand)(S.Int)
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Creates a branded global sequence number from a plain number.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const seqNum = EventSequenceNumber.Global.make(5)
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export const make = GlobalBrand
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client sequence numbers track events created locally before sync confirmation.
|
|
3
|
+
* Also contains the Composite type combining global and client sequence numbers with a rebase
|
|
4
|
+
* generation to fully identify an event's position in the eventlog.
|
|
5
|
+
*
|
|
6
|
+
* For event notation documentation, see: contributor-docs/events-notation.md
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { EventSequenceNumber } from '@livestore/common'
|
|
11
|
+
*
|
|
12
|
+
* // Client sequence number
|
|
13
|
+
* const clientSeq = EventSequenceNumber.Client.make(1)
|
|
14
|
+
*
|
|
15
|
+
* // Composite sequence number
|
|
16
|
+
* const composite: EventSequenceNumber.Client.Composite = {
|
|
17
|
+
* global: EventSequenceNumber.Global.make(5),
|
|
18
|
+
* client: EventSequenceNumber.Client.DEFAULT,
|
|
19
|
+
* rebaseGeneration: 0,
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export * as Client from './client.ts'
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Global sequence numbers are assigned by the sync backend and represent
|
|
27
|
+
* the canonical ordering of events across all clients. They are monotonically
|
|
28
|
+
* increasing integers that establish the authoritative event timeline.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* import { EventSequenceNumber } from '@livestore/common'
|
|
33
|
+
*
|
|
34
|
+
* const globalSeq = EventSequenceNumber.Global.make(5)
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export * as Global from './global.ts'
|
|
@@ -5,13 +5,13 @@ import { EventSequenceNumber } from './mod.ts'
|
|
|
5
5
|
|
|
6
6
|
Vitest.describe('EventSequenceNumber', () => {
|
|
7
7
|
Vitest.test('nextPair (no rebase)', () => {
|
|
8
|
-
const e_0_0 = EventSequenceNumber.make({ global: 0, client: 0 })
|
|
9
|
-
expect(EventSequenceNumber.nextPair({ seqNum: e_0_0, isClient: false }).seqNum).toStrictEqual({
|
|
8
|
+
const e_0_0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })
|
|
9
|
+
expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: false }).seqNum).toStrictEqual({
|
|
10
10
|
global: 1,
|
|
11
11
|
client: 0,
|
|
12
12
|
rebaseGeneration: 0,
|
|
13
13
|
})
|
|
14
|
-
expect(EventSequenceNumber.nextPair({ seqNum: e_0_0, isClient: true }).seqNum).toStrictEqual({
|
|
14
|
+
expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: true }).seqNum).toStrictEqual({
|
|
15
15
|
global: 0,
|
|
16
16
|
client: 1,
|
|
17
17
|
rebaseGeneration: 0,
|
|
@@ -19,65 +19,83 @@ Vitest.describe('EventSequenceNumber', () => {
|
|
|
19
19
|
})
|
|
20
20
|
|
|
21
21
|
Vitest.test('nextPair (rebase)', () => {
|
|
22
|
-
const e_0_0 = EventSequenceNumber.make({ global: 0, client: 0 })
|
|
23
|
-
expect(
|
|
22
|
+
const e_0_0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })
|
|
23
|
+
expect(
|
|
24
|
+
EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: false, rebaseGeneration: 1 }).seqNum,
|
|
25
|
+
).toStrictEqual({
|
|
24
26
|
global: 1,
|
|
25
27
|
client: 0,
|
|
26
|
-
rebaseGeneration:
|
|
28
|
+
rebaseGeneration: 1,
|
|
27
29
|
})
|
|
28
|
-
expect(
|
|
30
|
+
expect(
|
|
31
|
+
EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: true, rebaseGeneration: 1 }).seqNum,
|
|
32
|
+
).toStrictEqual({
|
|
29
33
|
global: 0,
|
|
30
34
|
client: 1,
|
|
31
35
|
rebaseGeneration: 1,
|
|
32
36
|
})
|
|
33
37
|
|
|
34
|
-
const e_0_0_g1 = EventSequenceNumber.make({ global: 0, client: 0, rebaseGeneration: 2 })
|
|
35
|
-
expect(EventSequenceNumber.nextPair({ seqNum: e_0_0_g1, isClient: false }).seqNum).toStrictEqual({
|
|
38
|
+
const e_0_0_g1 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 2 })
|
|
39
|
+
expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0_g1, isClient: false }).seqNum).toStrictEqual({
|
|
36
40
|
global: 1,
|
|
37
41
|
client: 0,
|
|
38
|
-
rebaseGeneration:
|
|
42
|
+
rebaseGeneration: 2,
|
|
39
43
|
})
|
|
40
44
|
})
|
|
41
45
|
|
|
42
46
|
Vitest.test('toString', () => {
|
|
43
|
-
expect(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
)
|
|
51
|
-
expect(
|
|
52
|
-
|
|
53
|
-
)
|
|
47
|
+
expect(
|
|
48
|
+
EventSequenceNumber.Client.toString(EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })),
|
|
49
|
+
).toBe('e0')
|
|
50
|
+
expect(
|
|
51
|
+
EventSequenceNumber.Client.toString(
|
|
52
|
+
EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 1 }),
|
|
53
|
+
),
|
|
54
|
+
).toBe('e0r1')
|
|
55
|
+
expect(
|
|
56
|
+
EventSequenceNumber.Client.toString(EventSequenceNumber.Client.Composite.make({ global: 0, client: 1 })),
|
|
57
|
+
).toBe('e0.1')
|
|
58
|
+
expect(
|
|
59
|
+
EventSequenceNumber.Client.toString(
|
|
60
|
+
EventSequenceNumber.Client.Composite.make({ global: 0, client: 1, rebaseGeneration: 1 }),
|
|
61
|
+
),
|
|
62
|
+
).toBe('e0.1r1')
|
|
63
|
+
expect(
|
|
64
|
+
EventSequenceNumber.Client.toString(
|
|
65
|
+
EventSequenceNumber.Client.Composite.make({ global: 5, client: 3, rebaseGeneration: 2 }),
|
|
66
|
+
),
|
|
67
|
+
).toBe('e5.3r2')
|
|
54
68
|
})
|
|
55
69
|
|
|
56
70
|
Vitest.test('fromString', () => {
|
|
57
71
|
// Basic cases
|
|
58
|
-
expect(EventSequenceNumber.fromString('e0')).toStrictEqual(
|
|
59
|
-
|
|
60
|
-
|
|
72
|
+
expect(EventSequenceNumber.Client.fromString('e0')).toStrictEqual(
|
|
73
|
+
EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 }),
|
|
74
|
+
)
|
|
75
|
+
expect(EventSequenceNumber.Client.fromString('e0r1')).toStrictEqual(
|
|
76
|
+
EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 1 }),
|
|
77
|
+
)
|
|
78
|
+
expect(EventSequenceNumber.Client.fromString('e0.1')).toStrictEqual(
|
|
79
|
+
EventSequenceNumber.Client.Composite.make({ global: 0, client: 1 }),
|
|
61
80
|
)
|
|
62
|
-
expect(EventSequenceNumber.fromString('e0
|
|
63
|
-
|
|
64
|
-
EventSequenceNumber.make({ global: 0, client: 1, rebaseGeneration: 1 }),
|
|
81
|
+
expect(EventSequenceNumber.Client.fromString('e0.1r1')).toStrictEqual(
|
|
82
|
+
EventSequenceNumber.Client.Composite.make({ global: 0, client: 1, rebaseGeneration: 1 }),
|
|
65
83
|
)
|
|
66
|
-
expect(EventSequenceNumber.fromString('e5
|
|
67
|
-
EventSequenceNumber.make({ global: 5, client: 3, rebaseGeneration: 2 }),
|
|
84
|
+
expect(EventSequenceNumber.Client.fromString('e5.3r2')).toStrictEqual(
|
|
85
|
+
EventSequenceNumber.Client.Composite.make({ global: 5, client: 3, rebaseGeneration: 2 }),
|
|
68
86
|
)
|
|
69
87
|
|
|
70
88
|
// Error cases
|
|
71
|
-
expect(() => EventSequenceNumber.fromString('0')).toThrow(
|
|
89
|
+
expect(() => EventSequenceNumber.Client.fromString('0')).toThrow(
|
|
72
90
|
'Invalid event sequence number string: must start with "e"',
|
|
73
91
|
)
|
|
74
|
-
expect(() => EventSequenceNumber.fromString('eabc')).toThrow(
|
|
92
|
+
expect(() => EventSequenceNumber.Client.fromString('eabc')).toThrow(
|
|
75
93
|
'Invalid event sequence number string: invalid number format',
|
|
76
94
|
)
|
|
77
|
-
expect(() => EventSequenceNumber.fromString('e0
|
|
95
|
+
expect(() => EventSequenceNumber.Client.fromString('e0.abc')).toThrow(
|
|
78
96
|
'Invalid event sequence number string: invalid number format',
|
|
79
97
|
)
|
|
80
|
-
expect(() => EventSequenceNumber.fromString('e0rabc')).toThrow(
|
|
98
|
+
expect(() => EventSequenceNumber.Client.fromString('e0rabc')).toThrow(
|
|
81
99
|
'Invalid event sequence number string: invalid number format',
|
|
82
100
|
)
|
|
83
101
|
})
|
|
@@ -93,37 +111,37 @@ Vitest.describe('EventSequenceNumber', () => {
|
|
|
93
111
|
]
|
|
94
112
|
|
|
95
113
|
for (const testCase of testCases) {
|
|
96
|
-
const original = EventSequenceNumber.make(testCase)
|
|
97
|
-
const str = EventSequenceNumber.toString(original)
|
|
98
|
-
const parsed = EventSequenceNumber.fromString(str)
|
|
114
|
+
const original = EventSequenceNumber.Client.Composite.make(testCase)
|
|
115
|
+
const str = EventSequenceNumber.Client.toString(original)
|
|
116
|
+
const parsed = EventSequenceNumber.Client.fromString(str)
|
|
99
117
|
expect(parsed).toStrictEqual(original)
|
|
100
118
|
}
|
|
101
119
|
})
|
|
102
120
|
|
|
103
121
|
Vitest.test('compare', () => {
|
|
104
|
-
const e_0_0_r0 = EventSequenceNumber.make({ global: 0, client: 0, rebaseGeneration: 0 })
|
|
105
|
-
const e_0_0_r1 = EventSequenceNumber.make({ global: 0, client: 0, rebaseGeneration: 1 })
|
|
106
|
-
const e_0_1_r0 = EventSequenceNumber.make({ global: 0, client: 1, rebaseGeneration: 0 })
|
|
107
|
-
const e_0_1_r1 = EventSequenceNumber.make({ global: 0, client: 1, rebaseGeneration: 1 })
|
|
108
|
-
const e_1_0_r0 = EventSequenceNumber.make({ global: 1, client: 0, rebaseGeneration: 0 })
|
|
109
|
-
const e_1_1_r0 = EventSequenceNumber.make({ global: 1, client: 1, rebaseGeneration: 0 })
|
|
122
|
+
const e_0_0_r0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 0 })
|
|
123
|
+
const e_0_0_r1 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 1 })
|
|
124
|
+
const e_0_1_r0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 1, rebaseGeneration: 0 })
|
|
125
|
+
const e_0_1_r1 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 1, rebaseGeneration: 1 })
|
|
126
|
+
const e_1_0_r0 = EventSequenceNumber.Client.Composite.make({ global: 1, client: 0, rebaseGeneration: 0 })
|
|
127
|
+
const e_1_1_r0 = EventSequenceNumber.Client.Composite.make({ global: 1, client: 1, rebaseGeneration: 0 })
|
|
110
128
|
|
|
111
129
|
// Global comparison (strongest level)
|
|
112
|
-
expect(EventSequenceNumber.compare(e_0_0_r0, e_1_0_r0)).toBeLessThan(0)
|
|
113
|
-
expect(EventSequenceNumber.compare(e_1_0_r0, e_0_0_r0)).toBeGreaterThan(0)
|
|
114
|
-
expect(EventSequenceNumber.compare(e_0_1_r1, e_1_0_r0)).toBeLessThan(0) // global overrides client and rebase
|
|
130
|
+
expect(EventSequenceNumber.Client.compare(e_0_0_r0, e_1_0_r0)).toBeLessThan(0)
|
|
131
|
+
expect(EventSequenceNumber.Client.compare(e_1_0_r0, e_0_0_r0)).toBeGreaterThan(0)
|
|
132
|
+
expect(EventSequenceNumber.Client.compare(e_0_1_r1, e_1_0_r0)).toBeLessThan(0) // global overrides client and rebase
|
|
115
133
|
|
|
116
134
|
// Client comparison (second level)
|
|
117
|
-
expect(EventSequenceNumber.compare(e_0_0_r0, e_0_1_r0)).toBeLessThan(0)
|
|
118
|
-
expect(EventSequenceNumber.compare(e_0_1_r0, e_0_0_r0)).toBeGreaterThan(0)
|
|
119
|
-
expect(EventSequenceNumber.compare(e_0_0_r1, e_0_1_r0)).toBeLessThan(0) // client overrides rebase
|
|
135
|
+
expect(EventSequenceNumber.Client.compare(e_0_0_r0, e_0_1_r0)).toBeLessThan(0)
|
|
136
|
+
expect(EventSequenceNumber.Client.compare(e_0_1_r0, e_0_0_r0)).toBeGreaterThan(0)
|
|
137
|
+
expect(EventSequenceNumber.Client.compare(e_0_0_r1, e_0_1_r0)).toBeLessThan(0) // client overrides rebase
|
|
120
138
|
|
|
121
139
|
// Rebase generation comparison (weakest level)
|
|
122
|
-
expect(EventSequenceNumber.compare(e_0_0_r0, e_0_0_r1)).toBeLessThan(0)
|
|
123
|
-
expect(EventSequenceNumber.compare(e_0_0_r1, e_0_0_r0)).toBeGreaterThan(0)
|
|
140
|
+
expect(EventSequenceNumber.Client.compare(e_0_0_r0, e_0_0_r1)).toBeLessThan(0)
|
|
141
|
+
expect(EventSequenceNumber.Client.compare(e_0_0_r1, e_0_0_r0)).toBeGreaterThan(0)
|
|
124
142
|
|
|
125
143
|
// Equal comparison
|
|
126
|
-
expect(EventSequenceNumber.compare(e_0_0_r0, e_0_0_r0)).toBe(0)
|
|
127
|
-
expect(EventSequenceNumber.compare(e_1_1_r0, e_1_1_r0)).toBe(0)
|
|
144
|
+
expect(EventSequenceNumber.Client.compare(e_0_0_r0, e_0_0_r0)).toBe(0)
|
|
145
|
+
expect(EventSequenceNumber.Client.compare(e_1_1_r0, e_1_1_r0)).toBe(0)
|
|
128
146
|
})
|
|
129
147
|
})
|