rivetkit 2.0.24-rc.1 → 2.0.25-rc.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 (231) hide show
  1. package/dist/schemas/actor-persist/v1.ts +6 -0
  2. package/dist/schemas/actor-persist/v2.ts +9 -3
  3. package/dist/schemas/actor-persist/v3.ts +280 -0
  4. package/dist/schemas/client-protocol/v1.ts +6 -0
  5. package/dist/schemas/client-protocol/v2.ts +438 -0
  6. package/dist/schemas/file-system-driver/v1.ts +6 -0
  7. package/dist/schemas/file-system-driver/v2.ts +142 -0
  8. package/dist/tsup/actor/errors.cjs +2 -4
  9. package/dist/tsup/actor/errors.cjs.map +1 -1
  10. package/dist/tsup/actor/errors.d.cts +7 -10
  11. package/dist/tsup/actor/errors.d.ts +7 -10
  12. package/dist/tsup/actor/errors.js +9 -11
  13. package/dist/tsup/{actor-router-consts-B3Lu87yJ.d.cts → actor-router-consts-DzI2szci.d.cts} +5 -9
  14. package/dist/tsup/{actor-router-consts-B3Lu87yJ.d.ts → actor-router-consts-DzI2szci.d.ts} +5 -9
  15. package/dist/tsup/{chunk-ZTH3KYFH.cjs → chunk-3FG5OJ3G.cjs} +3 -3
  16. package/dist/tsup/{chunk-ZTH3KYFH.cjs.map → chunk-3FG5OJ3G.cjs.map} +1 -1
  17. package/dist/tsup/{chunk-BLK27ES3.js → chunk-6JN6W6G3.js} +44 -56
  18. package/dist/tsup/chunk-6JN6W6G3.js.map +1 -0
  19. package/dist/tsup/chunk-7IBNNGQ2.js +514 -0
  20. package/dist/tsup/chunk-7IBNNGQ2.js.map +1 -0
  21. package/dist/tsup/{chunk-36JJ4IQB.cjs → chunk-AZATXPR4.cjs} +4 -8
  22. package/dist/tsup/chunk-AZATXPR4.cjs.map +1 -0
  23. package/dist/tsup/chunk-B7MENRD5.cjs +5694 -0
  24. package/dist/tsup/chunk-B7MENRD5.cjs.map +1 -0
  25. package/dist/tsup/{chunk-BOMZS2TJ.js → chunk-BBVFDEYD.js} +9 -9
  26. package/dist/tsup/chunk-BBVFDEYD.js.map +1 -0
  27. package/dist/tsup/{chunk-KSRXX3Z4.cjs → chunk-D6762AOA.cjs} +20 -25
  28. package/dist/tsup/chunk-D6762AOA.cjs.map +1 -0
  29. package/dist/tsup/{chunk-2JYPS5YM.cjs → chunk-E63WZNMR.cjs} +6 -6
  30. package/dist/tsup/chunk-E63WZNMR.cjs.map +1 -0
  31. package/dist/tsup/{chunk-YBG6R7LX.js → chunk-EDGN4OC7.js} +3 -7
  32. package/dist/tsup/chunk-EDGN4OC7.js.map +1 -0
  33. package/dist/tsup/{chunk-BYMKMOBS.js → chunk-FLOQ3UWM.js} +1844 -1681
  34. package/dist/tsup/chunk-FLOQ3UWM.js.map +1 -0
  35. package/dist/tsup/{chunk-7L65NNWP.cjs → chunk-H7GV5DIW.cjs} +187 -185
  36. package/dist/tsup/chunk-H7GV5DIW.cjs.map +1 -0
  37. package/dist/tsup/{chunk-227FEWMB.js → chunk-HZYZ7JSF.js} +3322 -2251
  38. package/dist/tsup/chunk-HZYZ7JSF.js.map +1 -0
  39. package/dist/tsup/{chunk-FX7TWFQR.js → chunk-IDJK7ILQ.js} +2 -6
  40. package/dist/tsup/chunk-IDJK7ILQ.js.map +1 -0
  41. package/dist/tsup/{chunk-VHGY7PU5.cjs → chunk-ILFXA4AL.cjs} +1900 -1737
  42. package/dist/tsup/chunk-ILFXA4AL.cjs.map +1 -0
  43. package/dist/tsup/chunk-MV6M3FDL.cjs +514 -0
  44. package/dist/tsup/chunk-MV6M3FDL.cjs.map +1 -0
  45. package/dist/tsup/{chunk-PLUN2NQT.js → chunk-NWBKMCWC.js} +189 -187
  46. package/dist/tsup/chunk-NWBKMCWC.js.map +1 -0
  47. package/dist/tsup/{chunk-CD33GT6Z.js → chunk-QIHBDXTO.js} +2 -2
  48. package/dist/tsup/{chunk-G64QUEDJ.js → chunk-W6RDS6NW.js} +23 -28
  49. package/dist/tsup/chunk-W6RDS6NW.js.map +1 -0
  50. package/dist/tsup/{chunk-INNFK746.cjs → chunk-WQU4M4ZC.cjs} +10 -14
  51. package/dist/tsup/chunk-WQU4M4ZC.cjs.map +1 -0
  52. package/dist/tsup/{chunk-SHVX2QUR.cjs → chunk-XKZA47XS.cjs} +17 -17
  53. package/dist/tsup/chunk-XKZA47XS.cjs.map +1 -0
  54. package/dist/tsup/{chunk-HHFKKVLR.cjs → chunk-YHWIOWVA.cjs} +45 -57
  55. package/dist/tsup/chunk-YHWIOWVA.cjs.map +1 -0
  56. package/dist/tsup/{chunk-YBHYXIP6.js → chunk-YVL6IRUM.js} +3 -3
  57. package/dist/tsup/chunk-YVL6IRUM.js.map +1 -0
  58. package/dist/tsup/client/mod.cjs +9 -9
  59. package/dist/tsup/client/mod.d.cts +5 -7
  60. package/dist/tsup/client/mod.d.ts +5 -7
  61. package/dist/tsup/client/mod.js +8 -8
  62. package/dist/tsup/common/log.cjs +3 -3
  63. package/dist/tsup/common/log.js +2 -2
  64. package/dist/tsup/common/websocket.cjs +4 -4
  65. package/dist/tsup/common/websocket.js +3 -3
  66. package/dist/tsup/{conn-B3Vhbgnd.d.ts → config-BRDYDraU.d.cts} +1119 -1047
  67. package/dist/tsup/{conn-DJWL3nGx.d.cts → config-Bo-blHpJ.d.ts} +1119 -1047
  68. package/dist/tsup/driver-helpers/mod.cjs +5 -13
  69. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  70. package/dist/tsup/driver-helpers/mod.d.cts +11 -9
  71. package/dist/tsup/driver-helpers/mod.d.ts +11 -9
  72. package/dist/tsup/driver-helpers/mod.js +14 -22
  73. package/dist/tsup/driver-test-suite/mod.cjs +474 -303
  74. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  75. package/dist/tsup/driver-test-suite/mod.d.cts +6 -9
  76. package/dist/tsup/driver-test-suite/mod.d.ts +6 -9
  77. package/dist/tsup/driver-test-suite/mod.js +1085 -914
  78. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  79. package/dist/tsup/inspector/mod.cjs +6 -6
  80. package/dist/tsup/inspector/mod.d.cts +5 -7
  81. package/dist/tsup/inspector/mod.d.ts +5 -7
  82. package/dist/tsup/inspector/mod.js +5 -5
  83. package/dist/tsup/mod.cjs +10 -16
  84. package/dist/tsup/mod.cjs.map +1 -1
  85. package/dist/tsup/mod.d.cts +23 -25
  86. package/dist/tsup/mod.d.ts +23 -25
  87. package/dist/tsup/mod.js +17 -23
  88. package/dist/tsup/test/mod.cjs +11 -11
  89. package/dist/tsup/test/mod.d.cts +4 -6
  90. package/dist/tsup/test/mod.d.ts +4 -6
  91. package/dist/tsup/test/mod.js +10 -10
  92. package/dist/tsup/utils.cjs +3 -5
  93. package/dist/tsup/utils.cjs.map +1 -1
  94. package/dist/tsup/utils.d.cts +1 -2
  95. package/dist/tsup/utils.d.ts +1 -2
  96. package/dist/tsup/utils.js +2 -4
  97. package/package.json +13 -6
  98. package/src/actor/config.ts +56 -44
  99. package/src/actor/conn/driver.ts +61 -0
  100. package/src/actor/conn/drivers/http.ts +17 -0
  101. package/src/actor/conn/drivers/raw-request.ts +24 -0
  102. package/src/actor/conn/drivers/raw-websocket.ts +65 -0
  103. package/src/actor/conn/drivers/websocket.ts +129 -0
  104. package/src/actor/conn/mod.ts +232 -0
  105. package/src/actor/conn/persisted.ts +81 -0
  106. package/src/actor/conn/state-manager.ts +196 -0
  107. package/src/actor/contexts/action.ts +23 -0
  108. package/src/actor/{context.ts → contexts/actor.ts} +19 -8
  109. package/src/actor/contexts/conn-init.ts +31 -0
  110. package/src/actor/contexts/conn.ts +48 -0
  111. package/src/actor/contexts/create-conn-state.ts +13 -0
  112. package/src/actor/contexts/on-before-connect.ts +13 -0
  113. package/src/actor/contexts/on-connect.ts +22 -0
  114. package/src/actor/contexts/request.ts +48 -0
  115. package/src/actor/contexts/websocket.ts +48 -0
  116. package/src/actor/definition.ts +3 -3
  117. package/src/actor/driver.ts +36 -5
  118. package/src/actor/errors.ts +19 -24
  119. package/src/actor/instance/connection-manager.ts +465 -0
  120. package/src/actor/instance/event-manager.ts +292 -0
  121. package/src/actor/instance/kv.ts +15 -0
  122. package/src/actor/instance/mod.ts +1107 -0
  123. package/src/actor/instance/persisted.ts +67 -0
  124. package/src/actor/instance/schedule-manager.ts +349 -0
  125. package/src/actor/instance/state-manager.ts +502 -0
  126. package/src/actor/mod.ts +13 -16
  127. package/src/actor/protocol/old.ts +131 -43
  128. package/src/actor/protocol/serde.ts +19 -4
  129. package/src/actor/router-endpoints.ts +61 -586
  130. package/src/actor/router-websocket-endpoints.ts +408 -0
  131. package/src/actor/router.ts +63 -197
  132. package/src/actor/schedule.ts +1 -1
  133. package/src/client/actor-conn.ts +183 -249
  134. package/src/client/actor-handle.ts +29 -6
  135. package/src/client/client.ts +0 -4
  136. package/src/client/config.ts +1 -4
  137. package/src/client/mod.ts +0 -1
  138. package/src/client/raw-utils.ts +3 -3
  139. package/src/client/utils.ts +85 -39
  140. package/src/common/actor-router-consts.ts +5 -12
  141. package/src/common/{inline-websocket-adapter2.ts → inline-websocket-adapter.ts} +26 -48
  142. package/src/common/log.ts +1 -1
  143. package/src/common/router.ts +28 -17
  144. package/src/common/utils.ts +2 -0
  145. package/src/driver-helpers/mod.ts +7 -10
  146. package/src/driver-helpers/utils.ts +18 -9
  147. package/src/driver-test-suite/mod.ts +26 -50
  148. package/src/driver-test-suite/test-inline-client-driver.ts +27 -51
  149. package/src/driver-test-suite/tests/actor-conn-hibernation.ts +150 -0
  150. package/src/driver-test-suite/tests/actor-conn-state.ts +1 -4
  151. package/src/driver-test-suite/tests/actor-conn.ts +5 -9
  152. package/src/driver-test-suite/tests/actor-destroy.ts +294 -0
  153. package/src/driver-test-suite/tests/actor-driver.ts +0 -7
  154. package/src/driver-test-suite/tests/actor-handle.ts +12 -12
  155. package/src/driver-test-suite/tests/actor-metadata.ts +1 -1
  156. package/src/driver-test-suite/tests/manager-driver.ts +1 -1
  157. package/src/driver-test-suite/tests/raw-http-direct-registry.ts +8 -8
  158. package/src/driver-test-suite/tests/raw-http-request-properties.ts +6 -5
  159. package/src/driver-test-suite/tests/raw-http.ts +5 -5
  160. package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +7 -7
  161. package/src/driver-test-suite/tests/request-access.ts +4 -4
  162. package/src/driver-test-suite/utils.ts +6 -10
  163. package/src/drivers/engine/actor-driver.ts +614 -424
  164. package/src/drivers/engine/mod.ts +0 -1
  165. package/src/drivers/file-system/actor.ts +24 -12
  166. package/src/drivers/file-system/global-state.ts +427 -37
  167. package/src/drivers/file-system/manager.ts +71 -83
  168. package/src/drivers/file-system/mod.ts +3 -0
  169. package/src/drivers/file-system/utils.ts +18 -8
  170. package/src/engine-process/mod.ts +38 -38
  171. package/src/inspector/utils.ts +7 -5
  172. package/src/manager/driver.ts +11 -4
  173. package/src/manager/gateway.ts +4 -29
  174. package/src/manager/protocol/mod.ts +0 -2
  175. package/src/manager/protocol/query.ts +0 -4
  176. package/src/manager/router.ts +67 -64
  177. package/src/manager-api/actors.ts +13 -0
  178. package/src/mod.ts +1 -3
  179. package/src/registry/mod.ts +20 -20
  180. package/src/registry/serve.ts +9 -14
  181. package/src/remote-manager-driver/actor-websocket-client.ts +1 -16
  182. package/src/remote-manager-driver/api-endpoints.ts +13 -1
  183. package/src/remote-manager-driver/api-utils.ts +8 -0
  184. package/src/remote-manager-driver/metadata.ts +58 -0
  185. package/src/remote-manager-driver/mod.ts +47 -62
  186. package/src/remote-manager-driver/ws-proxy.ts +1 -1
  187. package/src/schemas/actor-persist/mod.ts +1 -1
  188. package/src/schemas/actor-persist/versioned.ts +56 -31
  189. package/src/schemas/client-protocol/mod.ts +1 -1
  190. package/src/schemas/client-protocol/versioned.ts +41 -21
  191. package/src/schemas/client-protocol-zod/mod.ts +103 -0
  192. package/src/schemas/file-system-driver/mod.ts +1 -1
  193. package/src/schemas/file-system-driver/versioned.ts +42 -19
  194. package/src/serde.ts +33 -11
  195. package/src/test/mod.ts +7 -3
  196. package/src/utils/node.ts +173 -0
  197. package/src/utils.ts +0 -4
  198. package/dist/tsup/chunk-227FEWMB.js.map +0 -1
  199. package/dist/tsup/chunk-2JYPS5YM.cjs.map +0 -1
  200. package/dist/tsup/chunk-36JJ4IQB.cjs.map +0 -1
  201. package/dist/tsup/chunk-7L65NNWP.cjs.map +0 -1
  202. package/dist/tsup/chunk-BLK27ES3.js.map +0 -1
  203. package/dist/tsup/chunk-BOMZS2TJ.js.map +0 -1
  204. package/dist/tsup/chunk-BYMKMOBS.js.map +0 -1
  205. package/dist/tsup/chunk-FX7TWFQR.js.map +0 -1
  206. package/dist/tsup/chunk-G64QUEDJ.js.map +0 -1
  207. package/dist/tsup/chunk-HHFKKVLR.cjs.map +0 -1
  208. package/dist/tsup/chunk-INNFK746.cjs.map +0 -1
  209. package/dist/tsup/chunk-KSRXX3Z4.cjs.map +0 -1
  210. package/dist/tsup/chunk-O44LFKSB.cjs +0 -4623
  211. package/dist/tsup/chunk-O44LFKSB.cjs.map +0 -1
  212. package/dist/tsup/chunk-PLUN2NQT.js.map +0 -1
  213. package/dist/tsup/chunk-S4UJG7ZE.js +0 -1119
  214. package/dist/tsup/chunk-S4UJG7ZE.js.map +0 -1
  215. package/dist/tsup/chunk-SHVX2QUR.cjs.map +0 -1
  216. package/dist/tsup/chunk-VFB23BYZ.cjs +0 -1119
  217. package/dist/tsup/chunk-VFB23BYZ.cjs.map +0 -1
  218. package/dist/tsup/chunk-VHGY7PU5.cjs.map +0 -1
  219. package/dist/tsup/chunk-YBG6R7LX.js.map +0 -1
  220. package/dist/tsup/chunk-YBHYXIP6.js.map +0 -1
  221. package/src/actor/action.ts +0 -178
  222. package/src/actor/conn-drivers.ts +0 -216
  223. package/src/actor/conn-socket.ts +0 -8
  224. package/src/actor/conn.ts +0 -272
  225. package/src/actor/instance.ts +0 -2336
  226. package/src/actor/persisted.ts +0 -49
  227. package/src/actor/unstable-react.ts +0 -110
  228. package/src/driver-test-suite/tests/actor-reconnect.ts +0 -170
  229. package/src/drivers/engine/kv.ts +0 -3
  230. package/src/manager/hono-websocket-adapter.ts +0 -393
  231. /package/dist/tsup/{chunk-CD33GT6Z.js.map → chunk-QIHBDXTO.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;