@livestore/common 0.4.0-dev.17 → 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 +60 -28
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +12 -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.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +0 -1
- package/dist/schema/state/sqlite/query-builder/impl.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 +18 -1
- package/src/schema/state/sqlite/column-def.ts +73 -30
- 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/query-builder/impl.ts +0 -1
- 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
|
@@ -52,8 +52,8 @@ export class SyncHeadUnsubscribe extends LSDClientSessionReqResMessage('LSD.Clie
|
|
|
52
52
|
subscriptionId: Schema.String,
|
|
53
53
|
}) {}
|
|
54
54
|
export class SyncHeadRes extends LSDClientSessionReqResMessage('LSD.ClientSession.SyncHeadRes', {
|
|
55
|
-
local: EventSequenceNumber.
|
|
56
|
-
upstream: EventSequenceNumber.
|
|
55
|
+
local: EventSequenceNumber.Client.Composite,
|
|
56
|
+
upstream: EventSequenceNumber.Client.Composite,
|
|
57
57
|
subscriptionId: Schema.String,
|
|
58
58
|
}) {}
|
|
59
59
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Schema, Transferable } from '@livestore/utils/effect'
|
|
2
2
|
|
|
3
|
-
import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
|
|
3
|
+
import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
|
|
4
4
|
import { EventSequenceNumber } from '../schema/mod.ts'
|
|
5
5
|
import * as SyncState from '../sync/syncstate.ts'
|
|
6
6
|
import { LeaderReqResMessage, LSDMessage, LSDReqResMessage, NetworkStatus } from './devtools-messages-common.ts'
|
|
@@ -51,7 +51,7 @@ export class SyncHistoryUnsubscribe extends LSDReqResMessage('LSD.Leader.SyncHis
|
|
|
51
51
|
subscriptionId: Schema.String,
|
|
52
52
|
}) {}
|
|
53
53
|
export class SyncHistoryRes extends LSDReqResMessage('LSD.Leader.SyncHistoryRes', {
|
|
54
|
-
eventEncoded: LiveStoreEvent.
|
|
54
|
+
eventEncoded: LiveStoreEvent.Global.Encoded,
|
|
55
55
|
metadata: Schema.Option(Schema.JsonValue),
|
|
56
56
|
subscriptionId: Schema.String,
|
|
57
57
|
}) {}
|
|
@@ -63,8 +63,8 @@ export class SyncHeadUnsubscribe extends LSDReqResMessage('LSD.Leader.SyncHeadUn
|
|
|
63
63
|
subscriptionId: Schema.String,
|
|
64
64
|
}) {}
|
|
65
65
|
export class SyncHeadRes extends LSDReqResMessage('LSD.Leader.SyncHeadRes', {
|
|
66
|
-
local: EventSequenceNumber.
|
|
67
|
-
upstream: EventSequenceNumber.
|
|
66
|
+
local: EventSequenceNumber.Client.Composite,
|
|
67
|
+
upstream: EventSequenceNumber.Client.Composite,
|
|
68
68
|
subscriptionId: Schema.String,
|
|
69
69
|
}) {}
|
|
70
70
|
|
|
@@ -83,7 +83,7 @@ export const LoadDatabaseFile = LeaderReqResMessage('LSD.Leader.LoadDatabaseFile
|
|
|
83
83
|
cause: Schema.Union(
|
|
84
84
|
Schema.TaggedStruct('unsupported-file', {}),
|
|
85
85
|
Schema.TaggedStruct('unsupported-database', {}),
|
|
86
|
-
Schema.TaggedStruct('
|
|
86
|
+
Schema.TaggedStruct('unknown-error', { cause: Schema.Defect }),
|
|
87
87
|
),
|
|
88
88
|
},
|
|
89
89
|
})
|
|
@@ -95,7 +95,7 @@ export class SyncPull extends LSDMessage('LSD.Leader.SyncPull', {
|
|
|
95
95
|
|
|
96
96
|
// TODO refactor this to use push/pull semantics
|
|
97
97
|
export class CommitEventReq extends LSDReqResMessage('LSD.Leader.CommitEventReq', {
|
|
98
|
-
eventEncoded: LiveStoreEvent.
|
|
98
|
+
eventEncoded: LiveStoreEvent.Input.Encoded,
|
|
99
99
|
}) {}
|
|
100
100
|
|
|
101
101
|
export class CommitEventRes extends LSDReqResMessage('LSD.Leader.CommitEventRes', {}) {}
|
|
@@ -133,7 +133,7 @@ export const ResetAllData = LeaderReqResMessage('LSD.Leader.ResetAllData', {
|
|
|
133
133
|
// liveStoreVersion,
|
|
134
134
|
// },
|
|
135
135
|
// success: DatabaseFileInfo,
|
|
136
|
-
// failure:
|
|
136
|
+
// failure: UnknownError,
|
|
137
137
|
// }) {}
|
|
138
138
|
|
|
139
139
|
// export class NetworkStatus_ extends Schema.TaggedRequest<NetworkStatus_>()('LSD.Leader.NetworkStatus', {
|
|
@@ -142,7 +142,7 @@ export const ResetAllData = LeaderReqResMessage('LSD.Leader.ResetAllData', {
|
|
|
142
142
|
// liveStoreVersion,
|
|
143
143
|
// },
|
|
144
144
|
// success: NetworkStatus,
|
|
145
|
-
// failure:
|
|
145
|
+
// failure: UnknownError,
|
|
146
146
|
// }) {}
|
|
147
147
|
|
|
148
148
|
// export const MessageToApp_ = Schema.Union(DatabaseFileInfo_, NetworkStatus_)
|
package/src/errors.ts
CHANGED
|
@@ -1,31 +1,29 @@
|
|
|
1
1
|
import { Cause, Effect, Layer, Schema, Stream } from '@livestore/utils/effect'
|
|
2
2
|
|
|
3
|
-
import * as LiveStoreEvent from './schema/LiveStoreEvent.ts'
|
|
3
|
+
import * as LiveStoreEvent from './schema/LiveStoreEvent/mod.ts'
|
|
4
4
|
|
|
5
|
-
export class
|
|
5
|
+
export class UnknownError extends Schema.TaggedError<UnknownError>()('LiveStore.UnknownError', {
|
|
6
6
|
cause: Schema.Defect,
|
|
7
7
|
note: Schema.optional(Schema.String),
|
|
8
8
|
payload: Schema.optional(Schema.Any),
|
|
9
9
|
}) {
|
|
10
|
-
static
|
|
10
|
+
static mapToUnknownError = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
|
|
11
11
|
effect.pipe(
|
|
12
|
-
Effect.mapError((cause) => (Schema.is(
|
|
13
|
-
Effect.catchAllDefect((cause) => new
|
|
12
|
+
Effect.mapError((cause) => (Schema.is(UnknownError)(cause) ? cause : new UnknownError({ cause }))),
|
|
13
|
+
Effect.catchAllDefect((cause) => new UnknownError({ cause })),
|
|
14
14
|
)
|
|
15
15
|
|
|
16
|
-
static
|
|
16
|
+
static mapToUnknownErrorLayer = <A, E, R>(layer: Layer.Layer<A, E, R>) =>
|
|
17
17
|
layer.pipe(
|
|
18
18
|
Layer.catchAllCause((cause) =>
|
|
19
|
-
Cause.isFailType(cause) && Schema.is(
|
|
19
|
+
Cause.isFailType(cause) && Schema.is(UnknownError)(cause.error)
|
|
20
20
|
? Layer.fail(cause.error)
|
|
21
|
-
: Layer.fail(new
|
|
21
|
+
: Layer.fail(new UnknownError({ cause: cause })),
|
|
22
22
|
),
|
|
23
23
|
)
|
|
24
24
|
|
|
25
|
-
static
|
|
26
|
-
stream.pipe(
|
|
27
|
-
Stream.mapError((cause) => (Schema.is(UnexpectedError)(cause) ? cause : new UnexpectedError({ cause }))),
|
|
28
|
-
)
|
|
25
|
+
static mapToUnknownErrorStream = <A, E, R>(stream: Stream.Stream<A, E, R>) =>
|
|
26
|
+
stream.pipe(Stream.mapError((cause) => (Schema.is(UnknownError)(cause) ? cause : new UnknownError({ cause }))))
|
|
29
27
|
}
|
|
30
28
|
|
|
31
29
|
export class MaterializerHashMismatchError extends Schema.TaggedError<MaterializerHashMismatchError>()(
|
|
@@ -66,7 +64,7 @@ export class SqliteError extends Schema.TaggedError<SqliteError>()('LiveStore.Sq
|
|
|
66
64
|
}) {}
|
|
67
65
|
|
|
68
66
|
export class UnknownEventError extends Schema.TaggedError<UnknownEventError>()('LiveStore.UnknownEventError', {
|
|
69
|
-
event: LiveStoreEvent.
|
|
67
|
+
event: LiveStoreEvent.Client.Encoded.pipe(Schema.pick('name', 'args', 'seqNum', 'clientId', 'sessionId')),
|
|
70
68
|
reason: Schema.Literal('event-definition-missing', 'materializer-missing'),
|
|
71
69
|
operation: Schema.String,
|
|
72
70
|
note: Schema.optional(Schema.String),
|
|
@@ -19,12 +19,7 @@ import {
|
|
|
19
19
|
SubscriptionRef,
|
|
20
20
|
} from '@livestore/utils/effect'
|
|
21
21
|
import type * as otel from '@opentelemetry/api'
|
|
22
|
-
import {
|
|
23
|
-
type IntentionalShutdownCause,
|
|
24
|
-
type MaterializeError,
|
|
25
|
-
type SqliteDb,
|
|
26
|
-
UnexpectedError,
|
|
27
|
-
} from '../adapter-types.ts'
|
|
22
|
+
import { type IntentionalShutdownCause, type MaterializeError, type SqliteDb, UnknownError } from '../adapter-types.ts'
|
|
28
23
|
import { makeMaterializerHash } from '../materializer-helper.ts'
|
|
29
24
|
import type { LiveStoreSchema } from '../schema/mod.ts'
|
|
30
25
|
import { EventSequenceNumber, LiveStoreEvent, resolveEventDef, SystemTables } from '../schema/mod.ts'
|
|
@@ -43,7 +38,7 @@ import type { InitialBlockingSyncContext, LeaderSyncProcessor } from './types.ts
|
|
|
43
38
|
import { LeaderThreadCtx } from './types.ts'
|
|
44
39
|
|
|
45
40
|
type LocalPushQueueItem = [
|
|
46
|
-
event: LiveStoreEvent.EncodedWithMeta,
|
|
41
|
+
event: LiveStoreEvent.Client.EncodedWithMeta,
|
|
47
42
|
deferred: Deferred.Deferred<void, LeaderAheadError> | undefined,
|
|
48
43
|
]
|
|
49
44
|
|
|
@@ -113,15 +108,15 @@ export const makeLeaderSyncProcessor = ({
|
|
|
113
108
|
localPushProcessing?: Effect.Effect<void>
|
|
114
109
|
}
|
|
115
110
|
}
|
|
116
|
-
}): Effect.Effect<LeaderSyncProcessor,
|
|
111
|
+
}): Effect.Effect<LeaderSyncProcessor, UnknownError, Scope.Scope> =>
|
|
117
112
|
Effect.gen(function* () {
|
|
118
|
-
const syncBackendPushQueue = yield* BucketQueue.make<LiveStoreEvent.EncodedWithMeta>()
|
|
113
|
+
const syncBackendPushQueue = yield* BucketQueue.make<LiveStoreEvent.Client.EncodedWithMeta>()
|
|
119
114
|
const localPushBatchSize = params.localPushBatchSize ?? 1
|
|
120
115
|
const backendPushBatchSize = params.backendPushBatchSize ?? 2
|
|
121
116
|
|
|
122
117
|
const syncStateSref = yield* SubscriptionRef.make<SyncState.SyncState | undefined>(undefined)
|
|
123
118
|
|
|
124
|
-
const isClientEvent = (eventEncoded: LiveStoreEvent.EncodedWithMeta) =>
|
|
119
|
+
const isClientEvent = (eventEncoded: LiveStoreEvent.Client.EncodedWithMeta) =>
|
|
125
120
|
schema.eventsDefsMap.get(eventEncoded.name)?.options.clientOnly ?? false
|
|
126
121
|
|
|
127
122
|
const connectedClientSessionPullQueues = yield* makePullQueueSet
|
|
@@ -151,9 +146,9 @@ export const makeLeaderSyncProcessor = ({
|
|
|
151
146
|
*
|
|
152
147
|
* Thus the purpose of the pushHeadRef is the guard the integrity of the local push queue
|
|
153
148
|
*/
|
|
154
|
-
const pushHeadRef = { current: EventSequenceNumber.ROOT }
|
|
155
|
-
const advancePushHead = (eventNum: EventSequenceNumber.
|
|
156
|
-
pushHeadRef.current = EventSequenceNumber.max(pushHeadRef.current, eventNum)
|
|
149
|
+
const pushHeadRef = { current: EventSequenceNumber.Client.ROOT }
|
|
150
|
+
const advancePushHead = (eventNum: EventSequenceNumber.Client.Composite) => {
|
|
151
|
+
pushHeadRef.current = EventSequenceNumber.Client.max(pushHeadRef.current, eventNum)
|
|
157
152
|
}
|
|
158
153
|
|
|
159
154
|
// NOTE: New events are only pushed to sync backend after successful local push processing
|
|
@@ -205,7 +200,7 @@ export const makeLeaderSyncProcessor = ({
|
|
|
205
200
|
sessionId,
|
|
206
201
|
seqNum: syncState.localHead,
|
|
207
202
|
},
|
|
208
|
-
}).pipe(
|
|
203
|
+
}).pipe(UnknownError.mapToUnknownError)
|
|
209
204
|
|
|
210
205
|
if (resolution._tag === 'unknown') {
|
|
211
206
|
// Ignore partial pushes for unrecognised events – they are still
|
|
@@ -213,12 +208,12 @@ export const makeLeaderSyncProcessor = ({
|
|
|
213
208
|
return
|
|
214
209
|
}
|
|
215
210
|
|
|
216
|
-
const eventEncoded = new LiveStoreEvent.EncodedWithMeta({
|
|
211
|
+
const eventEncoded = new LiveStoreEvent.Client.EncodedWithMeta({
|
|
217
212
|
name,
|
|
218
213
|
args,
|
|
219
214
|
clientId,
|
|
220
215
|
sessionId,
|
|
221
|
-
...EventSequenceNumber.nextPair({
|
|
216
|
+
...EventSequenceNumber.Client.nextPair({
|
|
222
217
|
seqNum: syncState.localHead,
|
|
223
218
|
isClient: resolution.eventDef.options.clientOnly,
|
|
224
219
|
}),
|
|
@@ -260,7 +255,7 @@ export const makeLeaderSyncProcessor = ({
|
|
|
260
255
|
|
|
261
256
|
const maybeShutdownOnError = (
|
|
262
257
|
cause: Cause.Cause<
|
|
263
|
-
|
|
|
258
|
+
| UnknownError
|
|
264
259
|
| IntentionalShutdownCause
|
|
265
260
|
| IsOfflineError
|
|
266
261
|
| InvalidPushError
|
|
@@ -279,7 +274,7 @@ export const makeLeaderSyncProcessor = ({
|
|
|
279
274
|
return
|
|
280
275
|
}
|
|
281
276
|
|
|
282
|
-
const errorToSend = Cause.isFailType(cause) ? cause.error :
|
|
277
|
+
const errorToSend = Cause.isFailType(cause) ? cause.error : UnknownError.make({ cause })
|
|
283
278
|
yield* shutdownChannel.send(errorToSend).pipe(Effect.orDie)
|
|
284
279
|
|
|
285
280
|
return yield* Effect.die(cause)
|
|
@@ -411,9 +406,9 @@ const backgroundApplyLocalPushes = ({
|
|
|
411
406
|
localPushesLatch: Effect.Latch
|
|
412
407
|
localPushesQueue: BucketQueue.BucketQueue<LocalPushQueueItem>
|
|
413
408
|
syncStateSref: SubscriptionRef.SubscriptionRef<SyncState.SyncState | undefined>
|
|
414
|
-
syncBackendPushQueue: BucketQueue.BucketQueue<LiveStoreEvent.EncodedWithMeta>
|
|
409
|
+
syncBackendPushQueue: BucketQueue.BucketQueue<LiveStoreEvent.Client.EncodedWithMeta>
|
|
415
410
|
schema: LiveStoreSchema
|
|
416
|
-
isClientEvent: (eventEncoded: LiveStoreEvent.EncodedWithMeta) => boolean
|
|
411
|
+
isClientEvent: (eventEncoded: LiveStoreEvent.Client.EncodedWithMeta) => boolean
|
|
417
412
|
otelSpan: otel.Span | undefined
|
|
418
413
|
connectedClientSessionPullQueues: PullQueueSet
|
|
419
414
|
localPushBatchSize: number
|
|
@@ -459,7 +454,7 @@ const backgroundApplyLocalPushes = ({
|
|
|
459
454
|
*/
|
|
460
455
|
yield* Effect.forEach(
|
|
461
456
|
droppedItems.filter(
|
|
462
|
-
(item): item is [LiveStoreEvent.EncodedWithMeta, Deferred.Deferred<void, LeaderAheadError>] =>
|
|
457
|
+
(item): item is [LiveStoreEvent.Client.EncodedWithMeta, Deferred.Deferred<void, LeaderAheadError>] =>
|
|
463
458
|
item[1] !== undefined,
|
|
464
459
|
),
|
|
465
460
|
([eventEncoded, deferred]) =>
|
|
@@ -484,16 +479,16 @@ const backgroundApplyLocalPushes = ({
|
|
|
484
479
|
syncState,
|
|
485
480
|
payload: { _tag: 'local-push', newEvents },
|
|
486
481
|
isClientEvent,
|
|
487
|
-
isEqualEvent: LiveStoreEvent.isEqualEncoded,
|
|
482
|
+
isEqualEvent: LiveStoreEvent.Client.isEqualEncoded,
|
|
488
483
|
})
|
|
489
484
|
|
|
490
485
|
switch (mergeResult._tag) {
|
|
491
|
-
case '
|
|
492
|
-
otelSpan?.addEvent(`push:
|
|
486
|
+
case 'unknown-error': {
|
|
487
|
+
otelSpan?.addEvent(`push:unknown-error`, {
|
|
493
488
|
batchSize: newEvents.length,
|
|
494
489
|
newEvents: TRACE_VERBOSE ? JSON.stringify(newEvents) : undefined,
|
|
495
490
|
})
|
|
496
|
-
return yield* new
|
|
491
|
+
return yield* new UnknownError({ cause: mergeResult.message })
|
|
497
492
|
}
|
|
498
493
|
case 'rebase': {
|
|
499
494
|
return shouldNeverHappen('The leader thread should never have to rebase due to a local push')
|
|
@@ -578,7 +573,7 @@ const backgroundApplyLocalPushes = ({
|
|
|
578
573
|
})
|
|
579
574
|
|
|
580
575
|
type MaterializeEventsBatch = (_: {
|
|
581
|
-
batchItems: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>
|
|
576
|
+
batchItems: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>
|
|
582
577
|
/**
|
|
583
578
|
* The deferreds are used by the caller to know when the mutation has been processed.
|
|
584
579
|
* Indexes are aligned with `batchItems`
|
|
@@ -640,10 +635,10 @@ const backgroundBackendPulling = ({
|
|
|
640
635
|
connectedClientSessionPullQueues,
|
|
641
636
|
advancePushHead,
|
|
642
637
|
}: {
|
|
643
|
-
isClientEvent: (eventEncoded: LiveStoreEvent.EncodedWithMeta) => boolean
|
|
638
|
+
isClientEvent: (eventEncoded: LiveStoreEvent.Client.EncodedWithMeta) => boolean
|
|
644
639
|
restartBackendPushing: (
|
|
645
|
-
filteredRebasedPending: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>,
|
|
646
|
-
) => Effect.Effect<void,
|
|
640
|
+
filteredRebasedPending: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>,
|
|
641
|
+
) => Effect.Effect<void, UnknownError, LeaderThreadCtx | HttpClient.HttpClient>
|
|
647
642
|
otelSpan: otel.Span | undefined
|
|
648
643
|
syncStateSref: SubscriptionRef.SubscriptionRef<SyncState.SyncState | undefined>
|
|
649
644
|
dbState: SqliteDb
|
|
@@ -653,14 +648,17 @@ const backgroundBackendPulling = ({
|
|
|
653
648
|
devtoolsLatch: Effect.Latch | undefined
|
|
654
649
|
initialBlockingSyncContext: InitialBlockingSyncContext
|
|
655
650
|
connectedClientSessionPullQueues: PullQueueSet
|
|
656
|
-
advancePushHead: (eventNum: EventSequenceNumber.
|
|
651
|
+
advancePushHead: (eventNum: EventSequenceNumber.Client.Composite) => void
|
|
657
652
|
}) =>
|
|
658
653
|
Effect.gen(function* () {
|
|
659
654
|
const { syncBackend, dbState: db, dbEventlog, schema } = yield* LeaderThreadCtx
|
|
660
655
|
|
|
661
656
|
if (syncBackend === undefined) return
|
|
662
657
|
|
|
663
|
-
const onNewPullChunk = (
|
|
658
|
+
const onNewPullChunk = (
|
|
659
|
+
newEvents: LiveStoreEvent.Client.EncodedWithMeta[],
|
|
660
|
+
pageInfo: SyncBackend.PullResPageInfo,
|
|
661
|
+
) =>
|
|
664
662
|
Effect.gen(function* () {
|
|
665
663
|
if (newEvents.length === 0) return
|
|
666
664
|
|
|
@@ -681,18 +679,18 @@ const backgroundBackendPulling = ({
|
|
|
681
679
|
syncState,
|
|
682
680
|
payload: SyncState.PayloadUpstreamAdvance.make({ newEvents }),
|
|
683
681
|
isClientEvent,
|
|
684
|
-
isEqualEvent: LiveStoreEvent.isEqualEncoded,
|
|
682
|
+
isEqualEvent: LiveStoreEvent.Client.isEqualEncoded,
|
|
685
683
|
ignoreClientEvents: true,
|
|
686
684
|
})
|
|
687
685
|
|
|
688
686
|
if (mergeResult._tag === 'reject') {
|
|
689
687
|
return shouldNeverHappen('The leader thread should never reject upstream advances')
|
|
690
|
-
} else if (mergeResult._tag === '
|
|
691
|
-
otelSpan?.addEvent(`pull:
|
|
688
|
+
} else if (mergeResult._tag === 'unknown-error') {
|
|
689
|
+
otelSpan?.addEvent(`pull:unknown-error`, {
|
|
692
690
|
newEventsCount: newEvents.length,
|
|
693
691
|
newEvents: TRACE_VERBOSE ? JSON.stringify(newEvents) : undefined,
|
|
694
692
|
})
|
|
695
|
-
return yield* new
|
|
693
|
+
return yield* new UnknownError({ cause: mergeResult.message })
|
|
696
694
|
}
|
|
697
695
|
|
|
698
696
|
const newBackendHead = newEvents.at(-1)!.seqNum
|
|
@@ -748,10 +746,10 @@ const backgroundBackendPulling = ({
|
|
|
748
746
|
// `newEvents` instead which we filter via `mergeResult.confirmedEvents`
|
|
749
747
|
const confirmedNewEvents = newEvents.filter((event) =>
|
|
750
748
|
mergeResult.confirmedEvents.some((confirmedEvent) =>
|
|
751
|
-
EventSequenceNumber.isEqual(event.seqNum, confirmedEvent.seqNum),
|
|
749
|
+
EventSequenceNumber.Client.isEqual(event.seqNum, confirmedEvent.seqNum),
|
|
752
750
|
),
|
|
753
751
|
)
|
|
754
|
-
yield* Eventlog.updateSyncMetadata(confirmedNewEvents).pipe(
|
|
752
|
+
yield* Eventlog.updateSyncMetadata(confirmedNewEvents).pipe(UnknownError.mapToUnknownError)
|
|
755
753
|
}
|
|
756
754
|
}
|
|
757
755
|
|
|
@@ -792,11 +790,11 @@ const backgroundBackendPulling = ({
|
|
|
792
790
|
yield* SubscriptionRef.waitUntil(syncBackend.isConnected, (isConnected) => isConnected === true)
|
|
793
791
|
yield* onNewPullChunk(
|
|
794
792
|
batch.map((_) =>
|
|
795
|
-
LiveStoreEvent.EncodedWithMeta.fromGlobal(_.eventEncoded, {
|
|
793
|
+
LiveStoreEvent.Client.EncodedWithMeta.fromGlobal(_.eventEncoded, {
|
|
796
794
|
syncMetadata: _.metadata,
|
|
797
795
|
// TODO we can't really know the materializer result here yet beyond the first event batch item as we need to materialize it one by one first
|
|
798
796
|
// This is a bug and needs to be fixed https://github.com/livestorejs/livestore/issues/503#issuecomment-3114533165
|
|
799
|
-
materializerHashLeader: hashMaterializerResult(LiveStoreEvent.
|
|
797
|
+
materializerHashLeader: hashMaterializerResult(LiveStoreEvent.Global.toClientEncoded(_.eventEncoded)),
|
|
800
798
|
materializerHashSession: Option.none(),
|
|
801
799
|
}),
|
|
802
800
|
),
|
|
@@ -819,7 +817,7 @@ const backgroundBackendPushing = ({
|
|
|
819
817
|
devtoolsLatch,
|
|
820
818
|
backendPushBatchSize,
|
|
821
819
|
}: {
|
|
822
|
-
syncBackendPushQueue: BucketQueue.BucketQueue<LiveStoreEvent.EncodedWithMeta>
|
|
820
|
+
syncBackendPushQueue: BucketQueue.BucketQueue<LiveStoreEvent.Client.EncodedWithMeta>
|
|
823
821
|
otelSpan: otel.Span | undefined
|
|
824
822
|
devtoolsLatch: Effect.Latch | undefined
|
|
825
823
|
backendPushBatchSize: number
|
|
@@ -850,9 +848,9 @@ const backgroundBackendPushing = ({
|
|
|
850
848
|
// - Resets automatically after successful push
|
|
851
849
|
// TODO(metrics): expose counters/gauges for retry attempts and queue health via devtools/metrics
|
|
852
850
|
|
|
853
|
-
// Only retry for transient
|
|
851
|
+
// Only retry for transient UnknownError cases
|
|
854
852
|
const isRetryable = (err: InvalidPushError | IsOfflineError) =>
|
|
855
|
-
err._tag === 'InvalidPushError' && err.cause._tag === 'LiveStore.
|
|
853
|
+
err._tag === 'InvalidPushError' && err.cause._tag === 'LiveStore.UnknownError'
|
|
856
854
|
|
|
857
855
|
// Input: InvalidPushError | IsOfflineError, Output: Duration
|
|
858
856
|
const retrySchedule: Schedule.Schedule<Duration.DurationInput, InvalidPushError | IsOfflineError> =
|
|
@@ -894,7 +892,7 @@ const backgroundBackendPushing = ({
|
|
|
894
892
|
}
|
|
895
893
|
}).pipe(Effect.interruptible, Effect.withSpan('@livestore/common:LeaderSyncProcessor:backend-pushing'))
|
|
896
894
|
|
|
897
|
-
const trimChangesetRows = (db: SqliteDb, newHead: EventSequenceNumber.
|
|
895
|
+
const trimChangesetRows = (db: SqliteDb, newHead: EventSequenceNumber.Client.Composite) => {
|
|
898
896
|
// Since we're using the session changeset rows to query for the current head,
|
|
899
897
|
// we're keeping at least one row for the current head, and thus are using `<` instead of `<=`
|
|
900
898
|
db.execute(sql`DELETE FROM ${SystemTables.SESSION_CHANGESET_META_TABLE} WHERE seqNumGlobal < ${newHead.global}`)
|
|
@@ -902,16 +900,16 @@ const trimChangesetRows = (db: SqliteDb, newHead: EventSequenceNumber.EventSeque
|
|
|
902
900
|
|
|
903
901
|
interface PullQueueSet {
|
|
904
902
|
makeQueue: (
|
|
905
|
-
cursor: EventSequenceNumber.
|
|
903
|
+
cursor: EventSequenceNumber.Client.Composite,
|
|
906
904
|
) => Effect.Effect<
|
|
907
905
|
Queue.Queue<{ payload: typeof SyncState.PayloadUpstream.Type }>,
|
|
908
|
-
|
|
906
|
+
UnknownError,
|
|
909
907
|
Scope.Scope | LeaderThreadCtx
|
|
910
908
|
>
|
|
911
909
|
offer: (item: {
|
|
912
910
|
payload: typeof SyncState.PayloadUpstream.Type
|
|
913
|
-
leaderHead: EventSequenceNumber.
|
|
914
|
-
}) => Effect.Effect<void,
|
|
911
|
+
leaderHead: EventSequenceNumber.Client.Composite
|
|
912
|
+
}) => Effect.Effect<void, UnknownError>
|
|
915
913
|
}
|
|
916
914
|
|
|
917
915
|
const makePullQueueSet = Effect.gen(function* () {
|
|
@@ -941,17 +939,17 @@ const makePullQueueSet = Effect.gen(function* () {
|
|
|
941
939
|
|
|
942
940
|
const payloadsSinceCursor = Array.from(cachedPayloads.entries())
|
|
943
941
|
.flatMap(([seqNumStr, payloads]) =>
|
|
944
|
-
payloads.map((payload) => ({ payload, seqNum: EventSequenceNumber.fromString(seqNumStr) })),
|
|
942
|
+
payloads.map((payload) => ({ payload, seqNum: EventSequenceNumber.Client.fromString(seqNumStr) })),
|
|
945
943
|
)
|
|
946
|
-
.filter(({ seqNum }) => EventSequenceNumber.isGreaterThan(seqNum, cursor))
|
|
947
|
-
.toSorted((a, b) => EventSequenceNumber.compare(a.seqNum, b.seqNum))
|
|
944
|
+
.filter(({ seqNum }) => EventSequenceNumber.Client.isGreaterThan(seqNum, cursor))
|
|
945
|
+
.toSorted((a, b) => EventSequenceNumber.Client.compare(a.seqNum, b.seqNum))
|
|
948
946
|
.map(({ payload }) => {
|
|
949
947
|
if (payload._tag === 'upstream-advance') {
|
|
950
948
|
return {
|
|
951
949
|
payload: {
|
|
952
950
|
_tag: 'upstream-advance' as const,
|
|
953
951
|
newEvents: ReadonlyArray.dropWhile(payload.newEvents, (eventEncoded) =>
|
|
954
|
-
EventSequenceNumber.isGreaterThanOrEqual(cursor, eventEncoded.seqNum),
|
|
952
|
+
EventSequenceNumber.Client.isGreaterThanOrEqual(cursor, eventEncoded.seqNum),
|
|
955
953
|
),
|
|
956
954
|
},
|
|
957
955
|
}
|
|
@@ -997,7 +995,7 @@ const makePullQueueSet = Effect.gen(function* () {
|
|
|
997
995
|
|
|
998
996
|
const offer: PullQueueSet['offer'] = (item) =>
|
|
999
997
|
Effect.gen(function* () {
|
|
1000
|
-
const seqNumStr = EventSequenceNumber.toString(item.leaderHead)
|
|
998
|
+
const seqNumStr = EventSequenceNumber.Client.toString(item.leaderHead)
|
|
1001
999
|
if (cachedPayloads.has(seqNumStr)) {
|
|
1002
1000
|
cachedPayloads.get(seqNumStr)!.push(item.payload)
|
|
1003
1001
|
} else {
|
|
@@ -1028,8 +1026,8 @@ const makePullQueueSet = Effect.gen(function* () {
|
|
|
1028
1026
|
* event sits ahead of the current push head.
|
|
1029
1027
|
*/
|
|
1030
1028
|
const validatePushBatch = (
|
|
1031
|
-
batch: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>,
|
|
1032
|
-
pushHead: EventSequenceNumber.
|
|
1029
|
+
batch: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>,
|
|
1030
|
+
pushHead: EventSequenceNumber.Client.Composite,
|
|
1033
1031
|
) =>
|
|
1034
1032
|
Effect.gen(function* () {
|
|
1035
1033
|
if (batch.length === 0) {
|
|
@@ -1041,7 +1039,7 @@ const validatePushBatch = (
|
|
|
1041
1039
|
// monotonic from B’s perspective, but we must reject and force B to rebase locally
|
|
1042
1040
|
// so the leader never regresses.
|
|
1043
1041
|
for (let i = 1; i < batch.length; i++) {
|
|
1044
|
-
if (EventSequenceNumber.isGreaterThanOrEqual(batch[i - 1]!.seqNum, batch[i]!.seqNum)) {
|
|
1042
|
+
if (EventSequenceNumber.Client.isGreaterThanOrEqual(batch[i - 1]!.seqNum, batch[i]!.seqNum)) {
|
|
1045
1043
|
return yield* LeaderAheadError.make({
|
|
1046
1044
|
minimumExpectedNum: batch[i - 1]!.seqNum,
|
|
1047
1045
|
providedNum: batch[i]!.seqNum,
|
|
@@ -1050,7 +1048,7 @@ const validatePushBatch = (
|
|
|
1050
1048
|
}
|
|
1051
1049
|
|
|
1052
1050
|
// Make sure smallest sequence number is > pushHead
|
|
1053
|
-
if (EventSequenceNumber.isGreaterThanOrEqual(pushHead, batch[0]!.seqNum)) {
|
|
1051
|
+
if (EventSequenceNumber.Client.isGreaterThanOrEqual(pushHead, batch[0]!.seqNum)) {
|
|
1054
1052
|
return yield* LeaderAheadError.make({
|
|
1055
1053
|
minimumExpectedNum: pushHead,
|
|
1056
1054
|
providedNum: batch[0]!.seqNum,
|
|
@@ -2,8 +2,8 @@ import { LS_DEV, shouldNeverHappen } from '@livestore/utils'
|
|
|
2
2
|
import { Effect, Option, Schema } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
4
|
import type { SqliteDb } from '../adapter-types.ts'
|
|
5
|
-
import * as EventSequenceNumber from '../schema/EventSequenceNumber.ts'
|
|
6
|
-
import * as LiveStoreEvent from '../schema/LiveStoreEvent.ts'
|
|
5
|
+
import * as EventSequenceNumber from '../schema/EventSequenceNumber/mod.ts'
|
|
6
|
+
import * as LiveStoreEvent from '../schema/LiveStoreEvent/mod.ts'
|
|
7
7
|
import {
|
|
8
8
|
EVENTLOG_META_TABLE,
|
|
9
9
|
eventlogMetaTable,
|
|
@@ -34,7 +34,7 @@ export const initEventlogDb = (dbEventlog: SqliteDb) =>
|
|
|
34
34
|
yield* execSql(
|
|
35
35
|
dbEventlog,
|
|
36
36
|
sql`INSERT INTO ${SYNC_STATUS_TABLE} (head)
|
|
37
|
-
SELECT ${EventSequenceNumber.ROOT.global}
|
|
37
|
+
SELECT ${EventSequenceNumber.Client.ROOT.global}
|
|
38
38
|
WHERE NOT EXISTS (SELECT 1 FROM ${SYNC_STATUS_TABLE})`,
|
|
39
39
|
{},
|
|
40
40
|
)
|
|
@@ -51,8 +51,8 @@ export const getEventsSince = ({
|
|
|
51
51
|
}: {
|
|
52
52
|
dbEventlog: SqliteDb
|
|
53
53
|
dbState: SqliteDb
|
|
54
|
-
since: EventSequenceNumber.
|
|
55
|
-
}): ReadonlyArray<LiveStoreEvent.EncodedWithMeta> => {
|
|
54
|
+
since: EventSequenceNumber.Client.Composite
|
|
55
|
+
}): ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta> => {
|
|
56
56
|
const pendingEvents = dbEventlog.select(eventlogMetaTable.where('seqNumGlobal', '>=', since.global))
|
|
57
57
|
|
|
58
58
|
const sessionChangesetRowsDecoded = dbState.select(
|
|
@@ -66,7 +66,7 @@ export const getEventsSince = ({
|
|
|
66
66
|
readModelEvent.seqNumGlobal === eventlogEvent.seqNumGlobal &&
|
|
67
67
|
readModelEvent.seqNumClient === eventlogEvent.seqNumClient,
|
|
68
68
|
)
|
|
69
|
-
return LiveStoreEvent.EncodedWithMeta.make({
|
|
69
|
+
return LiveStoreEvent.Client.EncodedWithMeta.make({
|
|
70
70
|
name: eventlogEvent.name,
|
|
71
71
|
args: eventlogEvent.argsJson,
|
|
72
72
|
seqNum: {
|
|
@@ -96,14 +96,14 @@ export const getEventsSince = ({
|
|
|
96
96
|
},
|
|
97
97
|
})
|
|
98
98
|
})
|
|
99
|
-
.filter((_) => EventSequenceNumber.compare(_.seqNum, since) > 0)
|
|
100
|
-
.sort((a, b) => EventSequenceNumber.compare(a.seqNum, b.seqNum))
|
|
99
|
+
.filter((_) => EventSequenceNumber.Client.compare(_.seqNum, since) > 0)
|
|
100
|
+
.sort((a, b) => EventSequenceNumber.Client.compare(a.seqNum, b.seqNum))
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
export const getClientHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.
|
|
103
|
+
export const getClientHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.Client.Composite => {
|
|
104
104
|
const res = dbEventlog.select<{
|
|
105
|
-
seqNumGlobal: EventSequenceNumber.
|
|
106
|
-
seqNumClient: EventSequenceNumber.
|
|
105
|
+
seqNumGlobal: EventSequenceNumber.Global.Type
|
|
106
|
+
seqNumClient: EventSequenceNumber.Client.Type
|
|
107
107
|
seqNumRebaseGeneration: number
|
|
108
108
|
}>(
|
|
109
109
|
sql`select seqNumGlobal, seqNumClient, seqNumRebaseGeneration from ${EVENTLOG_META_TABLE} order by seqNumGlobal DESC, seqNumClient DESC limit 1`,
|
|
@@ -111,16 +111,15 @@ export const getClientHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.E
|
|
|
111
111
|
|
|
112
112
|
return res
|
|
113
113
|
? { global: res.seqNumGlobal, client: res.seqNumClient, rebaseGeneration: res.seqNumRebaseGeneration }
|
|
114
|
-
: EventSequenceNumber.ROOT
|
|
114
|
+
: EventSequenceNumber.Client.ROOT
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
export const getBackendHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.
|
|
118
|
-
dbEventlog.select<{ head: EventSequenceNumber.
|
|
119
|
-
|
|
120
|
-
)[0]?.head ?? EventSequenceNumber.ROOT.global
|
|
117
|
+
export const getBackendHeadFromDb = (dbEventlog: SqliteDb): EventSequenceNumber.Global.Type =>
|
|
118
|
+
dbEventlog.select<{ head: EventSequenceNumber.Global.Type }>(sql`select head from ${SYNC_STATUS_TABLE}`)[0]?.head ??
|
|
119
|
+
EventSequenceNumber.Client.ROOT.global
|
|
121
120
|
|
|
122
121
|
// TODO use prepared statements
|
|
123
|
-
export const updateBackendHead = (dbEventlog: SqliteDb, head: EventSequenceNumber.
|
|
122
|
+
export const updateBackendHead = (dbEventlog: SqliteDb, head: EventSequenceNumber.Client.Composite) =>
|
|
124
123
|
dbEventlog.execute(sql`UPDATE ${SYNC_STATUS_TABLE} SET head = ${head.global}`)
|
|
125
124
|
|
|
126
125
|
export const getBackendIdFromDb = (dbEventlog: SqliteDb): Option.Option<string> =>
|
|
@@ -132,7 +131,7 @@ export const updateBackendId = (dbEventlog: SqliteDb, backendId: string) =>
|
|
|
132
131
|
dbEventlog.execute(sql`UPDATE ${SYNC_STATUS_TABLE} SET backendId = '${backendId}'`)
|
|
133
132
|
|
|
134
133
|
export const insertIntoEventlog = (
|
|
135
|
-
eventEncoded: LiveStoreEvent.EncodedWithMeta,
|
|
134
|
+
eventEncoded: LiveStoreEvent.Client.EncodedWithMeta,
|
|
136
135
|
dbEventlog: SqliteDb,
|
|
137
136
|
eventDefSchemaHash: number,
|
|
138
137
|
clientId: string,
|
|
@@ -140,7 +139,7 @@ export const insertIntoEventlog = (
|
|
|
140
139
|
) =>
|
|
141
140
|
Effect.gen(function* () {
|
|
142
141
|
// Check history consistency during LS_DEV
|
|
143
|
-
if (LS_DEV && eventEncoded.parentSeqNum.global !== EventSequenceNumber.ROOT.global) {
|
|
142
|
+
if (LS_DEV && eventEncoded.parentSeqNum.global !== EventSequenceNumber.Client.ROOT.global) {
|
|
144
143
|
const parentEventExists =
|
|
145
144
|
dbEventlog.select<{ count: number }>(
|
|
146
145
|
`SELECT COUNT(*) as count FROM ${EVENTLOG_META_TABLE} WHERE seqNumGlobal = ? AND seqNumClient = ?`,
|
|
@@ -180,7 +179,7 @@ export const insertIntoEventlog = (
|
|
|
180
179
|
dbEventlog.debug.head = eventEncoded.seqNum
|
|
181
180
|
})
|
|
182
181
|
|
|
183
|
-
export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.EncodedWithMeta>) =>
|
|
182
|
+
export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.Client.EncodedWithMeta>) =>
|
|
184
183
|
Effect.gen(function* () {
|
|
185
184
|
const { dbEventlog } = yield* LeaderThreadCtx
|
|
186
185
|
|
|
@@ -200,15 +199,11 @@ export const updateSyncMetadata = (items: ReadonlyArray<LiveStoreEvent.EncodedWi
|
|
|
200
199
|
}
|
|
201
200
|
})
|
|
202
201
|
|
|
203
|
-
export const getSyncBackendCursorInfo = ({
|
|
204
|
-
remoteHead,
|
|
205
|
-
}: {
|
|
206
|
-
remoteHead: EventSequenceNumber.GlobalEventSequenceNumber
|
|
207
|
-
}) =>
|
|
202
|
+
export const getSyncBackendCursorInfo = ({ remoteHead }: { remoteHead: EventSequenceNumber.Global.Type }) =>
|
|
208
203
|
Effect.gen(function* () {
|
|
209
204
|
const { dbEventlog } = yield* LeaderThreadCtx
|
|
210
205
|
|
|
211
|
-
if (remoteHead === EventSequenceNumber.ROOT.global) return Option.none()
|
|
206
|
+
if (remoteHead === EventSequenceNumber.Client.ROOT.global) return Option.none()
|
|
212
207
|
|
|
213
208
|
const EventlogQuerySchema = Schema.Struct({
|
|
214
209
|
syncMetadataJson: Schema.parseJson(Schema.Option(Schema.JsonValue)),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect, FiberMap, Option, Stream, SubscriptionRef } from '@livestore/utils/effect'
|
|
2
2
|
import { nanoid } from '@livestore/utils/nanoid'
|
|
3
3
|
|
|
4
|
-
import { Devtools, IntentionalShutdownCause, liveStoreVersion,
|
|
4
|
+
import { Devtools, IntentionalShutdownCause, liveStoreVersion, UnknownError } from '../index.ts'
|
|
5
5
|
import { SystemTables } from '../schema/mod.ts'
|
|
6
6
|
import type { DevtoolsOptions, PersistenceInfoPair } from './types.ts'
|
|
7
7
|
import { LeaderThreadCtx } from './types.ts'
|
|
@@ -184,7 +184,7 @@ const listenToDevtools = ({
|
|
|
184
184
|
sendMessage(
|
|
185
185
|
Devtools.Leader.LoadDatabaseFile.Error.make({
|
|
186
186
|
...reqPayload,
|
|
187
|
-
cause: { _tag: '
|
|
187
|
+
cause: { _tag: 'unknown-error' as const, cause },
|
|
188
188
|
}),
|
|
189
189
|
),
|
|
190
190
|
),
|
|
@@ -391,7 +391,7 @@ const listenToDevtools = ({
|
|
|
391
391
|
}
|
|
392
392
|
}).pipe(Effect.withSpan(`@livestore/common:leader-thread:onDevtoolsMessage:${decodedEvent._tag}`)),
|
|
393
393
|
),
|
|
394
|
-
|
|
394
|
+
UnknownError.mapToUnknownErrorStream,
|
|
395
395
|
Stream.runDrain,
|
|
396
396
|
)
|
|
397
397
|
})
|