@livestore/common 0.3.0-dev.3 → 0.3.0-dev.31
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 +128 -68
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +36 -7
- 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 +389 -0
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-client-session.js +96 -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 -592
- package/dist/devtools/devtools-messages.d.ts.map +1 -1
- package/dist/devtools/devtools-messages.js +3 -171
- package/dist/devtools/devtools-messages.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +28 -0
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
- package/dist/devtools/devtools-sessioninfo.js +34 -0
- package/dist/devtools/devtools-sessioninfo.js.map +1 -0
- package/dist/devtools/mod.d.ts +39 -0
- package/dist/devtools/mod.d.ts.map +1 -0
- package/dist/devtools/mod.js +27 -0
- package/dist/devtools/mod.js.map +1 -0
- package/dist/index.d.ts +4 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -7
- 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 +589 -0
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
- package/dist/leader-thread/apply-event.d.ts +16 -0
- package/dist/leader-thread/apply-event.d.ts.map +1 -0
- package/dist/leader-thread/apply-event.js +103 -0
- package/dist/leader-thread/apply-event.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 +123 -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 +154 -132
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +26 -12
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +82 -47
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- 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 +35 -25
- 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 +86 -39
- 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/materializer-helper.d.ts +23 -0
- package/dist/materializer-helper.d.ts.map +1 -0
- package/dist/materializer-helper.js +70 -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/query-builder/api.d.ts +158 -55
- package/dist/query-builder/api.d.ts.map +1 -1
- package/dist/query-builder/api.js +3 -5
- package/dist/query-builder/api.js.map +1 -1
- package/dist/query-builder/astToSql.d.ts +7 -0
- package/dist/query-builder/astToSql.d.ts.map +1 -0
- package/dist/query-builder/astToSql.js +190 -0
- package/dist/query-builder/astToSql.js.map +1 -0
- package/dist/query-builder/impl.d.ts +3 -8
- package/dist/query-builder/impl.d.ts.map +1 -1
- package/dist/query-builder/impl.js +166 -124
- package/dist/query-builder/impl.js.map +1 -1
- package/dist/query-builder/impl.test.d.ts +86 -1
- package/dist/query-builder/impl.test.d.ts.map +1 -1
- package/dist/query-builder/impl.test.js +411 -69
- package/dist/query-builder/impl.test.js.map +1 -1
- package/dist/query-builder/mod.d.ts +7 -0
- package/dist/query-builder/mod.d.ts.map +1 -1
- package/dist/query-builder/mod.js +7 -0
- package/dist/query-builder/mod.js.map +1 -1
- package/dist/rehydrate-from-eventlog.d.ts +14 -0
- package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
- package/dist/rehydrate-from-eventlog.js +65 -0
- package/dist/rehydrate-from-eventlog.js.map +1 -0
- package/dist/schema/EventDef.d.ts +136 -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 +35 -15
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +57 -11
- 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/LiveStoreEvent.d.ts +255 -0
- package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent.js +118 -0
- package/dist/schema/LiveStoreEvent.js.map +1 -0
- package/dist/schema/client-document-def.d.ts +223 -0
- package/dist/schema/client-document-def.d.ts.map +1 -0
- package/dist/schema/client-document-def.js +170 -0
- package/dist/schema/client-document-def.js.map +1 -0
- package/dist/schema/client-document-def.test.d.ts +2 -0
- package/dist/schema/client-document-def.test.d.ts.map +1 -0
- package/dist/schema/client-document-def.test.js +201 -0
- package/dist/schema/client-document-def.test.js.map +1 -0
- package/dist/schema/db-schema/ast/sqlite.d.ts +69 -0
- package/dist/schema/db-schema/ast/sqlite.d.ts.map +1 -0
- package/dist/schema/db-schema/ast/sqlite.js +71 -0
- package/dist/schema/db-schema/ast/sqlite.js.map +1 -0
- package/dist/schema/db-schema/ast/validate.d.ts +3 -0
- package/dist/schema/db-schema/ast/validate.d.ts.map +1 -0
- package/dist/schema/db-schema/ast/validate.js +12 -0
- package/dist/schema/db-schema/ast/validate.js.map +1 -0
- package/dist/schema/db-schema/dsl/field-defs.d.ts +90 -0
- package/dist/schema/db-schema/dsl/field-defs.d.ts.map +1 -0
- package/dist/schema/db-schema/dsl/field-defs.js +87 -0
- package/dist/schema/db-schema/dsl/field-defs.js.map +1 -0
- package/dist/schema/db-schema/dsl/field-defs.test.d.ts +2 -0
- package/dist/schema/db-schema/dsl/field-defs.test.d.ts.map +1 -0
- package/dist/schema/db-schema/dsl/field-defs.test.js +29 -0
- package/dist/schema/db-schema/dsl/field-defs.test.js.map +1 -0
- package/dist/schema/db-schema/dsl/mod.d.ts +90 -0
- package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -0
- package/dist/schema/db-schema/dsl/mod.js +41 -0
- package/dist/schema/db-schema/dsl/mod.js.map +1 -0
- package/dist/schema/db-schema/hash.d.ts +2 -0
- package/dist/schema/db-schema/hash.d.ts.map +1 -0
- package/dist/schema/db-schema/hash.js +14 -0
- package/dist/schema/db-schema/hash.js.map +1 -0
- package/dist/schema/db-schema/mod.d.ts +3 -0
- package/dist/schema/db-schema/mod.d.ts.map +1 -0
- package/dist/schema/db-schema/mod.js +3 -0
- package/dist/schema/db-schema/mod.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 +5 -3
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +5 -3
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema-helpers.d.ts.map +1 -1
- package/dist/schema/schema-helpers.js +1 -1
- package/dist/schema/schema-helpers.js.map +1 -1
- package/dist/schema/schema.d.ts +30 -23
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +48 -35
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/sqlite-state.d.ts +12 -0
- package/dist/schema/sqlite-state.d.ts.map +1 -0
- package/dist/schema/sqlite-state.js +36 -0
- package/dist/schema/sqlite-state.js.map +1 -0
- package/dist/schema/system-tables.d.ts +179 -125
- package/dist/schema/system-tables.d.ts.map +1 -1
- package/dist/schema/system-tables.js +76 -41
- package/dist/schema/system-tables.js.map +1 -1
- package/dist/schema/table-def.d.ts +37 -109
- package/dist/schema/table-def.d.ts.map +1 -1
- package/dist/schema/table-def.js +23 -66
- package/dist/schema/table-def.js.map +1 -1
- package/dist/schema/view.d.ts +3 -0
- package/dist/schema/view.d.ts.map +1 -0
- package/dist/schema/view.js +3 -0
- package/dist/schema/view.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 +19 -14
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-mutation-defs.d.ts +3 -3
- package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
- package/dist/schema-management/validate-mutation-defs.js +17 -17
- package/dist/schema-management/validate-mutation-defs.js.map +1 -1
- 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/facts.d.ts +19 -19
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +3 -3
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +6 -7
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +4 -2
- 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 +2 -2
- 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 +11 -8
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +76 -76
- 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} +29 -29
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
- package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +67 -36
- 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 +55 -20
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +7 -3
- 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 +319 -120
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +295 -275
- 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 +2 -2
- 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 +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +6 -6
- package/src/__tests__/fixture.ts +36 -15
- package/src/adapter-types.ts +111 -74
- package/src/debug-info.ts +1 -0
- package/src/devtools/devtools-messages-client-session.ts +141 -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 -243
- package/src/devtools/devtools-sessioninfo.ts +99 -0
- package/src/devtools/mod.ts +36 -0
- package/src/index.ts +4 -13
- package/src/leader-thread/LeaderSyncProcessor.ts +935 -0
- package/src/leader-thread/apply-event.ts +173 -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 +212 -189
- package/src/leader-thread/make-leader-thread-layer.ts +143 -77
- package/src/leader-thread/mod.ts +1 -1
- package/src/leader-thread/recreate-db.ts +41 -30
- package/src/leader-thread/shutdown-channel.ts +2 -4
- package/src/leader-thread/types.ts +95 -51
- package/src/materializer-helper.ts +110 -0
- package/src/otel.ts +8 -0
- package/src/query-builder/api.ts +236 -85
- package/src/query-builder/astToSql.ts +232 -0
- package/src/query-builder/impl.test.ts +447 -78
- package/src/query-builder/impl.ts +209 -144
- package/src/query-builder/mod.ts +7 -0
- package/src/rehydrate-from-eventlog.ts +114 -0
- package/src/schema/EventDef.ts +216 -0
- package/src/schema/EventId.test.ts +12 -0
- package/src/schema/EventId.ts +75 -15
- package/src/schema/LiveStoreEvent.ts +239 -0
- package/src/schema/client-document-def.test.ts +239 -0
- package/src/schema/client-document-def.ts +444 -0
- package/src/schema/db-schema/ast/sqlite.ts +142 -0
- package/src/schema/db-schema/ast/validate.ts +13 -0
- package/src/schema/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
- package/src/schema/db-schema/dsl/field-defs.test.ts +35 -0
- package/src/schema/db-schema/dsl/field-defs.ts +242 -0
- package/src/schema/db-schema/dsl/mod.ts +222 -0
- package/src/schema/db-schema/hash.ts +14 -0
- package/src/schema/db-schema/mod.ts +2 -0
- package/src/schema/events.ts +1 -0
- package/src/schema/mod.ts +5 -3
- package/src/schema/schema-helpers.ts +1 -1
- package/src/schema/schema.ts +84 -62
- package/src/schema/sqlite-state.ts +62 -0
- package/src/schema/system-tables.ts +68 -50
- package/src/schema/table-def.ts +68 -214
- package/src/schema/view.ts +2 -0
- package/src/schema-management/common.ts +7 -7
- package/src/schema-management/migrations.ts +27 -24
- package/src/schema-management/validate-mutation-defs.ts +22 -24
- 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/facts.ts +32 -33
- package/src/sync/next/history-dag-common.ts +9 -5
- package/src/sync/next/history-dag.ts +2 -2
- package/src/sync/next/rebase-events.ts +22 -16
- package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
- package/src/sync/next/test/compact-events.test.ts +78 -78
- package/src/sync/next/test/event-fixtures.ts +219 -0
- package/src/sync/next/test/mod.ts +1 -1
- package/src/sync/sync.ts +51 -19
- package/src/sync/syncstate.test.ts +335 -308
- package/src/sync/syncstate.ts +394 -212
- package/src/sync/validate-push-payload.ts +7 -4
- package/src/version.ts +1 -1
- package/tmp/pack.tgz +0 -0
- package/tsconfig.json +2 -1
- 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 -12
- 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/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 -422
- package/dist/leader-thread/leader-sync-processor.js.map +0 -1
- package/dist/leader-thread/mutationlog.d.ts +0 -23
- package/dist/leader-thread/mutationlog.d.ts.map +0 -1
- package/dist/leader-thread/mutationlog.js +0 -27
- 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-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 -191
- package/dist/schema/MutationEvent.d.ts.map +0 -1
- package/dist/schema/MutationEvent.js +0 -56
- 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/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 -13
- 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 -666
- package/src/leader-thread/mutationlog.ts +0 -42
- package/src/leader-thread/pull-queue-set.ts +0 -58
- package/src/mutation.ts +0 -81
- package/src/query-info.ts +0 -78
- package/src/rehydrate-from-mutationlog.ts +0 -127
- package/src/schema/MutationEvent.ts +0 -161
- package/src/schema/mutations.ts +0 -192
- package/src/sync/client-session-sync-processor.ts +0 -207
- package/src/sync/next/test/mutation-fixtures.ts +0 -231
@@ -2,22 +2,23 @@
|
|
2
2
|
import { describe, expect, it } from 'vitest'
|
3
3
|
|
4
4
|
import * as EventId from '../schema/EventId.js'
|
5
|
-
import * as
|
5
|
+
import * as LiveStoreEvent from '../schema/LiveStoreEvent.js'
|
6
6
|
import * as SyncState from './syncstate.js'
|
7
7
|
|
8
|
-
class TestEvent extends
|
8
|
+
class TestEvent extends LiveStoreEvent.EncodedWithMeta {
|
9
9
|
constructor(
|
10
|
-
|
11
|
-
|
10
|
+
id: EventId.EventId | typeof EventId.EventId.Encoded,
|
11
|
+
parentId: EventId.EventId,
|
12
12
|
public readonly payload: string,
|
13
13
|
public readonly isLocal: boolean,
|
14
14
|
) {
|
15
15
|
super({
|
16
|
-
id,
|
17
|
-
parentId,
|
18
|
-
|
16
|
+
id: EventId.make(id),
|
17
|
+
parentId: EventId.make(parentId),
|
18
|
+
name: 'a',
|
19
19
|
args: payload,
|
20
|
-
|
20
|
+
clientId: 'static-local-id',
|
21
|
+
sessionId: 'static-session-id',
|
21
22
|
})
|
22
23
|
}
|
23
24
|
|
@@ -26,411 +27,431 @@ class TestEvent extends MutationEvent.EncodedWithMeta {
|
|
26
27
|
}
|
27
28
|
|
28
29
|
// Only used for Vitest printing
|
29
|
-
// toJSON = () => `(${this.id.global},${this.id.
|
30
|
+
// toJSON = () => `(${this.id.global},${this.id.client},${this.payload})`
|
30
31
|
// toString = () => this.toJSON()
|
31
32
|
}
|
32
33
|
|
33
|
-
const
|
34
|
-
const
|
35
|
-
const
|
36
|
-
const
|
37
|
-
const
|
38
|
-
const
|
39
|
-
const
|
34
|
+
const e0_1 = new TestEvent({ global: 0, client: 1 }, EventId.ROOT, 'a', true)
|
35
|
+
const e1_0 = new TestEvent({ global: 1, client: 0 }, EventId.ROOT, 'a', false)
|
36
|
+
const e1_1 = new TestEvent({ global: 1, client: 1 }, e1_0.id, 'a', true)
|
37
|
+
const e1_2 = new TestEvent({ global: 1, client: 2 }, e1_1.id, 'a', true)
|
38
|
+
const e1_3 = new TestEvent({ global: 1, client: 3 }, e1_2.id, 'a', true)
|
39
|
+
const e2_0 = new TestEvent({ global: 2, client: 0 }, e1_0.id, 'a', false)
|
40
|
+
const e2_1 = new TestEvent({ global: 2, client: 1 }, e2_0.id, 'a', true)
|
40
41
|
|
41
|
-
const isEqualEvent =
|
42
|
+
const isEqualEvent = LiveStoreEvent.isEqualEncoded
|
42
43
|
|
43
|
-
const
|
44
|
+
const isClientEvent = (event: LiveStoreEvent.EncodedWithMeta) => (event as TestEvent).isLocal
|
44
45
|
|
45
46
|
describe('syncstate', () => {
|
46
|
-
describe('
|
47
|
-
const
|
47
|
+
describe('merge', () => {
|
48
|
+
const merge = ({
|
48
49
|
syncState,
|
49
50
|
payload,
|
50
|
-
|
51
|
+
ignoreClientEvents = false,
|
51
52
|
}: {
|
52
53
|
syncState: SyncState.SyncState
|
53
54
|
payload: typeof SyncState.Payload.Type
|
54
|
-
|
55
|
-
}) => SyncState.
|
56
|
-
|
57
|
-
describe
|
58
|
-
'
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
_tag: 'upstream-rebase',
|
73
|
-
rollbackUntil: e_0_0.id,
|
74
|
-
newEvents: [e_0_0_e_1_0, e_0_1_e_1_1],
|
75
|
-
trimRollbackUntil: trimRollbackUntil ? e_0_1_e_1_1.id : undefined,
|
76
|
-
},
|
77
|
-
})
|
78
|
-
const e_1_0_e_2_0 = e_1_0.rebase_(e_0_0_e_1_0.id)
|
79
|
-
expectRebase(result)
|
80
|
-
expectEventArraysEqual(result.newSyncState.pending, [e_1_0_e_2_0])
|
81
|
-
if (trimRollbackUntil) {
|
82
|
-
expectEventArraysEqual(result.newSyncState.rollbackTail, [])
|
83
|
-
} else {
|
84
|
-
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0_e_1_0, e_0_1_e_1_1])
|
85
|
-
}
|
86
|
-
expect(result.newSyncState.upstreamHead).toBe(e_0_1_e_1_1.id)
|
87
|
-
expect(result.newSyncState.localHead).toMatchObject(e_1_0_e_2_0.id)
|
88
|
-
expectEventArraysEqual(result.newEvents, [e_0_0_e_1_0, e_0_1_e_1_1])
|
89
|
-
expectEventArraysEqual(result.eventsToRollback, [e_0_0, e_0_1, e_1_0])
|
90
|
-
})
|
91
|
-
|
92
|
-
it('should rollback only to specified point', () => {
|
93
|
-
const syncState = {
|
94
|
-
pending: [e_1_0],
|
95
|
-
rollbackTail: [e_0_0, e_0_1],
|
96
|
-
upstreamHead: EventId.ROOT,
|
97
|
-
localHead: e_1_0.id,
|
98
|
-
}
|
99
|
-
const e_0_1_e_1_0 = e_0_1.rebase_(e_0_0.id)
|
100
|
-
const result = run({
|
101
|
-
syncState,
|
102
|
-
payload: {
|
103
|
-
_tag: 'upstream-rebase',
|
104
|
-
rollbackUntil: e_0_1.id,
|
105
|
-
newEvents: [e_0_1_e_1_0],
|
106
|
-
trimRollbackUntil: trimRollbackUntil ? e_0_0.id : undefined,
|
107
|
-
},
|
108
|
-
})
|
109
|
-
const e_1_0_e_2_0 = e_1_0.rebase_(e_0_1_e_1_0.id)
|
110
|
-
expectRebase(result)
|
111
|
-
expectEventArraysEqual(result.newSyncState.pending, [e_1_0_e_2_0])
|
112
|
-
if (trimRollbackUntil) {
|
113
|
-
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1_e_1_0])
|
114
|
-
} else {
|
115
|
-
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_0, e_0_1_e_1_0])
|
116
|
-
}
|
117
|
-
expect(result.newSyncState.upstreamHead).toBe(e_0_1_e_1_0.id)
|
118
|
-
expect(result.newSyncState.localHead).toMatchObject(e_1_0_e_2_0.id)
|
119
|
-
expectEventArraysEqual(result.newEvents, [e_0_1_e_1_0])
|
120
|
-
expectEventArraysEqual(result.eventsToRollback, [e_0_1, e_1_0])
|
121
|
-
})
|
122
|
-
|
123
|
-
it('should work for empty pending', () => {
|
124
|
-
const syncState = { pending: [], rollbackTail: [e_0_0], upstreamHead: EventId.ROOT, localHead: e_0_0.id }
|
125
|
-
const result = run({
|
126
|
-
syncState,
|
127
|
-
payload: { _tag: 'upstream-rebase', rollbackUntil: e_0_0.id, newEvents: [e_1_0] },
|
128
|
-
})
|
129
|
-
expectRebase(result)
|
130
|
-
expectEventArraysEqual(result.newSyncState.pending, [])
|
131
|
-
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_1_0])
|
132
|
-
expect(result.newSyncState.upstreamHead).toBe(e_1_0.id)
|
133
|
-
expect(result.newSyncState.localHead).toMatchObject(e_1_0.id)
|
134
|
-
expect(result.newEvents).toEqual([e_1_0])
|
135
|
-
})
|
136
|
-
|
137
|
-
it('should fail for empty rollback tail', () => {
|
138
|
-
const syncState = { pending: [], rollbackTail: [], upstreamHead: EventId.ROOT, localHead: e_0_0.id }
|
139
|
-
expect(() =>
|
140
|
-
run({
|
141
|
-
syncState,
|
142
|
-
payload: { _tag: 'upstream-rebase', rollbackUntil: e_0_0.id, newEvents: [e_1_0] },
|
143
|
-
}),
|
144
|
-
).toThrow()
|
55
|
+
ignoreClientEvents?: boolean
|
56
|
+
}) => SyncState.merge({ syncState, payload, isClientEvent, isEqualEvent, ignoreClientEvents })
|
57
|
+
|
58
|
+
describe('upstream-rebase', () => {
|
59
|
+
it('should rollback until start', () => {
|
60
|
+
const syncState = new SyncState.SyncState({
|
61
|
+
pending: [e2_0],
|
62
|
+
upstreamHead: EventId.ROOT,
|
63
|
+
localHead: e2_0.id,
|
64
|
+
})
|
65
|
+
const e1_0_e2_0 = e1_0.rebase_(e2_0.id)
|
66
|
+
const e1_1_e2_1 = e1_1.rebase_(e1_0_e2_0.id)
|
67
|
+
const result = merge({
|
68
|
+
syncState,
|
69
|
+
payload: SyncState.PayloadUpstreamRebase.make({
|
70
|
+
rollbackEvents: [e1_0, e1_1],
|
71
|
+
newEvents: [e1_0_e2_0, e1_1_e2_1],
|
72
|
+
}),
|
145
73
|
})
|
74
|
+
const e2_0_e3_0 = e2_0.rebase_(e1_0_e2_0.id)
|
75
|
+
expectRebase(result)
|
76
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0])
|
77
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_1.id)
|
78
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.id)
|
79
|
+
expectEventArraysEqual(result.newEvents, [e1_0_e2_0, e1_1_e2_1, e2_0_e3_0])
|
80
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1, e2_0])
|
81
|
+
})
|
146
82
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
83
|
+
it('should rollback only to specified point', () => {
|
84
|
+
const syncState = new SyncState.SyncState({
|
85
|
+
pending: [e2_0],
|
86
|
+
upstreamHead: EventId.ROOT,
|
87
|
+
localHead: e2_0.id,
|
88
|
+
})
|
89
|
+
const e1_1_e2_0 = e1_1.rebase_(e1_0.id)
|
90
|
+
const result = merge({
|
91
|
+
syncState,
|
92
|
+
payload: SyncState.PayloadUpstreamRebase.make({
|
93
|
+
newEvents: [e1_1_e2_0],
|
94
|
+
rollbackEvents: [e1_1],
|
95
|
+
}),
|
159
96
|
})
|
160
|
-
|
161
|
-
|
97
|
+
const e2_0_e3_0 = e2_0.rebase_(e1_1_e2_0.id)
|
98
|
+
expectRebase(result)
|
99
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0])
|
100
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1_e2_0.id)
|
101
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.id)
|
102
|
+
expectEventArraysEqual(result.newEvents, [e1_1_e2_0, e2_0_e3_0])
|
103
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_1, e2_0])
|
104
|
+
})
|
105
|
+
|
106
|
+
it('should work for empty pending', () => {
|
107
|
+
const syncState = new SyncState.SyncState({
|
108
|
+
pending: [],
|
109
|
+
upstreamHead: EventId.ROOT,
|
110
|
+
localHead: e1_0.id,
|
111
|
+
})
|
112
|
+
const result = merge({
|
113
|
+
syncState,
|
114
|
+
payload: SyncState.PayloadUpstreamRebase.make({ rollbackEvents: [e1_0], newEvents: [e2_0] }),
|
115
|
+
})
|
116
|
+
expectRebase(result)
|
117
|
+
expectEventArraysEqual(result.newSyncState.pending, [])
|
118
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id)
|
119
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.id)
|
120
|
+
expect(result.newEvents).toStrictEqual([e2_0])
|
121
|
+
})
|
122
|
+
})
|
162
123
|
|
163
124
|
describe('upstream-advance: advance', () => {
|
164
|
-
it('should throw error if newEvents are not sorted in ascending order by eventId (
|
165
|
-
const syncState =
|
166
|
-
|
125
|
+
it('should throw error if newEvents are not sorted in ascending order by eventId (client)', () => {
|
126
|
+
const syncState = new SyncState.SyncState({
|
127
|
+
pending: [e1_0],
|
128
|
+
upstreamHead: EventId.ROOT,
|
129
|
+
localHead: e1_0.id,
|
130
|
+
})
|
131
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_0] } })
|
132
|
+
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
167
133
|
})
|
168
134
|
|
169
135
|
it('should throw error if newEvents are not sorted in ascending order by eventId (global)', () => {
|
170
|
-
const syncState =
|
171
|
-
|
136
|
+
const syncState = new SyncState.SyncState({
|
137
|
+
pending: [e1_0],
|
138
|
+
upstreamHead: EventId.ROOT,
|
139
|
+
localHead: e1_0.id,
|
140
|
+
})
|
141
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0, e1_0] } })
|
142
|
+
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
143
|
+
})
|
144
|
+
|
145
|
+
it('should throw error if incoming event is < expected upstream head', () => {
|
146
|
+
const syncState = new SyncState.SyncState({
|
147
|
+
pending: [],
|
148
|
+
upstreamHead: e2_0.id,
|
149
|
+
localHead: e2_0.id,
|
150
|
+
})
|
151
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
|
152
|
+
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
153
|
+
})
|
154
|
+
|
155
|
+
it('should throw error if incoming event is = expected upstream head', () => {
|
156
|
+
const syncState = new SyncState.SyncState({
|
157
|
+
pending: [],
|
158
|
+
upstreamHead: e2_0.id,
|
159
|
+
localHead: e2_0.id,
|
160
|
+
})
|
161
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e2_0] } })
|
162
|
+
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
172
163
|
})
|
173
164
|
|
174
|
-
it('should
|
175
|
-
const syncState =
|
176
|
-
|
165
|
+
it('should confirm pending event when receiving matching event', () => {
|
166
|
+
const syncState = new SyncState.SyncState({
|
167
|
+
pending: [e1_0],
|
168
|
+
upstreamHead: EventId.ROOT,
|
169
|
+
localHead: e1_0.id,
|
170
|
+
})
|
171
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
|
177
172
|
|
178
173
|
expectAdvance(result)
|
179
174
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
180
|
-
|
181
|
-
expect(result.newSyncState.
|
182
|
-
|
183
|
-
|
175
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id)
|
176
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0.id)
|
177
|
+
expectEventArraysEqual(result.newEvents, [])
|
178
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_0])
|
184
179
|
})
|
185
180
|
|
186
|
-
it('should
|
187
|
-
const syncState = {
|
188
|
-
pending: [
|
189
|
-
rollbackTail: [],
|
181
|
+
it('should confirm partial pending event when receiving matching event', () => {
|
182
|
+
const syncState = new SyncState.SyncState({
|
183
|
+
pending: [e1_0, e2_0],
|
190
184
|
upstreamHead: EventId.ROOT,
|
191
|
-
localHead:
|
192
|
-
}
|
193
|
-
const result =
|
185
|
+
localHead: e2_0.id,
|
186
|
+
})
|
187
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
|
194
188
|
|
195
189
|
expectAdvance(result)
|
196
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
197
|
-
|
198
|
-
expect(result.newSyncState.
|
199
|
-
|
200
|
-
|
190
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0])
|
191
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id)
|
192
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.id)
|
193
|
+
expectEventArraysEqual(result.newEvents, [])
|
194
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_0])
|
201
195
|
})
|
202
196
|
|
203
|
-
it('should
|
204
|
-
const syncState =
|
205
|
-
|
197
|
+
it('should confirm pending event and add new event', () => {
|
198
|
+
const syncState = new SyncState.SyncState({
|
199
|
+
pending: [e1_0],
|
200
|
+
upstreamHead: EventId.ROOT,
|
201
|
+
localHead: e1_0.id,
|
202
|
+
})
|
203
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0, e1_1] } })
|
206
204
|
|
207
205
|
expectAdvance(result)
|
208
206
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
209
|
-
|
210
|
-
expect(result.newSyncState.
|
211
|
-
expect(result.
|
212
|
-
|
207
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.id)
|
208
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1.id)
|
209
|
+
expect(result.newEvents).toStrictEqual([e1_1])
|
210
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_0])
|
213
211
|
})
|
214
212
|
|
215
|
-
it('should
|
216
|
-
const syncState =
|
217
|
-
|
213
|
+
it('should confirm pending event and add multiple new events', () => {
|
214
|
+
const syncState = new SyncState.SyncState({
|
215
|
+
pending: [e1_1],
|
216
|
+
upstreamHead: e1_0.id,
|
217
|
+
localHead: e1_1.id,
|
218
|
+
})
|
219
|
+
const result = merge({
|
218
220
|
syncState,
|
219
|
-
payload: { _tag: 'upstream-advance', newEvents: [
|
221
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_1, e1_2, e1_3, e2_0, e2_1] },
|
220
222
|
})
|
221
223
|
|
222
224
|
expectAdvance(result)
|
223
225
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
224
|
-
|
225
|
-
expect(result.newSyncState.
|
226
|
-
expect(result.
|
227
|
-
|
226
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_1.id)
|
227
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_1.id)
|
228
|
+
expect(result.newEvents).toStrictEqual([e1_2, e1_3, e2_0, e2_1])
|
229
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_1])
|
230
|
+
})
|
231
|
+
|
232
|
+
it('should confirm pending global event while keep pending client events', () => {
|
233
|
+
const syncState = new SyncState.SyncState({
|
234
|
+
pending: [e1_0, e1_1],
|
235
|
+
upstreamHead: EventId.ROOT,
|
236
|
+
localHead: e1_1.id,
|
237
|
+
})
|
238
|
+
const result = merge({
|
239
|
+
syncState,
|
240
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
|
241
|
+
})
|
242
|
+
|
243
|
+
expectAdvance(result)
|
244
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_1])
|
245
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id)
|
246
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1.id)
|
247
|
+
expectEventArraysEqual(result.newEvents, [])
|
248
|
+
expectEventArraysEqual(result.confirmedEvents, [e1_0])
|
228
249
|
})
|
229
250
|
|
230
|
-
it('should ignore
|
231
|
-
const syncState = {
|
232
|
-
pending: [
|
233
|
-
rollbackTail: [],
|
251
|
+
it('should ignore client events (incoming is subset of pending)', () => {
|
252
|
+
const syncState = new SyncState.SyncState({
|
253
|
+
pending: [e0_1, e1_0],
|
234
254
|
upstreamHead: EventId.ROOT,
|
235
|
-
localHead:
|
236
|
-
}
|
237
|
-
const result =
|
255
|
+
localHead: e1_0.id,
|
256
|
+
})
|
257
|
+
const result = merge({
|
238
258
|
syncState,
|
239
|
-
payload: { _tag: 'upstream-advance', newEvents: [
|
240
|
-
|
259
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
|
260
|
+
ignoreClientEvents: true,
|
241
261
|
})
|
242
262
|
expectAdvance(result)
|
243
263
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
244
|
-
|
245
|
-
expect(result.newSyncState.
|
246
|
-
|
247
|
-
|
264
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id)
|
265
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0.id)
|
266
|
+
expectEventArraysEqual(result.newEvents, [])
|
267
|
+
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0])
|
248
268
|
})
|
249
269
|
|
250
|
-
it('should ignore
|
251
|
-
const syncState = {
|
252
|
-
pending: [
|
253
|
-
rollbackTail: [],
|
270
|
+
it('should ignore client events (incoming is subset of pending case 2)', () => {
|
271
|
+
const syncState = new SyncState.SyncState({
|
272
|
+
pending: [e0_1, e1_0, e2_0],
|
254
273
|
upstreamHead: EventId.ROOT,
|
255
|
-
localHead:
|
256
|
-
}
|
257
|
-
const result =
|
274
|
+
localHead: e1_0.id,
|
275
|
+
})
|
276
|
+
const result = merge({
|
258
277
|
syncState,
|
259
|
-
payload: { _tag: 'upstream-advance', newEvents: [
|
260
|
-
|
278
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0] },
|
279
|
+
ignoreClientEvents: true,
|
261
280
|
})
|
262
281
|
expectAdvance(result)
|
263
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
264
|
-
|
265
|
-
expect(result.newSyncState.
|
266
|
-
|
267
|
-
|
282
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0])
|
283
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_0.id)
|
284
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.id)
|
285
|
+
expectEventArraysEqual(result.newEvents, [])
|
286
|
+
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0])
|
268
287
|
})
|
269
288
|
|
270
|
-
it('should ignore
|
271
|
-
const syncState = {
|
272
|
-
pending: [
|
273
|
-
rollbackTail: [],
|
289
|
+
it('should ignore client events (incoming goes beyond pending)', () => {
|
290
|
+
const syncState = new SyncState.SyncState({
|
291
|
+
pending: [e0_1, e1_0, e1_1],
|
274
292
|
upstreamHead: EventId.ROOT,
|
275
|
-
localHead:
|
276
|
-
}
|
277
|
-
const result =
|
293
|
+
localHead: e1_1.id,
|
294
|
+
})
|
295
|
+
const result = merge({
|
278
296
|
syncState,
|
279
|
-
payload: { _tag: 'upstream-advance', newEvents: [
|
280
|
-
|
297
|
+
payload: { _tag: 'upstream-advance', newEvents: [e1_0, e2_0] },
|
298
|
+
ignoreClientEvents: true,
|
281
299
|
})
|
282
300
|
|
283
301
|
expectAdvance(result)
|
284
302
|
expectEventArraysEqual(result.newSyncState.pending, [])
|
285
|
-
|
286
|
-
expect(result.newSyncState.
|
287
|
-
expect(result.
|
288
|
-
|
303
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id)
|
304
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0.id)
|
305
|
+
expect(result.newEvents).toStrictEqual([e2_0])
|
306
|
+
expectEventArraysEqual(result.confirmedEvents, [e0_1, e1_0, e1_1])
|
289
307
|
})
|
290
|
-
})
|
291
308
|
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
expectEventArraysEqual(result.newSyncState.pending, [e_0_0_e_0_2])
|
301
|
-
expectEventArraysEqual(result.newSyncState.rollbackTail, [e_0_1])
|
302
|
-
expect(result.newSyncState.upstreamHead).toBe(e_0_1.id)
|
303
|
-
expect(result.newSyncState.localHead).toMatchObject(e_0_0_e_0_2.id)
|
304
|
-
expectEventArraysEqual(result.eventsToRollback, [e_0_0])
|
305
|
-
expectEventArraysEqual(result.newEvents, [e_0_1, e_0_0_e_0_2])
|
309
|
+
it('should fail if incoming event is ≤ local head', () => {
|
310
|
+
const syncState = new SyncState.SyncState({
|
311
|
+
pending: [],
|
312
|
+
upstreamHead: e2_0.id,
|
313
|
+
localHead: e2_0.id,
|
314
|
+
})
|
315
|
+
const result = merge({ syncState, payload: { _tag: 'upstream-advance', newEvents: [e1_0] } })
|
316
|
+
expect(result).toMatchObject({ _tag: 'unexpected-error' })
|
306
317
|
})
|
318
|
+
})
|
307
319
|
|
308
|
-
|
309
|
-
|
310
|
-
const syncState =
|
311
|
-
|
320
|
+
describe('upstream-advance: rebase', () => {
|
321
|
+
it('should rebase single client event to end', () => {
|
322
|
+
const syncState = new SyncState.SyncState({
|
323
|
+
pending: [e1_0],
|
324
|
+
upstreamHead: EventId.ROOT,
|
325
|
+
localHead: e1_0.id,
|
326
|
+
})
|
327
|
+
const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1] }) })
|
312
328
|
|
313
|
-
const
|
329
|
+
const e1_0_e1_2 = e1_0.rebase_(e1_1.id)
|
314
330
|
|
315
331
|
expectRebase(result)
|
316
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
317
|
-
|
318
|
-
|
319
|
-
expectEventArraysEqual(result.
|
320
|
-
|
321
|
-
expect(result.newSyncState.localHead).toMatchObject(e_0_0_e_1_0.id)
|
332
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e1_2])
|
333
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e1_1.id)
|
334
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0_e1_2.id)
|
335
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_0])
|
336
|
+
expectEventArraysEqual(result.newEvents, [e1_1, e1_0_e1_2])
|
322
337
|
})
|
323
338
|
|
324
339
|
it('should rebase different event with same id', () => {
|
325
|
-
const
|
326
|
-
const syncState = {
|
327
|
-
pending: [
|
328
|
-
rollbackTail: [e_0_0, e_0_1],
|
340
|
+
const e2_0_b = new TestEvent({ global: 1, client: 0 }, e1_0.id, '1_0_b', false)
|
341
|
+
const syncState = new SyncState.SyncState({
|
342
|
+
pending: [e2_0_b],
|
329
343
|
upstreamHead: EventId.ROOT,
|
330
|
-
localHead:
|
331
|
-
}
|
332
|
-
const result =
|
333
|
-
const
|
344
|
+
localHead: e2_0_b.id,
|
345
|
+
})
|
346
|
+
const result = merge({ syncState, payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e2_0] }) })
|
347
|
+
const e2_0_e3_0 = e2_0_b.rebase_(e2_0.id)
|
334
348
|
|
335
349
|
expectRebase(result)
|
336
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
337
|
-
expectEventArraysEqual(result.
|
338
|
-
expectEventArraysEqual(result.
|
339
|
-
|
340
|
-
expect(result.newSyncState.
|
341
|
-
expect(result.newSyncState.localHead).toMatchObject(e_1_0_e_2_0.id)
|
350
|
+
expectEventArraysEqual(result.newSyncState.pending, [e2_0_e3_0])
|
351
|
+
expectEventArraysEqual(result.newEvents, [e2_0, e2_0_e3_0])
|
352
|
+
expectEventArraysEqual(result.rollbackEvents, [e2_0_b])
|
353
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id)
|
354
|
+
expect(result.newSyncState.localHead).toMatchObject(e2_0_e3_0.id)
|
342
355
|
})
|
343
356
|
|
344
|
-
it('should rebase single
|
345
|
-
const syncState =
|
346
|
-
|
357
|
+
it('should rebase single client event to end (more incoming events)', () => {
|
358
|
+
const syncState = new SyncState.SyncState({
|
359
|
+
pending: [e1_0],
|
360
|
+
upstreamHead: EventId.ROOT,
|
361
|
+
localHead: e1_0.id,
|
362
|
+
})
|
363
|
+
const result = merge({
|
347
364
|
syncState,
|
348
|
-
payload: {
|
365
|
+
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
|
349
366
|
})
|
350
367
|
|
351
|
-
const
|
368
|
+
const e1_0_e3_0 = e1_0.rebase_(e2_0.id)
|
352
369
|
|
353
370
|
expectRebase(result)
|
354
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
355
|
-
|
356
|
-
expect(result.newSyncState.
|
357
|
-
expect(result.newSyncState.localHead).toMatchObject(e_0_0_e_2_0.id)
|
371
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e3_0])
|
372
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id)
|
373
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_0_e3_0.id)
|
358
374
|
})
|
359
375
|
|
360
376
|
it('should only rebase divergent events when first event matches', () => {
|
361
|
-
const syncState = {
|
362
|
-
pending: [
|
363
|
-
rollbackTail: [],
|
377
|
+
const syncState = new SyncState.SyncState({
|
378
|
+
pending: [e1_0, e1_1],
|
364
379
|
upstreamHead: EventId.ROOT,
|
365
|
-
localHead:
|
366
|
-
}
|
367
|
-
const result =
|
380
|
+
localHead: e1_0.id,
|
381
|
+
})
|
382
|
+
const result = merge({
|
368
383
|
syncState,
|
369
|
-
payload: {
|
384
|
+
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_0, e1_2, e1_3, e2_0] }),
|
370
385
|
})
|
371
386
|
|
372
|
-
const
|
387
|
+
const e1_1_e2_1 = e1_1.rebase_(e2_0.id)
|
373
388
|
|
374
389
|
expectRebase(result)
|
375
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
376
|
-
expectEventArraysEqual(result.
|
377
|
-
expectEventArraysEqual(result.
|
378
|
-
|
379
|
-
expect(result.newSyncState.
|
380
|
-
expect(result.newSyncState.localHead).toMatchObject(e_0_1_e_1_1.id)
|
390
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_1_e2_1])
|
391
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_1])
|
392
|
+
expectEventArraysEqual(result.newEvents, [e1_2, e1_3, e2_0, e1_1_e2_1])
|
393
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id)
|
394
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_1.id)
|
381
395
|
})
|
382
396
|
|
383
|
-
it('should rebase all
|
384
|
-
const syncState = {
|
385
|
-
pending: [
|
386
|
-
rollbackTail: [],
|
397
|
+
it('should rebase all client events when incoming chain starts differently', () => {
|
398
|
+
const syncState = new SyncState.SyncState({
|
399
|
+
pending: [e1_0, e1_1],
|
387
400
|
upstreamHead: EventId.ROOT,
|
388
|
-
localHead:
|
389
|
-
}
|
390
|
-
const result =
|
401
|
+
localHead: e1_1.id,
|
402
|
+
})
|
403
|
+
const result = merge({
|
391
404
|
syncState,
|
392
|
-
payload: {
|
405
|
+
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents: [e1_1, e1_2, e1_3, e2_0] }),
|
393
406
|
})
|
394
407
|
|
395
|
-
const
|
396
|
-
const
|
408
|
+
const e1_0_e2_1 = e1_0.rebase_(e2_0.id)
|
409
|
+
const e1_1_e2_2 = e1_1.rebase_(e1_0_e2_1.id)
|
397
410
|
|
398
411
|
expectRebase(result)
|
399
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
400
|
-
expectEventArraysEqual(result.
|
401
|
-
expectEventArraysEqual(result.
|
402
|
-
|
403
|
-
expect(result.newSyncState.
|
404
|
-
expect(result.newSyncState.localHead).toMatchObject(e_0_1_e_1_2.id)
|
412
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0_e2_1, e1_1_e2_2])
|
413
|
+
expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3, e2_0, e1_0_e2_1, e1_1_e2_2])
|
414
|
+
expectEventArraysEqual(result.rollbackEvents, [e1_0, e1_1])
|
415
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(e2_0.id)
|
416
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_1_e2_2.id)
|
405
417
|
})
|
406
418
|
|
407
419
|
describe('local-push', () => {
|
408
420
|
describe('advance', () => {
|
409
421
|
it('should advance with new events', () => {
|
410
|
-
const syncState =
|
411
|
-
|
422
|
+
const syncState = new SyncState.SyncState({
|
423
|
+
pending: [e1_0],
|
424
|
+
upstreamHead: EventId.ROOT,
|
425
|
+
localHead: e1_0.id,
|
426
|
+
})
|
427
|
+
const result = merge({
|
428
|
+
syncState,
|
429
|
+
payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2, e1_3] }),
|
430
|
+
})
|
412
431
|
|
413
432
|
expectAdvance(result)
|
414
|
-
expectEventArraysEqual(result.newSyncState.pending, [
|
415
|
-
|
416
|
-
expect(result.newSyncState.
|
417
|
-
|
418
|
-
expectEventArraysEqual(result.
|
433
|
+
expectEventArraysEqual(result.newSyncState.pending, [e1_0, e1_1, e1_2, e1_3])
|
434
|
+
expect(result.newSyncState.upstreamHead).toMatchObject(EventId.ROOT)
|
435
|
+
expect(result.newSyncState.localHead).toMatchObject(e1_3.id)
|
436
|
+
expectEventArraysEqual(result.newEvents, [e1_1, e1_2, e1_3])
|
437
|
+
expectEventArraysEqual(result.confirmedEvents, [])
|
419
438
|
})
|
420
439
|
})
|
421
440
|
|
422
441
|
describe('reject', () => {
|
423
442
|
it('should reject when new events are greater than pending events', () => {
|
424
|
-
const syncState = {
|
425
|
-
pending: [
|
426
|
-
rollbackTail: [],
|
443
|
+
const syncState = new SyncState.SyncState({
|
444
|
+
pending: [e1_0, e1_1],
|
427
445
|
upstreamHead: EventId.ROOT,
|
428
|
-
localHead:
|
429
|
-
}
|
430
|
-
const result =
|
446
|
+
localHead: e1_1.id,
|
447
|
+
})
|
448
|
+
const result = merge({
|
449
|
+
syncState,
|
450
|
+
payload: SyncState.PayloadLocalPush.make({ newEvents: [e1_1, e1_2] }),
|
451
|
+
})
|
431
452
|
|
432
453
|
expectReject(result)
|
433
|
-
expect(result.expectedMinimumId).toMatchObject(
|
454
|
+
expect(result.expectedMinimumId).toMatchObject(e1_2.id)
|
434
455
|
})
|
435
456
|
})
|
436
457
|
})
|
@@ -439,26 +460,32 @@ describe('syncstate', () => {
|
|
439
460
|
})
|
440
461
|
|
441
462
|
const expectEventArraysEqual = (
|
442
|
-
actual: ReadonlyArray<
|
443
|
-
expected: ReadonlyArray<
|
463
|
+
actual: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>,
|
464
|
+
expected: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>,
|
444
465
|
) => {
|
445
466
|
expect(actual.length).toBe(expected.length)
|
446
467
|
actual.forEach((event, i) => {
|
447
|
-
expect(event.id).
|
448
|
-
expect(event.parentId).
|
449
|
-
expect(event.
|
450
|
-
expect(event.args).
|
468
|
+
expect(event.id).toStrictEqual(expected[i]!.id)
|
469
|
+
expect(event.parentId).toStrictEqual(expected[i]!.parentId)
|
470
|
+
expect(event.name).toStrictEqual(expected[i]!.name)
|
471
|
+
expect(event.args).toStrictEqual(expected[i]!.args)
|
451
472
|
})
|
452
473
|
}
|
453
474
|
|
454
|
-
function expectAdvance(
|
475
|
+
function expectAdvance(
|
476
|
+
result: typeof SyncState.MergeResult.Type,
|
477
|
+
): asserts result is typeof SyncState.MergeResultAdvance.Type {
|
455
478
|
expect(result._tag).toBe('advance')
|
456
479
|
}
|
457
480
|
|
458
|
-
function expectRebase(
|
459
|
-
|
481
|
+
function expectRebase(
|
482
|
+
result: typeof SyncState.MergeResult.Type,
|
483
|
+
): asserts result is typeof SyncState.MergeResultRebase.Type {
|
484
|
+
expect(result._tag, `Expected rebase, got ${result}`).toBe('rebase')
|
460
485
|
}
|
461
486
|
|
462
|
-
function expectReject(
|
487
|
+
function expectReject(
|
488
|
+
result: typeof SyncState.MergeResult.Type,
|
489
|
+
): asserts result is typeof SyncState.MergeResultReject.Type {
|
463
490
|
expect(result._tag).toBe('reject')
|
464
491
|
}
|