@livestore/common 0.4.0-dev.2 → 0.4.0-dev.20
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 +17 -12
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
- package/dist/adapter-types.d.ts +14 -6
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js.map +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +33 -6
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +28 -23
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +2 -2
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +7 -14
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +1 -6
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +36 -29
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +8 -8
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
- package/dist/devtools/devtools-sessioninfo.js +7 -4
- package/dist/devtools/devtools-sessioninfo.js.map +1 -1
- package/dist/devtools/mod.d.ts +13 -2
- package/dist/devtools/mod.d.ts.map +1 -1
- package/dist/devtools/mod.js +10 -3
- package/dist/devtools/mod.js.map +1 -1
- package/dist/errors.d.ts +52 -10
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +25 -6
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +8 -4
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +156 -73
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +15 -21
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +18 -18
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +2 -2
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +30 -42
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +6 -6
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +79 -27
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
- package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
- package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
- package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
- package/dist/leader-thread/materialize-event.d.ts +3 -3
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +25 -11
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +2 -3
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +5 -5
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -2
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -2
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/types.d.ts +21 -19
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.d.ts +40 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +33 -0
- package/dist/logging.js.map +1 -0
- package/dist/make-client-session.d.ts +5 -3
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +5 -2
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts +6 -6
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +20 -4
- package/dist/materializer-helper.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +2 -2
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +29 -20
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +147 -0
- package/dist/schema/EventDef/define.d.ts.map +1 -0
- package/dist/schema/EventDef/define.js +139 -0
- package/dist/schema/EventDef/define.js.map +1 -0
- package/dist/schema/EventDef/event-def.d.ts +106 -0
- package/dist/schema/EventDef/event-def.d.ts.map +1 -0
- package/dist/schema/EventDef/event-def.js +2 -0
- package/dist/schema/EventDef/event-def.js.map +1 -0
- package/dist/schema/EventDef/facts.d.ts +118 -0
- package/dist/schema/EventDef/facts.d.ts.map +1 -0
- package/dist/schema/EventDef/facts.js +53 -0
- package/dist/schema/EventDef/facts.js.map +1 -0
- package/dist/schema/EventDef/materializer.d.ts +155 -0
- package/dist/schema/EventDef/materializer.d.ts.map +1 -0
- package/dist/schema/EventDef/materializer.js +83 -0
- package/dist/schema/EventDef/materializer.js.map +1 -0
- package/dist/schema/EventDef/mod.d.ts +5 -0
- package/dist/schema/EventDef/mod.d.ts.map +1 -0
- package/dist/schema/EventDef/mod.js +5 -0
- package/dist/schema/EventDef/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/client.js +193 -0
- package/dist/schema/EventSequenceNumber/client.js.map +1 -0
- package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
- package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/global.js +14 -0
- package/dist/schema/EventSequenceNumber/global.js.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.js +37 -0
- package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +43 -43
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +89 -106
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
- package/dist/schema/{LiveStoreEvent.js → LiveStoreEvent/client.js} +74 -58
- package/dist/schema/LiveStoreEvent/client.js.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
- package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
- package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/global.js +31 -0
- package/dist/schema/LiveStoreEvent/global.js.map +1 -0
- package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
- package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/input.js +26 -0
- package/dist/schema/LiveStoreEvent/input.js.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.js +5 -0
- package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
- package/dist/schema/events.d.ts +1 -1
- package/dist/schema/events.d.ts.map +1 -1
- package/dist/schema/events.js +1 -1
- package/dist/schema/events.js.map +1 -1
- package/dist/schema/mod.d.ts +6 -4
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +5 -4
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +16 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +27 -2
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +36 -6
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +97 -6
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +16 -0
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.js +14 -6
- package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +69 -22
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +46 -7
- package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-spec.js +30 -12
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +23 -14
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +23 -6
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +14 -8
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +5 -3
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +2 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +3 -3
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +3 -3
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/api.d.ts +17 -10
- package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/astToSql.js +22 -15
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +6 -3
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +252 -88
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +22 -12
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
- package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +63 -456
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
- package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
- package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
- package/dist/schema/state/sqlite/table-def.d.ts +4 -4
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +2 -2
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +80 -0
- package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
- package/dist/schema/unknown-events.d.ts +47 -0
- package/dist/schema/unknown-events.d.ts.map +1 -0
- package/dist/schema/unknown-events.js +69 -0
- package/dist/schema/unknown-events.js.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
- package/dist/schema-management/migrations.d.ts +32 -2
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +37 -5
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts +3 -3
- package/dist/schema-management/validate-schema.d.ts.map +1 -1
- package/dist/schema-management/validate-schema.js +2 -2
- package/dist/schema-management/validate-schema.js.map +1 -1
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +11 -1
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
- package/dist/sql-queries/sql-query-builder.js +2 -1
- package/dist/sql-queries/sql-query-builder.js.map +1 -1
- package/dist/sqlite-types.d.ts +3 -3
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +11 -13
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +45 -42
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +66 -0
- package/dist/sync/errors.d.ts.map +1 -0
- package/dist/sync/errors.js +36 -0
- package/dist/sync/errors.js.map +1 -0
- package/dist/sync/index.d.ts +3 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +3 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +23 -0
- package/dist/sync/mock-sync-backend.d.ts.map +1 -0
- package/dist/sync/mock-sync-backend.js +114 -0
- package/dist/sync/mock-sync-backend.js.map +1 -0
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +6 -7
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +5 -5
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +1 -2
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +54 -15
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +198 -9
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.d.ts.map +1 -1
- package/dist/sync/next/history-dag.js +10 -8
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +5 -5
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +5 -5
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts +2 -2
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +9 -9
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync-backend-kv.d.ts +7 -0
- package/dist/sync/sync-backend-kv.d.ts.map +1 -0
- package/dist/sync/sync-backend-kv.js +18 -0
- package/dist/sync/sync-backend-kv.js.map +1 -0
- package/dist/sync/sync-backend.d.ts +105 -0
- package/dist/sync/sync-backend.d.ts.map +1 -0
- package/dist/sync/sync-backend.js +61 -0
- package/dist/sync/sync-backend.js.map +1 -0
- package/dist/sync/sync.d.ts +9 -86
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +2 -27
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +57 -44
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +50 -45
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +83 -46
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/transport-chunking.d.ts +36 -0
- package/dist/sync/transport-chunking.d.ts.map +1 -0
- package/dist/sync/transport-chunking.js +56 -0
- package/dist/sync/transport-chunking.js.map +1 -0
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +6 -6
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/testing/event-factory.d.ts +68 -0
- package/dist/testing/event-factory.d.ts.map +1 -0
- package/dist/testing/event-factory.js +78 -0
- package/dist/testing/event-factory.js.map +1 -0
- package/dist/testing/mod.d.ts +2 -0
- package/dist/testing/mod.d.ts.map +1 -0
- package/dist/testing/mod.js +2 -0
- package/dist/testing/mod.js.map +1 -0
- package/dist/version.d.ts +16 -6
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +16 -6
- package/dist/version.js.map +1 -1
- package/package.json +7 -8
- package/src/ClientSessionLeaderThreadProxy.ts +17 -12
- package/src/adapter-types.ts +18 -6
- package/src/debug-info.ts +37 -6
- package/src/devtools/devtools-messages-client-session.ts +2 -2
- package/src/devtools/devtools-messages-common.ts +1 -8
- package/src/devtools/devtools-messages-leader.ts +8 -8
- package/src/devtools/devtools-sessioninfo.ts +8 -5
- package/src/devtools/mod.ts +11 -2
- package/src/errors.ts +38 -11
- package/src/index.ts +2 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +242 -103
- package/src/leader-thread/eventlog.ts +33 -34
- package/src/leader-thread/leader-worker-devtools.ts +50 -54
- package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
- package/src/leader-thread/make-leader-thread-layer.ts +156 -37
- package/src/leader-thread/materialize-event.ts +37 -12
- package/src/leader-thread/recreate-db.ts +15 -7
- package/src/leader-thread/shutdown-channel.ts +16 -2
- package/src/leader-thread/types.ts +21 -19
- package/src/logging.ts +62 -0
- package/src/make-client-session.ts +9 -3
- package/src/materializer-helper.ts +27 -10
- package/src/rematerialize-from-eventlog.ts +37 -27
- package/src/schema/EventDef/define.ts +201 -0
- package/src/schema/EventDef/event-def.ts +120 -0
- package/src/schema/EventDef/facts.ts +135 -0
- package/src/schema/EventDef/materializer.ts +172 -0
- package/src/schema/EventDef/mod.ts +4 -0
- package/src/schema/EventSequenceNumber/client.ts +257 -0
- package/src/schema/EventSequenceNumber/global.ts +19 -0
- package/src/schema/EventSequenceNumber/mod.ts +37 -0
- package/src/schema/EventSequenceNumber.test.ts +70 -52
- package/src/schema/LiveStoreEvent/client.ts +221 -0
- package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
- package/src/schema/LiveStoreEvent/global.ts +45 -0
- package/src/schema/LiveStoreEvent/input.ts +63 -0
- package/src/schema/LiveStoreEvent/mod.ts +4 -0
- package/src/schema/events.ts +1 -1
- package/src/schema/mod.ts +6 -4
- package/src/schema/schema.ts +39 -3
- package/src/schema/state/sqlite/client-document-def.test.ts +19 -2
- package/src/schema/state/sqlite/client-document-def.ts +120 -8
- package/src/schema/state/sqlite/column-annotations.test.ts +1 -1
- package/src/schema/state/sqlite/column-annotations.ts +16 -6
- package/src/schema/state/sqlite/column-def.test.ts +60 -7
- package/src/schema/state/sqlite/column-def.ts +88 -21
- package/src/schema/state/sqlite/column-spec.test.ts +29 -16
- package/src/schema/state/sqlite/column-spec.ts +36 -11
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +26 -6
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +29 -12
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +2 -1
- package/src/schema/state/sqlite/mod.ts +4 -3
- package/src/schema/state/sqlite/query-builder/api.ts +19 -10
- package/src/schema/state/sqlite/query-builder/astToSql.ts +23 -14
- package/src/schema/state/sqlite/query-builder/impl.test.ts +305 -92
- package/src/schema/state/sqlite/query-builder/impl.ts +8 -3
- package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
- package/src/schema/state/sqlite/schema-helpers.ts +28 -20
- package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
- package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
- package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
- package/src/schema/state/sqlite/table-def.test.ts +101 -0
- package/src/schema/state/sqlite/table-def.ts +9 -8
- package/src/schema/unknown-events.ts +131 -0
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +86 -0
- package/src/schema-management/migrations.ts +41 -8
- package/src/schema-management/validate-schema.ts +3 -3
- package/src/sql-queries/sql-queries.ts +9 -1
- package/src/sql-queries/sql-query-builder.ts +2 -1
- package/src/sqlite-types.ts +3 -3
- package/src/sync/ClientSessionSyncProcessor.ts +69 -62
- package/src/sync/errors.ts +38 -0
- package/src/sync/index.ts +3 -0
- package/src/sync/mock-sync-backend.ts +184 -0
- package/src/sync/next/compact-events.ts +6 -7
- package/src/sync/next/facts.ts +7 -9
- package/src/sync/next/history-dag-common.ts +277 -26
- package/src/sync/next/history-dag.ts +16 -10
- package/src/sync/next/rebase-events.ts +11 -11
- package/src/sync/next/test/event-fixtures.ts +11 -11
- package/src/sync/sync-backend-kv.ts +22 -0
- package/src/sync/sync-backend.ts +185 -0
- package/src/sync/sync.ts +9 -91
- package/src/sync/syncstate.test.ts +96 -52
- package/src/sync/syncstate.ts +69 -58
- package/src/sync/transport-chunking.ts +90 -0
- package/src/sync/validate-push-payload.ts +8 -9
- package/src/testing/event-factory.ts +131 -0
- package/src/testing/mod.ts +1 -0
- package/src/version.ts +16 -6
- package/dist/schema/EventDef.d.ts +0 -123
- package/dist/schema/EventDef.d.ts.map +0 -1
- package/dist/schema/EventDef.js +0 -46
- package/dist/schema/EventDef.js.map +0 -1
- package/dist/schema/EventSequenceNumber.d.ts +0 -80
- package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
- package/dist/schema/EventSequenceNumber.js +0 -139
- package/dist/schema/EventSequenceNumber.js.map +0 -1
- package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
- package/dist/schema/LiveStoreEvent.js.map +0 -1
- package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
- package/dist/schema/state/sqlite/system-tables.js +0 -79
- package/dist/schema/state/sqlite/system-tables.js.map +0 -1
- package/dist/schema-management/migrations.test.d.ts +0 -2
- package/dist/schema-management/migrations.test.d.ts.map +0 -1
- package/dist/schema-management/migrations.test.js +0 -52
- package/dist/schema-management/migrations.test.js.map +0 -1
- package/dist/sync/next/graphology.d.ts +0 -8
- package/dist/sync/next/graphology.d.ts.map +0 -1
- package/dist/sync/next/graphology.js +0 -30
- package/dist/sync/next/graphology.js.map +0 -1
- package/dist/sync/next/graphology_.d.ts +0 -3
- package/dist/sync/next/graphology_.d.ts.map +0 -1
- package/dist/sync/next/graphology_.js +0 -3
- package/dist/sync/next/graphology_.js.map +0 -1
- package/src/schema/EventDef.ts +0 -219
- package/src/schema/EventSequenceNumber.ts +0 -199
- package/src/schema/LiveStoreEvent.ts +0 -287
- package/src/schema/state/sqlite/system-tables.ts +0 -104
- package/src/sync/next/ambient.d.ts +0 -3
- package/src/sync/next/graphology.ts +0 -41
- package/src/sync/next/graphology_.ts +0 -2
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { EventSequenceNumber } from '../../schema/mod.ts'
|
|
2
2
|
import { replacesFacts } from './facts.ts'
|
|
3
|
-
import { graphologyDag } from './graphology_.ts'
|
|
4
3
|
import type { HistoryDag } from './history-dag-common.ts'
|
|
5
4
|
import { emptyHistoryDag } from './history-dag-common.ts'
|
|
6
5
|
|
|
@@ -17,7 +16,7 @@ export const compactEvents = (inputDag: HistoryDag): { dag: HistoryDag; compacte
|
|
|
17
16
|
const dag = inputDag.copy()
|
|
18
17
|
const compactedEventCount = 0
|
|
19
18
|
|
|
20
|
-
const orderedEventSequenceNumberStrs =
|
|
19
|
+
const orderedEventSequenceNumberStrs = dag.topologicalNodeIds().reverse()
|
|
21
20
|
|
|
22
21
|
// drop root
|
|
23
22
|
orderedEventSequenceNumberStrs.pop()
|
|
@@ -116,7 +115,7 @@ const findSubDagsInHistory = (
|
|
|
116
115
|
const subDags: HistoryDag[] = []
|
|
117
116
|
const allOutsideDependencies: string[][] = []
|
|
118
117
|
|
|
119
|
-
for (const eventNumStr of
|
|
118
|
+
for (const eventNumStr of inputDag.topologicalNodeIds()) {
|
|
120
119
|
if (eventNumStr === upToExclEventSequenceNumberStr) {
|
|
121
120
|
break
|
|
122
121
|
}
|
|
@@ -189,8 +188,8 @@ const dagReplacesDag = (dagA: HistoryDag, dagB: HistoryDag): boolean => {
|
|
|
189
188
|
}
|
|
190
189
|
|
|
191
190
|
// TODO write tests that covers deterministic order when DAGs have branches
|
|
192
|
-
const nodeEntriesA =
|
|
193
|
-
const nodeEntriesB =
|
|
191
|
+
const nodeEntriesA = dagA.topologicalNodeIds().map((nodeId) => dagA.getNodeAttributes(nodeId))
|
|
192
|
+
const nodeEntriesB = dagB.topologicalNodeIds().map((nodeId) => dagB.getNodeAttributes(nodeId))
|
|
194
193
|
|
|
195
194
|
for (let i = 0; i < nodeEntriesA.length; i++) {
|
|
196
195
|
const nodeA = nodeEntriesA[i]!
|
|
@@ -207,14 +206,14 @@ const dagReplacesDag = (dagA: HistoryDag, dagB: HistoryDag): boolean => {
|
|
|
207
206
|
const removeEvent = (dag: HistoryDag, eventNumStr: string) => {
|
|
208
207
|
// console.debug('removing event', eventNumStr)
|
|
209
208
|
const event = dag.getNodeAttributes(eventNumStr)
|
|
210
|
-
const parentSeqNumStr = EventSequenceNumber.toString(event.parentSeqNum)
|
|
209
|
+
const parentSeqNumStr = EventSequenceNumber.Client.toString(event.parentSeqNum)
|
|
211
210
|
const childEdges = dag.outboundEdgeEntries(eventNumStr)
|
|
212
211
|
|
|
213
212
|
for (const childEdge of childEdges) {
|
|
214
213
|
if (childEdge.attributes.type === 'parent') {
|
|
215
214
|
const childEvent = dag.getNodeAttributes(childEdge.target)
|
|
216
215
|
childEvent.parentSeqNum = { ...event.parentSeqNum }
|
|
217
|
-
dag.addEdge(parentSeqNumStr, EventSequenceNumber.toString(childEvent.seqNum), { type: 'parent' })
|
|
216
|
+
dag.addEdge(parentSeqNumStr, EventSequenceNumber.Client.toString(childEvent.seqNum), { type: 'parent' })
|
|
218
217
|
}
|
|
219
218
|
}
|
|
220
219
|
|
package/src/sync/next/facts.ts
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
import { notYetImplemented } from '@livestore/utils'
|
|
2
|
-
|
|
3
2
|
import type {
|
|
4
3
|
EventDefFactInput,
|
|
5
4
|
EventDefFacts,
|
|
6
5
|
EventDefFactsGroup,
|
|
7
6
|
EventDefFactsSnapshot,
|
|
8
7
|
FactsCallback,
|
|
9
|
-
} from '../../schema/EventDef.ts'
|
|
10
|
-
import type * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
|
|
11
|
-
import { graphologyDag } from './graphology_.ts'
|
|
8
|
+
} from '../../schema/EventDef/mod.ts'
|
|
9
|
+
import type * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
|
|
12
10
|
import { EMPTY_FACT_VALUE, type HistoryDag, type HistoryDagNode } from './history-dag-common.ts'
|
|
13
11
|
|
|
14
12
|
export const factsSnapshotForEvents = (
|
|
15
13
|
events: HistoryDagNode[],
|
|
16
|
-
endEventSequenceNumber: EventSequenceNumber.
|
|
14
|
+
endEventSequenceNumber: EventSequenceNumber.Client.Composite,
|
|
17
15
|
): EventDefFactsSnapshot => {
|
|
18
16
|
const facts = new Map<string, any>()
|
|
19
17
|
|
|
@@ -30,11 +28,11 @@ export const factsSnapshotForEvents = (
|
|
|
30
28
|
|
|
31
29
|
export const factsSnapshotForDag = (
|
|
32
30
|
dag: HistoryDag,
|
|
33
|
-
endEventSequenceNumber: EventSequenceNumber.
|
|
31
|
+
endEventSequenceNumber: EventSequenceNumber.Client.Composite | undefined,
|
|
34
32
|
): EventDefFactsSnapshot => {
|
|
35
33
|
const facts = new Map<string, any>()
|
|
36
34
|
|
|
37
|
-
const orderedEventSequenceNumberStrs =
|
|
35
|
+
const orderedEventSequenceNumberStrs = dag.topologicalNodeIds()
|
|
38
36
|
|
|
39
37
|
for (let i = 0; i < orderedEventSequenceNumberStrs.length; i++) {
|
|
40
38
|
const event = dag.getNodeAttributes(orderedEventSequenceNumberStrs[i]!)
|
|
@@ -227,8 +225,8 @@ export const getFactsGroupForEventArgs = ({
|
|
|
227
225
|
}
|
|
228
226
|
|
|
229
227
|
export const compareEventSequenceNumbers = (
|
|
230
|
-
a: EventSequenceNumber.
|
|
231
|
-
b: EventSequenceNumber.
|
|
228
|
+
a: EventSequenceNumber.Client.Composite,
|
|
229
|
+
b: EventSequenceNumber.Client.Composite,
|
|
232
230
|
) => {
|
|
233
231
|
if (a.global !== b.global) {
|
|
234
232
|
return a.global - b.global
|
|
@@ -1,33 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
1
|
+
import { shouldNeverHappen } from '@livestore/utils'
|
|
2
|
+
import { Graph } from '@livestore/utils/effect'
|
|
3
|
+
import type { EventDefFactsGroup } from '../../schema/EventDef/mod.ts'
|
|
4
|
+
import * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
|
|
4
5
|
|
|
5
6
|
export const connectionTypeOptions = ['parent', 'facts'] as const
|
|
6
7
|
export type ConnectionType = (typeof connectionTypeOptions)[number]
|
|
7
8
|
|
|
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
9
|
export type HistoryDagNode = {
|
|
29
|
-
seqNum: EventSequenceNumber.
|
|
30
|
-
parentSeqNum: EventSequenceNumber.
|
|
10
|
+
seqNum: EventSequenceNumber.Client.Composite
|
|
11
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
31
12
|
name: string
|
|
32
13
|
args: any
|
|
33
14
|
/** Facts are being used for conflict detection and history compaction */
|
|
@@ -37,8 +18,278 @@ export type HistoryDagNode = {
|
|
|
37
18
|
sessionId: string | undefined
|
|
38
19
|
}
|
|
39
20
|
|
|
21
|
+
type HistoryDagEdgeAttributes = { type: ConnectionType }
|
|
22
|
+
|
|
23
|
+
type HistoryDagEdgeEntry = {
|
|
24
|
+
edge: Graph.EdgeIndex
|
|
25
|
+
source: string
|
|
26
|
+
target: string
|
|
27
|
+
attributes: HistoryDagEdgeAttributes
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
type HistoryDagOptions = {
|
|
31
|
+
allowSelfLoops: boolean
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const defaultOptions: HistoryDagOptions = {
|
|
35
|
+
allowSelfLoops: false,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const cloneFactsGroup = (factsGroup: EventDefFactsGroup): EventDefFactsGroup => ({
|
|
39
|
+
depRead: new Map(factsGroup.depRead),
|
|
40
|
+
depRequire: new Map(factsGroup.depRequire),
|
|
41
|
+
modifySet: new Map(factsGroup.modifySet),
|
|
42
|
+
modifyUnset: new Map(factsGroup.modifyUnset),
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
const cloneHistoryDagNode = (node: HistoryDagNode): HistoryDagNode => ({
|
|
46
|
+
...node,
|
|
47
|
+
// Copy the event sequence numbers to avoid accidental aliasing
|
|
48
|
+
parentSeqNum: { ...node.parentSeqNum },
|
|
49
|
+
seqNum: { ...node.seqNum },
|
|
50
|
+
// Facts are represented via maps which should not be shared across DAG copies
|
|
51
|
+
factsGroup: cloneFactsGroup(node.factsGroup),
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Mutable DAG wrapper that retains the previous string-based node ids API
|
|
56
|
+
* while delegating storage and algorithms to Effect's graph module.
|
|
57
|
+
*/
|
|
58
|
+
export class HistoryDag {
|
|
59
|
+
private readonly options: HistoryDagOptions
|
|
60
|
+
private readonly idToIndex: Map<string, Graph.NodeIndex>
|
|
61
|
+
private readonly indexToId: Map<Graph.NodeIndex, string>
|
|
62
|
+
private readonly graph: Graph.MutableDirectedGraph<HistoryDagNode, HistoryDagEdgeAttributes>
|
|
63
|
+
|
|
64
|
+
private constructor({
|
|
65
|
+
graph,
|
|
66
|
+
idToIndex,
|
|
67
|
+
indexToId,
|
|
68
|
+
options,
|
|
69
|
+
}: {
|
|
70
|
+
graph: Graph.MutableDirectedGraph<HistoryDagNode, HistoryDagEdgeAttributes>
|
|
71
|
+
idToIndex?: Map<string, Graph.NodeIndex>
|
|
72
|
+
indexToId?: Map<Graph.NodeIndex, string>
|
|
73
|
+
options?: Partial<HistoryDagOptions>
|
|
74
|
+
}) {
|
|
75
|
+
this.graph = graph
|
|
76
|
+
this.options = { ...defaultOptions, ...options }
|
|
77
|
+
this.idToIndex = idToIndex ? new Map(idToIndex) : new Map()
|
|
78
|
+
this.indexToId = indexToId ? new Map(indexToId) : new Map()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static create(options?: Partial<HistoryDagOptions>): HistoryDag {
|
|
82
|
+
const graph = Graph.beginMutation(Graph.directed<HistoryDagNode, HistoryDagEdgeAttributes>())
|
|
83
|
+
return options ? new HistoryDag({ graph, options }) : new HistoryDag({ graph })
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
copy(): HistoryDag {
|
|
87
|
+
const clone = HistoryDag.create(this.options)
|
|
88
|
+
|
|
89
|
+
for (const [id, index] of this.idToIndex) {
|
|
90
|
+
const node = this.graph.nodes.get(index) ?? shouldNeverHappen(`HistoryDag.copy missing node for ${id}`)
|
|
91
|
+
clone.addNode(id, cloneHistoryDagNode(node))
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
for (const edge of this.graph.edges.values()) {
|
|
95
|
+
const sourceId = this.indexToId.get(edge.source) ?? shouldNeverHappen('HistoryDag.copy missing source id')
|
|
96
|
+
const targetId = this.indexToId.get(edge.target) ?? shouldNeverHappen('HistoryDag.copy missing target id')
|
|
97
|
+
clone.addEdge(sourceId, targetId, { ...edge.data })
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return clone
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
topologicalNodeIds(): Array<string> {
|
|
104
|
+
const walker = Graph.topo(this.graph)
|
|
105
|
+
const indices = Array.from(Graph.indices(walker))
|
|
106
|
+
return indices.map((index) => this.indexToId.get(index) ?? shouldNeverHappen(`Missing node id for index ${index}`))
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
addNode(id: string, attributes: HistoryDagNode): void {
|
|
110
|
+
if (this.idToIndex.has(id)) {
|
|
111
|
+
shouldNeverHappen(`HistoryDag node ${id} already exists`)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const nodeIndex = Graph.addNode(this.graph, attributes)
|
|
115
|
+
this.idToIndex.set(id, nodeIndex)
|
|
116
|
+
this.indexToId.set(nodeIndex, id)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
hasNode(id: string): boolean {
|
|
120
|
+
return this.idToIndex.has(id)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
getNodeAttributes(id: string): HistoryDagNode {
|
|
124
|
+
const index = this.idToIndex.get(id)
|
|
125
|
+
if (index === undefined) {
|
|
126
|
+
return shouldNeverHappen(`HistoryDag node ${id} not found`)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const node = this.graph.nodes.get(index)
|
|
130
|
+
return node ?? shouldNeverHappen(`HistoryDag node data missing for ${id}`)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
nodes(): IterableIterator<string> {
|
|
134
|
+
return this.idToIndex.keys()
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
nodeEntries(): IterableIterator<{ key: string; attributes: HistoryDagNode }> {
|
|
138
|
+
return function* (this: HistoryDag) {
|
|
139
|
+
for (const [id, index] of this.idToIndex) {
|
|
140
|
+
const attributes = this.graph.nodes.get(index) ?? shouldNeverHappen(`HistoryDag node data missing for ${id}`)
|
|
141
|
+
yield { key: id, attributes }
|
|
142
|
+
}
|
|
143
|
+
}.call(this)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
addEdge(sourceId: string, targetId: string, attributes: HistoryDagEdgeAttributes): Graph.EdgeIndex {
|
|
147
|
+
if (this.options.allowSelfLoops === false && sourceId === targetId) {
|
|
148
|
+
return shouldNeverHappen('HistoryDag self-loops are disabled')
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const sourceIndex = this.idToIndex.get(sourceId)
|
|
152
|
+
const targetIndex = this.idToIndex.get(targetId)
|
|
153
|
+
|
|
154
|
+
if (sourceIndex === undefined || targetIndex === undefined) {
|
|
155
|
+
return shouldNeverHappen(`HistoryDag edge references unknown nodes: ${sourceId} -> ${targetId}`)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return Graph.addEdge(this.graph, sourceIndex, targetIndex, attributes)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
edges(sourceId: string, targetId: string): Array<Graph.EdgeIndex> {
|
|
162
|
+
const sourceIndex = this.idToIndex.get(sourceId)
|
|
163
|
+
const targetIndex = this.idToIndex.get(targetId)
|
|
164
|
+
|
|
165
|
+
if (sourceIndex === undefined || targetIndex === undefined) {
|
|
166
|
+
return []
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const adjacency = this.graph.adjacency.get(sourceIndex)
|
|
170
|
+
if (adjacency === undefined) {
|
|
171
|
+
return []
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return adjacency.filter((edgeIndex) => {
|
|
175
|
+
const edge = this.graph.edges.get(edgeIndex)
|
|
176
|
+
return edge !== undefined && edge.target === targetIndex
|
|
177
|
+
})
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
inEdges(id: string): Array<Graph.EdgeIndex> {
|
|
181
|
+
const index = this.idToIndex.get(id)
|
|
182
|
+
if (index === undefined) {
|
|
183
|
+
return []
|
|
184
|
+
}
|
|
185
|
+
const incoming = this.graph.reverseAdjacency.get(index)
|
|
186
|
+
return incoming ? [...incoming] : []
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
outboundEdgeEntries(id: string): Array<HistoryDagEdgeEntry> {
|
|
190
|
+
const index = this.idToIndex.get(id)
|
|
191
|
+
if (index === undefined) {
|
|
192
|
+
return []
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const adjacency = this.graph.adjacency.get(index)
|
|
196
|
+
if (adjacency === undefined) {
|
|
197
|
+
return []
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return adjacency
|
|
201
|
+
.map((edgeIndex) => this.edgeEntry(edgeIndex))
|
|
202
|
+
.filter((entry): entry is HistoryDagEdgeEntry => entry !== undefined)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
inboundEdgeEntries(id: string): Array<HistoryDagEdgeEntry> {
|
|
206
|
+
const index = this.idToIndex.get(id)
|
|
207
|
+
if (index === undefined) {
|
|
208
|
+
return []
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const adjacency = this.graph.reverseAdjacency.get(index)
|
|
212
|
+
if (adjacency === undefined) {
|
|
213
|
+
return []
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return adjacency
|
|
217
|
+
.map((edgeIndex) => this.edgeEntry(edgeIndex))
|
|
218
|
+
.filter((entry): entry is HistoryDagEdgeEntry => entry !== undefined)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
getEdgeAttributes(edgeIndex: Graph.EdgeIndex): HistoryDagEdgeAttributes {
|
|
222
|
+
const edge = this.graph.edges.get(edgeIndex)
|
|
223
|
+
return edge?.data ?? shouldNeverHappen(`HistoryDag edge ${edgeIndex} not found`)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
getEdgeAttribute<TKey extends keyof HistoryDagEdgeAttributes>(
|
|
227
|
+
edgeIndex: Graph.EdgeIndex,
|
|
228
|
+
key: TKey,
|
|
229
|
+
): HistoryDagEdgeAttributes[TKey] {
|
|
230
|
+
const attributes = this.getEdgeAttributes(edgeIndex)
|
|
231
|
+
return attributes[key]
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
source(edgeIndex: Graph.EdgeIndex): string {
|
|
235
|
+
const edge = this.graph.edges.get(edgeIndex)
|
|
236
|
+
const sourceId = edge !== undefined ? this.indexToId.get(edge.source) : undefined
|
|
237
|
+
return sourceId ?? shouldNeverHappen(`HistoryDag edge ${edgeIndex} missing source`)
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
target(edgeIndex: Graph.EdgeIndex): string {
|
|
241
|
+
const edge = this.graph.edges.get(edgeIndex)
|
|
242
|
+
const targetId = edge !== undefined ? this.indexToId.get(edge.target) : undefined
|
|
243
|
+
return targetId ?? shouldNeverHappen(`HistoryDag edge ${edgeIndex} missing target`)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
dropNode(id: string): void {
|
|
247
|
+
const index = this.idToIndex.get(id)
|
|
248
|
+
if (index === undefined) {
|
|
249
|
+
return
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
Graph.removeNode(this.graph, index)
|
|
253
|
+
this.idToIndex.delete(id)
|
|
254
|
+
this.indexToId.delete(index)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
get size(): number {
|
|
258
|
+
return this.idToIndex.size
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
private edgeEntry(edgeIndex: Graph.EdgeIndex): HistoryDagEdgeEntry | undefined {
|
|
262
|
+
const edge = this.graph.edges.get(edgeIndex)
|
|
263
|
+
if (edge === undefined) {
|
|
264
|
+
return undefined
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const source = this.indexToId.get(edge.source)
|
|
268
|
+
const target = this.indexToId.get(edge.target)
|
|
269
|
+
|
|
270
|
+
if (source === undefined || target === undefined) {
|
|
271
|
+
return undefined
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return {
|
|
275
|
+
edge: edgeIndex,
|
|
276
|
+
source,
|
|
277
|
+
target,
|
|
278
|
+
attributes: edge.data,
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
export const emptyHistoryDag = (): HistoryDag => HistoryDag.create({ allowSelfLoops: false })
|
|
284
|
+
|
|
285
|
+
// TODO consider making `ROOT_ID` parent to itself
|
|
286
|
+
export const rootParentNum = EventSequenceNumber.Client.Composite.make({
|
|
287
|
+
global: EventSequenceNumber.Client.ROOT.global - 1,
|
|
288
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
289
|
+
})
|
|
290
|
+
|
|
40
291
|
export const rootEventNode: HistoryDagNode = {
|
|
41
|
-
seqNum: EventSequenceNumber.ROOT,
|
|
292
|
+
seqNum: EventSequenceNumber.Client.ROOT,
|
|
42
293
|
parentSeqNum: rootParentNum,
|
|
43
294
|
// unused below
|
|
44
295
|
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
|
|
|
@@ -18,13 +18,19 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
|
|
|
18
18
|
|
|
19
19
|
const dag = emptyHistoryDag()
|
|
20
20
|
|
|
21
|
-
dagNodes.forEach((node) =>
|
|
21
|
+
dagNodes.forEach((node) => {
|
|
22
|
+
dag.addNode(EventSequenceNumber.Client.toString(node.seqNum), node)
|
|
23
|
+
})
|
|
22
24
|
|
|
23
25
|
dagNodes.forEach((node) => {
|
|
24
|
-
if (EventSequenceNumber.toString(node.parentSeqNum) !== EventSequenceNumber.toString(rootParentNum)) {
|
|
25
|
-
dag.addEdge(
|
|
26
|
-
|
|
27
|
-
|
|
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
|
+
)
|
|
28
34
|
}
|
|
29
35
|
})
|
|
30
36
|
|
|
@@ -33,9 +39,9 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
|
|
|
33
39
|
for (const factKey of factKeys) {
|
|
34
40
|
// Find the first ancestor node with a matching fact key (via modifySet or modifyUnset) by traversing the graph backwards via the parent edges
|
|
35
41
|
const depNode = (() => {
|
|
36
|
-
let currentSeqNumStr = EventSequenceNumber.toString(node.seqNum)
|
|
42
|
+
let currentSeqNumStr = EventSequenceNumber.Client.toString(node.seqNum)
|
|
37
43
|
|
|
38
|
-
while (currentSeqNumStr !== EventSequenceNumber.toString(rootParentNum)) {
|
|
44
|
+
while (currentSeqNumStr !== EventSequenceNumber.Client.toString(rootParentNum)) {
|
|
39
45
|
const parentEdge = dag.inEdges(currentSeqNumStr).find((e) => dag.getEdgeAttribute(e, 'type') === 'parent')
|
|
40
46
|
if (!parentEdge) return null
|
|
41
47
|
|
|
@@ -53,8 +59,8 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
|
|
|
53
59
|
})()
|
|
54
60
|
|
|
55
61
|
if (depNode) {
|
|
56
|
-
const depNodeIdStr = EventSequenceNumber.toString(depNode.seqNum)
|
|
57
|
-
const nodeIdStr = EventSequenceNumber.toString(node.seqNum)
|
|
62
|
+
const depNodeIdStr = EventSequenceNumber.Client.toString(depNode.seqNum)
|
|
63
|
+
const nodeIdStr = EventSequenceNumber.Client.toString(node.seqNum)
|
|
58
64
|
if (dag.edges(depNodeIdStr, nodeIdStr).filter((e) => dag.getEdgeAttributes(e).type === 'facts').length === 0) {
|
|
59
65
|
dag.addEdge(depNodeIdStr, nodeIdStr, { type: 'facts' })
|
|
60
66
|
}
|
|
@@ -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,13 +19,13 @@ 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
|
|
@@ -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,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
7
|
import { historyDagFromNodes } from '../history-dag.ts'
|
|
8
8
|
import type { HistoryDagNode } from '../history-dag-common.ts'
|
|
9
9
|
import { rootEventNode } from '../history-dag-common.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
|
})
|
|
@@ -140,11 +140,11 @@ 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
|
isClient: eventDef.options.clientOnly,
|
|
150
150
|
}).seqNum
|
|
@@ -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
|
})
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Effect, KeyValueStore, Option } from '@livestore/utils/effect'
|
|
2
|
+
import { UnknownError } from '../errors.ts'
|
|
3
|
+
|
|
4
|
+
export const makeBackendIdHelper = Effect.gen(function* () {
|
|
5
|
+
const kv = yield* KeyValueStore.KeyValueStore
|
|
6
|
+
|
|
7
|
+
const backendIdKey = `backendId`
|
|
8
|
+
const backendIdRef = { current: yield* kv.get(backendIdKey).pipe(UnknownError.mapToUnknownError) }
|
|
9
|
+
|
|
10
|
+
const setBackendId = (backendId: string) =>
|
|
11
|
+
Effect.gen(function* () {
|
|
12
|
+
if (backendIdRef.current._tag === 'None' || backendIdRef.current.value !== backendId) {
|
|
13
|
+
backendIdRef.current = Option.some(backendId)
|
|
14
|
+
yield* kv.set(backendIdKey, backendId)
|
|
15
|
+
}
|
|
16
|
+
}).pipe(UnknownError.mapToUnknownError)
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
lazySet: setBackendId,
|
|
20
|
+
get: () => backendIdRef.current,
|
|
21
|
+
}
|
|
22
|
+
})
|