@livestore/sync-cf 0.4.0 → 0.5.0-dev.1
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/README.md +5 -5
- package/dist/.tsbuildinfo +1 -1
- package/dist/cf-worker/do/durable-object.d.ts.map +1 -1
- package/dist/cf-worker/do/durable-object.js +53 -36
- package/dist/cf-worker/do/durable-object.js.map +1 -1
- package/dist/cf-worker/do/layer.d.ts +22 -18
- package/dist/cf-worker/do/layer.d.ts.map +1 -1
- package/dist/cf-worker/do/layer.js +45 -35
- package/dist/cf-worker/do/layer.js.map +1 -1
- package/dist/cf-worker/do/observability.d.ts +23 -0
- package/dist/cf-worker/do/observability.d.ts.map +1 -0
- package/dist/cf-worker/do/observability.js +52 -0
- package/dist/cf-worker/do/observability.js.map +1 -0
- package/dist/cf-worker/do/observability.test.d.ts +2 -0
- package/dist/cf-worker/do/observability.test.d.ts.map +1 -0
- package/dist/cf-worker/do/observability.test.js +204 -0
- package/dist/cf-worker/do/observability.test.js.map +1 -0
- package/dist/cf-worker/do/pull.d.ts +3 -3
- package/dist/cf-worker/do/pull.d.ts.map +1 -1
- package/dist/cf-worker/do/pull.js +19 -20
- package/dist/cf-worker/do/pull.js.map +1 -1
- package/dist/cf-worker/do/push.d.ts +16 -3
- package/dist/cf-worker/do/push.d.ts.map +1 -1
- package/dist/cf-worker/do/push.js +74 -53
- package/dist/cf-worker/do/push.js.map +1 -1
- package/dist/cf-worker/do/push.test.d.ts +2 -0
- package/dist/cf-worker/do/push.test.d.ts.map +1 -0
- package/dist/cf-worker/do/push.test.js +30 -0
- package/dist/cf-worker/do/push.test.js.map +1 -0
- package/dist/cf-worker/do/sqlite.d.ts +34 -46
- package/dist/cf-worker/do/sqlite.d.ts.map +1 -1
- package/dist/cf-worker/do/sqlite.js +2 -2
- package/dist/cf-worker/do/sqlite.js.map +1 -1
- package/dist/cf-worker/do/sync-storage.d.ts +7 -6
- package/dist/cf-worker/do/sync-storage.d.ts.map +1 -1
- package/dist/cf-worker/do/sync-storage.js +29 -17
- package/dist/cf-worker/do/sync-storage.js.map +1 -1
- package/dist/cf-worker/do/transport/do-rpc-server.d.ts +17 -2
- package/dist/cf-worker/do/transport/do-rpc-server.d.ts.map +1 -1
- package/dist/cf-worker/do/transport/do-rpc-server.js +41 -23
- package/dist/cf-worker/do/transport/do-rpc-server.js.map +1 -1
- package/dist/cf-worker/do/transport/do-rpc-server.test.d.ts +2 -0
- package/dist/cf-worker/do/transport/do-rpc-server.test.d.ts.map +1 -0
- package/dist/cf-worker/do/transport/do-rpc-server.test.js +28 -0
- package/dist/cf-worker/do/transport/do-rpc-server.test.js.map +1 -0
- package/dist/cf-worker/do/transport/http-rpc-server.d.ts +2 -2
- package/dist/cf-worker/do/transport/http-rpc-server.d.ts.map +1 -1
- package/dist/cf-worker/do/transport/http-rpc-server.js +12 -12
- package/dist/cf-worker/do/transport/http-rpc-server.js.map +1 -1
- package/dist/cf-worker/do/transport/ws-rpc-server.d.ts +9 -2
- package/dist/cf-worker/do/transport/ws-rpc-server.d.ts.map +1 -1
- package/dist/cf-worker/do/transport/ws-rpc-server.js +37 -29
- package/dist/cf-worker/do/transport/ws-rpc-server.js.map +1 -1
- package/dist/cf-worker/mod.js +3 -3
- package/dist/cf-worker/shared.d.ts +37 -29
- package/dist/cf-worker/shared.d.ts.map +1 -1
- package/dist/cf-worker/shared.js +14 -12
- package/dist/cf-worker/shared.js.map +1 -1
- package/dist/cf-worker/worker.d.ts +9 -9
- package/dist/cf-worker/worker.d.ts.map +1 -1
- package/dist/cf-worker/worker.js +17 -15
- package/dist/cf-worker/worker.js.map +1 -1
- package/dist/client/mod.js +3 -3
- package/dist/client/transport/do-rpc-client.d.ts +18 -6
- package/dist/client/transport/do-rpc-client.d.ts.map +1 -1
- package/dist/client/transport/do-rpc-client.js +112 -38
- package/dist/client/transport/do-rpc-client.js.map +1 -1
- package/dist/client/transport/do-rpc-client.test.d.ts +2 -0
- package/dist/client/transport/do-rpc-client.test.d.ts.map +1 -0
- package/dist/client/transport/do-rpc-client.test.js +268 -0
- package/dist/client/transport/do-rpc-client.test.js.map +1 -0
- package/dist/client/transport/http-rpc-client.d.ts +3 -3
- package/dist/client/transport/http-rpc-client.d.ts.map +1 -1
- package/dist/client/transport/http-rpc-client.js +48 -29
- package/dist/client/transport/http-rpc-client.js.map +1 -1
- package/dist/client/transport/rpc-client-error.d.ts +5 -0
- package/dist/client/transport/rpc-client-error.d.ts.map +1 -0
- package/dist/client/transport/rpc-client-error.js +8 -0
- package/dist/client/transport/rpc-client-error.js.map +1 -0
- package/dist/client/transport/rpc-client-error.test.d.ts +2 -0
- package/dist/client/transport/rpc-client-error.test.d.ts.map +1 -0
- package/dist/client/transport/rpc-client-error.test.js +33 -0
- package/dist/client/transport/rpc-client-error.test.js.map +1 -0
- package/dist/client/transport/ws-rpc-client.d.ts +3 -3
- package/dist/client/transport/ws-rpc-client.d.ts.map +1 -1
- package/dist/client/transport/ws-rpc-client.js +33 -23
- package/dist/client/transport/ws-rpc-client.js.map +1 -1
- package/dist/common/do-rpc-schema.d.ts +53 -41
- package/dist/common/do-rpc-schema.d.ts.map +1 -1
- package/dist/common/do-rpc-schema.js +13 -4
- package/dist/common/do-rpc-schema.js.map +1 -1
- package/dist/common/http-rpc-schema.d.ts +38 -39
- package/dist/common/http-rpc-schema.d.ts.map +1 -1
- package/dist/common/http-rpc-schema.js +6 -6
- package/dist/common/http-rpc-schema.js.map +1 -1
- package/dist/common/mod.d.ts +5 -5
- package/dist/common/mod.d.ts.map +1 -1
- package/dist/common/mod.js +7 -7
- package/dist/common/mod.js.map +1 -1
- package/dist/common/sync-message-types.d.ts +116 -133
- package/dist/common/sync-message-types.d.ts.map +1 -1
- package/dist/common/sync-message-types.js +26 -14
- package/dist/common/sync-message-types.js.map +1 -1
- package/dist/common/ws-rpc-schema.d.ts +33 -34
- package/dist/common/ws-rpc-schema.d.ts.map +1 -1
- package/dist/common/ws-rpc-schema.js +5 -5
- package/dist/common/ws-rpc-schema.js.map +1 -1
- package/package.json +42 -58
- package/src/cf-worker/do/durable-object.ts +70 -64
- package/src/cf-worker/do/layer.ts +142 -99
- package/src/cf-worker/do/observability.test.ts +337 -0
- package/src/cf-worker/do/observability.ts +121 -0
- package/src/cf-worker/do/pull.ts +28 -28
- package/src/cf-worker/do/push.test.ts +40 -0
- package/src/cf-worker/do/push.ts +139 -115
- package/src/cf-worker/do/sqlite.ts +1 -1
- package/src/cf-worker/do/sync-storage.ts +34 -21
- package/src/cf-worker/do/transport/do-rpc-server.test.ts +32 -0
- package/src/cf-worker/do/transport/do-rpc-server.ts +46 -35
- package/src/cf-worker/do/transport/http-rpc-server.ts +7 -10
- package/src/cf-worker/do/transport/ws-rpc-server.ts +52 -28
- package/src/cf-worker/shared.ts +29 -17
- package/src/cf-worker/worker.ts +21 -22
- package/src/client/transport/do-rpc-client.test.ts +411 -0
- package/src/client/transport/do-rpc-client.ts +175 -51
- package/src/client/transport/http-rpc-client.ts +66 -45
- package/src/client/transport/rpc-client-error.test.ts +41 -0
- package/src/client/transport/rpc-client-error.ts +9 -0
- package/src/client/transport/ws-rpc-client.ts +40 -32
- package/src/common/do-rpc-schema.ts +13 -3
- package/src/common/http-rpc-schema.ts +5 -5
- package/src/common/mod.ts +4 -4
- package/src/common/sync-message-types.ts +16 -16
- package/src/common/ws-rpc-schema.ts +4 -4
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SyncBackend, UnknownError } from '@livestore/common'
|
|
2
2
|
import type { LiveStoreEvent } from '@livestore/common/schema'
|
|
3
|
-
import {
|
|
4
|
-
import { omit } from '@livestore/utils'
|
|
3
|
+
import { splitArrayBySize } from '@livestore/common/sync'
|
|
5
4
|
import {
|
|
6
|
-
|
|
7
|
-
type Duration,
|
|
5
|
+
Duration,
|
|
8
6
|
Effect,
|
|
9
7
|
Layer,
|
|
10
8
|
Option,
|
|
9
|
+
ReadonlyArray as EffectArray,
|
|
11
10
|
RpcClient,
|
|
12
11
|
RpcSerialization,
|
|
13
12
|
Schedule,
|
|
@@ -15,6 +14,7 @@ import {
|
|
|
15
14
|
type Scope,
|
|
16
15
|
Socket,
|
|
17
16
|
Stream,
|
|
17
|
+
Struct,
|
|
18
18
|
SubscriptionRef,
|
|
19
19
|
UrlParams,
|
|
20
20
|
} from '@livestore/utils/effect'
|
|
@@ -24,6 +24,7 @@ import { MAX_PUSH_EVENTS_PER_REQUEST, MAX_WS_MESSAGE_BYTES } from '../../common/
|
|
|
24
24
|
import { SearchParamsSchema } from '../../common/mod.ts'
|
|
25
25
|
import type { SyncMetadata } from '../../common/sync-message-types.ts'
|
|
26
26
|
import { SyncWsRpc } from '../../common/ws-rpc-schema.ts'
|
|
27
|
+
import { mapRpcClientError } from './rpc-client-error.ts'
|
|
27
28
|
|
|
28
29
|
export interface WsSyncOptions {
|
|
29
30
|
/**
|
|
@@ -48,12 +49,12 @@ export interface WsSyncOptions {
|
|
|
48
49
|
* How long to wait for a ping response before timing out
|
|
49
50
|
* @default 10 seconds
|
|
50
51
|
*/
|
|
51
|
-
requestTimeout?: Duration.
|
|
52
|
+
requestTimeout?: Duration.Input
|
|
52
53
|
/**
|
|
53
54
|
* How often to send ping requests
|
|
54
55
|
* @default 10 seconds
|
|
55
56
|
*/
|
|
56
|
-
requestInterval?: Duration.
|
|
57
|
+
requestInterval?: Duration.Input
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
|
|
@@ -70,7 +71,7 @@ export const makeWsSync =
|
|
|
70
71
|
(options: WsSyncOptions): SyncBackend.SyncBackendConstructor<SyncMetadata> =>
|
|
71
72
|
({ storeId, payload }) =>
|
|
72
73
|
Effect.gen(function* () {
|
|
73
|
-
const urlParamsData = yield* Schema.
|
|
74
|
+
const urlParamsData = yield* Schema.encodeEffect(SearchParamsSchema)({
|
|
74
75
|
storeId,
|
|
75
76
|
payload,
|
|
76
77
|
transport: 'ws',
|
|
@@ -89,7 +90,7 @@ export const makeWsSync =
|
|
|
89
90
|
// }
|
|
90
91
|
// TODO bring this back in a cross-platform way
|
|
91
92
|
// if (navigator.onLine === false) {
|
|
92
|
-
// yield* Effect.
|
|
93
|
+
// yield* Effect.callback((cb) => self.addEventListener('online', () => cb(Effect.void)))
|
|
93
94
|
// }
|
|
94
95
|
|
|
95
96
|
const pingInterval = options.ping?.requestInterval ?? 10_000
|
|
@@ -97,10 +98,10 @@ export const makeWsSync =
|
|
|
97
98
|
const ProtocolLive = RpcClient.layerProtocolSocketWithIsConnected({
|
|
98
99
|
isConnected,
|
|
99
100
|
retryTransientErrors: Schedule.exponential('1 seconds').pipe(
|
|
100
|
-
Schedule.
|
|
101
|
+
Schedule.modifyDelay(({ duration }) => Effect.succeed(Duration.min(duration, Duration.seconds(30)))),
|
|
101
102
|
Schedule.jittered,
|
|
102
103
|
),
|
|
103
|
-
pingSchedule: Schedule.
|
|
104
|
+
pingSchedule: Schedule.recurs(1).pipe(Schedule.concat(Schedule.fixed(pingInterval))),
|
|
104
105
|
url: wsUrl,
|
|
105
106
|
}).pipe(
|
|
106
107
|
Layer.provide(Socket.layerWebSocket(wsUrl)),
|
|
@@ -121,8 +122,10 @@ export const makeWsSync =
|
|
|
121
122
|
yield* pinger.ping
|
|
122
123
|
yield* SubscriptionRef.set(isConnected, true)
|
|
123
124
|
}).pipe(
|
|
124
|
-
Effect.
|
|
125
|
-
|
|
125
|
+
Effect.timeoutOrElse({
|
|
126
|
+
duration: pingTimeout,
|
|
127
|
+
orElse: () => SubscriptionRef.set(isConnected, false),
|
|
128
|
+
}),
|
|
126
129
|
UnknownError.mapToUnknownError,
|
|
127
130
|
Effect.withSpan('ping'),
|
|
128
131
|
)
|
|
@@ -133,7 +136,7 @@ export const makeWsSync =
|
|
|
133
136
|
isConnected,
|
|
134
137
|
connect: ping,
|
|
135
138
|
pull: (cursor, options) =>
|
|
136
|
-
rpcClient
|
|
139
|
+
rpcClient['SyncWsRpc.Pull']({
|
|
137
140
|
storeId,
|
|
138
141
|
payload,
|
|
139
142
|
cursor: cursor.pipe(
|
|
@@ -145,10 +148,10 @@ export const makeWsSync =
|
|
|
145
148
|
live: options?.live === true,
|
|
146
149
|
}).pipe(
|
|
147
150
|
Stream.tap((res) => backendIdHelper.lazySet(res.backendId)),
|
|
148
|
-
Stream.map((res) => omit(res, ['backendId'])),
|
|
151
|
+
Stream.map((res) => Struct.omit(res, ['backendId'])),
|
|
149
152
|
Stream.mapError((cause) =>
|
|
150
|
-
cause._tag === 'RpcClientError'
|
|
151
|
-
?
|
|
153
|
+
cause._tag === 'RpcClientError'
|
|
154
|
+
? mapRpcClientError(cause)
|
|
152
155
|
: cause._tag === 'UnknownError' || cause._tag === 'BackendIdMismatchError'
|
|
153
156
|
? cause
|
|
154
157
|
: new UnknownError({ cause }),
|
|
@@ -166,26 +169,31 @@ export const makeWsSync =
|
|
|
166
169
|
backendId: backendIdHelper.get(),
|
|
167
170
|
})
|
|
168
171
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
172
|
+
if (EffectArray.isReadonlyArrayNonEmpty(batch) === false) {
|
|
173
|
+
return
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const batchChunks = yield* splitArrayBySize({
|
|
177
|
+
maxItems: MAX_PUSH_EVENTS_PER_REQUEST,
|
|
178
|
+
maxBytes: MAX_WS_MESSAGE_BYTES,
|
|
179
|
+
encode: encodePayload,
|
|
180
|
+
})(batch).pipe(Effect.mapError((cause) => new UnknownError({ cause })))
|
|
181
|
+
|
|
182
|
+
for (const batchChunk of batchChunks) {
|
|
183
|
+
yield* rpcClient['SyncWsRpc.Push']({
|
|
180
184
|
storeId,
|
|
181
185
|
payload,
|
|
182
|
-
batch:
|
|
186
|
+
batch: batchChunk,
|
|
183
187
|
backendId: backendIdHelper.get(),
|
|
184
188
|
}).pipe(
|
|
185
189
|
Effect.mapError((cause) =>
|
|
186
|
-
cause._tag === '
|
|
187
|
-
? cause
|
|
188
|
-
:
|
|
190
|
+
cause._tag === 'RpcClientError'
|
|
191
|
+
? mapRpcClientError(cause)
|
|
192
|
+
: cause._tag === 'UnknownError' ||
|
|
193
|
+
cause._tag === 'ServerAheadError' ||
|
|
194
|
+
cause._tag === 'BackendIdMismatchError'
|
|
195
|
+
? cause
|
|
196
|
+
: new UnknownError({ cause }),
|
|
189
197
|
),
|
|
190
198
|
)
|
|
191
199
|
}
|
|
@@ -11,7 +11,7 @@ const commonPayloadFields = {
|
|
|
11
11
|
*/
|
|
12
12
|
storeId: Schema.String,
|
|
13
13
|
/** Needed for various reasons (e.g. auth) */
|
|
14
|
-
payload: Schema.optional(Schema.
|
|
14
|
+
payload: Schema.optional(Schema.Json),
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export class SyncDoRpc extends RpcGroup.make(
|
|
@@ -35,7 +35,7 @@ export class SyncDoRpc extends RpcGroup.make(
|
|
|
35
35
|
rpcRequestId: Schema.String,
|
|
36
36
|
...SyncMessage.PullResponse.fields,
|
|
37
37
|
}),
|
|
38
|
-
error: Schema.Union(UnknownError, BackendIdMismatchError),
|
|
38
|
+
error: Schema.Union([UnknownError, BackendIdMismatchError]),
|
|
39
39
|
stream: true,
|
|
40
40
|
}),
|
|
41
41
|
Rpc.make('SyncDoRpc.Push', {
|
|
@@ -44,7 +44,7 @@ export class SyncDoRpc extends RpcGroup.make(
|
|
|
44
44
|
...commonPayloadFields,
|
|
45
45
|
},
|
|
46
46
|
success: SyncMessage.PushAck,
|
|
47
|
-
error: Schema.Union(UnknownError, ServerAheadError, BackendIdMismatchError),
|
|
47
|
+
error: Schema.Union([UnknownError, ServerAheadError, BackendIdMismatchError]),
|
|
48
48
|
}),
|
|
49
49
|
Rpc.make('SyncDoRpc.Ping', {
|
|
50
50
|
payload: {
|
|
@@ -52,4 +52,14 @@ export class SyncDoRpc extends RpcGroup.make(
|
|
|
52
52
|
},
|
|
53
53
|
success: Schema.Void,
|
|
54
54
|
}),
|
|
55
|
+
Rpc.make('SyncDoRpc.Unsubscribe', {
|
|
56
|
+
payload: {
|
|
57
|
+
/** Client DO id whose live-pull subscription row to drop. */
|
|
58
|
+
durableObjectId: Schema.String,
|
|
59
|
+
/** Request id of the live pull that registered the row; the row is only dropped if it still matches. */
|
|
60
|
+
requestId: Schema.String,
|
|
61
|
+
...commonPayloadFields,
|
|
62
|
+
},
|
|
63
|
+
success: Schema.Void,
|
|
64
|
+
}),
|
|
55
65
|
) {}
|
|
@@ -14,26 +14,26 @@ export class SyncHttpRpc extends RpcGroup.make(
|
|
|
14
14
|
Rpc.make('SyncHttpRpc.Pull', {
|
|
15
15
|
payload: Schema.Struct({
|
|
16
16
|
storeId: Schema.String,
|
|
17
|
-
payload: Schema.optional(Schema.
|
|
17
|
+
payload: Schema.optional(Schema.Json),
|
|
18
18
|
...SyncMessage.PullRequest.fields,
|
|
19
19
|
}),
|
|
20
20
|
success: SyncMessage.PullResponse,
|
|
21
|
-
error: Schema.Union(UnknownError, BackendIdMismatchError),
|
|
21
|
+
error: Schema.Union([UnknownError, BackendIdMismatchError]),
|
|
22
22
|
stream: true,
|
|
23
23
|
}),
|
|
24
24
|
Rpc.make('SyncHttpRpc.Push', {
|
|
25
25
|
payload: Schema.Struct({
|
|
26
26
|
storeId: Schema.String,
|
|
27
|
-
payload: Schema.optional(Schema.
|
|
27
|
+
payload: Schema.optional(Schema.Json),
|
|
28
28
|
...SyncMessage.PushRequest.fields,
|
|
29
29
|
}),
|
|
30
30
|
success: SyncMessage.PushAck,
|
|
31
|
-
error: Schema.Union(UnknownError, ServerAheadError, BackendIdMismatchError),
|
|
31
|
+
error: Schema.Union([UnknownError, ServerAheadError, BackendIdMismatchError]),
|
|
32
32
|
}),
|
|
33
33
|
Rpc.make('SyncHttpRpc.Ping', {
|
|
34
34
|
payload: Schema.Struct({
|
|
35
35
|
storeId: Schema.String,
|
|
36
|
-
payload: Schema.optional(Schema.
|
|
36
|
+
payload: Schema.optional(Schema.Json),
|
|
37
37
|
}),
|
|
38
38
|
success: SyncMessage.Pong,
|
|
39
39
|
error: UnknownError,
|
package/src/common/mod.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
export { OversizeChunkItemError, splitArrayBySize } from '@livestore/common/sync'
|
|
2
2
|
import { Schema } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
4
|
export type { CfTypes } from '@livestore/common-cf'
|
|
5
5
|
export * from './constants.ts'
|
|
6
|
+
export { SyncDoRpc } from './do-rpc-schema.ts'
|
|
6
7
|
export { SyncHttpRpc } from './http-rpc-schema.ts'
|
|
7
8
|
export * as SyncMessage from './sync-message-types.ts'
|
|
8
|
-
export { OversizeChunkItemError, splitChunkBySize }
|
|
9
9
|
|
|
10
10
|
export const SearchParamsSchema = Schema.Struct({
|
|
11
11
|
storeId: Schema.String,
|
|
12
|
-
payload: Schema.
|
|
12
|
+
payload: Schema.optional(Schema.StringFromUriComponent.pipe(Schema.decodeTo(Schema.fromJsonString(Schema.Json)))),
|
|
13
13
|
// NOTE `do-rpc` is handled differently
|
|
14
|
-
transport: Schema.
|
|
14
|
+
transport: Schema.Literals(['http', 'ws']),
|
|
15
15
|
})
|
|
16
16
|
|
|
17
17
|
export type SearchParams = typeof SearchParamsSchema.Type
|
|
@@ -11,7 +11,7 @@ import { Schema } from '@livestore/utils/effect'
|
|
|
11
11
|
export const SyncMetadata = Schema.TaggedStruct('SyncMessage.SyncMetadata', {
|
|
12
12
|
/** ISO date format */
|
|
13
13
|
createdAt: Schema.String,
|
|
14
|
-
}).
|
|
14
|
+
}).annotate({ title: '@livestore/sync-cf:SyncMetadata' })
|
|
15
15
|
|
|
16
16
|
export type SyncMetadata = typeof SyncMetadata.Type
|
|
17
17
|
|
|
@@ -23,7 +23,7 @@ export const PullRequest = Schema.Struct({
|
|
|
23
23
|
eventSequenceNumber: EventSequenceNumber.Global.Schema,
|
|
24
24
|
}),
|
|
25
25
|
),
|
|
26
|
-
}).
|
|
26
|
+
}).annotate({ title: '@livestore/sync-cf:PullRequest' })
|
|
27
27
|
|
|
28
28
|
export type PullRequest = typeof PullRequest.Type
|
|
29
29
|
|
|
@@ -36,7 +36,7 @@ export const PullResponse = Schema.Struct({
|
|
|
36
36
|
),
|
|
37
37
|
pageInfo: SyncBackend.PullResPageInfo,
|
|
38
38
|
backendId: BackendId,
|
|
39
|
-
}).
|
|
39
|
+
}).annotate({ title: '@livestore/sync-cf:PullResponse' })
|
|
40
40
|
|
|
41
41
|
export const emptyPullResponse = (backendId: string) =>
|
|
42
42
|
PullResponse.make({
|
|
@@ -50,32 +50,32 @@ export type PullResponse = typeof PullResponse.Type
|
|
|
50
50
|
export const PushRequest = Schema.Struct({
|
|
51
51
|
batch: Schema.Array(LiveStoreEvent.Global.Encoded),
|
|
52
52
|
backendId: Schema.Option(BackendId),
|
|
53
|
-
}).
|
|
53
|
+
}).annotate({ title: '@livestore/sync-cf:PushRequest' })
|
|
54
54
|
|
|
55
55
|
export type PushRequest = typeof PushRequest.Type
|
|
56
56
|
|
|
57
|
-
export const PushAck = Schema.Struct({}).
|
|
57
|
+
export const PushAck = Schema.Struct({}).annotate({
|
|
58
58
|
title: '@livestore/sync-cf:PushAck',
|
|
59
59
|
})
|
|
60
60
|
|
|
61
61
|
export type PushAck = typeof PushAck.Type
|
|
62
62
|
|
|
63
|
-
export const Ping = Schema.TaggedStruct('SyncMessage.Ping', {}).
|
|
63
|
+
export const Ping = Schema.TaggedStruct('SyncMessage.Ping', {}).annotate({ title: '@livestore/sync-cf:Ping' })
|
|
64
64
|
|
|
65
65
|
export type Ping = typeof Ping.Type
|
|
66
66
|
|
|
67
|
-
export const Pong = Schema.TaggedStruct('SyncMessage.Pong', {}).
|
|
67
|
+
export const Pong = Schema.TaggedStruct('SyncMessage.Pong', {}).annotate({ title: '@livestore/sync-cf:Pong' })
|
|
68
68
|
|
|
69
69
|
export type Pong = typeof Pong.Type
|
|
70
70
|
|
|
71
71
|
// Admin operations
|
|
72
72
|
export const AdminResetRoomRequest = Schema.TaggedStruct('SyncMessage.AdminResetRoomRequest', {
|
|
73
73
|
adminSecret: Schema.String,
|
|
74
|
-
}).
|
|
74
|
+
}).annotate({ title: '@livestore/sync-cf:AdminResetRoomRequest' })
|
|
75
75
|
|
|
76
76
|
export type AdminResetRoomRequest = typeof AdminResetRoomRequest.Type
|
|
77
77
|
|
|
78
|
-
export const AdminResetRoomResponse = Schema.TaggedStruct('SyncMessage.AdminResetRoomResponse', {}).
|
|
78
|
+
export const AdminResetRoomResponse = Schema.TaggedStruct('SyncMessage.AdminResetRoomResponse', {}).annotate({
|
|
79
79
|
title: '@livestore/sync-cf:AdminResetRoomResponse',
|
|
80
80
|
})
|
|
81
81
|
|
|
@@ -83,7 +83,7 @@ export type AdminResetRoomResponse = typeof AdminResetRoomResponse.Type
|
|
|
83
83
|
|
|
84
84
|
export const AdminInfoRequest = Schema.TaggedStruct('SyncMessage.AdminInfoRequest', {
|
|
85
85
|
adminSecret: Schema.String,
|
|
86
|
-
}).
|
|
86
|
+
}).annotate({ title: '@livestore/sync-cf:AdminInfoRequest' })
|
|
87
87
|
|
|
88
88
|
export type AdminInfoRequest = typeof AdminInfoRequest.Type
|
|
89
89
|
|
|
@@ -91,27 +91,27 @@ export const AdminInfoResponse = Schema.TaggedStruct('SyncMessage.AdminInfoRespo
|
|
|
91
91
|
info: Schema.Struct({
|
|
92
92
|
durableObjectId: Schema.String,
|
|
93
93
|
}),
|
|
94
|
-
}).
|
|
94
|
+
}).annotate({ title: '@livestore/sync-cf:AdminInfoResponse' })
|
|
95
95
|
|
|
96
96
|
export type AdminInfoResponse = typeof AdminInfoResponse.Type
|
|
97
97
|
|
|
98
|
-
export const BackendToClientMessage = Schema.Union(
|
|
98
|
+
export const BackendToClientMessage = Schema.Union([
|
|
99
99
|
PullResponse,
|
|
100
100
|
PushAck,
|
|
101
101
|
Pong,
|
|
102
102
|
AdminResetRoomResponse,
|
|
103
103
|
AdminInfoResponse,
|
|
104
|
-
)
|
|
104
|
+
])
|
|
105
105
|
export type BackendToClientMessage = typeof BackendToClientMessage.Type
|
|
106
106
|
|
|
107
|
-
export const ClientToBackendMessage = Schema.Union(
|
|
107
|
+
export const ClientToBackendMessage = Schema.Union([
|
|
108
108
|
PullRequest,
|
|
109
109
|
PushRequest,
|
|
110
110
|
Ping,
|
|
111
111
|
AdminResetRoomRequest,
|
|
112
112
|
AdminInfoRequest,
|
|
113
|
-
)
|
|
113
|
+
])
|
|
114
114
|
export type ClientToBackendMessage = typeof ClientToBackendMessage.Type
|
|
115
115
|
|
|
116
|
-
export const Message = Schema.Union(BackendToClientMessage, ClientToBackendMessage)
|
|
116
|
+
export const Message = Schema.Union([BackendToClientMessage, ClientToBackendMessage])
|
|
117
117
|
export type Message = typeof Message.Type
|
|
@@ -14,23 +14,23 @@ export class SyncWsRpc extends RpcGroup.make(
|
|
|
14
14
|
Rpc.make('SyncWsRpc.Pull', {
|
|
15
15
|
payload: Schema.Struct({
|
|
16
16
|
storeId: Schema.String,
|
|
17
|
-
payload: Schema.optional(Schema.
|
|
17
|
+
payload: Schema.optional(Schema.Json),
|
|
18
18
|
/** Whether to keep the pull stream alive and wait for more events */
|
|
19
19
|
live: Schema.Boolean,
|
|
20
20
|
...SyncMessage.PullRequest.fields,
|
|
21
21
|
}),
|
|
22
22
|
success: SyncMessage.PullResponse,
|
|
23
|
-
error: Schema.Union(UnknownError, BackendIdMismatchError),
|
|
23
|
+
error: Schema.Union([UnknownError, BackendIdMismatchError]),
|
|
24
24
|
stream: true,
|
|
25
25
|
}),
|
|
26
26
|
Rpc.make('SyncWsRpc.Push', {
|
|
27
27
|
payload: Schema.Struct({
|
|
28
28
|
storeId: Schema.String,
|
|
29
|
-
payload: Schema.optional(Schema.
|
|
29
|
+
payload: Schema.optional(Schema.Json),
|
|
30
30
|
...SyncMessage.PushRequest.fields,
|
|
31
31
|
}),
|
|
32
32
|
success: SyncMessage.PushAck,
|
|
33
|
-
error: Schema.Union(UnknownError, ServerAheadError, BackendIdMismatchError),
|
|
33
|
+
error: Schema.Union([UnknownError, ServerAheadError, BackendIdMismatchError]),
|
|
34
34
|
}),
|
|
35
35
|
// Ping <> Pong is handled by DO WS auto-response
|
|
36
36
|
// TODO add admin RPCs
|