@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
package/src/sync/syncstate.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { casesHandled
|
|
2
|
-
import { Match, ReadonlyArray, Schema } from '@livestore/utils/effect'
|
|
1
|
+
import { casesHandled } from '@livestore/utils'
|
|
2
|
+
import { Effect, Match, ReadonlyArray, Schema } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
4
|
import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts'
|
|
5
5
|
import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
|
|
@@ -159,16 +159,10 @@ export class MergeResultReject extends Schema.Class<MergeResultReject>('MergeRes
|
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
export class MergeResultUnknownError extends Schema.Class<MergeResultUnknownError>('MergeResultUnknownError')({
|
|
163
|
-
_tag: Schema.Literal('unknown-error'),
|
|
164
|
-
message: Schema.String,
|
|
165
|
-
}) {}
|
|
166
|
-
|
|
167
162
|
export class MergeResult extends Schema.Union(
|
|
168
163
|
MergeResultAdvance,
|
|
169
164
|
MergeResultRebase,
|
|
170
165
|
MergeResultReject,
|
|
171
|
-
MergeResultUnknownError,
|
|
172
166
|
) {}
|
|
173
167
|
|
|
174
168
|
export const payloadFromMergeResult = (
|
|
@@ -187,15 +181,6 @@ export const payloadFromMergeResult = (
|
|
|
187
181
|
Match.exhaustive,
|
|
188
182
|
)
|
|
189
183
|
|
|
190
|
-
const unknownError = (message: string): MergeResultUnknownError => {
|
|
191
|
-
if (LS_DEV) {
|
|
192
|
-
// biome-ignore lint/suspicious/noDebugger: debug
|
|
193
|
-
debugger
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
return MergeResultUnknownError.make({ _tag: 'unknown-error', message })
|
|
197
|
-
}
|
|
198
|
-
|
|
199
184
|
// TODO Idea: call merge recursively through hierarchy levels
|
|
200
185
|
/*
|
|
201
186
|
Idea: have a map that maps from `globalEventSequenceNumber` to Array<ClientEvents>
|
|
@@ -203,7 +188,7 @@ The same applies to even further hierarchy levels
|
|
|
203
188
|
|
|
204
189
|
TODO: possibly even keep the client events in a separate table in the client leader
|
|
205
190
|
*/
|
|
206
|
-
export const merge = ({
|
|
191
|
+
export const merge = Effect.fnUntraced(function* ({
|
|
207
192
|
syncState,
|
|
208
193
|
payload,
|
|
209
194
|
isClientEvent,
|
|
@@ -216,9 +201,9 @@ export const merge = ({
|
|
|
216
201
|
isEqualEvent: (a: LiveStoreEvent.Client.EncodedWithMeta, b: LiveStoreEvent.Client.EncodedWithMeta) => boolean
|
|
217
202
|
/** This is used in the leader which should ignore client events when receiving an upstream-advance payload */
|
|
218
203
|
ignoreClientEvents?: boolean
|
|
219
|
-
})
|
|
220
|
-
validateSyncState(syncState)
|
|
221
|
-
validatePayload(payload)
|
|
204
|
+
}) {
|
|
205
|
+
yield* validateSyncState(syncState)
|
|
206
|
+
yield* validatePayload(payload)
|
|
222
207
|
|
|
223
208
|
const mergeContext = MergeContext.make({ payload, syncState })
|
|
224
209
|
|
|
@@ -236,7 +221,7 @@ export const merge = ({
|
|
|
236
221
|
isClientEvent,
|
|
237
222
|
})
|
|
238
223
|
|
|
239
|
-
return validateMergeResult(
|
|
224
|
+
return yield* validateMergeResult(
|
|
240
225
|
MergeResultRebase.make({
|
|
241
226
|
_tag: 'rebase',
|
|
242
227
|
newSyncState: new SyncState({
|
|
@@ -251,10 +236,10 @@ export const merge = ({
|
|
|
251
236
|
)
|
|
252
237
|
}
|
|
253
238
|
|
|
254
|
-
|
|
239
|
+
//#region upstream-advance
|
|
255
240
|
case 'upstream-advance': {
|
|
256
241
|
if (payload.newEvents.length === 0) {
|
|
257
|
-
return validateMergeResult(
|
|
242
|
+
return yield* validateMergeResult(
|
|
258
243
|
MergeResultAdvance.make({
|
|
259
244
|
_tag: 'advance',
|
|
260
245
|
newSyncState: new SyncState({
|
|
@@ -271,8 +256,11 @@ export const merge = ({
|
|
|
271
256
|
|
|
272
257
|
// Validate that newEvents are sorted in ascending order by eventNum
|
|
273
258
|
for (let i = 1; i < payload.newEvents.length; i++) {
|
|
274
|
-
if (
|
|
275
|
-
|
|
259
|
+
if (
|
|
260
|
+
EventSequenceNumber.Client.isGreaterThan(payload.newEvents[i - 1]!.seqNum, payload.newEvents[i]!.seqNum) ===
|
|
261
|
+
true
|
|
262
|
+
) {
|
|
263
|
+
return yield* Effect.dieDebugger(
|
|
276
264
|
`Events must be sorted in ascending order by event number. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
|
|
277
265
|
)
|
|
278
266
|
}
|
|
@@ -280,10 +268,10 @@ export const merge = ({
|
|
|
280
268
|
|
|
281
269
|
// Validate that incoming events are larger than upstream head
|
|
282
270
|
if (
|
|
283
|
-
EventSequenceNumber.Client.isGreaterThan(syncState.upstreamHead, payload.newEvents[0]!.seqNum) ||
|
|
284
|
-
EventSequenceNumber.Client.isEqual(syncState.upstreamHead, payload.newEvents[0]!.seqNum)
|
|
271
|
+
EventSequenceNumber.Client.isGreaterThan(syncState.upstreamHead, payload.newEvents[0]!.seqNum) === true ||
|
|
272
|
+
EventSequenceNumber.Client.isEqual(syncState.upstreamHead, payload.newEvents[0]!.seqNum) === true
|
|
285
273
|
) {
|
|
286
|
-
return
|
|
274
|
+
return yield* Effect.dieDebugger(
|
|
287
275
|
`Incoming events must be greater than upstream head. Expected greater than: ${EventSequenceNumber.Client.toString(syncState.upstreamHead)}. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
|
|
288
276
|
)
|
|
289
277
|
}
|
|
@@ -316,20 +304,20 @@ export const merge = ({
|
|
|
316
304
|
const [pendingMatching, pendingRemaining] = ReadonlyArray.splitWhere(
|
|
317
305
|
syncState.pending,
|
|
318
306
|
(pendingEvent, index) => {
|
|
319
|
-
if (ignoreClientEvents && isClientEvent(pendingEvent)) {
|
|
307
|
+
if (ignoreClientEvents === true && isClientEvent(pendingEvent) === true) {
|
|
320
308
|
clientIndexOffset++
|
|
321
309
|
return false
|
|
322
310
|
}
|
|
323
311
|
|
|
324
312
|
const newEvent = payload.newEvents.at(index - clientIndexOffset)
|
|
325
|
-
if (
|
|
313
|
+
if (newEvent == null) {
|
|
326
314
|
return true
|
|
327
315
|
}
|
|
328
|
-
return isEqualEvent(pendingEvent, newEvent)
|
|
316
|
+
return !isEqualEvent(pendingEvent, newEvent)
|
|
329
317
|
},
|
|
330
318
|
)
|
|
331
319
|
|
|
332
|
-
return validateMergeResult(
|
|
320
|
+
return yield* validateMergeResult(
|
|
333
321
|
MergeResultAdvance.make({
|
|
334
322
|
_tag: 'advance',
|
|
335
323
|
newSyncState: new SyncState({
|
|
@@ -359,7 +347,7 @@ export const merge = ({
|
|
|
359
347
|
ignoreClientEvents,
|
|
360
348
|
})
|
|
361
349
|
|
|
362
|
-
return validateMergeResult(
|
|
350
|
+
return yield* validateMergeResult(
|
|
363
351
|
MergeResultRebase.make({
|
|
364
352
|
_tag: 'rebase',
|
|
365
353
|
newSyncState: new SyncState({
|
|
@@ -374,12 +362,12 @@ export const merge = ({
|
|
|
374
362
|
)
|
|
375
363
|
}
|
|
376
364
|
}
|
|
377
|
-
|
|
365
|
+
//#endregion upstream-advance
|
|
378
366
|
|
|
379
367
|
// This is the same as what's running in the sync backend
|
|
380
368
|
case 'local-push': {
|
|
381
369
|
if (payload.newEvents.length === 0) {
|
|
382
|
-
return validateMergeResult(
|
|
370
|
+
return yield* validateMergeResult(
|
|
383
371
|
MergeResultAdvance.make({
|
|
384
372
|
_tag: 'advance',
|
|
385
373
|
newSyncState: syncState,
|
|
@@ -391,15 +379,17 @@ export const merge = ({
|
|
|
391
379
|
}
|
|
392
380
|
|
|
393
381
|
const newEventsFirst = payload.newEvents.at(0)!
|
|
394
|
-
const invalidEventSequenceNumber =
|
|
395
|
-
|
|
382
|
+
const invalidEventSequenceNumber = !EventSequenceNumber.Client.isGreaterThan(
|
|
383
|
+
newEventsFirst.seqNum,
|
|
384
|
+
syncState.localHead,
|
|
385
|
+
)
|
|
396
386
|
|
|
397
|
-
if (invalidEventSequenceNumber) {
|
|
387
|
+
if (invalidEventSequenceNumber === true) {
|
|
398
388
|
const expectedMinimumId = EventSequenceNumber.Client.nextPair({
|
|
399
389
|
seqNum: syncState.localHead,
|
|
400
390
|
isClient: true,
|
|
401
391
|
}).seqNum
|
|
402
|
-
return validateMergeResult(
|
|
392
|
+
return yield* validateMergeResult(
|
|
403
393
|
MergeResultReject.make({
|
|
404
394
|
_tag: 'reject',
|
|
405
395
|
expectedMinimumId,
|
|
@@ -407,14 +397,13 @@ export const merge = ({
|
|
|
407
397
|
}),
|
|
408
398
|
)
|
|
409
399
|
} else {
|
|
410
|
-
const nonClientEvents =
|
|
411
|
-
? payload.newEvents.filter((event) => !isClientEvent(event))
|
|
412
|
-
: payload.newEvents
|
|
400
|
+
const nonClientEvents =
|
|
401
|
+
ignoreClientEvents === true ? payload.newEvents.filter((event) => !isClientEvent(event)) : payload.newEvents
|
|
413
402
|
const newPending = [...syncState.pending, ...nonClientEvents]
|
|
414
403
|
const newLocalHead =
|
|
415
404
|
newPending.at(-1)?.seqNum ?? EventSequenceNumber.Client.max(syncState.localHead, syncState.upstreamHead)
|
|
416
405
|
|
|
417
|
-
return validateMergeResult(
|
|
406
|
+
return yield* validateMergeResult(
|
|
418
407
|
MergeResultAdvance.make({
|
|
419
408
|
_tag: 'advance',
|
|
420
409
|
newSyncState: new SyncState({
|
|
@@ -430,11 +419,10 @@ export const merge = ({
|
|
|
430
419
|
}
|
|
431
420
|
}
|
|
432
421
|
|
|
433
|
-
default:
|
|
434
|
-
casesHandled(payload)
|
|
435
|
-
}
|
|
422
|
+
default:
|
|
423
|
+
return casesHandled(payload)
|
|
436
424
|
}
|
|
437
|
-
}
|
|
425
|
+
})
|
|
438
426
|
|
|
439
427
|
/**
|
|
440
428
|
* Gets the index relative to `existingEvents` where the divergence point is
|
|
@@ -453,7 +441,7 @@ export const findDivergencePoint = ({
|
|
|
453
441
|
isClientEvent: (event: LiveStoreEvent.Client.EncodedWithMeta) => boolean
|
|
454
442
|
ignoreClientEvents: boolean
|
|
455
443
|
}): number => {
|
|
456
|
-
if (ignoreClientEvents) {
|
|
444
|
+
if (ignoreClientEvents === true) {
|
|
457
445
|
const filteredExistingEvents = existingEvents.filter((event) => !isClientEvent(event))
|
|
458
446
|
const divergencePointWithoutClientEvents = findDivergencePoint({
|
|
459
447
|
existingEvents: filteredExistingEvents,
|
|
@@ -475,7 +463,7 @@ export const findDivergencePoint = ({
|
|
|
475
463
|
return existingEvents.findIndex((existingEvent, index) => {
|
|
476
464
|
const incomingEvent = incomingEvents[index]
|
|
477
465
|
// return !incomingEvent || !isEqualEvent(existingEvent, incomingEvent)
|
|
478
|
-
return incomingEvent &&
|
|
466
|
+
return incomingEvent !== undefined && isEqualEvent(existingEvent, incomingEvent) === false
|
|
479
467
|
})
|
|
480
468
|
}
|
|
481
469
|
|
|
@@ -511,69 +499,75 @@ const rebaseEvents = ({
|
|
|
511
499
|
*/
|
|
512
500
|
const _flattenMergeResults = (_updateResults: ReadonlyArray<MergeResult>) => {}
|
|
513
501
|
|
|
514
|
-
const validatePayload = (payload: typeof Payload.Type) =>
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
502
|
+
const validatePayload = (payload: typeof Payload.Type) =>
|
|
503
|
+
Effect.gen(function* () {
|
|
504
|
+
for (let i = 1; i < payload.newEvents.length; i++) {
|
|
505
|
+
if (
|
|
506
|
+
EventSequenceNumber.Client.isGreaterThanOrEqual(
|
|
507
|
+
payload.newEvents[i - 1]!.seqNum,
|
|
508
|
+
payload.newEvents[i]!.seqNum,
|
|
509
|
+
) === true
|
|
510
|
+
) {
|
|
511
|
+
return yield* Effect.dieDebugger(
|
|
512
|
+
`Events must be ordered in monotonically ascending order by eventNum. Received: [${payload.newEvents.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
|
|
513
|
+
)
|
|
514
|
+
}
|
|
522
515
|
}
|
|
523
|
-
}
|
|
524
|
-
}
|
|
516
|
+
})
|
|
525
517
|
|
|
526
|
-
const validateSyncState = (
|
|
518
|
+
const validateSyncState = Effect.fnUntraced(function* (
|
|
519
|
+
syncState: SyncState,
|
|
520
|
+
) {
|
|
527
521
|
for (let i = 0; i < syncState.pending.length; i++) {
|
|
528
522
|
const event = syncState.pending[i]!
|
|
529
523
|
const nextEvent = syncState.pending[i + 1]
|
|
530
524
|
if (nextEvent === undefined) break // Reached end of chain
|
|
531
525
|
|
|
532
|
-
if (EventSequenceNumber.Client.isGreaterThanOrEqual(event.seqNum, nextEvent.seqNum)) {
|
|
533
|
-
|
|
526
|
+
if (EventSequenceNumber.Client.isGreaterThanOrEqual(event.seqNum, nextEvent.seqNum) === true) {
|
|
527
|
+
return yield* Effect.dieDebugger(
|
|
534
528
|
`Events must be ordered in monotonically ascending order by eventNum. Received: [${syncState.pending.map((e) => EventSequenceNumber.Client.toString(e.seqNum)).join(', ')}]`,
|
|
535
|
-
{
|
|
536
|
-
event,
|
|
537
|
-
nextEvent,
|
|
538
|
-
},
|
|
529
|
+
{ event, nextEvent },
|
|
539
530
|
)
|
|
540
531
|
}
|
|
541
532
|
|
|
542
533
|
// If the global id has increased, then the client id must be 0
|
|
543
534
|
const globalIdHasIncreased = nextEvent.seqNum.global > event.seqNum.global
|
|
544
|
-
if (globalIdHasIncreased) {
|
|
535
|
+
if (globalIdHasIncreased === true) {
|
|
545
536
|
if (nextEvent.seqNum.client !== 0) {
|
|
546
|
-
|
|
537
|
+
return yield* Effect.dieDebugger(
|
|
547
538
|
`New global events must point to clientId 0 in the parentSeqNum. Received: (${EventSequenceNumber.Client.toString(nextEvent.seqNum)})`,
|
|
548
539
|
syncState.pending,
|
|
549
|
-
{
|
|
550
|
-
event,
|
|
551
|
-
nextEvent,
|
|
552
|
-
},
|
|
540
|
+
{ event, nextEvent },
|
|
553
541
|
)
|
|
554
542
|
}
|
|
555
543
|
} else {
|
|
556
544
|
// Otherwise, the parentSeqNum must be the same as the previous event's id
|
|
557
545
|
if (EventSequenceNumber.Client.isEqual(nextEvent.parentSeqNum, event.seqNum) === false) {
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
546
|
+
return yield* Effect.dieDebugger(
|
|
547
|
+
'Events must be linked in a continuous chain via the parentSeqNum',
|
|
548
|
+
syncState.pending,
|
|
549
|
+
{ event, nextEvent },
|
|
550
|
+
)
|
|
562
551
|
}
|
|
563
552
|
}
|
|
564
553
|
}
|
|
565
|
-
}
|
|
554
|
+
})
|
|
566
555
|
|
|
567
|
-
const validateMergeResult = (
|
|
568
|
-
|
|
556
|
+
const validateMergeResult = Effect.fnUntraced(function* (
|
|
557
|
+
mergeResult: typeof MergeResult.Type,
|
|
558
|
+
) {
|
|
559
|
+
if (mergeResult._tag === 'reject') return mergeResult
|
|
569
560
|
|
|
570
|
-
validateSyncState(mergeResult.newSyncState)
|
|
561
|
+
yield* validateSyncState(mergeResult.newSyncState)
|
|
571
562
|
|
|
572
563
|
// Ensure local head is always greater than or equal to upstream head
|
|
573
564
|
if (
|
|
574
|
-
EventSequenceNumber.Client.isGreaterThan(
|
|
565
|
+
EventSequenceNumber.Client.isGreaterThan(
|
|
566
|
+
mergeResult.newSyncState.upstreamHead,
|
|
567
|
+
mergeResult.newSyncState.localHead,
|
|
568
|
+
) === true
|
|
575
569
|
) {
|
|
576
|
-
|
|
570
|
+
return yield* Effect.dieDebugger('Local head must be greater than or equal to upstream head', {
|
|
577
571
|
localHead: mergeResult.newSyncState.localHead,
|
|
578
572
|
upstreamHead: mergeResult.newSyncState.upstreamHead,
|
|
579
573
|
})
|
|
@@ -586,7 +580,7 @@ const validateMergeResult = (mergeResult: typeof MergeResult.Type) => {
|
|
|
586
580
|
mergeResult.mergeContext.syncState.localHead,
|
|
587
581
|
) === false
|
|
588
582
|
) {
|
|
589
|
-
|
|
583
|
+
return yield* Effect.dieDebugger('New local head must be greater than or equal to the previous local head', {
|
|
590
584
|
localHead: mergeResult.newSyncState.localHead,
|
|
591
585
|
previousLocalHead: mergeResult.mergeContext.syncState.localHead,
|
|
592
586
|
})
|
|
@@ -599,11 +593,11 @@ const validateMergeResult = (mergeResult: typeof MergeResult.Type) => {
|
|
|
599
593
|
mergeResult.mergeContext.syncState.upstreamHead,
|
|
600
594
|
) === false
|
|
601
595
|
) {
|
|
602
|
-
|
|
596
|
+
return yield* Effect.dieDebugger('New upstream head must be greater than or equal to the previous upstream head', {
|
|
603
597
|
upstreamHead: mergeResult.newSyncState.upstreamHead,
|
|
604
598
|
previousUpstreamHead: mergeResult.mergeContext.syncState.upstreamHead,
|
|
605
599
|
})
|
|
606
600
|
}
|
|
607
601
|
|
|
608
602
|
return mergeResult
|
|
609
|
-
}
|
|
603
|
+
})
|
|
@@ -27,7 +27,7 @@ export interface ChunkingOptions<A> {
|
|
|
27
27
|
* both item count and encoded byte size limits. Designed for transports with
|
|
28
28
|
* strict frame caps (e.g. Cloudflare hibernated WebSockets).
|
|
29
29
|
*/
|
|
30
|
-
export class OversizeChunkItemError extends Schema.TaggedError<OversizeChunkItemError>()('OversizeChunkItemError', {
|
|
30
|
+
export class OversizeChunkItemError extends Schema.TaggedError<OversizeChunkItemError>('~@livestore/common/OversizeChunkItemError')('OversizeChunkItemError', {
|
|
31
31
|
size: Schema.Number,
|
|
32
32
|
maxBytes: Schema.Number,
|
|
33
33
|
}) {}
|
|
@@ -69,7 +69,7 @@ export const splitChunkBySize =
|
|
|
69
69
|
current.push(item)
|
|
70
70
|
const exceedsLimit = current.length > maxItems || computeSize(current) > maxBytes
|
|
71
71
|
|
|
72
|
-
if (exceedsLimit) {
|
|
72
|
+
if (exceedsLimit === true) {
|
|
73
73
|
// remove the item we just added and emit the previous chunk if it exists
|
|
74
74
|
const last = current.pop()!
|
|
75
75
|
flushCurrent()
|
|
@@ -77,7 +77,7 @@ export const splitChunkBySize =
|
|
|
77
77
|
if (last !== undefined) {
|
|
78
78
|
current = [last]
|
|
79
79
|
const singleItemTooLarge = computeSize(current) > maxBytes
|
|
80
|
-
if (singleItemTooLarge || current.length > maxItems) {
|
|
80
|
+
if (singleItemTooLarge === true || current.length > maxItems) {
|
|
81
81
|
return yield* new OversizeChunkItemError({ size: computeSize([last]), maxBytes })
|
|
82
82
|
}
|
|
83
83
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect } from '@livestore/utils/effect'
|
|
2
2
|
|
|
3
3
|
import { EventSequenceNumber, type LiveStoreEvent } from '../schema/mod.ts'
|
|
4
|
-
import {
|
|
4
|
+
import { ServerAheadError } from './sync.ts'
|
|
5
5
|
|
|
6
6
|
// TODO proper batch validation
|
|
7
7
|
export const validatePushPayload = (
|
|
@@ -10,11 +10,9 @@ export const validatePushPayload = (
|
|
|
10
10
|
) =>
|
|
11
11
|
Effect.gen(function* () {
|
|
12
12
|
if (batch[0]!.seqNum <= currentEventSequenceNumber) {
|
|
13
|
-
return yield*
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
providedNum: EventSequenceNumber.Global.make(batch[0]!.seqNum),
|
|
17
|
-
}),
|
|
13
|
+
return yield* new ServerAheadError({
|
|
14
|
+
minimumExpectedNum: EventSequenceNumber.Global.make(currentEventSequenceNumber + 1),
|
|
15
|
+
providedNum: EventSequenceNumber.Global.make(batch[0]!.seqNum),
|
|
18
16
|
})
|
|
19
17
|
}
|
|
20
18
|
})
|
package/src/util.ts
CHANGED
|
@@ -47,11 +47,11 @@ export const sql = (template: TemplateStringsArray, ...args: unknown[]): string
|
|
|
47
47
|
* TODO: Also make sure that the SQLite binding limit of 1000 is respected
|
|
48
48
|
*/
|
|
49
49
|
export const prepareBindValues = (values: Bindable, statement: string): PreparedBindValues => {
|
|
50
|
-
if (Array.isArray(values)) return values as any as PreparedBindValues
|
|
50
|
+
if (Array.isArray(values) === true) return values as any as PreparedBindValues
|
|
51
51
|
|
|
52
52
|
const result: ParamsObject = {}
|
|
53
53
|
for (const [key, value] of Object.entries(values)) {
|
|
54
|
-
if (statement.includes(key)) {
|
|
54
|
+
if (statement.includes(key) === true) {
|
|
55
55
|
result[`$${key}`] = value
|
|
56
56
|
}
|
|
57
57
|
}
|
package/src/version.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
// import packageJson from '../package.json' with { type: 'json' }
|
|
3
|
-
// export const liveStoreVersion = packageJson.version
|
|
1
|
+
import pkg from '../package.json' with { type: 'json' }
|
|
4
2
|
|
|
5
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Current LiveStore version used for DevTools version compatibility checks.
|
|
5
|
+
*
|
|
6
|
+
* Can be overridden at runtime via `globalThis.__LIVESTORE_VERSION_OVERRIDE__` for testing purposes.
|
|
7
|
+
* This allows Playwright tests to simulate version mismatch scenarios without rebuilding.
|
|
8
|
+
*/
|
|
9
|
+
export const liveStoreVersion: string = (globalThis as any).__LIVESTORE_VERSION_OVERRIDE__ ?? pkg.version
|
|
6
10
|
|
|
7
11
|
/**
|
|
8
12
|
* CRITICAL: Increment this version whenever you modify client-side EVENTLOG table schemas.
|