@livestore/common 0.4.0-dev.2 → 0.4.0-dev.20
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 +17 -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 +36 -29
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +8 -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 +8 -4
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +156 -73
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +15 -21
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +18 -18
- 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 +30 -42
- 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/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/types.d.ts +21 -19
- package/dist/leader-thread/types.d.ts.map +1 -1
- 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/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 +46 -7
- 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 +17 -10
- 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 +17 -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 +8 -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 +242 -103
- package/src/leader-thread/eventlog.ts +33 -34
- package/src/leader-thread/leader-worker-devtools.ts +50 -54
- 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/recreate-db.ts +15 -7
- package/src/leader-thread/shutdown-channel.ts +16 -2
- package/src/leader-thread/types.ts +21 -19
- package/src/logging.ts +62 -0
- package/src/make-client-session.ts +9 -3
- package/src/materializer-helper.ts +27 -10
- 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 +120 -8
- 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 +60 -7
- 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 +2 -1
- package/src/schema/state/sqlite/mod.ts +4 -3
- package/src/schema/state/sqlite/query-builder/api.ts +19 -10
- 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 +9 -8
- 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
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
// TODO re-enable when `graphology` supports ESM `exports` and `.js` import/export syntax
|
|
2
|
-
// import {} from 'graphology'
|
|
3
|
-
import * as graphology_ from 'graphology';
|
|
4
|
-
export const graphology = graphology_;
|
|
5
|
-
export const DirectedGraph = class DirectedGraph extends graphology.DirectedGraph {
|
|
6
|
-
};
|
|
7
|
-
export const Graph = class Graph extends graphology.Graph {
|
|
8
|
-
};
|
|
9
|
-
// export const graphology = graphology_ as graphologyTypes
|
|
10
|
-
/*
|
|
11
|
-
|
|
12
|
-
Example usage:
|
|
13
|
-
|
|
14
|
-
const dag = new graphology.DirectedGraph({ allowSelfLoops: false })
|
|
15
|
-
|
|
16
|
-
nodes.forEach((node) => dag.addNode(node.id, { width: node.data.label.length * 100, height: 40 }))
|
|
17
|
-
edges.forEach((edge) => {
|
|
18
|
-
// TODO do this filtering earlier
|
|
19
|
-
if (!nodeIds.has(edge.source) || !nodeIds.has(edge.target)) return
|
|
20
|
-
|
|
21
|
-
dag.addEdge(edge.source, edge.target)
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
graphologyLayout.random.assign(dag) // needed for initial `x`, `y` values
|
|
25
|
-
const sensibleSettings = forceAtlas2.inferSettings(dag)
|
|
26
|
-
// forceAtlas2.assign(dag, { iterations: 100, settings: { adjustSizes: true, } })
|
|
27
|
-
forceAtlas2.assign(dag, { iterations: 100, settings: sensibleSettings })
|
|
28
|
-
|
|
29
|
-
*/
|
|
30
|
-
//# sourceMappingURL=graphology.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graphology.js","sourceRoot":"","sources":["../../../src/sync/next/graphology.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,8BAA8B;AAC9B,OAAO,KAAK,WAAW,MAAM,YAAY,CAAA;AAGzC,MAAM,CAAC,MAAM,UAAU,GAAG,WAAkB,CAAA;AAU5C,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,aAAc,SAAQ,UAAU,CAAC,aAAa;CAAoB,CAAA;AAErG,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,KAAM,SAAQ,UAAU,CAAC,KAAK;CAAoB,CAAA;AAE7E,2DAA2D;AAE3D;;;;;;;;;;;;;;;;;;;EAmBE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graphology_.d.ts","sourceRoot":"","sources":["../../../src/sync/next/graphology_.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graphology_.js","sourceRoot":"","sources":["../../../src/sync/next/graphology_.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA"}
|
package/src/schema/EventDef.ts
DELETED
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
import type { SingleOrReadonlyArray } from '@livestore/utils'
|
|
2
|
-
import { shouldNeverHappen } from '@livestore/utils'
|
|
3
|
-
import { Schema } from '@livestore/utils/effect'
|
|
4
|
-
|
|
5
|
-
import type { BindValues } from '../sql-queries/sql-queries.ts'
|
|
6
|
-
import type { ParamsObject } from '../util.ts'
|
|
7
|
-
import type { QueryBuilder } from './state/sqlite/query-builder/mod.ts'
|
|
8
|
-
|
|
9
|
-
export type EventDefMap = {
|
|
10
|
-
map: Map<string, EventDef.Any>
|
|
11
|
-
}
|
|
12
|
-
export type EventDefRecord = {
|
|
13
|
-
[name: string]: EventDef.Any
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export type EventDef<TName extends string, TType, TEncoded = TType, TDerived extends boolean = false> = {
|
|
17
|
-
name: TName
|
|
18
|
-
schema: Schema.Schema<TType, TEncoded>
|
|
19
|
-
options: {
|
|
20
|
-
/**
|
|
21
|
-
* When set to true, the mutation won't be synced across clients but
|
|
22
|
-
*/
|
|
23
|
-
clientOnly: boolean
|
|
24
|
-
/** Warning: This feature is not fully implemented yet */
|
|
25
|
-
facts: FactsCallback<TType> | undefined
|
|
26
|
-
derived: TDerived
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Helper function to construct a partial event */
|
|
30
|
-
(
|
|
31
|
-
args: TType,
|
|
32
|
-
): {
|
|
33
|
-
name: TName
|
|
34
|
-
args: TType
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/** Helper function to construct a partial encoded event */
|
|
38
|
-
encoded: (args: TEncoded) => {
|
|
39
|
-
name: TName
|
|
40
|
-
args: TEncoded
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
readonly Event: {
|
|
44
|
-
name: TName
|
|
45
|
-
args: TType
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export type FactsCallback<TTo> = (
|
|
50
|
-
args: TTo,
|
|
51
|
-
currentFacts: EventDefFacts,
|
|
52
|
-
) => {
|
|
53
|
-
modify: {
|
|
54
|
-
set: Iterable<EventDefFactInput>
|
|
55
|
-
unset: Iterable<EventDefFactInput>
|
|
56
|
-
}
|
|
57
|
-
require: Iterable<EventDefFactInput>
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export namespace EventDef {
|
|
61
|
-
export type Any = EventDef<string, any, any, boolean>
|
|
62
|
-
|
|
63
|
-
export type AnyWithoutFn = Pick<Any, 'name' | 'schema' | 'options'>
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export type EventDefKey = string
|
|
67
|
-
export type EventDefFact = string
|
|
68
|
-
export type EventDefFacts = ReadonlyMap<string, any>
|
|
69
|
-
|
|
70
|
-
export type EventDefFactsGroup = {
|
|
71
|
-
modifySet: EventDefFacts
|
|
72
|
-
modifyUnset: EventDefFacts
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Events on independent "dependency" branches are commutative which can facilitate more prioritized syncing
|
|
76
|
-
*/
|
|
77
|
-
depRequire: EventDefFacts
|
|
78
|
-
depRead: EventDefFacts
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export type EventDefFactsSnapshot = Map<string, any>
|
|
82
|
-
|
|
83
|
-
export type EventDefFactInput = string | readonly [string, any]
|
|
84
|
-
|
|
85
|
-
export const defineFacts = <
|
|
86
|
-
TRecord extends Record<string, EventDefFactInput | ((...args: any[]) => EventDefFactInput)>,
|
|
87
|
-
>(
|
|
88
|
-
record: TRecord,
|
|
89
|
-
): TRecord => record
|
|
90
|
-
|
|
91
|
-
export type DefineEventOptions<TTo, TDerived extends boolean = false> = {
|
|
92
|
-
// TODO actually implement this
|
|
93
|
-
// onError?: (error: any) => void
|
|
94
|
-
/** Warning: This feature is not fully implemented yet */
|
|
95
|
-
facts?: (
|
|
96
|
-
args: TTo,
|
|
97
|
-
currentFacts: EventDefFacts,
|
|
98
|
-
) => {
|
|
99
|
-
modify?: {
|
|
100
|
-
set?: Iterable<EventDefFactInput>
|
|
101
|
-
unset?: Iterable<EventDefFactInput>
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Two purposes: constrain history and constrain compaction
|
|
105
|
-
*/
|
|
106
|
-
require?: Iterable<EventDefFactInput>
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* When set to true, the event won't be synced over the network
|
|
110
|
-
*/
|
|
111
|
-
clientOnly?: boolean
|
|
112
|
-
derived?: TDerived
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export const defineEvent = <TName extends string, TType, TEncoded = TType, TDerived extends boolean = false>(
|
|
116
|
-
args: {
|
|
117
|
-
name: TName
|
|
118
|
-
schema: Schema.Schema<TType, TEncoded>
|
|
119
|
-
} & DefineEventOptions<TType, TDerived>,
|
|
120
|
-
): EventDef<TName, TType, TEncoded, TDerived> => {
|
|
121
|
-
const { name, schema, ...options } = args
|
|
122
|
-
|
|
123
|
-
const makePartialEvent = (args: TType) => {
|
|
124
|
-
const res = Schema.validateEither(schema)(args)
|
|
125
|
-
if (res._tag === 'Left') {
|
|
126
|
-
shouldNeverHappen(`Invalid event args for event '${name}':`, res.left.message, '\n')
|
|
127
|
-
}
|
|
128
|
-
return { name: name, args }
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
Object.defineProperty(makePartialEvent, 'name', { value: name })
|
|
132
|
-
Object.defineProperty(makePartialEvent, 'schema', { value: schema })
|
|
133
|
-
Object.defineProperty(makePartialEvent, 'encoded', {
|
|
134
|
-
value: (args: TEncoded) => ({ name: name, args }),
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
Object.defineProperty(makePartialEvent, 'options', {
|
|
138
|
-
value: {
|
|
139
|
-
clientOnly: options?.clientOnly ?? false,
|
|
140
|
-
facts: options?.facts
|
|
141
|
-
? (args, currentFacts) => {
|
|
142
|
-
const res = options.facts!(args, currentFacts)
|
|
143
|
-
return {
|
|
144
|
-
modify: {
|
|
145
|
-
set: res.modify?.set ? new Set(res.modify.set) : new Set(),
|
|
146
|
-
unset: res.modify?.unset ? new Set(res.modify.unset) : new Set(),
|
|
147
|
-
},
|
|
148
|
-
require: res.require ? new Set(res.require) : new Set(),
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
: undefined,
|
|
152
|
-
derived: options?.derived ?? false,
|
|
153
|
-
} satisfies EventDef.Any['options'],
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
return makePartialEvent as EventDef<TName, TType, TEncoded, TDerived>
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
export const synced = <TName extends string, TType, TEncoded = TType>(
|
|
160
|
-
args: {
|
|
161
|
-
name: TName
|
|
162
|
-
schema: Schema.Schema<TType, TEncoded>
|
|
163
|
-
} & Omit<DefineEventOptions<TType, false>, 'derived' | 'clientOnly'>,
|
|
164
|
-
): EventDef<TName, TType, TEncoded> => defineEvent({ ...args, clientOnly: false })
|
|
165
|
-
|
|
166
|
-
export const clientOnly = <TName extends string, TType, TEncoded = TType>(
|
|
167
|
-
args: {
|
|
168
|
-
name: TName
|
|
169
|
-
schema: Schema.Schema<TType, TEncoded>
|
|
170
|
-
} & Omit<DefineEventOptions<TType, false>, 'derived' | 'clientOnly'>,
|
|
171
|
-
): EventDef<TName, TType, TEncoded> => defineEvent({ ...args, clientOnly: true })
|
|
172
|
-
|
|
173
|
-
export type MaterializerResult =
|
|
174
|
-
| {
|
|
175
|
-
sql: string
|
|
176
|
-
bindValues: BindValues
|
|
177
|
-
writeTables?: ReadonlySet<string>
|
|
178
|
-
}
|
|
179
|
-
| QueryBuilder.Any
|
|
180
|
-
| string
|
|
181
|
-
|
|
182
|
-
export type MaterializerContextQuery = {
|
|
183
|
-
(args: { query: string; bindValues: ParamsObject }): ReadonlyArray<unknown>
|
|
184
|
-
<TResult>(qb: QueryBuilder<TResult, any, any>): TResult
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
export type Materializer<TEventDef extends EventDef.AnyWithoutFn = EventDef.AnyWithoutFn> = (
|
|
188
|
-
event: TEventDef['schema']['Type'],
|
|
189
|
-
context: {
|
|
190
|
-
currentFacts: EventDefFacts
|
|
191
|
-
eventDef: TEventDef
|
|
192
|
-
/** Can be used to query the current state */
|
|
193
|
-
query: MaterializerContextQuery
|
|
194
|
-
},
|
|
195
|
-
) => SingleOrReadonlyArray<MaterializerResult>
|
|
196
|
-
|
|
197
|
-
export const defineMaterializer = <TEventDef extends EventDef.AnyWithoutFn>(
|
|
198
|
-
_eventDef: TEventDef,
|
|
199
|
-
materializer: Materializer<TEventDef>,
|
|
200
|
-
): Materializer<TEventDef> => {
|
|
201
|
-
return materializer
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export const materializers = <TInputRecord extends Record<string, EventDef.AnyWithoutFn>>(
|
|
205
|
-
_eventDefRecord: TInputRecord,
|
|
206
|
-
handlers: {
|
|
207
|
-
[TEventName in TInputRecord[keyof TInputRecord]['name'] as Extract<
|
|
208
|
-
TInputRecord[keyof TInputRecord],
|
|
209
|
-
{ name: TEventName }
|
|
210
|
-
>['options']['derived'] extends true
|
|
211
|
-
? never
|
|
212
|
-
: TEventName]: Materializer<Extract<TInputRecord[keyof TInputRecord], { name: TEventName }>>
|
|
213
|
-
// [K in TInputRecord[keyof TInputRecord]['name']]: Materializer<
|
|
214
|
-
// Extract<TInputRecord[keyof TInputRecord], { name: K }>
|
|
215
|
-
// >
|
|
216
|
-
},
|
|
217
|
-
) => {
|
|
218
|
-
return handlers
|
|
219
|
-
}
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import { Brand, Schema } from '@livestore/utils/effect'
|
|
2
|
-
|
|
3
|
-
export type ClientEventSequenceNumber = Brand.Branded<number, 'ClientEventSequenceNumber'>
|
|
4
|
-
export const localEventSequenceNumber = Brand.nominal<ClientEventSequenceNumber>()
|
|
5
|
-
export const ClientEventSequenceNumber = Schema.fromBrand(localEventSequenceNumber)(Schema.Int)
|
|
6
|
-
|
|
7
|
-
export type GlobalEventSequenceNumber = Brand.Branded<number, 'GlobalEventSequenceNumber'>
|
|
8
|
-
export const globalEventSequenceNumber = Brand.nominal<GlobalEventSequenceNumber>()
|
|
9
|
-
export const GlobalEventSequenceNumber = Schema.fromBrand(globalEventSequenceNumber)(Schema.Int)
|
|
10
|
-
|
|
11
|
-
export const clientDefault = 0 as any as ClientEventSequenceNumber
|
|
12
|
-
|
|
13
|
-
export const rebaseGenerationDefault = 0
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* LiveStore event sequence number value consisting of a globally unique event sequence number
|
|
17
|
-
* and a client sequence number.
|
|
18
|
-
*
|
|
19
|
-
* The client sequence number is only used for clientOnly events and starts from 0 for each global sequence number.
|
|
20
|
-
*/
|
|
21
|
-
export type EventSequenceNumber = {
|
|
22
|
-
global: GlobalEventSequenceNumber
|
|
23
|
-
client: ClientEventSequenceNumber
|
|
24
|
-
/**
|
|
25
|
-
* Generation integer that is incremented whenever the client rebased.
|
|
26
|
-
* Starts from and resets to 0 for each global sequence number.
|
|
27
|
-
*/
|
|
28
|
-
rebaseGeneration: number
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export type EventSequenceNumberInput =
|
|
32
|
-
| EventSequenceNumber
|
|
33
|
-
| (Omit<typeof EventSequenceNumber.Encoded, 'rebaseGeneration'> & { rebaseGeneration?: number })
|
|
34
|
-
|
|
35
|
-
// TODO adjust name to `ClientEventSequenceNumber`
|
|
36
|
-
/**
|
|
37
|
-
* NOTE: Client mutation events with a non-0 client id, won't be synced to the sync backend.
|
|
38
|
-
*/
|
|
39
|
-
export const EventSequenceNumber = Schema.Struct({
|
|
40
|
-
global: GlobalEventSequenceNumber,
|
|
41
|
-
/** Only increments for clientOnly events */
|
|
42
|
-
client: ClientEventSequenceNumber,
|
|
43
|
-
|
|
44
|
-
// TODO also provide a way to see "confirmation level" of event (e.g. confirmed by leader/sync backend)
|
|
45
|
-
|
|
46
|
-
// Client only
|
|
47
|
-
rebaseGeneration: Schema.Int,
|
|
48
|
-
}).annotations({
|
|
49
|
-
title: 'LiveStore.EventSequenceNumber',
|
|
50
|
-
pretty: () => (seqNum) => toString(seqNum),
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Compare two event sequence numbers i.e. checks if the first event sequence number is less than the second.
|
|
55
|
-
* Comparison hierarchy: global > client > rebaseGeneration
|
|
56
|
-
*/
|
|
57
|
-
export const compare = (a: EventSequenceNumber, b: EventSequenceNumber) => {
|
|
58
|
-
if (a.global !== b.global) {
|
|
59
|
-
return a.global - b.global
|
|
60
|
-
}
|
|
61
|
-
if (a.client !== b.client) {
|
|
62
|
-
return a.client - b.client
|
|
63
|
-
}
|
|
64
|
-
return a.rebaseGeneration - b.rebaseGeneration
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Convert an event sequence number to a string representation.
|
|
69
|
-
*/
|
|
70
|
-
export const toString = (seqNum: EventSequenceNumber) => {
|
|
71
|
-
const rebaseGenerationStr = seqNum.rebaseGeneration > 0 ? `r${seqNum.rebaseGeneration}` : ''
|
|
72
|
-
return seqNum.client === 0
|
|
73
|
-
? `e${seqNum.global}${rebaseGenerationStr}`
|
|
74
|
-
: `e${seqNum.global}+${seqNum.client}${rebaseGenerationStr}`
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Convert a string representation of an event sequence number to an event sequence number.
|
|
79
|
-
* Parses strings in the format: e{global}[+{client}][r{rebaseGeneration}]
|
|
80
|
-
* Examples: "e0", "e0r1", "e0+1", "e0+1r1"
|
|
81
|
-
*/
|
|
82
|
-
export const fromString = (str: string): EventSequenceNumber => {
|
|
83
|
-
if (!str.startsWith('e')) {
|
|
84
|
-
throw new Error('Invalid event sequence number string: must start with "e"')
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Remove the 'e' prefix
|
|
88
|
-
const remaining = str.slice(1)
|
|
89
|
-
|
|
90
|
-
// Parse rebase generation if present
|
|
91
|
-
let rebaseGeneration = rebaseGenerationDefault
|
|
92
|
-
let withoutRebase = remaining
|
|
93
|
-
const rebaseMatch = remaining.match(/r(\d+)$/)
|
|
94
|
-
if (rebaseMatch !== null) {
|
|
95
|
-
rebaseGeneration = Number.parseInt(rebaseMatch[1]!, 10)
|
|
96
|
-
withoutRebase = remaining.slice(0, -rebaseMatch[0].length)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Parse global and client parts
|
|
100
|
-
const parts = withoutRebase.split('+')
|
|
101
|
-
|
|
102
|
-
// Validate that parts contain only digits (and possibly empty for client)
|
|
103
|
-
if (parts[0] === '' || !/^\d+$/.test(parts[0]!)) {
|
|
104
|
-
throw new Error('Invalid event sequence number string: invalid number format')
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (parts.length > 1 && parts[1] !== undefined && (parts[1] === '' || !/^\d+$/.test(parts[1]))) {
|
|
108
|
-
throw new Error('Invalid event sequence number string: invalid number format')
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const global = Number.parseInt(parts[0]!, 10)
|
|
112
|
-
const client = parts.length > 1 && parts[1] !== undefined ? Number.parseInt(parts[1], 10) : 0
|
|
113
|
-
|
|
114
|
-
if (Number.isNaN(global) || Number.isNaN(client) || Number.isNaN(rebaseGeneration)) {
|
|
115
|
-
throw new TypeError('Invalid event sequence number string: invalid number format')
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return {
|
|
119
|
-
global: global as any as GlobalEventSequenceNumber,
|
|
120
|
-
client: client as any as ClientEventSequenceNumber,
|
|
121
|
-
rebaseGeneration,
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export const fromGlobal = (seqNum: GlobalEventSequenceNumber) => ({
|
|
126
|
-
global: seqNum,
|
|
127
|
-
client: clientDefault,
|
|
128
|
-
rebaseGeneration: rebaseGenerationDefault,
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
export const isEqual = (a: EventSequenceNumber, b: EventSequenceNumber) =>
|
|
132
|
-
a.global === b.global && a.client === b.client && a.rebaseGeneration === b.rebaseGeneration
|
|
133
|
-
|
|
134
|
-
export type EventSequenceNumberPair = { seqNum: EventSequenceNumber; parentSeqNum: EventSequenceNumber }
|
|
135
|
-
|
|
136
|
-
export const ROOT = {
|
|
137
|
-
global: 0 as any as GlobalEventSequenceNumber,
|
|
138
|
-
client: clientDefault,
|
|
139
|
-
rebaseGeneration: rebaseGenerationDefault,
|
|
140
|
-
} satisfies EventSequenceNumber
|
|
141
|
-
|
|
142
|
-
export const isGreaterThan = (a: EventSequenceNumber, b: EventSequenceNumber) => {
|
|
143
|
-
return a.global > b.global || (a.global === b.global && a.client > b.client)
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
export const isGreaterThanOrEqual = (a: EventSequenceNumber, b: EventSequenceNumber) => {
|
|
147
|
-
return a.global > b.global || (a.global === b.global && a.client >= b.client)
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
export const max = (a: EventSequenceNumber, b: EventSequenceNumber) => {
|
|
151
|
-
return a.global > b.global || (a.global === b.global && a.client > b.client) ? a : b
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export const diff = (a: EventSequenceNumber, b: EventSequenceNumber) => {
|
|
155
|
-
return {
|
|
156
|
-
global: a.global - b.global,
|
|
157
|
-
client: a.client - b.client,
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
export const make = (seqNum: EventSequenceNumberInput): EventSequenceNumber => {
|
|
162
|
-
return Schema.is(EventSequenceNumber)(seqNum)
|
|
163
|
-
? seqNum
|
|
164
|
-
: Schema.decodeSync(EventSequenceNumber)({
|
|
165
|
-
...seqNum,
|
|
166
|
-
rebaseGeneration: seqNum.rebaseGeneration ?? rebaseGenerationDefault,
|
|
167
|
-
})
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export const nextPair = ({
|
|
171
|
-
seqNum,
|
|
172
|
-
isClient,
|
|
173
|
-
rebaseGeneration,
|
|
174
|
-
}: {
|
|
175
|
-
seqNum: EventSequenceNumber
|
|
176
|
-
isClient: boolean
|
|
177
|
-
rebaseGeneration?: number
|
|
178
|
-
}): EventSequenceNumberPair => {
|
|
179
|
-
if (isClient) {
|
|
180
|
-
return {
|
|
181
|
-
seqNum: {
|
|
182
|
-
global: seqNum.global,
|
|
183
|
-
client: (seqNum.client + 1) as any as ClientEventSequenceNumber,
|
|
184
|
-
rebaseGeneration: rebaseGeneration ?? seqNum.rebaseGeneration,
|
|
185
|
-
},
|
|
186
|
-
parentSeqNum: seqNum,
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
return {
|
|
191
|
-
seqNum: {
|
|
192
|
-
global: (seqNum.global + 1) as any as GlobalEventSequenceNumber,
|
|
193
|
-
client: clientDefault,
|
|
194
|
-
rebaseGeneration: rebaseGenerationDefault,
|
|
195
|
-
},
|
|
196
|
-
// NOTE we always point to `client: 0` for non-clientOnly events
|
|
197
|
-
parentSeqNum: { global: seqNum.global, client: clientDefault, rebaseGeneration: seqNum.rebaseGeneration },
|
|
198
|
-
}
|
|
199
|
-
}
|