@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
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Materializer System
|
|
3
|
+
*
|
|
4
|
+
* Materializers transform events into SQL mutations (INSERT, UPDATE, DELETE).
|
|
5
|
+
* Every non-derived event must have a corresponding materializer that defines
|
|
6
|
+
* how it affects the SQLite database state.
|
|
7
|
+
*
|
|
8
|
+
* Materializers are pure functions that receive the event arguments and return
|
|
9
|
+
* SQL operations. They can also query current state when needed for complex
|
|
10
|
+
* transformations.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { State } from '@livestore/livestore'
|
|
15
|
+
*
|
|
16
|
+
* const materializers = State.SQLite.materializers(events, {
|
|
17
|
+
* 'v1.TodoCreated': ({ id, text }) =>
|
|
18
|
+
* tables.todos.insert({ id, text, completed: false }),
|
|
19
|
+
*
|
|
20
|
+
* 'v1.TodoCompleted': ({ id }) =>
|
|
21
|
+
* tables.todos.update({ completed: true }).where({ id }),
|
|
22
|
+
*
|
|
23
|
+
* 'v1.TodoDeleted': ({ id, deletedAt }) =>
|
|
24
|
+
* tables.todos.update({ deletedAt }).where({ id }),
|
|
25
|
+
* })
|
|
26
|
+
* ```
|
|
27
|
+
* @module
|
|
28
|
+
*/
|
|
29
|
+
import type { SingleOrReadonlyArray } from '@livestore/utils';
|
|
30
|
+
import type { BindValues } from '../../sql-queries/sql-queries.ts';
|
|
31
|
+
import type { ParamsObject } from '../../util.ts';
|
|
32
|
+
import type * as LiveStoreEvent from '../LiveStoreEvent/mod.ts';
|
|
33
|
+
import type { QueryBuilder } from '../state/sqlite/query-builder/mod.ts';
|
|
34
|
+
import type { EventDef } from './event-def.ts';
|
|
35
|
+
import type { EventDefFacts } from './facts.ts';
|
|
36
|
+
/**
|
|
37
|
+
* Result type for materializer functions.
|
|
38
|
+
*
|
|
39
|
+
* Can be one of:
|
|
40
|
+
* - A QueryBuilder operation (recommended for type safety)
|
|
41
|
+
* - A raw SQL string
|
|
42
|
+
* - An object with SQL, bind values, and optional write table tracking
|
|
43
|
+
*/
|
|
44
|
+
export type MaterializerResult = {
|
|
45
|
+
sql: string;
|
|
46
|
+
bindValues: BindValues;
|
|
47
|
+
writeTables?: ReadonlySet<string>;
|
|
48
|
+
} | QueryBuilder.Any | string;
|
|
49
|
+
/**
|
|
50
|
+
* Function signature for querying current state within a materializer.
|
|
51
|
+
*
|
|
52
|
+
* Allows materializers to read existing data when computing mutations.
|
|
53
|
+
* Can be called with either raw SQL or a type-safe QueryBuilder.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* 'v1.TodoUpdated': ({ id, text }, { query }) => {
|
|
58
|
+
* const existing = query(tables.todos.select().where({ id }).first())
|
|
59
|
+
* if (!existing) return [] // No-op if todo doesn't exist
|
|
60
|
+
* return tables.todos.update({ text }).where({ id })
|
|
61
|
+
* }
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export type MaterializerContextQuery = {
|
|
65
|
+
/** Query with raw SQL and bind values. */
|
|
66
|
+
(args: {
|
|
67
|
+
query: string;
|
|
68
|
+
bindValues: ParamsObject;
|
|
69
|
+
}): ReadonlyArray<unknown>;
|
|
70
|
+
/** Query with a type-safe QueryBuilder. */
|
|
71
|
+
<TResult>(qb: QueryBuilder<TResult, any, any>): TResult;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Function type for transforming an event into database mutations.
|
|
75
|
+
*
|
|
76
|
+
* Materializers are the bridge between events and SQLite state. They receive
|
|
77
|
+
* the decoded event arguments and return SQL operations to execute.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```ts
|
|
81
|
+
* const todoCreatedMaterializer: Materializer<typeof todoCreated> =
|
|
82
|
+
* ({ id, text }) => tables.todos.insert({ id, text, completed: false })
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export type Materializer<TEventDef extends EventDef.AnyWithoutFn = EventDef.AnyWithoutFn> = (
|
|
86
|
+
/** Decoded event arguments. */
|
|
87
|
+
event: TEventDef['schema']['Type'], context: {
|
|
88
|
+
/** Current facts state (experimental). */
|
|
89
|
+
currentFacts: EventDefFacts;
|
|
90
|
+
/** The event definition being materialized. */
|
|
91
|
+
eventDef: TEventDef;
|
|
92
|
+
/** Function to query current database state. */
|
|
93
|
+
query: MaterializerContextQuery;
|
|
94
|
+
/** Full event metadata including clientId, sessionId, sequence numbers. */
|
|
95
|
+
event: LiveStoreEvent.Client.Decoded;
|
|
96
|
+
}) => SingleOrReadonlyArray<MaterializerResult>;
|
|
97
|
+
/**
|
|
98
|
+
* Type-safe wrapper for defining a single materializer.
|
|
99
|
+
*
|
|
100
|
+
* Useful when defining materializers separately from the `materializers()` builder.
|
|
101
|
+
* The first argument provides type inference for the second.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```ts
|
|
105
|
+
* const todoCreatedHandler = defineMaterializer(
|
|
106
|
+
* events.todoCreated,
|
|
107
|
+
* ({ id, text }) => tables.todos.insert({ id, text, completed: false })
|
|
108
|
+
* )
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export declare const defineMaterializer: <TEventDef extends EventDef.AnyWithoutFn>(_eventDef: TEventDef, materializer: Materializer<TEventDef>) => Materializer<TEventDef>;
|
|
112
|
+
/**
|
|
113
|
+
* Builder function for creating a type-safe materializer map.
|
|
114
|
+
*
|
|
115
|
+
* This is the primary way to define materializers in LiveStore. It ensures:
|
|
116
|
+
* - Every non-derived event has a corresponding materializer
|
|
117
|
+
* - Materializer argument types match their event schemas
|
|
118
|
+
* - Derived events are excluded from the required handlers
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```ts
|
|
122
|
+
* import { State } from '@livestore/livestore'
|
|
123
|
+
*
|
|
124
|
+
* const handlers = State.SQLite.materializers(events, {
|
|
125
|
+
* // Handler for each event - argument types are inferred
|
|
126
|
+
* 'v1.TodoCreated': ({ id, text, completed }) =>
|
|
127
|
+
* tables.todos.insert({ id, text, completed }),
|
|
128
|
+
*
|
|
129
|
+
* 'v1.TodoUpdated': ({ id, text }) =>
|
|
130
|
+
* tables.todos.update({ text }).where({ id }),
|
|
131
|
+
*
|
|
132
|
+
* // Can return multiple operations
|
|
133
|
+
* 'v1.UserCreatedWithDefaults': ({ userId, name }) => [
|
|
134
|
+
* tables.users.insert({ id: userId, name }),
|
|
135
|
+
* tables.settings.insert({ userId, theme: 'light' }),
|
|
136
|
+
* ],
|
|
137
|
+
*
|
|
138
|
+
* // Can query current state
|
|
139
|
+
* 'v1.TodoToggled': ({ id }, { query }) => {
|
|
140
|
+
* const todo = query(tables.todos.select().where({ id }).first())
|
|
141
|
+
* return tables.todos.update({ completed: !todo?.completed }).where({ id })
|
|
142
|
+
* },
|
|
143
|
+
* })
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
export declare const materializers: <TInputRecord extends Record<string, EventDef.AnyWithoutFn>>(_eventDefRecord: TInputRecord, handlers: { [TEventName in TInputRecord[keyof TInputRecord]["name"] as Extract<TInputRecord[keyof TInputRecord], {
|
|
147
|
+
name: TEventName;
|
|
148
|
+
}>["options"]["derived"] extends true ? never : TEventName]: Materializer<Extract<TInputRecord[keyof TInputRecord], {
|
|
149
|
+
name: TEventName;
|
|
150
|
+
}>>; }) => { [TEventName in TInputRecord[keyof TInputRecord]["name"] as Extract<TInputRecord[keyof TInputRecord], {
|
|
151
|
+
name: TEventName;
|
|
152
|
+
}>["options"]["derived"] extends true ? never : TEventName]: Materializer<Extract<TInputRecord[keyof TInputRecord], {
|
|
153
|
+
name: TEventName;
|
|
154
|
+
}>>; };
|
|
155
|
+
//# sourceMappingURL=materializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materializer.d.ts","sourceRoot":"","sources":["../../../src/schema/EventDef/materializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,KAAK,cAAc,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IACE,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,UAAU,CAAA;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAClC,GACD,YAAY,CAAC,GAAG,GAChB,MAAM,CAAA;AAEV;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,0CAA0C;IAC1C,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,YAAY,CAAA;KAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IAC3E,2CAA2C;IAC3C,CAAC,OAAO,EAAE,EAAE,EAAE,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,CAAA;CACxD,CAAA;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,CAAC,SAAS,SAAS,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,IAAI;AAC1F,+BAA+B;AAC/B,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAClC,OAAO,EAAE;IACP,0CAA0C;IAC1C,YAAY,EAAE,aAAa,CAAA;IAC3B,+CAA+C;IAC/C,QAAQ,EAAE,SAAS,CAAA;IACnB,gDAAgD;IAChD,KAAK,EAAE,wBAAwB,CAAA;IAC/B,2EAA2E;IAC3E,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,CAAA;CACrC,KACE,qBAAqB,CAAC,kBAAkB,CAAC,CAAA;AAE9C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,SAAS,QAAQ,CAAC,YAAY,EACxE,WAAW,SAAS,EACpB,cAAc,YAAY,CAAC,SAAS,CAAC,KACpC,YAAY,CAAC,SAAS,CAExB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,aAAa,GAAI,YAAY,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EACtF,iBAAiB,YAAY,EAC7B,UAAU,GACP,UAAU,IAAI,YAAY,CAAC,MAAM,YAAY,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,CAChE,YAAY,CAAC,MAAM,YAAY,CAAC,EAChC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CACrB,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,GAChC,KAAK,GACL,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,YAAY,CAAC,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC,GAC/F,QANE,UAAU;UAED,UAAU;;UAG4D,UAAU;MAI7F,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Materializer System
|
|
3
|
+
*
|
|
4
|
+
* Materializers transform events into SQL mutations (INSERT, UPDATE, DELETE).
|
|
5
|
+
* Every non-derived event must have a corresponding materializer that defines
|
|
6
|
+
* how it affects the SQLite database state.
|
|
7
|
+
*
|
|
8
|
+
* Materializers are pure functions that receive the event arguments and return
|
|
9
|
+
* SQL operations. They can also query current state when needed for complex
|
|
10
|
+
* transformations.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { State } from '@livestore/livestore'
|
|
15
|
+
*
|
|
16
|
+
* const materializers = State.SQLite.materializers(events, {
|
|
17
|
+
* 'v1.TodoCreated': ({ id, text }) =>
|
|
18
|
+
* tables.todos.insert({ id, text, completed: false }),
|
|
19
|
+
*
|
|
20
|
+
* 'v1.TodoCompleted': ({ id }) =>
|
|
21
|
+
* tables.todos.update({ completed: true }).where({ id }),
|
|
22
|
+
*
|
|
23
|
+
* 'v1.TodoDeleted': ({ id, deletedAt }) =>
|
|
24
|
+
* tables.todos.update({ deletedAt }).where({ id }),
|
|
25
|
+
* })
|
|
26
|
+
* ```
|
|
27
|
+
* @module
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* Type-safe wrapper for defining a single materializer.
|
|
31
|
+
*
|
|
32
|
+
* Useful when defining materializers separately from the `materializers()` builder.
|
|
33
|
+
* The first argument provides type inference for the second.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* const todoCreatedHandler = defineMaterializer(
|
|
38
|
+
* events.todoCreated,
|
|
39
|
+
* ({ id, text }) => tables.todos.insert({ id, text, completed: false })
|
|
40
|
+
* )
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export const defineMaterializer = (_eventDef, materializer) => {
|
|
44
|
+
return materializer;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Builder function for creating a type-safe materializer map.
|
|
48
|
+
*
|
|
49
|
+
* This is the primary way to define materializers in LiveStore. It ensures:
|
|
50
|
+
* - Every non-derived event has a corresponding materializer
|
|
51
|
+
* - Materializer argument types match their event schemas
|
|
52
|
+
* - Derived events are excluded from the required handlers
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* import { State } from '@livestore/livestore'
|
|
57
|
+
*
|
|
58
|
+
* const handlers = State.SQLite.materializers(events, {
|
|
59
|
+
* // Handler for each event - argument types are inferred
|
|
60
|
+
* 'v1.TodoCreated': ({ id, text, completed }) =>
|
|
61
|
+
* tables.todos.insert({ id, text, completed }),
|
|
62
|
+
*
|
|
63
|
+
* 'v1.TodoUpdated': ({ id, text }) =>
|
|
64
|
+
* tables.todos.update({ text }).where({ id }),
|
|
65
|
+
*
|
|
66
|
+
* // Can return multiple operations
|
|
67
|
+
* 'v1.UserCreatedWithDefaults': ({ userId, name }) => [
|
|
68
|
+
* tables.users.insert({ id: userId, name }),
|
|
69
|
+
* tables.settings.insert({ userId, theme: 'light' }),
|
|
70
|
+
* ],
|
|
71
|
+
*
|
|
72
|
+
* // Can query current state
|
|
73
|
+
* 'v1.TodoToggled': ({ id }, { query }) => {
|
|
74
|
+
* const todo = query(tables.todos.select().where({ id }).first())
|
|
75
|
+
* return tables.todos.update({ completed: !todo?.completed }).where({ id })
|
|
76
|
+
* },
|
|
77
|
+
* })
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export const materializers = (_eventDefRecord, handlers) => {
|
|
81
|
+
return handlers;
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=materializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materializer.js","sourceRoot":"","sources":["../../../src/schema/EventDef/materializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AA6EH;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,SAAoB,EACpB,YAAqC,EACZ,EAAE;IAC3B,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,eAA6B,EAC7B,QAOC,EACD,EAAE;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../src/schema/EventDef/mod.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../../src/schema/EventDef/mod.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { Brand, Schema as S } from '@livestore/utils/effect';
|
|
2
|
+
import { type Type as Global } from './global.ts';
|
|
3
|
+
/** Branded integer type for client-local sequence numbers. */
|
|
4
|
+
export type Type = Brand.Branded<number, 'ClientEventSequenceNumber'>;
|
|
5
|
+
/** Effect Schema for encoding/decoding client sequence numbers. */
|
|
6
|
+
export declare const Schema: S.BrandSchema<number & Brand.Brand<"ClientEventSequenceNumber">, number, never>;
|
|
7
|
+
/**
|
|
8
|
+
* Creates a branded client sequence number from a plain number.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const clientSeq = EventSequenceNumber.Client.make(1)
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare const make: Brand.Brand.Constructor<Type>;
|
|
16
|
+
/**
|
|
17
|
+
* Default client sequence number (0). Used for confirmed/synced events.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const defaultSeq = EventSequenceNumber.Client.DEFAULT // 0
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare const DEFAULT: Type;
|
|
25
|
+
/** Default rebase generation (0). Increments each time the client rebases unconfirmed events. */
|
|
26
|
+
export declare const REBASE_GENERATION_DEFAULT = 0;
|
|
27
|
+
/**
|
|
28
|
+
* Composite event sequence number consisting of global + client + rebaseGeneration.
|
|
29
|
+
* Used for client-side event tracking with support for unconfirmed local events.
|
|
30
|
+
*
|
|
31
|
+
* For event notation documentation, see: contributor-docs/events-notation.md
|
|
32
|
+
*/
|
|
33
|
+
export type Composite = {
|
|
34
|
+
global: Global;
|
|
35
|
+
client: Type;
|
|
36
|
+
/**
|
|
37
|
+
* Generation integer that is incremented whenever the client rebased.
|
|
38
|
+
* Remains constant for all subsequent events until another rebase occurs.
|
|
39
|
+
*/
|
|
40
|
+
rebaseGeneration: number;
|
|
41
|
+
};
|
|
42
|
+
/** Input type for creating a Composite sequence number. Allows omitting rebaseGeneration (defaults to 0). */
|
|
43
|
+
export type CompositeInput = Composite | (Omit<typeof CompositeSchema.Encoded, 'rebaseGeneration'> & {
|
|
44
|
+
rebaseGeneration?: number;
|
|
45
|
+
});
|
|
46
|
+
/** A pair of sequence numbers representing an event and its parent. */
|
|
47
|
+
export type CompositePair = {
|
|
48
|
+
seqNum: Composite;
|
|
49
|
+
parentSeqNum: Composite;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Compare two composite sequence numbers.
|
|
53
|
+
* Comparison hierarchy: global > client > rebaseGeneration
|
|
54
|
+
*/
|
|
55
|
+
export declare const compare: (a: Composite, b: Composite) => number;
|
|
56
|
+
/**
|
|
57
|
+
* Convert a composite sequence number to a string representation.
|
|
58
|
+
*
|
|
59
|
+
* For notation documentation, see: contributor-docs/events-notation.md
|
|
60
|
+
*/
|
|
61
|
+
export declare const toString: (seqNum: Composite) => string;
|
|
62
|
+
/**
|
|
63
|
+
* Convert a string representation of a sequence number to a Composite.
|
|
64
|
+
* Parses strings in the format: e{global}[.{client}][r{rebaseGeneration}]
|
|
65
|
+
* Examples: "e0", "e0r1", "e0.1", "e0.1r1"
|
|
66
|
+
*
|
|
67
|
+
* For full notation documentation, see: contributor-docs/events-notation.md
|
|
68
|
+
*/
|
|
69
|
+
export declare const fromString: (str: string) => Composite;
|
|
70
|
+
/** Creates a Composite sequence number from a global sequence number (client=0, rebaseGeneration=0). */
|
|
71
|
+
export declare const fromGlobal: (seqNum: Global) => Composite;
|
|
72
|
+
/** Returns true if two Composite sequence numbers are structurally equal. */
|
|
73
|
+
export declare const isEqual: (a: Composite, b: Composite) => boolean;
|
|
74
|
+
/** Returns true if `a` is strictly greater than `b` (compares global, then client). */
|
|
75
|
+
export declare const isGreaterThan: (a: Composite, b: Composite) => boolean;
|
|
76
|
+
/** Returns true if `a` is greater than or equal to `b` (compares global, then client). */
|
|
77
|
+
export declare const isGreaterThanOrEqual: (a: Composite, b: Composite) => boolean;
|
|
78
|
+
/** Returns the larger of two Composite sequence numbers. */
|
|
79
|
+
export declare const max: (a: Composite, b: Composite) => Composite;
|
|
80
|
+
/** Returns the difference between two Composite sequence numbers (a - b) for global and client components. */
|
|
81
|
+
export declare const diff: (a: Composite, b: Composite) => {
|
|
82
|
+
global: number;
|
|
83
|
+
client: number;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Schema for the composite event sequence number.
|
|
87
|
+
* NOTE: Client mutation events with a non-0 client id won't be synced to the sync backend.
|
|
88
|
+
*/
|
|
89
|
+
declare const CompositeSchema: S.Struct<{
|
|
90
|
+
global: S.BrandSchema<number & Brand.Brand<"GlobalEventSequenceNumber">, number, never>;
|
|
91
|
+
/** Only increments for client-local events */
|
|
92
|
+
client: S.BrandSchema<number & Brand.Brand<"ClientEventSequenceNumber">, number, never>;
|
|
93
|
+
rebaseGeneration: typeof S.Int;
|
|
94
|
+
}>;
|
|
95
|
+
/**
|
|
96
|
+
* Effect Schema for the composite event sequence number (global + client + rebaseGeneration).
|
|
97
|
+
* Also includes a `make` helper for creating validated Composite values.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```ts
|
|
101
|
+
* const seqNum: EventSequenceNumber.Client.Composite = {
|
|
102
|
+
* global: EventSequenceNumber.Global.make(5),
|
|
103
|
+
* client: EventSequenceNumber.Client.DEFAULT,
|
|
104
|
+
* rebaseGeneration: 0
|
|
105
|
+
* }
|
|
106
|
+
*
|
|
107
|
+
* const validated = EventSequenceNumber.Client.Composite.make({ global: 5, client: 0, rebaseGeneration: 0 })
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export declare const Composite: S.Struct<{
|
|
111
|
+
global: S.BrandSchema<number & Brand.Brand<"GlobalEventSequenceNumber">, number, never>;
|
|
112
|
+
/** Only increments for client-local events */
|
|
113
|
+
client: S.BrandSchema<number & Brand.Brand<"ClientEventSequenceNumber">, number, never>;
|
|
114
|
+
rebaseGeneration: typeof S.Int;
|
|
115
|
+
}> & {
|
|
116
|
+
make: (seqNum: CompositeInput) => Composite;
|
|
117
|
+
};
|
|
118
|
+
/** The root sequence number (global=0, client=0, rebaseGeneration=0). Parent of the first event. */
|
|
119
|
+
export declare const ROOT: {
|
|
120
|
+
global: Global;
|
|
121
|
+
client: Type;
|
|
122
|
+
rebaseGeneration: number;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Computes the next sequence number and its parent based on the current position.
|
|
126
|
+
*
|
|
127
|
+
* For client-local events (isClient=true): increments the client component, keeps global.
|
|
128
|
+
* For global events (isClient=false): increments global, resets client to 0.
|
|
129
|
+
*/
|
|
130
|
+
export declare const nextPair: ({ seqNum, isClient, rebaseGeneration, }: {
|
|
131
|
+
seqNum: Composite;
|
|
132
|
+
isClient: boolean;
|
|
133
|
+
rebaseGeneration?: number;
|
|
134
|
+
}) => CompositePair;
|
|
135
|
+
export {};
|
|
136
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/schema/EventSequenceNumber/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,yBAAyB,CAAA;AAE5D,OAAO,EAAE,KAAK,IAAI,IAAI,MAAM,EAA8C,MAAM,aAAa,CAAA;AAE7F,8DAA8D;AAC9D,MAAM,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAA;AAIrE,mEAAmE;AACnE,eAAO,MAAM,MAAM,iFAAkC,CAAA;AAErD;;;;;;;GAOG;AACH,eAAO,MAAM,IAAI,+BAAc,CAAA;AAE/B;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,EAAe,IAAI,CAAA;AAEvC,iGAAiG;AACjG,eAAO,MAAM,yBAAyB,IAAI,CAAA;AAE1C;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,IAAI,CAAA;IACZ;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,6GAA6G;AAC7G,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,CAAC,IAAI,CAAC,OAAO,eAAe,CAAC,OAAO,EAAE,kBAAkB,CAAC,GAAG;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAE9F,uEAAuE;AACvE,MAAM,MAAM,aAAa,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,SAAS,CAAA;CAAE,CAAA;AAE1E;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,GAAG,SAAS,EAAE,GAAG,SAAS,WAQjD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,QAAQ,SAAS,WAKzC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,SAyCxC,CAAA;AAED,wGAAwG;AACxG,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,KAAG,SAI1C,CAAA;AAEF,6EAA6E;AAC7E,eAAO,MAAM,OAAO,GAAI,GAAG,SAAS,EAAE,GAAG,SAAS,YAC2C,CAAA;AAE7F,uFAAuF;AACvF,eAAO,MAAM,aAAa,GAAI,GAAG,SAAS,EAAE,GAAG,SAAS,YAEvD,CAAA;AAED,0FAA0F;AAC1F,eAAO,MAAM,oBAAoB,GAAI,GAAG,SAAS,EAAE,GAAG,SAAS,YAE9D,CAAA;AAED,4DAA4D;AAC5D,eAAO,MAAM,GAAG,GAAI,GAAG,SAAS,EAAE,GAAG,SAAS,cAE7C,CAAA;AAED,8GAA8G;AAC9G,eAAO,MAAM,IAAI,GAAI,GAAG,SAAS,EAAE,GAAG,SAAS;;;CAK9C,CAAA;AAED;;;GAGG;AACH,QAAA,MAAM,eAAe;;IAEnB,8CAA8C;;;EAO9C,CAAA;AAeF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS;;IArCpB,8CAA8C;;;;mBAajB,cAAc,KAAG,SAAS;CAwBuB,CAAA;AAEhF,oGAAoG;AACpG,eAAO,MAAM,IAAI;;;;CAII,CAAA;AAErB;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,yCAItB;IACD,MAAM,EAAE,SAAS,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,KAAG,aAqBH,CAAA"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { Brand, Schema as S } from '@livestore/utils/effect';
|
|
2
|
+
import { Schema as GlobalSchema, make as makeGlobal } from "./global.js";
|
|
3
|
+
const ClientBrand = Brand.nominal();
|
|
4
|
+
/** Effect Schema for encoding/decoding client sequence numbers. */
|
|
5
|
+
export const Schema = S.fromBrand(ClientBrand)(S.Int);
|
|
6
|
+
/**
|
|
7
|
+
* Creates a branded client sequence number from a plain number.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const clientSeq = EventSequenceNumber.Client.make(1)
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export const make = ClientBrand;
|
|
15
|
+
/**
|
|
16
|
+
* Default client sequence number (0). Used for confirmed/synced events.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const defaultSeq = EventSequenceNumber.Client.DEFAULT // 0
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export const DEFAULT = 0;
|
|
24
|
+
/** Default rebase generation (0). Increments each time the client rebases unconfirmed events. */
|
|
25
|
+
export const REBASE_GENERATION_DEFAULT = 0;
|
|
26
|
+
/**
|
|
27
|
+
* Compare two composite sequence numbers.
|
|
28
|
+
* Comparison hierarchy: global > client > rebaseGeneration
|
|
29
|
+
*/
|
|
30
|
+
export const compare = (a, b) => {
|
|
31
|
+
if (a.global !== b.global) {
|
|
32
|
+
return a.global - b.global;
|
|
33
|
+
}
|
|
34
|
+
if (a.client !== b.client) {
|
|
35
|
+
return a.client - b.client;
|
|
36
|
+
}
|
|
37
|
+
return a.rebaseGeneration - b.rebaseGeneration;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Convert a composite sequence number to a string representation.
|
|
41
|
+
*
|
|
42
|
+
* For notation documentation, see: contributor-docs/events-notation.md
|
|
43
|
+
*/
|
|
44
|
+
export const toString = (seqNum) => {
|
|
45
|
+
const rebaseGenerationStr = seqNum.rebaseGeneration > 0 ? `r${seqNum.rebaseGeneration}` : '';
|
|
46
|
+
return seqNum.client === 0
|
|
47
|
+
? `e${seqNum.global}${rebaseGenerationStr}`
|
|
48
|
+
: `e${seqNum.global}.${seqNum.client}${rebaseGenerationStr}`;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Convert a string representation of a sequence number to a Composite.
|
|
52
|
+
* Parses strings in the format: e{global}[.{client}][r{rebaseGeneration}]
|
|
53
|
+
* Examples: "e0", "e0r1", "e0.1", "e0.1r1"
|
|
54
|
+
*
|
|
55
|
+
* For full notation documentation, see: contributor-docs/events-notation.md
|
|
56
|
+
*/
|
|
57
|
+
export const fromString = (str) => {
|
|
58
|
+
if (!str.startsWith('e')) {
|
|
59
|
+
throw new Error('Invalid event sequence number string: must start with "e"');
|
|
60
|
+
}
|
|
61
|
+
// Remove the 'e' prefix
|
|
62
|
+
const remaining = str.slice(1);
|
|
63
|
+
// Parse rebase generation if present
|
|
64
|
+
let rebaseGeneration = REBASE_GENERATION_DEFAULT;
|
|
65
|
+
let withoutRebase = remaining;
|
|
66
|
+
const rebaseMatch = remaining.match(/r(\d+)$/);
|
|
67
|
+
if (rebaseMatch !== null) {
|
|
68
|
+
rebaseGeneration = Number.parseInt(rebaseMatch[1], 10);
|
|
69
|
+
withoutRebase = remaining.slice(0, -rebaseMatch[0].length);
|
|
70
|
+
}
|
|
71
|
+
// Parse global and client parts
|
|
72
|
+
const parts = withoutRebase.split('.');
|
|
73
|
+
// Validate that parts contain only digits (and possibly empty for client)
|
|
74
|
+
if (parts[0] === '' || !/^\d+$/.test(parts[0])) {
|
|
75
|
+
throw new Error('Invalid event sequence number string: invalid number format');
|
|
76
|
+
}
|
|
77
|
+
if (parts.length > 1 && parts[1] !== undefined && (parts[1] === '' || !/^\d+$/.test(parts[1]))) {
|
|
78
|
+
throw new Error('Invalid event sequence number string: invalid number format');
|
|
79
|
+
}
|
|
80
|
+
const global = Number.parseInt(parts[0], 10);
|
|
81
|
+
const client = parts.length > 1 && parts[1] !== undefined ? Number.parseInt(parts[1], 10) : 0;
|
|
82
|
+
if (Number.isNaN(global) || Number.isNaN(client) || Number.isNaN(rebaseGeneration)) {
|
|
83
|
+
throw new TypeError('Invalid event sequence number string: invalid number format');
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
global: global,
|
|
87
|
+
client: client,
|
|
88
|
+
rebaseGeneration,
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
/** Creates a Composite sequence number from a global sequence number (client=0, rebaseGeneration=0). */
|
|
92
|
+
export const fromGlobal = (seqNum) => ({
|
|
93
|
+
global: seqNum,
|
|
94
|
+
client: DEFAULT,
|
|
95
|
+
rebaseGeneration: REBASE_GENERATION_DEFAULT,
|
|
96
|
+
});
|
|
97
|
+
/** Returns true if two Composite sequence numbers are structurally equal. */
|
|
98
|
+
export const isEqual = (a, b) => a.global === b.global && a.client === b.client && a.rebaseGeneration === b.rebaseGeneration;
|
|
99
|
+
/** Returns true if `a` is strictly greater than `b` (compares global, then client). */
|
|
100
|
+
export const isGreaterThan = (a, b) => {
|
|
101
|
+
return a.global > b.global || (a.global === b.global && a.client > b.client);
|
|
102
|
+
};
|
|
103
|
+
/** Returns true if `a` is greater than or equal to `b` (compares global, then client). */
|
|
104
|
+
export const isGreaterThanOrEqual = (a, b) => {
|
|
105
|
+
return a.global > b.global || (a.global === b.global && a.client >= b.client);
|
|
106
|
+
};
|
|
107
|
+
/** Returns the larger of two Composite sequence numbers. */
|
|
108
|
+
export const max = (a, b) => {
|
|
109
|
+
return a.global > b.global || (a.global === b.global && a.client > b.client) ? a : b;
|
|
110
|
+
};
|
|
111
|
+
/** Returns the difference between two Composite sequence numbers (a - b) for global and client components. */
|
|
112
|
+
export const diff = (a, b) => {
|
|
113
|
+
return {
|
|
114
|
+
global: a.global - b.global,
|
|
115
|
+
client: a.client - b.client,
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Schema for the composite event sequence number.
|
|
120
|
+
* NOTE: Client mutation events with a non-0 client id won't be synced to the sync backend.
|
|
121
|
+
*/
|
|
122
|
+
const CompositeSchema = S.Struct({
|
|
123
|
+
global: GlobalSchema,
|
|
124
|
+
/** Only increments for client-local events */
|
|
125
|
+
client: Schema,
|
|
126
|
+
// Client only
|
|
127
|
+
rebaseGeneration: S.Int,
|
|
128
|
+
}).annotations({
|
|
129
|
+
title: 'EventSequenceNumber.Composite',
|
|
130
|
+
pretty: () => (seqNum) => toString(seqNum),
|
|
131
|
+
});
|
|
132
|
+
/**
|
|
133
|
+
* Creates a validated Composite sequence number from input.
|
|
134
|
+
* If rebaseGeneration is omitted, defaults to REBASE_GENERATION_DEFAULT (0).
|
|
135
|
+
*/
|
|
136
|
+
const makeComposite = (seqNum) => {
|
|
137
|
+
return S.is(CompositeSchema)(seqNum)
|
|
138
|
+
? seqNum
|
|
139
|
+
: S.decodeSync(CompositeSchema)({
|
|
140
|
+
...seqNum,
|
|
141
|
+
rebaseGeneration: seqNum.rebaseGeneration ?? REBASE_GENERATION_DEFAULT,
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* Effect Schema for the composite event sequence number (global + client + rebaseGeneration).
|
|
146
|
+
* Also includes a `make` helper for creating validated Composite values.
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```ts
|
|
150
|
+
* const seqNum: EventSequenceNumber.Client.Composite = {
|
|
151
|
+
* global: EventSequenceNumber.Global.make(5),
|
|
152
|
+
* client: EventSequenceNumber.Client.DEFAULT,
|
|
153
|
+
* rebaseGeneration: 0
|
|
154
|
+
* }
|
|
155
|
+
*
|
|
156
|
+
* const validated = EventSequenceNumber.Client.Composite.make({ global: 5, client: 0, rebaseGeneration: 0 })
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
export const Composite = Object.assign(CompositeSchema, { make: makeComposite });
|
|
160
|
+
/** The root sequence number (global=0, client=0, rebaseGeneration=0). Parent of the first event. */
|
|
161
|
+
export const ROOT = {
|
|
162
|
+
global: makeGlobal(0),
|
|
163
|
+
client: DEFAULT,
|
|
164
|
+
rebaseGeneration: REBASE_GENERATION_DEFAULT,
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Computes the next sequence number and its parent based on the current position.
|
|
168
|
+
*
|
|
169
|
+
* For client-local events (isClient=true): increments the client component, keeps global.
|
|
170
|
+
* For global events (isClient=false): increments global, resets client to 0.
|
|
171
|
+
*/
|
|
172
|
+
export const nextPair = ({ seqNum, isClient, rebaseGeneration, }) => {
|
|
173
|
+
if (isClient) {
|
|
174
|
+
return {
|
|
175
|
+
seqNum: {
|
|
176
|
+
global: seqNum.global,
|
|
177
|
+
client: (seqNum.client + 1),
|
|
178
|
+
rebaseGeneration: rebaseGeneration ?? seqNum.rebaseGeneration,
|
|
179
|
+
},
|
|
180
|
+
parentSeqNum: seqNum,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
seqNum: {
|
|
185
|
+
global: (seqNum.global + 1),
|
|
186
|
+
client: DEFAULT,
|
|
187
|
+
rebaseGeneration: rebaseGeneration ?? seqNum.rebaseGeneration,
|
|
188
|
+
},
|
|
189
|
+
// NOTE we always point to `client: 0` for non-client-local events
|
|
190
|
+
parentSeqNum: { global: seqNum.global, client: DEFAULT, rebaseGeneration: seqNum.rebaseGeneration },
|
|
191
|
+
};
|
|
192
|
+
};
|
|
193
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/schema/EventSequenceNumber/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Brand, Schema as S } from '@livestore/utils/effect';
|
|
2
|
+
/** Branded integer type for global sequence numbers assigned by the sync backend. */
|
|
3
|
+
export type Type = Brand.Branded<number, 'GlobalEventSequenceNumber'>;
|
|
4
|
+
/** Effect Schema for encoding/decoding global sequence numbers. */
|
|
5
|
+
export declare const Schema: S.BrandSchema<number & Brand.Brand<"GlobalEventSequenceNumber">, number, never>;
|
|
6
|
+
/**
|
|
7
|
+
* Creates a branded global sequence number from a plain number.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const seqNum = EventSequenceNumber.Global.make(5)
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare const make: Brand.Brand.Constructor<Type>;
|
|
15
|
+
//# sourceMappingURL=global.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../../../src/schema/EventSequenceNumber/global.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,yBAAyB,CAAA;AAE5D,qFAAqF;AACrF,MAAM,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAA;AAIrE,mEAAmE;AACnE,eAAO,MAAM,MAAM,iFAAkC,CAAA;AAErD;;;;;;;GAOG;AACH,eAAO,MAAM,IAAI,+BAAc,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Brand, Schema as S } from '@livestore/utils/effect';
|
|
2
|
+
const GlobalBrand = Brand.nominal();
|
|
3
|
+
/** Effect Schema for encoding/decoding global sequence numbers. */
|
|
4
|
+
export const Schema = S.fromBrand(GlobalBrand)(S.Int);
|
|
5
|
+
/**
|
|
6
|
+
* Creates a branded global sequence number from a plain number.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* const seqNum = EventSequenceNumber.Global.make(5)
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export const make = GlobalBrand;
|
|
14
|
+
//# sourceMappingURL=global.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global.js","sourceRoot":"","sources":["../../../src/schema/EventSequenceNumber/global.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,yBAAyB,CAAA;AAK5D,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,EAAQ,CAAA;AAEzC,mEAAmE;AACnE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAErD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,WAAW,CAAA"}
|