@livestore/common 0.4.0-dev.9 → 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 +27 -12
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/ClientSessionLeaderThreadProxy.js.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 +11 -0
- package/dist/WorkerTransportError.d.ts.map +1 -0
- package/dist/WorkerTransportError.js +11 -0
- package/dist/WorkerTransportError.js.map +1 -0
- package/dist/__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 +59 -57
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +31 -22
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/bounded-collections.js +6 -4
- package/dist/bounded-collections.js.map +1 -1
- package/dist/debug-info.d.ts +56 -56
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +46 -32
- 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.d.ts +2 -0
- package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
- package/dist/devtools/devtools-compatibility.test.js +16 -0
- package/dist/devtools/devtools-compatibility.test.js.map +1 -0
- package/dist/devtools/devtools-messages-client-session.d.ts +531 -312
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +86 -67
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +32 -35
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +12 -14
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +417 -320
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +117 -87
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +28 -17
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
- package/dist/devtools/devtools-sessioninfo.js +12 -6
- package/dist/devtools/devtools-sessioninfo.js.map +1 -1
- package/dist/devtools/mod.d.ts +17 -7
- package/dist/devtools/mod.d.ts.map +1 -1
- package/dist/devtools/mod.js +19 -8
- package/dist/devtools/mod.js.map +1 -1
- package/dist/errors.d.ts +52 -46
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +31 -21
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +116 -21
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +596 -470
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/RejectedPushError.d.ts +138 -0
- package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
- package/dist/leader-thread/RejectedPushError.js +97 -0
- package/dist/leader-thread/RejectedPushError.js.map +1 -0
- 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 +10 -9
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +20 -15
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +80 -20
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +110 -62
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +19 -7
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +67 -45
- 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 -2
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +32 -9
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/mod.d.ts +1 -0
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -0
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +2 -2
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +19 -40
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +3 -7
- 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 +53 -0
- package/dist/leader-thread/stream-events.d.ts.map +1 -0
- package/dist/leader-thread/stream-events.js +164 -0
- package/dist/leader-thread/stream-events.js.map +1 -0
- package/dist/leader-thread/types.d.ts +92 -51
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +17 -4
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.d.ts +15 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +2 -0
- package/dist/logging.js.map +1 -0
- package/dist/make-client-session.d.ts +6 -5
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +10 -7
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts +6 -7
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +22 -40
- package/dist/materializer-helper.js.map +1 -1
- package/dist/otel.d.ts +4 -4
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +8 -8
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +3 -3
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +52 -39
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +161 -0
- package/dist/schema/EventDef/define.d.ts.map +1 -0
- package/dist/schema/EventDef/define.js +140 -0
- package/dist/schema/EventDef/define.js.map +1 -0
- package/dist/schema/EventDef/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 +94 -0
- package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
- package/dist/schema/EventDef/deprecated.js +143 -0
- package/dist/schema/EventDef/deprecated.js.map +1 -0
- package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
- package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
- package/dist/schema/EventDef/deprecated.test.js +95 -0
- package/dist/schema/EventDef/deprecated.test.js.map +1 -0
- package/dist/schema/EventDef/event-def.d.ts +110 -0
- package/dist/schema/EventDef/event-def.d.ts.map +1 -0
- package/dist/schema/EventDef/event-def.js +2 -0
- package/dist/schema/EventDef/event-def.js.map +1 -0
- package/dist/schema/EventDef/facts.d.ts +118 -0
- package/dist/schema/EventDef/facts.d.ts.map +1 -0
- package/dist/schema/EventDef/facts.js +53 -0
- package/dist/schema/EventDef/facts.js.map +1 -0
- package/dist/schema/EventDef/materializer.d.ts +155 -0
- package/dist/schema/EventDef/materializer.d.ts.map +1 -0
- package/dist/schema/EventDef/materializer.js +83 -0
- package/dist/schema/EventDef/materializer.js.map +1 -0
- package/dist/schema/EventDef/mod.d.ts +6 -0
- package/dist/schema/EventDef/mod.d.ts.map +1 -0
- package/dist/schema/EventDef/mod.js +6 -0
- package/dist/schema/EventDef/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/client.js +192 -0
- package/dist/schema/EventSequenceNumber/client.js.map +1 -0
- package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
- package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/global.js +14 -0
- package/dist/schema/EventSequenceNumber/global.js.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.js +37 -0
- package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +44 -44
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.d.ts +168 -0
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/client.js +179 -0
- package/dist/schema/LiveStoreEvent/client.js.map +1 -0
- package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
- package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/client.test.js +120 -0
- package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
- package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
- package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/global.js +31 -0
- package/dist/schema/LiveStoreEvent/global.js.map +1 -0
- package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
- package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/input.js +26 -0
- package/dist/schema/LiveStoreEvent/input.js.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.js +5 -0
- package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
- package/dist/schema/events.d.ts +1 -1
- package/dist/schema/events.d.ts.map +1 -1
- package/dist/schema/events.js +1 -1
- package/dist/schema/events.js.map +1 -1
- package/dist/schema/mod.d.ts +7 -4
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +6 -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 +34 -5
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +14 -18
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +54 -30
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +146 -6
- 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 +132 -57
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +155 -70
- 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 +26 -17
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- 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 +15 -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 +25 -19
- 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 +22 -16
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +14 -12
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +3 -5
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +6 -8
- 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 +58 -29
- 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 +105 -24
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts +4 -2
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +42 -27
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +402 -498
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +24 -14
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +515 -0
- 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 +678 -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 +87 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
- package/dist/schema/state/sqlite/table-def.d.ts +19 -20
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +54 -4
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +226 -20
- 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 +70 -0
- package/dist/schema/unknown-events.js.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
- package/dist/schema-management/common.js +2 -2
- package/dist/schema-management/common.js.map +1 -1
- package/dist/schema-management/migrations.d.ts +32 -2
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +38 -6
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts +3 -3
- package/dist/schema-management/validate-schema.d.ts.map +1 -1
- package/dist/schema-management/validate-schema.js +2 -2
- package/dist/schema-management/validate-schema.js.map +1 -1
- package/dist/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 +26 -16
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
- package/dist/sql-queries/sql-query-builder.js.map +1 -1
- package/dist/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 +40 -5
- package/dist/sqlite-db-helper.js.map +1 -1
- package/dist/sqlite-types.d.ts +8 -11
- 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 +47 -25
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +269 -154
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +12 -51
- package/dist/sync/errors.d.ts.map +1 -1
- package/dist/sync/errors.js +7 -24
- package/dist/sync/errors.js.map +1 -1
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +2 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +11 -10
- package/dist/sync/mock-sync-backend.d.ts.map +1 -1
- package/dist/sync/mock-sync-backend.js +97 -74
- package/dist/sync/mock-sync-backend.js.map +1 -1
- package/dist/sync/mock-sync-backend.test.d.ts +2 -0
- package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
- package/dist/sync/mock-sync-backend.test.js +49 -0
- package/dist/sync/mock-sync-backend.test.js.map +1 -0
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +11 -12
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +5 -5
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +7 -8
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +58 -15
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +219 -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 +12 -11
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +5 -5
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +6 -6
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +4 -4
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +2 -2
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts +9 -9
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +12 -12
- 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 +3 -3
- package/dist/sync/sync-backend-kv.d.ts.map +1 -1
- package/dist/sync/sync-backend-kv.js +6 -4
- package/dist/sync/sync-backend-kv.js.map +1 -1
- package/dist/sync/sync-backend.d.ts +41 -21
- package/dist/sync/sync-backend.d.ts.map +1 -1
- package/dist/sync/sync-backend.js +45 -4
- package/dist/sync/sync-backend.js.map +1 -1
- package/dist/sync/sync.d.ts +23 -2
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/syncstate.d.ts +115 -191
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +108 -129
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +289 -161
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/transport-chunking.d.ts +35 -0
- package/dist/sync/transport-chunking.d.ts.map +1 -0
- package/dist/sync/transport-chunking.js +47 -0
- package/dist/sync/transport-chunking.js.map +1 -0
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +4 -6
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/testing/event-factory.d.ts +3 -3
- package/dist/testing/event-factory.d.ts.map +1 -1
- package/dist/testing/event-factory.js +5 -7
- package/dist/testing/event-factory.js.map +1 -1
- package/dist/util.d.ts +11 -4
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +21 -4
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +24 -5
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +25 -8
- package/dist/version.js.map +1 -1
- package/package.json +50 -16
- package/src/ClientSessionLeaderThreadProxy.ts +27 -12
- package/src/MaterializationJournal.ts +184 -0
- package/src/StateHead.ts +80 -0
- package/src/WorkerTransportError.ts +12 -0
- package/src/__tests__/fixture.ts +3 -3
- package/src/adapter-types.ts +62 -56
- package/src/bounded-collections.ts +6 -5
- package/src/debug-info.ts +54 -43
- package/src/defs.ts +2 -2
- package/src/devtools/devtools-compatibility.test.ts +19 -0
- package/src/devtools/devtools-messages-client-session.ts +72 -63
- package/src/devtools/devtools-messages-common.ts +18 -22
- package/src/devtools/devtools-messages-leader.ts +89 -68
- package/src/devtools/devtools-sessioninfo.ts +17 -12
- package/src/devtools/mod.ts +15 -7
- package/src/errors.ts +58 -38
- package/src/index.ts +11 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +927 -674
- package/src/leader-thread/RejectedPushError.ts +119 -0
- package/src/leader-thread/connection.ts +13 -9
- package/src/leader-thread/eventlog.ts +114 -41
- package/src/leader-thread/leader-worker-devtools.ts +223 -124
- package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
- package/src/leader-thread/make-leader-thread-layer.ts +170 -82
- package/src/leader-thread/materialize-event.ts +51 -16
- package/src/leader-thread/mod.ts +1 -0
- package/src/leader-thread/recreate-db.ts +26 -61
- package/src/leader-thread/shutdown-channel.ts +3 -18
- package/src/leader-thread/stream-events.ts +209 -0
- package/src/leader-thread/types.ts +77 -65
- package/src/logging.ts +15 -0
- package/src/make-client-session.ts +16 -10
- package/src/materializer-helper.ts +31 -49
- package/src/otel.ts +15 -13
- package/src/rematerialize-from-eventlog.ts +106 -93
- package/src/schema/EventDef/define.test.ts +28 -0
- package/src/schema/EventDef/define.ts +218 -0
- package/src/schema/EventDef/deprecated.test.ts +122 -0
- package/src/schema/EventDef/deprecated.ts +172 -0
- package/src/schema/EventDef/event-def.ts +123 -0
- package/src/schema/EventDef/facts.ts +135 -0
- package/src/schema/EventDef/materializer.ts +172 -0
- package/src/schema/EventDef/mod.ts +5 -0
- package/src/schema/EventSequenceNumber/client.ts +256 -0
- package/src/schema/EventSequenceNumber/global.ts +19 -0
- package/src/schema/EventSequenceNumber/mod.ts +37 -0
- package/src/schema/EventSequenceNumber.test.ts +72 -53
- package/src/schema/LiveStoreEvent/client.test.ts +142 -0
- package/src/schema/LiveStoreEvent/client.ts +236 -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 +7 -4
- package/src/schema/schema.ts +48 -6
- package/src/schema/state/sqlite/client-document-def.test.ts +172 -14
- package/src/schema/state/sqlite/client-document-def.ts +126 -98
- package/src/schema/state/sqlite/column-annotations.test.ts +27 -45
- package/src/schema/state/sqlite/column-annotations.ts +27 -30
- package/src/schema/state/sqlite/column-def.test.ts +186 -77
- package/src/schema/state/sqlite/column-def.ts +169 -62
- package/src/schema/state/sqlite/column-spec.test.ts +34 -19
- package/src/schema/state/sqlite/column-spec.ts +38 -11
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +17 -7
- 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 +37 -17
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +65 -45
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +48 -40
- package/src/schema/state/sqlite/mod.ts +9 -12
- package/src/schema/state/sqlite/persistence.ts +11 -0
- package/src/schema/state/sqlite/query-builder/api.ts +61 -23
- package/src/schema/state/sqlite/query-builder/astToSql.ts +117 -23
- package/src/schema/state/sqlite/query-builder/impl.test.ts +489 -551
- package/src/schema/state/sqlite/query-builder/impl.ts +43 -26
- package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
- package/src/schema/state/sqlite/schema-helpers.ts +30 -22
- package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
- package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
- package/src/schema/state/sqlite/system-tables/state-tables.ts +109 -0
- package/src/schema/state/sqlite/table-def.test.ts +295 -46
- package/src/schema/state/sqlite/table-def.ts +109 -64
- package/src/schema/unknown-events.ts +132 -0
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
- package/src/schema-management/common.ts +2 -2
- package/src/schema-management/migrations.ts +42 -9
- package/src/schema-management/validate-schema.ts +3 -3
- package/src/session-id-symbol.ts +59 -0
- package/src/sql-queries/sql-queries.ts +26 -18
- package/src/sql-queries/sql-query-builder.ts +1 -0
- package/src/sql-queries/types.ts +6 -7
- package/src/sqlite-db-helper.ts +67 -5
- package/src/sqlite-types.ts +9 -11
- package/src/sync/ClientSessionSyncProcessor.ts +388 -194
- package/src/sync/errors.ts +18 -28
- package/src/sync/index.ts +2 -0
- package/src/sync/mock-sync-backend.test.ts +78 -0
- package/src/sync/mock-sync-backend.ts +196 -108
- package/src/sync/next/compact-events.ts +10 -11
- package/src/sync/next/facts.ts +13 -14
- package/src/sync/next/history-dag-common.ts +306 -26
- package/src/sync/next/history-dag.ts +20 -13
- package/src/sync/next/rebase-events.ts +12 -12
- package/src/sync/next/test/compact-events.calculator.test.ts +5 -4
- package/src/sync/next/test/compact-events.test.ts +4 -3
- package/src/sync/next/test/event-fixtures.ts +14 -14
- package/src/sync/next/test/history-dag-common.test.ts +87 -0
- package/src/sync/sync-backend-kv.ts +7 -4
- package/src/sync/sync-backend.ts +75 -26
- package/src/sync/sync.ts +24 -2
- package/src/sync/syncstate.test.ts +657 -442
- package/src/sync/syncstate.ts +175 -160
- package/src/sync/transport-chunking.ts +85 -0
- package/src/sync/validate-push-payload.ts +6 -8
- package/src/testing/event-factory.ts +10 -12
- package/src/util.ts +20 -11
- package/src/version.ts +32 -8
- package/dist/schema/EventDef.d.ts +0 -126
- package/dist/schema/EventDef.d.ts.map +0 -1
- package/dist/schema/EventDef.js +0 -46
- package/dist/schema/EventDef.js.map +0 -1
- package/dist/schema/EventSequenceNumber.d.ts +0 -80
- package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
- package/dist/schema/EventSequenceNumber.js +0 -139
- package/dist/schema/EventSequenceNumber.js.map +0 -1
- package/dist/schema/LiveStoreEvent.d.ts +0 -306
- package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
- package/dist/schema/LiveStoreEvent.js +0 -147
- package/dist/schema/LiveStoreEvent.js.map +0 -1
- package/dist/schema/state/sqlite/system-tables.d.ts +0 -976
- package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
- package/dist/schema/state/sqlite/system-tables.js +0 -81
- package/dist/schema/state/sqlite/system-tables.js.map +0 -1
- package/dist/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/dist/sync/next/graphology.d.ts +0 -8
- package/dist/sync/next/graphology.d.ts.map +0 -1
- package/dist/sync/next/graphology.js +0 -30
- package/dist/sync/next/graphology.js.map +0 -1
- package/dist/sync/next/graphology_.d.ts +0 -3
- package/dist/sync/next/graphology_.d.ts.map +0 -1
- package/dist/sync/next/graphology_.js +0 -3
- package/dist/sync/next/graphology_.js.map +0 -1
- package/src/schema/EventDef.ts +0 -222
- package/src/schema/EventSequenceNumber.ts +0 -199
- package/src/schema/LiveStoreEvent.ts +0 -286
- package/src/schema/state/sqlite/system-tables.ts +0 -106
- package/src/sql-queries/misc.ts +0 -2
- 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
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { isDevEnv
|
|
2
|
-
import { Hash, Option, Schema } from '@livestore/utils/effect'
|
|
1
|
+
import { isDevEnv } from '@livestore/utils'
|
|
2
|
+
import { Hash, Option, Predicate, ReadonlyArray, Schema } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
4
|
import type { SqliteDb } from './adapter-types.ts'
|
|
5
|
-
import {
|
|
6
|
-
import type
|
|
7
|
-
import type
|
|
8
|
-
import { getEventDef, type LiveStoreSchema } from './schema/schema.ts'
|
|
5
|
+
import type { EventDef, Materializer, MaterializerContextQuery, MaterializerResult } from './schema/EventDef/mod.ts'
|
|
6
|
+
import type * as LiveStoreEvent from './schema/LiveStoreEvent/mod.ts'
|
|
7
|
+
import type { LiveStoreSchema } from './schema/schema.ts'
|
|
9
8
|
import type { QueryBuilder } from './schema/state/sqlite/query-builder/api.ts'
|
|
10
9
|
import { isQueryBuilder } from './schema/state/sqlite/query-builder/api.ts'
|
|
11
10
|
import { getResultSchema } from './schema/state/sqlite/query-builder/impl.ts'
|
|
@@ -24,8 +23,8 @@ export const getExecStatementsFromMaterializer = ({
|
|
|
24
23
|
dbState: SqliteDb
|
|
25
24
|
/** Both encoded and decoded events are supported to reduce the number of times we need to decode/encode */
|
|
26
25
|
event:
|
|
27
|
-
| { decoded: LiveStoreEvent.
|
|
28
|
-
| { decoded: undefined; encoded: LiveStoreEvent.
|
|
26
|
+
| { decoded: LiveStoreEvent.Client.Decoded; encoded: undefined }
|
|
27
|
+
| { decoded: undefined; encoded: LiveStoreEvent.Client.Encoded }
|
|
29
28
|
}): ReadonlyArray<{
|
|
30
29
|
statementSql: string
|
|
31
30
|
bindValues: PreparedBindValues
|
|
@@ -34,14 +33,15 @@ export const getExecStatementsFromMaterializer = ({
|
|
|
34
33
|
const eventDecoded =
|
|
35
34
|
event.decoded === undefined
|
|
36
35
|
? {
|
|
37
|
-
...event.encoded
|
|
38
|
-
args: Schema.decodeUnknownSync(eventDef.schema)(event.encoded
|
|
36
|
+
...event.encoded,
|
|
37
|
+
args: Schema.decodeUnknownSync(eventDef.schema)(event.encoded.args),
|
|
39
38
|
}
|
|
40
39
|
: event.decoded
|
|
41
40
|
|
|
42
|
-
const eventArgsEncoded =
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
const eventArgsEncoded =
|
|
42
|
+
Predicate.isNotUndefined(event.decoded) === true && Predicate.isNotNullish(event.decoded.args) === true
|
|
43
|
+
? Schema.encodeUnknownSync(eventDef.schema)(event.decoded.args)
|
|
44
|
+
: undefined
|
|
45
45
|
|
|
46
46
|
const query: MaterializerContextQuery = (
|
|
47
47
|
rawQueryOrQueryBuilder:
|
|
@@ -51,11 +51,11 @@ export const getExecStatementsFromMaterializer = ({
|
|
|
51
51
|
}
|
|
52
52
|
| QueryBuilder.Any,
|
|
53
53
|
) => {
|
|
54
|
-
if (isQueryBuilder(rawQueryOrQueryBuilder)) {
|
|
54
|
+
if (isQueryBuilder(rawQueryOrQueryBuilder) === true) {
|
|
55
55
|
const { query, bindValues } = rawQueryOrQueryBuilder.asSql()
|
|
56
56
|
const rawResults = dbState.select(query, prepareBindValues(bindValues, query))
|
|
57
57
|
const resultSchema = getResultSchema(rawQueryOrQueryBuilder)
|
|
58
|
-
return Schema.
|
|
58
|
+
return Schema.decodeUnknownSync(resultSchema)(rawResults)
|
|
59
59
|
} else {
|
|
60
60
|
const { query, bindValues } = rawQueryOrQueryBuilder
|
|
61
61
|
return dbState.select(query, prepareBindValues(bindValues, query))
|
|
@@ -85,9 +85,20 @@ export const getExecStatementsFromMaterializer = ({
|
|
|
85
85
|
|
|
86
86
|
export const makeMaterializerHash =
|
|
87
87
|
({ schema, dbState }: { schema: LiveStoreSchema; dbState: SqliteDb }) =>
|
|
88
|
-
(event: LiveStoreEvent.
|
|
89
|
-
if (isDevEnv()) {
|
|
90
|
-
|
|
88
|
+
(event: LiveStoreEvent.Client.Encoded): Option.Option<number> => {
|
|
89
|
+
if (isDevEnv() === true) {
|
|
90
|
+
// Hashing is only needed during dev-mode diagnostics. Skip work entirely for
|
|
91
|
+
// unknown events (no definition/materializer) so we do not introduce noisy
|
|
92
|
+
// warnings while still returning `Option.none()` to disable hash checks.
|
|
93
|
+
const eventDef = schema.eventsDefsMap.get(event.name)
|
|
94
|
+
const materializer = schema.state.materializers.get(event.name)
|
|
95
|
+
if (eventDef === undefined || materializer === undefined) {
|
|
96
|
+
return Option.none()
|
|
97
|
+
}
|
|
98
|
+
// For known events we replay the materializer with the encoded payload and
|
|
99
|
+
// hash the resulting SQL statements. This lets us cheaply detect
|
|
100
|
+
// side-effects or logic drift between leader/client materializers without
|
|
101
|
+
// mutating the underlying state.
|
|
91
102
|
const materializerResults = getExecStatementsFromMaterializer({
|
|
92
103
|
eventDef,
|
|
93
104
|
materializer,
|
|
@@ -115,10 +126,10 @@ const fromMaterializerResult = (
|
|
|
115
126
|
bindValues: BindValues
|
|
116
127
|
writeTables: ReadonlySet<string> | undefined
|
|
117
128
|
}> => {
|
|
118
|
-
if (
|
|
129
|
+
if (ReadonlyArray.isArray<MaterializerResult | ReadonlyArray<MaterializerResult>>(materializerResult) === true) {
|
|
119
130
|
return materializerResult.flatMap(fromMaterializerResult)
|
|
120
131
|
}
|
|
121
|
-
if (isQueryBuilder(materializerResult)) {
|
|
132
|
+
if (isQueryBuilder(materializerResult) === true) {
|
|
122
133
|
const { query, bindValues, usedTables } = materializerResult.asSql()
|
|
123
134
|
return [{ sql: query, bindValues: bindValues as BindValues, writeTables: usedTables }]
|
|
124
135
|
} else if (typeof materializerResult === 'string') {
|
|
@@ -133,32 +144,3 @@ const fromMaterializerResult = (
|
|
|
133
144
|
]
|
|
134
145
|
}
|
|
135
146
|
}
|
|
136
|
-
|
|
137
|
-
// NOTE we should explore whether there is a more elegant solution
|
|
138
|
-
// e.g. by leveraging the schema to replace the sessionIdSymbol
|
|
139
|
-
export const replaceSessionIdSymbol = (
|
|
140
|
-
bindValues: Record<string, unknown> | ReadonlyArray<unknown>,
|
|
141
|
-
sessionId: string,
|
|
142
|
-
) => {
|
|
143
|
-
deepReplaceValue(bindValues, SessionIdSymbol, sessionId)
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const deepReplaceValue = <S, R>(input: any, searchValue: S, replaceValue: R): void => {
|
|
147
|
-
if (Array.isArray(input)) {
|
|
148
|
-
for (const i in input) {
|
|
149
|
-
if (input[i] === searchValue) {
|
|
150
|
-
input[i] = replaceValue
|
|
151
|
-
} else {
|
|
152
|
-
deepReplaceValue(input[i], searchValue, replaceValue)
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
} else if (typeof input === 'object' && input !== null) {
|
|
156
|
-
for (const key in input) {
|
|
157
|
-
if (input[key] === searchValue) {
|
|
158
|
-
input[key] = replaceValue
|
|
159
|
-
} else {
|
|
160
|
-
deepReplaceValue(input[key], searchValue, replaceValue)
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
package/src/otel.ts
CHANGED
|
@@ -1,28 +1,30 @@
|
|
|
1
|
+
import * as otel from '@opentelemetry/api'
|
|
2
|
+
|
|
1
3
|
import { makeNoopTracer } from '@livestore/utils'
|
|
4
|
+
import type { Tracer } from '@livestore/utils/effect'
|
|
2
5
|
import { Effect, identity, Layer, OtelTracer } from '@livestore/utils/effect'
|
|
3
|
-
|
|
6
|
+
|
|
7
|
+
export const OtelLiveDummy: Layer.Layer<OtelTracer.OtelTracer> = Layer.suspend(() => {
|
|
8
|
+
const OtelTracerLive = Layer.succeed(OtelTracer.OtelTracer, makeNoopTracer())
|
|
9
|
+
|
|
10
|
+
const TracingLive = OtelTracer.layerWithoutOtelTracer.pipe(Layer.provideMerge(OtelTracerLive))
|
|
11
|
+
|
|
12
|
+
return TracingLive
|
|
13
|
+
})
|
|
4
14
|
|
|
5
15
|
export const provideOtel =
|
|
6
16
|
({ otelTracer, parentSpanContext }: { otelTracer?: otel.Tracer; parentSpanContext?: otel.Context }) =>
|
|
7
|
-
<A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, Exclude<R, OtelTracer.OtelTracer>> => {
|
|
17
|
+
<A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, Exclude<R, OtelTracer.OtelTracer | Tracer.Tracer>> => {
|
|
8
18
|
const OtelTracerLive = Layer.succeed(OtelTracer.OtelTracer, otelTracer ?? makeNoopTracer())
|
|
9
19
|
|
|
10
|
-
const TracingLive =
|
|
20
|
+
const TracingLive = OtelTracer.layerWithoutOtelTracer.pipe(
|
|
11
21
|
Layer.provideMerge(OtelTracerLive),
|
|
12
|
-
) as any as Layer.Layer<OtelTracer.OtelTracer>
|
|
22
|
+
) as any as Layer.Layer<OtelTracer.OtelTracer | Tracer.Tracer>
|
|
13
23
|
|
|
14
24
|
return effect.pipe(
|
|
15
|
-
parentSpanContext
|
|
25
|
+
parentSpanContext !== undefined
|
|
16
26
|
? Effect.withParentSpan(OtelTracer.makeExternalSpan(otel.trace.getSpanContext(parentSpanContext)!))
|
|
17
27
|
: identity,
|
|
18
28
|
Effect.provide(TracingLive),
|
|
19
29
|
)
|
|
20
30
|
}
|
|
21
|
-
|
|
22
|
-
export const getDurationMsFromSpan = (span: otel.Span): number => {
|
|
23
|
-
const durationHr: [seconds: number, nanos: number] = (span as any)._duration
|
|
24
|
-
return durationHr[0] * 1000 + durationHr[1] / 1_000_000
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export const getStartTimeHighResFromSpan = (span: otel.Span): DOMHighResTimeStamp =>
|
|
28
|
-
(span as any)._performanceStartTime as DOMHighResTimeStamp
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { memoizeByRef } from '@livestore/utils'
|
|
2
|
-
import {
|
|
2
|
+
import { Effect, Option, ReadonlyArray as EffectArray, Schema, Stream } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
|
-
import { type SqliteDb,
|
|
4
|
+
import { type SqliteDb, UnknownError } from './adapter-types.ts'
|
|
5
5
|
import type { MaterializeEvent } from './leader-thread/mod.ts'
|
|
6
6
|
import type { EventDef, LiveStoreSchema } from './schema/mod.ts'
|
|
7
|
-
import { EventSequenceNumber,
|
|
7
|
+
import { EventSequenceNumber, LiveStoreEvent, SystemTables } from './schema/mod.ts'
|
|
8
8
|
import type { PreparedBindValues } from './util.ts'
|
|
9
9
|
import { sql } from './util.ts'
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
/** Parse JSON string to unknown value */
|
|
12
|
+
const jsonParse = Schema.decodeUnknownSync(Schema.fromJsonString(Schema.Unknown))
|
|
13
|
+
|
|
14
|
+
export const rematerializeFromEventlog = Effect.fn('@livestore/common:rematerializeFromEventlog')(function* ({
|
|
12
15
|
dbEventlog,
|
|
13
16
|
// TODO re-use this db when bringing back the boot in-memory db implementation
|
|
14
17
|
// db,
|
|
@@ -21,105 +24,115 @@ export const rematerializeFromEventlog = ({
|
|
|
21
24
|
schema: LiveStoreSchema
|
|
22
25
|
onProgress: (_: { done: number; total: number }) => Effect.Effect<void>
|
|
23
26
|
materializeEvent: MaterializeEvent
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
)[0]!.count
|
|
27
|
+
}) {
|
|
28
|
+
const eventsCount = dbEventlog.select<{ count: number }>(
|
|
29
|
+
`SELECT COUNT(*) AS count FROM ${SystemTables.EVENTLOG_META_TABLE}`,
|
|
30
|
+
)[0]!.count
|
|
29
31
|
|
|
30
|
-
|
|
32
|
+
const hashEventDef = memoizeByRef((event: EventDef.AnyWithoutFn) => Schema.hash(event.schema))
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
34
|
+
const processEvent = Effect.fn(`@livestore/common:rematerializeFromEventlog:processEvent`)(function* (
|
|
35
|
+
row: SystemTables.EventlogMetaRow,
|
|
36
|
+
) {
|
|
37
|
+
const args = jsonParse(row.argsJson)
|
|
38
|
+
const eventEncoded = LiveStoreEvent.Client.EncodedWithMeta.make({
|
|
39
|
+
name: row.name,
|
|
40
|
+
args,
|
|
41
|
+
seqNum: {
|
|
42
|
+
global: row.seqNumGlobal,
|
|
43
|
+
client: row.seqNumClient,
|
|
44
|
+
rebaseGeneration: row.seqNumRebaseGeneration,
|
|
45
|
+
},
|
|
46
|
+
parentSeqNum: {
|
|
47
|
+
global: row.parentSeqNumGlobal,
|
|
48
|
+
client: row.parentSeqNumClient,
|
|
49
|
+
rebaseGeneration: row.parentSeqNumRebaseGeneration,
|
|
50
|
+
},
|
|
51
|
+
clientId: row.clientId,
|
|
52
|
+
sessionId: row.sessionId,
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
const eventDef = schema.eventsDefsMap.get(row.name)
|
|
56
|
+
const materializer = schema.state.materializers.get(row.name)
|
|
57
|
+
|
|
58
|
+
if (eventDef === undefined || materializer === undefined) {
|
|
59
|
+
// Route unknown events through the normal materialization boundary so
|
|
60
|
+
// they advance the state snapshot head as no-ops.
|
|
61
|
+
yield* materializeEvent(eventEncoded, { skipEventlog: true })
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (hashEventDef(eventDef) !== row.schemaHash) {
|
|
66
|
+
yield* Effect.logWarning(
|
|
67
|
+
`Schema hash mismatch for event definition ${row.name}. Trying to materialize event anyway.`,
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Checking whether the schema has changed in an incompatible way
|
|
72
|
+
yield* Schema.decodeUnknownEffect(eventDef.schema)(args).pipe(
|
|
73
|
+
Effect.mapError((cause) =>
|
|
74
|
+
UnknownError.make({
|
|
75
|
+
cause,
|
|
76
|
+
note: `\
|
|
50
77
|
There was an error during rematerializing from the eventlog while decoding
|
|
51
78
|
the persisted event args for event definition "${row.name}".
|
|
52
79
|
This likely means the schema has changed in an incompatible way.
|
|
53
80
|
`,
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
parentSeqNum: {
|
|
65
|
-
global: row.parentSeqNumGlobal,
|
|
66
|
-
client: row.parentSeqNumClient,
|
|
67
|
-
rebaseGeneration: row.parentSeqNumRebaseGeneration,
|
|
68
|
-
},
|
|
69
|
-
name: row.name,
|
|
70
|
-
args,
|
|
71
|
-
clientId: row.clientId,
|
|
72
|
-
sessionId: row.sessionId,
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
yield* materializeEvent(eventEncoded, { skipEventlog: true })
|
|
76
|
-
}).pipe(Effect.withSpan(`@livestore/common:rematerializeFromEventlog:processEvent`))
|
|
77
|
-
|
|
78
|
-
const CHUNK_SIZE = 100
|
|
79
|
-
|
|
80
|
-
const stmt = dbEventlog.prepare(sql`\
|
|
81
|
+
}),
|
|
82
|
+
),
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
yield* materializeEvent(eventEncoded, { skipEventlog: true })
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
const CHUNK_SIZE = 100
|
|
89
|
+
|
|
90
|
+
const stmt = dbEventlog.prepare(sql`\
|
|
81
91
|
SELECT * FROM ${SystemTables.EVENTLOG_META_TABLE}
|
|
82
92
|
WHERE seqNumGlobal > $seqNumGlobal OR (seqNumGlobal = $seqNumGlobal AND seqNumClient > $seqNumClient)
|
|
83
93
|
ORDER BY seqNumGlobal ASC, seqNumClient ASC
|
|
84
94
|
LIMIT ${CHUNK_SIZE}
|
|
85
95
|
`)
|
|
86
96
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
SystemTables.EventlogMetaRow
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
)
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
97
|
+
let processedEvents = 0
|
|
98
|
+
|
|
99
|
+
yield* Stream.paginate(EventSequenceNumber.Client.ROOT, (lastId) =>
|
|
100
|
+
Effect.sync(() => {
|
|
101
|
+
const rows = stmt.select<SystemTables.EventlogMetaRow>({
|
|
102
|
+
$seqNumGlobal: lastId.global,
|
|
103
|
+
$seqNumClient: lastId.client,
|
|
104
|
+
} as any as PreparedBindValues)
|
|
105
|
+
|
|
106
|
+
if (EffectArray.isReadonlyArrayNonEmpty(rows) === false) {
|
|
107
|
+
const done: readonly [
|
|
108
|
+
ReadonlyArray<SystemTables.EventlogMetaRow>,
|
|
109
|
+
Option.Option<EventSequenceNumber.Client.Composite>,
|
|
110
|
+
] = [rows, Option.none()]
|
|
111
|
+
return done
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const lastRow = EffectArray.lastNonEmpty(rows)
|
|
115
|
+
const nextCursor = EventSequenceNumber.Client.Composite.make({
|
|
116
|
+
global: lastRow.seqNumGlobal,
|
|
117
|
+
client: lastRow.seqNumClient,
|
|
118
|
+
rebaseGeneration: lastRow.seqNumRebaseGeneration,
|
|
119
|
+
})
|
|
120
|
+
const next: readonly [
|
|
121
|
+
ReadonlyArray<SystemTables.EventlogMetaRow>,
|
|
122
|
+
Option.Option<EventSequenceNumber.Client.Composite>,
|
|
123
|
+
] = [rows, Option.some(nextCursor)]
|
|
124
|
+
return next
|
|
125
|
+
}),
|
|
126
|
+
).pipe(
|
|
127
|
+
Stream.bufferArray({ capacity: 2 }),
|
|
128
|
+
Stream.tap((row) =>
|
|
129
|
+
Effect.gen(function* () {
|
|
130
|
+
yield* processEvent(row)
|
|
131
|
+
|
|
132
|
+
processedEvents++
|
|
133
|
+
yield* onProgress({ done: processedEvents, total: eventsCount })
|
|
134
|
+
}),
|
|
135
|
+
),
|
|
136
|
+
Stream.runDrain,
|
|
125
137
|
)
|
|
138
|
+
}, Effect.withPerformanceMeasure('@livestore/common:rematerializeFromEventlog'))
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { Schema } from '@livestore/utils/effect'
|
|
4
|
+
|
|
5
|
+
import { synced } from './define.ts'
|
|
6
|
+
|
|
7
|
+
describe('synced event wire schema', () => {
|
|
8
|
+
const occurredAt = new Date('2026-07-17T10:15:30.000Z')
|
|
9
|
+
const event = synced({
|
|
10
|
+
name: 'v1.Occurred',
|
|
11
|
+
schema: Schema.Struct({
|
|
12
|
+
occurredAt: Schema.DateFromString,
|
|
13
|
+
}),
|
|
14
|
+
})
|
|
15
|
+
const jsonSchema = Schema.fromJsonString(event.schema)
|
|
16
|
+
|
|
17
|
+
test('roundtrips a valid date through JSON', () => {
|
|
18
|
+
const encoded = Schema.encodeSync(jsonSchema)({ occurredAt })
|
|
19
|
+
|
|
20
|
+
expect(encoded).toBe('{"occurredAt":"2026-07-17T10:15:30.000Z"}')
|
|
21
|
+
expect(Schema.decodeSync(jsonSchema)(encoded)).toEqual({ occurredAt })
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
test('rejects invalid dates on encode and decode', () => {
|
|
25
|
+
expect(() => Schema.encodeSync(jsonSchema)({ occurredAt: new Date(Number.NaN) })).toThrow()
|
|
26
|
+
expect(() => Schema.decodeSync(jsonSchema)('{"occurredAt":"not-a-date"}')).toThrow()
|
|
27
|
+
})
|
|
28
|
+
})
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Definition Functions
|
|
3
|
+
*
|
|
4
|
+
* This module provides functions for creating event definitions in LiveStore.
|
|
5
|
+
* Events are the core unit of state change - all mutations to the database
|
|
6
|
+
* happen through events that are committed to the eventlog.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { Events } from '@livestore/livestore'
|
|
11
|
+
* import { Schema } from 'effect'
|
|
12
|
+
*
|
|
13
|
+
* // Define events for your application
|
|
14
|
+
* export const events = {
|
|
15
|
+
* // Synced events are sent to the sync backend
|
|
16
|
+
* todoCreated: Events.synced({
|
|
17
|
+
* name: 'v1.TodoCreated',
|
|
18
|
+
* schema: Schema.Struct({ id: Schema.String, text: Schema.String }),
|
|
19
|
+
* }),
|
|
20
|
+
*
|
|
21
|
+
* // Client-only events stay local (useful for UI state)
|
|
22
|
+
* uiStateSet: Events.clientOnly({
|
|
23
|
+
* name: 'UiStateSet',
|
|
24
|
+
* schema: Schema.Struct({ selectedId: Schema.NullOr(Schema.String) }),
|
|
25
|
+
* }),
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
* @module
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { shouldNeverHappen } from '@livestore/utils'
|
|
32
|
+
import { Result, Schema } from '@livestore/utils/effect'
|
|
33
|
+
|
|
34
|
+
import type { EventDef } from './event-def.ts'
|
|
35
|
+
import type { EventDefFactInput, EventDefFacts } from './facts.ts'
|
|
36
|
+
|
|
37
|
+
/** Options for defining an event. */
|
|
38
|
+
export type DefineEventOptions<TTo, TDerived extends boolean = false> = {
|
|
39
|
+
/**
|
|
40
|
+
* Callback defining fact constraints for this event.
|
|
41
|
+
* @experimental This feature is not fully implemented yet.
|
|
42
|
+
*/
|
|
43
|
+
facts?: (
|
|
44
|
+
args: TTo,
|
|
45
|
+
currentFacts: EventDefFacts,
|
|
46
|
+
) => {
|
|
47
|
+
modify?: {
|
|
48
|
+
/** Facts to set (create or update). */
|
|
49
|
+
set?: Iterable<EventDefFactInput>
|
|
50
|
+
/** Facts to unset (remove). */
|
|
51
|
+
unset?: Iterable<EventDefFactInput>
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Facts that must exist for this event to be valid.
|
|
55
|
+
* Used for history constraints and compaction rules.
|
|
56
|
+
*/
|
|
57
|
+
require?: Iterable<EventDefFactInput>
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* When true, the event is only synced within the same client's sessions
|
|
62
|
+
* but never sent to the sync backend. Useful for UI state.
|
|
63
|
+
* @default false
|
|
64
|
+
*/
|
|
65
|
+
clientOnly?: boolean
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* When true, marks this as a derived event that cannot have materializers.
|
|
69
|
+
* @default false
|
|
70
|
+
*/
|
|
71
|
+
derived?: TDerived
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Marks the entire event as deprecated with a reason message.
|
|
75
|
+
* When this event is committed, a warning will be logged.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* Events.synced({
|
|
80
|
+
* name: 'v1.TodoRenamed',
|
|
81
|
+
* schema: Schema.Struct({ id: Schema.String, name: Schema.String }),
|
|
82
|
+
* deprecated: "Use 'v1.TodoUpdated' instead",
|
|
83
|
+
* })
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
deprecated?: string
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Creates an event definition with full control over all options.
|
|
91
|
+
*
|
|
92
|
+
* This is the low-level function for creating events. For most cases,
|
|
93
|
+
* prefer using `synced()` or `clientOnly()` which provide simpler APIs.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* const customEvent = defineEvent({
|
|
98
|
+
* name: 'v1.CustomEvent',
|
|
99
|
+
* schema: Schema.Struct({ data: Schema.String }),
|
|
100
|
+
* clientOnly: false,
|
|
101
|
+
* derived: false,
|
|
102
|
+
* })
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export const defineEvent = <TName extends string, TType, TEncoded = TType, TDerived extends boolean = false>(
|
|
106
|
+
args: {
|
|
107
|
+
name: TName
|
|
108
|
+
schema: Schema.Codec<TType, TEncoded>
|
|
109
|
+
} & DefineEventOptions<TType, TDerived>,
|
|
110
|
+
): EventDef<TName, TType, TEncoded, TDerived> => {
|
|
111
|
+
const { name, schema, ...options } = args
|
|
112
|
+
|
|
113
|
+
const makePartialEvent = (args: TType) => {
|
|
114
|
+
const res = Schema.decodeResult(Schema.toType(schema))(args)
|
|
115
|
+
if (Result.isFailure(res) === true) {
|
|
116
|
+
shouldNeverHappen(`Invalid event args for event '${name}':`, res.failure.message, '\n')
|
|
117
|
+
}
|
|
118
|
+
return { name: name, args }
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
Object.defineProperty(makePartialEvent, 'name', { value: name })
|
|
122
|
+
Object.defineProperty(makePartialEvent, 'schema', { value: schema })
|
|
123
|
+
Object.defineProperty(makePartialEvent, 'encoded', {
|
|
124
|
+
value: (args: TEncoded) => ({ name: name, args }),
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
Object.defineProperty(makePartialEvent, 'options', {
|
|
128
|
+
value: {
|
|
129
|
+
clientOnly: options?.clientOnly ?? false,
|
|
130
|
+
facts:
|
|
131
|
+
options?.facts !== undefined
|
|
132
|
+
? (args, currentFacts) => {
|
|
133
|
+
const res = options.facts!(args, currentFacts)
|
|
134
|
+
return {
|
|
135
|
+
modify: {
|
|
136
|
+
set: res.modify?.set !== undefined ? new Set(res.modify.set) : new Set(),
|
|
137
|
+
unset: res.modify?.unset !== undefined ? new Set(res.modify.unset) : new Set(),
|
|
138
|
+
},
|
|
139
|
+
require: res.require !== undefined ? new Set(res.require) : new Set(),
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
: undefined,
|
|
143
|
+
derived: options?.derived ?? false,
|
|
144
|
+
deprecated: options?.deprecated,
|
|
145
|
+
} satisfies EventDef.Any['options'],
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
return makePartialEvent as EventDef<TName, TType, TEncoded, TDerived>
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Creates a synced event definition.
|
|
153
|
+
*
|
|
154
|
+
* Synced events are sent to the sync backend and distributed to all connected
|
|
155
|
+
* clients. Use this for collaborative data that should be shared across users
|
|
156
|
+
* and devices.
|
|
157
|
+
*
|
|
158
|
+
* Event names should be versioned (e.g., `v1.TodoCreated`) to support
|
|
159
|
+
* schema evolution over time.
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```ts
|
|
163
|
+
* import { Events } from '@livestore/livestore'
|
|
164
|
+
* import { Schema } from 'effect'
|
|
165
|
+
*
|
|
166
|
+
* const todoCreated = Events.synced({
|
|
167
|
+
* name: 'v1.TodoCreated',
|
|
168
|
+
* schema: Schema.Struct({
|
|
169
|
+
* id: Schema.String,
|
|
170
|
+
* text: Schema.String,
|
|
171
|
+
* completed: Schema.Boolean,
|
|
172
|
+
* }),
|
|
173
|
+
* })
|
|
174
|
+
*
|
|
175
|
+
* // Commit the event
|
|
176
|
+
* store.commit(todoCreated({ id: 'abc', text: 'Buy milk', completed: false }))
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
export const synced = <TName extends string, TType, TEncoded = TType>(
|
|
180
|
+
args: {
|
|
181
|
+
name: TName
|
|
182
|
+
schema: Schema.Codec<TType, TEncoded>
|
|
183
|
+
} & Omit<DefineEventOptions<TType>, 'derived' | 'clientOnly'>,
|
|
184
|
+
): EventDef<TName, TType, TEncoded> => defineEvent({ ...args, clientOnly: false })
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Creates a client-only event definition.
|
|
188
|
+
*
|
|
189
|
+
* Client-only events are synced within the same client's sessions (e.g., across
|
|
190
|
+
* browser tabs) but are never sent to the sync backend. Use this for local UI
|
|
191
|
+
* state like selected items, filter settings, or draft content.
|
|
192
|
+
*
|
|
193
|
+
* Note: Client-only events still require materializers and are stored in the
|
|
194
|
+
* local eventlog, they just don't participate in server-side sync.
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* ```ts
|
|
198
|
+
* import { Events } from '@livestore/livestore'
|
|
199
|
+
* import { Schema } from 'effect'
|
|
200
|
+
*
|
|
201
|
+
* const uiStateSet = Events.clientOnly({
|
|
202
|
+
* name: 'UiStateSet',
|
|
203
|
+
* schema: Schema.Struct({
|
|
204
|
+
* selectedTodoId: Schema.NullOr(Schema.String),
|
|
205
|
+
* filterMode: Schema.Literals(['all', 'active', 'completed']),
|
|
206
|
+
* }),
|
|
207
|
+
* })
|
|
208
|
+
*
|
|
209
|
+
* // Update local UI state
|
|
210
|
+
* store.commit(uiStateSet({ selectedTodoId: 'abc', filterMode: 'active' }))
|
|
211
|
+
* ```
|
|
212
|
+
*/
|
|
213
|
+
export const clientOnly = <TName extends string, TType, TEncoded = TType>(
|
|
214
|
+
args: {
|
|
215
|
+
name: TName
|
|
216
|
+
schema: Schema.Codec<TType, TEncoded>
|
|
217
|
+
} & Omit<DefineEventOptions<TType>, 'derived' | 'clientOnly'>,
|
|
218
|
+
): EventDef<TName, TType, TEncoded> => defineEvent({ ...args, clientOnly: true })
|