@livestore/common 0.4.0-dev.21 → 0.4.0-dev.23
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 +16 -9
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
- package/dist/WorkerTransportError.d.ts +11 -0
- package/dist/WorkerTransportError.d.ts.map +1 -0
- package/dist/WorkerTransportError.js +11 -0
- package/dist/WorkerTransportError.js.map +1 -0
- package/dist/adapter-types.d.ts +26 -3
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +27 -1
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/bounded-collections.js +6 -4
- package/dist/bounded-collections.js.map +1 -1
- package/dist/debug-info.js +4 -4
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +42 -22
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +12 -1
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +12 -6
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +8 -3
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +45 -25
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +12 -1
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/mod.js +1 -1
- package/dist/devtools/mod.js.map +1 -1
- package/dist/errors.d.ts +15 -15
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +11 -11
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +20 -6
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +283 -253
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/RejectedPushError.d.ts +107 -0
- package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
- package/dist/leader-thread/RejectedPushError.js +78 -0
- package/dist/leader-thread/RejectedPushError.js.map +1 -0
- package/dist/leader-thread/connection.js +1 -1
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +12 -11
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +34 -14
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +12 -5
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +12 -11
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.js +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -1
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +7 -4
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/recreate-db.js +1 -1
- 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/stream-events.d.ts.map +1 -1
- package/dist/leader-thread/stream-events.js +4 -3
- package/dist/leader-thread/stream-events.js.map +1 -1
- package/dist/leader-thread/types.d.ts +7 -6
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.js +4 -4
- package/dist/logging.js.map +1 -1
- package/dist/make-client-session.js +2 -2
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.js +6 -6
- package/dist/materializer-helper.js.map +1 -1
- package/dist/otel.d.ts +1 -1
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +2 -2
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +1 -1
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +11 -9
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +16 -2
- package/dist/schema/EventDef/define.d.ts.map +1 -1
- package/dist/schema/EventDef/define.js +5 -4
- package/dist/schema/EventDef/define.js.map +1 -1
- package/dist/schema/EventDef/deprecated.d.ts +99 -0
- package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
- package/dist/schema/EventDef/deprecated.js +144 -0
- package/dist/schema/EventDef/deprecated.js.map +1 -0
- package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
- package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
- package/dist/schema/EventDef/deprecated.test.js +95 -0
- package/dist/schema/EventDef/deprecated.test.js.map +1 -0
- package/dist/schema/EventDef/event-def.d.ts +4 -0
- package/dist/schema/EventDef/event-def.d.ts.map +1 -1
- package/dist/schema/EventDef/mod.d.ts +1 -0
- package/dist/schema/EventDef/mod.d.ts.map +1 -1
- package/dist/schema/EventDef/mod.js +1 -0
- package/dist/schema/EventDef/mod.js.map +1 -1
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
- package/dist/schema/EventSequenceNumber/client.js +11 -11
- package/dist/schema/EventSequenceNumber/client.js.map +1 -1
- package/dist/schema/EventSequenceNumber.test.js +1 -1
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.d.ts +6 -6
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/client.js +6 -3
- package/dist/schema/LiveStoreEvent/client.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
- package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/client.test.js +83 -0
- package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +7 -4
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +1 -0
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +34 -13
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +121 -2
- 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 +1 -1
- 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.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +36 -34
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +7 -6
- 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 +8 -8
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +2 -2
- 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 +2 -2
- 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 +11 -2
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +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 +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +3 -5
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/api.d.ts +37 -13
- 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 +77 -7
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +28 -14
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +112 -3
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +2 -2
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.d.ts +5 -3
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +1 -1
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +57 -4
- package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
- package/dist/schema/unknown-events.d.ts +1 -1
- package/dist/schema/unknown-events.d.ts.map +1 -1
- package/dist/schema/unknown-events.js +1 -1
- package/dist/schema/unknown-events.js.map +1 -1
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +1 -1
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -1
- package/dist/schema-management/common.js +2 -2
- package/dist/schema-management/common.js.map +1 -1
- package/dist/schema-management/migrations.js +1 -1
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/sql-queries/sql-queries.js +8 -6
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
- package/dist/sql-queries/sql-query-builder.js.map +1 -1
- package/dist/sqlite-db-helper.js +3 -3
- package/dist/sqlite-db-helper.js.map +1 -1
- package/dist/sqlite-types.d.ts +2 -2
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sqlite-types.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +8 -9
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +93 -107
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +0 -38
- package/dist/sync/errors.d.ts.map +1 -1
- package/dist/sync/errors.js +3 -20
- package/dist/sync/errors.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +5 -3
- package/dist/sync/mock-sync-backend.d.ts.map +1 -1
- package/dist/sync/mock-sync-backend.js +70 -68
- package/dist/sync/mock-sync-backend.js.map +1 -1
- package/dist/sync/next/compact-events.js +6 -6
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +6 -6
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +6 -6
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.js +3 -3
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.js +1 -1
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +2 -2
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +2 -2
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync-backend-kv.d.ts.map +1 -1
- package/dist/sync/sync-backend-kv.js.map +1 -1
- package/dist/sync/sync-backend.d.ts +3 -3
- package/dist/sync/sync-backend.d.ts.map +1 -1
- package/dist/sync/sync-backend.js +1 -1
- package/dist/sync/sync-backend.js.map +1 -1
- package/dist/sync/sync.d.ts +20 -0
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/syncstate.d.ts +4 -17
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +51 -74
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +112 -96
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/transport-chunking.js +3 -3
- package/dist/sync/transport-chunking.js.map +1 -1
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +4 -6
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/util.js +2 -2
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +7 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +8 -4
- package/dist/version.js.map +1 -1
- package/package.json +66 -12
- package/src/ClientSessionLeaderThreadProxy.ts +16 -9
- package/src/WorkerTransportError.ts +12 -0
- package/src/adapter-types.ts +39 -3
- package/src/bounded-collections.ts +6 -5
- package/src/debug-info.ts +4 -4
- package/src/devtools/devtools-messages-client-session.ts +12 -0
- package/src/devtools/devtools-messages-common.ts +8 -4
- package/src/devtools/devtools-messages-leader.ts +12 -0
- package/src/devtools/mod.ts +1 -1
- package/src/errors.ts +18 -17
- package/src/index.ts +2 -0
- package/src/leader-thread/LeaderSyncProcessor.ts +417 -347
- package/src/leader-thread/RejectedPushError.ts +106 -0
- package/src/leader-thread/connection.ts +1 -1
- package/src/leader-thread/eventlog.ts +16 -14
- package/src/leader-thread/leader-worker-devtools.ts +107 -66
- package/src/leader-thread/make-leader-thread-layer.test.ts +1 -1
- package/src/leader-thread/make-leader-thread-layer.ts +41 -31
- package/src/leader-thread/materialize-event.ts +8 -4
- package/src/leader-thread/recreate-db.ts +1 -1
- package/src/leader-thread/shutdown-channel.ts +2 -6
- package/src/leader-thread/stream-events.ts +10 -5
- package/src/leader-thread/types.ts +7 -6
- package/src/logging.ts +4 -4
- package/src/make-client-session.ts +2 -2
- package/src/materializer-helper.ts +9 -9
- package/src/otel.ts +3 -2
- package/src/rematerialize-from-eventlog.ts +60 -60
- package/src/schema/EventDef/define.ts +22 -6
- package/src/schema/EventDef/deprecated.test.ts +129 -0
- package/src/schema/EventDef/deprecated.ts +175 -0
- package/src/schema/EventDef/event-def.ts +5 -0
- package/src/schema/EventDef/mod.ts +1 -0
- package/src/schema/EventSequenceNumber/client.ts +11 -11
- package/src/schema/EventSequenceNumber.test.ts +2 -1
- package/src/schema/LiveStoreEvent/client.test.ts +97 -0
- package/src/schema/LiveStoreEvent/client.ts +6 -3
- package/src/schema/schema.ts +9 -4
- package/src/schema/state/sqlite/client-document-def.test.ts +142 -3
- package/src/schema/state/sqlite/client-document-def.ts +37 -14
- package/src/schema/state/sqlite/column-annotations.test.ts +2 -1
- package/src/schema/state/sqlite/column-annotations.ts +2 -1
- package/src/schema/state/sqlite/column-def.test.ts +8 -6
- package/src/schema/state/sqlite/column-def.ts +41 -36
- package/src/schema/state/sqlite/column-spec.test.ts +3 -1
- package/src/schema/state/sqlite/column-spec.ts +9 -8
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -2
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +2 -1
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +13 -4
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +3 -3
- package/src/schema/state/sqlite/mod.ts +4 -5
- package/src/schema/state/sqlite/query-builder/api.ts +37 -8
- package/src/schema/state/sqlite/query-builder/astToSql.ts +87 -7
- package/src/schema/state/sqlite/query-builder/impl.test.ts +145 -3
- package/src/schema/state/sqlite/query-builder/impl.ts +26 -12
- package/src/schema/state/sqlite/schema-helpers.ts +2 -2
- package/src/schema/state/sqlite/table-def.test.ts +67 -4
- package/src/schema/state/sqlite/table-def.ts +8 -15
- package/src/schema/unknown-events.ts +2 -2
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +3 -1
- package/src/schema-management/common.ts +2 -2
- package/src/schema-management/migrations.ts +1 -1
- package/src/sql-queries/sql-queries.ts +10 -6
- package/src/sql-queries/sql-query-builder.ts +1 -0
- package/src/sqlite-db-helper.ts +3 -3
- package/src/sqlite-types.ts +3 -2
- package/src/sync/ClientSessionSyncProcessor.ts +142 -133
- package/src/sync/errors.ts +10 -22
- package/src/sync/mock-sync-backend.ts +139 -97
- package/src/sync/next/compact-events.ts +5 -5
- package/src/sync/next/facts.ts +7 -6
- package/src/sync/next/history-dag-common.ts +9 -6
- package/src/sync/next/history-dag.ts +3 -3
- package/src/sync/next/rebase-events.ts +1 -1
- package/src/sync/next/test/compact-events.calculator.test.ts +3 -2
- package/src/sync/next/test/compact-events.test.ts +4 -3
- package/src/sync/next/test/event-fixtures.ts +2 -2
- package/src/sync/sync-backend-kv.ts +1 -0
- package/src/sync/sync-backend.ts +5 -4
- package/src/sync/sync.ts +21 -0
- package/src/sync/syncstate.test.ts +513 -435
- package/src/sync/syncstate.ts +80 -86
- package/src/sync/transport-chunking.ts +3 -3
- package/src/sync/validate-push-payload.ts +4 -6
- package/src/util.ts +2 -2
- package/src/version.ts +8 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
|
-
import { LS_DEV,
|
|
2
|
+
import { LS_DEV, TRACE_VERBOSE } from '@livestore/utils'
|
|
3
3
|
import {
|
|
4
4
|
BucketQueue,
|
|
5
5
|
Effect,
|
|
@@ -7,21 +7,23 @@ import {
|
|
|
7
7
|
FiberHandle,
|
|
8
8
|
Option,
|
|
9
9
|
Queue,
|
|
10
|
-
type Runtime,
|
|
11
10
|
Schema,
|
|
12
11
|
type Scope,
|
|
13
12
|
Stream,
|
|
14
13
|
Subscribable,
|
|
15
14
|
} from '@livestore/utils/effect'
|
|
16
|
-
import type * as otel from '@opentelemetry/api'
|
|
17
15
|
|
|
18
|
-
import {
|
|
16
|
+
import type { ClientSession } from '../adapter-types.ts'
|
|
19
17
|
import type { MaterializeError } from '../errors.ts'
|
|
18
|
+
import { isRejectedPushError } from '../leader-thread/RejectedPushError.ts'
|
|
20
19
|
import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts'
|
|
21
20
|
import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
|
|
22
21
|
import type { LiveStoreSchema } from '../schema/mod.ts'
|
|
23
22
|
import * as SyncState from './syncstate.ts'
|
|
24
23
|
|
|
24
|
+
/** Serialize value to JSON string for trace attributes */
|
|
25
|
+
const jsonStringify = Schema.encodeSync(Schema.parseJson())
|
|
26
|
+
|
|
25
27
|
/**
|
|
26
28
|
* Rebase behaviour:
|
|
27
29
|
* - We continously pull events from the leader and apply them to the local store.
|
|
@@ -37,20 +39,17 @@ import * as SyncState from './syncstate.ts'
|
|
|
37
39
|
* - The leader sync processor pulls regular LiveStore events, while the session sync processor pulls SyncState.PayloadUpstream items
|
|
38
40
|
* - The session sync processor has no downstream nodes.
|
|
39
41
|
*/
|
|
40
|
-
export const makeClientSessionSyncProcessor = ({
|
|
42
|
+
export const makeClientSessionSyncProcessor = Effect.fn('makeClientSessionSyncProcessor')(function* ({
|
|
41
43
|
schema,
|
|
42
44
|
clientSession,
|
|
43
|
-
runtime,
|
|
44
45
|
materializeEvent,
|
|
45
46
|
rollback,
|
|
46
47
|
refreshTables,
|
|
47
|
-
span,
|
|
48
48
|
params,
|
|
49
49
|
confirmUnsavedChanges,
|
|
50
50
|
}: {
|
|
51
51
|
schema: LiveStoreSchema
|
|
52
52
|
clientSession: ClientSession
|
|
53
|
-
runtime: Runtime.Runtime<Scope.Scope>
|
|
54
53
|
materializeEvent: (
|
|
55
54
|
eventEncoded: LiveStoreEvent.Client.EncodedWithMeta,
|
|
56
55
|
options: { withChangeset: boolean; materializerHashLeader: Option.Option<number> },
|
|
@@ -67,7 +66,6 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
67
66
|
>
|
|
68
67
|
rollback: (changeset: Uint8Array<ArrayBuffer>) => void
|
|
69
68
|
refreshTables: (tables: Set<string>) => void
|
|
70
|
-
span: otel.Span
|
|
71
69
|
params: {
|
|
72
70
|
leaderPushBatchSize: number
|
|
73
71
|
simulation?: ClientSessionSyncProcessorSimulationParams
|
|
@@ -77,7 +75,7 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
77
75
|
* If true, registers a beforeunload event listener to confirm unsaved changes.
|
|
78
76
|
*/
|
|
79
77
|
confirmUnsavedChanges: boolean
|
|
80
|
-
}): ClientSessionSyncProcessor
|
|
78
|
+
}): Effect.fn.Return<ClientSessionSyncProcessor> {
|
|
81
79
|
const eventSchema = LiveStoreEvent.Client.makeSchemaMemo(schema)
|
|
82
80
|
|
|
83
81
|
const simSleep = <TKey extends keyof ClientSessionSyncProcessorSimulationParams>(
|
|
@@ -96,100 +94,19 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
96
94
|
}
|
|
97
95
|
|
|
98
96
|
/** Only used for debugging / observability / testing, it's not relied upon for correctness of the sync processor. */
|
|
99
|
-
const syncStateUpdateQueue = Queue.unbounded<SyncState.SyncState>()
|
|
97
|
+
const syncStateUpdateQueue = yield* Queue.unbounded<SyncState.SyncState>()
|
|
100
98
|
const isClientEvent = (eventEncoded: LiveStoreEvent.Client.EncodedWithMeta) =>
|
|
101
99
|
schema.eventsDefsMap.get(eventEncoded.name)?.options.clientOnly ?? false
|
|
102
100
|
|
|
103
101
|
/** We're queuing push requests to reduce the number of messages sent to the leader by batching them */
|
|
104
|
-
const leaderPushQueue = BucketQueue.make<LiveStoreEvent.Client.EncodedWithMeta>()
|
|
105
|
-
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (eventDef === undefined) {
|
|
113
|
-
return shouldNeverHappen(`No event definition found for \`${name}\`.`)
|
|
114
|
-
}
|
|
115
|
-
const nextNumPair = EventSequenceNumber.Client.nextPair({
|
|
116
|
-
seqNum: baseEventSequenceNumber,
|
|
117
|
-
isClient: eventDef.options.clientOnly,
|
|
118
|
-
rebaseGeneration: baseEventSequenceNumber.rebaseGeneration,
|
|
119
|
-
})
|
|
120
|
-
baseEventSequenceNumber = nextNumPair.seqNum
|
|
121
|
-
return new LiveStoreEvent.Client.EncodedWithMeta(
|
|
122
|
-
Schema.encodeUnknownSync(eventSchema)({
|
|
123
|
-
name,
|
|
124
|
-
args,
|
|
125
|
-
...nextNumPair,
|
|
126
|
-
clientId: clientSession.clientId,
|
|
127
|
-
sessionId: clientSession.sessionId,
|
|
128
|
-
}),
|
|
129
|
-
)
|
|
130
|
-
})
|
|
131
|
-
|
|
132
|
-
const mergeResult = SyncState.merge({
|
|
133
|
-
syncState: syncStateRef.current,
|
|
134
|
-
payload: { _tag: 'local-push', newEvents: encodedEventDefs },
|
|
135
|
-
isClientEvent,
|
|
136
|
-
isEqualEvent: LiveStoreEvent.Client.isEqualEncoded,
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
yield* Effect.annotateCurrentSpan({
|
|
140
|
-
batchSize: encodedEventDefs.length,
|
|
141
|
-
mergeResultTag: mergeResult._tag,
|
|
142
|
-
eventCounts: encodedEventDefs.reduce<Record<string, number>>((acc, event) => {
|
|
143
|
-
acc[event.name] = (acc[event.name] ?? 0) + 1
|
|
144
|
-
return acc
|
|
145
|
-
}, {}),
|
|
146
|
-
...(TRACE_VERBOSE && { mergeResult: JSON.stringify(mergeResult) }),
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
if (mergeResult._tag === 'unknown-error') {
|
|
150
|
-
return shouldNeverHappen('Unknown error in client-session-sync-processor', mergeResult.message)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
if (mergeResult._tag !== 'advance') {
|
|
154
|
-
return shouldNeverHappen(`Expected advance, got ${mergeResult._tag}`)
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
syncStateRef.current = mergeResult.newSyncState
|
|
158
|
-
yield* syncStateUpdateQueue.offer(mergeResult.newSyncState)
|
|
159
|
-
|
|
160
|
-
// Materialize events to state
|
|
161
|
-
const writeTables = new Set<string>()
|
|
162
|
-
for (const event of mergeResult.newEvents) {
|
|
163
|
-
const {
|
|
164
|
-
writeTables: newWriteTables,
|
|
165
|
-
sessionChangeset,
|
|
166
|
-
materializerHash,
|
|
167
|
-
} = yield* materializeEvent(event, {
|
|
168
|
-
withChangeset: true,
|
|
169
|
-
materializerHashLeader: Option.none(),
|
|
170
|
-
})
|
|
171
|
-
for (const table of newWriteTables) {
|
|
172
|
-
writeTables.add(table)
|
|
173
|
-
}
|
|
174
|
-
event.meta.sessionChangeset = sessionChangeset
|
|
175
|
-
event.meta.materializerHashSession = materializerHash
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// Trigger push to leader
|
|
179
|
-
// console.debug('pushToLeader', encodedEventDefs.length, ...encodedEventDefs.map((_) => _.toJSON()))
|
|
180
|
-
yield* BucketQueue.offerAll(leaderPushQueue, encodedEventDefs)
|
|
181
|
-
|
|
182
|
-
return { writeTables }
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
const debugInfo = {
|
|
186
|
-
rebaseCount: 0,
|
|
187
|
-
advanceCount: 0,
|
|
188
|
-
rejectCount: 0,
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const boot: ClientSessionSyncProcessor['boot'] = Effect.gen(function* () {
|
|
192
|
-
if (confirmUnsavedChanges && typeof window !== 'undefined' && typeof window.addEventListener === 'function') {
|
|
102
|
+
const leaderPushQueue = yield* BucketQueue.make<LiveStoreEvent.Client.EncodedWithMeta>()
|
|
103
|
+
|
|
104
|
+
const boot: ClientSessionSyncProcessor['boot'] = Effect.fn('client-session-sync-processor:boot')(function* () {
|
|
105
|
+
if (
|
|
106
|
+
confirmUnsavedChanges === true &&
|
|
107
|
+
typeof window !== 'undefined' &&
|
|
108
|
+
typeof window.addEventListener === 'function'
|
|
109
|
+
) {
|
|
193
110
|
const onBeforeUnload = (event: BeforeUnloadEvent) => {
|
|
194
111
|
if (syncStateRef.current.pending.length > 0) {
|
|
195
112
|
// Trigger the default browser dialog
|
|
@@ -208,12 +125,17 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
208
125
|
const backgroundLeaderPushing = Effect.gen(function* () {
|
|
209
126
|
const batch = yield* BucketQueue.takeBetween(leaderPushQueue, 1, params.leaderPushBatchSize)
|
|
210
127
|
yield* clientSession.leaderThread.events.push(batch).pipe(
|
|
211
|
-
Effect.
|
|
128
|
+
Effect.catchIf(isRejectedPushError, () => {
|
|
212
129
|
debugInfo.rejectCount++
|
|
213
130
|
return BucketQueue.clear(leaderPushQueue)
|
|
214
131
|
}),
|
|
215
132
|
)
|
|
216
|
-
}).pipe(
|
|
133
|
+
}).pipe(
|
|
134
|
+
Effect.forever,
|
|
135
|
+
Effect.interruptible,
|
|
136
|
+
Effect.tapCauseLogPretty,
|
|
137
|
+
Effect.catchAllCause((cause) => clientSession.shutdown(Exit.failCause(cause))),
|
|
138
|
+
)
|
|
217
139
|
|
|
218
140
|
yield* FiberHandle.run(leaderPushingFiberHandle, backgroundLeaderPushing)
|
|
219
141
|
|
|
@@ -225,48 +147,47 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
225
147
|
Effect.gen(function* () {
|
|
226
148
|
// yield* Effect.logDebug('ClientSessionSyncProcessor:pull', payload)
|
|
227
149
|
|
|
228
|
-
if (clientSession.devtools.enabled) {
|
|
150
|
+
if (clientSession.devtools.enabled === true) {
|
|
229
151
|
yield* clientSession.devtools.pullLatch.await
|
|
230
152
|
}
|
|
231
153
|
|
|
232
|
-
const mergeResult = SyncState.merge({
|
|
154
|
+
const mergeResult = yield* SyncState.merge({
|
|
233
155
|
syncState: syncStateRef.current,
|
|
234
156
|
payload,
|
|
235
157
|
isClientEvent,
|
|
236
158
|
isEqualEvent: LiveStoreEvent.Client.isEqualEncoded,
|
|
237
|
-
})
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
}
|
|
159
|
+
}).pipe(
|
|
160
|
+
Effect.filterOrDieMessage(
|
|
161
|
+
(r) => r._tag !== 'reject',
|
|
162
|
+
'Unexpected reject in client-session-sync-processor',
|
|
163
|
+
),
|
|
164
|
+
)
|
|
244
165
|
|
|
245
166
|
syncStateRef.current = mergeResult.newSyncState
|
|
246
167
|
|
|
247
168
|
if (mergeResult._tag === 'rebase') {
|
|
248
|
-
|
|
169
|
+
yield* Effect.spanEvent('merge:pull:rebase', {
|
|
249
170
|
payloadTag: payload._tag,
|
|
250
|
-
|
|
171
|
+
...(TRACE_VERBOSE === true ? { payload: jsonStringify(payload) } : {}),
|
|
251
172
|
newEventsCount: mergeResult.newEvents.length,
|
|
252
173
|
rollbackCount: mergeResult.rollbackEvents.length,
|
|
253
|
-
|
|
174
|
+
...(TRACE_VERBOSE === true ? { res: jsonStringify(mergeResult) } : {}),
|
|
254
175
|
})
|
|
255
176
|
|
|
256
177
|
debugInfo.rebaseCount++
|
|
257
178
|
|
|
258
|
-
if (SIMULATION_ENABLED) yield* simSleep('pull', '1_before_leader_push_fiber_interrupt')
|
|
179
|
+
if (SIMULATION_ENABLED === true) yield* simSleep('pull', '1_before_leader_push_fiber_interrupt')
|
|
259
180
|
|
|
260
181
|
yield* FiberHandle.clear(leaderPushingFiberHandle)
|
|
261
182
|
|
|
262
|
-
if (SIMULATION_ENABLED) yield* simSleep('pull', '2_before_leader_push_queue_clear')
|
|
183
|
+
if (SIMULATION_ENABLED === true) yield* simSleep('pull', '2_before_leader_push_queue_clear')
|
|
263
184
|
|
|
264
185
|
// Reset the leader push queue since we're rebasing and will push again
|
|
265
186
|
yield* BucketQueue.clear(leaderPushQueue)
|
|
266
187
|
|
|
267
|
-
if (SIMULATION_ENABLED) yield* simSleep('pull', '3_before_rebase_rollback')
|
|
188
|
+
if (SIMULATION_ENABLED === true) yield* simSleep('pull', '3_before_rebase_rollback')
|
|
268
189
|
|
|
269
|
-
if (LS_DEV) {
|
|
190
|
+
if (LS_DEV === true) {
|
|
270
191
|
yield* Effect.logDebug(
|
|
271
192
|
'merge:pull:rebase: rollback',
|
|
272
193
|
mergeResult.rollbackEvents.length,
|
|
@@ -282,19 +203,19 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
282
203
|
}
|
|
283
204
|
}
|
|
284
205
|
|
|
285
|
-
if (SIMULATION_ENABLED) yield* simSleep('pull', '4_before_leader_push_queue_offer')
|
|
206
|
+
if (SIMULATION_ENABLED === true) yield* simSleep('pull', '4_before_leader_push_queue_offer')
|
|
286
207
|
|
|
287
208
|
yield* BucketQueue.offerAll(leaderPushQueue, mergeResult.newSyncState.pending)
|
|
288
209
|
|
|
289
|
-
if (SIMULATION_ENABLED) yield* simSleep('pull', '5_before_leader_push_fiber_run')
|
|
210
|
+
if (SIMULATION_ENABLED === true) yield* simSleep('pull', '5_before_leader_push_fiber_run')
|
|
290
211
|
|
|
291
212
|
yield* FiberHandle.run(leaderPushingFiberHandle, backgroundLeaderPushing)
|
|
292
213
|
} else {
|
|
293
|
-
|
|
214
|
+
yield* Effect.spanEvent('merge:pull:advance', {
|
|
294
215
|
payloadTag: payload._tag,
|
|
295
|
-
|
|
216
|
+
...(TRACE_VERBOSE === true ? { payload: jsonStringify(payload) } : {}),
|
|
296
217
|
newEventsCount: mergeResult.newEvents.length,
|
|
297
|
-
|
|
218
|
+
...(TRACE_VERBOSE === true ? { res: jsonStringify(mergeResult) } : {}),
|
|
298
219
|
})
|
|
299
220
|
|
|
300
221
|
debugInfo.advanceCount++
|
|
@@ -340,17 +261,99 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
340
261
|
Effect.tapCauseLogPretty,
|
|
341
262
|
Effect.forkScoped,
|
|
342
263
|
)
|
|
264
|
+
})()
|
|
265
|
+
|
|
266
|
+
const encodeEvents: ClientSessionSyncProcessor['encodeEvents'] = Effect.fn('client-session-sync-processor:encode-events')(function* (
|
|
267
|
+
events,
|
|
268
|
+
) {
|
|
269
|
+
let baseEventSequenceNumber = syncStateRef.current.localHead
|
|
270
|
+
return yield* Effect.forEach(events, ({ name, args }) =>
|
|
271
|
+
Effect.gen(function* () {
|
|
272
|
+
const eventDef = yield* Effect.fromNullable(schema.eventsDefsMap.get(name)).pipe(Effect.orDieDebugger)
|
|
273
|
+
const nextNumPair = EventSequenceNumber.Client.nextPair({
|
|
274
|
+
seqNum: baseEventSequenceNumber,
|
|
275
|
+
isClient: eventDef.options.clientOnly,
|
|
276
|
+
rebaseGeneration: baseEventSequenceNumber.rebaseGeneration,
|
|
277
|
+
})
|
|
278
|
+
baseEventSequenceNumber = nextNumPair.seqNum
|
|
279
|
+
return new LiveStoreEvent.Client.EncodedWithMeta(
|
|
280
|
+
Schema.encodeUnknownSync(eventSchema)({
|
|
281
|
+
name,
|
|
282
|
+
args,
|
|
283
|
+
...nextNumPair,
|
|
284
|
+
clientId: clientSession.clientId,
|
|
285
|
+
sessionId: clientSession.sessionId,
|
|
286
|
+
}),
|
|
287
|
+
)
|
|
288
|
+
}),
|
|
289
|
+
)
|
|
290
|
+
})
|
|
291
|
+
|
|
292
|
+
const materializeEvents: ClientSessionSyncProcessor['materializeEvents'] = Effect.fn('client-session-sync-processor:materialize-events')(function* (
|
|
293
|
+
events,
|
|
294
|
+
) {
|
|
295
|
+
const writeTables = new Set<string>()
|
|
296
|
+
for (const event of events) {
|
|
297
|
+
const {
|
|
298
|
+
writeTables: newWriteTables,
|
|
299
|
+
sessionChangeset,
|
|
300
|
+
materializerHash,
|
|
301
|
+
} = yield* materializeEvent(event, {
|
|
302
|
+
withChangeset: true,
|
|
303
|
+
materializerHashLeader: Option.none(),
|
|
304
|
+
})
|
|
305
|
+
for (const table of newWriteTables) {
|
|
306
|
+
writeTables.add(table)
|
|
307
|
+
}
|
|
308
|
+
event.meta.sessionChangeset = sessionChangeset
|
|
309
|
+
event.meta.materializerHashSession = materializerHash
|
|
310
|
+
}
|
|
311
|
+
return { writeTables }
|
|
343
312
|
})
|
|
344
313
|
|
|
314
|
+
const push: ClientSessionSyncProcessor['push'] = Effect.fn('client-session-sync-processor:push')(function* (
|
|
315
|
+
encodedEvents,
|
|
316
|
+
) {
|
|
317
|
+
const mergeResult = yield* SyncState.merge({
|
|
318
|
+
syncState: syncStateRef.current,
|
|
319
|
+
payload: { _tag: 'local-push', newEvents: encodedEvents },
|
|
320
|
+
isClientEvent,
|
|
321
|
+
isEqualEvent: LiveStoreEvent.Client.isEqualEncoded,
|
|
322
|
+
}).pipe(
|
|
323
|
+
Effect.filterOrDieMessage(
|
|
324
|
+
(r) => r._tag === 'advance',
|
|
325
|
+
'Expected advance from local-push merge',
|
|
326
|
+
),
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
yield* Effect.annotateCurrentSpan({
|
|
330
|
+
batchSize: encodedEvents.length,
|
|
331
|
+
mergeResultTag: mergeResult._tag,
|
|
332
|
+
eventCounts: encodedEvents.reduce<Record<string, number>>((acc, event) => {
|
|
333
|
+
acc[event.name] = (acc[event.name] ?? 0) + 1
|
|
334
|
+
return acc
|
|
335
|
+
}, {}),
|
|
336
|
+
...(TRACE_VERBOSE === true ? { mergeResult: jsonStringify(mergeResult) } : {}),
|
|
337
|
+
})
|
|
338
|
+
|
|
339
|
+
syncStateRef.current = mergeResult.newSyncState
|
|
340
|
+
yield* syncStateUpdateQueue.offer(mergeResult.newSyncState)
|
|
341
|
+
yield* BucketQueue.offerAll(leaderPushQueue, mergeResult.newEvents)
|
|
342
|
+
})
|
|
343
|
+
|
|
344
|
+
const debugInfo = {
|
|
345
|
+
rebaseCount: 0,
|
|
346
|
+
advanceCount: 0,
|
|
347
|
+
rejectCount: 0,
|
|
348
|
+
}
|
|
349
|
+
|
|
345
350
|
return {
|
|
346
|
-
push,
|
|
347
351
|
boot,
|
|
352
|
+
encodeEvents,
|
|
353
|
+
materializeEvents,
|
|
354
|
+
push,
|
|
348
355
|
syncState: Subscribable.make({
|
|
349
|
-
get: Effect.
|
|
350
|
-
const syncState = syncStateRef.current
|
|
351
|
-
if (syncStateRef === undefined) return shouldNeverHappen('Not initialized')
|
|
352
|
-
return syncState
|
|
353
|
-
}),
|
|
356
|
+
get: Effect.sync(() => syncStateRef.current),
|
|
354
357
|
changes: Stream.fromQueue(syncStateUpdateQueue),
|
|
355
358
|
}),
|
|
356
359
|
debug: {
|
|
@@ -365,17 +368,23 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
365
368
|
'pushQueueItems',
|
|
366
369
|
pushQueueItems.map((_) => _.toJSON()),
|
|
367
370
|
)
|
|
368
|
-
}).pipe(Effect.
|
|
371
|
+
}).pipe(Effect.runSync),
|
|
369
372
|
debugInfo: () => debugInfo,
|
|
370
373
|
},
|
|
371
374
|
} satisfies ClientSessionSyncProcessor
|
|
372
|
-
}
|
|
375
|
+
})
|
|
373
376
|
|
|
374
377
|
export interface ClientSessionSyncProcessor {
|
|
378
|
+
boot: Effect.Effect<void, never, Scope.Scope>
|
|
379
|
+
encodeEvents: (
|
|
380
|
+
events: ReadonlyArray<LiveStoreEvent.Input.Decoded>,
|
|
381
|
+
) => Effect.Effect<ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>>
|
|
375
382
|
push: (
|
|
376
|
-
|
|
383
|
+
events: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>,
|
|
384
|
+
) => Effect.Effect<void>
|
|
385
|
+
materializeEvents: (
|
|
386
|
+
events: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>,
|
|
377
387
|
) => Effect.Effect<{ writeTables: Set<string> }, MaterializeError>
|
|
378
|
-
boot: Effect.Effect<void, UnknownError, Scope.Scope>
|
|
379
388
|
/**
|
|
380
389
|
* Only used for debugging / observability.
|
|
381
390
|
*/
|
package/src/sync/errors.ts
CHANGED
|
@@ -1,38 +1,26 @@
|
|
|
1
1
|
import { Schema } from '@livestore/utils/effect'
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
import { EventSequenceNumber } from '../schema/mod.ts'
|
|
4
4
|
|
|
5
|
-
export class IsOfflineError extends Schema.TaggedError<IsOfflineError>(
|
|
5
|
+
export class IsOfflineError extends Schema.TaggedError<IsOfflineError>(
|
|
6
|
+
'~@livestore/common/IsOfflineError',
|
|
7
|
+
)('IsOfflineError', {
|
|
6
8
|
cause: Schema.Defect,
|
|
7
9
|
}) {}
|
|
8
10
|
|
|
9
11
|
/** Unique ID generated by the backend when its created. Used to check whether the backend identity has changed. */
|
|
10
12
|
export const BackendId = Schema.String.annotations({ title: '@livestore/sync-cf:BackendId' })
|
|
11
13
|
|
|
12
|
-
export class BackendIdMismatchError extends Schema.TaggedError<BackendIdMismatchError>(
|
|
14
|
+
export class BackendIdMismatchError extends Schema.TaggedError<BackendIdMismatchError>(
|
|
15
|
+
'~@livestore/common/BackendIdMismatchError',
|
|
16
|
+
)('BackendIdMismatchError', {
|
|
13
17
|
expected: BackendId,
|
|
14
18
|
received: BackendId,
|
|
15
19
|
}) {}
|
|
16
20
|
|
|
17
|
-
export class ServerAheadError extends Schema.TaggedError<ServerAheadError>(
|
|
21
|
+
export class ServerAheadError extends Schema.TaggedError<ServerAheadError>(
|
|
22
|
+
'~@livestore/common/ServerAheadError',
|
|
23
|
+
)('ServerAheadError', {
|
|
18
24
|
minimumExpectedNum: EventSequenceNumber.Global.Schema,
|
|
19
25
|
providedNum: EventSequenceNumber.Global.Schema,
|
|
20
26
|
}) {}
|
|
21
|
-
|
|
22
|
-
export class InvalidPushError extends Schema.TaggedError<InvalidPushError>()('InvalidPushError', {
|
|
23
|
-
cause: Schema.Union(UnknownError, ServerAheadError, BackendIdMismatchError),
|
|
24
|
-
}) {}
|
|
25
|
-
|
|
26
|
-
export class InvalidPullError extends Schema.TaggedError<InvalidPullError>()('InvalidPullError', {
|
|
27
|
-
cause: Schema.Defect,
|
|
28
|
-
}) {}
|
|
29
|
-
|
|
30
|
-
export class LeaderAheadError extends Schema.TaggedError<LeaderAheadError>()('LeaderAheadError', {
|
|
31
|
-
minimumExpectedNum: EventSequenceNumber.Client.Composite,
|
|
32
|
-
providedNum: EventSequenceNumber.Client.Composite,
|
|
33
|
-
/** Generation number the client session should use for subsequent pushes */
|
|
34
|
-
// nextGeneration: Schema.Number,
|
|
35
|
-
}) {}
|
|
36
|
-
|
|
37
|
-
export const SyncError = Schema.Union(InvalidPushError, InvalidPullError)
|
|
38
|
-
export type SyncError = typeof SyncError.Type
|