@livestore/common 0.4.0-dev.2 → 0.4.0-dev.21
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 +20 -12
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
- package/dist/adapter-types.d.ts +14 -6
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js.map +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +33 -6
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +28 -23
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +2 -2
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +7 -14
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +1 -6
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +38 -29
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +9 -8
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
- package/dist/devtools/devtools-sessioninfo.js +7 -4
- package/dist/devtools/devtools-sessioninfo.js.map +1 -1
- package/dist/devtools/mod.d.ts +13 -2
- package/dist/devtools/mod.d.ts.map +1 -1
- package/dist/devtools/mod.js +10 -3
- package/dist/devtools/mod.js.map +1 -1
- package/dist/errors.d.ts +52 -10
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +25 -6
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +41 -4
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +158 -75
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +21 -22
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +77 -20
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +2 -2
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +56 -45
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +6 -6
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +79 -27
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
- package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
- package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
- package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
- package/dist/leader-thread/materialize-event.d.ts +3 -3
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +25 -11
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/mod.d.ts +1 -0
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -0
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +2 -3
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +5 -5
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -2
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -2
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/stream-events.d.ts +56 -0
- package/dist/leader-thread/stream-events.d.ts.map +1 -0
- package/dist/leader-thread/stream-events.js +166 -0
- package/dist/leader-thread/stream-events.js.map +1 -0
- package/dist/leader-thread/types.d.ts +98 -20
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +13 -0
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.d.ts +40 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +33 -0
- package/dist/logging.js.map +1 -0
- package/dist/make-client-session.d.ts +5 -3
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +5 -2
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts +6 -6
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +20 -4
- package/dist/materializer-helper.js.map +1 -1
- package/dist/otel.d.ts +2 -1
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +5 -0
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +2 -2
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +29 -20
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +147 -0
- package/dist/schema/EventDef/define.d.ts.map +1 -0
- package/dist/schema/EventDef/define.js +139 -0
- package/dist/schema/EventDef/define.js.map +1 -0
- package/dist/schema/EventDef/event-def.d.ts +106 -0
- package/dist/schema/EventDef/event-def.d.ts.map +1 -0
- package/dist/schema/EventDef/event-def.js +2 -0
- package/dist/schema/EventDef/event-def.js.map +1 -0
- package/dist/schema/EventDef/facts.d.ts +118 -0
- package/dist/schema/EventDef/facts.d.ts.map +1 -0
- package/dist/schema/EventDef/facts.js +53 -0
- package/dist/schema/EventDef/facts.js.map +1 -0
- package/dist/schema/EventDef/materializer.d.ts +155 -0
- package/dist/schema/EventDef/materializer.d.ts.map +1 -0
- package/dist/schema/EventDef/materializer.js +83 -0
- package/dist/schema/EventDef/materializer.js.map +1 -0
- package/dist/schema/EventDef/mod.d.ts +5 -0
- package/dist/schema/EventDef/mod.d.ts.map +1 -0
- package/dist/schema/EventDef/mod.js +5 -0
- package/dist/schema/EventDef/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/client.js +193 -0
- package/dist/schema/EventSequenceNumber/client.js.map +1 -0
- package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
- package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/global.js +14 -0
- package/dist/schema/EventSequenceNumber/global.js.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.js +37 -0
- package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +43 -43
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +89 -106
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
- package/dist/schema/{LiveStoreEvent.js → LiveStoreEvent/client.js} +74 -58
- package/dist/schema/LiveStoreEvent/client.js.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
- package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
- package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/global.js +31 -0
- package/dist/schema/LiveStoreEvent/global.js.map +1 -0
- package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
- package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/input.js +26 -0
- package/dist/schema/LiveStoreEvent/input.js.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.js +5 -0
- package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
- package/dist/schema/events.d.ts +1 -1
- package/dist/schema/events.d.ts.map +1 -1
- package/dist/schema/events.js +1 -1
- package/dist/schema/events.js.map +1 -1
- package/dist/schema/mod.d.ts +6 -4
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +5 -4
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +16 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +27 -2
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +36 -6
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +97 -6
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +16 -0
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.js +14 -6
- package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +69 -22
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +48 -10
- package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-spec.js +30 -12
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +23 -14
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +23 -6
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +14 -8
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +5 -3
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +2 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +3 -3
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +3 -3
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/api.d.ts +19 -11
- package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/astToSql.js +22 -15
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +6 -3
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +252 -88
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +22 -12
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
- package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +63 -456
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
- package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
- package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
- package/dist/schema/state/sqlite/table-def.d.ts +4 -4
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +2 -2
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +80 -0
- package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
- package/dist/schema/unknown-events.d.ts +47 -0
- package/dist/schema/unknown-events.d.ts.map +1 -0
- package/dist/schema/unknown-events.js +69 -0
- package/dist/schema/unknown-events.js.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
- package/dist/schema-management/migrations.d.ts +32 -2
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +37 -5
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts +3 -3
- package/dist/schema-management/validate-schema.d.ts.map +1 -1
- package/dist/schema-management/validate-schema.js +2 -2
- package/dist/schema-management/validate-schema.js.map +1 -1
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +11 -1
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
- package/dist/sql-queries/sql-query-builder.js +2 -1
- package/dist/sql-queries/sql-query-builder.js.map +1 -1
- package/dist/sqlite-types.d.ts +3 -3
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +11 -13
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +45 -42
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +66 -0
- package/dist/sync/errors.d.ts.map +1 -0
- package/dist/sync/errors.js +36 -0
- package/dist/sync/errors.js.map +1 -0
- package/dist/sync/index.d.ts +3 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +3 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +23 -0
- package/dist/sync/mock-sync-backend.d.ts.map +1 -0
- package/dist/sync/mock-sync-backend.js +114 -0
- package/dist/sync/mock-sync-backend.js.map +1 -0
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +6 -7
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +5 -5
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +1 -2
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +54 -15
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +198 -9
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.d.ts.map +1 -1
- package/dist/sync/next/history-dag.js +10 -8
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +5 -5
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +5 -5
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts +2 -2
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +9 -9
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync-backend-kv.d.ts +7 -0
- package/dist/sync/sync-backend-kv.d.ts.map +1 -0
- package/dist/sync/sync-backend-kv.js +18 -0
- package/dist/sync/sync-backend-kv.js.map +1 -0
- package/dist/sync/sync-backend.d.ts +105 -0
- package/dist/sync/sync-backend.d.ts.map +1 -0
- package/dist/sync/sync-backend.js +61 -0
- package/dist/sync/sync-backend.js.map +1 -0
- package/dist/sync/sync.d.ts +9 -86
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +2 -27
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +57 -44
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +50 -45
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +83 -46
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/transport-chunking.d.ts +36 -0
- package/dist/sync/transport-chunking.d.ts.map +1 -0
- package/dist/sync/transport-chunking.js +56 -0
- package/dist/sync/transport-chunking.js.map +1 -0
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +6 -6
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/testing/event-factory.d.ts +68 -0
- package/dist/testing/event-factory.d.ts.map +1 -0
- package/dist/testing/event-factory.js +78 -0
- package/dist/testing/event-factory.js.map +1 -0
- package/dist/testing/mod.d.ts +2 -0
- package/dist/testing/mod.d.ts.map +1 -0
- package/dist/testing/mod.js +2 -0
- package/dist/testing/mod.js.map +1 -0
- package/dist/version.d.ts +16 -6
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +16 -6
- package/dist/version.js.map +1 -1
- package/package.json +7 -8
- package/src/ClientSessionLeaderThreadProxy.ts +20 -12
- package/src/adapter-types.ts +18 -6
- package/src/debug-info.ts +37 -6
- package/src/devtools/devtools-messages-client-session.ts +2 -2
- package/src/devtools/devtools-messages-common.ts +1 -8
- package/src/devtools/devtools-messages-leader.ts +9 -8
- package/src/devtools/devtools-sessioninfo.ts +8 -5
- package/src/devtools/mod.ts +11 -2
- package/src/errors.ts +38 -11
- package/src/index.ts +2 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +277 -105
- package/src/leader-thread/eventlog.ts +113 -38
- package/src/leader-thread/leader-worker-devtools.ts +86 -55
- package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
- package/src/leader-thread/make-leader-thread-layer.ts +156 -37
- package/src/leader-thread/materialize-event.ts +37 -12
- package/src/leader-thread/mod.ts +1 -0
- package/src/leader-thread/recreate-db.ts +15 -7
- package/src/leader-thread/shutdown-channel.ts +16 -2
- package/src/leader-thread/stream-events.ts +201 -0
- package/src/leader-thread/types.ts +70 -20
- package/src/logging.ts +62 -0
- package/src/make-client-session.ts +9 -3
- package/src/materializer-helper.ts +27 -10
- package/src/otel.ts +10 -0
- package/src/rematerialize-from-eventlog.ts +37 -27
- package/src/schema/EventDef/define.ts +201 -0
- package/src/schema/EventDef/event-def.ts +120 -0
- package/src/schema/EventDef/facts.ts +135 -0
- package/src/schema/EventDef/materializer.ts +172 -0
- package/src/schema/EventDef/mod.ts +4 -0
- package/src/schema/EventSequenceNumber/client.ts +257 -0
- package/src/schema/EventSequenceNumber/global.ts +19 -0
- package/src/schema/EventSequenceNumber/mod.ts +37 -0
- package/src/schema/EventSequenceNumber.test.ts +70 -52
- package/src/schema/LiveStoreEvent/client.ts +221 -0
- package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
- package/src/schema/LiveStoreEvent/global.ts +45 -0
- package/src/schema/LiveStoreEvent/input.ts +63 -0
- package/src/schema/LiveStoreEvent/mod.ts +4 -0
- package/src/schema/events.ts +1 -1
- package/src/schema/mod.ts +6 -4
- package/src/schema/schema.ts +39 -3
- package/src/schema/state/sqlite/client-document-def.test.ts +19 -2
- package/src/schema/state/sqlite/client-document-def.ts +127 -25
- package/src/schema/state/sqlite/column-annotations.test.ts +1 -1
- package/src/schema/state/sqlite/column-annotations.ts +16 -6
- package/src/schema/state/sqlite/column-def.test.ts +62 -10
- package/src/schema/state/sqlite/column-def.ts +88 -21
- package/src/schema/state/sqlite/column-spec.test.ts +29 -16
- package/src/schema/state/sqlite/column-spec.ts +36 -11
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +26 -6
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +29 -12
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +12 -17
- package/src/schema/state/sqlite/mod.ts +4 -3
- package/src/schema/state/sqlite/query-builder/api.ts +25 -11
- package/src/schema/state/sqlite/query-builder/astToSql.ts +23 -14
- package/src/schema/state/sqlite/query-builder/impl.test.ts +305 -92
- package/src/schema/state/sqlite/query-builder/impl.ts +8 -3
- package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
- package/src/schema/state/sqlite/schema-helpers.ts +28 -20
- package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
- package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
- package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
- package/src/schema/state/sqlite/table-def.test.ts +101 -0
- package/src/schema/state/sqlite/table-def.ts +8 -6
- package/src/schema/unknown-events.ts +131 -0
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +86 -0
- package/src/schema-management/migrations.ts +41 -8
- package/src/schema-management/validate-schema.ts +3 -3
- package/src/sql-queries/sql-queries.ts +9 -1
- package/src/sql-queries/sql-query-builder.ts +2 -1
- package/src/sqlite-types.ts +3 -3
- package/src/sync/ClientSessionSyncProcessor.ts +69 -62
- package/src/sync/errors.ts +38 -0
- package/src/sync/index.ts +3 -0
- package/src/sync/mock-sync-backend.ts +184 -0
- package/src/sync/next/compact-events.ts +6 -7
- package/src/sync/next/facts.ts +7 -9
- package/src/sync/next/history-dag-common.ts +277 -26
- package/src/sync/next/history-dag.ts +16 -10
- package/src/sync/next/rebase-events.ts +11 -11
- package/src/sync/next/test/event-fixtures.ts +11 -11
- package/src/sync/sync-backend-kv.ts +22 -0
- package/src/sync/sync-backend.ts +185 -0
- package/src/sync/sync.ts +9 -91
- package/src/sync/syncstate.test.ts +96 -52
- package/src/sync/syncstate.ts +69 -58
- package/src/sync/transport-chunking.ts +90 -0
- package/src/sync/validate-push-payload.ts +8 -9
- package/src/testing/event-factory.ts +131 -0
- package/src/testing/mod.ts +1 -0
- package/src/version.ts +16 -6
- package/dist/schema/EventDef.d.ts +0 -123
- package/dist/schema/EventDef.d.ts.map +0 -1
- package/dist/schema/EventDef.js +0 -46
- package/dist/schema/EventDef.js.map +0 -1
- package/dist/schema/EventSequenceNumber.d.ts +0 -80
- package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
- package/dist/schema/EventSequenceNumber.js +0 -139
- package/dist/schema/EventSequenceNumber.js.map +0 -1
- package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
- package/dist/schema/LiveStoreEvent.js.map +0 -1
- package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
- package/dist/schema/state/sqlite/system-tables.js +0 -79
- package/dist/schema/state/sqlite/system-tables.js.map +0 -1
- package/dist/schema-management/migrations.test.d.ts +0 -2
- package/dist/schema-management/migrations.test.d.ts.map +0 -1
- package/dist/schema-management/migrations.test.js +0 -52
- package/dist/schema-management/migrations.test.js.map +0 -1
- package/dist/sync/next/graphology.d.ts +0 -8
- package/dist/sync/next/graphology.d.ts.map +0 -1
- package/dist/sync/next/graphology.js +0 -30
- package/dist/sync/next/graphology.js.map +0 -1
- package/dist/sync/next/graphology_.d.ts +0 -3
- package/dist/sync/next/graphology_.d.ts.map +0 -1
- package/dist/sync/next/graphology_.js +0 -3
- package/dist/sync/next/graphology_.js.map +0 -1
- package/src/schema/EventDef.ts +0 -219
- package/src/schema/EventSequenceNumber.ts +0 -199
- package/src/schema/LiveStoreEvent.ts +0 -287
- package/src/schema/state/sqlite/system-tables.ts +0 -104
- package/src/sync/next/ambient.d.ts +0 -3
- package/src/sync/next/graphology.ts +0 -41
- package/src/sync/next/graphology_.ts +0 -2
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { memoizeByRef } from '@livestore/utils'
|
|
2
|
+
import { Option, Schema } from '@livestore/utils/effect'
|
|
3
|
+
|
|
4
|
+
import type { EventDef } from '../EventDef/mod.ts'
|
|
5
|
+
import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
|
|
6
|
+
import type { LiveStoreSchema } from '../schema.ts'
|
|
7
|
+
import type * as ForEventDef from './for-event-def.ts'
|
|
8
|
+
import type * as Global from './global.ts'
|
|
9
|
+
|
|
10
|
+
/** Effect Schema for client events with decoded args. */
|
|
11
|
+
export const Decoded = Schema.Struct({
|
|
12
|
+
name: Schema.String,
|
|
13
|
+
args: Schema.Any,
|
|
14
|
+
seqNum: EventSequenceNumber.Client.Composite,
|
|
15
|
+
parentSeqNum: EventSequenceNumber.Client.Composite,
|
|
16
|
+
clientId: Schema.String,
|
|
17
|
+
sessionId: Schema.String,
|
|
18
|
+
}).annotations({ title: 'LiveStoreEvent.Client.Decoded' })
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Effect Schema for client events with encoded args.
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* // Confirmed event (client=0)
|
|
25
|
+
* const event: LiveStoreEvent.Client.Encoded = {
|
|
26
|
+
* name: 'todoCreated-v1',
|
|
27
|
+
* args: { id: 'abc', text: 'Buy milk' },
|
|
28
|
+
* seqNum: { global: 5, client: 0, rebaseGeneration: 0 },
|
|
29
|
+
* parentSeqNum: { global: 4, client: 0, rebaseGeneration: 0 },
|
|
30
|
+
* clientId: 'client-xyz',
|
|
31
|
+
* sessionId: 'session-123'
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* // Pending local event (client=1, not yet synced)
|
|
35
|
+
* const pending: LiveStoreEvent.Client.Encoded = {
|
|
36
|
+
* ...event,
|
|
37
|
+
* seqNum: { global: 5, client: 1, rebaseGeneration: 0 }, // e5.1
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export const Encoded = Schema.Struct({
|
|
42
|
+
name: Schema.String,
|
|
43
|
+
args: Schema.Any,
|
|
44
|
+
seqNum: EventSequenceNumber.Client.Composite,
|
|
45
|
+
parentSeqNum: EventSequenceNumber.Client.Composite,
|
|
46
|
+
clientId: Schema.String,
|
|
47
|
+
sessionId: Schema.String,
|
|
48
|
+
}).annotations({ title: 'LiveStoreEvent.Client.Encoded' })
|
|
49
|
+
|
|
50
|
+
/** Event with composite sequence numbers and decoded (native TypeScript) args. */
|
|
51
|
+
export type Decoded = ForEventDef.Decoded<EventDef.Any>
|
|
52
|
+
|
|
53
|
+
/** Event with composite sequence numbers and encoded (serialized) args. */
|
|
54
|
+
export type Encoded = ForEventDef.Encoded<EventDef.Any>
|
|
55
|
+
|
|
56
|
+
/** Union of all client event types for a given schema (type-safe event discrimination). */
|
|
57
|
+
export type ForSchema<TSchema extends LiveStoreSchema> = {
|
|
58
|
+
[K in keyof TSchema['_EventDefMapType']]: ForEventDef.Decoded<TSchema['_EventDefMapType'][K]>
|
|
59
|
+
}[keyof TSchema['_EventDefMapType']]
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Internal event representation with metadata for sync processing.
|
|
63
|
+
* Includes changeset data and materializer hashes for conflict detection and rebasing.
|
|
64
|
+
*
|
|
65
|
+
* Note: This class is exported for internal use. The preferred access is via `LiveStoreEvent.Client.EncodedWithMeta`.
|
|
66
|
+
*/
|
|
67
|
+
export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEvent.Client.EncodedWithMeta')({
|
|
68
|
+
name: Schema.String,
|
|
69
|
+
args: Schema.Any,
|
|
70
|
+
seqNum: EventSequenceNumber.Client.Composite,
|
|
71
|
+
parentSeqNum: EventSequenceNumber.Client.Composite,
|
|
72
|
+
clientId: Schema.String,
|
|
73
|
+
sessionId: Schema.String,
|
|
74
|
+
// TODO get rid of `meta` again by cleaning up the usage implementations
|
|
75
|
+
meta: Schema.Struct({
|
|
76
|
+
sessionChangeset: Schema.Union(
|
|
77
|
+
Schema.TaggedStruct('sessionChangeset', {
|
|
78
|
+
data: Schema.Uint8Array as any as Schema.Schema<Uint8Array<ArrayBuffer>>,
|
|
79
|
+
debug: Schema.Any.pipe(Schema.optional),
|
|
80
|
+
}),
|
|
81
|
+
Schema.TaggedStruct('no-op', {}),
|
|
82
|
+
Schema.TaggedStruct('unset', {}),
|
|
83
|
+
),
|
|
84
|
+
syncMetadata: Schema.Option(Schema.JsonValue),
|
|
85
|
+
/** Used to detect if the materializer is side effecting (during dev) */
|
|
86
|
+
materializerHashLeader: Schema.Option(Schema.Number),
|
|
87
|
+
materializerHashSession: Schema.Option(Schema.Number),
|
|
88
|
+
}).pipe(
|
|
89
|
+
Schema.mutable,
|
|
90
|
+
Schema.optional,
|
|
91
|
+
Schema.withDefaults({
|
|
92
|
+
constructor: () => ({
|
|
93
|
+
sessionChangeset: { _tag: 'unset' as const },
|
|
94
|
+
syncMetadata: Option.none(),
|
|
95
|
+
materializerHashLeader: Option.none(),
|
|
96
|
+
materializerHashSession: Option.none(),
|
|
97
|
+
}),
|
|
98
|
+
decoding: () => ({
|
|
99
|
+
sessionChangeset: { _tag: 'unset' as const },
|
|
100
|
+
syncMetadata: Option.none(),
|
|
101
|
+
materializerHashLeader: Option.none(),
|
|
102
|
+
materializerHashSession: Option.none(),
|
|
103
|
+
}),
|
|
104
|
+
}),
|
|
105
|
+
),
|
|
106
|
+
}) {
|
|
107
|
+
toJSON = (): any => {
|
|
108
|
+
// Only used for logging/debugging
|
|
109
|
+
// - More readable way to print the seqNum + parentSeqNum
|
|
110
|
+
// - not including `meta`, `clientId`, `sessionId`
|
|
111
|
+
return {
|
|
112
|
+
seqNum: `${EventSequenceNumber.Client.toString(this.seqNum)} → ${EventSequenceNumber.Client.toString(this.parentSeqNum)} (${this.clientId}, ${this.sessionId})`,
|
|
113
|
+
name: this.name,
|
|
114
|
+
args: this.args,
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Example: (global event)
|
|
120
|
+
* For event e2 → e1 which should be rebased on event e3 → e2
|
|
121
|
+
* the resulting event num will be e4 → e3
|
|
122
|
+
*
|
|
123
|
+
* Example: (client event)
|
|
124
|
+
* For event e2.1 → e2 which should be rebased on event e3 → e2
|
|
125
|
+
* the resulting event num will be e3.1 → e3
|
|
126
|
+
*
|
|
127
|
+
* Syntax: e2.2 → e2.1
|
|
128
|
+
* ^ ^ ^ ^
|
|
129
|
+
* | | | +- client parent number
|
|
130
|
+
* | | +--- global parent number
|
|
131
|
+
* | +-- client number
|
|
132
|
+
* +---- global number
|
|
133
|
+
* Client num is omitted for global events
|
|
134
|
+
*/
|
|
135
|
+
rebase = ({
|
|
136
|
+
parentSeqNum,
|
|
137
|
+
isClient,
|
|
138
|
+
rebaseGeneration,
|
|
139
|
+
}: {
|
|
140
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
141
|
+
isClient: boolean
|
|
142
|
+
rebaseGeneration: number
|
|
143
|
+
}) =>
|
|
144
|
+
new EncodedWithMeta({
|
|
145
|
+
...this,
|
|
146
|
+
...EventSequenceNumber.Client.nextPair({ seqNum: parentSeqNum, isClient, rebaseGeneration }),
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
static fromGlobal = (
|
|
150
|
+
event: Global.Encoded,
|
|
151
|
+
meta: {
|
|
152
|
+
syncMetadata: Option.Option<Schema.JsonValue>
|
|
153
|
+
materializerHashLeader: Option.Option<number>
|
|
154
|
+
materializerHashSession: Option.Option<number>
|
|
155
|
+
},
|
|
156
|
+
) =>
|
|
157
|
+
new EncodedWithMeta({
|
|
158
|
+
...event,
|
|
159
|
+
seqNum: {
|
|
160
|
+
global: event.seqNum,
|
|
161
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
162
|
+
rebaseGeneration: EventSequenceNumber.Client.REBASE_GENERATION_DEFAULT,
|
|
163
|
+
},
|
|
164
|
+
parentSeqNum: {
|
|
165
|
+
global: event.parentSeqNum,
|
|
166
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
167
|
+
rebaseGeneration: EventSequenceNumber.Client.REBASE_GENERATION_DEFAULT,
|
|
168
|
+
},
|
|
169
|
+
meta: {
|
|
170
|
+
sessionChangeset: { _tag: 'unset' as const },
|
|
171
|
+
syncMetadata: meta.syncMetadata,
|
|
172
|
+
materializerHashLeader: meta.materializerHashLeader,
|
|
173
|
+
materializerHashSession: meta.materializerHashSession,
|
|
174
|
+
},
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
toGlobal = (): Global.Encoded => ({
|
|
178
|
+
...this,
|
|
179
|
+
seqNum: this.seqNum.global,
|
|
180
|
+
parentSeqNum: this.parentSeqNum.global,
|
|
181
|
+
})
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Structural equality check for client events. Compares seqNum (global + client),
|
|
186
|
+
* name, clientId, sessionId, and args. The `meta` field is ignored.
|
|
187
|
+
*/
|
|
188
|
+
export const isEqualEncoded = (a: Encoded, b: Encoded) =>
|
|
189
|
+
a.seqNum.global === b.seqNum.global &&
|
|
190
|
+
a.seqNum.client === b.seqNum.client &&
|
|
191
|
+
a.name === b.name &&
|
|
192
|
+
a.clientId === b.clientId &&
|
|
193
|
+
a.sessionId === b.sessionId &&
|
|
194
|
+
JSON.stringify(a.args) === JSON.stringify(b.args) // TODO use schema equality here
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Creates an Effect Schema union for all event types in a schema (with composite sequence numbers).
|
|
198
|
+
* @example
|
|
199
|
+
* ```ts
|
|
200
|
+
* const eventSchema = LiveStoreEvent.Client.makeSchema(schema)
|
|
201
|
+
* const event = Schema.decodeUnknownSync(eventSchema)(rawEvent)
|
|
202
|
+
* ```
|
|
203
|
+
*/
|
|
204
|
+
export const makeSchema = <TSchema extends LiveStoreSchema>(
|
|
205
|
+
schema: TSchema,
|
|
206
|
+
): ForEventDef.ForRecord<TSchema['_EventDefMapType']> =>
|
|
207
|
+
Schema.Union(
|
|
208
|
+
...[...schema.eventsDefsMap.values()].map((def) =>
|
|
209
|
+
Schema.Struct({
|
|
210
|
+
name: Schema.Literal(def.name),
|
|
211
|
+
args: def.schema,
|
|
212
|
+
seqNum: EventSequenceNumber.Client.Composite,
|
|
213
|
+
parentSeqNum: EventSequenceNumber.Client.Composite,
|
|
214
|
+
clientId: Schema.String,
|
|
215
|
+
sessionId: Schema.String,
|
|
216
|
+
}),
|
|
217
|
+
),
|
|
218
|
+
).annotations({ title: 'LiveStoreEvent.Client' }) as any
|
|
219
|
+
|
|
220
|
+
/** Memoized `makeSchema` - caches the generated schema by reference. */
|
|
221
|
+
export const makeSchemaMemo = memoizeByRef(makeSchema)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Schema } from '@livestore/utils/effect'
|
|
2
|
+
|
|
3
|
+
import type { EventDef, EventDefRecord } from '../EventDef/mod.ts'
|
|
4
|
+
import type * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
|
|
5
|
+
|
|
6
|
+
/** Event without sequence numbers, with decoded (native TypeScript) args. Used as input to `store.commit()`. */
|
|
7
|
+
export type InputDecoded<TEventDef extends EventDef.Any> = {
|
|
8
|
+
name: TEventDef['name']
|
|
9
|
+
args: Schema.Schema.Type<TEventDef['schema']>
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Event without sequence numbers, with encoded (serialized) args. Used as input to `store.commit()`. */
|
|
13
|
+
export type InputEncoded<TEventDef extends EventDef.Any> = {
|
|
14
|
+
name: TEventDef['name']
|
|
15
|
+
args: Schema.Schema.Encoded<TEventDef['schema']>
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Full event with composite sequence numbers and decoded args. Includes clientId/sessionId for sync. */
|
|
19
|
+
export type Decoded<TEventDef extends EventDef.Any> = {
|
|
20
|
+
name: TEventDef['name']
|
|
21
|
+
args: Schema.Schema.Type<TEventDef['schema']>
|
|
22
|
+
seqNum: EventSequenceNumber.Client.Composite
|
|
23
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
24
|
+
clientId: string
|
|
25
|
+
sessionId: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Full event with composite sequence numbers and encoded args. Includes clientId/sessionId for sync. */
|
|
29
|
+
export type Encoded<TEventDef extends EventDef.Any> = {
|
|
30
|
+
name: TEventDef['name']
|
|
31
|
+
args: Schema.Schema.Encoded<TEventDef['schema']>
|
|
32
|
+
seqNum: EventSequenceNumber.Client.Composite
|
|
33
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
34
|
+
clientId: string
|
|
35
|
+
sessionId: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Effect Schema union of all event types in an EventDefRecord (with composite sequence numbers). */
|
|
39
|
+
export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
|
|
40
|
+
{
|
|
41
|
+
[K in keyof TEventDefRecord]: {
|
|
42
|
+
name: K
|
|
43
|
+
args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
|
|
44
|
+
seqNum: EventSequenceNumber.Client.Composite
|
|
45
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
46
|
+
clientId: string
|
|
47
|
+
sessionId: string
|
|
48
|
+
}
|
|
49
|
+
}[keyof TEventDefRecord],
|
|
50
|
+
{
|
|
51
|
+
[K in keyof TEventDefRecord]: {
|
|
52
|
+
name: K
|
|
53
|
+
args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
|
|
54
|
+
seqNum: EventSequenceNumber.Client.Composite
|
|
55
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
56
|
+
clientId: string
|
|
57
|
+
sessionId: string
|
|
58
|
+
}
|
|
59
|
+
}[keyof TEventDefRecord]
|
|
60
|
+
>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Schema } from '@livestore/utils/effect'
|
|
2
|
+
|
|
3
|
+
import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Effect Schema for global events with integer sequence numbers.
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const event: LiveStoreEvent.Global.Encoded = {
|
|
10
|
+
* name: 'todoCreated-v1',
|
|
11
|
+
* args: { id: 'abc', text: 'Buy milk' },
|
|
12
|
+
* seqNum: 5, // This event's position in the global log
|
|
13
|
+
* parentSeqNum: 4, // Points to the previous event
|
|
14
|
+
* clientId: 'client-xyz',
|
|
15
|
+
* sessionId: 'session-123'
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export const Encoded = Schema.Struct({
|
|
20
|
+
name: Schema.String,
|
|
21
|
+
args: Schema.Any,
|
|
22
|
+
seqNum: EventSequenceNumber.Global.Schema,
|
|
23
|
+
parentSeqNum: EventSequenceNumber.Global.Schema,
|
|
24
|
+
clientId: Schema.String,
|
|
25
|
+
sessionId: Schema.String,
|
|
26
|
+
}).annotations({ title: 'LiveStoreEvent.Global.Encoded' })
|
|
27
|
+
|
|
28
|
+
/** Event with integer sequence numbers for sync backend wire format. */
|
|
29
|
+
export type Encoded = typeof Encoded.Type
|
|
30
|
+
|
|
31
|
+
/** Converts a Global event to Client format by expanding integer seqNums to composite form. */
|
|
32
|
+
export const toClientEncoded = (
|
|
33
|
+
event: Encoded,
|
|
34
|
+
): {
|
|
35
|
+
name: string
|
|
36
|
+
args: any
|
|
37
|
+
seqNum: EventSequenceNumber.Client.Composite
|
|
38
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
39
|
+
clientId: string
|
|
40
|
+
sessionId: string
|
|
41
|
+
} => ({
|
|
42
|
+
...event,
|
|
43
|
+
seqNum: EventSequenceNumber.Client.fromGlobal(event.seqNum),
|
|
44
|
+
parentSeqNum: EventSequenceNumber.Client.fromGlobal(event.parentSeqNum),
|
|
45
|
+
})
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Schema } from '@livestore/utils/effect'
|
|
2
|
+
|
|
3
|
+
import type { EventDef, EventDefRecord } from '../EventDef/mod.ts'
|
|
4
|
+
import type { LiveStoreSchema } from '../schema.ts'
|
|
5
|
+
import type * as ForEventDef from './for-event-def.ts'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Effect Schema for validating/decoding input events with encoded args.
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Schema } from '@effect/schema'
|
|
12
|
+
* const decoded = Schema.decodeUnknownSync(LiveStoreEvent.Input.Encoded)(rawEvent)
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export const Encoded = Schema.Struct({
|
|
16
|
+
name: Schema.String,
|
|
17
|
+
args: Schema.Any,
|
|
18
|
+
}).annotations({ title: 'LiveStoreEvent.Input.Encoded' })
|
|
19
|
+
|
|
20
|
+
/** Event without sequence numbers, with decoded (native TypeScript) args. */
|
|
21
|
+
export type Decoded = ForEventDef.InputDecoded<EventDef.Any>
|
|
22
|
+
|
|
23
|
+
/** Event without sequence numbers, with encoded (serialized) args. */
|
|
24
|
+
export type Encoded = ForEventDef.InputEncoded<EventDef.Any>
|
|
25
|
+
|
|
26
|
+
/** Union of all input event types for a given schema (type-safe event discrimination). */
|
|
27
|
+
export type ForSchema<TSchema extends LiveStoreSchema> = {
|
|
28
|
+
[K in keyof TSchema['_EventDefMapType']]: ForEventDef.InputDecoded<TSchema['_EventDefMapType'][K]>
|
|
29
|
+
}[keyof TSchema['_EventDefMapType']]
|
|
30
|
+
|
|
31
|
+
/** Effect Schema union of all event types in an EventDefRecord (input format, no sequence numbers). */
|
|
32
|
+
export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
|
|
33
|
+
{
|
|
34
|
+
[K in keyof TEventDefRecord]: {
|
|
35
|
+
name: K
|
|
36
|
+
args: Schema.Schema.Type<TEventDefRecord[K]['schema']>
|
|
37
|
+
}
|
|
38
|
+
}[keyof TEventDefRecord],
|
|
39
|
+
{
|
|
40
|
+
[K in keyof TEventDefRecord]: {
|
|
41
|
+
name: K
|
|
42
|
+
args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>
|
|
43
|
+
}
|
|
44
|
+
}[keyof TEventDefRecord]
|
|
45
|
+
>
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Creates an Effect Schema union for all event types in a schema (input format, no sequence numbers).
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* const inputSchema = LiveStoreEvent.Input.makeSchema(schema)
|
|
52
|
+
* const event = Schema.decodeUnknownSync(inputSchema)(rawEvent)
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export const makeSchema = <TSchema extends LiveStoreSchema>(schema: TSchema): ForRecord<TSchema['_EventDefMapType']> =>
|
|
56
|
+
Schema.Union(
|
|
57
|
+
...[...schema.eventsDefsMap.values()].map((def) =>
|
|
58
|
+
Schema.Struct({
|
|
59
|
+
name: Schema.Literal(def.name),
|
|
60
|
+
args: def.schema,
|
|
61
|
+
}),
|
|
62
|
+
),
|
|
63
|
+
).annotations({ title: 'LiveStoreEvent.Input' }) as any
|
package/src/schema/events.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { clientOnly, defineEvent, synced } from './EventDef.ts'
|
|
1
|
+
export { clientOnly, defineEvent, synced } from './EventDef/mod.ts'
|
package/src/schema/mod.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
export * from './EventDef.ts'
|
|
2
|
-
export * as EventSequenceNumber from './EventSequenceNumber.ts'
|
|
1
|
+
export * from './EventDef/mod.ts'
|
|
2
|
+
export * as EventSequenceNumber from './EventSequenceNumber/mod.ts'
|
|
3
3
|
export * as Events from './events.ts'
|
|
4
|
-
export * as LiveStoreEvent from './LiveStoreEvent.ts'
|
|
4
|
+
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
8
|
export * from './state/sqlite/schema-helpers.ts'
|
|
9
|
-
export * as SystemTables from './state/sqlite/system-tables.ts'
|
|
9
|
+
export * as SystemTables from './state/sqlite/system-tables/mod.ts'
|
|
10
|
+
export type { UnknownEvents } from './unknown-events.ts'
|
|
11
|
+
export { normalizeUnknownEventHandling, resolveEventDef } from './unknown-events.ts'
|
package/src/schema/schema.ts
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { isReadonlyArray, shouldNeverHappen } from '@livestore/utils'
|
|
2
2
|
|
|
3
3
|
import type { MigrationOptions } from '../adapter-types.ts'
|
|
4
|
-
import type { EventDef, EventDefRecord, Materializer } from './EventDef.ts'
|
|
4
|
+
import type { EventDef, EventDefRecord, Materializer } from './EventDef/mod.ts'
|
|
5
5
|
import { tableIsClientDocumentTable } from './state/sqlite/client-document-def.ts'
|
|
6
6
|
import type { SqliteDsl } from './state/sqlite/db-schema/mod.ts'
|
|
7
|
-
import { stateSystemTables } from './state/sqlite/system-tables.ts'
|
|
7
|
+
import { stateSystemTables } from './state/sqlite/system-tables/state-tables.ts'
|
|
8
8
|
import type { TableDef } from './state/sqlite/table-def.ts'
|
|
9
|
+
import type { UnknownEvents } from './unknown-events.ts'
|
|
10
|
+
import { normalizeUnknownEventHandling } from './unknown-events.ts'
|
|
9
11
|
|
|
10
12
|
export const LiveStoreSchemaSymbol = Symbol.for('livestore.LiveStoreSchema')
|
|
11
13
|
export type LiveStoreSchemaSymbol = typeof LiveStoreSchemaSymbol
|
|
12
14
|
|
|
15
|
+
export const UNKNOWN_EVENT_SCHEMA_HASH = -1
|
|
16
|
+
|
|
13
17
|
export interface LiveStoreSchema<
|
|
14
18
|
TDbSchema extends SqliteDsl.DbSchema = SqliteDsl.DbSchema,
|
|
15
19
|
TEventsDefRecord extends EventDefRecord = EventDefRecord,
|
|
@@ -22,6 +26,7 @@ export interface LiveStoreSchema<
|
|
|
22
26
|
|
|
23
27
|
readonly state: InternalState
|
|
24
28
|
readonly eventsDefsMap: Map<string, EventDef.AnyWithoutFn>
|
|
29
|
+
readonly unknownEventHandling: UnknownEvents.HandlingConfig
|
|
25
30
|
readonly devtools: {
|
|
26
31
|
/** @default 'default' */
|
|
27
32
|
readonly alias: string
|
|
@@ -32,6 +37,30 @@ export namespace LiveStoreSchema {
|
|
|
32
37
|
export type Any = LiveStoreSchema<any, any>
|
|
33
38
|
}
|
|
34
39
|
|
|
40
|
+
/**
|
|
41
|
+
* Runtime type guard for LiveStoreSchema.
|
|
42
|
+
*
|
|
43
|
+
* The guard intentionally performs lightweight structural checks that are
|
|
44
|
+
* stable across implementations. It verifies the identifying symbol marker
|
|
45
|
+
* and the presence of core maps/state used at runtime.
|
|
46
|
+
*/
|
|
47
|
+
export const isLiveStoreSchema = (value: unknown): value is LiveStoreSchema<any, any> => {
|
|
48
|
+
if (typeof value !== 'object' || value === null) return false
|
|
49
|
+
|
|
50
|
+
const v: any = value
|
|
51
|
+
|
|
52
|
+
// Identity marker must match exactly
|
|
53
|
+
if (v.LiveStoreSchemaSymbol !== LiveStoreSchemaSymbol) return false
|
|
54
|
+
|
|
55
|
+
// Core structures used at runtime
|
|
56
|
+
const hasEventsMap = v.eventsDefsMap instanceof Map
|
|
57
|
+
const hasStateSqliteTables = v.state?.sqlite?.tables instanceof Map
|
|
58
|
+
const hasStateMaterializers = v.state?.materializers instanceof Map
|
|
59
|
+
const hasDevtoolsAlias = typeof v.devtools?.alias === 'string'
|
|
60
|
+
|
|
61
|
+
return hasEventsMap && hasStateSqliteTables && hasStateMaterializers && hasDevtoolsAlias
|
|
62
|
+
}
|
|
63
|
+
|
|
35
64
|
// TODO abstract this further away from sqlite/tables
|
|
36
65
|
export interface InternalState {
|
|
37
66
|
readonly sqlite: {
|
|
@@ -55,6 +84,10 @@ export interface InputSchema {
|
|
|
55
84
|
*/
|
|
56
85
|
readonly alias?: string
|
|
57
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Configures how unknown events should be handled. Defaults to `{ strategy: 'warn' }`.
|
|
89
|
+
*/
|
|
90
|
+
readonly unknownEventHandling?: UnknownEvents.HandlingConfig
|
|
58
91
|
}
|
|
59
92
|
|
|
60
93
|
export const makeSchema = <TInputSchema extends InputSchema>(
|
|
@@ -89,12 +122,15 @@ export const makeSchema = <TInputSchema extends InputSchema>(
|
|
|
89
122
|
}
|
|
90
123
|
}
|
|
91
124
|
|
|
125
|
+
const unknownEventHandling = normalizeUnknownEventHandling(inputSchema.unknownEventHandling)
|
|
126
|
+
|
|
92
127
|
return {
|
|
93
128
|
LiveStoreSchemaSymbol,
|
|
94
129
|
_DbSchemaType: Symbol.for('livestore.DbSchemaType') as any,
|
|
95
130
|
_EventDefMapType: Symbol.for('livestore.EventDefMapType') as any,
|
|
96
131
|
state,
|
|
97
132
|
eventsDefsMap,
|
|
133
|
+
unknownEventHandling,
|
|
98
134
|
devtools: {
|
|
99
135
|
alias: inputSchema.devtools?.alias ?? 'default',
|
|
100
136
|
},
|
|
@@ -110,7 +146,7 @@ export const getEventDef = <TSchema extends LiveStoreSchema>(
|
|
|
110
146
|
} => {
|
|
111
147
|
const eventDef = schema.eventsDefsMap.get(eventName)
|
|
112
148
|
if (eventDef === undefined) {
|
|
113
|
-
return shouldNeverHappen(`No
|
|
149
|
+
return shouldNeverHappen(`No event definition found for \`${eventName}\`.`)
|
|
114
150
|
}
|
|
115
151
|
const materializer = schema.state.materializers.get(eventName)
|
|
116
152
|
if (materializer === undefined) {
|
|
@@ -2,7 +2,7 @@ import { Schema } from '@livestore/utils/effect'
|
|
|
2
2
|
import { describe, expect, test } from 'vitest'
|
|
3
3
|
|
|
4
4
|
import { tables } from '../../../__tests__/fixture.ts'
|
|
5
|
-
import type * as LiveStoreEvent from '../../LiveStoreEvent.ts'
|
|
5
|
+
import type * as LiveStoreEvent from '../../LiveStoreEvent/mod.ts'
|
|
6
6
|
import { ClientDocumentTableDefSymbol, clientDocument, mergeDefaultValues } from './client-document-def.ts'
|
|
7
7
|
|
|
8
8
|
describe('client document table', () => {
|
|
@@ -50,6 +50,7 @@ describe('client document table', () => {
|
|
|
50
50
|
currentFacts: new Map(),
|
|
51
51
|
query: {} as any, // unused
|
|
52
52
|
eventDef: Doc[ClientDocumentTableDefSymbol].derived.setEventDef,
|
|
53
|
+
event: {} as any, // unused in this test
|
|
53
54
|
})
|
|
54
55
|
}
|
|
55
56
|
|
|
@@ -230,10 +231,26 @@ describe('client document table', () => {
|
|
|
230
231
|
}
|
|
231
232
|
`)
|
|
232
233
|
})
|
|
234
|
+
|
|
235
|
+
test('any value (Schema.Any) should fully replace', () => {
|
|
236
|
+
expect(forSchema(Schema.Any, { a: 1 }, 'id1')).toMatchInlineSnapshot(`
|
|
237
|
+
{
|
|
238
|
+
"bindValues": [
|
|
239
|
+
"id1",
|
|
240
|
+
"{"a":1}",
|
|
241
|
+
"{"a":1}",
|
|
242
|
+
],
|
|
243
|
+
"sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
|
|
244
|
+
"writeTables": Set {
|
|
245
|
+
"test",
|
|
246
|
+
},
|
|
247
|
+
}
|
|
248
|
+
`)
|
|
249
|
+
})
|
|
233
250
|
})
|
|
234
251
|
})
|
|
235
252
|
|
|
236
|
-
const patchId = (muationEvent: LiveStoreEvent.
|
|
253
|
+
const patchId = (muationEvent: LiveStoreEvent.Input.Decoded) => {
|
|
237
254
|
// TODO use new id paradigm
|
|
238
255
|
const id = `00000000-0000-0000-0000-000000000000`
|
|
239
256
|
return { ...muationEvent, id }
|