@livestore/common 0.4.0-dev.18 → 0.4.0-dev.19
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 +10 -10
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/adapter-types.d.ts +5 -5
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +28 -23
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +2 -2
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +6 -6
- package/dist/devtools/devtools-messages-leader.d.ts +33 -28
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +8 -8
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/errors.d.ts +6 -6
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +7 -7
- package/dist/errors.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +2 -2
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +28 -28
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +13 -13
- 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 +2 -2
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +3 -3
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +2 -2
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +10 -8
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/materialize-event.d.ts +1 -1
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +2 -2
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +2 -2
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +5 -5
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -2
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -2
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/types.d.ts +15 -15
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/make-client-session.d.ts +2 -2
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/materializer-helper.d.ts +5 -5
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +2 -2
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +6 -6
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +147 -0
- package/dist/schema/EventDef/define.d.ts.map +1 -0
- package/dist/schema/EventDef/define.js +139 -0
- package/dist/schema/EventDef/define.js.map +1 -0
- package/dist/schema/EventDef/event-def.d.ts +106 -0
- package/dist/schema/EventDef/event-def.d.ts.map +1 -0
- package/dist/schema/EventDef/event-def.js +2 -0
- package/dist/schema/EventDef/event-def.js.map +1 -0
- package/dist/schema/EventDef/facts.d.ts +118 -0
- package/dist/schema/EventDef/facts.d.ts.map +1 -0
- package/dist/schema/EventDef/facts.js +53 -0
- package/dist/schema/EventDef/facts.js.map +1 -0
- package/dist/schema/EventDef/materializer.d.ts +155 -0
- package/dist/schema/EventDef/materializer.d.ts.map +1 -0
- package/dist/schema/EventDef/materializer.js +83 -0
- package/dist/schema/EventDef/materializer.js.map +1 -0
- package/dist/schema/EventDef/mod.d.ts +5 -0
- package/dist/schema/EventDef/mod.d.ts.map +1 -0
- package/dist/schema/EventDef/mod.js +5 -0
- package/dist/schema/EventDef/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
- package/dist/schema/{EventSequenceNumber.js → EventSequenceNumber/client.js} +86 -39
- package/dist/schema/EventSequenceNumber/client.js.map +1 -0
- package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
- package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/global.js +14 -0
- package/dist/schema/EventSequenceNumber/global.js.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.js +37 -0
- package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +41 -41
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +84 -101
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
- package/dist/schema/{LiveStoreEvent.js → LiveStoreEvent/client.js} +69 -52
- package/dist/schema/LiveStoreEvent/client.js.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
- package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
- package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/global.js +31 -0
- package/dist/schema/LiveStoreEvent/global.js.map +1 -0
- package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
- package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/input.js +26 -0
- package/dist/schema/LiveStoreEvent/input.js.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.js +5 -0
- package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
- package/dist/schema/events.d.ts +1 -1
- package/dist/schema/events.d.ts.map +1 -1
- package/dist/schema/events.js +1 -1
- package/dist/schema/events.js.map +1 -1
- package/dist/schema/mod.d.ts +3 -3
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +3 -3
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +1 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +2 -2
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +13 -0
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +2 -1
- package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +2 -2
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +1 -1
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/api.d.ts +12 -8
- 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 +18 -11
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +119 -90
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +5 -5
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
- package/dist/schema/state/sqlite/system-tables/state-tables.js +3 -3
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
- package/dist/schema/unknown-events.d.ts +3 -3
- package/dist/schema/unknown-events.d.ts.map +1 -1
- package/dist/schema-management/migrations.d.ts +2 -2
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts +3 -3
- package/dist/schema-management/validate-schema.d.ts.map +1 -1
- package/dist/schema-management/validate-schema.js +2 -2
- package/dist/schema-management/validate-schema.js.map +1 -1
- package/dist/sqlite-types.d.ts +3 -3
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +5 -5
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +12 -12
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +9 -4
- package/dist/sync/errors.d.ts.map +1 -1
- package/dist/sync/errors.js +6 -6
- package/dist/sync/errors.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +6 -6
- package/dist/sync/mock-sync-backend.d.ts.map +1 -1
- package/dist/sync/mock-sync-backend.js +4 -4
- package/dist/sync/mock-sync-backend.js.map +1 -1
- package/dist/sync/next/compact-events.js +2 -2
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +5 -5
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +5 -5
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +5 -5
- 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 +8 -8
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +5 -5
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +5 -5
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts +2 -2
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +9 -9
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync-backend-kv.d.ts +3 -3
- package/dist/sync/sync-backend-kv.d.ts.map +1 -1
- package/dist/sync/sync-backend-kv.js +3 -3
- package/dist/sync/sync-backend-kv.js.map +1 -1
- package/dist/sync/sync-backend.d.ts +9 -9
- package/dist/sync/sync-backend.d.ts.map +1 -1
- package/dist/sync/syncstate.d.ts +55 -42
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +42 -42
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +40 -40
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/validate-push-payload.d.ts +1 -1
- 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/testing/event-factory.d.ts +3 -3
- package/dist/testing/event-factory.d.ts.map +1 -1
- package/dist/testing/event-factory.js +5 -7
- package/dist/testing/event-factory.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
- package/src/ClientSessionLeaderThreadProxy.ts +10 -10
- package/src/adapter-types.ts +5 -5
- package/src/devtools/devtools-messages-client-session.ts +2 -2
- package/src/devtools/devtools-messages-leader.ts +8 -8
- package/src/errors.ts +11 -13
- package/src/leader-thread/LeaderSyncProcessor.ts +54 -56
- package/src/leader-thread/eventlog.ts +21 -26
- package/src/leader-thread/leader-worker-devtools.ts +3 -3
- package/src/leader-thread/make-leader-thread-layer.ts +12 -10
- package/src/leader-thread/materialize-event.ts +3 -3
- package/src/leader-thread/recreate-db.ts +6 -6
- package/src/leader-thread/shutdown-channel.ts +2 -2
- package/src/leader-thread/types.ts +15 -15
- package/src/make-client-session.ts +2 -2
- package/src/materializer-helper.ts +5 -5
- package/src/rematerialize-from-eventlog.ts +6 -6
- package/src/schema/EventDef/define.ts +201 -0
- package/src/schema/EventDef/event-def.ts +120 -0
- package/src/schema/EventDef/facts.ts +135 -0
- package/src/schema/EventDef/materializer.ts +172 -0
- package/src/schema/EventDef/mod.ts +4 -0
- package/src/schema/EventSequenceNumber/client.ts +257 -0
- package/src/schema/EventSequenceNumber/global.ts +19 -0
- package/src/schema/EventSequenceNumber/mod.ts +37 -0
- package/src/schema/EventSequenceNumber.test.ts +68 -50
- package/src/schema/LiveStoreEvent/client.ts +221 -0
- package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
- package/src/schema/LiveStoreEvent/global.ts +45 -0
- package/src/schema/LiveStoreEvent/input.ts +63 -0
- package/src/schema/LiveStoreEvent/mod.ts +4 -0
- package/src/schema/events.ts +1 -1
- package/src/schema/mod.ts +3 -3
- package/src/schema/schema.ts +1 -1
- package/src/schema/state/sqlite/client-document-def.test.ts +2 -2
- package/src/schema/state/sqlite/client-document-def.ts +3 -3
- package/src/schema/state/sqlite/column-def.test.ts +2 -1
- package/src/schema/state/sqlite/column-def.ts +17 -0
- package/src/schema/state/sqlite/mod.ts +2 -2
- package/src/schema/state/sqlite/query-builder/api.ts +12 -8
- package/src/schema/state/sqlite/query-builder/astToSql.ts +20 -11
- package/src/schema/state/sqlite/query-builder/impl.test.ts +122 -90
- package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +5 -5
- package/src/schema/state/sqlite/system-tables/state-tables.ts +3 -3
- package/src/schema/unknown-events.ts +3 -3
- package/src/schema-management/migrations.ts +2 -2
- package/src/schema-management/validate-schema.ts +3 -3
- package/src/sqlite-types.ts +3 -3
- package/src/sync/ClientSessionSyncProcessor.ts +17 -17
- package/src/sync/errors.ts +6 -6
- package/src/sync/mock-sync-backend.ts +16 -16
- package/src/sync/next/compact-events.ts +2 -2
- package/src/sync/next/facts.ts +6 -6
- package/src/sync/next/history-dag-common.ts +8 -8
- package/src/sync/next/history-dag.ts +14 -10
- package/src/sync/next/rebase-events.ts +11 -11
- package/src/sync/next/test/event-fixtures.ts +11 -11
- package/src/sync/sync-backend-kv.ts +3 -3
- package/src/sync/sync-backend.ts +9 -9
- package/src/sync/syncstate.test.ts +46 -46
- package/src/sync/syncstate.ts +59 -55
- package/src/sync/validate-push-payload.ts +4 -4
- package/src/testing/event-factory.ts +10 -12
- package/src/version.ts +1 -1
- package/dist/schema/EventDef.d.ts +0 -126
- package/dist/schema/EventDef.d.ts.map +0 -1
- package/dist/schema/EventDef.js +0 -46
- package/dist/schema/EventDef.js.map +0 -1
- package/dist/schema/EventSequenceNumber.d.ts +0 -89
- package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
- package/dist/schema/EventSequenceNumber.js.map +0 -1
- package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
- package/dist/schema/LiveStoreEvent.js.map +0 -1
- package/src/schema/EventDef.ts +0 -222
- package/src/schema/EventSequenceNumber.ts +0 -208
- package/src/schema/LiveStoreEvent.ts +0 -286
|
@@ -15,10 +15,10 @@ import {
|
|
|
15
15
|
} from '@livestore/utils/effect'
|
|
16
16
|
import type * as otel from '@opentelemetry/api'
|
|
17
17
|
|
|
18
|
-
import { type ClientSession,
|
|
18
|
+
import { type ClientSession, UnknownError } from '../adapter-types.ts'
|
|
19
19
|
import type { MaterializeError } from '../errors.ts'
|
|
20
|
-
import * as EventSequenceNumber from '../schema/EventSequenceNumber.ts'
|
|
21
|
-
import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
|
|
20
|
+
import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts'
|
|
21
|
+
import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
|
|
22
22
|
import type { LiveStoreSchema } from '../schema/mod.ts'
|
|
23
23
|
import * as SyncState from './syncstate.ts'
|
|
24
24
|
|
|
@@ -52,7 +52,7 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
52
52
|
clientSession: ClientSession
|
|
53
53
|
runtime: Runtime.Runtime<Scope.Scope>
|
|
54
54
|
materializeEvent: (
|
|
55
|
-
eventEncoded: LiveStoreEvent.EncodedWithMeta,
|
|
55
|
+
eventEncoded: LiveStoreEvent.Client.EncodedWithMeta,
|
|
56
56
|
options: { withChangeset: boolean; materializerHashLeader: Option.Option<number> },
|
|
57
57
|
) => Effect.Effect<
|
|
58
58
|
{
|
|
@@ -78,7 +78,7 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
78
78
|
*/
|
|
79
79
|
confirmUnsavedChanges: boolean
|
|
80
80
|
}): ClientSessionSyncProcessor => {
|
|
81
|
-
const eventSchema = LiveStoreEvent.
|
|
81
|
+
const eventSchema = LiveStoreEvent.Client.makeSchemaMemo(schema)
|
|
82
82
|
|
|
83
83
|
const simSleep = <TKey extends keyof ClientSessionSyncProcessorSimulationParams>(
|
|
84
84
|
key: TKey,
|
|
@@ -97,11 +97,11 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
97
97
|
|
|
98
98
|
/** Only used for debugging / observability / testing, it's not relied upon for correctness of the sync processor. */
|
|
99
99
|
const syncStateUpdateQueue = Queue.unbounded<SyncState.SyncState>().pipe(Effect.runSync)
|
|
100
|
-
const isClientEvent = (eventEncoded: LiveStoreEvent.EncodedWithMeta) =>
|
|
100
|
+
const isClientEvent = (eventEncoded: LiveStoreEvent.Client.EncodedWithMeta) =>
|
|
101
101
|
schema.eventsDefsMap.get(eventEncoded.name)?.options.clientOnly ?? false
|
|
102
102
|
|
|
103
103
|
/** We're queuing push requests to reduce the number of messages sent to the leader by batching them */
|
|
104
|
-
const leaderPushQueue = BucketQueue.make<LiveStoreEvent.EncodedWithMeta>().pipe(Effect.runSync)
|
|
104
|
+
const leaderPushQueue = BucketQueue.make<LiveStoreEvent.Client.EncodedWithMeta>().pipe(Effect.runSync)
|
|
105
105
|
|
|
106
106
|
const push: ClientSessionSyncProcessor['push'] = Effect.fn('client-session-sync-processor:push')(function* (batch) {
|
|
107
107
|
// TODO validate batch
|
|
@@ -112,13 +112,13 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
112
112
|
if (eventDef === undefined) {
|
|
113
113
|
return shouldNeverHappen(`No event definition found for \`${name}\`.`)
|
|
114
114
|
}
|
|
115
|
-
const nextNumPair = EventSequenceNumber.nextPair({
|
|
115
|
+
const nextNumPair = EventSequenceNumber.Client.nextPair({
|
|
116
116
|
seqNum: baseEventSequenceNumber,
|
|
117
117
|
isClient: eventDef.options.clientOnly,
|
|
118
118
|
rebaseGeneration: baseEventSequenceNumber.rebaseGeneration,
|
|
119
119
|
})
|
|
120
120
|
baseEventSequenceNumber = nextNumPair.seqNum
|
|
121
|
-
return new LiveStoreEvent.EncodedWithMeta(
|
|
121
|
+
return new LiveStoreEvent.Client.EncodedWithMeta(
|
|
122
122
|
Schema.encodeUnknownSync(eventSchema)({
|
|
123
123
|
name,
|
|
124
124
|
args,
|
|
@@ -133,7 +133,7 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
133
133
|
syncState: syncStateRef.current,
|
|
134
134
|
payload: { _tag: 'local-push', newEvents: encodedEventDefs },
|
|
135
135
|
isClientEvent,
|
|
136
|
-
isEqualEvent: LiveStoreEvent.isEqualEncoded,
|
|
136
|
+
isEqualEvent: LiveStoreEvent.Client.isEqualEncoded,
|
|
137
137
|
})
|
|
138
138
|
|
|
139
139
|
yield* Effect.annotateCurrentSpan({
|
|
@@ -146,8 +146,8 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
146
146
|
...(TRACE_VERBOSE && { mergeResult: JSON.stringify(mergeResult) }),
|
|
147
147
|
})
|
|
148
148
|
|
|
149
|
-
if (mergeResult._tag === '
|
|
150
|
-
return shouldNeverHappen('
|
|
149
|
+
if (mergeResult._tag === 'unknown-error') {
|
|
150
|
+
return shouldNeverHappen('Unknown error in client-session-sync-processor', mergeResult.message)
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
if (mergeResult._tag !== 'advance') {
|
|
@@ -233,11 +233,11 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
233
233
|
syncState: syncStateRef.current,
|
|
234
234
|
payload,
|
|
235
235
|
isClientEvent,
|
|
236
|
-
isEqualEvent: LiveStoreEvent.isEqualEncoded,
|
|
236
|
+
isEqualEvent: LiveStoreEvent.Client.isEqualEncoded,
|
|
237
237
|
})
|
|
238
238
|
|
|
239
|
-
if (mergeResult._tag === '
|
|
240
|
-
return yield* new
|
|
239
|
+
if (mergeResult._tag === 'unknown-error') {
|
|
240
|
+
return yield* new UnknownError({ cause: mergeResult.message })
|
|
241
241
|
} else if (mergeResult._tag === 'reject') {
|
|
242
242
|
return shouldNeverHappen('Unexpected reject in client-session-sync-processor', mergeResult)
|
|
243
243
|
}
|
|
@@ -373,9 +373,9 @@ export const makeClientSessionSyncProcessor = ({
|
|
|
373
373
|
|
|
374
374
|
export interface ClientSessionSyncProcessor {
|
|
375
375
|
push: (
|
|
376
|
-
batch: ReadonlyArray<LiveStoreEvent.
|
|
376
|
+
batch: ReadonlyArray<LiveStoreEvent.Input.Decoded>,
|
|
377
377
|
) => Effect.Effect<{ writeTables: Set<string> }, MaterializeError>
|
|
378
|
-
boot: Effect.Effect<void,
|
|
378
|
+
boot: Effect.Effect<void, UnknownError, Scope.Scope>
|
|
379
379
|
/**
|
|
380
380
|
* Only used for debugging / observability.
|
|
381
381
|
*/
|
package/src/sync/errors.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Schema } from '@livestore/utils/effect'
|
|
2
|
-
import {
|
|
2
|
+
import { UnknownError } from '../errors.ts'
|
|
3
3
|
import { EventSequenceNumber } from '../schema/mod.ts'
|
|
4
4
|
|
|
5
5
|
export class IsOfflineError extends Schema.TaggedError<IsOfflineError>()('IsOfflineError', {
|
|
@@ -15,12 +15,12 @@ export class BackendIdMismatchError extends Schema.TaggedError<BackendIdMismatch
|
|
|
15
15
|
}) {}
|
|
16
16
|
|
|
17
17
|
export class ServerAheadError extends Schema.TaggedError<ServerAheadError>()('ServerAheadError', {
|
|
18
|
-
minimumExpectedNum: EventSequenceNumber.
|
|
19
|
-
providedNum: EventSequenceNumber.
|
|
18
|
+
minimumExpectedNum: EventSequenceNumber.Global.Schema,
|
|
19
|
+
providedNum: EventSequenceNumber.Global.Schema,
|
|
20
20
|
}) {}
|
|
21
21
|
|
|
22
22
|
export class InvalidPushError extends Schema.TaggedError<InvalidPushError>()('InvalidPushError', {
|
|
23
|
-
cause: Schema.Union(
|
|
23
|
+
cause: Schema.Union(UnknownError, ServerAheadError, BackendIdMismatchError),
|
|
24
24
|
}) {}
|
|
25
25
|
|
|
26
26
|
export class InvalidPullError extends Schema.TaggedError<InvalidPullError>()('InvalidPullError', {
|
|
@@ -28,8 +28,8 @@ export class InvalidPullError extends Schema.TaggedError<InvalidPullError>()('In
|
|
|
28
28
|
}) {}
|
|
29
29
|
|
|
30
30
|
export class LeaderAheadError extends Schema.TaggedError<LeaderAheadError>()('LeaderAheadError', {
|
|
31
|
-
minimumExpectedNum: EventSequenceNumber.
|
|
32
|
-
providedNum: EventSequenceNumber.
|
|
31
|
+
minimumExpectedNum: EventSequenceNumber.Client.Composite,
|
|
32
|
+
providedNum: EventSequenceNumber.Client.Composite,
|
|
33
33
|
/** Generation number the client session should use for subsequent pushes */
|
|
34
34
|
// nextGeneration: Schema.Number,
|
|
35
35
|
}) {}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import type { Schema, Scope } from '@livestore/utils/effect'
|
|
2
2
|
import { Effect, Mailbox, Option, Queue, Stream, SubscriptionRef } from '@livestore/utils/effect'
|
|
3
|
-
import {
|
|
3
|
+
import { UnknownError } from '../errors.ts'
|
|
4
4
|
import { EventSequenceNumber, type LiveStoreEvent } from '../schema/mod.ts'
|
|
5
5
|
import { InvalidPushError } from './errors.ts'
|
|
6
6
|
import * as SyncBackend from './sync-backend.ts'
|
|
7
7
|
import { validatePushPayload } from './validate-push-payload.ts'
|
|
8
8
|
|
|
9
9
|
export interface MockSyncBackend {
|
|
10
|
-
pushedEvents: Stream.Stream<LiveStoreEvent.
|
|
10
|
+
pushedEvents: Stream.Stream<LiveStoreEvent.Global.Encoded>
|
|
11
11
|
connect: Effect.Effect<void>
|
|
12
12
|
disconnect: Effect.Effect<void>
|
|
13
|
-
makeSyncBackend: Effect.Effect<SyncBackend.SyncBackend,
|
|
14
|
-
advance: (...batch: LiveStoreEvent.
|
|
13
|
+
makeSyncBackend: Effect.Effect<SyncBackend.SyncBackend, UnknownError, Scope.Scope>
|
|
14
|
+
advance: (...batch: LiveStoreEvent.Global.Encoded[]) => Effect.Effect<void>
|
|
15
15
|
/** Fail the next N push calls with an InvalidPushError (or custom error) */
|
|
16
16
|
failNextPushes: (
|
|
17
17
|
count: number,
|
|
18
|
-
error?: (batch: ReadonlyArray<LiveStoreEvent.
|
|
18
|
+
error?: (batch: ReadonlyArray<LiveStoreEvent.Global.Encoded>) => Effect.Effect<never, InvalidPushError>,
|
|
19
19
|
) => Effect.Effect<void>
|
|
20
20
|
}
|
|
21
21
|
|
|
@@ -29,13 +29,13 @@ export interface MockSyncBackendOptions {
|
|
|
29
29
|
|
|
30
30
|
export const makeMockSyncBackend = (
|
|
31
31
|
options?: MockSyncBackendOptions,
|
|
32
|
-
): Effect.Effect<MockSyncBackend,
|
|
32
|
+
): Effect.Effect<MockSyncBackend, UnknownError, Scope.Scope> =>
|
|
33
33
|
Effect.gen(function* () {
|
|
34
|
-
const syncEventSequenceNumberRef = { current: EventSequenceNumber.ROOT.global }
|
|
35
|
-
const syncPullQueue = yield* Queue.unbounded<LiveStoreEvent.
|
|
36
|
-
const pushedEventsQueue = yield* Mailbox.make<LiveStoreEvent.
|
|
34
|
+
const syncEventSequenceNumberRef = { current: EventSequenceNumber.Client.ROOT.global }
|
|
35
|
+
const syncPullQueue = yield* Queue.unbounded<LiveStoreEvent.Global.Encoded>()
|
|
36
|
+
const pushedEventsQueue = yield* Mailbox.make<LiveStoreEvent.Global.Encoded>()
|
|
37
37
|
const syncIsConnectedRef = yield* SubscriptionRef.make(options?.startConnected ?? false)
|
|
38
|
-
const allEventsRef: { current: LiveStoreEvent.
|
|
38
|
+
const allEventsRef: { current: LiveStoreEvent.Global.Encoded[] } = { current: [] }
|
|
39
39
|
|
|
40
40
|
const span = yield* Effect.currentSpan.pipe(Effect.orDie)
|
|
41
41
|
|
|
@@ -44,7 +44,7 @@ export const makeMockSyncBackend = (
|
|
|
44
44
|
// TODO improve the API and implementation of simulating errors
|
|
45
45
|
const failCounterRef = yield* SubscriptionRef.make(0)
|
|
46
46
|
const failEffectRef = yield* SubscriptionRef.make<
|
|
47
|
-
((batch: ReadonlyArray<LiveStoreEvent.
|
|
47
|
+
((batch: ReadonlyArray<LiveStoreEvent.Global.Encoded>) => Effect.Effect<never, InvalidPushError>) | undefined
|
|
48
48
|
>(undefined)
|
|
49
49
|
|
|
50
50
|
const makeSyncBackend = Effect.gen(function* () {
|
|
@@ -73,14 +73,14 @@ export const makeMockSyncBackend = (
|
|
|
73
73
|
Effect.sync(() => {
|
|
74
74
|
const lastSeen = cursor.pipe(
|
|
75
75
|
Option.match({
|
|
76
|
-
onNone: () => EventSequenceNumber.ROOT.global,
|
|
76
|
+
onNone: () => EventSequenceNumber.Client.ROOT.global,
|
|
77
77
|
onSome: (_) => _.eventSequenceNumber,
|
|
78
78
|
}),
|
|
79
79
|
)
|
|
80
80
|
// All events with seqNum greater than lastSeen
|
|
81
81
|
const slice = allEventsRef.current.filter((e) => e.seqNum > lastSeen)
|
|
82
82
|
// Split into configured chunk size
|
|
83
|
-
const chunks: { events: LiveStoreEvent.
|
|
83
|
+
const chunks: { events: LiveStoreEvent.Global.Encoded[]; remaining: number }[] = []
|
|
84
84
|
for (let i = 0; i < slice.length; i += nonLiveChunkSize) {
|
|
85
85
|
const end = Math.min(i + nonLiveChunkSize, slice.length)
|
|
86
86
|
const remaining = Math.max(slice.length - end, 0)
|
|
@@ -115,7 +115,7 @@ export const makeMockSyncBackend = (
|
|
|
115
115
|
return yield* maybeFail(batch)
|
|
116
116
|
}
|
|
117
117
|
return yield* new InvalidPushError({
|
|
118
|
-
cause: new
|
|
118
|
+
cause: new UnknownError({ cause: new Error('MockSyncBackend: simulated push failure') }),
|
|
119
119
|
})
|
|
120
120
|
}
|
|
121
121
|
|
|
@@ -146,7 +146,7 @@ export const makeMockSyncBackend = (
|
|
|
146
146
|
})
|
|
147
147
|
})
|
|
148
148
|
|
|
149
|
-
const advance = (...batch: LiveStoreEvent.
|
|
149
|
+
const advance = (...batch: LiveStoreEvent.Global.Encoded[]) =>
|
|
150
150
|
Effect.gen(function* () {
|
|
151
151
|
syncEventSequenceNumberRef.current = batch.at(-1)!.seqNum
|
|
152
152
|
allEventsRef.current = allEventsRef.current.concat(batch)
|
|
@@ -164,7 +164,7 @@ export const makeMockSyncBackend = (
|
|
|
164
164
|
|
|
165
165
|
const failNextPushes = (
|
|
166
166
|
count: number,
|
|
167
|
-
error?: (batch: ReadonlyArray<LiveStoreEvent.
|
|
167
|
+
error?: (batch: ReadonlyArray<LiveStoreEvent.Global.Encoded>) => Effect.Effect<never, InvalidPushError>,
|
|
168
168
|
) =>
|
|
169
169
|
Effect.gen(function* () {
|
|
170
170
|
yield* SubscriptionRef.set(failCounterRef, count)
|
|
@@ -206,14 +206,14 @@ const dagReplacesDag = (dagA: HistoryDag, dagB: HistoryDag): boolean => {
|
|
|
206
206
|
const removeEvent = (dag: HistoryDag, eventNumStr: string) => {
|
|
207
207
|
// console.debug('removing event', eventNumStr)
|
|
208
208
|
const event = dag.getNodeAttributes(eventNumStr)
|
|
209
|
-
const parentSeqNumStr = EventSequenceNumber.toString(event.parentSeqNum)
|
|
209
|
+
const parentSeqNumStr = EventSequenceNumber.Client.toString(event.parentSeqNum)
|
|
210
210
|
const childEdges = dag.outboundEdgeEntries(eventNumStr)
|
|
211
211
|
|
|
212
212
|
for (const childEdge of childEdges) {
|
|
213
213
|
if (childEdge.attributes.type === 'parent') {
|
|
214
214
|
const childEvent = dag.getNodeAttributes(childEdge.target)
|
|
215
215
|
childEvent.parentSeqNum = { ...event.parentSeqNum }
|
|
216
|
-
dag.addEdge(parentSeqNumStr, EventSequenceNumber.toString(childEvent.seqNum), { type: 'parent' })
|
|
216
|
+
dag.addEdge(parentSeqNumStr, EventSequenceNumber.Client.toString(childEvent.seqNum), { type: 'parent' })
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
219
|
|
package/src/sync/next/facts.ts
CHANGED
|
@@ -5,13 +5,13 @@ import type {
|
|
|
5
5
|
EventDefFactsGroup,
|
|
6
6
|
EventDefFactsSnapshot,
|
|
7
7
|
FactsCallback,
|
|
8
|
-
} from '../../schema/EventDef.ts'
|
|
9
|
-
import type * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
|
|
8
|
+
} from '../../schema/EventDef/mod.ts'
|
|
9
|
+
import type * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
|
|
10
10
|
import { EMPTY_FACT_VALUE, type HistoryDag, type HistoryDagNode } from './history-dag-common.ts'
|
|
11
11
|
|
|
12
12
|
export const factsSnapshotForEvents = (
|
|
13
13
|
events: HistoryDagNode[],
|
|
14
|
-
endEventSequenceNumber: EventSequenceNumber.
|
|
14
|
+
endEventSequenceNumber: EventSequenceNumber.Client.Composite,
|
|
15
15
|
): EventDefFactsSnapshot => {
|
|
16
16
|
const facts = new Map<string, any>()
|
|
17
17
|
|
|
@@ -28,7 +28,7 @@ export const factsSnapshotForEvents = (
|
|
|
28
28
|
|
|
29
29
|
export const factsSnapshotForDag = (
|
|
30
30
|
dag: HistoryDag,
|
|
31
|
-
endEventSequenceNumber: EventSequenceNumber.
|
|
31
|
+
endEventSequenceNumber: EventSequenceNumber.Client.Composite | undefined,
|
|
32
32
|
): EventDefFactsSnapshot => {
|
|
33
33
|
const facts = new Map<string, any>()
|
|
34
34
|
|
|
@@ -225,8 +225,8 @@ export const getFactsGroupForEventArgs = ({
|
|
|
225
225
|
}
|
|
226
226
|
|
|
227
227
|
export const compareEventSequenceNumbers = (
|
|
228
|
-
a: EventSequenceNumber.
|
|
229
|
-
b: EventSequenceNumber.
|
|
228
|
+
a: EventSequenceNumber.Client.Composite,
|
|
229
|
+
b: EventSequenceNumber.Client.Composite,
|
|
230
230
|
) => {
|
|
231
231
|
if (a.global !== b.global) {
|
|
232
232
|
return a.global - b.global
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { shouldNeverHappen } from '@livestore/utils'
|
|
2
2
|
import { Graph } from '@livestore/utils/effect'
|
|
3
|
-
import type { EventDefFactsGroup } from '../../schema/EventDef.ts'
|
|
4
|
-
import * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
|
|
3
|
+
import type { EventDefFactsGroup } from '../../schema/EventDef/mod.ts'
|
|
4
|
+
import * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
|
|
5
5
|
|
|
6
6
|
export const connectionTypeOptions = ['parent', 'facts'] as const
|
|
7
7
|
export type ConnectionType = (typeof connectionTypeOptions)[number]
|
|
8
8
|
|
|
9
9
|
export type HistoryDagNode = {
|
|
10
|
-
seqNum: EventSequenceNumber.
|
|
11
|
-
parentSeqNum: EventSequenceNumber.
|
|
10
|
+
seqNum: EventSequenceNumber.Client.Composite
|
|
11
|
+
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
12
12
|
name: string
|
|
13
13
|
args: any
|
|
14
14
|
/** Facts are being used for conflict detection and history compaction */
|
|
@@ -283,13 +283,13 @@ export class HistoryDag {
|
|
|
283
283
|
export const emptyHistoryDag = (): HistoryDag => HistoryDag.create({ allowSelfLoops: false })
|
|
284
284
|
|
|
285
285
|
// TODO consider making `ROOT_ID` parent to itself
|
|
286
|
-
export const rootParentNum = EventSequenceNumber.make({
|
|
287
|
-
global: EventSequenceNumber.ROOT.global - 1,
|
|
288
|
-
client: EventSequenceNumber.
|
|
286
|
+
export const rootParentNum = EventSequenceNumber.Client.Composite.make({
|
|
287
|
+
global: EventSequenceNumber.Client.ROOT.global - 1,
|
|
288
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
289
289
|
})
|
|
290
290
|
|
|
291
291
|
export const rootEventNode: HistoryDagNode = {
|
|
292
|
-
seqNum: EventSequenceNumber.ROOT,
|
|
292
|
+
seqNum: EventSequenceNumber.Client.ROOT,
|
|
293
293
|
parentSeqNum: rootParentNum,
|
|
294
294
|
// unused below
|
|
295
295
|
name: '__Root__',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
|
|
1
|
+
import * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
|
|
2
2
|
import { factsToString, validateFacts } from './facts.ts'
|
|
3
3
|
import { emptyHistoryDag, type HistoryDagNode, rootParentNum } from './history-dag-common.ts'
|
|
4
4
|
|
|
@@ -19,14 +19,18 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
|
|
|
19
19
|
const dag = emptyHistoryDag()
|
|
20
20
|
|
|
21
21
|
dagNodes.forEach((node) => {
|
|
22
|
-
dag.addNode(EventSequenceNumber.toString(node.seqNum), node)
|
|
22
|
+
dag.addNode(EventSequenceNumber.Client.toString(node.seqNum), node)
|
|
23
23
|
})
|
|
24
24
|
|
|
25
25
|
dagNodes.forEach((node) => {
|
|
26
|
-
if (EventSequenceNumber.toString(node.parentSeqNum) !== EventSequenceNumber.toString(rootParentNum)) {
|
|
27
|
-
dag.addEdge(
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
if (EventSequenceNumber.Client.toString(node.parentSeqNum) !== EventSequenceNumber.Client.toString(rootParentNum)) {
|
|
27
|
+
dag.addEdge(
|
|
28
|
+
EventSequenceNumber.Client.toString(node.parentSeqNum),
|
|
29
|
+
EventSequenceNumber.Client.toString(node.seqNum),
|
|
30
|
+
{
|
|
31
|
+
type: 'parent',
|
|
32
|
+
},
|
|
33
|
+
)
|
|
30
34
|
}
|
|
31
35
|
})
|
|
32
36
|
|
|
@@ -35,9 +39,9 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
|
|
|
35
39
|
for (const factKey of factKeys) {
|
|
36
40
|
// Find the first ancestor node with a matching fact key (via modifySet or modifyUnset) by traversing the graph backwards via the parent edges
|
|
37
41
|
const depNode = (() => {
|
|
38
|
-
let currentSeqNumStr = EventSequenceNumber.toString(node.seqNum)
|
|
42
|
+
let currentSeqNumStr = EventSequenceNumber.Client.toString(node.seqNum)
|
|
39
43
|
|
|
40
|
-
while (currentSeqNumStr !== EventSequenceNumber.toString(rootParentNum)) {
|
|
44
|
+
while (currentSeqNumStr !== EventSequenceNumber.Client.toString(rootParentNum)) {
|
|
41
45
|
const parentEdge = dag.inEdges(currentSeqNumStr).find((e) => dag.getEdgeAttribute(e, 'type') === 'parent')
|
|
42
46
|
if (!parentEdge) return null
|
|
43
47
|
|
|
@@ -55,8 +59,8 @@ export const historyDagFromNodes = (dagNodes: HistoryDagNode[], options?: { skip
|
|
|
55
59
|
})()
|
|
56
60
|
|
|
57
61
|
if (depNode) {
|
|
58
|
-
const depNodeIdStr = EventSequenceNumber.toString(depNode.seqNum)
|
|
59
|
-
const nodeIdStr = EventSequenceNumber.toString(node.seqNum)
|
|
62
|
+
const depNodeIdStr = EventSequenceNumber.Client.toString(depNode.seqNum)
|
|
63
|
+
const nodeIdStr = EventSequenceNumber.Client.toString(node.seqNum)
|
|
60
64
|
if (dag.edges(depNodeIdStr, nodeIdStr).filter((e) => dag.getEdgeAttributes(e).type === 'facts').length === 0) {
|
|
61
65
|
dag.addEdge(depNodeIdStr, nodeIdStr, { type: 'facts' })
|
|
62
66
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { EventDef, EventDefFactsSnapshot } from '../../schema/EventDef.ts'
|
|
2
|
-
import * as EventSequenceNumber from '../../schema/EventSequenceNumber.ts'
|
|
3
|
-
import type * as LiveStoreEvent from '../../schema/LiveStoreEvent.ts'
|
|
1
|
+
import type { EventDef, EventDefFactsSnapshot } from '../../schema/EventDef/mod.ts'
|
|
2
|
+
import * as EventSequenceNumber from '../../schema/EventSequenceNumber/mod.ts'
|
|
3
|
+
import type * as LiveStoreEvent from '../../schema/LiveStoreEvent/mod.ts'
|
|
4
4
|
import {
|
|
5
5
|
applyFactGroups,
|
|
6
6
|
type FactValidationResult,
|
|
@@ -19,13 +19,13 @@ export type RebaseInput = {
|
|
|
19
19
|
newRemoteEvents: RebaseEventWithConflict[]
|
|
20
20
|
pendingLocalEvents: RebaseEventWithConflict[]
|
|
21
21
|
validate: (args: {
|
|
22
|
-
rebasedLocalEvents: LiveStoreEvent.
|
|
22
|
+
rebasedLocalEvents: LiveStoreEvent.Input.Decoded[]
|
|
23
23
|
eventDefs: Record<string, EventDef.Any>
|
|
24
24
|
}) => FactValidationResult
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export type RebaseOutput = {
|
|
28
|
-
rebasedLocalEvents: LiveStoreEvent.
|
|
28
|
+
rebasedLocalEvents: LiveStoreEvent.Input.Decoded[]
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
export type RebaseFn = (input: RebaseInput) => RebaseOutput
|
|
@@ -53,7 +53,7 @@ export const rebaseEvents = ({
|
|
|
53
53
|
currentFactsSnapshot: EventDefFactsSnapshot
|
|
54
54
|
clientId: string
|
|
55
55
|
sessionId: string
|
|
56
|
-
}): ReadonlyArray<LiveStoreEvent.
|
|
56
|
+
}): ReadonlyArray<LiveStoreEvent.Client.Decoded> => {
|
|
57
57
|
const initialSnapshot = new Map(currentFactsSnapshot)
|
|
58
58
|
applyFactGroups(
|
|
59
59
|
newRemoteEvents.map((event) => event.factsGroup),
|
|
@@ -94,18 +94,18 @@ export const rebaseEvents = ({
|
|
|
94
94
|
return rebasedLocalEvents.map(
|
|
95
95
|
(event, index) =>
|
|
96
96
|
({
|
|
97
|
-
seqNum: EventSequenceNumber.make({
|
|
97
|
+
seqNum: EventSequenceNumber.Client.Composite.make({
|
|
98
98
|
global: headGlobalId + index + 1,
|
|
99
|
-
client: EventSequenceNumber.
|
|
99
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
100
100
|
}),
|
|
101
|
-
parentSeqNum: EventSequenceNumber.make({
|
|
101
|
+
parentSeqNum: EventSequenceNumber.Client.Composite.make({
|
|
102
102
|
global: headGlobalId + index,
|
|
103
|
-
client: EventSequenceNumber.
|
|
103
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
104
104
|
}),
|
|
105
105
|
name: event.name,
|
|
106
106
|
args: event.args,
|
|
107
107
|
clientId,
|
|
108
108
|
sessionId,
|
|
109
|
-
}) satisfies LiveStoreEvent.
|
|
109
|
+
}) satisfies LiveStoreEvent.Client.Decoded,
|
|
110
110
|
)
|
|
111
111
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { Schema } from '@livestore/utils/effect'
|
|
2
2
|
|
|
3
|
-
import type { EventDef } from '../../../schema/EventDef.ts'
|
|
4
|
-
import { defineEvent, defineFacts } from '../../../schema/EventDef.ts'
|
|
5
|
-
import * as EventSequenceNumber from '../../../schema/EventSequenceNumber.ts'
|
|
3
|
+
import type { EventDef } from '../../../schema/EventDef/mod.ts'
|
|
4
|
+
import { defineEvent, defineFacts } from '../../../schema/EventDef/mod.ts'
|
|
5
|
+
import * as EventSequenceNumber from '../../../schema/EventSequenceNumber/mod.ts'
|
|
6
6
|
import { factsSnapshotForDag, getFactsGroupForEventArgs } from '../facts.ts'
|
|
7
7
|
import { historyDagFromNodes } from '../history-dag.ts'
|
|
8
8
|
import type { HistoryDagNode } from '../history-dag-common.ts'
|
|
9
9
|
import { rootEventNode } from '../history-dag-common.ts'
|
|
10
10
|
|
|
11
11
|
export const printEvent = ({ seqNum, parentSeqNum, factsGroup, ...rest }: HistoryDagNode) => ({
|
|
12
|
-
seqNum: EventSequenceNumber.toString(seqNum),
|
|
13
|
-
parentSeqNum: EventSequenceNumber.toString(parentSeqNum),
|
|
12
|
+
seqNum: EventSequenceNumber.Client.toString(seqNum),
|
|
13
|
+
parentSeqNum: EventSequenceNumber.Client.toString(parentSeqNum),
|
|
14
14
|
...rest,
|
|
15
15
|
facts: factsGroup,
|
|
16
16
|
})
|
|
@@ -140,11 +140,11 @@ export const toEventNodes = (
|
|
|
140
140
|
): HistoryDagNode[] => {
|
|
141
141
|
const nodesAcc: HistoryDagNode[] = [rootEventNode]
|
|
142
142
|
|
|
143
|
-
let currentEventSequenceNumber: EventSequenceNumber.
|
|
143
|
+
let currentEventSequenceNumber: EventSequenceNumber.Client.Composite = EventSequenceNumber.Client.ROOT
|
|
144
144
|
|
|
145
145
|
const eventNodes = partialEvents.map((partialEvent) => {
|
|
146
146
|
const eventDef = eventDefs[partialEvent.name]!
|
|
147
|
-
const eventNum = EventSequenceNumber.nextPair({
|
|
147
|
+
const eventNum = EventSequenceNumber.Client.nextPair({
|
|
148
148
|
seqNum: currentEventSequenceNumber,
|
|
149
149
|
isClient: eventDef.options.clientOnly,
|
|
150
150
|
}).seqNum
|
|
@@ -219,18 +219,18 @@ export const toEventNodes = (
|
|
|
219
219
|
return eventNodes
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
-
const getParentNum = (eventNum: EventSequenceNumber.
|
|
222
|
+
const getParentNum = (eventNum: EventSequenceNumber.Client.Composite): EventSequenceNumber.Client.Composite => {
|
|
223
223
|
const globalParentNum = eventNum.global
|
|
224
224
|
const clientParentNum = eventNum.client - 1
|
|
225
225
|
|
|
226
226
|
if (clientParentNum < 0) {
|
|
227
|
-
return EventSequenceNumber.make({
|
|
227
|
+
return EventSequenceNumber.Client.Composite.make({
|
|
228
228
|
global: globalParentNum - 1,
|
|
229
|
-
client: EventSequenceNumber.
|
|
229
|
+
client: EventSequenceNumber.Client.DEFAULT,
|
|
230
230
|
})
|
|
231
231
|
}
|
|
232
232
|
|
|
233
|
-
return EventSequenceNumber.make({
|
|
233
|
+
return EventSequenceNumber.Client.Composite.make({
|
|
234
234
|
global: globalParentNum,
|
|
235
235
|
client: clientParentNum,
|
|
236
236
|
})
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Effect, KeyValueStore, Option } from '@livestore/utils/effect'
|
|
2
|
-
import {
|
|
2
|
+
import { UnknownError } from '../errors.ts'
|
|
3
3
|
|
|
4
4
|
export const makeBackendIdHelper = Effect.gen(function* () {
|
|
5
5
|
const kv = yield* KeyValueStore.KeyValueStore
|
|
6
6
|
|
|
7
7
|
const backendIdKey = `backendId`
|
|
8
|
-
const backendIdRef = { current: yield* kv.get(backendIdKey).pipe(
|
|
8
|
+
const backendIdRef = { current: yield* kv.get(backendIdKey).pipe(UnknownError.mapToUnknownError) }
|
|
9
9
|
|
|
10
10
|
const setBackendId = (backendId: string) =>
|
|
11
11
|
Effect.gen(function* () {
|
|
@@ -13,7 +13,7 @@ export const makeBackendIdHelper = Effect.gen(function* () {
|
|
|
13
13
|
backendIdRef.current = Option.some(backendId)
|
|
14
14
|
yield* kv.set(backendIdKey, backendId)
|
|
15
15
|
}
|
|
16
|
-
}).pipe(
|
|
16
|
+
}).pipe(UnknownError.mapToUnknownError)
|
|
17
17
|
|
|
18
18
|
return {
|
|
19
19
|
lazySet: setBackendId,
|
package/src/sync/sync-backend.ts
CHANGED
|
@@ -9,8 +9,8 @@ import {
|
|
|
9
9
|
type Stream,
|
|
10
10
|
type SubscriptionRef,
|
|
11
11
|
} from '@livestore/utils/effect'
|
|
12
|
-
import type {
|
|
13
|
-
import type * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
|
|
12
|
+
import type { UnknownError } from '../adapter-types.ts'
|
|
13
|
+
import type * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
|
|
14
14
|
import type { EventSequenceNumber } from '../schema/mod.ts'
|
|
15
15
|
import type { InvalidPullError, InvalidPushError, IsOfflineError } from './errors.ts'
|
|
16
16
|
|
|
@@ -30,7 +30,7 @@ export type SyncBackendConstructor<TSyncMetadata = Schema.JsonValue, TPayload =
|
|
|
30
30
|
args: MakeBackendArgs<TPayload>,
|
|
31
31
|
) => Effect.Effect<
|
|
32
32
|
SyncBackend<TSyncMetadata>,
|
|
33
|
-
|
|
33
|
+
UnknownError,
|
|
34
34
|
Scope.Scope | HttpClient.HttpClient | KeyValueStore.KeyValueStore
|
|
35
35
|
>
|
|
36
36
|
|
|
@@ -45,10 +45,10 @@ export type SyncBackend<TSyncMetadata = Schema.JsonValue> = {
|
|
|
45
45
|
/**
|
|
46
46
|
* Can be implemented to prepare a connection to the sync backend to speed up the first pull/push.
|
|
47
47
|
*/
|
|
48
|
-
connect: Effect.Effect<void, IsOfflineError |
|
|
48
|
+
connect: Effect.Effect<void, IsOfflineError | UnknownError, Scope.Scope>
|
|
49
49
|
pull: (
|
|
50
50
|
cursor: Option.Option<{
|
|
51
|
-
eventSequenceNumber: EventSequenceNumber.
|
|
51
|
+
eventSequenceNumber: EventSequenceNumber.Global.Type
|
|
52
52
|
/** Metadata is needed by some sync backends */
|
|
53
53
|
metadata: Option.Option<TSyncMetadata>
|
|
54
54
|
}>,
|
|
@@ -68,9 +68,9 @@ export type SyncBackend<TSyncMetadata = Schema.JsonValue> = {
|
|
|
68
68
|
* - Number of events: 1-100
|
|
69
69
|
* - sequence numbers must be in ascending order
|
|
70
70
|
* */
|
|
71
|
-
batch: ReadonlyArray<LiveStoreEvent.
|
|
71
|
+
batch: ReadonlyArray<LiveStoreEvent.Global.Encoded>,
|
|
72
72
|
) => Effect.Effect<void, IsOfflineError | InvalidPushError>
|
|
73
|
-
ping: Effect.Effect<void, IsOfflineError |
|
|
73
|
+
ping: Effect.Effect<void, IsOfflineError | UnknownError | Cause.TimeoutException>
|
|
74
74
|
// TODO also expose latency information additionally to whether the backend is connected
|
|
75
75
|
isConnected: SubscriptionRef.SubscriptionRef<boolean>
|
|
76
76
|
/**
|
|
@@ -160,7 +160,7 @@ export const pullResItemEmpty = <TSyncMetadata = Schema.JsonValue>(): PullResIte
|
|
|
160
160
|
|
|
161
161
|
export interface PullResItem<TSyncMetadata = Schema.JsonValue> {
|
|
162
162
|
batch: ReadonlyArray<{
|
|
163
|
-
eventEncoded: LiveStoreEvent.
|
|
163
|
+
eventEncoded: LiveStoreEvent.Global.Encoded
|
|
164
164
|
metadata: Option.Option<TSyncMetadata>
|
|
165
165
|
}>
|
|
166
166
|
pageInfo: PullResPageInfo
|
|
@@ -174,7 +174,7 @@ export const of = <TSyncMetadata = Schema.JsonValue>(obj: SyncBackend<TSyncMetad
|
|
|
174
174
|
export const cursorFromPullResItem = <TSyncMetadata = Schema.JsonValue>(
|
|
175
175
|
item: PullResItem<TSyncMetadata>,
|
|
176
176
|
): Option.Option<{
|
|
177
|
-
eventSequenceNumber: EventSequenceNumber.
|
|
177
|
+
eventSequenceNumber: EventSequenceNumber.Global.Type
|
|
178
178
|
metadata: Option.Option<TSyncMetadata>
|
|
179
179
|
}> => {
|
|
180
180
|
const lastEvent = item.batch.at(-1)
|