@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
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionIdSymbol is a user-facing placeholder for "the current client session".
|
|
3
|
+
* User code can keep using the same event/query object across sessions, while the
|
|
4
|
+
* storage and eventlog layers require concrete string ids. Resolving the symbol at
|
|
5
|
+
* those boundaries preserves the symbolic API without mutating caller-owned values.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { Predicate } from '@livestore/utils/effect'
|
|
10
|
+
|
|
11
|
+
import type { Bindable, SqlValue } from './util.ts'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Can be used in queries to refer to the current session id.
|
|
15
|
+
* Will be replaced with the actual session id at runtime.
|
|
16
|
+
*
|
|
17
|
+
* In client document table:
|
|
18
|
+
* ```ts
|
|
19
|
+
* const uiState = State.SQLite.clientDocument({
|
|
20
|
+
* name: 'ui_state',
|
|
21
|
+
* schema: Schema.Struct({
|
|
22
|
+
* theme: Schema.Literals(['dark', 'light', 'system']),
|
|
23
|
+
* user: Schema.String,
|
|
24
|
+
* showToolbar: Schema.Boolean,
|
|
25
|
+
* }),
|
|
26
|
+
* default: { value: defaultFrontendState, id: SessionIdSymbol },
|
|
27
|
+
* })
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* Or in a client document query:
|
|
31
|
+
* ```ts
|
|
32
|
+
* const query$ = queryDb(tables.uiState.get(SessionIdSymbol))
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export const SessionIdSymbol = Symbol.for('@livestore/session-id')
|
|
36
|
+
export type SessionIdSymbol = typeof SessionIdSymbol
|
|
37
|
+
|
|
38
|
+
export type BindableWithSessionIdSymbol =
|
|
39
|
+
| ReadonlyArray<SqlValue | SessionIdSymbol>
|
|
40
|
+
| Record<string, SqlValue | SessionIdSymbol>
|
|
41
|
+
|
|
42
|
+
export const resolveSessionIdSymbolInBindValues = (
|
|
43
|
+
bindValues: BindableWithSessionIdSymbol,
|
|
44
|
+
sessionId: string,
|
|
45
|
+
): Bindable => {
|
|
46
|
+
return Array.isArray(bindValues) === true
|
|
47
|
+
? bindValues.map((value) => (value === SessionIdSymbol ? sessionId : value))
|
|
48
|
+
: (Object.fromEntries(
|
|
49
|
+
Object.entries(bindValues).map(([key, value]) => [key, value === SessionIdSymbol ? sessionId : value]),
|
|
50
|
+
) as Record<string, SqlValue>)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export const resolveSessionIdSymbolInEventArgs = (args: unknown, sessionId: string): unknown => {
|
|
54
|
+
if (Predicate.hasProperty(args, 'id') === false) {
|
|
55
|
+
return args
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return args.id === SessionIdSymbol ? { ...args, id: sessionId } : args
|
|
59
|
+
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { shouldNeverHappen } from '@livestore/utils'
|
|
2
|
-
import { pipe, ReadonlyArray, Schema,
|
|
2
|
+
import { pipe, ReadonlyArray, ReadonlyRecord, Result, Schema, SchemaIssue } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
4
|
import type { SqliteDsl } from '../schema/state/sqlite/db-schema/mod.ts'
|
|
5
5
|
import { sql } from '../util.ts'
|
|
6
|
-
import { objectEntries } from './misc.ts'
|
|
7
6
|
import * as ClientTypes from './types.ts'
|
|
8
7
|
|
|
9
8
|
export type BindValues = {
|
|
@@ -23,7 +22,7 @@ export const findManyRows = <TColumns extends SqliteDsl.Columns>({
|
|
|
23
22
|
}): [string, BindValues] => {
|
|
24
23
|
const whereSql = buildWhereSql({ where })
|
|
25
24
|
const whereModifier = whereSql === '' ? '' : `WHERE ${whereSql}`
|
|
26
|
-
const limitModifier = limit ? `LIMIT ${limit}` : ''
|
|
25
|
+
const limitModifier = limit !== undefined ? `LIMIT ${limit}` : ''
|
|
27
26
|
|
|
28
27
|
const whereBindValues = makeBindValues({ columns, values: where, variablePrefix: 'where_', skipNil: true })
|
|
29
28
|
|
|
@@ -80,7 +79,7 @@ export const insertRowPrepared = <TColumns extends SqliteDsl.Columns>({
|
|
|
80
79
|
const keysStr = keys.join(', ')
|
|
81
80
|
const valuesStr = keys.map((key) => `$${key}`).join(', ')
|
|
82
81
|
|
|
83
|
-
return sql`INSERT ${options.orReplace ? 'OR REPLACE ' : ''}INTO ${tableName} (${keysStr}) VALUES (${valuesStr})`
|
|
82
|
+
return sql`INSERT ${options.orReplace === true ? 'OR REPLACE ' : ''}INTO ${tableName} (${keysStr}) VALUES (${valuesStr})`
|
|
84
83
|
}
|
|
85
84
|
|
|
86
85
|
export const insertRows = <TColumns extends SqliteDsl.Columns>({
|
|
@@ -106,7 +105,6 @@ export const insertRows = <TColumns extends SqliteDsl.Columns>({
|
|
|
106
105
|
|
|
107
106
|
const bindValues = valuesArray.reduce(
|
|
108
107
|
(acc, values, itemIndex) => ({
|
|
109
|
-
// biome-ignore lint/performance/noAccumulatingSpread: TODO improve this some day
|
|
110
108
|
...acc,
|
|
111
109
|
...makeBindValues({ columns, values, variablePrefix: `item_${itemIndex}_` }),
|
|
112
110
|
}),
|
|
@@ -134,7 +132,7 @@ export const insertOrIgnoreRow = <TColumns extends SqliteDsl.Columns>({
|
|
|
134
132
|
.join(', ')
|
|
135
133
|
|
|
136
134
|
const bindValues = makeBindValues({ columns, values })
|
|
137
|
-
const returningStmt = returnRow ? 'RETURNING *' : ''
|
|
135
|
+
const returningStmt = returnRow === true ? 'RETURNING *' : ''
|
|
138
136
|
|
|
139
137
|
return [sql`INSERT OR IGNORE INTO ${tableName} (${keysStr}) VALUES (${valuesStr}) ${returningStmt}`, bindValues]
|
|
140
138
|
}
|
|
@@ -247,7 +245,15 @@ export const createTable = ({
|
|
|
247
245
|
.map(([columnName, _]) => columnName)
|
|
248
246
|
const columnDefStrs = Object.entries(table.columns).map(([columnName, columnDef]) => {
|
|
249
247
|
const nullModifier = columnDef.nullable === true ? '' : 'NOT NULL'
|
|
250
|
-
const defaultModifier =
|
|
248
|
+
const defaultModifier = (() => {
|
|
249
|
+
if (columnDef.default._tag === 'None') return ''
|
|
250
|
+
const defaultValue = columnDef.default.value
|
|
251
|
+
if (typeof defaultValue === 'function') return ''
|
|
252
|
+
if (defaultValue !== undefined && typeof defaultValue === 'object' && 'sql' in defaultValue) {
|
|
253
|
+
return `DEFAULT ${defaultValue.sql}`
|
|
254
|
+
}
|
|
255
|
+
return `DEFAULT ${defaultValue}`
|
|
256
|
+
})()
|
|
251
257
|
return sql`${columnName} ${columnDef.columnType} ${nullModifier} ${defaultModifier}`
|
|
252
258
|
})
|
|
253
259
|
|
|
@@ -271,15 +277,14 @@ export const makeBindValues = <TColumns extends SqliteDsl.Columns, TKeys extends
|
|
|
271
277
|
skipNil?: boolean
|
|
272
278
|
}): Record<string, any> => {
|
|
273
279
|
const codecMap = pipe(
|
|
274
|
-
columns,
|
|
275
|
-
objectEntries,
|
|
280
|
+
ReadonlyRecord.toEntries(columns),
|
|
276
281
|
ReadonlyArray.map(([columnName, columnDef]) => [
|
|
277
282
|
columnName,
|
|
278
283
|
(value: any) => {
|
|
279
284
|
if (columnDef.nullable === true && (value === null || value === undefined)) return null
|
|
280
|
-
const res = Schema.
|
|
281
|
-
if (res
|
|
282
|
-
const parseErrorStr =
|
|
285
|
+
const res = Schema.encodeResult(columnDef.schema)(value)
|
|
286
|
+
if (Result.isFailure(res) === true) {
|
|
287
|
+
const parseErrorStr = SchemaIssue.makeFormatterDefault()(res.failure.issue)
|
|
283
288
|
const expectedSchemaStr = String(columnDef.schema.ast)
|
|
284
289
|
|
|
285
290
|
console.error(
|
|
@@ -293,11 +298,11 @@ Error: ${parseErrorStr}
|
|
|
293
298
|
Value:`,
|
|
294
299
|
value,
|
|
295
300
|
)
|
|
296
|
-
//
|
|
301
|
+
// oxlint-disable-next-line eslint(no-debugger) -- intentional breakpoint for SQL decode errors
|
|
297
302
|
debugger
|
|
298
|
-
throw res.
|
|
303
|
+
throw res.failure
|
|
299
304
|
} else {
|
|
300
|
-
return res.
|
|
305
|
+
return res.success
|
|
301
306
|
}
|
|
302
307
|
},
|
|
303
308
|
]),
|
|
@@ -341,7 +346,11 @@ const buildWhereSql = <TColumns extends SqliteDsl.Columns>({
|
|
|
341
346
|
const getWhereOp = (columnName: string, value: ClientTypes.WhereValueForDecoded<any>) => {
|
|
342
347
|
if (value === null) {
|
|
343
348
|
return `IS NULL`
|
|
344
|
-
} else if (
|
|
349
|
+
} else if (
|
|
350
|
+
typeof value === 'object' &&
|
|
351
|
+
typeof value.op === 'string' &&
|
|
352
|
+
ClientTypes.isValidWhereOp(value.op) === true
|
|
353
|
+
) {
|
|
345
354
|
return `${value.op} $where_${columnName}`
|
|
346
355
|
} else if (typeof value === 'object' && typeof value.op === 'string' && value.op === 'in') {
|
|
347
356
|
return `in (${value.val.map((_: any, i: number) => `$where_${columnName}_${i}`).join(', ')})`
|
|
@@ -351,8 +360,7 @@ const buildWhereSql = <TColumns extends SqliteDsl.Columns>({
|
|
|
351
360
|
}
|
|
352
361
|
|
|
353
362
|
return pipe(
|
|
354
|
-
where,
|
|
355
|
-
objectEntries,
|
|
363
|
+
ReadonlyRecord.toEntries(where),
|
|
356
364
|
ReadonlyArray.map(([columnName, value]) => `${columnName} ${getWhereOp(columnName, value)}`),
|
|
357
365
|
ReadonlyArray.join(' AND '),
|
|
358
366
|
)
|
package/src/sql-queries/types.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { Schema } from '@livestore/utils/effect'
|
|
1
|
+
import type { Schema, Types } from '@livestore/utils/effect'
|
|
3
2
|
|
|
4
3
|
import type { SqliteDsl } from '../schema/state/sqlite/db-schema/mod.ts'
|
|
5
4
|
|
|
6
5
|
export type DecodedValuesForTableAll<TSchema extends SqliteDsl.DbSchema, TTableName extends keyof TSchema> = {
|
|
7
|
-
[K in keyof GetColumns<TSchema, TTableName>]:
|
|
6
|
+
[K in keyof GetColumns<TSchema, TTableName>]: GetColumn<TSchema, TTableName, K>['schema']['Type']
|
|
8
7
|
}
|
|
9
8
|
|
|
10
9
|
export type DecodedValuesForTablePretty<
|
|
11
10
|
TSchema extends SqliteDsl.DbSchema,
|
|
12
11
|
TTableName extends keyof TSchema,
|
|
13
|
-
> =
|
|
12
|
+
> = Types.Simplify<DecodedValuesForTable<TSchema, TTableName>>
|
|
14
13
|
|
|
15
14
|
export type DecodedValuesForTable<TSchema extends SqliteDsl.DbSchema, TTableName extends keyof TSchema> = Partial<
|
|
16
15
|
Pick<DecodedValuesForTableAll<TSchema, TTableName>, GetNullableColumnNamesForTable<TSchema, TTableName>>
|
|
@@ -40,7 +39,7 @@ export const isValidWhereOp = (op: string): op is WhereOp => {
|
|
|
40
39
|
}
|
|
41
40
|
|
|
42
41
|
export type EncodedValuesForTableAll<TSchema extends SqliteDsl.DbSchema, TTableName extends keyof TSchema> = {
|
|
43
|
-
[K in keyof GetColumns<TSchema, TTableName>]:
|
|
42
|
+
[K in keyof GetColumns<TSchema, TTableName>]: GetColumn<TSchema, TTableName, K>['schema']['Type']
|
|
44
43
|
}
|
|
45
44
|
|
|
46
45
|
export type EncodedValuesForTable<TSchema extends SqliteDsl.DbSchema, TTableName extends keyof TSchema> = Partial<
|
|
@@ -69,7 +68,7 @@ export type GetColumn<
|
|
|
69
68
|
> = TSchema[TTableName]['columns'][TColumnName]
|
|
70
69
|
|
|
71
70
|
export type DecodedValuesForColumnsAll<TColumns extends SqliteDsl.Columns> = {
|
|
72
|
-
[K in keyof TColumns]:
|
|
71
|
+
[K in keyof TColumns]: TColumns[K]['schema']['Type']
|
|
73
72
|
}
|
|
74
73
|
|
|
75
74
|
export type DecodedValuesForColumns<TColumns extends SqliteDsl.Columns> = Partial<
|
|
@@ -78,7 +77,7 @@ export type DecodedValuesForColumns<TColumns extends SqliteDsl.Columns> = Partia
|
|
|
78
77
|
Omit<DecodedValuesForColumnsAll<TColumns>, GetNullableColumnNames<TColumns>>
|
|
79
78
|
|
|
80
79
|
export type EncodedValuesForColumnsAll<TColumns extends SqliteDsl.Columns> = {
|
|
81
|
-
[K in keyof TColumns]:
|
|
80
|
+
[K in keyof TColumns]: TColumns[K]['schema']['Encoded']
|
|
82
81
|
}
|
|
83
82
|
|
|
84
83
|
export type EncodedValuesForColumns<TColumns extends SqliteDsl.Columns> = Partial<
|
package/src/sqlite-db-helper.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Schema } from '@livestore/utils/effect'
|
|
1
|
+
import { Effect, Exit, Function, Schema } from '@livestore/utils/effect'
|
|
2
2
|
|
|
3
3
|
import { type SqliteDb, SqliteError } from './adapter-types.ts'
|
|
4
4
|
import { getResultSchema, isQueryBuilder } from './schema/state/sqlite/query-builder/mod.ts'
|
|
@@ -14,7 +14,7 @@ export const makeExecute = (
|
|
|
14
14
|
return (...args: any[]) => {
|
|
15
15
|
const [queryStrOrQueryBuilder, bindValuesOrOptions, maybeOptions] = args
|
|
16
16
|
|
|
17
|
-
if (isQueryBuilder(queryStrOrQueryBuilder)) {
|
|
17
|
+
if (isQueryBuilder(queryStrOrQueryBuilder) === true) {
|
|
18
18
|
const { query, bindValues } = queryStrOrQueryBuilder.asSql()
|
|
19
19
|
return execute(query, bindValues as unknown as PreparedBindValues, bindValuesOrOptions)
|
|
20
20
|
} else {
|
|
@@ -29,22 +29,84 @@ export const makeSelect = <T>(
|
|
|
29
29
|
return (...args: any[]) => {
|
|
30
30
|
const [queryStrOrQueryBuilder, maybeBindValues] = args
|
|
31
31
|
|
|
32
|
-
if (isQueryBuilder(queryStrOrQueryBuilder)) {
|
|
32
|
+
if (isQueryBuilder(queryStrOrQueryBuilder) === true) {
|
|
33
33
|
const { query, bindValues } = queryStrOrQueryBuilder.asSql()
|
|
34
34
|
const resultSchema = getResultSchema(queryStrOrQueryBuilder)
|
|
35
35
|
const results = select(query, bindValues as unknown as PreparedBindValues)
|
|
36
|
-
return Schema.
|
|
36
|
+
return Schema.decodeUnknownSync(resultSchema)(results)
|
|
37
37
|
} else {
|
|
38
38
|
return select(queryStrOrQueryBuilder, maybeBindValues)
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
/**
|
|
44
|
+
* Runs an Effect inside an SQLite savepoint.
|
|
45
|
+
*
|
|
46
|
+
* @remarks
|
|
47
|
+
*
|
|
48
|
+
* This starts a savepoint before running `effect`, releases the savepoint on
|
|
49
|
+
* success, and rolls back to the savepoint before re-emitting the original
|
|
50
|
+
* failure on failure.
|
|
51
|
+
*
|
|
52
|
+
* Use this for atomic DB updates that need to compose with callers that may
|
|
53
|
+
* already have an open transaction.
|
|
54
|
+
*
|
|
55
|
+
* @see {@link https://sqlite.org/lang_savepoint.html | SQLite savepoint documentation}
|
|
56
|
+
* @see {@link https://sqlite.org/lang_transaction.html | SQLite transaction documentation}
|
|
57
|
+
*/
|
|
58
|
+
export const withSavepoint: {
|
|
59
|
+
(db: SqliteDb): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | SqliteError, R>
|
|
60
|
+
<A, E, R>(self: Effect.Effect<A, E, R>, db: SqliteDb): Effect.Effect<A, E | SqliteError, R>
|
|
61
|
+
} = Function.dual(
|
|
62
|
+
2,
|
|
63
|
+
<A, E, R>(self: Effect.Effect<A, E, R>, db: SqliteDb): Effect.Effect<A, E | SqliteError, R> =>
|
|
64
|
+
Effect.uninterruptibleMask((restore) =>
|
|
65
|
+
Effect.sync(generateSavepointName).pipe(
|
|
66
|
+
Effect.flatMap((savepointName) => {
|
|
67
|
+
const savepointSql = `SAVEPOINT ${savepointName}`
|
|
68
|
+
const releaseSql = `RELEASE SAVEPOINT ${savepointName}`
|
|
69
|
+
|
|
70
|
+
return executeSavepointSql(db, savepointSql).pipe(
|
|
71
|
+
// Cleanup is installed only after SQLite successfully creates the savepoint.
|
|
72
|
+
Effect.andThen(
|
|
73
|
+
restore(self).pipe(
|
|
74
|
+
Effect.exit,
|
|
75
|
+
Effect.flatMap((exit) => {
|
|
76
|
+
const cleanup =
|
|
77
|
+
Exit.isSuccess(exit) === true
|
|
78
|
+
? executeSavepointSql(db, releaseSql)
|
|
79
|
+
: executeSavepointSql(db, `ROLLBACK TO SAVEPOINT ${savepointName}`).pipe(
|
|
80
|
+
Effect.andThen(executeSavepointSql(db, releaseSql)),
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
// Cleanup failures supersede the wrapped exit because the connection state is uncertain.
|
|
84
|
+
return cleanup.pipe(Effect.andThen(exit))
|
|
85
|
+
}),
|
|
86
|
+
),
|
|
87
|
+
),
|
|
88
|
+
)
|
|
89
|
+
}),
|
|
90
|
+
),
|
|
91
|
+
),
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
let nextSavepointId = 0
|
|
95
|
+
|
|
96
|
+
/** Uses a reserved prefix and process-local counter to avoid caller-controlled or reused identifiers. */
|
|
97
|
+
const generateSavepointName = () => `livestore_savepoint_${nextSavepointId++}`
|
|
98
|
+
|
|
99
|
+
const executeSavepointSql = (db: SqliteDb, sql: string): Effect.Effect<void, SqliteError> =>
|
|
100
|
+
Effect.try({
|
|
101
|
+
try: () => db.execute(sql),
|
|
102
|
+
catch: (cause) => new SqliteError({ cause, query: { sql, bindValues: [] } }),
|
|
103
|
+
})
|
|
104
|
+
|
|
43
105
|
export const validateSnapshot = (snapshot: Uint8Array) => {
|
|
44
106
|
const headerBytes = new TextDecoder().decode(snapshot.slice(0, 16))
|
|
45
107
|
const hasValidHeader = headerBytes.startsWith('SQLite format 3')
|
|
46
108
|
|
|
47
|
-
if (
|
|
109
|
+
if (hasValidHeader === false) {
|
|
48
110
|
throw new SqliteError({
|
|
49
111
|
cause: 'Invalid SQLite header',
|
|
50
112
|
note: `Expected header to start with 'SQLite format 3', but got: ${headerBytes}`,
|
package/src/sqlite-types.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Effect, Schema } from '@livestore/utils/effect'
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
import type { SqliteError, UnknownError } from './errors.ts'
|
|
3
4
|
import type { EventSequenceNumber } from './schema/mod.ts'
|
|
4
5
|
import type { QueryBuilder } from './schema/state/sqlite/query-builder/api.ts'
|
|
5
6
|
import type { PreparedBindValues } from './util.ts'
|
|
@@ -17,12 +18,12 @@ export interface SqliteDb<TReq = any, TMetadata extends TReq = TReq> {
|
|
|
17
18
|
prepare(queryStr: string): PreparedStatement
|
|
18
19
|
execute(
|
|
19
20
|
queryStr: string,
|
|
20
|
-
bindValues?: PreparedBindValues
|
|
21
|
+
bindValues?: PreparedBindValues,
|
|
21
22
|
options?: { onRowsChanged?: (rowsChanged: number) => void },
|
|
22
23
|
): void
|
|
23
24
|
execute(queryBuilder: QueryBuilder.Any, options?: { onRowsChanged?: (rowsChanged: number) => void }): void
|
|
24
25
|
|
|
25
|
-
select<T>(queryStr: string, bindValues?: PreparedBindValues
|
|
26
|
+
select<T>(queryStr: string, bindValues?: PreparedBindValues): ReadonlyArray<T>
|
|
26
27
|
select<T>(queryBuilder: QueryBuilder<T, any, any>): T
|
|
27
28
|
|
|
28
29
|
export(): Uint8Array<ArrayBuffer>
|
|
@@ -33,7 +34,7 @@ export interface SqliteDb<TReq = any, TMetadata extends TReq = TReq> {
|
|
|
33
34
|
makeChangeset: (data: Uint8Array<ArrayBuffer>) => SqliteDbChangeset
|
|
34
35
|
}
|
|
35
36
|
|
|
36
|
-
export type SqliteDebugInfo = { head: EventSequenceNumber.
|
|
37
|
+
export type SqliteDebugInfo = { head: EventSequenceNumber.Client.Composite }
|
|
37
38
|
|
|
38
39
|
// TODO refactor this helper type. It's quite cumbersome to use and should be revisited.
|
|
39
40
|
export type MakeSqliteDb<
|
|
@@ -46,7 +47,7 @@ export type MakeSqliteDb<
|
|
|
46
47
|
TMetadata extends TMetadata_ & { _tag: TInput['_tag'] } = TMetadata_ & { _tag: TInput['_tag'] },
|
|
47
48
|
>(
|
|
48
49
|
input: TInput,
|
|
49
|
-
) => Effect.Effect<SqliteDb<TReq, Extract<TMetadata, { _tag: TInput['_tag'] }>>, SqliteError |
|
|
50
|
+
) => Effect.Effect<SqliteDb<TReq, Extract<TMetadata, { _tag: TInput['_tag'] }>>, SqliteError | UnknownError, R>
|
|
50
51
|
|
|
51
52
|
export interface PreparedStatement {
|
|
52
53
|
execute(bindValues: PreparedBindValues | undefined, options?: { onRowsChanged?: (rowsChanged: number) => void }): void
|
|
@@ -66,11 +67,8 @@ export type SqliteDbChangeset = {
|
|
|
66
67
|
apply: () => void
|
|
67
68
|
}
|
|
68
69
|
|
|
69
|
-
export const PersistenceInfo = Schema.Struct(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
},
|
|
73
|
-
{ key: Schema.String, value: Schema.Any },
|
|
74
|
-
).annotations({ title: 'LiveStore.PersistenceInfo' })
|
|
70
|
+
export const PersistenceInfo = Schema.StructWithRest(Schema.Struct({ fileName: Schema.String }), [
|
|
71
|
+
Schema.Record(Schema.String, Schema.Any),
|
|
72
|
+
]).annotate({ title: 'LiveStore.PersistenceInfo' })
|
|
75
73
|
|
|
76
74
|
export type PersistenceInfo<With extends {} = {}> = typeof PersistenceInfo.Type & With
|