@livestore/common 0.4.0 → 0.5.0-dev.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 +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 +1 -1
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/__tests__/fixture.js +3 -3
- package/dist/__tests__/fixture.js.map +1 -1
- package/dist/adapter-types.d.ts +29 -57
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +20 -37
- package/dist/adapter-types.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 +28 -41
- 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 +1 -0
- package/dist/devtools/devtools-compatibility.test.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +520 -332
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +76 -74
- 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 +5 -5
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +405 -343
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +101 -89
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- 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 +9 -5
- 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 +18 -16
- 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 +66 -18
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +519 -461
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/RejectedPushError.d.ts +67 -36
- package/dist/leader-thread/RejectedPushError.d.ts.map +1 -1
- package/dist/leader-thread/RejectedPushError.js +24 -5
- 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 +9 -8
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +4 -4
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +6 -6
- 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 +33 -17
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +9 -5
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +25 -35
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.js +7 -7
- 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 +4 -0
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +18 -39
- 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 +13 -16
- package/dist/leader-thread/stream-events.js.map +1 -1
- package/dist/leader-thread/types.d.ts +32 -69
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +5 -5
- 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 +1 -2
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +3 -3
- 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 +7 -35
- 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.map +1 -1
- package/dist/rematerialize-from-eventlog.js +28 -26
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +4 -4
- 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 +1 -1
- 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/EventSequenceNumber/client.d.ts +12 -12
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
- package/dist/schema/EventSequenceNumber/client.js +8 -9
- 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.test.js +5 -5
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.d.ts +50 -179
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/client.js +32 -29
- package/dist/schema/LiveStoreEvent/client.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.test.js +11 -2
- 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 +1 -1
- package/dist/schema/LiveStoreEvent/global.js.map +1 -1
- package/dist/schema/LiveStoreEvent/input.d.ts +5 -5
- 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/mod.d.ts +1 -0
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +1 -0
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +3 -2
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +12 -17
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +23 -20
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +29 -8
- 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 +57 -31
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +118 -72
- package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +2 -2
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +13 -4
- 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 +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 +8 -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 +27 -16
- 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 +5 -3
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- 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 +1 -1
- 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 +27 -23
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts +3 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +16 -14
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +362 -596
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- 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 +2 -2
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +328 -106
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -1
- package/dist/schema/state/sqlite/system-tables/state-tables.js +33 -1
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.d.ts +16 -19
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +53 -3
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +153 -36
- 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 +2 -1
- package/dist/schema/unknown-events.js.map +1 -1
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +2 -2
- 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/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +8 -10
- package/dist/sql-queries/sql-queries.js.map +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 +21 -1
- package/dist/sqlite-db-helper.d.ts.map +1 -1
- package/dist/sqlite-db-helper.js +37 -2
- 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 +38 -16
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +196 -66
- 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 +2 -2
- package/dist/sync/errors.js.map +1 -1
- 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 +54 -33
- 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/history-dag-common.d.ts +4 -0
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +52 -31
- 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 +2 -1
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
- package/dist/sync/next/test/event-fixtures.d.ts +7 -7
- package/dist/sync/next/test/event-fixtures.js +1 -1
- 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/sync-backend-kv.d.ts.map +1 -1
- package/dist/sync/sync-backend-kv.js +4 -2
- 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 +9 -5
- 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/syncstate.d.ts +97 -173
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +34 -37
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +100 -61
- 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/util.d.ts +11 -4
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +19 -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 +19 -37
- 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 +24 -61
- package/src/debug-info.ts +50 -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 +794 -691
- package/src/leader-thread/RejectedPushError.ts +40 -27
- package/src/leader-thread/connection.ts +12 -8
- package/src/leader-thread/eventlog.ts +7 -7
- package/src/leader-thread/leader-worker-devtools.ts +37 -19
- package/src/leader-thread/make-leader-thread-layer.test.ts +7 -7
- package/src/leader-thread/make-leader-thread-layer.ts +56 -53
- package/src/leader-thread/materialize-event.ts +13 -8
- package/src/leader-thread/recreate-db.ts +24 -59
- package/src/leader-thread/shutdown-channel.ts +3 -14
- package/src/leader-thread/stream-events.ts +104 -101
- package/src/leader-thread/types.ts +24 -62
- package/src/logging.ts +5 -52
- package/src/make-client-session.ts +6 -6
- package/src/materializer-helper.ts +8 -37
- package/src/otel.ts +5 -14
- package/src/rematerialize-from-eventlog.ts +97 -94
- 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 +8 -9
- 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 +3 -2
- package/src/schema/state/sqlite/client-document-def.test.ts +32 -13
- 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 +132 -77
- package/src/schema/state/sqlite/column-def.ts +72 -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/sqlite.ts +15 -5
- 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 +25 -31
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +35 -21
- package/src/schema/state/sqlite/mod.ts +2 -4
- 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 +31 -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 +41 -1
- package/src/schema/state/sqlite/table-def.test.ts +204 -66
- package/src/schema/state/sqlite/table-def.ts +96 -45
- package/src/schema/unknown-events.ts +3 -2
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +2 -2
- package/src/session-id-symbol.ts +59 -0
- package/src/sql-queries/sql-queries.ts +8 -12
- 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 +18 -9
- package/src/version.ts +1 -2
- 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/sql-queries/misc.ts +0 -2
|
@@ -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,10 +177,9 @@ 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
|
})
|
|
181
|
+
.annotate({ title: 'EventSequenceNumber.Composite' })
|
|
182
|
+
.pipe(S.overrideToFormatter(() => (seqNum) => toString(seqNum)))
|
|
184
183
|
|
|
185
184
|
/**
|
|
186
185
|
* Creates a validated Composite sequence number from input.
|
|
@@ -222,19 +221,19 @@ export const ROOT = {
|
|
|
222
221
|
/**
|
|
223
222
|
* Computes the next sequence number and its parent based on the current position.
|
|
224
223
|
*
|
|
225
|
-
* For client-
|
|
226
|
-
* For global events (
|
|
224
|
+
* For client-only events (isClientOnly=true): increments the client component, keeps global.
|
|
225
|
+
* For global events (isClientOnly=false): increments global, resets client to 0.
|
|
227
226
|
*/
|
|
228
227
|
export const nextPair = ({
|
|
229
228
|
seqNum,
|
|
230
|
-
|
|
229
|
+
isClientOnly,
|
|
231
230
|
rebaseGeneration,
|
|
232
231
|
}: {
|
|
233
232
|
seqNum: Composite
|
|
234
|
-
|
|
233
|
+
isClientOnly: boolean
|
|
235
234
|
rebaseGeneration?: number
|
|
236
235
|
}): CompositePair => {
|
|
237
|
-
if (
|
|
236
|
+
if (isClientOnly === true) {
|
|
238
237
|
return {
|
|
239
238
|
seqNum: {
|
|
240
239
|
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,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { expect } from 'vitest'
|
|
2
2
|
|
|
3
|
-
import { Option, Schema } from '@livestore/utils/effect'
|
|
4
3
|
import { Vitest } from '@livestore/utils-dev/node-vitest'
|
|
4
|
+
import { Option, Schema } from '@livestore/utils/effect'
|
|
5
5
|
|
|
6
6
|
import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
|
|
7
|
-
import { EncodedWithMeta, isEqualEncoded
|
|
7
|
+
import { type Encoded, EncodedWithMeta, isEqualEncoded } from './client.ts'
|
|
8
8
|
|
|
9
9
|
Vitest.describe('EncodedWithMeta', () => {
|
|
10
10
|
Vitest.test('toGlobal() produces numeric seqNums through JSON.stringify', () => {
|
|
@@ -107,10 +107,23 @@ Vitest.describe('isEqualEncoded', () => {
|
|
|
107
107
|
expect(isEqualEncoded(a, b)).toBe(true)
|
|
108
108
|
})
|
|
109
109
|
|
|
110
|
-
Vitest.it(
|
|
110
|
+
Vitest.it(
|
|
111
|
+
'should consider Effect Schema UndefinedOr-encoded args with explicit undefined equal to their JSON-roundtripped form',
|
|
112
|
+
() => {
|
|
113
|
+
const argsSchema = Schema.Struct({
|
|
114
|
+
id: Schema.String,
|
|
115
|
+
flag: Schema.UndefinedOr(Schema.Boolean),
|
|
116
|
+
})
|
|
117
|
+
const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc', flag: undefined } as any)
|
|
118
|
+
const wireArgs = JSON.parse(JSON.stringify(localArgs))
|
|
119
|
+
expect(isEqualEncoded(makeEncodedEvent(localArgs), makeEncodedEvent(wireArgs))).toBe(true)
|
|
120
|
+
},
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
Vitest.it('should consider Effect Schema optionalKey-encoded args equal to their JSON-roundtripped form', () => {
|
|
111
124
|
const argsSchema = Schema.Struct({
|
|
112
125
|
id: Schema.String,
|
|
113
|
-
|
|
126
|
+
label: Schema.optionalKey(Schema.String),
|
|
114
127
|
})
|
|
115
128
|
const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc' } as any)
|
|
116
129
|
const wireArgs = JSON.parse(JSON.stringify(localArgs))
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { deepEqual, memoizeByRef } from '@livestore/utils'
|
|
2
|
-
import { Option, Schema } from '@livestore/utils/effect'
|
|
2
|
+
import { Effect, Option, Schema, Struct } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
4
|
import type { EventDef } from '../EventDef/mod.ts'
|
|
5
5
|
import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
|
|
@@ -15,7 +15,7 @@ export const Decoded = Schema.Struct({
|
|
|
15
15
|
parentSeqNum: EventSequenceNumber.Client.Composite,
|
|
16
16
|
clientId: Schema.String,
|
|
17
17
|
sessionId: Schema.String,
|
|
18
|
-
}).
|
|
18
|
+
}).annotate({ title: 'LiveStoreEvent.Client.Decoded' })
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* Effect Schema for client events with encoded args.
|
|
@@ -45,7 +45,7 @@ export const Encoded = Schema.Struct({
|
|
|
45
45
|
parentSeqNum: EventSequenceNumber.Client.Composite,
|
|
46
46
|
clientId: Schema.String,
|
|
47
47
|
sessionId: Schema.String,
|
|
48
|
-
}).
|
|
48
|
+
}).annotate({ title: 'LiveStoreEvent.Client.Encoded' })
|
|
49
49
|
|
|
50
50
|
/** Event with composite sequence numbers and decoded (native TypeScript) args. */
|
|
51
51
|
export type Decoded = ForEventDef.Decoded<EventDef.Any>
|
|
@@ -73,36 +73,38 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEve
|
|
|
73
73
|
sessionId: Schema.String,
|
|
74
74
|
// TODO get rid of `meta` again by cleaning up the usage implementations
|
|
75
75
|
meta: Schema.Struct({
|
|
76
|
-
sessionChangeset: Schema.Union(
|
|
76
|
+
sessionChangeset: Schema.Union([
|
|
77
77
|
Schema.TaggedStruct('sessionChangeset', {
|
|
78
|
-
data: Schema.Uint8Array as any as Schema.
|
|
78
|
+
data: Schema.Uint8Array as any as Schema.Codec<Uint8Array<ArrayBuffer>>,
|
|
79
79
|
debug: Schema.Any.pipe(Schema.optional),
|
|
80
80
|
}),
|
|
81
81
|
Schema.TaggedStruct('no-op', {}),
|
|
82
82
|
Schema.TaggedStruct('unset', {}),
|
|
83
|
-
),
|
|
84
|
-
syncMetadata: Schema.Option(Schema.
|
|
83
|
+
]),
|
|
84
|
+
syncMetadata: Schema.Option(Schema.Json),
|
|
85
85
|
/** Used to detect if the materializer is side effecting (during dev) */
|
|
86
|
-
materializerHashLeader: Schema.Option(Schema.
|
|
87
|
-
materializerHashSession: Schema.Option(Schema.
|
|
88
|
-
})
|
|
89
|
-
Schema.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
86
|
+
materializerHashLeader: Schema.Option(Schema.Finite),
|
|
87
|
+
materializerHashSession: Schema.Option(Schema.Finite),
|
|
88
|
+
})
|
|
89
|
+
.mapFields(Struct.map(Schema.mutableKey))
|
|
90
|
+
.pipe(
|
|
91
|
+
Schema.withDecodingDefaultType(
|
|
92
|
+
Effect.succeed({
|
|
93
|
+
sessionChangeset: { _tag: 'unset' as const },
|
|
94
|
+
syncMetadata: Option.none(),
|
|
95
|
+
materializerHashLeader: Option.none(),
|
|
96
|
+
materializerHashSession: Option.none(),
|
|
97
|
+
}),
|
|
98
|
+
),
|
|
99
|
+
Schema.withConstructorDefault(
|
|
100
|
+
Effect.succeed({
|
|
101
|
+
sessionChangeset: { _tag: 'unset' as const },
|
|
102
|
+
syncMetadata: Option.none(),
|
|
103
|
+
materializerHashLeader: Option.none(),
|
|
104
|
+
materializerHashSession: Option.none(),
|
|
105
|
+
}),
|
|
106
|
+
),
|
|
107
|
+
),
|
|
106
108
|
}) {
|
|
107
109
|
toJSON = (): any => {
|
|
108
110
|
// Only used for logging/debugging
|
|
@@ -134,22 +136,22 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEve
|
|
|
134
136
|
*/
|
|
135
137
|
rebase = ({
|
|
136
138
|
parentSeqNum,
|
|
137
|
-
|
|
139
|
+
isClientOnly,
|
|
138
140
|
rebaseGeneration,
|
|
139
141
|
}: {
|
|
140
142
|
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
141
|
-
|
|
143
|
+
isClientOnly: boolean
|
|
142
144
|
rebaseGeneration: number
|
|
143
145
|
}) =>
|
|
144
146
|
new EncodedWithMeta({
|
|
145
147
|
...this,
|
|
146
|
-
...EventSequenceNumber.Client.nextPair({ seqNum: parentSeqNum,
|
|
148
|
+
...EventSequenceNumber.Client.nextPair({ seqNum: parentSeqNum, isClientOnly, rebaseGeneration }),
|
|
147
149
|
})
|
|
148
150
|
|
|
149
151
|
static fromGlobal = (
|
|
150
152
|
event: Global.Encoded,
|
|
151
153
|
meta: {
|
|
152
|
-
syncMetadata: Option.Option<Schema.
|
|
154
|
+
syncMetadata: Option.Option<Schema.Json>
|
|
153
155
|
materializerHashLeader: Option.Option<number>
|
|
154
156
|
materializerHashSession: Option.Option<number>
|
|
155
157
|
},
|
|
@@ -204,8 +206,7 @@ export const isEqualEncoded = (a: Encoded, b: Encoded) =>
|
|
|
204
206
|
a.sessionId === b.sessionId &&
|
|
205
207
|
deepEqual(canonicalizeArgs(a.args), canonicalizeArgs(b.args)) // TODO use schema equality here
|
|
206
208
|
|
|
207
|
-
const canonicalizeArgs = (args: unknown): unknown =>
|
|
208
|
-
args === undefined ? args : JSON.parse(JSON.stringify(args))
|
|
209
|
+
const canonicalizeArgs = (args: unknown): unknown => (args === undefined ? args : JSON.parse(JSON.stringify(args)))
|
|
209
210
|
|
|
210
211
|
/**
|
|
211
212
|
* Creates an Effect Schema union for all event types in a schema (with composite sequence numbers).
|
|
@@ -219,7 +220,7 @@ export const makeSchema = <TSchema extends LiveStoreSchema>(
|
|
|
219
220
|
schema: TSchema,
|
|
220
221
|
): ForEventDef.ForRecord<TSchema['_EventDefMapType']> =>
|
|
221
222
|
Schema.Union(
|
|
222
|
-
|
|
223
|
+
[...schema.eventsDefsMap.values()].map((def) =>
|
|
223
224
|
Schema.Struct({
|
|
224
225
|
name: Schema.Literal(def.name),
|
|
225
226
|
args: def.schema,
|
|
@@ -229,7 +230,7 @@ export const makeSchema = <TSchema extends LiveStoreSchema>(
|
|
|
229
230
|
sessionId: Schema.String,
|
|
230
231
|
}),
|
|
231
232
|
),
|
|
232
|
-
).
|
|
233
|
+
).annotate({ title: 'LiveStoreEvent.Client' }) as any
|
|
233
234
|
|
|
234
235
|
/** Memoized `makeSchema` - caches the generated schema by reference. */
|
|
235
236
|
export const makeSchemaMemo = memoizeByRef(makeSchema)
|
|
@@ -6,19 +6,19 @@ import type * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
|
|
|
6
6
|
/** Event without sequence numbers, with decoded (native TypeScript) args. Used as input to `store.commit()`. */
|
|
7
7
|
export type InputDecoded<TEventDef extends EventDef.Any> = {
|
|
8
8
|
name: TEventDef['name']
|
|
9
|
-
args:
|
|
9
|
+
args: TEventDef['schema']['Type']
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
/** Event without sequence numbers, with encoded (serialized) args. Used as input to `store.commit()`. */
|
|
13
13
|
export type InputEncoded<TEventDef extends EventDef.Any> = {
|
|
14
14
|
name: TEventDef['name']
|
|
15
|
-
args:
|
|
15
|
+
args: TEventDef['schema']['Encoded']
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
/** Full event with composite sequence numbers and decoded args. Includes clientId/sessionId for sync. */
|
|
19
19
|
export type Decoded<TEventDef extends EventDef.Any> = {
|
|
20
20
|
name: TEventDef['name']
|
|
21
|
-
args:
|
|
21
|
+
args: TEventDef['schema']['Type']
|
|
22
22
|
seqNum: EventSequenceNumber.Client.Composite
|
|
23
23
|
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
24
24
|
clientId: string
|
|
@@ -28,7 +28,7 @@ export type Decoded<TEventDef extends EventDef.Any> = {
|
|
|
28
28
|
/** Full event with composite sequence numbers and encoded args. Includes clientId/sessionId for sync. */
|
|
29
29
|
export type Encoded<TEventDef extends EventDef.Any> = {
|
|
30
30
|
name: TEventDef['name']
|
|
31
|
-
args:
|
|
31
|
+
args: TEventDef['schema']['Encoded']
|
|
32
32
|
seqNum: EventSequenceNumber.Client.Composite
|
|
33
33
|
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
34
34
|
clientId: string
|
|
@@ -36,11 +36,11 @@ export type Encoded<TEventDef extends EventDef.Any> = {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
/** Effect Schema union of all event types in an EventDefRecord (with composite sequence numbers). */
|
|
39
|
-
export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.
|
|
39
|
+
export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Codec<
|
|
40
40
|
{
|
|
41
41
|
[K in keyof TEventDefRecord]: {
|
|
42
42
|
name: K
|
|
43
|
-
args:
|
|
43
|
+
args: TEventDefRecord[K]['schema']['Type']
|
|
44
44
|
seqNum: EventSequenceNumber.Client.Composite
|
|
45
45
|
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
46
46
|
clientId: string
|
|
@@ -50,7 +50,7 @@ export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
|
|
|
50
50
|
{
|
|
51
51
|
[K in keyof TEventDefRecord]: {
|
|
52
52
|
name: K
|
|
53
|
-
args:
|
|
53
|
+
args: TEventDefRecord[K]['schema']['Encoded']
|
|
54
54
|
seqNum: EventSequenceNumber.Client.Composite
|
|
55
55
|
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
56
56
|
clientId: string
|
|
@@ -23,7 +23,7 @@ export const Encoded = Schema.Struct({
|
|
|
23
23
|
parentSeqNum: EventSequenceNumber.Global.Schema,
|
|
24
24
|
clientId: Schema.String,
|
|
25
25
|
sessionId: Schema.String,
|
|
26
|
-
}).
|
|
26
|
+
}).annotate({ title: 'LiveStoreEvent.Global.Encoded' })
|
|
27
27
|
|
|
28
28
|
/** Event with integer sequence numbers for sync backend wire format. */
|
|
29
29
|
export type Encoded = typeof Encoded.Type
|
|
@@ -15,7 +15,7 @@ import type * as ForEventDef from './for-event-def.ts'
|
|
|
15
15
|
export const Encoded = Schema.Struct({
|
|
16
16
|
name: Schema.String,
|
|
17
17
|
args: Schema.Any,
|
|
18
|
-
}).
|
|
18
|
+
}).annotate({ title: 'LiveStoreEvent.Input.Encoded' })
|
|
19
19
|
|
|
20
20
|
/** Event without sequence numbers, with decoded (native TypeScript) args. */
|
|
21
21
|
export type Decoded = ForEventDef.InputDecoded<EventDef.Any>
|
|
@@ -29,17 +29,17 @@ export type ForSchema<TSchema extends LiveStoreSchema> = {
|
|
|
29
29
|
}[keyof TSchema['_EventDefMapType']]
|
|
30
30
|
|
|
31
31
|
/** Effect Schema union of all event types in an EventDefRecord (input format, no sequence numbers). */
|
|
32
|
-
export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.
|
|
32
|
+
export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Codec<
|
|
33
33
|
{
|
|
34
34
|
[K in keyof TEventDefRecord]: {
|
|
35
35
|
name: K
|
|
36
|
-
args:
|
|
36
|
+
args: TEventDefRecord[K]['schema']['Type']
|
|
37
37
|
}
|
|
38
38
|
}[keyof TEventDefRecord],
|
|
39
39
|
{
|
|
40
40
|
[K in keyof TEventDefRecord]: {
|
|
41
41
|
name: K
|
|
42
|
-
args:
|
|
42
|
+
args: TEventDefRecord[K]['schema']['Encoded']
|
|
43
43
|
}
|
|
44
44
|
}[keyof TEventDefRecord]
|
|
45
45
|
>
|
|
@@ -54,10 +54,10 @@ export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
|
|
|
54
54
|
*/
|
|
55
55
|
export const makeSchema = <TSchema extends LiveStoreSchema>(schema: TSchema): ForRecord<TSchema['_EventDefMapType']> =>
|
|
56
56
|
Schema.Union(
|
|
57
|
-
|
|
57
|
+
[...schema.eventsDefsMap.values()].map((def) =>
|
|
58
58
|
Schema.Struct({
|
|
59
59
|
name: Schema.Literal(def.name),
|
|
60
60
|
args: def.schema,
|
|
61
61
|
}),
|
|
62
62
|
),
|
|
63
|
-
).
|
|
63
|
+
).annotate({ title: 'LiveStoreEvent.Input' }) as any
|
package/src/schema/mod.ts
CHANGED
|
@@ -5,6 +5,7 @@ export * as LiveStoreEvent from './LiveStoreEvent/mod.ts'
|
|
|
5
5
|
export * from './schema.ts'
|
|
6
6
|
export * as State from './state/mod.ts'
|
|
7
7
|
export { SqliteAst, SqliteDsl } from './state/sqlite/db-schema/mod.ts'
|
|
8
|
+
export * from './state/sqlite/persistence.ts'
|
|
8
9
|
export * from './state/sqlite/schema-helpers.ts'
|
|
9
10
|
export * as SystemTables from './state/sqlite/system-tables/mod.ts'
|
|
10
11
|
export type { UnknownEvents } from './unknown-events.ts'
|
package/src/schema/schema.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { shouldNeverHappen } from '@livestore/utils'
|
|
2
|
+
import { ReadonlyArray as EffectArray } from '@livestore/utils/effect'
|
|
2
3
|
|
|
3
4
|
import type { MigrationOptions } from '../adapter-types.ts'
|
|
4
5
|
import type { EventDef, EventDefRecord, Materializer } from './EventDef/mod.ts'
|
|
@@ -108,7 +109,7 @@ export const makeSchema = <TInputSchema extends InputSchema>(
|
|
|
108
109
|
|
|
109
110
|
const eventsDefsMap = new Map<string, EventDef.AnyWithoutFn>()
|
|
110
111
|
|
|
111
|
-
if (
|
|
112
|
+
if (EffectArray.isArray<InputSchema['events']>(inputSchema.events) === true) {
|
|
112
113
|
for (const eventDef of inputSchema.events) {
|
|
113
114
|
eventsDefsMap.set(eventDef.name, eventDef)
|
|
114
115
|
}
|
|
@@ -43,7 +43,7 @@ describe('client document table', () => {
|
|
|
43
43
|
})
|
|
44
44
|
|
|
45
45
|
describe('materializer', () => {
|
|
46
|
-
const forSchema = <T>(schema: Schema.
|
|
46
|
+
const forSchema = <T>(schema: Schema.Codec<T, any>, value: T, id?: string, options?: { partialSet?: boolean }) => {
|
|
47
47
|
const Doc = clientDocument({
|
|
48
48
|
name: 'test',
|
|
49
49
|
schema,
|
|
@@ -78,9 +78,8 @@ describe('client document table', () => {
|
|
|
78
78
|
})
|
|
79
79
|
|
|
80
80
|
test('struct value (partial set=true)', () => {
|
|
81
|
-
expect(
|
|
82
|
-
|
|
83
|
-
).toMatchInlineSnapshot(`
|
|
81
|
+
expect(forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: true }))
|
|
82
|
+
.toMatchInlineSnapshot(`
|
|
84
83
|
{
|
|
85
84
|
"bindValues": [
|
|
86
85
|
"id1",
|
|
@@ -101,9 +100,8 @@ describe('client document table', () => {
|
|
|
101
100
|
})
|
|
102
101
|
|
|
103
102
|
test('struct value (partial set=false)', () => {
|
|
104
|
-
expect(
|
|
105
|
-
|
|
106
|
-
).toMatchInlineSnapshot(`
|
|
103
|
+
expect(forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: false }))
|
|
104
|
+
.toMatchInlineSnapshot(`
|
|
107
105
|
{
|
|
108
106
|
"bindValues": [
|
|
109
107
|
"id1",
|
|
@@ -121,7 +119,7 @@ describe('client document table', () => {
|
|
|
121
119
|
test('struct value (partial set=true) advanced', () => {
|
|
122
120
|
expect(
|
|
123
121
|
forSchema(
|
|
124
|
-
Schema.Struct({ a: Schema.String, b: Schema.String, c: Schema.
|
|
122
|
+
Schema.Struct({ a: Schema.String, b: Schema.String, c: Schema.Finite }),
|
|
125
123
|
{ a: 'hello', c: 123 } as any,
|
|
126
124
|
'id1',
|
|
127
125
|
{ partialSet: true },
|
|
@@ -204,7 +202,7 @@ describe('client document table', () => {
|
|
|
204
202
|
test('struct union value', () => {
|
|
205
203
|
expect(
|
|
206
204
|
forSchema(
|
|
207
|
-
Schema.Union(Schema.Struct({ a: Schema.String }), Schema.Struct({ b: Schema.String })),
|
|
205
|
+
Schema.Union([Schema.Struct({ a: Schema.String }), Schema.Struct({ b: Schema.String })]),
|
|
208
206
|
{ a: 'hello' },
|
|
209
207
|
'id1',
|
|
210
208
|
),
|
|
@@ -223,6 +221,27 @@ describe('client document table', () => {
|
|
|
223
221
|
`)
|
|
224
222
|
})
|
|
225
223
|
|
|
224
|
+
test('struct union with shared fields fully replaces', () => {
|
|
225
|
+
const ValueSchema = Schema.Union([
|
|
226
|
+
Schema.Struct({ kind: Schema.Literal('a'), value: Schema.String }),
|
|
227
|
+
Schema.Struct({ kind: Schema.Literal('b'), value: Schema.String }),
|
|
228
|
+
])
|
|
229
|
+
|
|
230
|
+
expect(forSchema(ValueSchema, { kind: 'a', value: 'hello' }, 'id1')).toMatchInlineSnapshot(`
|
|
231
|
+
{
|
|
232
|
+
"bindValues": [
|
|
233
|
+
"id1",
|
|
234
|
+
"{"kind":"a","value":"hello"}",
|
|
235
|
+
"{"kind":"a","value":"hello"}",
|
|
236
|
+
],
|
|
237
|
+
"sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
|
|
238
|
+
"writeTables": Set {
|
|
239
|
+
"test",
|
|
240
|
+
},
|
|
241
|
+
}
|
|
242
|
+
`)
|
|
243
|
+
})
|
|
244
|
+
|
|
226
245
|
test('array value', () => {
|
|
227
246
|
expect(forSchema(Schema.Array(Schema.String), ['hello', 'world'], 'id1')).toMatchInlineSnapshot(`
|
|
228
247
|
{
|
|
@@ -260,7 +279,7 @@ describe('client document table', () => {
|
|
|
260
279
|
describe('optimistic schema', () => {
|
|
261
280
|
/** Models persisted JSON using epoch numbers + base64 while app code expects Date + Uint8Array. */
|
|
262
281
|
const valueSchema = Schema.Struct({
|
|
263
|
-
createdAt: Schema.
|
|
282
|
+
createdAt: Schema.DateFromMillis,
|
|
264
283
|
avatar: Schema.Uint8ArrayFromBase64,
|
|
265
284
|
})
|
|
266
285
|
const defaultValue = {
|
|
@@ -281,7 +300,7 @@ describe('client document table', () => {
|
|
|
281
300
|
defaultValue,
|
|
282
301
|
partialSet: false,
|
|
283
302
|
})
|
|
284
|
-
const rowSchema = Schema.
|
|
303
|
+
const rowSchema = Schema.fromJsonString(optimisticSchema)
|
|
285
304
|
|
|
286
305
|
expect(Schema.decodeUnknownSync(rowSchema)(JSON.stringify(value))).toEqual(defaultValue)
|
|
287
306
|
})
|
|
@@ -292,7 +311,7 @@ describe('client document table', () => {
|
|
|
292
311
|
defaultValue,
|
|
293
312
|
partialSet: false,
|
|
294
313
|
})
|
|
295
|
-
const rowSchema = Schema.
|
|
314
|
+
const rowSchema = Schema.fromJsonString(optimisticSchema)
|
|
296
315
|
|
|
297
316
|
expect(Schema.decodeUnknownSync(rowSchema)(JSON.stringify(validPayload))).toEqual({
|
|
298
317
|
createdAt: new Date(42),
|
|
@@ -306,7 +325,7 @@ describe('client document table', () => {
|
|
|
306
325
|
defaultValue,
|
|
307
326
|
partialSet: false,
|
|
308
327
|
})
|
|
309
|
-
const rowSchema = Schema.
|
|
328
|
+
const rowSchema = Schema.fromJsonString(optimisticSchema)
|
|
310
329
|
|
|
311
330
|
expect(Schema.decodeUnknownSync(rowSchema)(JSON.stringify(extraFieldsPayload))).toEqual({
|
|
312
331
|
createdAt: new Date(42),
|