@livestore/common 0.3.0-dev.5 → 0.3.0-dev.50
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/__tests__/fixture.d.ts +83 -221
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/__tests__/fixture.js +33 -11
- package/dist/__tests__/fixture.js.map +1 -1
- package/dist/adapter-types.d.ts +120 -64
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +39 -8
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/debug-info.d.ts +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +1 -0
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +390 -0
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-client-session.js +97 -0
- package/dist/devtools/devtools-messages-client-session.js.map +1 -0
- package/dist/devtools/devtools-messages-common.d.ts +68 -0
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-common.js +60 -0
- package/dist/devtools/devtools-messages-common.js.map +1 -0
- package/dist/devtools/devtools-messages-leader.d.ts +394 -0
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-leader.js +147 -0
- package/dist/devtools/devtools-messages-leader.js.map +1 -0
- package/dist/devtools/devtools-messages.d.ts +3 -580
- package/dist/devtools/devtools-messages.d.ts.map +1 -1
- package/dist/devtools/devtools-messages.js +3 -174
- package/dist/devtools/devtools-messages.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +32 -0
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
- package/dist/devtools/devtools-sessioninfo.js +36 -0
- package/dist/devtools/devtools-sessioninfo.js.map +1 -0
- package/dist/devtools/mod.d.ts +55 -0
- package/dist/devtools/mod.d.ts.map +1 -0
- package/dist/devtools/mod.js +33 -0
- package/dist/devtools/mod.js.map +1 -0
- package/dist/index.d.ts +7 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -9
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +62 -0
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -0
- package/dist/leader-thread/LeaderSyncProcessor.js +595 -0
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
- package/dist/leader-thread/connection.d.ts +34 -6
- package/dist/leader-thread/connection.d.ts.map +1 -1
- package/dist/leader-thread/connection.js +22 -7
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +27 -0
- package/dist/leader-thread/eventlog.d.ts.map +1 -0
- package/dist/leader-thread/eventlog.js +119 -0
- package/dist/leader-thread/eventlog.js.map +1 -0
- package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +155 -80
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +23 -11
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +72 -47
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/materialize-event.d.ts +16 -0
- package/dist/leader-thread/materialize-event.d.ts.map +1 -0
- package/dist/leader-thread/materialize-event.js +109 -0
- package/dist/leader-thread/materialize-event.js.map +1 -0
- package/dist/leader-thread/mod.d.ts +1 -1
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -1
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +4 -2
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +33 -31
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -5
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -4
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/types.d.ts +87 -40
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +1 -3
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/make-client-session.d.ts +23 -0
- package/dist/make-client-session.d.ts.map +1 -0
- package/dist/make-client-session.js +57 -0
- package/dist/make-client-session.js.map +1 -0
- package/dist/materializer-helper.d.ts +23 -0
- package/dist/materializer-helper.d.ts.map +1 -0
- package/dist/materializer-helper.js +86 -0
- package/dist/materializer-helper.js.map +1 -0
- package/dist/otel.d.ts +2 -0
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +5 -0
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +14 -0
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -0
- package/dist/rematerialize-from-eventlog.js +64 -0
- package/dist/rematerialize-from-eventlog.js.map +1 -0
- package/dist/schema/EventDef.d.ts +146 -0
- package/dist/schema/EventDef.d.ts.map +1 -0
- package/dist/schema/EventDef.js +58 -0
- package/dist/schema/EventDef.js.map +1 -0
- package/dist/schema/EventId.d.ts +43 -25
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +56 -18
- package/dist/schema/EventId.js.map +1 -1
- package/dist/schema/EventId.test.d.ts +2 -0
- package/dist/schema/EventId.test.d.ts.map +1 -0
- package/dist/schema/EventId.test.js +11 -0
- package/dist/schema/EventId.test.js.map +1 -0
- package/dist/schema/EventNumber.d.ts +57 -0
- package/dist/schema/EventNumber.d.ts.map +1 -0
- package/dist/schema/EventNumber.js +82 -0
- package/dist/schema/EventNumber.js.map +1 -0
- package/dist/schema/EventNumber.test.d.ts +2 -0
- package/dist/schema/EventNumber.test.d.ts.map +1 -0
- package/dist/schema/EventNumber.test.js +11 -0
- package/dist/schema/EventNumber.test.js.map +1 -0
- package/dist/schema/EventSequenceNumber.d.ts +57 -0
- package/dist/schema/EventSequenceNumber.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber.js +82 -0
- package/dist/schema/EventSequenceNumber.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.d.ts +2 -0
- package/dist/schema/EventSequenceNumber.test.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +11 -0
- package/dist/schema/EventSequenceNumber.test.js.map +1 -0
- package/dist/schema/LiveStoreEvent.d.ts +257 -0
- package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent.js +117 -0
- package/dist/schema/LiveStoreEvent.js.map +1 -0
- package/dist/schema/events.d.ts +2 -0
- package/dist/schema/events.d.ts.map +1 -0
- package/dist/schema/events.js +2 -0
- package/dist/schema/events.js.map +1 -0
- package/dist/schema/mod.d.ts +8 -6
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +8 -6
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +50 -32
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +36 -43
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/mod.d.ts +3 -0
- package/dist/schema/state/mod.d.ts.map +1 -0
- package/dist/schema/state/mod.js +3 -0
- package/dist/schema/state/mod.js.map +1 -0
- package/dist/schema/state/sqlite/client-document-def.d.ts +223 -0
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -0
- package/dist/schema/state/sqlite/client-document-def.js +170 -0
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -0
- package/dist/schema/state/sqlite/client-document-def.test.d.ts +2 -0
- package/dist/schema/state/sqlite/client-document-def.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/client-document-def.test.js +201 -0
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +69 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +71 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts +3 -0
- package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/validate.js +12 -0
- package/dist/schema/state/sqlite/db-schema/ast/validate.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +90 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +87 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts +2 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +29 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +90 -0
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +41 -0
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/hash.d.ts +2 -0
- package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/hash.js +14 -0
- package/dist/schema/state/sqlite/db-schema/hash.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/mod.d.ts +3 -0
- package/dist/schema/state/sqlite/db-schema/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/mod.js +3 -0
- package/dist/schema/state/sqlite/db-schema/mod.js.map +1 -0
- package/dist/schema/state/sqlite/mod.d.ts +17 -0
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/mod.js +41 -0
- package/dist/schema/state/sqlite/mod.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/api.d.ts +294 -0
- package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -0
- package/dist/schema/state/sqlite/query-builder/api.js +6 -0
- package/dist/schema/state/sqlite/query-builder/api.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/astToSql.d.ts +7 -0
- package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -0
- package/dist/schema/state/sqlite/query-builder/astToSql.js +190 -0
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/impl.d.ts +7 -0
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -0
- package/dist/schema/state/sqlite/query-builder/impl.js +286 -0
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +87 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.js +563 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -0
- package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.d.ts +7 -0
- package/dist/schema/state/sqlite/query-builder/mod.d.ts.map +1 -0
- package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.js +7 -0
- package/dist/schema/state/sqlite/query-builder/mod.js.map +1 -0
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -0
- package/dist/schema/{schema-helpers.js → state/sqlite/schema-helpers.js} +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables.d.ts +574 -0
- package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables.js +88 -0
- package/dist/schema/state/sqlite/system-tables.js.map +1 -0
- package/dist/schema/state/sqlite/table-def.d.ts +84 -0
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -0
- package/dist/schema/state/sqlite/table-def.js +36 -0
- package/dist/schema/state/sqlite/table-def.js.map +1 -0
- package/dist/schema-management/common.d.ts +7 -7
- package/dist/schema-management/common.d.ts.map +1 -1
- package/dist/schema-management/common.js.map +1 -1
- package/dist/schema-management/migrations.d.ts +6 -6
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +27 -18
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts +8 -0
- package/dist/schema-management/validate-schema.d.ts.map +1 -0
- package/dist/schema-management/validate-schema.js +39 -0
- package/dist/schema-management/validate-schema.js.map +1 -0
- package/dist/sql-queries/misc.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.d.ts +1 -1
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts +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 +2 -1
- package/dist/sql-queries/types.d.ts.map +1 -1
- package/dist/sql-queries/types.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +66 -0
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
- package/dist/sync/ClientSessionSyncProcessor.js +209 -0
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
- package/dist/sync/index.d.ts +1 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +38 -35
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +21 -21
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +11 -11
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +9 -7
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +10 -5
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.d.ts +0 -2
- package/dist/sync/next/history-dag.d.ts.map +1 -1
- package/dist/sync/next/history-dag.js +16 -14
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +10 -8
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +18 -10
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +39 -34
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +77 -77
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +38 -28
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
- package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +81 -38
- package/dist/sync/next/test/event-fixtures.js.map +1 -0
- package/dist/sync/next/test/mod.d.ts +1 -1
- package/dist/sync/next/test/mod.d.ts.map +1 -1
- package/dist/sync/next/test/mod.js +1 -1
- package/dist/sync/next/test/mod.js.map +1 -1
- package/dist/sync/sync.d.ts +60 -25
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +10 -6
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +213 -82
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +337 -139
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +310 -286
- package/dist/sync/syncstate.test.js.map +1 -1
- 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 -4
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/util.d.ts +2 -2
- package/dist/util.d.ts.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +13 -6
- package/src/__tests__/fixture.ts +36 -15
- package/src/adapter-types.ts +107 -68
- package/src/debug-info.ts +1 -0
- package/src/devtools/devtools-messages-client-session.ts +142 -0
- package/src/devtools/devtools-messages-common.ts +115 -0
- package/src/devtools/devtools-messages-leader.ts +191 -0
- package/src/devtools/devtools-messages.ts +3 -246
- package/src/devtools/devtools-sessioninfo.ts +101 -0
- package/src/devtools/mod.ts +59 -0
- package/src/index.ts +7 -15
- package/src/leader-thread/LeaderSyncProcessor.ts +940 -0
- package/src/leader-thread/connection.ts +54 -9
- package/src/leader-thread/eventlog.ts +199 -0
- package/src/leader-thread/leader-worker-devtools.ts +227 -104
- package/src/leader-thread/make-leader-thread-layer.ts +128 -78
- package/src/leader-thread/materialize-event.ts +173 -0
- package/src/leader-thread/mod.ts +1 -1
- package/src/leader-thread/recreate-db.ts +38 -39
- package/src/leader-thread/shutdown-channel.ts +2 -4
- package/src/leader-thread/types.ts +96 -50
- package/src/make-client-session.ts +136 -0
- package/src/materializer-helper.ts +138 -0
- package/src/otel.ts +8 -0
- package/src/rematerialize-from-eventlog.ts +117 -0
- package/src/schema/EventDef.ts +227 -0
- package/src/schema/EventSequenceNumber.test.ts +12 -0
- package/src/schema/EventSequenceNumber.ts +121 -0
- package/src/schema/LiveStoreEvent.ts +240 -0
- package/src/schema/events.ts +1 -0
- package/src/schema/mod.ts +8 -6
- package/src/schema/schema.ts +88 -84
- package/src/schema/state/mod.ts +2 -0
- package/src/schema/state/sqlite/client-document-def.test.ts +238 -0
- package/src/schema/state/sqlite/client-document-def.ts +444 -0
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +142 -0
- package/src/schema/state/sqlite/db-schema/ast/validate.ts +13 -0
- package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -0
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +242 -0
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +222 -0
- package/src/schema/state/sqlite/db-schema/hash.ts +14 -0
- package/src/schema/state/sqlite/db-schema/mod.ts +2 -0
- package/src/schema/state/sqlite/mod.ts +73 -0
- package/src/schema/state/sqlite/query-builder/api.ts +440 -0
- package/src/schema/state/sqlite/query-builder/astToSql.ts +232 -0
- package/src/schema/state/sqlite/query-builder/impl.test.ts +617 -0
- package/src/schema/state/sqlite/query-builder/impl.ts +351 -0
- package/src/{query-builder → schema/state/sqlite/query-builder}/mod.ts +7 -0
- package/src/schema/{schema-helpers.ts → state/sqlite/schema-helpers.ts} +1 -1
- package/src/schema/state/sqlite/system-tables.ts +117 -0
- package/src/schema/state/sqlite/table-def.ts +197 -0
- package/src/schema-management/common.ts +7 -7
- package/src/schema-management/migrations.ts +37 -31
- package/src/schema-management/validate-schema.ts +61 -0
- package/src/sql-queries/sql-queries.ts +1 -1
- package/src/sql-queries/sql-query-builder.ts +1 -2
- package/src/sql-queries/types.ts +3 -1
- package/src/sync/ClientSessionSyncProcessor.ts +332 -0
- package/src/sync/index.ts +1 -1
- package/src/sync/next/compact-events.ts +38 -35
- package/src/sync/next/facts.ts +43 -41
- package/src/sync/next/history-dag-common.ts +17 -10
- package/src/sync/next/history-dag.ts +16 -17
- package/src/sync/next/rebase-events.ts +29 -17
- package/src/sync/next/test/compact-events.calculator.test.ts +46 -46
- package/src/sync/next/test/compact-events.test.ts +79 -79
- package/src/sync/next/test/event-fixtures.ts +226 -0
- package/src/sync/next/test/mod.ts +1 -1
- package/src/sync/sync.ts +60 -24
- package/src/sync/syncstate.test.ts +347 -320
- package/src/sync/syncstate.ts +422 -230
- package/src/sync/validate-push-payload.ts +6 -6
- package/src/version.ts +2 -2
- package/dist/derived-mutations.d.ts +0 -109
- package/dist/derived-mutations.d.ts.map +0 -1
- package/dist/derived-mutations.js +0 -54
- package/dist/derived-mutations.js.map +0 -1
- package/dist/derived-mutations.test.d.ts +0 -2
- package/dist/derived-mutations.test.d.ts.map +0 -1
- package/dist/derived-mutations.test.js +0 -93
- package/dist/derived-mutations.test.js.map +0 -1
- package/dist/devtools/devtools-bridge.d.ts +0 -13
- package/dist/devtools/devtools-bridge.d.ts.map +0 -1
- package/dist/devtools/devtools-bridge.js +0 -2
- package/dist/devtools/devtools-bridge.js.map +0 -1
- package/dist/devtools/devtools-window-message.d.ts +0 -29
- package/dist/devtools/devtools-window-message.d.ts.map +0 -1
- package/dist/devtools/devtools-window-message.js +0 -33
- package/dist/devtools/devtools-window-message.js.map +0 -1
- package/dist/devtools/index.d.ts +0 -42
- package/dist/devtools/index.d.ts.map +0 -1
- package/dist/devtools/index.js +0 -48
- package/dist/devtools/index.js.map +0 -1
- package/dist/init-singleton-tables.d.ts +0 -4
- package/dist/init-singleton-tables.d.ts.map +0 -1
- package/dist/init-singleton-tables.js +0 -16
- package/dist/init-singleton-tables.js.map +0 -1
- package/dist/leader-thread/apply-mutation.d.ts +0 -8
- package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
- package/dist/leader-thread/apply-mutation.js +0 -95
- package/dist/leader-thread/apply-mutation.js.map +0 -1
- package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
- package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
- package/dist/leader-thread/leader-sync-processor.js +0 -425
- package/dist/leader-thread/leader-sync-processor.js.map +0 -1
- package/dist/leader-thread/mutationlog.d.ts +0 -10
- package/dist/leader-thread/mutationlog.d.ts.map +0 -1
- package/dist/leader-thread/mutationlog.js +0 -28
- package/dist/leader-thread/mutationlog.js.map +0 -1
- package/dist/leader-thread/pull-queue-set.d.ts +0 -7
- package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
- package/dist/leader-thread/pull-queue-set.js +0 -39
- package/dist/leader-thread/pull-queue-set.js.map +0 -1
- package/dist/mutation.d.ts +0 -13
- package/dist/mutation.d.ts.map +0 -1
- package/dist/mutation.js +0 -57
- package/dist/mutation.js.map +0 -1
- package/dist/query-builder/api.d.ts +0 -190
- package/dist/query-builder/api.d.ts.map +0 -1
- package/dist/query-builder/api.js +0 -8
- package/dist/query-builder/api.js.map +0 -1
- package/dist/query-builder/impl.d.ts +0 -12
- package/dist/query-builder/impl.d.ts.map +0 -1
- package/dist/query-builder/impl.js +0 -244
- package/dist/query-builder/impl.js.map +0 -1
- package/dist/query-builder/impl.test.d.ts +0 -2
- package/dist/query-builder/impl.test.d.ts.map +0 -1
- package/dist/query-builder/impl.test.js +0 -212
- package/dist/query-builder/impl.test.js.map +0 -1
- package/dist/query-builder/mod.d.ts.map +0 -1
- package/dist/query-builder/mod.js.map +0 -1
- package/dist/query-info.d.ts +0 -38
- package/dist/query-info.d.ts.map +0 -1
- package/dist/query-info.js +0 -7
- package/dist/query-info.js.map +0 -1
- package/dist/rehydrate-from-mutationlog.d.ts +0 -14
- package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
- package/dist/rehydrate-from-mutationlog.js +0 -72
- package/dist/rehydrate-from-mutationlog.js.map +0 -1
- package/dist/schema/MutationEvent.d.ts +0 -166
- package/dist/schema/MutationEvent.d.ts.map +0 -1
- package/dist/schema/MutationEvent.js +0 -72
- package/dist/schema/MutationEvent.js.map +0 -1
- package/dist/schema/mutations.d.ts +0 -107
- package/dist/schema/mutations.d.ts.map +0 -1
- package/dist/schema/mutations.js +0 -42
- package/dist/schema/mutations.js.map +0 -1
- package/dist/schema/schema-helpers.d.ts.map +0 -1
- package/dist/schema/schema-helpers.js.map +0 -1
- package/dist/schema/system-tables.d.ts +0 -399
- package/dist/schema/system-tables.d.ts.map +0 -1
- package/dist/schema/system-tables.js +0 -58
- package/dist/schema/system-tables.js.map +0 -1
- package/dist/schema/table-def.d.ts +0 -156
- package/dist/schema/table-def.d.ts.map +0 -1
- package/dist/schema/table-def.js +0 -79
- package/dist/schema/table-def.js.map +0 -1
- package/dist/schema-management/validate-mutation-defs.d.ts +0 -8
- package/dist/schema-management/validate-mutation-defs.d.ts.map +0 -1
- package/dist/schema-management/validate-mutation-defs.js +0 -39
- package/dist/schema-management/validate-mutation-defs.js.map +0 -1
- package/dist/sync/client-session-sync-processor.d.ts +0 -45
- package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
- package/dist/sync/client-session-sync-processor.js +0 -131
- package/dist/sync/client-session-sync-processor.js.map +0 -1
- package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
- package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
- package/src/derived-mutations.test.ts +0 -101
- package/src/derived-mutations.ts +0 -166
- package/src/devtools/devtools-bridge.ts +0 -14
- package/src/devtools/devtools-window-message.ts +0 -27
- package/src/devtools/index.ts +0 -48
- package/src/init-singleton-tables.ts +0 -24
- package/src/leader-thread/apply-mutation.ts +0 -143
- package/src/leader-thread/leader-sync-processor.ts +0 -670
- package/src/leader-thread/mutationlog.ts +0 -46
- package/src/leader-thread/pull-queue-set.ts +0 -58
- package/src/mutation.ts +0 -81
- package/src/query-builder/api.ts +0 -289
- package/src/query-builder/impl.test.ts +0 -239
- package/src/query-builder/impl.ts +0 -285
- package/src/query-info.ts +0 -78
- package/src/rehydrate-from-mutationlog.ts +0 -127
- package/src/schema/EventId.ts +0 -60
- package/src/schema/MutationEvent.ts +0 -180
- package/src/schema/mutations.ts +0 -192
- package/src/schema/system-tables.ts +0 -104
- package/src/schema/table-def.ts +0 -343
- package/src/schema-management/validate-mutation-defs.ts +0 -63
- package/src/sync/client-session-sync-processor.ts +0 -207
- package/src/sync/next/test/mutation-fixtures.ts +0 -224
- package/tsconfig.json +0 -11
- /package/dist/schema/{schema-helpers.d.ts → state/sqlite/schema-helpers.d.ts} +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
+
import { EventSequenceNumber } from '../../schema/mod.js'
|
1
2
|
import { replacesFacts } from './facts.js'
|
2
3
|
import { graphologyDag } from './graphology_.js'
|
3
|
-
import { eventIdToString } from './history-dag.js'
|
4
4
|
import type { HistoryDag } from './history-dag-common.js'
|
5
5
|
import { emptyHistoryDag } from './history-dag-common.js'
|
6
6
|
|
@@ -17,25 +17,25 @@ export const compactEvents = (inputDag: HistoryDag): { dag: HistoryDag; compacte
|
|
17
17
|
const dag = inputDag.copy()
|
18
18
|
const compactedEventCount = 0
|
19
19
|
|
20
|
-
const
|
20
|
+
const orderedEventSequenceNumberStrs = graphologyDag.topologicalSort(dag).reverse()
|
21
21
|
|
22
22
|
// drop root
|
23
|
-
|
23
|
+
orderedEventSequenceNumberStrs.pop()
|
24
24
|
|
25
|
-
for (const
|
26
|
-
if (dag.hasNode(
|
25
|
+
for (const eventNumStr of orderedEventSequenceNumberStrs) {
|
26
|
+
if (dag.hasNode(eventNumStr) === false) {
|
27
27
|
continue
|
28
28
|
}
|
29
29
|
|
30
|
-
const subDagsForEvent = Array.from(makeSubDagsForEvent(dag,
|
30
|
+
const subDagsForEvent = Array.from(makeSubDagsForEvent(dag, eventNumStr))
|
31
31
|
for (const subDag of subDagsForEvent) {
|
32
32
|
let shouldRetry = true
|
33
33
|
while (shouldRetry) {
|
34
|
-
const subDagsInHistory = findSubDagsInHistory(dag, subDag,
|
34
|
+
const subDagsInHistory = findSubDagsInHistory(dag, subDag, eventNumStr)
|
35
35
|
|
36
36
|
// console.debug(
|
37
37
|
// 'subDagsInHistory',
|
38
|
-
//
|
38
|
+
// eventNumStr,
|
39
39
|
// 'target',
|
40
40
|
// subDag.nodes(),
|
41
41
|
// 'found',
|
@@ -65,9 +65,9 @@ export const compactEvents = (inputDag: HistoryDag): { dag: HistoryDag; compacte
|
|
65
65
|
return { dag, compactedEventCount }
|
66
66
|
}
|
67
67
|
|
68
|
-
function* makeSubDagsForEvent(inputDag: HistoryDag,
|
69
|
-
/** Map from
|
70
|
-
let nextIterationEls: Map<string, string[]> = new Map([[
|
68
|
+
function* makeSubDagsForEvent(inputDag: HistoryDag, eventNumStr: string): Generator<HistoryDag> {
|
69
|
+
/** Map from eventNumStr to array of eventNumStrs that are dependencies */
|
70
|
+
let nextIterationEls: Map<string, string[]> = new Map([[eventNumStr, []]])
|
71
71
|
let previousDag: HistoryDag | undefined
|
72
72
|
|
73
73
|
while (nextIterationEls.size > 0) {
|
@@ -77,19 +77,22 @@ function* makeSubDagsForEvent(inputDag: HistoryDag, eventIdStr: string): Generat
|
|
77
77
|
const currentIterationEls = new Map(nextIterationEls)
|
78
78
|
nextIterationEls = new Map()
|
79
79
|
|
80
|
-
for (const [
|
81
|
-
const node = inputDag.getNodeAttributes(
|
82
|
-
if (subDag.hasNode(
|
83
|
-
subDag.addNode(
|
80
|
+
for (const [currentEventSequenceNumberStr, edgeTargetIdStrs] of currentIterationEls) {
|
81
|
+
const node = inputDag.getNodeAttributes(currentEventSequenceNumberStr)
|
82
|
+
if (subDag.hasNode(currentEventSequenceNumberStr) === false) {
|
83
|
+
subDag.addNode(currentEventSequenceNumberStr, { ...node })
|
84
84
|
}
|
85
85
|
for (const edgeTargetIdStr of edgeTargetIdStrs) {
|
86
|
-
subDag.addEdge(
|
86
|
+
subDag.addEdge(currentEventSequenceNumberStr, edgeTargetIdStr, { type: 'facts' })
|
87
87
|
}
|
88
88
|
|
89
|
-
for (const depEdge of inputDag.outboundEdgeEntries(
|
89
|
+
for (const depEdge of inputDag.outboundEdgeEntries(currentEventSequenceNumberStr)) {
|
90
90
|
if (depEdge.attributes.type === 'facts') {
|
91
|
-
const
|
92
|
-
nextIterationEls.set(
|
91
|
+
const depEventSequenceNumberStr = depEdge.target
|
92
|
+
nextIterationEls.set(depEventSequenceNumberStr, [
|
93
|
+
...(nextIterationEls.get(depEventSequenceNumberStr) ?? []),
|
94
|
+
currentEventSequenceNumberStr,
|
95
|
+
])
|
93
96
|
}
|
94
97
|
}
|
95
98
|
}
|
@@ -102,23 +105,23 @@ function* makeSubDagsForEvent(inputDag: HistoryDag, eventIdStr: string): Generat
|
|
102
105
|
}
|
103
106
|
|
104
107
|
/**
|
105
|
-
* Iterates over all events from root to `
|
108
|
+
* Iterates over all events from root to `upToExclEventSequenceNumberStr`
|
106
109
|
* and collects all valid sub dags that are replaced by `targetSubDag`.
|
107
110
|
*/
|
108
111
|
const findSubDagsInHistory = (
|
109
112
|
inputDag: HistoryDag,
|
110
113
|
targetSubDag: HistoryDag,
|
111
|
-
|
114
|
+
upToExclEventSequenceNumberStr: string,
|
112
115
|
): { subDags: HistoryDag[]; allOutsideDependencies: string[][] } => {
|
113
116
|
const subDags: HistoryDag[] = []
|
114
117
|
const allOutsideDependencies: string[][] = []
|
115
118
|
|
116
|
-
for (const
|
117
|
-
if (
|
119
|
+
for (const eventNumStr of graphologyDag.topologicalSort(inputDag)) {
|
120
|
+
if (eventNumStr === upToExclEventSequenceNumberStr) {
|
118
121
|
break
|
119
122
|
}
|
120
123
|
|
121
|
-
for (const subDag of makeSubDagsForEvent(inputDag,
|
124
|
+
for (const subDag of makeSubDagsForEvent(inputDag, eventNumStr)) {
|
122
125
|
// console.debug('findSubDagsInHistory', 'target', targetSubDag.nodes(), 'subDag', subDag.nodes())
|
123
126
|
if (subDag.size < targetSubDag.size) {
|
124
127
|
continue
|
@@ -152,9 +155,9 @@ const outsideDependenciesForDag = (subDag: HistoryDag, inputDag: HistoryDag) =>
|
|
152
155
|
for (const nodeIdStr of subDag.nodes()) {
|
153
156
|
for (const edgeEntry of inputDag.outboundEdgeEntries(nodeIdStr)) {
|
154
157
|
if (edgeEntry.attributes.type === 'facts') {
|
155
|
-
const
|
156
|
-
if (subDag.hasNode(
|
157
|
-
outsideDependencies.push(
|
158
|
+
const depEventSequenceNumberStr = edgeEntry.target
|
159
|
+
if (subDag.hasNode(depEventSequenceNumberStr) === false) {
|
160
|
+
outsideDependencies.push(depEventSequenceNumberStr)
|
158
161
|
}
|
159
162
|
}
|
160
163
|
}
|
@@ -201,19 +204,19 @@ const dagReplacesDag = (dagA: HistoryDag, dagB: HistoryDag): boolean => {
|
|
201
204
|
return true
|
202
205
|
}
|
203
206
|
|
204
|
-
const removeEvent = (dag: HistoryDag,
|
205
|
-
// console.debug('removing event',
|
206
|
-
const event = dag.getNodeAttributes(
|
207
|
-
const
|
208
|
-
const childEdges = dag.outboundEdgeEntries(
|
207
|
+
const removeEvent = (dag: HistoryDag, eventNumStr: string) => {
|
208
|
+
// console.debug('removing event', eventNumStr)
|
209
|
+
const event = dag.getNodeAttributes(eventNumStr)
|
210
|
+
const parentSeqNumStr = EventSequenceNumber.toString(event.parentSeqNum)
|
211
|
+
const childEdges = dag.outboundEdgeEntries(eventNumStr)
|
209
212
|
|
210
213
|
for (const childEdge of childEdges) {
|
211
214
|
if (childEdge.attributes.type === 'parent') {
|
212
215
|
const childEvent = dag.getNodeAttributes(childEdge.target)
|
213
|
-
childEvent.
|
214
|
-
dag.addEdge(
|
216
|
+
childEvent.parentSeqNum = { ...event.parentSeqNum }
|
217
|
+
dag.addEdge(parentSeqNumStr, EventSequenceNumber.toString(childEvent.seqNum), { type: 'parent' })
|
215
218
|
}
|
216
219
|
}
|
217
220
|
|
218
|
-
dag.dropNode(
|
221
|
+
dag.dropNode(eventNumStr)
|
219
222
|
}
|
package/src/sync/next/facts.ts
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
import { notYetImplemented } from '@livestore/utils'
|
2
2
|
|
3
|
-
import type * as EventId from '../../schema/EventId.js'
|
4
3
|
import type {
|
4
|
+
EventDefFactInput,
|
5
|
+
EventDefFacts,
|
6
|
+
EventDefFactsGroup,
|
7
|
+
EventDefFactsSnapshot,
|
5
8
|
FactsCallback,
|
6
|
-
|
7
|
-
|
8
|
-
MutationEventFactsGroup,
|
9
|
-
MutationEventFactsSnapshot,
|
10
|
-
} from '../../schema/mutations.js'
|
9
|
+
} from '../../schema/EventDef.js'
|
10
|
+
import type * as EventSequenceNumber from '../../schema/EventSequenceNumber.js'
|
11
11
|
import { graphologyDag } from './graphology_.js'
|
12
12
|
import { EMPTY_FACT_VALUE, type HistoryDag, type HistoryDagNode } from './history-dag-common.js'
|
13
13
|
|
14
14
|
export const factsSnapshotForEvents = (
|
15
15
|
events: HistoryDagNode[],
|
16
|
-
|
17
|
-
):
|
16
|
+
endEventSequenceNumber: EventSequenceNumber.EventSequenceNumber,
|
17
|
+
): EventDefFactsSnapshot => {
|
18
18
|
const facts = new Map<string, any>()
|
19
19
|
|
20
20
|
for (const event of events) {
|
21
|
-
if (
|
21
|
+
if (compareEventSequenceNumbers(event.seqNum, endEventSequenceNumber) > 0) {
|
22
22
|
return facts
|
23
23
|
}
|
24
24
|
|
@@ -30,15 +30,15 @@ export const factsSnapshotForEvents = (
|
|
30
30
|
|
31
31
|
export const factsSnapshotForDag = (
|
32
32
|
dag: HistoryDag,
|
33
|
-
|
34
|
-
):
|
33
|
+
endEventSequenceNumber: EventSequenceNumber.EventSequenceNumber | undefined,
|
34
|
+
): EventDefFactsSnapshot => {
|
35
35
|
const facts = new Map<string, any>()
|
36
36
|
|
37
|
-
const
|
37
|
+
const orderedEventSequenceNumberStrs = graphologyDag.topologicalSort(dag)
|
38
38
|
|
39
|
-
for (let i = 0; i <
|
40
|
-
const event = dag.getNodeAttributes(
|
41
|
-
if (
|
39
|
+
for (let i = 0; i < orderedEventSequenceNumberStrs.length; i++) {
|
40
|
+
const event = dag.getNodeAttributes(orderedEventSequenceNumberStrs[i]!)
|
41
|
+
if (endEventSequenceNumber !== undefined && compareEventSequenceNumbers(event.seqNum, endEventSequenceNumber) > 0) {
|
42
42
|
return facts
|
43
43
|
}
|
44
44
|
|
@@ -56,20 +56,20 @@ export type FactValidationResult =
|
|
56
56
|
success: false
|
57
57
|
/** Index of the item that caused the validation to fail */
|
58
58
|
index: number
|
59
|
-
requiredFacts:
|
59
|
+
requiredFacts: EventDefFacts
|
60
60
|
mismatch: {
|
61
|
-
existing:
|
62
|
-
required:
|
61
|
+
existing: EventDefFacts
|
62
|
+
required: EventDefFacts
|
63
63
|
}
|
64
|
-
currentSnapshot:
|
64
|
+
currentSnapshot: EventDefFacts
|
65
65
|
}
|
66
66
|
|
67
67
|
export const validateFacts = ({
|
68
68
|
factGroups,
|
69
69
|
initialSnapshot,
|
70
70
|
}: {
|
71
|
-
factGroups:
|
72
|
-
initialSnapshot:
|
71
|
+
factGroups: EventDefFactsGroup[]
|
72
|
+
initialSnapshot: EventDefFactsSnapshot
|
73
73
|
}): FactValidationResult => {
|
74
74
|
const currentSnapshot = new Map(initialSnapshot)
|
75
75
|
|
@@ -102,13 +102,13 @@ export const validateFacts = ({
|
|
102
102
|
}
|
103
103
|
}
|
104
104
|
|
105
|
-
export const applyFactGroups = (factGroups:
|
105
|
+
export const applyFactGroups = (factGroups: EventDefFactsGroup[], snapshot: EventDefFactsSnapshot) => {
|
106
106
|
for (const factGroup of factGroups) {
|
107
107
|
applyFactGroup(factGroup, snapshot)
|
108
108
|
}
|
109
109
|
}
|
110
110
|
|
111
|
-
export const applyFactGroup = (factGroup:
|
111
|
+
export const applyFactGroup = (factGroup: EventDefFactsGroup, snapshot: EventDefFactsSnapshot) => {
|
112
112
|
for (const [key, value] of factGroup.modifySet) {
|
113
113
|
snapshot.set(key, value)
|
114
114
|
}
|
@@ -119,7 +119,7 @@ export const applyFactGroup = (factGroup: MutationEventFactsGroup, snapshot: Mut
|
|
119
119
|
}
|
120
120
|
|
121
121
|
/** Check if setA is a subset of setB */
|
122
|
-
const isSubSetMapByValue = (setA:
|
122
|
+
const isSubSetMapByValue = (setA: EventDefFacts, setB: EventDefFacts) => {
|
123
123
|
for (const [key, value] of setA) {
|
124
124
|
if (setB.get(key) !== value) {
|
125
125
|
return false
|
@@ -129,7 +129,7 @@ const isSubSetMapByValue = (setA: MutationEventFacts, setB: MutationEventFacts)
|
|
129
129
|
}
|
130
130
|
|
131
131
|
/** Check if setA is a subset of setB */
|
132
|
-
const isSubSetMapByKey = (setA:
|
132
|
+
const isSubSetMapByKey = (setA: EventDefFacts, setB: EventDefFacts) => {
|
133
133
|
for (const [key, _value] of setA) {
|
134
134
|
if (!setB.has(key)) {
|
135
135
|
return false
|
@@ -139,17 +139,16 @@ const isSubSetMapByKey = (setA: MutationEventFacts, setB: MutationEventFacts) =>
|
|
139
139
|
}
|
140
140
|
|
141
141
|
/** Check if groupA depends on groupB */
|
142
|
-
export const dependsOn = (groupA:
|
142
|
+
export const dependsOn = (groupA: EventDefFactsGroup, groupB: EventDefFactsGroup): boolean =>
|
143
143
|
factsIntersect(groupA.depRead, groupB.modifySet) ||
|
144
144
|
factsIntersect(groupA.depRead, groupB.modifyUnset) ||
|
145
145
|
factsIntersect(groupA.depRequire, groupB.modifySet) ||
|
146
146
|
factsIntersect(groupA.depRequire, groupB.modifyUnset)
|
147
147
|
|
148
|
-
export const replacesFacts = (groupA:
|
149
|
-
const replaces = (a:
|
148
|
+
export const replacesFacts = (groupA: EventDefFactsGroup, groupB: EventDefFactsGroup): boolean => {
|
149
|
+
const replaces = (a: EventDefFacts, b: EventDefFacts) => a.size > 0 && b.size > 0 && isSameMapByKey(a, b)
|
150
150
|
|
151
|
-
const noFactsOrSame = (a:
|
152
|
-
a.size === 0 || b.size === 0 || isSameMapByKey(a, b)
|
151
|
+
const noFactsOrSame = (a: EventDefFacts, b: EventDefFacts) => a.size === 0 || b.size === 0 || isSameMapByKey(a, b)
|
153
152
|
|
154
153
|
return (
|
155
154
|
(replaces(groupA.modifySet, groupB.modifySet) && noFactsOrSame(groupA.modifyUnset, groupB.modifyUnset)) ||
|
@@ -159,16 +158,16 @@ export const replacesFacts = (groupA: MutationEventFactsGroup, groupB: MutationE
|
|
159
158
|
)
|
160
159
|
}
|
161
160
|
|
162
|
-
export const isSameMapByKey = (set:
|
161
|
+
export const isSameMapByKey = (set: EventDefFacts, otherSet: EventDefFacts) =>
|
163
162
|
set.size === otherSet.size && isSubSetMapByKey(set, otherSet)
|
164
163
|
|
165
|
-
export const factsToString = (facts:
|
164
|
+
export const factsToString = (facts: EventDefFacts) => {
|
166
165
|
return Array.from(facts)
|
167
166
|
.map(([key, value]) => (value === EMPTY_FACT_VALUE ? key : `${key}=${value}`))
|
168
167
|
.join(', ')
|
169
168
|
}
|
170
169
|
|
171
|
-
export const factsIntersect = (setA:
|
170
|
+
export const factsIntersect = (setA: EventDefFacts, setB: EventDefFacts): boolean => {
|
172
171
|
for (const [key, _value] of setA) {
|
173
172
|
if (setB.has(key)) {
|
174
173
|
return true
|
@@ -177,16 +176,16 @@ export const factsIntersect = (setA: MutationEventFacts, setB: MutationEventFact
|
|
177
176
|
return false
|
178
177
|
}
|
179
178
|
|
180
|
-
export const
|
179
|
+
export const getFactsGroupForEventArgs = ({
|
181
180
|
factsCallback,
|
182
181
|
args,
|
183
182
|
currentFacts,
|
184
183
|
}: {
|
185
184
|
factsCallback: FactsCallback<any> | undefined
|
186
185
|
args: any
|
187
|
-
currentFacts:
|
188
|
-
}):
|
189
|
-
const depRead:
|
186
|
+
currentFacts: EventDefFactsSnapshot
|
187
|
+
}): EventDefFactsGroup => {
|
188
|
+
const depRead: EventDefFactsSnapshot = new Map<string, any>()
|
190
189
|
const factsSnapshotProxy = new Proxy(currentFacts, {
|
191
190
|
get: (target, prop) => {
|
192
191
|
if (prop === 'has') {
|
@@ -201,12 +200,12 @@ export const getFactsGroupForMutationArgs = ({
|
|
201
200
|
}
|
202
201
|
}
|
203
202
|
|
204
|
-
notYetImplemented(`
|
203
|
+
notYetImplemented(`getFactsGroupForEventArgs: ${prop.toString()} is not yet implemented`)
|
205
204
|
},
|
206
205
|
})
|
207
206
|
|
208
207
|
const factsRes = factsCallback?.(args, factsSnapshotProxy)
|
209
|
-
const iterableToMap = (iterable: Iterable<
|
208
|
+
const iterableToMap = (iterable: Iterable<EventDefFactInput>) => {
|
210
209
|
const map = new Map()
|
211
210
|
for (const item of iterable) {
|
212
211
|
if (typeof item === 'string') {
|
@@ -227,9 +226,12 @@ export const getFactsGroupForMutationArgs = ({
|
|
227
226
|
return facts
|
228
227
|
}
|
229
228
|
|
230
|
-
export const
|
229
|
+
export const compareEventSequenceNumbers = (
|
230
|
+
a: EventSequenceNumber.EventSequenceNumber,
|
231
|
+
b: EventSequenceNumber.EventSequenceNumber,
|
232
|
+
) => {
|
231
233
|
if (a.global !== b.global) {
|
232
234
|
return a.global - b.global
|
233
235
|
}
|
234
|
-
return a.
|
236
|
+
return a.client - b.client
|
235
237
|
}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import
|
2
|
-
import
|
1
|
+
import type { EventDefFactsGroup } from '../../schema/EventDef.js'
|
2
|
+
import * as EventSequenceNumber from '../../schema/EventSequenceNumber.js'
|
3
3
|
import { graphology } from './graphology_.js'
|
4
4
|
|
5
5
|
export const connectionTypeOptions = ['parent', 'facts'] as const
|
@@ -20,25 +20,32 @@ export const emptyHistoryDag = (): HistoryDag =>
|
|
20
20
|
})
|
21
21
|
|
22
22
|
// TODO consider making `ROOT_ID` parent to itself
|
23
|
-
export const
|
23
|
+
export const rootParentNum = EventSequenceNumber.make({
|
24
|
+
global: EventSequenceNumber.ROOT.global - 1,
|
25
|
+
client: EventSequenceNumber.clientDefault,
|
26
|
+
})
|
24
27
|
|
25
28
|
export type HistoryDagNode = {
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
+
seqNum: EventSequenceNumber.EventSequenceNumber
|
30
|
+
parentSeqNum: EventSequenceNumber.EventSequenceNumber
|
31
|
+
name: string
|
29
32
|
args: any
|
30
33
|
/** Facts are being used for conflict detection and history compaction */
|
31
|
-
factsGroup:
|
34
|
+
factsGroup: EventDefFactsGroup
|
32
35
|
meta?: any
|
36
|
+
clientId: string
|
37
|
+
sessionId: string | undefined
|
33
38
|
}
|
34
39
|
|
35
40
|
export const rootEventNode: HistoryDagNode = {
|
36
|
-
|
37
|
-
|
41
|
+
seqNum: EventSequenceNumber.ROOT,
|
42
|
+
parentSeqNum: rootParentNum,
|
38
43
|
// unused below
|
39
|
-
|
44
|
+
name: '__Root__',
|
40
45
|
args: {},
|
41
46
|
factsGroup: { modifySet: new Map(), modifyUnset: new Map(), depRequire: new Map(), depRead: new Map() },
|
47
|
+
clientId: 'root',
|
48
|
+
sessionId: undefined,
|
42
49
|
}
|
43
50
|
|
44
51
|
export const EMPTY_FACT_VALUE = Symbol('EMPTY_FACT_VALUE')
|
@@ -1,9 +1,6 @@
|
|
1
|
-
import
|
1
|
+
import * as EventSequenceNumber from '../../schema/EventSequenceNumber.js'
|
2
2
|
import { factsToString, validateFacts } from './facts.js'
|
3
|
-
import { emptyHistoryDag, type HistoryDagNode,
|
4
|
-
|
5
|
-
export const eventIdToString = (eventId: EventId.EventId) =>
|
6
|
-
eventId.local === 0 ? eventId.global.toString() : `${eventId.global}.${eventId.local}`
|
3
|
+
import { emptyHistoryDag, type HistoryDagNode, rootParentNum } from './history-dag-common.js'
|
7
4
|
|
8
5
|
export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skipFactsCheck: boolean }) => {
|
9
6
|
if (options?.skipFactsCheck !== true) {
|
@@ -14,18 +11,20 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
|
|
14
11
|
|
15
12
|
if (validationResult.success === false) {
|
16
13
|
throw new Error(
|
17
|
-
`
|
14
|
+
`Event ${dagNodes[validationResult.index]!.name} requires facts that have not been set yet.\nRequires: ${factsToString(validationResult.requiredFacts)}\nFacts Snapshot: ${factsToString(validationResult.currentSnapshot)}`,
|
18
15
|
)
|
19
16
|
}
|
20
17
|
}
|
21
18
|
|
22
19
|
const dag = emptyHistoryDag()
|
23
20
|
|
24
|
-
dagNodes.forEach((node) => dag.addNode(
|
21
|
+
dagNodes.forEach((node) => dag.addNode(EventSequenceNumber.toString(node.seqNum), node))
|
25
22
|
|
26
23
|
dagNodes.forEach((node) => {
|
27
|
-
if (
|
28
|
-
dag.addEdge(
|
24
|
+
if (EventSequenceNumber.toString(node.parentSeqNum) !== EventSequenceNumber.toString(rootParentNum)) {
|
25
|
+
dag.addEdge(EventSequenceNumber.toString(node.parentSeqNum), EventSequenceNumber.toString(node.seqNum), {
|
26
|
+
type: 'parent',
|
27
|
+
})
|
29
28
|
}
|
30
29
|
})
|
31
30
|
|
@@ -34,28 +33,28 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
|
|
34
33
|
for (const factKey of factKeys) {
|
35
34
|
// Find the first ancestor node with a matching fact key (via modifySet or modifyUnset) by traversing the graph backwards via the parent edges
|
36
35
|
const depNode = (() => {
|
37
|
-
let
|
36
|
+
let currentSeqNumStr = EventSequenceNumber.toString(node.seqNum)
|
38
37
|
|
39
|
-
while (
|
40
|
-
const parentEdge = dag.inEdges(
|
38
|
+
while (currentSeqNumStr !== EventSequenceNumber.toString(rootParentNum)) {
|
39
|
+
const parentEdge = dag.inEdges(currentSeqNumStr).find((e) => dag.getEdgeAttribute(e, 'type') === 'parent')
|
41
40
|
if (!parentEdge) return null
|
42
41
|
|
43
|
-
const
|
44
|
-
const parentNode = dag.getNodeAttributes(
|
42
|
+
const parentSeqNumStr = dag.source(parentEdge)
|
43
|
+
const parentNode = dag.getNodeAttributes(parentSeqNumStr)
|
45
44
|
|
46
45
|
if (parentNode.factsGroup.modifySet.has(factKey) || parentNode.factsGroup.modifyUnset.has(factKey)) {
|
47
46
|
return parentNode
|
48
47
|
}
|
49
48
|
|
50
|
-
|
49
|
+
currentSeqNumStr = parentSeqNumStr
|
51
50
|
}
|
52
51
|
|
53
52
|
return null
|
54
53
|
})()
|
55
54
|
|
56
55
|
if (depNode) {
|
57
|
-
const depNodeIdStr =
|
58
|
-
const nodeIdStr =
|
56
|
+
const depNodeIdStr = EventSequenceNumber.toString(depNode.seqNum)
|
57
|
+
const nodeIdStr = EventSequenceNumber.toString(node.seqNum)
|
59
58
|
if (dag.edges(depNodeIdStr, nodeIdStr).filter((e) => dag.getEdgeAttributes(e).type === 'facts').length === 0) {
|
60
59
|
dag.addEdge(depNodeIdStr, nodeIdStr, { type: 'facts' })
|
61
60
|
}
|
@@ -1,11 +1,11 @@
|
|
1
|
-
import
|
2
|
-
import
|
3
|
-
import type
|
1
|
+
import type { EventDef, EventDefFactsSnapshot } from '../../schema/EventDef.js'
|
2
|
+
import * as EventSequenceNumber from '../../schema/EventSequenceNumber.js'
|
3
|
+
import type * as LiveStoreEvent from '../../schema/LiveStoreEvent.js'
|
4
4
|
import {
|
5
5
|
applyFactGroups,
|
6
6
|
factsIntersect,
|
7
7
|
type FactValidationResult,
|
8
|
-
|
8
|
+
getFactsGroupForEventArgs,
|
9
9
|
validateFacts,
|
10
10
|
} from './facts.js'
|
11
11
|
import type { HistoryDagNode } from './history-dag-common.js'
|
@@ -19,13 +19,13 @@ export type RebaseInput = {
|
|
19
19
|
newRemoteEvents: RebaseEventWithConflict[]
|
20
20
|
pendingLocalEvents: RebaseEventWithConflict[]
|
21
21
|
validate: (args: {
|
22
|
-
rebasedLocalEvents:
|
23
|
-
|
22
|
+
rebasedLocalEvents: LiveStoreEvent.PartialAnyDecoded[]
|
23
|
+
eventDefs: Record<string, EventDef.Any>
|
24
24
|
}) => FactValidationResult
|
25
25
|
}
|
26
26
|
|
27
27
|
export type RebaseOutput = {
|
28
|
-
rebasedLocalEvents:
|
28
|
+
rebasedLocalEvents: LiveStoreEvent.PartialAnyDecoded[]
|
29
29
|
}
|
30
30
|
|
31
31
|
export type RebaseFn = (input: RebaseInput) => RebaseOutput
|
@@ -43,12 +43,16 @@ export const rebaseEvents = ({
|
|
43
43
|
pendingLocalEvents,
|
44
44
|
newRemoteEvents,
|
45
45
|
currentFactsSnapshot,
|
46
|
+
clientId,
|
47
|
+
sessionId,
|
46
48
|
}: {
|
47
49
|
pendingLocalEvents: HistoryDagNode[]
|
48
50
|
newRemoteEvents: HistoryDagNode[]
|
49
51
|
rebaseFn: RebaseFn
|
50
|
-
currentFactsSnapshot:
|
51
|
-
|
52
|
+
currentFactsSnapshot: EventDefFactsSnapshot
|
53
|
+
clientId: string
|
54
|
+
sessionId: string
|
55
|
+
}): ReadonlyArray<LiveStoreEvent.AnyDecoded> => {
|
52
56
|
const initialSnapshot = new Map(currentFactsSnapshot)
|
53
57
|
applyFactGroups(
|
54
58
|
newRemoteEvents.map((event) => event.factsGroup),
|
@@ -72,11 +76,11 @@ export const rebaseEvents = ({
|
|
72
76
|
factsIntersect(pending.factsGroup.modifySet, remote.factsGroup.modifySet),
|
73
77
|
),
|
74
78
|
})),
|
75
|
-
validate: ({ rebasedLocalEvents,
|
79
|
+
validate: ({ rebasedLocalEvents, eventDefs }) =>
|
76
80
|
validateFacts({
|
77
81
|
factGroups: rebasedLocalEvents.map((event) =>
|
78
|
-
|
79
|
-
factsCallback:
|
82
|
+
getFactsGroupForEventArgs({
|
83
|
+
factsCallback: eventDefs[event.name]!.options.facts,
|
80
84
|
args: event.args,
|
81
85
|
currentFacts: new Map(),
|
82
86
|
}),
|
@@ -84,15 +88,23 @@ export const rebaseEvents = ({
|
|
84
88
|
initialSnapshot,
|
85
89
|
}),
|
86
90
|
})
|
87
|
-
const headGlobalId = newRemoteEvents.at(-1)!.
|
91
|
+
const headGlobalId = newRemoteEvents.at(-1)!.seqNum.global
|
88
92
|
|
89
93
|
return rebasedLocalEvents.map(
|
90
94
|
(event, index) =>
|
91
95
|
({
|
92
|
-
|
93
|
-
|
94
|
-
|
96
|
+
seqNum: EventSequenceNumber.make({
|
97
|
+
global: headGlobalId + index + 1,
|
98
|
+
client: EventSequenceNumber.clientDefault,
|
99
|
+
}),
|
100
|
+
parentSeqNum: EventSequenceNumber.make({
|
101
|
+
global: headGlobalId + index,
|
102
|
+
client: EventSequenceNumber.clientDefault,
|
103
|
+
}),
|
104
|
+
name: event.name,
|
95
105
|
args: event.args,
|
96
|
-
|
106
|
+
clientId,
|
107
|
+
sessionId,
|
108
|
+
}) satisfies LiveStoreEvent.AnyDecoded,
|
97
109
|
)
|
98
110
|
}
|