@livestore/common 0.4.0-dev.9 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/ClientSessionLeaderThreadProxy.d.ts +27 -12
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
- package/dist/WorkerTransportError.d.ts +11 -0
- package/dist/WorkerTransportError.d.ts.map +1 -0
- package/dist/WorkerTransportError.js +11 -0
- package/dist/WorkerTransportError.js.map +1 -0
- package/dist/adapter-types.d.ts +37 -7
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +27 -1
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/bounded-collections.js +6 -4
- package/dist/bounded-collections.js.map +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +33 -6
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
- package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
- package/dist/devtools/devtools-compatibility.test.js +15 -0
- package/dist/devtools/devtools-compatibility.test.js.map +1 -0
- package/dist/devtools/devtools-messages-client-session.d.ts +55 -24
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +22 -5
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +11 -14
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +7 -9
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +65 -30
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +29 -11
- 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 +48 -18
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +20 -12
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +53 -6
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +325 -257
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/RejectedPushError.d.ts +107 -0
- package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
- package/dist/leader-thread/RejectedPushError.js +78 -0
- package/dist/leader-thread/RejectedPushError.js.map +1 -0
- package/dist/leader-thread/connection.js +1 -1
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +19 -14
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +78 -18
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +90 -58
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +15 -7
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +49 -17
- 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 +1 -1
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +28 -9
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/mod.d.ts +1 -0
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -0
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +2 -2
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +6 -6
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -2
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -2
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/stream-events.d.ts +56 -0
- package/dist/leader-thread/stream-events.d.ts.map +1 -0
- package/dist/leader-thread/stream-events.js +167 -0
- package/dist/leader-thread/stream-events.js.map +1 -0
- package/dist/leader-thread/types.d.ts +95 -17
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +13 -0
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.d.ts +40 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +33 -0
- package/dist/logging.js.map +1 -0
- package/dist/make-client-session.d.ts +5 -3
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +7 -4
- 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 +18 -8
- package/dist/materializer-helper.js.map +1 -1
- package/dist/otel.d.ts +2 -1
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +7 -2
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +3 -3
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +40 -29
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +161 -0
- package/dist/schema/EventDef/define.d.ts.map +1 -0
- package/dist/schema/EventDef/define.js +140 -0
- package/dist/schema/EventDef/define.js.map +1 -0
- package/dist/schema/EventDef/deprecated.d.ts +99 -0
- package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
- package/dist/schema/EventDef/deprecated.js +144 -0
- package/dist/schema/EventDef/deprecated.js.map +1 -0
- package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
- package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
- package/dist/schema/EventDef/deprecated.test.js +95 -0
- package/dist/schema/EventDef/deprecated.test.js.map +1 -0
- package/dist/schema/EventDef/event-def.d.ts +110 -0
- package/dist/schema/EventDef/event-def.d.ts.map +1 -0
- package/dist/schema/EventDef/event-def.js +2 -0
- package/dist/schema/EventDef/event-def.js.map +1 -0
- package/dist/schema/EventDef/facts.d.ts +118 -0
- package/dist/schema/EventDef/facts.d.ts.map +1 -0
- package/dist/schema/EventDef/facts.js +53 -0
- package/dist/schema/EventDef/facts.js.map +1 -0
- package/dist/schema/EventDef/materializer.d.ts +155 -0
- package/dist/schema/EventDef/materializer.d.ts.map +1 -0
- package/dist/schema/EventDef/materializer.js +83 -0
- package/dist/schema/EventDef/materializer.js.map +1 -0
- package/dist/schema/EventDef/mod.d.ts +6 -0
- package/dist/schema/EventDef/mod.d.ts.map +1 -0
- package/dist/schema/EventDef/mod.js +6 -0
- package/dist/schema/EventDef/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/client.js +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 +44 -44
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +102 -111
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/client.js +176 -0
- package/dist/schema/LiveStoreEvent/client.js.map +1 -0
- package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
- package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/client.test.js +111 -0
- package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
- package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
- package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/global.js +31 -0
- package/dist/schema/LiveStoreEvent/global.js.map +1 -0
- package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
- package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/input.js +26 -0
- package/dist/schema/LiveStoreEvent/input.js.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.js +5 -0
- package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
- package/dist/schema/events.d.ts +1 -1
- package/dist/schema/events.d.ts.map +1 -1
- package/dist/schema/events.js +1 -1
- package/dist/schema/events.js.map +1 -1
- package/dist/schema/mod.d.ts +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 +32 -4
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +2 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +36 -15
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +121 -2
- 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 +1 -1
- package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js +2 -2
- package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +96 -47
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +51 -12
- 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 +24 -15
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +2 -2
- 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 +16 -10
- 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 +15 -4
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +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 +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +2 -2
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +5 -7
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/api.d.ts +51 -22
- 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 +99 -22
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +28 -15
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +231 -93
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +24 -14
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
- package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +21 -450
- 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 +5 -3
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +1 -1
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +92 -3
- 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/common.js +2 -2
- package/dist/schema-management/common.js.map +1 -1
- package/dist/schema-management/migrations.d.ts +32 -2
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +38 -6
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts +3 -3
- package/dist/schema-management/validate-schema.d.ts.map +1 -1
- package/dist/schema-management/validate-schema.js +2 -2
- package/dist/schema-management/validate-schema.js.map +1 -1
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +18 -6
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
- package/dist/sql-queries/sql-query-builder.js.map +1 -1
- package/dist/sqlite-db-helper.js +3 -3
- package/dist/sqlite-db-helper.js.map +1 -1
- package/dist/sqlite-types.d.ts +5 -5
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sqlite-types.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +12 -12
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +99 -114
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +0 -33
- package/dist/sync/errors.d.ts.map +1 -1
- package/dist/sync/errors.js +5 -22
- package/dist/sync/errors.js.map +1 -1
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +2 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +10 -8
- package/dist/sync/mock-sync-backend.d.ts.map +1 -1
- package/dist/sync/mock-sync-backend.js +71 -69
- package/dist/sync/mock-sync-backend.js.map +1 -1
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +11 -12
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +5 -5
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +7 -8
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +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 +11 -11
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +5 -5
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +6 -6
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +2 -2
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts +2 -2
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +11 -11
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync-backend-kv.d.ts +3 -3
- package/dist/sync/sync-backend-kv.d.ts.map +1 -1
- package/dist/sync/sync-backend-kv.js +3 -3
- package/dist/sync/sync-backend-kv.js.map +1 -1
- package/dist/sync/sync-backend.d.ts +33 -13
- package/dist/sync/sync-backend.d.ts.map +1 -1
- package/dist/sync/sync-backend.js +38 -1
- package/dist/sync/sync-backend.js.map +1 -1
- package/dist/sync/sync.d.ts +23 -2
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/syncstate.d.ts +55 -55
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +80 -98
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +221 -132
- 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 +4 -6
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/testing/event-factory.d.ts +3 -3
- package/dist/testing/event-factory.d.ts.map +1 -1
- package/dist/testing/event-factory.js +5 -7
- package/dist/testing/event-factory.js.map +1 -1
- package/dist/util.js +2 -2
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +24 -5
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +25 -8
- package/dist/version.js.map +1 -1
- package/package.json +67 -15
- package/src/ClientSessionLeaderThreadProxy.ts +27 -12
- package/src/WorkerTransportError.ts +12 -0
- package/src/adapter-types.ts +50 -7
- package/src/bounded-collections.ts +6 -5
- package/src/debug-info.ts +37 -6
- package/src/devtools/devtools-compatibility.test.ts +18 -0
- package/src/devtools/devtools-messages-client-session.ts +22 -4
- package/src/devtools/devtools-messages-common.ts +7 -12
- package/src/devtools/devtools-messages-leader.ts +29 -10
- package/src/devtools/devtools-sessioninfo.ts +8 -5
- package/src/devtools/mod.ts +11 -2
- package/src/errors.ts +32 -24
- package/src/index.ts +4 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +523 -373
- package/src/leader-thread/RejectedPushError.ts +106 -0
- package/src/leader-thread/connection.ts +1 -1
- package/src/leader-thread/eventlog.ts +112 -39
- package/src/leader-thread/leader-worker-devtools.ts +201 -120
- package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
- package/src/leader-thread/make-leader-thread-layer.ts +125 -40
- package/src/leader-thread/materialize-event.ts +40 -10
- package/src/leader-thread/mod.ts +1 -0
- package/src/leader-thread/recreate-db.ts +7 -7
- package/src/leader-thread/shutdown-channel.ts +4 -8
- package/src/leader-thread/stream-events.ts +206 -0
- package/src/leader-thread/types.ts +68 -18
- package/src/logging.ts +62 -0
- package/src/make-client-session.ts +11 -5
- package/src/materializer-helper.ts +27 -16
- package/src/otel.ts +13 -2
- package/src/rematerialize-from-eventlog.ts +61 -51
- package/src/schema/EventDef/define.ts +217 -0
- package/src/schema/EventDef/deprecated.test.ts +129 -0
- package/src/schema/EventDef/deprecated.ts +175 -0
- package/src/schema/EventDef/event-def.ts +125 -0
- package/src/schema/EventDef/facts.ts +135 -0
- package/src/schema/EventDef/materializer.ts +172 -0
- package/src/schema/EventDef/mod.ts +5 -0
- package/src/schema/EventSequenceNumber/client.ts +257 -0
- package/src/schema/EventSequenceNumber/global.ts +19 -0
- package/src/schema/EventSequenceNumber/mod.ts +37 -0
- package/src/schema/EventSequenceNumber.test.ts +72 -53
- package/src/schema/LiveStoreEvent/client.test.ts +129 -0
- package/src/schema/LiveStoreEvent/client.ts +235 -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 +46 -5
- package/src/schema/state/sqlite/client-document-def.test.ts +144 -5
- package/src/schema/state/sqlite/client-document-def.ts +47 -34
- package/src/schema/state/sqlite/column-annotations.test.ts +3 -2
- package/src/schema/state/sqlite/column-annotations.ts +2 -1
- package/src/schema/state/sqlite/column-def.test.ts +66 -12
- package/src/schema/state/sqlite/column-def.ts +119 -47
- package/src/schema/state/sqlite/column-spec.test.ts +32 -17
- package/src/schema/state/sqlite/column-spec.ts +37 -11
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -2
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +2 -1
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +41 -15
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +13 -19
- package/src/schema/state/sqlite/mod.ts +7 -8
- package/src/schema/state/sqlite/query-builder/api.ts +55 -17
- package/src/schema/state/sqlite/query-builder/astToSql.ts +110 -21
- package/src/schema/state/sqlite/query-builder/impl.test.ts +267 -93
- package/src/schema/state/sqlite/query-builder/impl.ts +26 -13
- package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
- package/src/schema/state/sqlite/schema-helpers.ts +30 -22
- package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
- package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
- package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
- package/src/schema/state/sqlite/table-def.test.ts +114 -3
- package/src/schema/state/sqlite/table-def.ts +16 -22
- package/src/schema/unknown-events.ts +131 -0
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
- package/src/schema-management/common.ts +2 -2
- package/src/schema-management/migrations.ts +42 -9
- package/src/schema-management/validate-schema.ts +3 -3
- package/src/sql-queries/sql-queries.ts +18 -6
- package/src/sql-queries/sql-query-builder.ts +1 -0
- package/src/sqlite-db-helper.ts +3 -3
- package/src/sqlite-types.ts +6 -5
- package/src/sync/ClientSessionSyncProcessor.ts +152 -142
- package/src/sync/errors.ts +12 -24
- package/src/sync/index.ts +2 -0
- package/src/sync/mock-sync-backend.ts +146 -104
- package/src/sync/next/compact-events.ts +10 -11
- package/src/sync/next/facts.ts +13 -14
- package/src/sync/next/history-dag-common.ts +280 -26
- package/src/sync/next/history-dag.ts +17 -13
- package/src/sync/next/rebase-events.ts +12 -12
- package/src/sync/next/test/compact-events.calculator.test.ts +3 -2
- package/src/sync/next/test/compact-events.test.ts +4 -3
- package/src/sync/next/test/event-fixtures.ts +13 -13
- package/src/sync/sync-backend-kv.ts +4 -3
- package/src/sync/sync-backend.ts +66 -17
- package/src/sync/sync.ts +24 -2
- package/src/sync/syncstate.test.ts +583 -419
- package/src/sync/syncstate.ts +127 -122
- package/src/sync/transport-chunking.ts +90 -0
- package/src/sync/validate-push-payload.ts +6 -8
- package/src/testing/event-factory.ts +10 -12
- package/src/util.ts +2 -2
- package/src/version.ts +33 -8
- package/dist/schema/EventDef.d.ts +0 -126
- package/dist/schema/EventDef.d.ts.map +0 -1
- package/dist/schema/EventDef.js +0 -46
- package/dist/schema/EventDef.js.map +0 -1
- package/dist/schema/EventSequenceNumber.d.ts +0 -80
- package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
- package/dist/schema/EventSequenceNumber.js +0 -139
- package/dist/schema/EventSequenceNumber.js.map +0 -1
- package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
- package/dist/schema/LiveStoreEvent.js +0 -147
- package/dist/schema/LiveStoreEvent.js.map +0 -1
- package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
- package/dist/schema/state/sqlite/system-tables.js +0 -81
- package/dist/schema/state/sqlite/system-tables.js.map +0 -1
- package/dist/sync/next/graphology.d.ts +0 -8
- package/dist/sync/next/graphology.d.ts.map +0 -1
- package/dist/sync/next/graphology.js +0 -30
- package/dist/sync/next/graphology.js.map +0 -1
- package/dist/sync/next/graphology_.d.ts +0 -3
- package/dist/sync/next/graphology_.d.ts.map +0 -1
- package/dist/sync/next/graphology_.js +0 -3
- package/dist/sync/next/graphology_.js.map +0 -1
- package/src/schema/EventDef.ts +0 -222
- package/src/schema/EventSequenceNumber.ts +0 -199
- package/src/schema/LiveStoreEvent.ts +0 -286
- package/src/schema/state/sqlite/system-tables.ts +0 -106
- package/src/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,19 @@
|
|
|
1
|
+
import { Brand, Schema as S } from '@livestore/utils/effect'
|
|
2
|
+
|
|
3
|
+
/** Branded integer type for global sequence numbers assigned by the sync backend. */
|
|
4
|
+
export type Type = Brand.Branded<number, 'GlobalEventSequenceNumber'>
|
|
5
|
+
|
|
6
|
+
const GlobalBrand = Brand.nominal<Type>()
|
|
7
|
+
|
|
8
|
+
/** Effect Schema for encoding/decoding global sequence numbers. */
|
|
9
|
+
export const Schema = S.fromBrand(GlobalBrand)(S.Int)
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Creates a branded global sequence number from a plain number.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const seqNum = EventSequenceNumber.Global.make(5)
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export const make = GlobalBrand
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client sequence numbers track events created locally before sync confirmation.
|
|
3
|
+
* Also contains the Composite type combining global and client sequence numbers with a rebase
|
|
4
|
+
* generation to fully identify an event's position in the eventlog.
|
|
5
|
+
*
|
|
6
|
+
* For event notation documentation, see: contributor-docs/events-notation.md
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { EventSequenceNumber } from '@livestore/common'
|
|
11
|
+
*
|
|
12
|
+
* // Client sequence number
|
|
13
|
+
* const clientSeq = EventSequenceNumber.Client.make(1)
|
|
14
|
+
*
|
|
15
|
+
* // Composite sequence number
|
|
16
|
+
* const composite: EventSequenceNumber.Client.Composite = {
|
|
17
|
+
* global: EventSequenceNumber.Global.make(5),
|
|
18
|
+
* client: EventSequenceNumber.Client.DEFAULT,
|
|
19
|
+
* rebaseGeneration: 0,
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export * as Client from './client.ts'
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Global sequence numbers are assigned by the sync backend and represent
|
|
27
|
+
* the canonical ordering of events across all clients. They are monotonically
|
|
28
|
+
* increasing integers that establish the authoritative event timeline.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* import { EventSequenceNumber } from '@livestore/common'
|
|
33
|
+
*
|
|
34
|
+
* const globalSeq = EventSequenceNumber.Global.make(5)
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export * as Global from './global.ts'
|
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import { Vitest } from '@livestore/utils-dev/node-vitest'
|
|
2
1
|
import { expect } from 'vitest'
|
|
3
2
|
|
|
3
|
+
import { Vitest } from '@livestore/utils-dev/node-vitest'
|
|
4
|
+
|
|
4
5
|
import { EventSequenceNumber } from './mod.ts'
|
|
5
6
|
|
|
6
7
|
Vitest.describe('EventSequenceNumber', () => {
|
|
7
8
|
Vitest.test('nextPair (no rebase)', () => {
|
|
8
|
-
const e_0_0 = EventSequenceNumber.make({ global: 0, client: 0 })
|
|
9
|
-
expect(EventSequenceNumber.nextPair({ seqNum: e_0_0, isClient: false }).seqNum).toStrictEqual({
|
|
9
|
+
const e_0_0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })
|
|
10
|
+
expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: false }).seqNum).toStrictEqual({
|
|
10
11
|
global: 1,
|
|
11
12
|
client: 0,
|
|
12
13
|
rebaseGeneration: 0,
|
|
13
14
|
})
|
|
14
|
-
expect(EventSequenceNumber.nextPair({ seqNum: e_0_0, isClient: true }).seqNum).toStrictEqual({
|
|
15
|
+
expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: true }).seqNum).toStrictEqual({
|
|
15
16
|
global: 0,
|
|
16
17
|
client: 1,
|
|
17
18
|
rebaseGeneration: 0,
|
|
@@ -19,65 +20,83 @@ Vitest.describe('EventSequenceNumber', () => {
|
|
|
19
20
|
})
|
|
20
21
|
|
|
21
22
|
Vitest.test('nextPair (rebase)', () => {
|
|
22
|
-
const e_0_0 = EventSequenceNumber.make({ global: 0, client: 0 })
|
|
23
|
-
expect(
|
|
23
|
+
const e_0_0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })
|
|
24
|
+
expect(
|
|
25
|
+
EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: false, rebaseGeneration: 1 }).seqNum,
|
|
26
|
+
).toStrictEqual({
|
|
24
27
|
global: 1,
|
|
25
28
|
client: 0,
|
|
26
|
-
rebaseGeneration:
|
|
29
|
+
rebaseGeneration: 1,
|
|
27
30
|
})
|
|
28
|
-
expect(
|
|
31
|
+
expect(
|
|
32
|
+
EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClient: true, rebaseGeneration: 1 }).seqNum,
|
|
33
|
+
).toStrictEqual({
|
|
29
34
|
global: 0,
|
|
30
35
|
client: 1,
|
|
31
36
|
rebaseGeneration: 1,
|
|
32
37
|
})
|
|
33
38
|
|
|
34
|
-
const e_0_0_g1 = EventSequenceNumber.make({ global: 0, client: 0, rebaseGeneration: 2 })
|
|
35
|
-
expect(EventSequenceNumber.nextPair({ seqNum: e_0_0_g1, isClient: false }).seqNum).toStrictEqual({
|
|
39
|
+
const e_0_0_g1 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 2 })
|
|
40
|
+
expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0_g1, isClient: false }).seqNum).toStrictEqual({
|
|
36
41
|
global: 1,
|
|
37
42
|
client: 0,
|
|
38
|
-
rebaseGeneration:
|
|
43
|
+
rebaseGeneration: 2,
|
|
39
44
|
})
|
|
40
45
|
})
|
|
41
46
|
|
|
42
47
|
Vitest.test('toString', () => {
|
|
43
|
-
expect(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
)
|
|
51
|
-
expect(
|
|
52
|
-
|
|
53
|
-
)
|
|
48
|
+
expect(
|
|
49
|
+
EventSequenceNumber.Client.toString(EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })),
|
|
50
|
+
).toBe('e0')
|
|
51
|
+
expect(
|
|
52
|
+
EventSequenceNumber.Client.toString(
|
|
53
|
+
EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 1 }),
|
|
54
|
+
),
|
|
55
|
+
).toBe('e0r1')
|
|
56
|
+
expect(
|
|
57
|
+
EventSequenceNumber.Client.toString(EventSequenceNumber.Client.Composite.make({ global: 0, client: 1 })),
|
|
58
|
+
).toBe('e0.1')
|
|
59
|
+
expect(
|
|
60
|
+
EventSequenceNumber.Client.toString(
|
|
61
|
+
EventSequenceNumber.Client.Composite.make({ global: 0, client: 1, rebaseGeneration: 1 }),
|
|
62
|
+
),
|
|
63
|
+
).toBe('e0.1r1')
|
|
64
|
+
expect(
|
|
65
|
+
EventSequenceNumber.Client.toString(
|
|
66
|
+
EventSequenceNumber.Client.Composite.make({ global: 5, client: 3, rebaseGeneration: 2 }),
|
|
67
|
+
),
|
|
68
|
+
).toBe('e5.3r2')
|
|
54
69
|
})
|
|
55
70
|
|
|
56
71
|
Vitest.test('fromString', () => {
|
|
57
72
|
// Basic cases
|
|
58
|
-
expect(EventSequenceNumber.fromString('e0')).toStrictEqual(
|
|
59
|
-
|
|
60
|
-
|
|
73
|
+
expect(EventSequenceNumber.Client.fromString('e0')).toStrictEqual(
|
|
74
|
+
EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 }),
|
|
75
|
+
)
|
|
76
|
+
expect(EventSequenceNumber.Client.fromString('e0r1')).toStrictEqual(
|
|
77
|
+
EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 1 }),
|
|
78
|
+
)
|
|
79
|
+
expect(EventSequenceNumber.Client.fromString('e0.1')).toStrictEqual(
|
|
80
|
+
EventSequenceNumber.Client.Composite.make({ global: 0, client: 1 }),
|
|
61
81
|
)
|
|
62
|
-
expect(EventSequenceNumber.fromString('e0
|
|
63
|
-
|
|
64
|
-
EventSequenceNumber.make({ global: 0, client: 1, rebaseGeneration: 1 }),
|
|
82
|
+
expect(EventSequenceNumber.Client.fromString('e0.1r1')).toStrictEqual(
|
|
83
|
+
EventSequenceNumber.Client.Composite.make({ global: 0, client: 1, rebaseGeneration: 1 }),
|
|
65
84
|
)
|
|
66
|
-
expect(EventSequenceNumber.fromString('e5
|
|
67
|
-
EventSequenceNumber.make({ global: 5, client: 3, rebaseGeneration: 2 }),
|
|
85
|
+
expect(EventSequenceNumber.Client.fromString('e5.3r2')).toStrictEqual(
|
|
86
|
+
EventSequenceNumber.Client.Composite.make({ global: 5, client: 3, rebaseGeneration: 2 }),
|
|
68
87
|
)
|
|
69
88
|
|
|
70
89
|
// Error cases
|
|
71
|
-
expect(() => EventSequenceNumber.fromString('0')).toThrow(
|
|
90
|
+
expect(() => EventSequenceNumber.Client.fromString('0')).toThrow(
|
|
72
91
|
'Invalid event sequence number string: must start with "e"',
|
|
73
92
|
)
|
|
74
|
-
expect(() => EventSequenceNumber.fromString('eabc')).toThrow(
|
|
93
|
+
expect(() => EventSequenceNumber.Client.fromString('eabc')).toThrow(
|
|
75
94
|
'Invalid event sequence number string: invalid number format',
|
|
76
95
|
)
|
|
77
|
-
expect(() => EventSequenceNumber.fromString('e0
|
|
96
|
+
expect(() => EventSequenceNumber.Client.fromString('e0.abc')).toThrow(
|
|
78
97
|
'Invalid event sequence number string: invalid number format',
|
|
79
98
|
)
|
|
80
|
-
expect(() => EventSequenceNumber.fromString('e0rabc')).toThrow(
|
|
99
|
+
expect(() => EventSequenceNumber.Client.fromString('e0rabc')).toThrow(
|
|
81
100
|
'Invalid event sequence number string: invalid number format',
|
|
82
101
|
)
|
|
83
102
|
})
|
|
@@ -93,37 +112,37 @@ Vitest.describe('EventSequenceNumber', () => {
|
|
|
93
112
|
]
|
|
94
113
|
|
|
95
114
|
for (const testCase of testCases) {
|
|
96
|
-
const original = EventSequenceNumber.make(testCase)
|
|
97
|
-
const str = EventSequenceNumber.toString(original)
|
|
98
|
-
const parsed = EventSequenceNumber.fromString(str)
|
|
115
|
+
const original = EventSequenceNumber.Client.Composite.make(testCase)
|
|
116
|
+
const str = EventSequenceNumber.Client.toString(original)
|
|
117
|
+
const parsed = EventSequenceNumber.Client.fromString(str)
|
|
99
118
|
expect(parsed).toStrictEqual(original)
|
|
100
119
|
}
|
|
101
120
|
})
|
|
102
121
|
|
|
103
122
|
Vitest.test('compare', () => {
|
|
104
|
-
const e_0_0_r0 = EventSequenceNumber.make({ global: 0, client: 0, rebaseGeneration: 0 })
|
|
105
|
-
const e_0_0_r1 = EventSequenceNumber.make({ global: 0, client: 0, rebaseGeneration: 1 })
|
|
106
|
-
const e_0_1_r0 = EventSequenceNumber.make({ global: 0, client: 1, rebaseGeneration: 0 })
|
|
107
|
-
const e_0_1_r1 = EventSequenceNumber.make({ global: 0, client: 1, rebaseGeneration: 1 })
|
|
108
|
-
const e_1_0_r0 = EventSequenceNumber.make({ global: 1, client: 0, rebaseGeneration: 0 })
|
|
109
|
-
const e_1_1_r0 = EventSequenceNumber.make({ global: 1, client: 1, rebaseGeneration: 0 })
|
|
123
|
+
const e_0_0_r0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 0 })
|
|
124
|
+
const e_0_0_r1 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0, rebaseGeneration: 1 })
|
|
125
|
+
const e_0_1_r0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 1, rebaseGeneration: 0 })
|
|
126
|
+
const e_0_1_r1 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 1, rebaseGeneration: 1 })
|
|
127
|
+
const e_1_0_r0 = EventSequenceNumber.Client.Composite.make({ global: 1, client: 0, rebaseGeneration: 0 })
|
|
128
|
+
const e_1_1_r0 = EventSequenceNumber.Client.Composite.make({ global: 1, client: 1, rebaseGeneration: 0 })
|
|
110
129
|
|
|
111
130
|
// Global comparison (strongest level)
|
|
112
|
-
expect(EventSequenceNumber.compare(e_0_0_r0, e_1_0_r0)).toBeLessThan(0)
|
|
113
|
-
expect(EventSequenceNumber.compare(e_1_0_r0, e_0_0_r0)).toBeGreaterThan(0)
|
|
114
|
-
expect(EventSequenceNumber.compare(e_0_1_r1, e_1_0_r0)).toBeLessThan(0) // global overrides client and rebase
|
|
131
|
+
expect(EventSequenceNumber.Client.compare(e_0_0_r0, e_1_0_r0)).toBeLessThan(0)
|
|
132
|
+
expect(EventSequenceNumber.Client.compare(e_1_0_r0, e_0_0_r0)).toBeGreaterThan(0)
|
|
133
|
+
expect(EventSequenceNumber.Client.compare(e_0_1_r1, e_1_0_r0)).toBeLessThan(0) // global overrides client and rebase
|
|
115
134
|
|
|
116
135
|
// Client comparison (second level)
|
|
117
|
-
expect(EventSequenceNumber.compare(e_0_0_r0, e_0_1_r0)).toBeLessThan(0)
|
|
118
|
-
expect(EventSequenceNumber.compare(e_0_1_r0, e_0_0_r0)).toBeGreaterThan(0)
|
|
119
|
-
expect(EventSequenceNumber.compare(e_0_0_r1, e_0_1_r0)).toBeLessThan(0) // client overrides rebase
|
|
136
|
+
expect(EventSequenceNumber.Client.compare(e_0_0_r0, e_0_1_r0)).toBeLessThan(0)
|
|
137
|
+
expect(EventSequenceNumber.Client.compare(e_0_1_r0, e_0_0_r0)).toBeGreaterThan(0)
|
|
138
|
+
expect(EventSequenceNumber.Client.compare(e_0_0_r1, e_0_1_r0)).toBeLessThan(0) // client overrides rebase
|
|
120
139
|
|
|
121
140
|
// Rebase generation comparison (weakest level)
|
|
122
|
-
expect(EventSequenceNumber.compare(e_0_0_r0, e_0_0_r1)).toBeLessThan(0)
|
|
123
|
-
expect(EventSequenceNumber.compare(e_0_0_r1, e_0_0_r0)).toBeGreaterThan(0)
|
|
141
|
+
expect(EventSequenceNumber.Client.compare(e_0_0_r0, e_0_0_r1)).toBeLessThan(0)
|
|
142
|
+
expect(EventSequenceNumber.Client.compare(e_0_0_r1, e_0_0_r0)).toBeGreaterThan(0)
|
|
124
143
|
|
|
125
144
|
// Equal comparison
|
|
126
|
-
expect(EventSequenceNumber.compare(e_0_0_r0, e_0_0_r0)).toBe(0)
|
|
127
|
-
expect(EventSequenceNumber.compare(e_1_1_r0, e_1_1_r0)).toBe(0)
|
|
145
|
+
expect(EventSequenceNumber.Client.compare(e_0_0_r0, e_0_0_r0)).toBe(0)
|
|
146
|
+
expect(EventSequenceNumber.Client.compare(e_1_1_r0, e_1_1_r0)).toBe(0)
|
|
128
147
|
})
|
|
129
148
|
})
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { expect } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { Option, Schema } from '@livestore/utils/effect'
|
|
4
|
+
import { Vitest } from '@livestore/utils-dev/node-vitest'
|
|
5
|
+
|
|
6
|
+
import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
|
|
7
|
+
import { EncodedWithMeta, isEqualEncoded, type Encoded } from './client.ts'
|
|
8
|
+
|
|
9
|
+
Vitest.describe('EncodedWithMeta', () => {
|
|
10
|
+
Vitest.test('toGlobal() produces numeric seqNums through JSON.stringify', () => {
|
|
11
|
+
const event = new EncodedWithMeta({
|
|
12
|
+
name: 'test-v1',
|
|
13
|
+
args: { id: '1' },
|
|
14
|
+
seqNum: EventSequenceNumber.Client.Composite.make({ global: 5, client: 0 }),
|
|
15
|
+
parentSeqNum: EventSequenceNumber.Client.Composite.make({ global: 4, client: 0 }),
|
|
16
|
+
clientId: 'client-1',
|
|
17
|
+
sessionId: 'session-1',
|
|
18
|
+
meta: {
|
|
19
|
+
sessionChangeset: { _tag: 'unset' },
|
|
20
|
+
syncMetadata: Option.none(),
|
|
21
|
+
materializerHashLeader: Option.none(),
|
|
22
|
+
materializerHashSession: Option.none(),
|
|
23
|
+
},
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const global = event.toGlobal()
|
|
27
|
+
const parsed = JSON.parse(JSON.stringify(global))
|
|
28
|
+
|
|
29
|
+
expect(parsed.seqNum).toBe(5)
|
|
30
|
+
expect(parsed.parentSeqNum).toBe(4)
|
|
31
|
+
})
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
Vitest.describe('isEqualEncoded', () => {
|
|
35
|
+
const makeEncodedEvent = (args: unknown): Encoded => ({
|
|
36
|
+
name: 'testEvent-v1',
|
|
37
|
+
args,
|
|
38
|
+
seqNum: EventSequenceNumber.Client.Composite.make({ global: 1, client: 0 }),
|
|
39
|
+
parentSeqNum: EventSequenceNumber.Client.Composite.make(EventSequenceNumber.Client.ROOT),
|
|
40
|
+
clientId: 'client-1',
|
|
41
|
+
sessionId: 'session-1',
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
Vitest.it('should consider events with identical args as equal', () => {
|
|
45
|
+
const a = makeEncodedEvent({ id: 'abc', text: 'hello' })
|
|
46
|
+
const b = makeEncodedEvent({ id: 'abc', text: 'hello' })
|
|
47
|
+
expect(isEqualEncoded(a, b)).toBe(true)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
Vitest.it('should consider events with different key order in args as equal', () => {
|
|
51
|
+
const a = makeEncodedEvent({ b: 2, a: 1 })
|
|
52
|
+
const b = makeEncodedEvent({ a: 1, b: 2 })
|
|
53
|
+
expect(isEqualEncoded(a, b)).toBe(true)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
Vitest.it('should consider events with different key order in nested args as equal', () => {
|
|
57
|
+
const a = makeEncodedEvent({ outer: { b: 2, a: 1 }, x: 'y' })
|
|
58
|
+
const b = makeEncodedEvent({ x: 'y', outer: { a: 1, b: 2 } })
|
|
59
|
+
expect(isEqualEncoded(a, b)).toBe(true)
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
Vitest.it('should consider events with different args values as not equal', () => {
|
|
63
|
+
const a = makeEncodedEvent({ id: 'abc' })
|
|
64
|
+
const b = makeEncodedEvent({ id: 'def' })
|
|
65
|
+
expect(isEqualEncoded(a, b)).toBe(false)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
Vitest.it('should consider events with different args keys as not equal', () => {
|
|
69
|
+
const a = makeEncodedEvent({ a: 1 })
|
|
70
|
+
const b = makeEncodedEvent({ b: 1 })
|
|
71
|
+
expect(isEqualEncoded(a, b)).toBe(false)
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
Vitest.it('should handle null args', () => {
|
|
75
|
+
const a = makeEncodedEvent(null)
|
|
76
|
+
const b = makeEncodedEvent(null)
|
|
77
|
+
expect(isEqualEncoded(a, b)).toBe(true)
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
Vitest.it('should handle array args', () => {
|
|
81
|
+
const a = makeEncodedEvent([1, 2, 3])
|
|
82
|
+
const b = makeEncodedEvent([1, 2, 3])
|
|
83
|
+
expect(isEqualEncoded(a, b)).toBe(true)
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
Vitest.it('should handle empty object args', () => {
|
|
87
|
+
const a = makeEncodedEvent({})
|
|
88
|
+
const b = makeEncodedEvent({})
|
|
89
|
+
expect(isEqualEncoded(a, b)).toBe(true)
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
Vitest.it('should consider events with different names as not equal', () => {
|
|
93
|
+
const a = { ...makeEncodedEvent({ id: 'abc' }), name: 'eventA' }
|
|
94
|
+
const b = { ...makeEncodedEvent({ id: 'abc' }), name: 'eventB' }
|
|
95
|
+
expect(isEqualEncoded(a, b)).toBe(false)
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
Vitest.it('should consider events with undefined-valued and missing keys as equal', () => {
|
|
99
|
+
const a = makeEncodedEvent({ id: 'abc', flag: undefined })
|
|
100
|
+
const b = makeEncodedEvent({ id: 'abc' })
|
|
101
|
+
expect(isEqualEncoded(a, b)).toBe(true)
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
Vitest.it('should consider events with nested undefined-valued and missing keys as equal', () => {
|
|
105
|
+
const a = makeEncodedEvent({ outer: { x: 1, y: undefined } })
|
|
106
|
+
const b = makeEncodedEvent({ outer: { x: 1 } })
|
|
107
|
+
expect(isEqualEncoded(a, b)).toBe(true)
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
Vitest.it('should consider Effect Schema UndefinedOr-encoded args equal to their JSON-roundtripped form', () => {
|
|
111
|
+
const argsSchema = Schema.Struct({
|
|
112
|
+
id: Schema.String,
|
|
113
|
+
flag: Schema.UndefinedOr(Schema.Boolean),
|
|
114
|
+
})
|
|
115
|
+
const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc' } as any)
|
|
116
|
+
const wireArgs = JSON.parse(JSON.stringify(localArgs))
|
|
117
|
+
expect(isEqualEncoded(makeEncodedEvent(localArgs), makeEncodedEvent(wireArgs))).toBe(true)
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
Vitest.it('should consider Effect Schema loose-optional encoded args equal to their JSON-roundtripped form', () => {
|
|
121
|
+
const argsSchema = Schema.Struct({
|
|
122
|
+
id: Schema.String,
|
|
123
|
+
label: Schema.optional(Schema.String),
|
|
124
|
+
})
|
|
125
|
+
const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc', label: undefined } as any)
|
|
126
|
+
const wireArgs = JSON.parse(JSON.stringify(localArgs))
|
|
127
|
+
expect(isEqualEncoded(makeEncodedEvent(localArgs), makeEncodedEvent(wireArgs))).toBe(true)
|
|
128
|
+
})
|
|
129
|
+
})
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { deepEqual, memoizeByRef } from '@livestore/utils'
|
|
2
|
+
import { Option, Schema } from '@livestore/utils/effect'
|
|
3
|
+
|
|
4
|
+
import type { EventDef } from '../EventDef/mod.ts'
|
|
5
|
+
import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
|
|
6
|
+
import type { LiveStoreSchema } from '../schema.ts'
|
|
7
|
+
import type * as ForEventDef from './for-event-def.ts'
|
|
8
|
+
import type * as Global from './global.ts'
|
|
9
|
+
|
|
10
|
+
/** Effect Schema for client events with decoded args. */
|
|
11
|
+
export const Decoded = Schema.Struct({
|
|
12
|
+
name: Schema.String,
|
|
13
|
+
args: Schema.Any,
|
|
14
|
+
seqNum: EventSequenceNumber.Client.Composite,
|
|
15
|
+
parentSeqNum: EventSequenceNumber.Client.Composite,
|
|
16
|
+
clientId: Schema.String,
|
|
17
|
+
sessionId: Schema.String,
|
|
18
|
+
}).annotations({ title: 'LiveStoreEvent.Client.Decoded' })
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Effect Schema for client events with encoded args.
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* // Confirmed event (client=0)
|
|
25
|
+
* const event: LiveStoreEvent.Client.Encoded = {
|
|
26
|
+
* name: 'todoCreated-v1',
|
|
27
|
+
* args: { id: 'abc', text: 'Buy milk' },
|
|
28
|
+
* seqNum: { global: 5, client: 0, rebaseGeneration: 0 },
|
|
29
|
+
* parentSeqNum: { global: 4, client: 0, rebaseGeneration: 0 },
|
|
30
|
+
* clientId: 'client-xyz',
|
|
31
|
+
* sessionId: 'session-123'
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* // Pending local event (client=1, not yet synced)
|
|
35
|
+
* const pending: LiveStoreEvent.Client.Encoded = {
|
|
36
|
+
* ...event,
|
|
37
|
+
* seqNum: { global: 5, client: 1, rebaseGeneration: 0 }, // e5.1
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export const Encoded = Schema.Struct({
|
|
42
|
+
name: Schema.String,
|
|
43
|
+
args: Schema.Any,
|
|
44
|
+
seqNum: EventSequenceNumber.Client.Composite,
|
|
45
|
+
parentSeqNum: EventSequenceNumber.Client.Composite,
|
|
46
|
+
clientId: Schema.String,
|
|
47
|
+
sessionId: Schema.String,
|
|
48
|
+
}).annotations({ title: 'LiveStoreEvent.Client.Encoded' })
|
|
49
|
+
|
|
50
|
+
/** Event with composite sequence numbers and decoded (native TypeScript) args. */
|
|
51
|
+
export type Decoded = ForEventDef.Decoded<EventDef.Any>
|
|
52
|
+
|
|
53
|
+
/** Event with composite sequence numbers and encoded (serialized) args. */
|
|
54
|
+
export type Encoded = ForEventDef.Encoded<EventDef.Any>
|
|
55
|
+
|
|
56
|
+
/** Union of all client event types for a given schema (type-safe event discrimination). */
|
|
57
|
+
export type ForSchema<TSchema extends LiveStoreSchema> = {
|
|
58
|
+
[K in keyof TSchema['_EventDefMapType']]: ForEventDef.Decoded<TSchema['_EventDefMapType'][K]>
|
|
59
|
+
}[keyof TSchema['_EventDefMapType']]
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Internal event representation with metadata for sync processing.
|
|
63
|
+
* Includes changeset data and materializer hashes for conflict detection and rebasing.
|
|
64
|
+
*
|
|
65
|
+
* Note: This class is exported for internal use. The preferred access is via `LiveStoreEvent.Client.EncodedWithMeta`.
|
|
66
|
+
*/
|
|
67
|
+
export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEvent.Client.EncodedWithMeta')({
|
|
68
|
+
name: Schema.String,
|
|
69
|
+
args: Schema.Any,
|
|
70
|
+
seqNum: EventSequenceNumber.Client.Composite,
|
|
71
|
+
parentSeqNum: EventSequenceNumber.Client.Composite,
|
|
72
|
+
clientId: Schema.String,
|
|
73
|
+
sessionId: Schema.String,
|
|
74
|
+
// TODO get rid of `meta` again by cleaning up the usage implementations
|
|
75
|
+
meta: Schema.Struct({
|
|
76
|
+
sessionChangeset: Schema.Union(
|
|
77
|
+
Schema.TaggedStruct('sessionChangeset', {
|
|
78
|
+
data: Schema.Uint8Array as any as Schema.Schema<Uint8Array<ArrayBuffer>>,
|
|
79
|
+
debug: Schema.Any.pipe(Schema.optional),
|
|
80
|
+
}),
|
|
81
|
+
Schema.TaggedStruct('no-op', {}),
|
|
82
|
+
Schema.TaggedStruct('unset', {}),
|
|
83
|
+
),
|
|
84
|
+
syncMetadata: Schema.Option(Schema.JsonValue),
|
|
85
|
+
/** Used to detect if the materializer is side effecting (during dev) */
|
|
86
|
+
materializerHashLeader: Schema.Option(Schema.Number),
|
|
87
|
+
materializerHashSession: Schema.Option(Schema.Number),
|
|
88
|
+
}).pipe(
|
|
89
|
+
Schema.mutable,
|
|
90
|
+
Schema.optional,
|
|
91
|
+
Schema.withDefaults({
|
|
92
|
+
constructor: () => ({
|
|
93
|
+
sessionChangeset: { _tag: 'unset' as const },
|
|
94
|
+
syncMetadata: Option.none(),
|
|
95
|
+
materializerHashLeader: Option.none(),
|
|
96
|
+
materializerHashSession: Option.none(),
|
|
97
|
+
}),
|
|
98
|
+
decoding: () => ({
|
|
99
|
+
sessionChangeset: { _tag: 'unset' as const },
|
|
100
|
+
syncMetadata: Option.none(),
|
|
101
|
+
materializerHashLeader: Option.none(),
|
|
102
|
+
materializerHashSession: Option.none(),
|
|
103
|
+
}),
|
|
104
|
+
}),
|
|
105
|
+
),
|
|
106
|
+
}) {
|
|
107
|
+
toJSON = (): any => {
|
|
108
|
+
// Only used for logging/debugging
|
|
109
|
+
// - More readable way to print the seqNum + parentSeqNum
|
|
110
|
+
// - not including `meta`, `clientId`, `sessionId`
|
|
111
|
+
return {
|
|
112
|
+
seqNum: `${EventSequenceNumber.Client.toString(this.seqNum)} → ${EventSequenceNumber.Client.toString(this.parentSeqNum)} (${this.clientId}, ${this.sessionId})`,
|
|
113
|
+
name: this.name,
|
|
114
|
+
args: this.args,
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Example: (global event)
|
|
120
|
+
* For event e2 → e1 which should be rebased on event e3 → e2
|
|
121
|
+
* the resulting event num will be e4 → e3
|
|
122
|
+
*
|
|
123
|
+
* Example: (client event)
|
|
124
|
+
* For event e2.1 → e2 which should be rebased on event e3 → e2
|
|
125
|
+
* the resulting event num will be e3.1 → e3
|
|
126
|
+
*
|
|
127
|
+
* Syntax: e2.2 → e2.1
|
|
128
|
+
* ^ ^ ^ ^
|
|
129
|
+
* | | | +- client parent number
|
|
130
|
+
* | | +--- global parent number
|
|
131
|
+
* | +-- client number
|
|
132
|
+
* +---- global number
|
|
133
|
+
* Client num is omitted for global events
|
|
134
|
+
*/
|
|
135
|
+
rebase = ({
|
|
136
|
+
parentSeqNum,
|
|
137
|
+
isClient,
|
|
138
|
+
rebaseGeneration,
|
|
139
|
+
}: {
|
|
140
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
141
|
+
isClient: boolean
|
|
142
|
+
rebaseGeneration: number
|
|
143
|
+
}) =>
|
|
144
|
+
new EncodedWithMeta({
|
|
145
|
+
...this,
|
|
146
|
+
...EventSequenceNumber.Client.nextPair({ seqNum: parentSeqNum, isClient, rebaseGeneration }),
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
static fromGlobal = (
|
|
150
|
+
event: Global.Encoded,
|
|
151
|
+
meta: {
|
|
152
|
+
syncMetadata: Option.Option<Schema.JsonValue>
|
|
153
|
+
materializerHashLeader: Option.Option<number>
|
|
154
|
+
materializerHashSession: Option.Option<number>
|
|
155
|
+
},
|
|
156
|
+
) =>
|
|
157
|
+
new EncodedWithMeta({
|
|
158
|
+
...event,
|
|
159
|
+
seqNum: {
|
|
160
|
+
global: event.seqNum,
|
|
161
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
162
|
+
rebaseGeneration: EventSequenceNumber.Client.REBASE_GENERATION_DEFAULT,
|
|
163
|
+
},
|
|
164
|
+
parentSeqNum: {
|
|
165
|
+
global: event.parentSeqNum,
|
|
166
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
167
|
+
rebaseGeneration: EventSequenceNumber.Client.REBASE_GENERATION_DEFAULT,
|
|
168
|
+
},
|
|
169
|
+
meta: {
|
|
170
|
+
sessionChangeset: { _tag: 'unset' as const },
|
|
171
|
+
syncMetadata: meta.syncMetadata,
|
|
172
|
+
materializerHashLeader: meta.materializerHashLeader,
|
|
173
|
+
materializerHashSession: meta.materializerHashSession,
|
|
174
|
+
},
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
toGlobal = (): Global.Encoded => ({
|
|
178
|
+
name: this.name,
|
|
179
|
+
args: this.args,
|
|
180
|
+
seqNum: this.seqNum.global,
|
|
181
|
+
parentSeqNum: this.parentSeqNum.global,
|
|
182
|
+
clientId: this.clientId,
|
|
183
|
+
sessionId: this.sessionId,
|
|
184
|
+
})
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Structural equality check for client events. Compares seqNum (global + client),
|
|
189
|
+
* name, clientId, sessionId, and args. The `meta` field is ignored.
|
|
190
|
+
*
|
|
191
|
+
* Args are compared in their JSON-canonical form: locally-encoded events with
|
|
192
|
+
* `Schema.UndefinedOr` (or loose `Schema.optional`) fields produce
|
|
193
|
+
* `{ ..., flag: undefined }`, but JSON wire transport drops the key. Without
|
|
194
|
+
* canonicalizing, the local pending event compares unequal to its
|
|
195
|
+
* wire-roundtripped counterpart and the sync merge falsely takes the rebase
|
|
196
|
+
* path, surfacing as `MaterializerHashMismatchError` for state-dependent
|
|
197
|
+
* materializers.
|
|
198
|
+
*/
|
|
199
|
+
export const isEqualEncoded = (a: Encoded, b: Encoded) =>
|
|
200
|
+
a.seqNum.global === b.seqNum.global &&
|
|
201
|
+
a.seqNum.client === b.seqNum.client &&
|
|
202
|
+
a.name === b.name &&
|
|
203
|
+
a.clientId === b.clientId &&
|
|
204
|
+
a.sessionId === b.sessionId &&
|
|
205
|
+
deepEqual(canonicalizeArgs(a.args), canonicalizeArgs(b.args)) // TODO use schema equality here
|
|
206
|
+
|
|
207
|
+
const canonicalizeArgs = (args: unknown): unknown =>
|
|
208
|
+
args === undefined ? args : JSON.parse(JSON.stringify(args))
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Creates an Effect Schema union for all event types in a schema (with composite sequence numbers).
|
|
212
|
+
* @example
|
|
213
|
+
* ```ts
|
|
214
|
+
* const eventSchema = LiveStoreEvent.Client.makeSchema(schema)
|
|
215
|
+
* const event = Schema.decodeUnknownSync(eventSchema)(rawEvent)
|
|
216
|
+
* ```
|
|
217
|
+
*/
|
|
218
|
+
export const makeSchema = <TSchema extends LiveStoreSchema>(
|
|
219
|
+
schema: TSchema,
|
|
220
|
+
): ForEventDef.ForRecord<TSchema['_EventDefMapType']> =>
|
|
221
|
+
Schema.Union(
|
|
222
|
+
...[...schema.eventsDefsMap.values()].map((def) =>
|
|
223
|
+
Schema.Struct({
|
|
224
|
+
name: Schema.Literal(def.name),
|
|
225
|
+
args: def.schema,
|
|
226
|
+
seqNum: EventSequenceNumber.Client.Composite,
|
|
227
|
+
parentSeqNum: EventSequenceNumber.Client.Composite,
|
|
228
|
+
clientId: Schema.String,
|
|
229
|
+
sessionId: Schema.String,
|
|
230
|
+
}),
|
|
231
|
+
),
|
|
232
|
+
).annotations({ title: 'LiveStoreEvent.Client' }) as any
|
|
233
|
+
|
|
234
|
+
/** Memoized `makeSchema` - caches the generated schema by reference. */
|
|
235
|
+
export const makeSchemaMemo = memoizeByRef(makeSchema)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Schema } from '@livestore/utils/effect'
|
|
2
|
+
|
|
3
|
+
import type { EventDef, EventDefRecord } from '../EventDef/mod.ts'
|
|
4
|
+
import type * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
|
|
5
|
+
|
|
6
|
+
/** Event without sequence numbers, with decoded (native TypeScript) args. Used as input to `store.commit()`. */
|
|
7
|
+
export type InputDecoded<TEventDef extends EventDef.Any> = {
|
|
8
|
+
name: TEventDef['name']
|
|
9
|
+
args: Schema.Schema.Type<TEventDef['schema']>
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Event without sequence numbers, with encoded (serialized) args. Used as input to `store.commit()`. */
|
|
13
|
+
export type InputEncoded<TEventDef extends EventDef.Any> = {
|
|
14
|
+
name: TEventDef['name']
|
|
15
|
+
args: Schema.Schema.Encoded<TEventDef['schema']>
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Full event with composite sequence numbers and decoded args. Includes clientId/sessionId for sync. */
|
|
19
|
+
export type Decoded<TEventDef extends EventDef.Any> = {
|
|
20
|
+
name: TEventDef['name']
|
|
21
|
+
args: Schema.Schema.Type<TEventDef['schema']>
|
|
22
|
+
seqNum: EventSequenceNumber.Client.Composite
|
|
23
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
24
|
+
clientId: string
|
|
25
|
+
sessionId: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Full event with composite sequence numbers and encoded args. Includes clientId/sessionId for sync. */
|
|
29
|
+
export type Encoded<TEventDef extends EventDef.Any> = {
|
|
30
|
+
name: TEventDef['name']
|
|
31
|
+
args: Schema.Schema.Encoded<TEventDef['schema']>
|
|
32
|
+
seqNum: EventSequenceNumber.Client.Composite
|
|
33
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
34
|
+
clientId: string
|
|
35
|
+
sessionId: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Effect Schema union of all event types in an EventDefRecord (with composite sequence numbers). */
|
|
39
|
+
export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
|
|
40
|
+
{
|
|
41
|
+
[K in keyof TEventDefRecord]: {
|
|
42
|
+
name: K
|
|
43
|
+
args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
|
|
44
|
+
seqNum: EventSequenceNumber.Client.Composite
|
|
45
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
46
|
+
clientId: string
|
|
47
|
+
sessionId: string
|
|
48
|
+
}
|
|
49
|
+
}[keyof TEventDefRecord],
|
|
50
|
+
{
|
|
51
|
+
[K in keyof TEventDefRecord]: {
|
|
52
|
+
name: K
|
|
53
|
+
args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
|
|
54
|
+
seqNum: EventSequenceNumber.Client.Composite
|
|
55
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
56
|
+
clientId: string
|
|
57
|
+
sessionId: string
|
|
58
|
+
}
|
|
59
|
+
}[keyof TEventDefRecord]
|
|
60
|
+
>
|