@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
package/src/sync/next/facts.ts
CHANGED
|
@@ -6,14 +6,13 @@ import type {
|
|
|
6
6
|
EventDefFactsGroup,
|
|
7
7
|
EventDefFactsSnapshot,
|
|
8
8
|
FactsCallback,
|
|
9
|
-
} from '../../schema/EventDef.ts'
|
|
10
|
-
import type * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
|
|
11
|
-
import { graphologyDag } from './graphology_.ts'
|
|
9
|
+
} from '../../schema/EventDef/mod.ts'
|
|
10
|
+
import type * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
|
|
12
11
|
import { EMPTY_FACT_VALUE, type HistoryDag, type HistoryDagNode } from './history-dag-common.ts'
|
|
13
12
|
|
|
14
13
|
export const factsSnapshotForEvents = (
|
|
15
14
|
events: HistoryDagNode[],
|
|
16
|
-
endEventSequenceNumber: EventSequenceNumber.
|
|
15
|
+
endEventSequenceNumber: EventSequenceNumber.Client.Composite,
|
|
17
16
|
): EventDefFactsSnapshot => {
|
|
18
17
|
const facts = new Map<string, any>()
|
|
19
18
|
|
|
@@ -30,11 +29,11 @@ export const factsSnapshotForEvents = (
|
|
|
30
29
|
|
|
31
30
|
export const factsSnapshotForDag = (
|
|
32
31
|
dag: HistoryDag,
|
|
33
|
-
endEventSequenceNumber: EventSequenceNumber.
|
|
32
|
+
endEventSequenceNumber: EventSequenceNumber.Client.Composite | undefined,
|
|
34
33
|
): EventDefFactsSnapshot => {
|
|
35
34
|
const facts = new Map<string, any>()
|
|
36
35
|
|
|
37
|
-
const orderedEventSequenceNumberStrs =
|
|
36
|
+
const orderedEventSequenceNumberStrs = dag.topologicalNodeIds()
|
|
38
37
|
|
|
39
38
|
for (let i = 0; i < orderedEventSequenceNumberStrs.length; i++) {
|
|
40
39
|
const event = dag.getNodeAttributes(orderedEventSequenceNumberStrs[i]!)
|
|
@@ -131,7 +130,7 @@ const isSubSetMapByValue = (setA: EventDefFacts, setB: EventDefFacts) => {
|
|
|
131
130
|
/** Check if setA is a subset of setB */
|
|
132
131
|
const isSubSetMapByKey = (setA: EventDefFacts, setB: EventDefFacts) => {
|
|
133
132
|
for (const [key, _value] of setA) {
|
|
134
|
-
if (
|
|
133
|
+
if (setB.has(key) === false) {
|
|
135
134
|
return false
|
|
136
135
|
}
|
|
137
136
|
}
|
|
@@ -169,7 +168,7 @@ export const factsToString = (facts: EventDefFacts) => {
|
|
|
169
168
|
|
|
170
169
|
export const factsIntersect = (setA: EventDefFacts, setB: EventDefFacts): boolean => {
|
|
171
170
|
for (const [key, _value] of setA) {
|
|
172
|
-
if (setB.has(key)) {
|
|
171
|
+
if (setB.has(key) === true) {
|
|
173
172
|
return true
|
|
174
173
|
}
|
|
175
174
|
}
|
|
@@ -200,7 +199,7 @@ export const getFactsGroupForEventArgs = ({
|
|
|
200
199
|
}
|
|
201
200
|
}
|
|
202
201
|
|
|
203
|
-
notYetImplemented(`getFactsGroupForEventArgs: ${prop.toString()} is not yet implemented`)
|
|
202
|
+
return notYetImplemented(`getFactsGroupForEventArgs: ${prop.toString()} is not yet implemented`)
|
|
204
203
|
},
|
|
205
204
|
})
|
|
206
205
|
|
|
@@ -217,9 +216,9 @@ export const getFactsGroupForEventArgs = ({
|
|
|
217
216
|
return map
|
|
218
217
|
}
|
|
219
218
|
const facts = {
|
|
220
|
-
modifySet: factsRes?.modify.set ? iterableToMap(factsRes.modify.set) : new Map(),
|
|
221
|
-
modifyUnset: factsRes?.modify.unset ? iterableToMap(factsRes.modify.unset) : new Map(),
|
|
222
|
-
depRequire: factsRes?.require ? iterableToMap(factsRes.require) : new Map(),
|
|
219
|
+
modifySet: factsRes?.modify.set !== undefined ? iterableToMap(factsRes.modify.set) : new Map(),
|
|
220
|
+
modifyUnset: factsRes?.modify.unset !== undefined ? iterableToMap(factsRes.modify.unset) : new Map(),
|
|
221
|
+
depRequire: factsRes?.require !== undefined ? iterableToMap(factsRes.require) : new Map(),
|
|
223
222
|
depRead,
|
|
224
223
|
}
|
|
225
224
|
|
|
@@ -227,8 +226,8 @@ export const getFactsGroupForEventArgs = ({
|
|
|
227
226
|
}
|
|
228
227
|
|
|
229
228
|
export const compareEventSequenceNumbers = (
|
|
230
|
-
a: EventSequenceNumber.
|
|
231
|
-
b: EventSequenceNumber.
|
|
229
|
+
a: EventSequenceNumber.Client.Composite,
|
|
230
|
+
b: EventSequenceNumber.Client.Composite,
|
|
232
231
|
) => {
|
|
233
232
|
if (a.global !== b.global) {
|
|
234
233
|
return a.global - b.global
|
|
@@ -1,33 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
1
|
+
import { shouldNeverHappen } from '@livestore/utils'
|
|
2
|
+
import { Graph, Option } from '@livestore/utils/effect'
|
|
3
|
+
|
|
4
|
+
import type { EventDefFactsGroup } from '../../schema/EventDef/mod.ts'
|
|
5
|
+
import * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
|
|
4
6
|
|
|
5
7
|
export const connectionTypeOptions = ['parent', 'facts'] as const
|
|
6
8
|
export type ConnectionType = (typeof connectionTypeOptions)[number]
|
|
7
9
|
|
|
8
|
-
/**
|
|
9
|
-
* Eventlog represented as a multi-DAG including edges for
|
|
10
|
-
* - total-order (parent) relationships
|
|
11
|
-
* - dependency (requires/reads facts) relationships
|
|
12
|
-
*/
|
|
13
|
-
export type HistoryDag = graphology.IGraph<HistoryDagNode, { type: ConnectionType }>
|
|
14
|
-
|
|
15
|
-
export const emptyHistoryDag = (): HistoryDag =>
|
|
16
|
-
new graphology.Graph({
|
|
17
|
-
allowSelfLoops: false,
|
|
18
|
-
multi: true,
|
|
19
|
-
type: 'directed',
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
// TODO consider making `ROOT_ID` parent to itself
|
|
23
|
-
export const rootParentNum = EventSequenceNumber.make({
|
|
24
|
-
global: EventSequenceNumber.ROOT.global - 1,
|
|
25
|
-
client: EventSequenceNumber.clientDefault,
|
|
26
|
-
})
|
|
27
|
-
|
|
28
10
|
export type HistoryDagNode = {
|
|
29
|
-
seqNum: EventSequenceNumber.
|
|
30
|
-
parentSeqNum: EventSequenceNumber.
|
|
11
|
+
seqNum: EventSequenceNumber.Client.Composite
|
|
12
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
31
13
|
name: string
|
|
32
14
|
args: any
|
|
33
15
|
/** Facts are being used for conflict detection and history compaction */
|
|
@@ -37,8 +19,306 @@ export type HistoryDagNode = {
|
|
|
37
19
|
sessionId: string | undefined
|
|
38
20
|
}
|
|
39
21
|
|
|
22
|
+
type HistoryDagEdgeAttributes = { type: ConnectionType }
|
|
23
|
+
|
|
24
|
+
type HistoryDagEdgeEntry = {
|
|
25
|
+
edge: Graph.EdgeIndex
|
|
26
|
+
source: string
|
|
27
|
+
target: string
|
|
28
|
+
attributes: HistoryDagEdgeAttributes
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type HistoryDagOptions = {
|
|
32
|
+
allowSelfLoops: boolean
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const defaultOptions: HistoryDagOptions = {
|
|
36
|
+
allowSelfLoops: false,
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const cloneFactsGroup = (factsGroup: EventDefFactsGroup): EventDefFactsGroup => ({
|
|
40
|
+
depRead: new Map(factsGroup.depRead),
|
|
41
|
+
depRequire: new Map(factsGroup.depRequire),
|
|
42
|
+
modifySet: new Map(factsGroup.modifySet),
|
|
43
|
+
modifyUnset: new Map(factsGroup.modifyUnset),
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
const cloneHistoryDagNode = (node: HistoryDagNode): HistoryDagNode => ({
|
|
47
|
+
...node,
|
|
48
|
+
// Copy the event sequence numbers to avoid accidental aliasing
|
|
49
|
+
parentSeqNum: { ...node.parentSeqNum },
|
|
50
|
+
seqNum: { ...node.seqNum },
|
|
51
|
+
// Facts are represented via maps which should not be shared across DAG copies
|
|
52
|
+
factsGroup: cloneFactsGroup(node.factsGroup),
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Mutable DAG wrapper that retains the previous string-based node ids API
|
|
57
|
+
* while delegating storage and algorithms to Effect's graph module.
|
|
58
|
+
*/
|
|
59
|
+
export class HistoryDag {
|
|
60
|
+
private readonly options: HistoryDagOptions
|
|
61
|
+
private readonly idToIndex: Map<string, Graph.NodeIndex>
|
|
62
|
+
private readonly indexToId: Map<Graph.NodeIndex, string>
|
|
63
|
+
private readonly incomingEdges: Map<Graph.NodeIndex, Set<Graph.EdgeIndex>>
|
|
64
|
+
private readonly outgoingEdges: Map<Graph.NodeIndex, Set<Graph.EdgeIndex>>
|
|
65
|
+
private readonly graph: Graph.MutableDirectedGraph<HistoryDagNode, HistoryDagEdgeAttributes>
|
|
66
|
+
|
|
67
|
+
private constructor({
|
|
68
|
+
graph,
|
|
69
|
+
idToIndex,
|
|
70
|
+
indexToId,
|
|
71
|
+
options,
|
|
72
|
+
}: {
|
|
73
|
+
graph: Graph.MutableDirectedGraph<HistoryDagNode, HistoryDagEdgeAttributes>
|
|
74
|
+
idToIndex?: Map<string, Graph.NodeIndex>
|
|
75
|
+
indexToId?: Map<Graph.NodeIndex, string>
|
|
76
|
+
options?: Partial<HistoryDagOptions>
|
|
77
|
+
}) {
|
|
78
|
+
this.graph = graph
|
|
79
|
+
this.options = { ...defaultOptions, ...options }
|
|
80
|
+
this.idToIndex = idToIndex !== undefined ? new Map(idToIndex) : new Map()
|
|
81
|
+
this.indexToId = indexToId !== undefined ? new Map(indexToId) : new Map()
|
|
82
|
+
this.incomingEdges = new Map()
|
|
83
|
+
this.outgoingEdges = new Map()
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
static create(options?: Partial<HistoryDagOptions>): HistoryDag {
|
|
87
|
+
const graph = Graph.beginMutation(Graph.directed<HistoryDagNode, HistoryDagEdgeAttributes>())
|
|
88
|
+
return options !== undefined ? new HistoryDag({ graph, options }) : new HistoryDag({ graph })
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
copy(): HistoryDag {
|
|
92
|
+
const clone = HistoryDag.create(this.options)
|
|
93
|
+
|
|
94
|
+
for (const [id, index] of this.idToIndex) {
|
|
95
|
+
const node = this.nodeAt(index, `HistoryDag.copy missing node for ${id}`)
|
|
96
|
+
clone.addNode(id, cloneHistoryDagNode(node))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
for (const [, edge] of Graph.edges(this.graph)) {
|
|
100
|
+
const sourceId = this.indexToId.get(edge.source) ?? shouldNeverHappen('HistoryDag.copy missing source id')
|
|
101
|
+
const targetId = this.indexToId.get(edge.target) ?? shouldNeverHappen('HistoryDag.copy missing target id')
|
|
102
|
+
clone.addEdge(sourceId, targetId, { ...edge.data })
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return clone
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
topologicalNodeIds(): Array<string> {
|
|
109
|
+
const walker = Graph.topo(this.graph)
|
|
110
|
+
const indices = Array.from(Graph.indices(walker))
|
|
111
|
+
return indices.map(
|
|
112
|
+
(index) => this.indexToId.get(index) ?? shouldNeverHappen(`Missing node id for index ${String(index)}`),
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
addNode(id: string, attributes: HistoryDagNode): void {
|
|
117
|
+
if (this.idToIndex.has(id) === true) {
|
|
118
|
+
shouldNeverHappen(`HistoryDag node ${id} already exists`)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const nodeIndex = Graph.addNode(this.graph, attributes)
|
|
122
|
+
this.idToIndex.set(id, nodeIndex)
|
|
123
|
+
this.indexToId.set(nodeIndex, id)
|
|
124
|
+
this.incomingEdges.set(nodeIndex, new Set())
|
|
125
|
+
this.outgoingEdges.set(nodeIndex, new Set())
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
hasNode(id: string): boolean {
|
|
129
|
+
return this.idToIndex.has(id)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
getNodeAttributes(id: string): HistoryDagNode {
|
|
133
|
+
const index = this.idToIndex.get(id)
|
|
134
|
+
if (index === undefined) {
|
|
135
|
+
return shouldNeverHappen(`HistoryDag node ${id} not found`)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return this.nodeAt(index, `HistoryDag node data missing for ${id}`)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
nodes(): IterableIterator<string> {
|
|
142
|
+
return this.idToIndex.keys()
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
nodeEntries(): IterableIterator<{ key: string; attributes: HistoryDagNode }> {
|
|
146
|
+
return function* (this: HistoryDag) {
|
|
147
|
+
for (const [id, index] of this.idToIndex) {
|
|
148
|
+
const attributes = this.nodeAt(index, `HistoryDag node data missing for ${id}`)
|
|
149
|
+
yield { key: id, attributes }
|
|
150
|
+
}
|
|
151
|
+
}.call(this)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
addEdge(sourceId: string, targetId: string, attributes: HistoryDagEdgeAttributes): Graph.EdgeIndex {
|
|
155
|
+
if (this.options.allowSelfLoops === false && sourceId === targetId) {
|
|
156
|
+
return shouldNeverHappen('HistoryDag self-loops are disabled')
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const sourceIndex = this.idToIndex.get(sourceId)
|
|
160
|
+
const targetIndex = this.idToIndex.get(targetId)
|
|
161
|
+
|
|
162
|
+
if (sourceIndex === undefined || targetIndex === undefined) {
|
|
163
|
+
return shouldNeverHappen(`HistoryDag edge references unknown nodes: ${sourceId} -> ${targetId}`)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const edgeIndex = Graph.addEdge(this.graph, sourceIndex, targetIndex, attributes)
|
|
167
|
+
const outgoingEdges = this.outgoingEdges.get(sourceIndex)
|
|
168
|
+
const incomingEdges = this.incomingEdges.get(targetIndex)
|
|
169
|
+
if (outgoingEdges === undefined || incomingEdges === undefined) {
|
|
170
|
+
return shouldNeverHappen(`HistoryDag edge index missing for ${sourceId} -> ${targetId}`)
|
|
171
|
+
}
|
|
172
|
+
outgoingEdges.add(edgeIndex)
|
|
173
|
+
incomingEdges.add(edgeIndex)
|
|
174
|
+
return edgeIndex
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
edges(sourceId: string, targetId: string): Array<Graph.EdgeIndex> {
|
|
178
|
+
const sourceIndex = this.idToIndex.get(sourceId)
|
|
179
|
+
const targetIndex = this.idToIndex.get(targetId)
|
|
180
|
+
|
|
181
|
+
if (sourceIndex === undefined || targetIndex === undefined) {
|
|
182
|
+
return []
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return Array.from(this.outgoingEdges.get(sourceIndex) ?? []).filter((edgeIndex) => {
|
|
186
|
+
const edge = Option.getOrUndefined(Graph.getEdge(this.graph, edgeIndex))
|
|
187
|
+
return edge?.target === targetIndex
|
|
188
|
+
})
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
inEdges(id: string): Array<Graph.EdgeIndex> {
|
|
192
|
+
const index = this.idToIndex.get(id)
|
|
193
|
+
if (index === undefined) {
|
|
194
|
+
return []
|
|
195
|
+
}
|
|
196
|
+
return [...(this.incomingEdges.get(index) ?? [])]
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
outboundEdgeEntries(id: string): Array<HistoryDagEdgeEntry> {
|
|
200
|
+
const index = this.idToIndex.get(id)
|
|
201
|
+
if (index === undefined) {
|
|
202
|
+
return []
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return [...(this.outgoingEdges.get(index) ?? [])]
|
|
206
|
+
.map((edgeIndex) => this.edgeEntry(edgeIndex))
|
|
207
|
+
.filter((entry): entry is HistoryDagEdgeEntry => entry !== undefined)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
inboundEdgeEntries(id: string): Array<HistoryDagEdgeEntry> {
|
|
211
|
+
const index = this.idToIndex.get(id)
|
|
212
|
+
if (index === undefined) {
|
|
213
|
+
return []
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return [...(this.incomingEdges.get(index) ?? [])]
|
|
217
|
+
.map((edgeIndex) => this.edgeEntry(edgeIndex))
|
|
218
|
+
.filter((entry): entry is HistoryDagEdgeEntry => entry !== undefined)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
getEdgeAttributes(edgeIndex: Graph.EdgeIndex): HistoryDagEdgeAttributes {
|
|
222
|
+
return this.edgeAt(edgeIndex, `HistoryDag edge ${edgeIndex} not found`).data
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
getEdgeAttribute<TKey extends keyof HistoryDagEdgeAttributes>(
|
|
226
|
+
edgeIndex: Graph.EdgeIndex,
|
|
227
|
+
key: TKey,
|
|
228
|
+
): HistoryDagEdgeAttributes[TKey] {
|
|
229
|
+
const attributes = this.getEdgeAttributes(edgeIndex)
|
|
230
|
+
return attributes[key]
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
source(edgeIndex: Graph.EdgeIndex): string {
|
|
234
|
+
const edge = Option.getOrUndefined(Graph.getEdge(this.graph, edgeIndex))
|
|
235
|
+
const sourceId = edge !== undefined ? this.indexToId.get(edge.source) : undefined
|
|
236
|
+
return sourceId ?? shouldNeverHappen(`HistoryDag edge ${edgeIndex} missing source`)
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
target(edgeIndex: Graph.EdgeIndex): string {
|
|
240
|
+
const edge = Option.getOrUndefined(Graph.getEdge(this.graph, edgeIndex))
|
|
241
|
+
const targetId = edge !== undefined ? this.indexToId.get(edge.target) : undefined
|
|
242
|
+
return targetId ?? shouldNeverHappen(`HistoryDag edge ${edgeIndex} missing target`)
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
dropNode(id: string): void {
|
|
246
|
+
const index = this.idToIndex.get(id)
|
|
247
|
+
if (index === undefined) {
|
|
248
|
+
return
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
for (const edgeIndex of this.outgoingEdges.get(index) ?? []) {
|
|
252
|
+
const edge = this.edgeAt(edgeIndex, `HistoryDag edge ${edgeIndex} missing while dropping ${id}`)
|
|
253
|
+
removeEdgeIndex(this.incomingEdges, edge.target, edgeIndex)
|
|
254
|
+
}
|
|
255
|
+
for (const edgeIndex of this.incomingEdges.get(index) ?? []) {
|
|
256
|
+
const edge = this.edgeAt(edgeIndex, `HistoryDag edge ${edgeIndex} missing while dropping ${id}`)
|
|
257
|
+
removeEdgeIndex(this.outgoingEdges, edge.source, edgeIndex)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
Graph.removeNode(this.graph, index)
|
|
261
|
+
this.idToIndex.delete(id)
|
|
262
|
+
this.indexToId.delete(index)
|
|
263
|
+
this.incomingEdges.delete(index)
|
|
264
|
+
this.outgoingEdges.delete(index)
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
get size(): number {
|
|
268
|
+
return this.idToIndex.size
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
private edgeEntry(edgeIndex: Graph.EdgeIndex): HistoryDagEdgeEntry | undefined {
|
|
272
|
+
const edge = Option.getOrUndefined(Graph.getEdge(this.graph, edgeIndex))
|
|
273
|
+
if (edge === undefined) {
|
|
274
|
+
return undefined
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const source = this.indexToId.get(edge.source)
|
|
278
|
+
const target = this.indexToId.get(edge.target)
|
|
279
|
+
|
|
280
|
+
if (source === undefined || target === undefined) {
|
|
281
|
+
return undefined
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
return {
|
|
285
|
+
edge: edgeIndex,
|
|
286
|
+
source,
|
|
287
|
+
target,
|
|
288
|
+
attributes: edge.data,
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
private nodeAt(index: Graph.NodeIndex, message: string): HistoryDagNode {
|
|
293
|
+
return Option.getOrElse(Graph.getNode(this.graph, index), () => shouldNeverHappen(message))
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
private edgeAt(edgeIndex: Graph.EdgeIndex, message: string): Graph.Edge<HistoryDagEdgeAttributes> {
|
|
297
|
+
return Option.getOrElse(Graph.getEdge(this.graph, edgeIndex), () => shouldNeverHappen(message))
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const removeEdgeIndex = (
|
|
302
|
+
edgeIndices: Map<Graph.NodeIndex, Set<Graph.EdgeIndex>>,
|
|
303
|
+
nodeIndex: Graph.NodeIndex,
|
|
304
|
+
edgeIndex: Graph.EdgeIndex,
|
|
305
|
+
): void => {
|
|
306
|
+
const indices = edgeIndices.get(nodeIndex) ?? shouldNeverHappen(`HistoryDag edge index missing for node ${nodeIndex}`)
|
|
307
|
+
if (indices.delete(edgeIndex) === false) {
|
|
308
|
+
shouldNeverHappen(`HistoryDag edge ${edgeIndex} missing from node ${nodeIndex}`)
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
export const emptyHistoryDag = (): HistoryDag => HistoryDag.create({ allowSelfLoops: false })
|
|
313
|
+
|
|
314
|
+
// TODO consider making `ROOT_ID` parent to itself
|
|
315
|
+
export const rootParentNum = EventSequenceNumber.Client.Composite.make({
|
|
316
|
+
global: EventSequenceNumber.Client.ROOT.global - 1,
|
|
317
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
318
|
+
})
|
|
319
|
+
|
|
40
320
|
export const rootEventNode: HistoryDagNode = {
|
|
41
|
-
seqNum: EventSequenceNumber.ROOT,
|
|
321
|
+
seqNum: EventSequenceNumber.Client.ROOT,
|
|
42
322
|
parentSeqNum: rootParentNum,
|
|
43
323
|
// unused below
|
|
44
324
|
name: '__Root__',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
|
|
1
|
+
import * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
|
|
2
2
|
import { factsToString, validateFacts } from './facts.ts'
|
|
3
3
|
import { emptyHistoryDag, type HistoryDagNode, rootParentNum } from './history-dag-common.ts'
|
|
4
4
|
|
|
@@ -19,14 +19,18 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
|
|
|
19
19
|
const dag = emptyHistoryDag()
|
|
20
20
|
|
|
21
21
|
dagNodes.forEach((node) => {
|
|
22
|
-
dag.addNode(EventSequenceNumber.toString(node.seqNum), node)
|
|
22
|
+
dag.addNode(EventSequenceNumber.Client.toString(node.seqNum), node)
|
|
23
23
|
})
|
|
24
24
|
|
|
25
25
|
dagNodes.forEach((node) => {
|
|
26
|
-
if (EventSequenceNumber.toString(node.parentSeqNum) !== EventSequenceNumber.toString(rootParentNum)) {
|
|
27
|
-
dag.addEdge(
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
if (EventSequenceNumber.Client.toString(node.parentSeqNum) !== EventSequenceNumber.Client.toString(rootParentNum)) {
|
|
27
|
+
dag.addEdge(
|
|
28
|
+
EventSequenceNumber.Client.toString(node.parentSeqNum),
|
|
29
|
+
EventSequenceNumber.Client.toString(node.seqNum),
|
|
30
|
+
{
|
|
31
|
+
type: 'parent',
|
|
32
|
+
},
|
|
33
|
+
)
|
|
30
34
|
}
|
|
31
35
|
})
|
|
32
36
|
|
|
@@ -35,16 +39,19 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
|
|
|
35
39
|
for (const factKey of factKeys) {
|
|
36
40
|
// Find the first ancestor node with a matching fact key (via modifySet or modifyUnset) by traversing the graph backwards via the parent edges
|
|
37
41
|
const depNode = (() => {
|
|
38
|
-
let currentSeqNumStr = EventSequenceNumber.toString(node.seqNum)
|
|
42
|
+
let currentSeqNumStr = EventSequenceNumber.Client.toString(node.seqNum)
|
|
39
43
|
|
|
40
|
-
while (currentSeqNumStr !== EventSequenceNumber.toString(rootParentNum)) {
|
|
44
|
+
while (currentSeqNumStr !== EventSequenceNumber.Client.toString(rootParentNum)) {
|
|
41
45
|
const parentEdge = dag.inEdges(currentSeqNumStr).find((e) => dag.getEdgeAttribute(e, 'type') === 'parent')
|
|
42
|
-
if (
|
|
46
|
+
if (parentEdge == null) return null
|
|
43
47
|
|
|
44
48
|
const parentSeqNumStr = dag.source(parentEdge)
|
|
45
49
|
const parentNode = dag.getNodeAttributes(parentSeqNumStr)
|
|
46
50
|
|
|
47
|
-
if (
|
|
51
|
+
if (
|
|
52
|
+
parentNode.factsGroup.modifySet.has(factKey) === true ||
|
|
53
|
+
parentNode.factsGroup.modifyUnset.has(factKey) === true
|
|
54
|
+
) {
|
|
48
55
|
return parentNode
|
|
49
56
|
}
|
|
50
57
|
|
|
@@ -54,9 +61,9 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
|
|
|
54
61
|
return null
|
|
55
62
|
})()
|
|
56
63
|
|
|
57
|
-
if (depNode) {
|
|
58
|
-
const depNodeIdStr = EventSequenceNumber.toString(depNode.seqNum)
|
|
59
|
-
const nodeIdStr = EventSequenceNumber.toString(node.seqNum)
|
|
64
|
+
if (depNode !== null) {
|
|
65
|
+
const depNodeIdStr = EventSequenceNumber.Client.toString(depNode.seqNum)
|
|
66
|
+
const nodeIdStr = EventSequenceNumber.Client.toString(node.seqNum)
|
|
60
67
|
if (dag.edges(depNodeIdStr, nodeIdStr).filter((e) => dag.getEdgeAttributes(e).type === 'facts').length === 0) {
|
|
61
68
|
dag.addEdge(depNodeIdStr, nodeIdStr, { type: 'facts' })
|
|
62
69
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { EventDef, EventDefFactsSnapshot } from '../../schema/EventDef.ts'
|
|
2
|
-
import * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
|
|
3
|
-
import type * as LiveStoreEvent from '../../schema/LiveStoreEvent.ts'
|
|
1
|
+
import type { EventDef, EventDefFactsSnapshot } from '../../schema/EventDef/mod.ts'
|
|
2
|
+
import * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
|
|
3
|
+
import type * as LiveStoreEvent from '../../schema/LiveStoreEvent/mod.ts'
|
|
4
4
|
import {
|
|
5
5
|
applyFactGroups,
|
|
6
6
|
type FactValidationResult,
|
|
@@ -19,19 +19,19 @@ export type RebaseInput = {
|
|
|
19
19
|
newRemoteEvents: RebaseEventWithConflict[]
|
|
20
20
|
pendingLocalEvents: RebaseEventWithConflict[]
|
|
21
21
|
validate: (args: {
|
|
22
|
-
rebasedLocalEvents: LiveStoreEvent.
|
|
22
|
+
rebasedLocalEvents: LiveStoreEvent.Input.Decoded[]
|
|
23
23
|
eventDefs: Record<string, EventDef.Any>
|
|
24
24
|
}) => FactValidationResult
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export type RebaseOutput = {
|
|
28
|
-
rebasedLocalEvents: LiveStoreEvent.
|
|
28
|
+
rebasedLocalEvents: LiveStoreEvent.Input.Decoded[]
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
export type RebaseFn = (input: RebaseInput) => RebaseOutput
|
|
32
32
|
|
|
33
33
|
export const defaultRebaseFn: RebaseFn = ({ pendingLocalEvents }) => {
|
|
34
|
-
if (pendingLocalEvents.some((_) => _.conflictType === 'missing-requirement')) {
|
|
34
|
+
if (pendingLocalEvents.some((_) => _.conflictType === 'missing-requirement') === true) {
|
|
35
35
|
throw new Error('missing-requirement conflicts must be resolved before rebasing')
|
|
36
36
|
}
|
|
37
37
|
|
|
@@ -53,7 +53,7 @@ export const rebaseEvents = ({
|
|
|
53
53
|
currentFactsSnapshot: EventDefFactsSnapshot
|
|
54
54
|
clientId: string
|
|
55
55
|
sessionId: string
|
|
56
|
-
}): ReadonlyArray<LiveStoreEvent.
|
|
56
|
+
}): ReadonlyArray<LiveStoreEvent.Client.Decoded> => {
|
|
57
57
|
const initialSnapshot = new Map(currentFactsSnapshot)
|
|
58
58
|
applyFactGroups(
|
|
59
59
|
newRemoteEvents.map((event) => event.factsGroup),
|
|
@@ -94,18 +94,18 @@ export const rebaseEvents = ({
|
|
|
94
94
|
return rebasedLocalEvents.map(
|
|
95
95
|
(event, index) =>
|
|
96
96
|
({
|
|
97
|
-
seqNum: EventSequenceNumber.make({
|
|
97
|
+
seqNum: EventSequenceNumber.Client.Composite.make({
|
|
98
98
|
global: headGlobalId + index + 1,
|
|
99
|
-
client: EventSequenceNumber.
|
|
99
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
100
100
|
}),
|
|
101
|
-
parentSeqNum: EventSequenceNumber.make({
|
|
101
|
+
parentSeqNum: EventSequenceNumber.Client.Composite.make({
|
|
102
102
|
global: headGlobalId + index,
|
|
103
|
-
client: EventSequenceNumber.
|
|
103
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
104
104
|
}),
|
|
105
105
|
name: event.name,
|
|
106
106
|
args: event.args,
|
|
107
107
|
clientId,
|
|
108
108
|
sessionId,
|
|
109
|
-
}) satisfies LiveStoreEvent.
|
|
109
|
+
}) satisfies LiveStoreEvent.Client.Decoded,
|
|
110
110
|
)
|
|
111
111
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
1
3
|
import { defineEvent } from '@livestore/common/schema'
|
|
2
4
|
import { Schema } from '@livestore/utils/effect'
|
|
3
|
-
import { describe, expect, it } from 'vitest'
|
|
4
5
|
|
|
5
6
|
import { compactEvents } from '../compact-events.ts'
|
|
6
7
|
import { historyDagFromNodes } from '../history-dag.ts'
|
|
@@ -26,14 +27,14 @@ const facts = {
|
|
|
26
27
|
const eventDefs = {
|
|
27
28
|
add: defineEvent({
|
|
28
29
|
name: 'add',
|
|
29
|
-
schema: Schema.Struct({ value: Schema.
|
|
30
|
+
schema: Schema.Struct({ value: Schema.Finite }),
|
|
30
31
|
}),
|
|
31
32
|
multiply: defineEvent({
|
|
32
33
|
name: 'multiply',
|
|
33
|
-
schema: Schema.Struct({ value: Schema.
|
|
34
|
+
schema: Schema.Struct({ value: Schema.Finite }),
|
|
34
35
|
facts: ({ value }, currentFacts) => ({
|
|
35
36
|
modify: {
|
|
36
|
-
set: value === 0 || currentFacts.has(facts.multiplyByZero) ? [facts.multiplyByZero] : [],
|
|
37
|
+
set: value === 0 || currentFacts.has(facts.multiplyByZero) === true ? [facts.multiplyByZero] : [],
|
|
37
38
|
unset: value === 0 ? [] : [facts.multiplyByZero],
|
|
38
39
|
},
|
|
39
40
|
}),
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type { EventDefFacts } from '@livestore/common/schema'
|
|
2
1
|
import { describe, expect, it } from 'vitest'
|
|
3
2
|
|
|
3
|
+
import type { EventDefFacts } from '@livestore/common/schema'
|
|
4
|
+
|
|
4
5
|
import { compactEvents } from '../compact-events.ts'
|
|
5
|
-
import { historyDagFromNodes } from '../history-dag.ts'
|
|
6
6
|
import type { HistoryDagNode } from '../history-dag-common.ts'
|
|
7
7
|
import { EMPTY_FACT_VALUE } from '../history-dag-common.ts'
|
|
8
|
+
import { historyDagFromNodes } from '../history-dag.ts'
|
|
8
9
|
import { events as eventDefs, printEvent, toEventNodes } from './event-fixtures.ts'
|
|
9
10
|
|
|
10
11
|
const customStringify = (value: any): string => {
|
|
@@ -19,7 +20,7 @@ const customStringify = (value: any): string => {
|
|
|
19
20
|
if (type === 'number' || type === 'boolean') {
|
|
20
21
|
return String(value)
|
|
21
22
|
}
|
|
22
|
-
if (Array.isArray(value)) {
|
|
23
|
+
if (Array.isArray(value) === true) {
|
|
23
24
|
const elements = value.map((el) => customStringify(el))
|
|
24
25
|
return `[${elements.join(', ')}]`
|
|
25
26
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { Schema } from '@livestore/utils/effect'
|
|
2
2
|
|
|
3
|
-
import type { EventDef } from '../../../schema/EventDef.ts'
|
|
4
|
-
import { defineEvent, defineFacts } from '../../../schema/EventDef.ts'
|
|
5
|
-
import * as EventSequenceNumber from '../../../schema/EventSequenceNumber.ts'
|
|
3
|
+
import type { EventDef } from '../../../schema/EventDef/mod.ts'
|
|
4
|
+
import { defineEvent, defineFacts } from '../../../schema/EventDef/mod.ts'
|
|
5
|
+
import * as EventSequenceNumber from '../../../schema/EventSequenceNumber/mod.ts'
|
|
6
6
|
import { factsSnapshotForDag, getFactsGroupForEventArgs } from '../facts.ts'
|
|
7
|
-
import { historyDagFromNodes } from '../history-dag.ts'
|
|
8
7
|
import type { HistoryDagNode } from '../history-dag-common.ts'
|
|
9
8
|
import { rootEventNode } from '../history-dag-common.ts'
|
|
9
|
+
import { historyDagFromNodes } from '../history-dag.ts'
|
|
10
10
|
|
|
11
11
|
export const printEvent = ({ seqNum, parentSeqNum, factsGroup, ...rest }: HistoryDagNode) => ({
|
|
12
|
-
seqNum: EventSequenceNumber.toString(seqNum),
|
|
13
|
-
parentSeqNum: EventSequenceNumber.toString(parentSeqNum),
|
|
12
|
+
seqNum: EventSequenceNumber.Client.toString(seqNum),
|
|
13
|
+
parentSeqNum: EventSequenceNumber.Client.toString(parentSeqNum),
|
|
14
14
|
...rest,
|
|
15
15
|
facts: factsGroup,
|
|
16
16
|
})
|
|
@@ -45,7 +45,7 @@ export const events = {
|
|
|
45
45
|
// {
|
|
46
46
|
facts: ({ id }, currentFacts) =>
|
|
47
47
|
// TODO enable an API along the lines of `map.has(key, value)`
|
|
48
|
-
currentFacts.has(facts.todoExists(id)) && currentFacts.get(facts.todoIsWriteable(id, true)[0]) === false
|
|
48
|
+
currentFacts.has(facts.todoExists(id)) === true && currentFacts.get(facts.todoIsWriteable(id, true)[0]) === false
|
|
49
49
|
? { require: [facts.todoExists(id), facts.todoIsWriteable(id, true)] }
|
|
50
50
|
: { modify: { set: [facts.todoExists(id), facts.todoIsWriteable(id, true), facts.todoTextUpdated(id)] } },
|
|
51
51
|
}),
|
|
@@ -140,13 +140,13 @@ export const toEventNodes = (
|
|
|
140
140
|
): HistoryDagNode[] => {
|
|
141
141
|
const nodesAcc: HistoryDagNode[] = [rootEventNode]
|
|
142
142
|
|
|
143
|
-
let currentEventSequenceNumber: EventSequenceNumber.
|
|
143
|
+
let currentEventSequenceNumber: EventSequenceNumber.Client.Composite = EventSequenceNumber.Client.ROOT
|
|
144
144
|
|
|
145
145
|
const eventNodes = partialEvents.map((partialEvent) => {
|
|
146
146
|
const eventDef = eventDefs[partialEvent.name]!
|
|
147
|
-
const eventNum = EventSequenceNumber.nextPair({
|
|
147
|
+
const eventNum = EventSequenceNumber.Client.nextPair({
|
|
148
148
|
seqNum: currentEventSequenceNumber,
|
|
149
|
-
|
|
149
|
+
isClientOnly: eventDef.options.clientOnly,
|
|
150
150
|
}).seqNum
|
|
151
151
|
currentEventSequenceNumber = eventNum
|
|
152
152
|
|
|
@@ -219,18 +219,18 @@ export const toEventNodes = (
|
|
|
219
219
|
return eventNodes
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
-
const getParentNum = (eventNum: EventSequenceNumber.
|
|
222
|
+
const getParentNum = (eventNum: EventSequenceNumber.Client.Composite): EventSequenceNumber.Client.Composite => {
|
|
223
223
|
const globalParentNum = eventNum.global
|
|
224
224
|
const clientParentNum = eventNum.client - 1
|
|
225
225
|
|
|
226
226
|
if (clientParentNum < 0) {
|
|
227
|
-
return EventSequenceNumber.make({
|
|
227
|
+
return EventSequenceNumber.Client.Composite.make({
|
|
228
228
|
global: globalParentNum - 1,
|
|
229
|
-
client: EventSequenceNumber.
|
|
229
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
230
230
|
})
|
|
231
231
|
}
|
|
232
232
|
|
|
233
|
-
return EventSequenceNumber.make({
|
|
233
|
+
return EventSequenceNumber.Client.Composite.make({
|
|
234
234
|
global: globalParentNum,
|
|
235
235
|
client: clientParentNum,
|
|
236
236
|
})
|