@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.
Files changed (134) hide show
  1. package/README.md +5 -5
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cf-worker/do/durable-object.d.ts.map +1 -1
  4. package/dist/cf-worker/do/durable-object.js +53 -36
  5. package/dist/cf-worker/do/durable-object.js.map +1 -1
  6. package/dist/cf-worker/do/layer.d.ts +22 -18
  7. package/dist/cf-worker/do/layer.d.ts.map +1 -1
  8. package/dist/cf-worker/do/layer.js +45 -35
  9. package/dist/cf-worker/do/layer.js.map +1 -1
  10. package/dist/cf-worker/do/observability.d.ts +23 -0
  11. package/dist/cf-worker/do/observability.d.ts.map +1 -0
  12. package/dist/cf-worker/do/observability.js +52 -0
  13. package/dist/cf-worker/do/observability.js.map +1 -0
  14. package/dist/cf-worker/do/observability.test.d.ts +2 -0
  15. package/dist/cf-worker/do/observability.test.d.ts.map +1 -0
  16. package/dist/cf-worker/do/observability.test.js +204 -0
  17. package/dist/cf-worker/do/observability.test.js.map +1 -0
  18. package/dist/cf-worker/do/pull.d.ts +3 -3
  19. package/dist/cf-worker/do/pull.d.ts.map +1 -1
  20. package/dist/cf-worker/do/pull.js +19 -20
  21. package/dist/cf-worker/do/pull.js.map +1 -1
  22. package/dist/cf-worker/do/push.d.ts +16 -3
  23. package/dist/cf-worker/do/push.d.ts.map +1 -1
  24. package/dist/cf-worker/do/push.js +74 -53
  25. package/dist/cf-worker/do/push.js.map +1 -1
  26. package/dist/cf-worker/do/push.test.d.ts +2 -0
  27. package/dist/cf-worker/do/push.test.d.ts.map +1 -0
  28. package/dist/cf-worker/do/push.test.js +30 -0
  29. package/dist/cf-worker/do/push.test.js.map +1 -0
  30. package/dist/cf-worker/do/sqlite.d.ts +34 -46
  31. package/dist/cf-worker/do/sqlite.d.ts.map +1 -1
  32. package/dist/cf-worker/do/sqlite.js +2 -2
  33. package/dist/cf-worker/do/sqlite.js.map +1 -1
  34. package/dist/cf-worker/do/sync-storage.d.ts +7 -6
  35. package/dist/cf-worker/do/sync-storage.d.ts.map +1 -1
  36. package/dist/cf-worker/do/sync-storage.js +29 -17
  37. package/dist/cf-worker/do/sync-storage.js.map +1 -1
  38. package/dist/cf-worker/do/transport/do-rpc-server.d.ts +17 -2
  39. package/dist/cf-worker/do/transport/do-rpc-server.d.ts.map +1 -1
  40. package/dist/cf-worker/do/transport/do-rpc-server.js +41 -23
  41. package/dist/cf-worker/do/transport/do-rpc-server.js.map +1 -1
  42. package/dist/cf-worker/do/transport/do-rpc-server.test.d.ts +2 -0
  43. package/dist/cf-worker/do/transport/do-rpc-server.test.d.ts.map +1 -0
  44. package/dist/cf-worker/do/transport/do-rpc-server.test.js +28 -0
  45. package/dist/cf-worker/do/transport/do-rpc-server.test.js.map +1 -0
  46. package/dist/cf-worker/do/transport/http-rpc-server.d.ts +2 -2
  47. package/dist/cf-worker/do/transport/http-rpc-server.d.ts.map +1 -1
  48. package/dist/cf-worker/do/transport/http-rpc-server.js +12 -12
  49. package/dist/cf-worker/do/transport/http-rpc-server.js.map +1 -1
  50. package/dist/cf-worker/do/transport/ws-rpc-server.d.ts +9 -2
  51. package/dist/cf-worker/do/transport/ws-rpc-server.d.ts.map +1 -1
  52. package/dist/cf-worker/do/transport/ws-rpc-server.js +37 -29
  53. package/dist/cf-worker/do/transport/ws-rpc-server.js.map +1 -1
  54. package/dist/cf-worker/mod.js +3 -3
  55. package/dist/cf-worker/shared.d.ts +37 -29
  56. package/dist/cf-worker/shared.d.ts.map +1 -1
  57. package/dist/cf-worker/shared.js +14 -12
  58. package/dist/cf-worker/shared.js.map +1 -1
  59. package/dist/cf-worker/worker.d.ts +9 -9
  60. package/dist/cf-worker/worker.d.ts.map +1 -1
  61. package/dist/cf-worker/worker.js +17 -15
  62. package/dist/cf-worker/worker.js.map +1 -1
  63. package/dist/client/mod.js +3 -3
  64. package/dist/client/transport/do-rpc-client.d.ts +18 -6
  65. package/dist/client/transport/do-rpc-client.d.ts.map +1 -1
  66. package/dist/client/transport/do-rpc-client.js +112 -38
  67. package/dist/client/transport/do-rpc-client.js.map +1 -1
  68. package/dist/client/transport/do-rpc-client.test.d.ts +2 -0
  69. package/dist/client/transport/do-rpc-client.test.d.ts.map +1 -0
  70. package/dist/client/transport/do-rpc-client.test.js +268 -0
  71. package/dist/client/transport/do-rpc-client.test.js.map +1 -0
  72. package/dist/client/transport/http-rpc-client.d.ts +3 -3
  73. package/dist/client/transport/http-rpc-client.d.ts.map +1 -1
  74. package/dist/client/transport/http-rpc-client.js +48 -29
  75. package/dist/client/transport/http-rpc-client.js.map +1 -1
  76. package/dist/client/transport/rpc-client-error.d.ts +5 -0
  77. package/dist/client/transport/rpc-client-error.d.ts.map +1 -0
  78. package/dist/client/transport/rpc-client-error.js +8 -0
  79. package/dist/client/transport/rpc-client-error.js.map +1 -0
  80. package/dist/client/transport/rpc-client-error.test.d.ts +2 -0
  81. package/dist/client/transport/rpc-client-error.test.d.ts.map +1 -0
  82. package/dist/client/transport/rpc-client-error.test.js +33 -0
  83. package/dist/client/transport/rpc-client-error.test.js.map +1 -0
  84. package/dist/client/transport/ws-rpc-client.d.ts +3 -3
  85. package/dist/client/transport/ws-rpc-client.d.ts.map +1 -1
  86. package/dist/client/transport/ws-rpc-client.js +33 -23
  87. package/dist/client/transport/ws-rpc-client.js.map +1 -1
  88. package/dist/common/do-rpc-schema.d.ts +53 -41
  89. package/dist/common/do-rpc-schema.d.ts.map +1 -1
  90. package/dist/common/do-rpc-schema.js +13 -4
  91. package/dist/common/do-rpc-schema.js.map +1 -1
  92. package/dist/common/http-rpc-schema.d.ts +38 -39
  93. package/dist/common/http-rpc-schema.d.ts.map +1 -1
  94. package/dist/common/http-rpc-schema.js +6 -6
  95. package/dist/common/http-rpc-schema.js.map +1 -1
  96. package/dist/common/mod.d.ts +5 -5
  97. package/dist/common/mod.d.ts.map +1 -1
  98. package/dist/common/mod.js +7 -7
  99. package/dist/common/mod.js.map +1 -1
  100. package/dist/common/sync-message-types.d.ts +116 -133
  101. package/dist/common/sync-message-types.d.ts.map +1 -1
  102. package/dist/common/sync-message-types.js +26 -14
  103. package/dist/common/sync-message-types.js.map +1 -1
  104. package/dist/common/ws-rpc-schema.d.ts +33 -34
  105. package/dist/common/ws-rpc-schema.d.ts.map +1 -1
  106. package/dist/common/ws-rpc-schema.js +5 -5
  107. package/dist/common/ws-rpc-schema.js.map +1 -1
  108. package/package.json +42 -58
  109. package/src/cf-worker/do/durable-object.ts +70 -64
  110. package/src/cf-worker/do/layer.ts +142 -99
  111. package/src/cf-worker/do/observability.test.ts +337 -0
  112. package/src/cf-worker/do/observability.ts +121 -0
  113. package/src/cf-worker/do/pull.ts +28 -28
  114. package/src/cf-worker/do/push.test.ts +40 -0
  115. package/src/cf-worker/do/push.ts +139 -115
  116. package/src/cf-worker/do/sqlite.ts +1 -1
  117. package/src/cf-worker/do/sync-storage.ts +34 -21
  118. package/src/cf-worker/do/transport/do-rpc-server.test.ts +32 -0
  119. package/src/cf-worker/do/transport/do-rpc-server.ts +46 -35
  120. package/src/cf-worker/do/transport/http-rpc-server.ts +7 -10
  121. package/src/cf-worker/do/transport/ws-rpc-server.ts +52 -28
  122. package/src/cf-worker/shared.ts +29 -17
  123. package/src/cf-worker/worker.ts +21 -22
  124. package/src/client/transport/do-rpc-client.test.ts +411 -0
  125. package/src/client/transport/do-rpc-client.ts +175 -51
  126. package/src/client/transport/http-rpc-client.ts +66 -45
  127. package/src/client/transport/rpc-client-error.test.ts +41 -0
  128. package/src/client/transport/rpc-client-error.ts +9 -0
  129. package/src/client/transport/ws-rpc-client.ts +40 -32
  130. package/src/common/do-rpc-schema.ts +13 -3
  131. package/src/common/http-rpc-schema.ts +5 -5
  132. package/src/common/mod.ts +4 -4
  133. package/src/common/sync-message-types.ts +16 -16
  134. package/src/common/ws-rpc-schema.ts +4 -4
@@ -1,13 +1,12 @@
1
- import { IsOfflineError, SyncBackend, UnknownError } from '@livestore/common'
1
+ import { SyncBackend, UnknownError } from '@livestore/common'
2
2
  import type { LiveStoreEvent } from '@livestore/common/schema'
3
- import { splitChunkBySize } from '@livestore/common/sync'
4
- import { omit } from '@livestore/utils'
3
+ import { splitArrayBySize } from '@livestore/common/sync'
5
4
  import {
6
- Chunk,
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.DurationInput
52
+ requestTimeout?: Duration.Input
52
53
  /**
53
54
  * How often to send ping requests
54
55
  * @default 10 seconds
55
56
  */
56
- requestInterval?: Duration.DurationInput
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.encode(SearchParamsSchema)({
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.async((cb) => self.addEventListener('online', () => cb(Effect.void)))
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.union(Schedule.fixed('30 seconds')),
101
+ Schedule.modifyDelay(({ duration }) => Effect.succeed(Duration.min(duration, Duration.seconds(30)))),
101
102
  Schedule.jittered,
102
103
  ),
103
- pingSchedule: Schedule.once.pipe(Schedule.andThen(Schedule.fixed(pingInterval))),
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.timeout(pingTimeout),
125
- Effect.catchTag('TimeoutException', () => SubscriptionRef.set(isConnected, false)),
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.SyncWsRpc.Pull({
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' && Socket.isSocketError(cause.cause) === true
151
- ? new IsOfflineError({ cause: cause.cause })
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
- const chunksChunk = yield* Chunk.fromIterable(batch).pipe(
170
- splitChunkBySize({
171
- maxItems: MAX_PUSH_EVENTS_PER_REQUEST,
172
- maxBytes: MAX_WS_MESSAGE_BYTES,
173
- encode: encodePayload,
174
- }),
175
- Effect.mapError((cause) => new UnknownError({ cause })),
176
- )
177
-
178
- for (const sub of chunksChunk) {
179
- yield* rpcClient.SyncWsRpc.Push({
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: Chunk.toReadonlyArray(sub),
186
+ batch: batchChunk,
183
187
  backendId: backendIdHelper.get(),
184
188
  }).pipe(
185
189
  Effect.mapError((cause) =>
186
- cause._tag === 'UnknownError' || cause._tag === 'ServerAheadError' || cause._tag === 'BackendIdMismatchError'
187
- ? cause
188
- : new UnknownError({ cause }),
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.JsonValue),
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.JsonValue),
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.JsonValue),
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.JsonValue),
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
- import { OversizeChunkItemError, splitChunkBySize } from '@livestore/common/sync'
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.compose(Schema.StringFromUriComponent, Schema.parseJson(Schema.JsonValue)).pipe(Schema.UndefinedOr),
12
+ payload: Schema.optional(Schema.StringFromUriComponent.pipe(Schema.decodeTo(Schema.fromJsonString(Schema.Json)))),
13
13
  // NOTE `do-rpc` is handled differently
14
- transport: Schema.Literal('http', 'ws'),
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
- }).annotations({ title: '@livestore/sync-cf:SyncMetadata' })
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
- }).annotations({ title: '@livestore/sync-cf:PullRequest' })
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
- }).annotations({ title: '@livestore/sync-cf:PullResponse' })
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
- }).annotations({ title: '@livestore/sync-cf:PushRequest' })
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({}).annotations({
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', {}).annotations({ title: '@livestore/sync-cf: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', {}).annotations({ title: '@livestore/sync-cf: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
- }).annotations({ title: '@livestore/sync-cf:AdminResetRoomRequest' })
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', {}).annotations({
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
- }).annotations({ title: '@livestore/sync-cf:AdminInfoRequest' })
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
- }).annotations({ title: '@livestore/sync-cf:AdminInfoResponse' })
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.JsonValue),
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.JsonValue),
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