@livestore/common 0.4.0 → 0.5.0-dev.1
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 +1 -1
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/MaterializationJournal.d.ts +44 -0
- package/dist/MaterializationJournal.d.ts.map +1 -0
- package/dist/MaterializationJournal.js +112 -0
- package/dist/MaterializationJournal.js.map +1 -0
- package/dist/StateHead.d.ts +26 -0
- package/dist/StateHead.d.ts.map +1 -0
- package/dist/StateHead.js +50 -0
- package/dist/StateHead.js.map +1 -0
- package/dist/WorkerTransportError.d.ts +3 -3
- package/dist/WorkerTransportError.d.ts.map +1 -1
- package/dist/WorkerTransportError.js +3 -3
- package/dist/WorkerTransportError.js.map +1 -1
- package/dist/__tests__/fixture.d.ts +8 -8
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/__tests__/fixture.js +4 -4
- package/dist/__tests__/fixture.js.map +1 -1
- package/dist/adapter-types.d.ts +33 -57
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +24 -41
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/bounded-collections.js.map +1 -1
- package/dist/debug-info.d.ts +56 -56
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +32 -44
- package/dist/debug-info.js.map +1 -1
- package/dist/defs.d.ts +9 -9
- package/dist/defs.js +2 -2
- package/dist/devtools/devtools-compatibility.test.js +2 -1
- package/dist/devtools/devtools-compatibility.test.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +522 -334
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +80 -78
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +27 -27
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +6 -6
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +410 -348
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +105 -93
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-messages.js +3 -3
- package/dist/devtools/devtools-sessioninfo.d.ts +18 -19
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
- package/dist/devtools/devtools-sessioninfo.js +8 -5
- package/dist/devtools/devtools-sessioninfo.js.map +1 -1
- package/dist/devtools/mod.d.ts +4 -5
- package/dist/devtools/mod.d.ts.map +1 -1
- package/dist/devtools/mod.js +12 -8
- package/dist/devtools/mod.js.map +1 -1
- package/dist/errors.d.ts +45 -69
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +19 -17
- 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 +22 -19
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +87 -18
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +548 -480
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/RejectedPushError.d.ts +72 -41
- package/dist/leader-thread/RejectedPushError.d.ts.map +1 -1
- package/dist/leader-thread/RejectedPushError.js +25 -6
- package/dist/leader-thread/RejectedPushError.js.map +1 -1
- package/dist/leader-thread/connection.d.ts +1 -0
- package/dist/leader-thread/connection.d.ts.map +1 -1
- package/dist/leader-thread/connection.js +11 -10
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +15 -5
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +19 -19
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +36 -20
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +15 -5
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +62 -58
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.js +9 -9
- package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -1
- package/dist/leader-thread/materialize-event.d.ts +2 -1
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +12 -8
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/mod.js +9 -9
- package/dist/leader-thread/recreate-db.d.ts +5 -1
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +34 -59
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -6
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -3
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/stream-events.d.ts +4 -7
- package/dist/leader-thread/stream-events.d.ts.map +1 -1
- package/dist/leader-thread/stream-events.js +16 -21
- package/dist/leader-thread/stream-events.js.map +1 -1
- package/dist/leader-thread/types.d.ts +38 -73
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +10 -6
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.d.ts +5 -30
- package/dist/logging.d.ts.map +1 -1
- package/dist/logging.js +1 -32
- package/dist/logging.js.map +1 -1
- package/dist/make-client-session.d.ts +2 -3
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +5 -5
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts +0 -1
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +9 -37
- package/dist/materializer-helper.js.map +1 -1
- package/dist/otel.d.ts +2 -3
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +2 -7
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +3 -1
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +42 -33
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +6 -6
- package/dist/schema/EventDef/define.d.ts.map +1 -1
- package/dist/schema/EventDef/define.js +5 -5
- package/dist/schema/EventDef/define.js.map +1 -1
- package/dist/schema/EventDef/define.test.d.ts +2 -0
- package/dist/schema/EventDef/define.test.d.ts.map +1 -0
- package/dist/schema/EventDef/define.test.js +23 -0
- package/dist/schema/EventDef/define.test.js.map +1 -0
- package/dist/schema/EventDef/deprecated.d.ts +8 -13
- package/dist/schema/EventDef/deprecated.d.ts.map +1 -1
- package/dist/schema/EventDef/deprecated.js +12 -13
- package/dist/schema/EventDef/deprecated.js.map +1 -1
- package/dist/schema/EventDef/deprecated.test.js +3 -3
- package/dist/schema/EventDef/deprecated.test.js.map +1 -1
- package/dist/schema/EventDef/event-def.d.ts +1 -1
- package/dist/schema/EventDef/event-def.d.ts.map +1 -1
- package/dist/schema/EventDef/facts.d.ts.map +1 -1
- package/dist/schema/EventDef/materializer.d.ts +2 -2
- package/dist/schema/EventDef/materializer.d.ts.map +1 -1
- package/dist/schema/EventDef/mod.js +5 -5
- package/dist/schema/EventSequenceNumber/client.d.ts +12 -17
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
- package/dist/schema/EventSequenceNumber/client.js +20 -24
- package/dist/schema/EventSequenceNumber/client.js.map +1 -1
- package/dist/schema/EventSequenceNumber/global.d.ts +2 -2
- package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -1
- package/dist/schema/EventSequenceNumber/global.js +1 -1
- package/dist/schema/EventSequenceNumber/global.js.map +1 -1
- package/dist/schema/EventSequenceNumber/mod.js +2 -2
- package/dist/schema/EventSequenceNumber.test.js +6 -6
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.d.ts +58 -187
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/client.js +33 -30
- package/dist/schema/LiveStoreEvent/client.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.test.js +13 -4
- package/dist/schema/LiveStoreEvent/client.test.js.map +1 -1
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts +7 -7
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/global.d.ts +6 -6
- package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/global.js +2 -2
- package/dist/schema/LiveStoreEvent/global.js.map +1 -1
- package/dist/schema/LiveStoreEvent/input.d.ts +6 -6
- package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/input.js +3 -3
- package/dist/schema/LiveStoreEvent/input.js.map +1 -1
- package/dist/schema/LiveStoreEvent/mod.js +4 -4
- package/dist/schema/events.js +1 -1
- package/dist/schema/mod.d.ts +1 -0
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +11 -10
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +1 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +6 -5
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/mod.js +2 -2
- package/dist/schema/state/sqlite/client-document-def.d.ts +13 -18
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +30 -27
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +53 -18
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
- package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.js +13 -15
- package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
- package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.d.ts +1 -1
- package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +73 -33
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +176 -75
- 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 +1 -1
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +4 -4
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.d.ts +3 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.js +5 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.d.ts +5 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.js +183 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.d.ts +2 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.js +142 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +3 -8
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +1 -73
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +9 -9
- 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 +9 -13
- 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 +28 -17
- 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 +13 -11
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.d.ts +3 -0
- package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.js +6 -0
- package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/mod.js +2 -2
- package/dist/schema/state/sqlite/mod.d.ts +1 -3
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +11 -10
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/persistence.d.ts +11 -0
- package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
- package/dist/schema/state/sqlite/persistence.js +10 -0
- package/dist/schema/state/sqlite/persistence.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/api.d.ts +7 -7
- 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 -23
- 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 +18 -16
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +364 -598
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/mod.js +2 -2
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +2 -2
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.test.js +2 -2
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +102 -134
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -1
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +5 -5
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
- package/dist/schema/state/sqlite/system-tables/mod.js +2 -2
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +380 -115
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -1
- package/dist/schema/state/sqlite/system-tables/state-tables.js +47 -6
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.d.ts +17 -20
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +72 -6
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +207 -37
- package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
- package/dist/schema/unknown-events.d.ts.map +1 -1
- package/dist/schema/unknown-events.js +3 -2
- package/dist/schema/unknown-events.js.map +1 -1
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +28 -6
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -1
- package/dist/schema-management/common.d.ts.map +1 -1
- package/dist/schema-management/common.js +2 -2
- package/dist/schema-management/migrations.d.ts +4 -4
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +9 -9
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts.map +1 -1
- package/dist/schema-management/validate-schema.js +1 -1
- package/dist/session-id-symbol.d.ts +29 -0
- package/dist/session-id-symbol.d.ts.map +1 -0
- package/dist/session-id-symbol.js +44 -0
- package/dist/session-id-symbol.js.map +1 -0
- package/dist/sql-queries/index.js +3 -3
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +11 -13
- 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 +1 -1
- package/dist/sql-queries/types.d.ts +6 -7
- package/dist/sql-queries/types.d.ts.map +1 -1
- package/dist/sql-queries/types.js.map +1 -1
- package/dist/sqlite-db-helper.d.ts +23 -3
- package/dist/sqlite-db-helper.d.ts.map +1 -1
- package/dist/sqlite-db-helper.js +39 -4
- package/dist/sqlite-db-helper.js.map +1 -1
- package/dist/sqlite-types.d.ts +3 -6
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sqlite-types.js +3 -3
- package/dist/sqlite-types.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +41 -19
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +200 -70
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +12 -18
- package/dist/sync/errors.d.ts.map +1 -1
- package/dist/sync/errors.js +3 -3
- package/dist/sync/errors.js.map +1 -1
- package/dist/sync/index.js +6 -6
- package/dist/sync/mock-sync-backend.d.ts +2 -3
- package/dist/sync/mock-sync-backend.d.ts.map +1 -1
- package/dist/sync/mock-sync-backend.js +58 -37
- package/dist/sync/mock-sync-backend.js.map +1 -1
- package/dist/sync/mock-sync-backend.test.d.ts +2 -0
- package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
- package/dist/sync/mock-sync-backend.test.js +49 -0
- package/dist/sync/mock-sync-backend.test.js.map +1 -0
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +3 -3
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +1 -1
- package/dist/sync/next/history-dag-common.d.ts +5 -1
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +53 -32
- 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 +5 -4
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/mod.js +5 -5
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +2 -2
- package/dist/sync/next/test/compact-events.calculator.test.js +6 -6
- package/dist/sync/next/test/compact-events.test.js +4 -4
- package/dist/sync/next/test/event-fixtures.d.ts +8 -8
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +6 -6
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
- package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
- package/dist/sync/next/test/history-dag-common.test.js +73 -0
- package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
- package/dist/sync/next/test/mod.js +1 -1
- package/dist/sync/sync-backend-kv.d.ts.map +1 -1
- package/dist/sync/sync-backend-kv.js +5 -3
- package/dist/sync/sync-backend-kv.js.map +1 -1
- package/dist/sync/sync-backend.d.ts +15 -15
- package/dist/sync/sync-backend.d.ts.map +1 -1
- package/dist/sync/sync-backend.js +10 -6
- package/dist/sync/sync-backend.js.map +1 -1
- package/dist/sync/sync.d.ts +1 -1
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +2 -2
- package/dist/sync/syncstate.d.ts +100 -176
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +36 -39
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +103 -64
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/transport-chunking.d.ts +15 -16
- package/dist/sync/transport-chunking.d.ts.map +1 -1
- package/dist/sync/transport-chunking.js +23 -32
- package/dist/sync/transport-chunking.js.map +1 -1
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +2 -2
- package/dist/testing/event-factory.d.ts.map +1 -1
- package/dist/testing/event-factory.js +2 -2
- package/dist/testing/event-factory.js.map +1 -1
- package/dist/testing/mod.js +1 -1
- package/dist/util.d.ts +11 -4
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +20 -2
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +40 -57
- package/src/ClientSessionLeaderThreadProxy.ts +1 -1
- package/src/MaterializationJournal.ts +184 -0
- package/src/StateHead.ts +80 -0
- package/src/WorkerTransportError.ts +4 -4
- package/src/__tests__/fixture.ts +3 -3
- package/src/adapter-types.ts +28 -61
- package/src/debug-info.ts +53 -70
- package/src/defs.ts +2 -2
- package/src/devtools/devtools-compatibility.test.ts +1 -0
- package/src/devtools/devtools-messages-client-session.ts +56 -65
- package/src/devtools/devtools-messages-common.ts +12 -11
- package/src/devtools/devtools-messages-leader.ts +71 -69
- package/src/devtools/devtools-sessioninfo.ts +13 -11
- package/src/devtools/mod.ts +4 -5
- package/src/errors.ts +46 -34
- package/src/index.ts +8 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +777 -650
- package/src/leader-thread/RejectedPushError.ts +40 -27
- package/src/leader-thread/connection.ts +12 -8
- package/src/leader-thread/eventlog.ts +20 -12
- package/src/leader-thread/leader-worker-devtools.ts +38 -20
- package/src/leader-thread/make-leader-thread-layer.test.ts +7 -7
- package/src/leader-thread/make-leader-thread-layer.ts +100 -71
- package/src/leader-thread/materialize-event.ts +13 -8
- package/src/leader-thread/recreate-db.ts +41 -75
- package/src/leader-thread/shutdown-channel.ts +3 -14
- package/src/leader-thread/stream-events.ts +102 -101
- package/src/leader-thread/types.ts +29 -62
- package/src/logging.ts +5 -52
- package/src/make-client-session.ts +6 -6
- package/src/materializer-helper.ts +7 -36
- package/src/otel.ts +5 -14
- package/src/rematerialize-from-eventlog.ts +116 -98
- package/src/schema/EventDef/define.test.ts +28 -0
- package/src/schema/EventDef/define.ts +20 -19
- package/src/schema/EventDef/deprecated.test.ts +1 -8
- package/src/schema/EventDef/deprecated.ts +17 -20
- package/src/schema/EventDef/event-def.ts +2 -4
- package/src/schema/EventSequenceNumber/client.ts +20 -24
- package/src/schema/EventSequenceNumber/global.ts +1 -1
- package/src/schema/EventSequenceNumber.test.ts +5 -5
- package/src/schema/LiveStoreEvent/client.test.ts +17 -4
- package/src/schema/LiveStoreEvent/client.ts +36 -35
- package/src/schema/LiveStoreEvent/for-event-def.ts +7 -7
- package/src/schema/LiveStoreEvent/global.ts +1 -1
- package/src/schema/LiveStoreEvent/input.ts +6 -6
- package/src/schema/mod.ts +1 -0
- package/src/schema/schema.ts +4 -3
- package/src/schema/state/sqlite/client-document-def.test.ts +55 -20
- package/src/schema/state/sqlite/client-document-def.ts +95 -80
- package/src/schema/state/sqlite/column-annotations.test.ts +26 -45
- package/src/schema/state/sqlite/column-annotations.ts +26 -30
- package/src/schema/state/sqlite/column-def.test.ts +213 -77
- package/src/schema/state/sqlite/column-def.ts +87 -37
- package/src/schema/state/sqlite/column-spec.test.ts +2 -2
- package/src/schema/state/sqlite/column-spec.ts +3 -2
- package/src/schema/state/sqlite/db-schema/ast/fingerprint-digest.ts +6 -0
- package/src/schema/state/sqlite/db-schema/ast/fingerprint.test.ts +209 -0
- package/src/schema/state/sqlite/db-schema/ast/fingerprint.ts +225 -0
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -81
- package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -16
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +26 -31
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +35 -21
- package/src/schema/state/sqlite/db-schema/has-json-string-encoding.ts +9 -0
- package/src/schema/state/sqlite/mod.ts +4 -5
- package/src/schema/state/sqlite/persistence.ts +11 -0
- package/src/schema/state/sqlite/query-builder/api.ts +9 -9
- package/src/schema/state/sqlite/query-builder/astToSql.ts +24 -26
- package/src/schema/state/sqlite/query-builder/impl.test.ts +433 -669
- package/src/schema/state/sqlite/query-builder/impl.ts +19 -15
- package/src/schema/state/sqlite/schema-helpers.ts +1 -1
- package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +2 -2
- package/src/schema/state/sqlite/system-tables/state-tables.ts +54 -3
- package/src/schema/state/sqlite/table-def.test.ts +270 -66
- package/src/schema/state/sqlite/table-def.ts +112 -45
- package/src/schema/unknown-events.ts +3 -2
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +35 -4
- package/src/schema-management/migrations.ts +7 -6
- package/src/session-id-symbol.ts +59 -0
- package/src/sql-queries/sql-queries.ts +9 -13
- package/src/sql-queries/types.ts +6 -7
- package/src/sqlite-db-helper.ts +64 -2
- package/src/sqlite-types.ts +5 -8
- package/src/sync/ClientSessionSyncProcessor.ts +303 -119
- package/src/sync/errors.ts +14 -12
- package/src/sync/mock-sync-backend.test.ts +78 -0
- package/src/sync/mock-sync-backend.ts +93 -47
- package/src/sync/next/history-dag-common.ts +60 -34
- package/src/sync/next/history-dag.ts +4 -1
- package/src/sync/next/test/compact-events.calculator.test.ts +2 -2
- package/src/sync/next/test/event-fixtures.ts +1 -1
- package/src/sync/next/test/history-dag-common.test.ts +87 -0
- package/src/sync/sync-backend-kv.ts +4 -2
- package/src/sync/sync-backend.ts +15 -15
- package/src/sync/sync.ts +1 -1
- package/src/sync/syncstate.test.ts +191 -140
- package/src/sync/syncstate.ts +63 -53
- package/src/sync/transport-chunking.ts +34 -39
- package/src/util.ts +19 -9
- package/src/version.ts +1 -2
- package/dist/schema/state/sqlite/db-schema/hash.d.ts +0 -2
- package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +0 -1
- package/dist/schema/state/sqlite/db-schema/hash.js +0 -15
- package/dist/schema/state/sqlite/db-schema/hash.js.map +0 -1
- package/dist/sql-queries/misc.d.ts +0 -2
- package/dist/sql-queries/misc.d.ts.map +0 -1
- package/dist/sql-queries/misc.js +0 -2
- package/dist/sql-queries/misc.js.map +0 -1
- package/src/schema/state/sqlite/db-schema/hash.ts +0 -13
- package/src/sql-queries/misc.ts +0 -2
|
@@ -1,135 +1,153 @@
|
|
|
1
1
|
import { memoizeByRef } from '@livestore/utils'
|
|
2
|
-
import {
|
|
2
|
+
import { Effect, Option, ReadonlyArray as EffectArray, Schema, Stream } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
4
|
import { type SqliteDb, UnknownError } from './adapter-types.ts'
|
|
5
5
|
import type { MaterializeEvent } from './leader-thread/mod.ts'
|
|
6
|
+
import { STATE_REBUILD_BATCH_SIZE_DEFAULT, StateRebuildBatchSizeSchema } from './leader-thread/types.ts'
|
|
6
7
|
import type { EventDef, LiveStoreSchema } from './schema/mod.ts'
|
|
7
|
-
import { EventSequenceNumber, LiveStoreEvent,
|
|
8
|
+
import { EventSequenceNumber, LiveStoreEvent, SystemTables } from './schema/mod.ts'
|
|
9
|
+
import { withSavepoint } from './sqlite-db-helper.ts'
|
|
8
10
|
import type { PreparedBindValues } from './util.ts'
|
|
9
11
|
import { sql } from './util.ts'
|
|
10
12
|
|
|
11
13
|
/** Parse JSON string to unknown value */
|
|
12
|
-
const jsonParse = Schema.decodeUnknownSync(Schema.
|
|
14
|
+
const jsonParse = Schema.decodeUnknownSync(Schema.fromJsonString(Schema.Unknown))
|
|
13
15
|
|
|
14
16
|
export const rematerializeFromEventlog = Effect.fn('@livestore/common:rematerializeFromEventlog')(function* ({
|
|
15
17
|
dbEventlog,
|
|
16
18
|
// TODO re-use this db when bringing back the boot in-memory db implementation
|
|
17
|
-
|
|
19
|
+
dbState,
|
|
18
20
|
schema,
|
|
19
21
|
onProgress,
|
|
20
22
|
materializeEvent,
|
|
23
|
+
batchSize = STATE_REBUILD_BATCH_SIZE_DEFAULT,
|
|
21
24
|
}: {
|
|
22
25
|
dbEventlog: SqliteDb
|
|
23
|
-
|
|
26
|
+
dbState: SqliteDb
|
|
24
27
|
schema: LiveStoreSchema
|
|
25
28
|
onProgress: (_: { done: number; total: number }) => Effect.Effect<void>
|
|
26
29
|
materializeEvent: MaterializeEvent
|
|
30
|
+
batchSize?: number
|
|
27
31
|
}) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
// Old snapshots can contain newer events. Skip until the runtime has
|
|
62
|
-
// been updated; the event stays in the log for future replays.
|
|
63
|
-
return
|
|
64
|
-
}
|
|
32
|
+
if (Schema.is(StateRebuildBatchSizeSchema)(batchSize) === false) {
|
|
33
|
+
return yield* UnknownError.make({
|
|
34
|
+
cause: `Invalid stateRebuildBatchSize: ${String(batchSize)}. Expected a positive integer.`,
|
|
35
|
+
payload: { batchSize },
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const eventsCount = dbEventlog.select<{ count: number }>(
|
|
40
|
+
`SELECT COUNT(*) AS count FROM ${SystemTables.EVENTLOG_META_TABLE}`,
|
|
41
|
+
)[0]!.count
|
|
42
|
+
|
|
43
|
+
const hashEventDef = memoizeByRef((event: EventDef.AnyWithoutFn) => Schema.hash(event.schema))
|
|
44
|
+
|
|
45
|
+
const processEvent = Effect.fn(`@livestore/common:rematerializeFromEventlog:processEvent`)(function* (
|
|
46
|
+
row: SystemTables.EventlogMetaRow,
|
|
47
|
+
) {
|
|
48
|
+
const args = jsonParse(row.argsJson)
|
|
49
|
+
const eventEncoded = LiveStoreEvent.Client.EncodedWithMeta.make({
|
|
50
|
+
name: row.name,
|
|
51
|
+
args,
|
|
52
|
+
seqNum: {
|
|
53
|
+
global: row.seqNumGlobal,
|
|
54
|
+
client: row.seqNumClient,
|
|
55
|
+
rebaseGeneration: row.seqNumRebaseGeneration,
|
|
56
|
+
},
|
|
57
|
+
parentSeqNum: {
|
|
58
|
+
global: row.parentSeqNumGlobal,
|
|
59
|
+
client: row.parentSeqNumClient,
|
|
60
|
+
rebaseGeneration: row.parentSeqNumRebaseGeneration,
|
|
61
|
+
},
|
|
62
|
+
clientId: row.clientId,
|
|
63
|
+
sessionId: row.sessionId,
|
|
64
|
+
})
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
const eventDef = schema.eventsDefsMap.get(row.name)
|
|
67
|
+
const materializer = schema.state.materializers.get(row.name)
|
|
67
68
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
69
|
+
if (eventDef === undefined || materializer === undefined) {
|
|
70
|
+
// Route unknown events through the normal materialization boundary so
|
|
71
|
+
// they advance the state snapshot head as no-ops.
|
|
72
|
+
yield* materializeEvent(eventEncoded, { skipEventlog: true })
|
|
73
|
+
return
|
|
74
|
+
}
|
|
73
75
|
|
|
74
|
-
|
|
75
|
-
yield*
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
if (hashEventDef(eventDef) !== row.schemaHash) {
|
|
77
|
+
yield* Effect.logWarning(
|
|
78
|
+
`Schema hash mismatch for event definition ${row.name}. Trying to materialize event anyway.`,
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Checking whether the schema has changed in an incompatible way
|
|
83
|
+
yield* Schema.decodeUnknownEffect(eventDef.schema)(args).pipe(
|
|
84
|
+
Effect.mapError((cause) =>
|
|
85
|
+
UnknownError.make({
|
|
86
|
+
cause,
|
|
87
|
+
note: `\
|
|
80
88
|
There was an error during rematerializing from the eventlog while decoding
|
|
81
89
|
the persisted event args for event definition "${row.name}".
|
|
82
90
|
This likely means the schema has changed in an incompatible way.
|
|
83
91
|
`,
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
yield* materializeEvent(eventEncoded, { skipEventlog: true })
|
|
89
|
-
})
|
|
92
|
+
}),
|
|
93
|
+
),
|
|
94
|
+
)
|
|
90
95
|
|
|
91
|
-
|
|
96
|
+
yield* materializeEvent(eventEncoded, { skipEventlog: true })
|
|
97
|
+
})
|
|
92
98
|
|
|
93
|
-
|
|
99
|
+
const stmt = dbEventlog.prepare(sql`\
|
|
94
100
|
SELECT * FROM ${SystemTables.EVENTLOG_META_TABLE}
|
|
95
101
|
WHERE seqNumGlobal > $seqNumGlobal OR (seqNumGlobal = $seqNumGlobal AND seqNumClient > $seqNumClient)
|
|
96
102
|
ORDER BY seqNumGlobal ASC, seqNumClient ASC
|
|
97
|
-
LIMIT $
|
|
103
|
+
LIMIT $batchSize
|
|
98
104
|
`)
|
|
99
105
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
SystemTables.EventlogMetaRow
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
106
|
+
let processedEvents = 0
|
|
107
|
+
|
|
108
|
+
yield* Stream.paginate(EventSequenceNumber.Client.ROOT, (lastId) =>
|
|
109
|
+
Effect.sync(() => {
|
|
110
|
+
const rows = stmt.select<SystemTables.EventlogMetaRow>({
|
|
111
|
+
$seqNumGlobal: lastId.global,
|
|
112
|
+
$seqNumClient: lastId.client,
|
|
113
|
+
$batchSize: batchSize,
|
|
114
|
+
} as any as PreparedBindValues)
|
|
115
|
+
|
|
116
|
+
if (EffectArray.isReadonlyArrayNonEmpty(rows) === false) {
|
|
117
|
+
const done: readonly [
|
|
118
|
+
ReadonlyArray<SystemTables.EventlogMetaRow>,
|
|
119
|
+
Option.Option<EventSequenceNumber.Client.Composite>,
|
|
120
|
+
] = [rows, Option.none()]
|
|
121
|
+
return done
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const lastRow = EffectArray.lastNonEmpty(rows)
|
|
125
|
+
const nextCursor = EventSequenceNumber.Client.Composite.make({
|
|
126
|
+
global: lastRow.seqNumGlobal,
|
|
127
|
+
client: lastRow.seqNumClient,
|
|
128
|
+
rebaseGeneration: lastRow.seqNumRebaseGeneration,
|
|
129
|
+
})
|
|
130
|
+
const next: readonly [
|
|
131
|
+
ReadonlyArray<SystemTables.EventlogMetaRow>,
|
|
132
|
+
Option.Option<EventSequenceNumber.Client.Composite>,
|
|
133
|
+
] = [rows, Option.some(nextCursor)]
|
|
134
|
+
return next
|
|
135
|
+
}),
|
|
136
|
+
).pipe(
|
|
137
|
+
Stream.bufferArray({ capacity: 2 }),
|
|
138
|
+
Stream.runForEachArray((rows) =>
|
|
139
|
+
Effect.forEach(
|
|
140
|
+
rows,
|
|
141
|
+
(row) =>
|
|
142
|
+
Effect.gen(function* () {
|
|
143
|
+
yield* processEvent(row)
|
|
144
|
+
|
|
145
|
+
processedEvents++
|
|
146
|
+
yield* onProgress({ done: processedEvents, total: eventsCount })
|
|
147
|
+
}),
|
|
148
|
+
{ discard: true },
|
|
149
|
+
).pipe(withSavepoint(dbState)),
|
|
150
|
+
),
|
|
151
|
+
Effect.ensuring(Effect.sync(() => stmt.finalize())),
|
|
152
|
+
)
|
|
135
153
|
}, Effect.withPerformanceMeasure('@livestore/common:rematerializeFromEventlog'))
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { Schema } from '@livestore/utils/effect'
|
|
4
|
+
|
|
5
|
+
import { synced } from './define.ts'
|
|
6
|
+
|
|
7
|
+
describe('synced event wire schema', () => {
|
|
8
|
+
const occurredAt = new Date('2026-07-17T10:15:30.000Z')
|
|
9
|
+
const event = synced({
|
|
10
|
+
name: 'v1.Occurred',
|
|
11
|
+
schema: Schema.Struct({
|
|
12
|
+
occurredAt: Schema.DateFromString,
|
|
13
|
+
}),
|
|
14
|
+
})
|
|
15
|
+
const jsonSchema = Schema.fromJsonString(event.schema)
|
|
16
|
+
|
|
17
|
+
test('roundtrips a valid date through JSON', () => {
|
|
18
|
+
const encoded = Schema.encodeSync(jsonSchema)({ occurredAt })
|
|
19
|
+
|
|
20
|
+
expect(encoded).toBe('{"occurredAt":"2026-07-17T10:15:30.000Z"}')
|
|
21
|
+
expect(Schema.decodeSync(jsonSchema)(encoded)).toEqual({ occurredAt })
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
test('rejects invalid dates on encode and decode', () => {
|
|
25
|
+
expect(() => Schema.encodeSync(jsonSchema)({ occurredAt: new Date(Number.NaN) })).toThrow()
|
|
26
|
+
expect(() => Schema.decodeSync(jsonSchema)('{"occurredAt":"not-a-date"}')).toThrow()
|
|
27
|
+
})
|
|
28
|
+
})
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
*/
|
|
30
30
|
|
|
31
31
|
import { shouldNeverHappen } from '@livestore/utils'
|
|
32
|
-
import { Schema } from '@livestore/utils/effect'
|
|
32
|
+
import { Result, Schema } from '@livestore/utils/effect'
|
|
33
33
|
|
|
34
34
|
import type { EventDef } from './event-def.ts'
|
|
35
35
|
import type { EventDefFactInput, EventDefFacts } from './facts.ts'
|
|
@@ -105,15 +105,15 @@ export type DefineEventOptions<TTo, TDerived extends boolean = false> = {
|
|
|
105
105
|
export const defineEvent = <TName extends string, TType, TEncoded = TType, TDerived extends boolean = false>(
|
|
106
106
|
args: {
|
|
107
107
|
name: TName
|
|
108
|
-
schema: Schema.
|
|
108
|
+
schema: Schema.Codec<TType, TEncoded>
|
|
109
109
|
} & DefineEventOptions<TType, TDerived>,
|
|
110
110
|
): EventDef<TName, TType, TEncoded, TDerived> => {
|
|
111
111
|
const { name, schema, ...options } = args
|
|
112
112
|
|
|
113
113
|
const makePartialEvent = (args: TType) => {
|
|
114
|
-
const res = Schema.
|
|
115
|
-
if (res
|
|
116
|
-
shouldNeverHappen(`Invalid event args for event '${name}':`, res.
|
|
114
|
+
const res = Schema.decodeResult(Schema.toType(schema))(args)
|
|
115
|
+
if (Result.isFailure(res) === true) {
|
|
116
|
+
shouldNeverHappen(`Invalid event args for event '${name}':`, res.failure.message, '\n')
|
|
117
117
|
}
|
|
118
118
|
return { name: name, args }
|
|
119
119
|
}
|
|
@@ -127,18 +127,19 @@ export const defineEvent = <TName extends string, TType, TEncoded = TType, TDeri
|
|
|
127
127
|
Object.defineProperty(makePartialEvent, 'options', {
|
|
128
128
|
value: {
|
|
129
129
|
clientOnly: options?.clientOnly ?? false,
|
|
130
|
-
facts:
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
130
|
+
facts:
|
|
131
|
+
options?.facts !== undefined
|
|
132
|
+
? (args, currentFacts) => {
|
|
133
|
+
const res = options.facts!(args, currentFacts)
|
|
134
|
+
return {
|
|
135
|
+
modify: {
|
|
136
|
+
set: res.modify?.set !== undefined ? new Set(res.modify.set) : new Set(),
|
|
137
|
+
unset: res.modify?.unset !== undefined ? new Set(res.modify.unset) : new Set(),
|
|
138
|
+
},
|
|
139
|
+
require: res.require !== undefined ? new Set(res.require) : new Set(),
|
|
140
|
+
}
|
|
139
141
|
}
|
|
140
|
-
|
|
141
|
-
: undefined,
|
|
142
|
+
: undefined,
|
|
142
143
|
derived: options?.derived ?? false,
|
|
143
144
|
deprecated: options?.deprecated,
|
|
144
145
|
} satisfies EventDef.Any['options'],
|
|
@@ -178,7 +179,7 @@ export const defineEvent = <TName extends string, TType, TEncoded = TType, TDeri
|
|
|
178
179
|
export const synced = <TName extends string, TType, TEncoded = TType>(
|
|
179
180
|
args: {
|
|
180
181
|
name: TName
|
|
181
|
-
schema: Schema.
|
|
182
|
+
schema: Schema.Codec<TType, TEncoded>
|
|
182
183
|
} & Omit<DefineEventOptions<TType>, 'derived' | 'clientOnly'>,
|
|
183
184
|
): EventDef<TName, TType, TEncoded> => defineEvent({ ...args, clientOnly: false })
|
|
184
185
|
|
|
@@ -201,7 +202,7 @@ export const synced = <TName extends string, TType, TEncoded = TType>(
|
|
|
201
202
|
* name: 'UiStateSet',
|
|
202
203
|
* schema: Schema.Struct({
|
|
203
204
|
* selectedTodoId: Schema.NullOr(Schema.String),
|
|
204
|
-
* filterMode: Schema.
|
|
205
|
+
* filterMode: Schema.Literals(['all', 'active', 'completed']),
|
|
205
206
|
* }),
|
|
206
207
|
* })
|
|
207
208
|
*
|
|
@@ -212,6 +213,6 @@ export const synced = <TName extends string, TType, TEncoded = TType>(
|
|
|
212
213
|
export const clientOnly = <TName extends string, TType, TEncoded = TType>(
|
|
213
214
|
args: {
|
|
214
215
|
name: TName
|
|
215
|
-
schema: Schema.
|
|
216
|
+
schema: Schema.Codec<TType, TEncoded>
|
|
216
217
|
} & Omit<DefineEventOptions<TType>, 'derived' | 'clientOnly'>,
|
|
217
218
|
): EventDef<TName, TType, TEncoded> => defineEvent({ ...args, clientOnly: true })
|
|
@@ -60,14 +60,7 @@ describe('logDeprecationWarnings', () => {
|
|
|
60
60
|
|
|
61
61
|
const run = (effect: Effect.Effect<void>) =>
|
|
62
62
|
Effect.runSync(
|
|
63
|
-
effect.pipe(
|
|
64
|
-
Effect.provide(
|
|
65
|
-
Logger.replace(
|
|
66
|
-
Logger.defaultLogger,
|
|
67
|
-
Logger.make(({ message }) => logs.push(message as unknown[])),
|
|
68
|
-
),
|
|
69
|
-
),
|
|
70
|
-
),
|
|
63
|
+
effect.pipe(Effect.provide(Logger.layer([Logger.make(({ message }) => logs.push(message as unknown[]))]))),
|
|
71
64
|
)
|
|
72
65
|
|
|
73
66
|
test('logs event deprecation warning', () => {
|
|
@@ -30,20 +30,19 @@
|
|
|
30
30
|
* @module
|
|
31
31
|
*/
|
|
32
32
|
|
|
33
|
-
import type
|
|
34
|
-
import { Effect, Option, SchemaAST } from '@livestore/utils/effect'
|
|
33
|
+
import { type Schema, Effect, Option, SchemaAST } from '@livestore/utils/effect'
|
|
35
34
|
|
|
36
35
|
import type { EventDef } from './event-def.ts'
|
|
37
36
|
|
|
38
|
-
/**
|
|
39
|
-
export const DeprecatedId =
|
|
37
|
+
/** Annotation key used to mark schemas as deprecated. */
|
|
38
|
+
export const DeprecatedId = 'livestore/schema/annotations/deprecated'
|
|
40
39
|
|
|
41
40
|
/**
|
|
42
41
|
* Marks a schema field as deprecated with a reason message.
|
|
43
42
|
* When an event is committed with a deprecated field that has a value,
|
|
44
43
|
* a warning will be logged.
|
|
45
44
|
*
|
|
46
|
-
* Works with
|
|
45
|
+
* Works with Schema fields, including optional fields from Schema.optional.
|
|
47
46
|
*
|
|
48
47
|
* @param reason - Explanation of why this field is deprecated and what to use instead
|
|
49
48
|
* @returns A function that adds the deprecation annotation to the schema
|
|
@@ -58,8 +57,8 @@ export const DeprecatedId = Symbol.for('livestore/schema/annotations/deprecated'
|
|
|
58
57
|
*/
|
|
59
58
|
export const deprecated =
|
|
60
59
|
(reason: string) =>
|
|
61
|
-
<T extends
|
|
62
|
-
schema.
|
|
60
|
+
<T extends Schema.Top>(schema: T): T['Rebuild'] =>
|
|
61
|
+
schema.annotate({ [DeprecatedId]: reason })
|
|
63
62
|
|
|
64
63
|
/**
|
|
65
64
|
* Checks if a schema has a deprecation annotation.
|
|
@@ -67,8 +66,8 @@ export const deprecated =
|
|
|
67
66
|
* @param schema - The schema to check
|
|
68
67
|
* @returns The deprecation reason if deprecated, None otherwise
|
|
69
68
|
*/
|
|
70
|
-
export const getDeprecatedReason =
|
|
71
|
-
SchemaAST.
|
|
69
|
+
export const getDeprecatedReason = (schema: Schema.Top): Option.Option<string> =>
|
|
70
|
+
Option.fromUndefinedOr(SchemaAST.resolveAt<string>(DeprecatedId)(schema.ast))
|
|
72
71
|
|
|
73
72
|
/**
|
|
74
73
|
* Checks if a schema is deprecated.
|
|
@@ -76,8 +75,7 @@ export const getDeprecatedReason = <A, I, R>(schema: Schema.Schema<A, I, R>): Op
|
|
|
76
75
|
* @param schema - The schema to check
|
|
77
76
|
* @returns true if the schema is deprecated
|
|
78
77
|
*/
|
|
79
|
-
export const isDeprecated =
|
|
80
|
-
Option.isSome(getDeprecatedReason(schema))
|
|
78
|
+
export const isDeprecated = (schema: Schema.Top): boolean => Option.isSome(getDeprecatedReason(schema))
|
|
81
79
|
|
|
82
80
|
/**
|
|
83
81
|
* Finds deprecated fields with values in the given event arguments.
|
|
@@ -88,28 +86,27 @@ export const isDeprecated = <A, I, R>(schema: Schema.Schema<A, I, R>): boolean =
|
|
|
88
86
|
* @returns Array of objects containing field name and deprecation reason
|
|
89
87
|
*/
|
|
90
88
|
export const findDeprecatedFieldsWithValues = (
|
|
91
|
-
schema: Schema.
|
|
89
|
+
schema: Schema.Top,
|
|
92
90
|
args: Record<string, unknown>,
|
|
93
91
|
): Array<{ field: string; reason: string }> => {
|
|
94
92
|
const result: Array<{ field: string; reason: string }> = []
|
|
95
|
-
const ast = schema.ast
|
|
93
|
+
const ast = SchemaAST.toType(schema.ast)
|
|
96
94
|
|
|
97
|
-
// Handle
|
|
98
|
-
if (ast
|
|
95
|
+
// Handle Objects (Struct) schemas
|
|
96
|
+
if (SchemaAST.isObjects(ast) === true) {
|
|
99
97
|
for (const prop of ast.propertySignatures) {
|
|
100
98
|
const fieldName = String(prop.name)
|
|
101
99
|
const fieldValue = args[fieldName]
|
|
102
100
|
|
|
103
101
|
// Only check fields that have a value (not undefined)
|
|
104
102
|
if (fieldValue !== undefined) {
|
|
105
|
-
// Check deprecation on the property
|
|
106
|
-
const
|
|
107
|
-
const deprecationReason = propAnnotations?.[DeprecatedId] as string | undefined
|
|
103
|
+
// Check deprecation on the property key itself (for Schema.optional(...).pipe(deprecated(...)))
|
|
104
|
+
const deprecationReason = prop.type.context?.annotations?.[DeprecatedId] as string | undefined
|
|
108
105
|
|
|
109
106
|
// Also check deprecation on the type (for direct field deprecation)
|
|
110
|
-
const typeDeprecation = SchemaAST.
|
|
107
|
+
const typeDeprecation = SchemaAST.resolveAt<string>(DeprecatedId)(prop.type)
|
|
111
108
|
|
|
112
|
-
const reason = deprecationReason ??
|
|
109
|
+
const reason = deprecationReason ?? typeDeprecation
|
|
113
110
|
if (reason !== undefined) {
|
|
114
111
|
result.push({ field: fieldName, reason })
|
|
115
112
|
}
|
|
@@ -34,7 +34,7 @@ export type EventDef<TName extends string, TType, TEncoded = TType, TDerived ext
|
|
|
34
34
|
name: TName
|
|
35
35
|
|
|
36
36
|
/** Effect Schema used for validating and encoding/decoding event arguments. */
|
|
37
|
-
schema: Schema.
|
|
37
|
+
schema: Schema.Codec<TType, TEncoded>
|
|
38
38
|
|
|
39
39
|
options: {
|
|
40
40
|
/**
|
|
@@ -62,9 +62,7 @@ export type EventDef<TName extends string, TType, TEncoded = TType, TDerived ext
|
|
|
62
62
|
* Callable signature - creates a partial event with decoded arguments.
|
|
63
63
|
* The returned object can be passed directly to `store.commit()`.
|
|
64
64
|
*/
|
|
65
|
-
(
|
|
66
|
-
args: TType,
|
|
67
|
-
): {
|
|
65
|
+
(args: TType): {
|
|
68
66
|
name: TName
|
|
69
67
|
args: TType
|
|
70
68
|
}
|
|
@@ -8,7 +8,7 @@ export type Type = Brand.Branded<number, 'ClientEventSequenceNumber'>
|
|
|
8
8
|
const ClientBrand = Brand.nominal<Type>()
|
|
9
9
|
|
|
10
10
|
/** Effect Schema for encoding/decoding client sequence numbers. */
|
|
11
|
-
export const Schema = S.fromBrand(ClientBrand)(S.Int)
|
|
11
|
+
export const Schema = S.fromBrand('ClientEventSequenceNumber', ClientBrand)(S.Int)
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Creates a branded client sequence number from a plain number.
|
|
@@ -177,27 +177,13 @@ const CompositeSchema = S.Struct({
|
|
|
177
177
|
client: Schema,
|
|
178
178
|
// Client only
|
|
179
179
|
rebaseGeneration: S.Int,
|
|
180
|
-
}).annotations({
|
|
181
|
-
title: 'EventSequenceNumber.Composite',
|
|
182
|
-
pretty: () => (seqNum) => toString(seqNum),
|
|
183
180
|
})
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
* Creates a validated Composite sequence number from input.
|
|
187
|
-
* If rebaseGeneration is omitted, defaults to REBASE_GENERATION_DEFAULT (0).
|
|
188
|
-
*/
|
|
189
|
-
const makeComposite = (seqNum: CompositeInput): Composite => {
|
|
190
|
-
return S.is(CompositeSchema)(seqNum) === true
|
|
191
|
-
? seqNum
|
|
192
|
-
: S.decodeSync(CompositeSchema)({
|
|
193
|
-
...seqNum,
|
|
194
|
-
rebaseGeneration: seqNum.rebaseGeneration ?? REBASE_GENERATION_DEFAULT,
|
|
195
|
-
})
|
|
196
|
-
}
|
|
181
|
+
.annotate({ title: 'EventSequenceNumber.Composite' })
|
|
182
|
+
.pipe(S.overrideToFormatter(() => (seqNum) => toString(seqNum)))
|
|
197
183
|
|
|
198
184
|
/**
|
|
199
185
|
* Effect Schema for the composite event sequence number (global + client + rebaseGeneration).
|
|
200
|
-
*
|
|
186
|
+
* Its `make` validates input and defaults an omitted rebaseGeneration to REBASE_GENERATION_DEFAULT (0).
|
|
201
187
|
*
|
|
202
188
|
* @example
|
|
203
189
|
* ```ts
|
|
@@ -210,7 +196,17 @@ const makeComposite = (seqNum: CompositeInput): Composite => {
|
|
|
210
196
|
* const validated = EventSequenceNumber.Client.Composite.make({ global: 5, client: 0, rebaseGeneration: 0 })
|
|
211
197
|
* ```
|
|
212
198
|
*/
|
|
213
|
-
export const Composite
|
|
199
|
+
export const Composite: typeof CompositeSchema & { make(seqNum: CompositeInput): Composite } =
|
|
200
|
+
class extends CompositeSchema {
|
|
201
|
+
static override make(seqNum: CompositeInput): Composite {
|
|
202
|
+
return S.is(CompositeSchema)(seqNum) === true
|
|
203
|
+
? seqNum
|
|
204
|
+
: S.decodeSync(CompositeSchema)({
|
|
205
|
+
...seqNum,
|
|
206
|
+
rebaseGeneration: seqNum.rebaseGeneration ?? REBASE_GENERATION_DEFAULT,
|
|
207
|
+
})
|
|
208
|
+
}
|
|
209
|
+
}
|
|
214
210
|
|
|
215
211
|
/** The root sequence number (global=0, client=0, rebaseGeneration=0). Parent of the first event. */
|
|
216
212
|
export const ROOT = {
|
|
@@ -222,19 +218,19 @@ export const ROOT = {
|
|
|
222
218
|
/**
|
|
223
219
|
* Computes the next sequence number and its parent based on the current position.
|
|
224
220
|
*
|
|
225
|
-
* For client-
|
|
226
|
-
* For global events (
|
|
221
|
+
* For client-only events (isClientOnly=true): increments the client component, keeps global.
|
|
222
|
+
* For global events (isClientOnly=false): increments global, resets client to 0.
|
|
227
223
|
*/
|
|
228
224
|
export const nextPair = ({
|
|
229
225
|
seqNum,
|
|
230
|
-
|
|
226
|
+
isClientOnly,
|
|
231
227
|
rebaseGeneration,
|
|
232
228
|
}: {
|
|
233
229
|
seqNum: Composite
|
|
234
|
-
|
|
230
|
+
isClientOnly: boolean
|
|
235
231
|
rebaseGeneration?: number
|
|
236
232
|
}): CompositePair => {
|
|
237
|
-
if (
|
|
233
|
+
if (isClientOnly === true) {
|
|
238
234
|
return {
|
|
239
235
|
seqNum: {
|
|
240
236
|
global: seqNum.global,
|
|
@@ -6,7 +6,7 @@ export type Type = Brand.Branded<number, 'GlobalEventSequenceNumber'>
|
|
|
6
6
|
const GlobalBrand = Brand.nominal<Type>()
|
|
7
7
|
|
|
8
8
|
/** Effect Schema for encoding/decoding global sequence numbers. */
|
|
9
|
-
export const Schema = S.fromBrand(GlobalBrand)(S.Int)
|
|
9
|
+
export const Schema = S.fromBrand('GlobalEventSequenceNumber', GlobalBrand)(S.Int)
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Creates a branded global sequence number from a plain number.
|
|
@@ -7,12 +7,12 @@ import { EventSequenceNumber } from './mod.ts'
|
|
|
7
7
|
Vitest.describe('EventSequenceNumber', () => {
|
|
8
8
|
Vitest.test('nextPair (no rebase)', () => {
|
|
9
9
|
const e_0_0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })
|
|
10
|
-
expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0,
|
|
10
|
+
expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: false }).seqNum).toStrictEqual({
|
|
11
11
|
global: 1,
|
|
12
12
|
client: 0,
|
|
13
13
|
rebaseGeneration: 0,
|
|
14
14
|
})
|
|
15
|
-
expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0,
|
|
15
|
+
expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: true }).seqNum).toStrictEqual({
|
|
16
16
|
global: 0,
|
|
17
17
|
client: 1,
|
|
18
18
|
rebaseGeneration: 0,
|
|
@@ -22,14 +22,14 @@ Vitest.describe('EventSequenceNumber', () => {
|
|
|
22
22
|
Vitest.test('nextPair (rebase)', () => {
|
|
23
23
|
const e_0_0 = EventSequenceNumber.Client.Composite.make({ global: 0, client: 0 })
|
|
24
24
|
expect(
|
|
25
|
-
EventSequenceNumber.Client.nextPair({ seqNum: e_0_0,
|
|
25
|
+
EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: false, rebaseGeneration: 1 }).seqNum,
|
|
26
26
|
).toStrictEqual({
|
|
27
27
|
global: 1,
|
|
28
28
|
client: 0,
|
|
29
29
|
rebaseGeneration: 1,
|
|
30
30
|
})
|
|
31
31
|
expect(
|
|
32
|
-
EventSequenceNumber.Client.nextPair({ seqNum: e_0_0,
|
|
32
|
+
EventSequenceNumber.Client.nextPair({ seqNum: e_0_0, isClientOnly: true, rebaseGeneration: 1 }).seqNum,
|
|
33
33
|
).toStrictEqual({
|
|
34
34
|
global: 0,
|
|
35
35
|
client: 1,
|
|
@@ -37,7 +37,7 @@ Vitest.describe('EventSequenceNumber', () => {
|
|
|
37
37
|
})
|
|
38
38
|
|
|
39
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,
|
|
40
|
+
expect(EventSequenceNumber.Client.nextPair({ seqNum: e_0_0_g1, isClientOnly: false }).seqNum).toStrictEqual({
|
|
41
41
|
global: 1,
|
|
42
42
|
client: 0,
|
|
43
43
|
rebaseGeneration: 2,
|