rivetkit 2.0.23 → 2.0.24

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 (228) hide show
  1. package/dist/schemas/actor-persist/v2.ts +3 -3
  2. package/dist/schemas/actor-persist/v3.ts +274 -0
  3. package/dist/schemas/client-protocol/v2.ts +432 -0
  4. package/dist/schemas/file-system-driver/v2.ts +136 -0
  5. package/dist/tsup/actor/errors.cjs +2 -4
  6. package/dist/tsup/actor/errors.cjs.map +1 -1
  7. package/dist/tsup/actor/errors.d.cts +7 -10
  8. package/dist/tsup/actor/errors.d.ts +7 -10
  9. package/dist/tsup/actor/errors.js +9 -11
  10. package/dist/tsup/{actor-router-consts-B3Lu87yJ.d.cts → actor-router-consts-DzI2szci.d.cts} +5 -9
  11. package/dist/tsup/{actor-router-consts-B3Lu87yJ.d.ts → actor-router-consts-DzI2szci.d.ts} +5 -9
  12. package/dist/tsup/{chunk-3JYSUFET.cjs → chunk-3543NCSN.cjs} +45 -57
  13. package/dist/tsup/chunk-3543NCSN.cjs.map +1 -0
  14. package/dist/tsup/chunk-4SHILYS5.cjs +5694 -0
  15. package/dist/tsup/chunk-4SHILYS5.cjs.map +1 -0
  16. package/dist/tsup/{chunk-NCUALX2Q.cjs → chunk-5BZO5XPS.cjs} +3 -3
  17. package/dist/tsup/{chunk-NCUALX2Q.cjs.map → chunk-5BZO5XPS.cjs.map} +1 -1
  18. package/dist/tsup/{chunk-5PKKNNNS.js → chunk-BAIGSF64.js} +189 -187
  19. package/dist/tsup/chunk-BAIGSF64.js.map +1 -0
  20. package/dist/tsup/{chunk-HNYF4T36.cjs → chunk-CHLZBSI2.cjs} +17 -17
  21. package/dist/tsup/chunk-CHLZBSI2.cjs.map +1 -0
  22. package/dist/tsup/chunk-D3SLADUD.cjs +512 -0
  23. package/dist/tsup/chunk-D3SLADUD.cjs.map +1 -0
  24. package/dist/tsup/{chunk-KSRXX3Z4.cjs → chunk-D6762AOA.cjs} +20 -25
  25. package/dist/tsup/chunk-D6762AOA.cjs.map +1 -0
  26. package/dist/tsup/{chunk-C56XVVV4.cjs → chunk-DLK5YCTN.cjs} +187 -185
  27. package/dist/tsup/chunk-DLK5YCTN.cjs.map +1 -0
  28. package/dist/tsup/{chunk-DLYZKFRY.js → chunk-DUJQWGYD.js} +3 -7
  29. package/dist/tsup/chunk-DUJQWGYD.js.map +1 -0
  30. package/dist/tsup/{chunk-5UJQWWO3.js → chunk-EIPANQMF.js} +2 -2
  31. package/dist/tsup/{chunk-54DVMQPT.cjs → chunk-ESMTDP7G.cjs} +6 -6
  32. package/dist/tsup/chunk-ESMTDP7G.cjs.map +1 -0
  33. package/dist/tsup/{chunk-XYK5PY3B.cjs → chunk-FVAKREFB.cjs} +1900 -1737
  34. package/dist/tsup/chunk-FVAKREFB.cjs.map +1 -0
  35. package/dist/tsup/{chunk-PHNIVSG5.js → chunk-I3XT7WOF.js} +44 -56
  36. package/dist/tsup/chunk-I3XT7WOF.js.map +1 -0
  37. package/dist/tsup/{chunk-3I6ZIJVJ.js → chunk-IMDS5T42.js} +3 -3
  38. package/dist/tsup/chunk-IMDS5T42.js.map +1 -0
  39. package/dist/tsup/{chunk-SN4KWTRA.cjs → chunk-J3HZJF2P.cjs} +10 -14
  40. package/dist/tsup/chunk-J3HZJF2P.cjs.map +1 -0
  41. package/dist/tsup/{chunk-NOZSCUPQ.js → chunk-MBBJUHSP.js} +1844 -1681
  42. package/dist/tsup/chunk-MBBJUHSP.js.map +1 -0
  43. package/dist/tsup/{chunk-RVVUS4X6.js → chunk-MO5CB6MD.js} +9 -9
  44. package/dist/tsup/chunk-MO5CB6MD.js.map +1 -0
  45. package/dist/tsup/chunk-OFOTPKAH.js +512 -0
  46. package/dist/tsup/chunk-OFOTPKAH.js.map +1 -0
  47. package/dist/tsup/{chunk-G64QUEDJ.js → chunk-W6RDS6NW.js} +23 -28
  48. package/dist/tsup/chunk-W6RDS6NW.js.map +1 -0
  49. package/dist/tsup/{chunk-XSDSNHSE.cjs → chunk-YC5DUHPM.cjs} +4 -8
  50. package/dist/tsup/chunk-YC5DUHPM.cjs.map +1 -0
  51. package/dist/tsup/{chunk-YAYNBR37.js → chunk-YC7YPM2T.js} +2 -6
  52. package/dist/tsup/chunk-YC7YPM2T.js.map +1 -0
  53. package/dist/tsup/{chunk-FTQ62XTN.js → chunk-ZSPU5R4C.js} +3322 -2251
  54. package/dist/tsup/chunk-ZSPU5R4C.js.map +1 -0
  55. package/dist/tsup/client/mod.cjs +9 -9
  56. package/dist/tsup/client/mod.d.cts +5 -7
  57. package/dist/tsup/client/mod.d.ts +5 -7
  58. package/dist/tsup/client/mod.js +8 -8
  59. package/dist/tsup/common/log.cjs +3 -3
  60. package/dist/tsup/common/log.js +2 -2
  61. package/dist/tsup/common/websocket.cjs +4 -4
  62. package/dist/tsup/common/websocket.js +3 -3
  63. package/dist/tsup/{conn-B3Vhbgnd.d.ts → config-BRDYDraU.d.cts} +1119 -1047
  64. package/dist/tsup/{conn-DJWL3nGx.d.cts → config-Bo-blHpJ.d.ts} +1119 -1047
  65. package/dist/tsup/driver-helpers/mod.cjs +5 -13
  66. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  67. package/dist/tsup/driver-helpers/mod.d.cts +11 -9
  68. package/dist/tsup/driver-helpers/mod.d.ts +11 -9
  69. package/dist/tsup/driver-helpers/mod.js +14 -22
  70. package/dist/tsup/driver-test-suite/mod.cjs +474 -303
  71. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  72. package/dist/tsup/driver-test-suite/mod.d.cts +6 -9
  73. package/dist/tsup/driver-test-suite/mod.d.ts +6 -9
  74. package/dist/tsup/driver-test-suite/mod.js +1085 -914
  75. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  76. package/dist/tsup/inspector/mod.cjs +6 -6
  77. package/dist/tsup/inspector/mod.d.cts +5 -7
  78. package/dist/tsup/inspector/mod.d.ts +5 -7
  79. package/dist/tsup/inspector/mod.js +5 -5
  80. package/dist/tsup/mod.cjs +10 -16
  81. package/dist/tsup/mod.cjs.map +1 -1
  82. package/dist/tsup/mod.d.cts +23 -25
  83. package/dist/tsup/mod.d.ts +23 -25
  84. package/dist/tsup/mod.js +17 -23
  85. package/dist/tsup/test/mod.cjs +11 -11
  86. package/dist/tsup/test/mod.d.cts +4 -6
  87. package/dist/tsup/test/mod.d.ts +4 -6
  88. package/dist/tsup/test/mod.js +10 -10
  89. package/dist/tsup/utils.cjs +3 -5
  90. package/dist/tsup/utils.cjs.map +1 -1
  91. package/dist/tsup/utils.d.cts +1 -2
  92. package/dist/tsup/utils.d.ts +1 -2
  93. package/dist/tsup/utils.js +2 -4
  94. package/package.json +13 -6
  95. package/src/actor/config.ts +56 -44
  96. package/src/actor/conn/driver.ts +61 -0
  97. package/src/actor/conn/drivers/http.ts +17 -0
  98. package/src/actor/conn/drivers/raw-request.ts +24 -0
  99. package/src/actor/conn/drivers/raw-websocket.ts +65 -0
  100. package/src/actor/conn/drivers/websocket.ts +129 -0
  101. package/src/actor/conn/mod.ts +232 -0
  102. package/src/actor/conn/persisted.ts +81 -0
  103. package/src/actor/conn/state-manager.ts +196 -0
  104. package/src/actor/contexts/action.ts +23 -0
  105. package/src/actor/{context.ts → contexts/actor.ts} +19 -8
  106. package/src/actor/contexts/conn-init.ts +31 -0
  107. package/src/actor/contexts/conn.ts +48 -0
  108. package/src/actor/contexts/create-conn-state.ts +13 -0
  109. package/src/actor/contexts/on-before-connect.ts +13 -0
  110. package/src/actor/contexts/on-connect.ts +22 -0
  111. package/src/actor/contexts/request.ts +48 -0
  112. package/src/actor/contexts/websocket.ts +48 -0
  113. package/src/actor/definition.ts +3 -3
  114. package/src/actor/driver.ts +36 -5
  115. package/src/actor/errors.ts +19 -24
  116. package/src/actor/instance/connection-manager.ts +465 -0
  117. package/src/actor/instance/event-manager.ts +292 -0
  118. package/src/actor/instance/kv.ts +15 -0
  119. package/src/actor/instance/mod.ts +1107 -0
  120. package/src/actor/instance/persisted.ts +67 -0
  121. package/src/actor/instance/schedule-manager.ts +349 -0
  122. package/src/actor/instance/state-manager.ts +502 -0
  123. package/src/actor/mod.ts +13 -16
  124. package/src/actor/protocol/old.ts +131 -43
  125. package/src/actor/protocol/serde.ts +19 -4
  126. package/src/actor/router-endpoints.ts +61 -586
  127. package/src/actor/router-websocket-endpoints.ts +408 -0
  128. package/src/actor/router.ts +63 -197
  129. package/src/actor/schedule.ts +1 -1
  130. package/src/client/actor-conn.ts +183 -249
  131. package/src/client/actor-handle.ts +29 -6
  132. package/src/client/client.ts +0 -4
  133. package/src/client/config.ts +1 -4
  134. package/src/client/mod.ts +0 -1
  135. package/src/client/raw-utils.ts +3 -3
  136. package/src/client/utils.ts +85 -39
  137. package/src/common/actor-router-consts.ts +5 -12
  138. package/src/common/{inline-websocket-adapter2.ts → inline-websocket-adapter.ts} +26 -48
  139. package/src/common/log.ts +1 -1
  140. package/src/common/router.ts +28 -17
  141. package/src/common/utils.ts +2 -0
  142. package/src/driver-helpers/mod.ts +7 -10
  143. package/src/driver-helpers/utils.ts +18 -9
  144. package/src/driver-test-suite/mod.ts +26 -50
  145. package/src/driver-test-suite/test-inline-client-driver.ts +27 -51
  146. package/src/driver-test-suite/tests/actor-conn-hibernation.ts +150 -0
  147. package/src/driver-test-suite/tests/actor-conn-state.ts +1 -4
  148. package/src/driver-test-suite/tests/actor-conn.ts +5 -9
  149. package/src/driver-test-suite/tests/actor-destroy.ts +294 -0
  150. package/src/driver-test-suite/tests/actor-driver.ts +0 -7
  151. package/src/driver-test-suite/tests/actor-handle.ts +12 -12
  152. package/src/driver-test-suite/tests/actor-metadata.ts +1 -1
  153. package/src/driver-test-suite/tests/manager-driver.ts +1 -1
  154. package/src/driver-test-suite/tests/raw-http-direct-registry.ts +8 -8
  155. package/src/driver-test-suite/tests/raw-http-request-properties.ts +6 -5
  156. package/src/driver-test-suite/tests/raw-http.ts +5 -5
  157. package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +7 -7
  158. package/src/driver-test-suite/tests/request-access.ts +4 -4
  159. package/src/driver-test-suite/utils.ts +6 -10
  160. package/src/drivers/engine/actor-driver.ts +614 -424
  161. package/src/drivers/engine/mod.ts +0 -1
  162. package/src/drivers/file-system/actor.ts +24 -12
  163. package/src/drivers/file-system/global-state.ts +427 -37
  164. package/src/drivers/file-system/manager.ts +71 -83
  165. package/src/drivers/file-system/mod.ts +3 -0
  166. package/src/drivers/file-system/utils.ts +18 -8
  167. package/src/engine-process/mod.ts +38 -38
  168. package/src/inspector/utils.ts +7 -5
  169. package/src/manager/driver.ts +11 -4
  170. package/src/manager/gateway.ts +4 -29
  171. package/src/manager/protocol/mod.ts +0 -2
  172. package/src/manager/protocol/query.ts +0 -4
  173. package/src/manager/router.ts +67 -64
  174. package/src/manager-api/actors.ts +13 -0
  175. package/src/mod.ts +1 -3
  176. package/src/registry/mod.ts +20 -20
  177. package/src/registry/serve.ts +9 -14
  178. package/src/remote-manager-driver/actor-websocket-client.ts +1 -16
  179. package/src/remote-manager-driver/api-endpoints.ts +13 -1
  180. package/src/remote-manager-driver/api-utils.ts +8 -0
  181. package/src/remote-manager-driver/metadata.ts +58 -0
  182. package/src/remote-manager-driver/mod.ts +47 -62
  183. package/src/remote-manager-driver/ws-proxy.ts +1 -1
  184. package/src/schemas/actor-persist/mod.ts +1 -1
  185. package/src/schemas/actor-persist/versioned.ts +56 -31
  186. package/src/schemas/client-protocol/mod.ts +1 -1
  187. package/src/schemas/client-protocol/versioned.ts +41 -21
  188. package/src/schemas/client-protocol-zod/mod.ts +103 -0
  189. package/src/schemas/file-system-driver/mod.ts +1 -1
  190. package/src/schemas/file-system-driver/versioned.ts +42 -19
  191. package/src/serde.ts +33 -11
  192. package/src/test/mod.ts +7 -3
  193. package/src/utils/node.ts +173 -0
  194. package/src/utils.ts +0 -4
  195. package/dist/tsup/chunk-3I6ZIJVJ.js.map +0 -1
  196. package/dist/tsup/chunk-3JYSUFET.cjs.map +0 -1
  197. package/dist/tsup/chunk-54DVMQPT.cjs.map +0 -1
  198. package/dist/tsup/chunk-5PKKNNNS.js.map +0 -1
  199. package/dist/tsup/chunk-C56XVVV4.cjs.map +0 -1
  200. package/dist/tsup/chunk-D6PCH7FR.cjs +0 -4623
  201. package/dist/tsup/chunk-D6PCH7FR.cjs.map +0 -1
  202. package/dist/tsup/chunk-DLYZKFRY.js.map +0 -1
  203. package/dist/tsup/chunk-FTQ62XTN.js.map +0 -1
  204. package/dist/tsup/chunk-G64QUEDJ.js.map +0 -1
  205. package/dist/tsup/chunk-HNYF4T36.cjs.map +0 -1
  206. package/dist/tsup/chunk-JMLTKMJ7.cjs +0 -1119
  207. package/dist/tsup/chunk-JMLTKMJ7.cjs.map +0 -1
  208. package/dist/tsup/chunk-KSRXX3Z4.cjs.map +0 -1
  209. package/dist/tsup/chunk-NOZSCUPQ.js.map +0 -1
  210. package/dist/tsup/chunk-PHNIVSG5.js.map +0 -1
  211. package/dist/tsup/chunk-RUTBXBRR.js +0 -1119
  212. package/dist/tsup/chunk-RUTBXBRR.js.map +0 -1
  213. package/dist/tsup/chunk-RVVUS4X6.js.map +0 -1
  214. package/dist/tsup/chunk-SN4KWTRA.cjs.map +0 -1
  215. package/dist/tsup/chunk-XSDSNHSE.cjs.map +0 -1
  216. package/dist/tsup/chunk-XYK5PY3B.cjs.map +0 -1
  217. package/dist/tsup/chunk-YAYNBR37.js.map +0 -1
  218. package/src/actor/action.ts +0 -178
  219. package/src/actor/conn-drivers.ts +0 -216
  220. package/src/actor/conn-socket.ts +0 -8
  221. package/src/actor/conn.ts +0 -272
  222. package/src/actor/instance.ts +0 -2336
  223. package/src/actor/persisted.ts +0 -49
  224. package/src/actor/unstable-react.ts +0 -110
  225. package/src/driver-test-suite/tests/actor-reconnect.ts +0 -170
  226. package/src/drivers/engine/kv.ts +0 -3
  227. package/src/manager/hono-websocket-adapter.ts +0 -393
  228. /package/dist/tsup/{chunk-5UJQWWO3.js.map → chunk-EIPANQMF.js.map} +0 -0
@@ -13,25 +13,24 @@ import {
13
13
  TO_CLIENT_VERSIONED,
14
14
  TO_SERVER_VERSIONED,
15
15
  } from "@/schemas/client-protocol/versioned";
16
+ import {
17
+ type ToClient as ToClientJson,
18
+ ToClientSchema,
19
+ type ToServer as ToServerJson,
20
+ ToServerSchema,
21
+ } from "@/schemas/client-protocol-zod/mod";
16
22
  import { deserializeWithEncoding } from "@/serde";
17
23
  import { assertUnreachable, bufferToArrayBuffer } from "../../utils";
18
- import { ActionContext } from "../action";
19
- import type { Conn } from "../conn";
20
- import type { ActorInstance } from "../instance";
21
-
22
- export const TransportSchema = z.enum(["websocket", "sse"]);
23
-
24
- /**
25
- * Transport mechanism used to communicate between client & actor.
26
- */
27
- export type Transport = z.infer<typeof TransportSchema>;
24
+ import { CONN_SEND_MESSAGE_SYMBOL, type Conn } from "../conn/mod";
25
+ import { ActionContext } from "../contexts/action";
26
+ import type { ActorInstance } from "../instance/mod";
28
27
 
29
28
  interface MessageEventOpts {
30
29
  encoding: Encoding;
31
30
  maxIncomingMessageSize: number;
32
31
  }
33
32
 
34
- function getValueLength(value: InputData): number {
33
+ export function getValueLength(value: InputData): number {
35
34
  if (typeof value === "string") {
36
35
  return value.length;
37
36
  } else if (value instanceof Blob) {
@@ -70,7 +69,17 @@ export async function inputDataToBuffer(
70
69
  export async function parseMessage(
71
70
  value: InputData,
72
71
  opts: MessageEventOpts,
73
- ): Promise<protocol.ToServer> {
72
+ ): Promise<{
73
+ body:
74
+ | {
75
+ tag: "ActionRequest";
76
+ val: { id: bigint; name: string; args: unknown };
77
+ }
78
+ | {
79
+ tag: "SubscriptionRequest";
80
+ val: { eventName: string; subscribe: boolean };
81
+ };
82
+ }> {
74
83
  // Validate value length
75
84
  const length = getValueLength(value);
76
85
  if (length > opts.maxIncomingMessageSize) {
@@ -88,7 +97,34 @@ export async function parseMessage(
88
97
  }
89
98
 
90
99
  // Deserialize message
91
- return deserializeWithEncoding(opts.encoding, buffer, TO_SERVER_VERSIONED);
100
+ return deserializeWithEncoding(
101
+ opts.encoding,
102
+ buffer,
103
+ TO_SERVER_VERSIONED,
104
+ ToServerSchema,
105
+ // JSON: values are already the correct type
106
+ (json: ToServerJson): any => json,
107
+ // BARE: need to decode ArrayBuffer fields back to unknown
108
+ (bare: protocol.ToServer): any => {
109
+ if (bare.body.tag === "ActionRequest") {
110
+ return {
111
+ body: {
112
+ tag: "ActionRequest",
113
+ val: {
114
+ id: bare.body.val.id,
115
+ name: bare.body.val.name,
116
+ args: cbor.decode(
117
+ new Uint8Array(bare.body.val.args),
118
+ ),
119
+ },
120
+ },
121
+ };
122
+ } else {
123
+ // SubscriptionRequest has no ArrayBuffer fields
124
+ return bare;
125
+ }
126
+ },
127
+ );
92
128
  }
93
129
 
94
130
  export interface ProcessMessageHandler<
@@ -122,7 +158,17 @@ export async function processMessage<
122
158
  I,
123
159
  DB extends AnyDatabaseProvider,
124
160
  >(
125
- message: protocol.ToServer,
161
+ message: {
162
+ body:
163
+ | {
164
+ tag: "ActionRequest";
165
+ val: { id: bigint; name: string; args: unknown };
166
+ }
167
+ | {
168
+ tag: "SubscriptionRequest";
169
+ val: { eventName: string; subscribe: boolean };
170
+ };
171
+ },
126
172
  actor: ActorInstance<S, CP, CS, V, I, DB>,
127
173
  conn: Conn<S, CP, CS, V, I, DB>,
128
174
  handler: ProcessMessageHandler<S, CP, CS, V, I, DB>,
@@ -138,10 +184,9 @@ export async function processMessage<
138
184
  throw new errors.Unsupported("Action");
139
185
  }
140
186
 
141
- const { id, name, args: argsRaw } = message.body.val;
187
+ const { id, name, args } = message.body.val;
142
188
  actionId = id;
143
189
  actionName = name;
144
- const args = cbor.decode(new Uint8Array(argsRaw));
145
190
 
146
191
  actor.rLog.debug({
147
192
  msg: "processing action request",
@@ -149,14 +194,15 @@ export async function processMessage<
149
194
  actionName: name,
150
195
  });
151
196
 
152
- const ctx = new ActionContext<S, CP, CS, V, I, DB>(
153
- actor.actorContext,
154
- conn,
155
- );
197
+ const ctx = new ActionContext<S, CP, CS, V, I, DB>(actor, conn);
156
198
 
157
199
  // Process the action request and wait for the result
158
200
  // This will wait for async actions to complete
159
- const output = await handler.onExecuteAction(ctx, name, args);
201
+ const output = await handler.onExecuteAction(
202
+ ctx,
203
+ name,
204
+ args as unknown[],
205
+ );
160
206
 
161
207
  actor.rLog.debug({
162
208
  msg: "sending action response",
@@ -167,20 +213,31 @@ export async function processMessage<
167
213
  });
168
214
 
169
215
  // Send the response back to the client
170
- conn._sendMessage(
171
- new CachedSerializer<protocol.ToClient>(
172
- {
216
+ conn[CONN_SEND_MESSAGE_SYMBOL](
217
+ new CachedSerializer(
218
+ output,
219
+ TO_CLIENT_VERSIONED,
220
+ ToClientSchema,
221
+ // JSON: output is the raw value
222
+ (value): ToClientJson => ({
173
223
  body: {
174
- tag: "ActionResponse",
224
+ tag: "ActionResponse" as const,
175
225
  val: {
176
226
  id: id,
177
- output: bufferToArrayBuffer(
178
- cbor.encode(output),
179
- ),
227
+ output: value,
180
228
  },
181
229
  },
182
- },
183
- TO_CLIENT_VERSIONED,
230
+ }),
231
+ // BARE/CBOR: output needs to be CBOR-encoded to ArrayBuffer
232
+ (value): protocol.ToClient => ({
233
+ body: {
234
+ tag: "ActionResponse" as const,
235
+ val: {
236
+ id: id,
237
+ output: bufferToArrayBuffer(cbor.encode(value)),
238
+ },
239
+ },
240
+ }),
184
241
  ),
185
242
  );
186
243
 
@@ -236,23 +293,54 @@ export async function processMessage<
236
293
  });
237
294
 
238
295
  // Build response
239
- conn._sendMessage(
240
- new CachedSerializer<protocol.ToClient>(
241
- {
296
+ const errorData = { group, code, message, metadata, actionId };
297
+ conn[CONN_SEND_MESSAGE_SYMBOL](
298
+ new CachedSerializer(
299
+ errorData,
300
+ TO_CLIENT_VERSIONED,
301
+ ToClientSchema,
302
+ // JSON: metadata is the raw value (keep as undefined if not present)
303
+ (value): ToClientJson => {
304
+ const val: any = {
305
+ group: value.group,
306
+ code: value.code,
307
+ message: value.message,
308
+ actionId:
309
+ value.actionId !== undefined
310
+ ? value.actionId
311
+ : null,
312
+ };
313
+ if (value.metadata !== undefined) {
314
+ val.metadata = value.metadata;
315
+ }
316
+ return {
317
+ body: {
318
+ tag: "Error" as const,
319
+ val,
320
+ },
321
+ };
322
+ },
323
+ // BARE/CBOR: metadata needs to be CBOR-encoded to ArrayBuffer
324
+ // Note: protocol.Error expects `| null` for optional fields (BARE protocol)
325
+ (value): protocol.ToClient => ({
242
326
  body: {
243
- tag: "Error",
327
+ tag: "Error" as const,
244
328
  val: {
245
- group,
246
- code,
247
- message,
248
- metadata: bufferToArrayBuffer(
249
- cbor.encode(metadata),
250
- ),
251
- actionId: actionId ?? null,
329
+ group: value.group,
330
+ code: value.code,
331
+ message: value.message,
332
+ metadata: value.metadata
333
+ ? bufferToArrayBuffer(
334
+ cbor.encode(value.metadata),
335
+ )
336
+ : null,
337
+ actionId:
338
+ value.actionId !== undefined
339
+ ? value.actionId
340
+ : null,
252
341
  },
253
342
  },
254
- },
255
- TO_CLIENT_VERSIONED,
343
+ }),
256
344
  ),
257
345
  );
258
346
 
@@ -22,14 +22,26 @@ export type Encoding = z.infer<typeof EncodingSchema>;
22
22
  /**
23
23
  * Helper class that helps serialize data without re-serializing for the same encoding.
24
24
  */
25
- export class CachedSerializer<T> {
25
+ export class CachedSerializer<TBare, TJson, T = TBare> {
26
26
  #data: T;
27
27
  #cache = new Map<Encoding, OutputData>();
28
- #versionedDataHandler: VersionedDataHandler<T>;
29
-
30
- constructor(data: T, versionedDataHandler: VersionedDataHandler<T>) {
28
+ #versionedDataHandler: VersionedDataHandler<TBare>;
29
+ #zodSchema: z.ZodType<TJson>;
30
+ #toJson: (value: T) => TJson;
31
+ #toBare: (value: T) => TBare;
32
+
33
+ constructor(
34
+ data: T,
35
+ versionedDataHandler: VersionedDataHandler<TBare>,
36
+ zodSchema: z.ZodType<TJson>,
37
+ toJson: (value: T) => TJson,
38
+ toBare: (value: T) => TBare,
39
+ ) {
31
40
  this.#data = data;
32
41
  this.#versionedDataHandler = versionedDataHandler;
42
+ this.#zodSchema = zodSchema;
43
+ this.#toJson = toJson;
44
+ this.#toBare = toBare;
33
45
  }
34
46
 
35
47
  public get rawData(): T {
@@ -45,6 +57,9 @@ export class CachedSerializer<T> {
45
57
  encoding,
46
58
  this.#data,
47
59
  this.#versionedDataHandler,
60
+ this.#zodSchema,
61
+ this.#toJson,
62
+ this.#toBare,
48
63
  );
49
64
  this.#cache.set(encoding, serialized);
50
65
  return serialized;