rivetkit 2.0.3 → 2.0.4

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 (233) hide show
  1. package/README.md +11 -0
  2. package/dist/schemas/actor-persist/v1.ts +21 -24
  3. package/dist/schemas/client-protocol/v1.ts +6 -0
  4. package/dist/tsup/actor/errors.cjs +10 -2
  5. package/dist/tsup/actor/errors.cjs.map +1 -1
  6. package/dist/tsup/actor/errors.d.cts +17 -4
  7. package/dist/tsup/actor/errors.d.ts +17 -4
  8. package/dist/tsup/actor/errors.js +11 -3
  9. package/dist/tsup/{chunk-6PDXBYI5.js → chunk-3F2YSRJL.js} +8 -23
  10. package/dist/tsup/chunk-3F2YSRJL.js.map +1 -0
  11. package/dist/tsup/chunk-4CXBCT26.cjs +250 -0
  12. package/dist/tsup/chunk-4CXBCT26.cjs.map +1 -0
  13. package/dist/tsup/chunk-4R73YDN3.cjs +20 -0
  14. package/dist/tsup/chunk-4R73YDN3.cjs.map +1 -0
  15. package/dist/tsup/{chunk-OGAPU3UG.cjs → chunk-6LJT3QRL.cjs} +39 -25
  16. package/dist/tsup/chunk-6LJT3QRL.cjs.map +1 -0
  17. package/dist/tsup/{chunk-6WKQDDUD.cjs → chunk-GICQ3YCU.cjs} +143 -141
  18. package/dist/tsup/chunk-GICQ3YCU.cjs.map +1 -0
  19. package/dist/tsup/{chunk-FLMTTN27.js → chunk-H26RP6GD.js} +15 -8
  20. package/dist/tsup/chunk-H26RP6GD.js.map +1 -0
  21. package/dist/tsup/chunk-HI3HWJRC.js +20 -0
  22. package/dist/tsup/chunk-HI3HWJRC.js.map +1 -0
  23. package/dist/tsup/{chunk-4NSUQZ2H.js → chunk-HLLF4B4Q.js} +116 -114
  24. package/dist/tsup/chunk-HLLF4B4Q.js.map +1 -0
  25. package/dist/tsup/{chunk-FCCPJNMA.cjs → chunk-IH6CKNDW.cjs} +12 -27
  26. package/dist/tsup/chunk-IH6CKNDW.cjs.map +1 -0
  27. package/dist/tsup/chunk-LV2S3OU3.js +250 -0
  28. package/dist/tsup/chunk-LV2S3OU3.js.map +1 -0
  29. package/dist/tsup/{chunk-R2OPSKIV.cjs → chunk-LWNKVZG5.cjs} +20 -13
  30. package/dist/tsup/chunk-LWNKVZG5.cjs.map +1 -0
  31. package/dist/tsup/{chunk-INGJP237.js → chunk-NFU2BBT5.js} +102 -43
  32. package/dist/tsup/chunk-NFU2BBT5.js.map +1 -0
  33. package/dist/tsup/{chunk-3H7O2A7I.js → chunk-PQY7KKTL.js} +33 -19
  34. package/dist/tsup/chunk-PQY7KKTL.js.map +1 -0
  35. package/dist/tsup/{chunk-PO4VLDWA.js → chunk-QK72M5JB.js} +3 -5
  36. package/dist/tsup/chunk-QK72M5JB.js.map +1 -0
  37. package/dist/tsup/{chunk-TZJKSBUQ.cjs → chunk-QNNXFOQV.cjs} +3 -5
  38. package/dist/tsup/chunk-QNNXFOQV.cjs.map +1 -0
  39. package/dist/tsup/{chunk-GIR3AFFI.cjs → chunk-SBHHJ6QS.cjs} +102 -43
  40. package/dist/tsup/chunk-SBHHJ6QS.cjs.map +1 -0
  41. package/dist/tsup/chunk-TQ62L3X7.js +325 -0
  42. package/dist/tsup/chunk-TQ62L3X7.js.map +1 -0
  43. package/dist/tsup/chunk-VO7ZRVVD.cjs +6293 -0
  44. package/dist/tsup/chunk-VO7ZRVVD.cjs.map +1 -0
  45. package/dist/tsup/chunk-WHBPJNGW.cjs +325 -0
  46. package/dist/tsup/chunk-WHBPJNGW.cjs.map +1 -0
  47. package/dist/tsup/chunk-XJQHKJ4P.js +6293 -0
  48. package/dist/tsup/chunk-XJQHKJ4P.js.map +1 -0
  49. package/dist/tsup/client/mod.cjs +10 -10
  50. package/dist/tsup/client/mod.d.cts +7 -13
  51. package/dist/tsup/client/mod.d.ts +7 -13
  52. package/dist/tsup/client/mod.js +9 -9
  53. package/dist/tsup/common/log.cjs +12 -4
  54. package/dist/tsup/common/log.cjs.map +1 -1
  55. package/dist/tsup/common/log.d.cts +23 -17
  56. package/dist/tsup/common/log.d.ts +23 -17
  57. package/dist/tsup/common/log.js +15 -7
  58. package/dist/tsup/common/websocket.cjs +5 -5
  59. package/dist/tsup/common/websocket.js +4 -4
  60. package/dist/tsup/{common-CpqORuCq.d.cts → common-CXCe7s6i.d.cts} +2 -2
  61. package/dist/tsup/{common-CpqORuCq.d.ts → common-CXCe7s6i.d.ts} +2 -2
  62. package/dist/tsup/{connection-BwUMoe6n.d.ts → connection-BI-6UIBJ.d.ts} +196 -226
  63. package/dist/tsup/{connection-BR_Ve4ku.d.cts → connection-Dyd4NLGW.d.cts} +196 -226
  64. package/dist/tsup/driver-helpers/mod.cjs +6 -9
  65. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  66. package/dist/tsup/driver-helpers/mod.d.cts +5 -6
  67. package/dist/tsup/driver-helpers/mod.d.ts +5 -6
  68. package/dist/tsup/driver-helpers/mod.js +6 -9
  69. package/dist/tsup/driver-test-suite/mod.cjs +155 -1363
  70. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  71. package/dist/tsup/driver-test-suite/mod.d.cts +11 -5
  72. package/dist/tsup/driver-test-suite/mod.d.ts +11 -5
  73. package/dist/tsup/driver-test-suite/mod.js +876 -2084
  74. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  75. package/dist/tsup/inspector/mod.cjs +6 -8
  76. package/dist/tsup/inspector/mod.cjs.map +1 -1
  77. package/dist/tsup/inspector/mod.d.cts +3 -3
  78. package/dist/tsup/inspector/mod.d.ts +3 -3
  79. package/dist/tsup/inspector/mod.js +8 -10
  80. package/dist/tsup/mod.cjs +9 -15
  81. package/dist/tsup/mod.cjs.map +1 -1
  82. package/dist/tsup/mod.d.cts +47 -42
  83. package/dist/tsup/mod.d.ts +47 -42
  84. package/dist/tsup/mod.js +10 -16
  85. package/dist/tsup/{router-endpoints-DAbqVFx2.d.ts → router-endpoints-BTe_Rsdn.d.cts} +2 -3
  86. package/dist/tsup/{router-endpoints-AYkXG8Tl.d.cts → router-endpoints-CBSrKHmo.d.ts} +2 -3
  87. package/dist/tsup/test/mod.cjs +10 -14
  88. package/dist/tsup/test/mod.cjs.map +1 -1
  89. package/dist/tsup/test/mod.d.cts +4 -5
  90. package/dist/tsup/test/mod.d.ts +4 -5
  91. package/dist/tsup/test/mod.js +9 -13
  92. package/dist/tsup/{utils-CT0cv4jd.d.ts → utils-fwx3o3K9.d.cts} +1 -0
  93. package/dist/tsup/{utils-CT0cv4jd.d.cts → utils-fwx3o3K9.d.ts} +1 -0
  94. package/dist/tsup/utils.cjs +3 -3
  95. package/dist/tsup/utils.d.cts +1 -1
  96. package/dist/tsup/utils.d.ts +1 -1
  97. package/dist/tsup/utils.js +2 -2
  98. package/package.json +4 -4
  99. package/src/actor/action.ts +1 -5
  100. package/src/actor/config.ts +27 -295
  101. package/src/actor/connection.ts +9 -12
  102. package/src/actor/context.ts +1 -4
  103. package/src/actor/definition.ts +7 -11
  104. package/src/actor/errors.ts +97 -35
  105. package/src/actor/generic-conn-driver.ts +28 -16
  106. package/src/actor/instance.ts +177 -133
  107. package/src/actor/log.ts +4 -13
  108. package/src/actor/mod.ts +0 -5
  109. package/src/actor/protocol/old.ts +42 -26
  110. package/src/actor/protocol/serde.ts +1 -1
  111. package/src/actor/router-endpoints.ts +41 -38
  112. package/src/actor/router.ts +20 -18
  113. package/src/actor/unstable-react.ts +1 -1
  114. package/src/actor/utils.ts +6 -2
  115. package/src/client/actor-common.ts +1 -1
  116. package/src/client/actor-conn.ts +152 -91
  117. package/src/client/actor-handle.ts +85 -25
  118. package/src/client/actor-query.ts +65 -0
  119. package/src/client/client.ts +29 -98
  120. package/src/client/config.ts +44 -0
  121. package/src/client/errors.ts +1 -0
  122. package/src/client/log.ts +2 -4
  123. package/src/client/mod.ts +16 -12
  124. package/src/client/raw-utils.ts +82 -25
  125. package/src/client/utils.ts +5 -3
  126. package/src/common/fake-event-source.ts +10 -9
  127. package/src/common/inline-websocket-adapter2.ts +39 -30
  128. package/src/common/log.ts +176 -101
  129. package/src/common/logfmt.ts +21 -30
  130. package/src/common/router.ts +12 -19
  131. package/src/common/utils.ts +27 -13
  132. package/src/common/websocket.ts +0 -1
  133. package/src/driver-helpers/mod.ts +1 -1
  134. package/src/driver-test-suite/log.ts +1 -3
  135. package/src/driver-test-suite/mod.ts +86 -60
  136. package/src/driver-test-suite/tests/actor-handle.ts +33 -0
  137. package/src/driver-test-suite/tests/manager-driver.ts +5 -3
  138. package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -226
  139. package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -392
  140. package/src/driver-test-suite/tests/request-access.ts +112 -126
  141. package/src/driver-test-suite/utils.ts +13 -10
  142. package/src/drivers/default.ts +7 -4
  143. package/src/drivers/engine/actor-driver.ts +22 -13
  144. package/src/drivers/engine/config.ts +2 -10
  145. package/src/drivers/engine/kv.ts +1 -1
  146. package/src/drivers/engine/log.ts +1 -3
  147. package/src/drivers/engine/mod.ts +2 -3
  148. package/src/drivers/file-system/actor.ts +1 -1
  149. package/src/drivers/file-system/global-state.ts +33 -20
  150. package/src/drivers/file-system/log.ts +1 -3
  151. package/src/drivers/file-system/manager.ts +31 -8
  152. package/src/inspector/config.ts +9 -4
  153. package/src/inspector/log.ts +1 -1
  154. package/src/inspector/manager.ts +2 -2
  155. package/src/inspector/utils.ts +1 -1
  156. package/src/manager/driver.ts +10 -2
  157. package/src/manager/hono-websocket-adapter.ts +21 -12
  158. package/src/manager/log.ts +2 -4
  159. package/src/manager/mod.ts +1 -1
  160. package/src/manager/router.ts +277 -1657
  161. package/src/manager-api/routes/actors-create.ts +16 -0
  162. package/src/manager-api/routes/actors-delete.ts +4 -0
  163. package/src/manager-api/routes/actors-get-by-id.ts +7 -0
  164. package/src/manager-api/routes/actors-get-or-create-by-id.ts +29 -0
  165. package/src/manager-api/routes/actors-get.ts +7 -0
  166. package/src/manager-api/routes/common.ts +18 -0
  167. package/src/mod.ts +0 -2
  168. package/src/registry/config.ts +1 -1
  169. package/src/registry/log.ts +2 -4
  170. package/src/registry/mod.ts +57 -24
  171. package/src/registry/run-config.ts +31 -33
  172. package/src/registry/serve.ts +4 -5
  173. package/src/remote-manager-driver/actor-http-client.ts +72 -0
  174. package/src/remote-manager-driver/actor-websocket-client.ts +63 -0
  175. package/src/remote-manager-driver/api-endpoints.ts +79 -0
  176. package/src/remote-manager-driver/api-utils.ts +43 -0
  177. package/src/remote-manager-driver/log.ts +5 -0
  178. package/src/remote-manager-driver/mod.ts +274 -0
  179. package/src/{drivers/engine → remote-manager-driver}/ws-proxy.ts +24 -14
  180. package/src/serde.ts +8 -2
  181. package/src/test/log.ts +1 -3
  182. package/src/test/mod.ts +17 -16
  183. package/dist/tsup/chunk-2CRLFV6Z.cjs +0 -202
  184. package/dist/tsup/chunk-2CRLFV6Z.cjs.map +0 -1
  185. package/dist/tsup/chunk-3H7O2A7I.js.map +0 -1
  186. package/dist/tsup/chunk-42I3OZ3Q.js +0 -15
  187. package/dist/tsup/chunk-42I3OZ3Q.js.map +0 -1
  188. package/dist/tsup/chunk-4NSUQZ2H.js.map +0 -1
  189. package/dist/tsup/chunk-6PDXBYI5.js.map +0 -1
  190. package/dist/tsup/chunk-6WKQDDUD.cjs.map +0 -1
  191. package/dist/tsup/chunk-CTBOSFUH.cjs +0 -116
  192. package/dist/tsup/chunk-CTBOSFUH.cjs.map +0 -1
  193. package/dist/tsup/chunk-EGVZZFE2.js +0 -2857
  194. package/dist/tsup/chunk-EGVZZFE2.js.map +0 -1
  195. package/dist/tsup/chunk-FCCPJNMA.cjs.map +0 -1
  196. package/dist/tsup/chunk-FLMTTN27.js.map +0 -1
  197. package/dist/tsup/chunk-GIR3AFFI.cjs.map +0 -1
  198. package/dist/tsup/chunk-INGJP237.js.map +0 -1
  199. package/dist/tsup/chunk-KJCJLKRM.js +0 -116
  200. package/dist/tsup/chunk-KJCJLKRM.js.map +0 -1
  201. package/dist/tsup/chunk-KUPQZYUQ.cjs +0 -15
  202. package/dist/tsup/chunk-KUPQZYUQ.cjs.map +0 -1
  203. package/dist/tsup/chunk-O2MBYIXO.cjs +0 -2857
  204. package/dist/tsup/chunk-O2MBYIXO.cjs.map +0 -1
  205. package/dist/tsup/chunk-OGAPU3UG.cjs.map +0 -1
  206. package/dist/tsup/chunk-OV6AYD4S.js +0 -4406
  207. package/dist/tsup/chunk-OV6AYD4S.js.map +0 -1
  208. package/dist/tsup/chunk-PO4VLDWA.js.map +0 -1
  209. package/dist/tsup/chunk-R2OPSKIV.cjs.map +0 -1
  210. package/dist/tsup/chunk-TZJKSBUQ.cjs.map +0 -1
  211. package/dist/tsup/chunk-UBUC5C3G.cjs +0 -189
  212. package/dist/tsup/chunk-UBUC5C3G.cjs.map +0 -1
  213. package/dist/tsup/chunk-UIM22YJL.cjs +0 -4406
  214. package/dist/tsup/chunk-UIM22YJL.cjs.map +0 -1
  215. package/dist/tsup/chunk-URVFQMYI.cjs +0 -230
  216. package/dist/tsup/chunk-URVFQMYI.cjs.map +0 -1
  217. package/dist/tsup/chunk-UVUPOS46.js +0 -230
  218. package/dist/tsup/chunk-UVUPOS46.js.map +0 -1
  219. package/dist/tsup/chunk-VRRHBNJC.js +0 -189
  220. package/dist/tsup/chunk-VRRHBNJC.js.map +0 -1
  221. package/dist/tsup/chunk-XFSS33EQ.js +0 -202
  222. package/dist/tsup/chunk-XFSS33EQ.js.map +0 -1
  223. package/src/client/http-client-driver.ts +0 -326
  224. package/src/driver-test-suite/test-inline-client-driver.ts +0 -402
  225. package/src/driver-test-suite/tests/actor-auth.ts +0 -591
  226. package/src/drivers/engine/api-endpoints.ts +0 -128
  227. package/src/drivers/engine/api-utils.ts +0 -70
  228. package/src/drivers/engine/manager-driver.ts +0 -391
  229. package/src/inline-client-driver/log.ts +0 -7
  230. package/src/inline-client-driver/mod.ts +0 -385
  231. package/src/manager/auth.ts +0 -121
  232. /package/src/{drivers/engine → actor}/keys.test.ts +0 -0
  233. /package/src/{drivers/engine → actor}/keys.ts +0 -0
@@ -7,7 +7,7 @@ import {
7
7
  } from "@/actor/router-endpoints";
8
8
  import { HttpResponseError } from "@/schemas/client-protocol/mod";
9
9
  import { HTTP_RESPONSE_ERROR_VERSIONED } from "@/schemas/client-protocol/versioned";
10
- import { serializeWithEncoding } from "@/serde";
10
+ import { encodingIsBinary, serializeWithEncoding } from "@/serde";
11
11
  import { bufferToArrayBuffer } from "@/utils";
12
12
  import { getLogger, type Logger } from "./log";
13
13
  import { deconstructError, stringifyError } from "./utils";
@@ -25,7 +25,8 @@ export function loggerMiddleware(logger: Logger) {
25
25
  await next();
26
26
 
27
27
  const duration = Date.now() - startTime;
28
- logger.debug("http request", {
28
+ logger.debug({
29
+ msg: "http request",
29
30
  method,
30
31
  path,
31
32
  status: c.res.status,
@@ -41,19 +42,10 @@ export function handleRouteNotFound(c: HonoContext) {
41
42
  return c.text("Not Found (RivetKit)", 404);
42
43
  }
43
44
 
44
- export interface HandleRouterErrorOpts {
45
- enableExposeInternalError?: boolean;
46
- }
47
-
48
- export function handleRouteError(
49
- opts: HandleRouterErrorOpts,
50
- error: unknown,
51
- c: HonoContext,
52
- ) {
53
- const exposeInternalError =
54
- opts.enableExposeInternalError && getRequestExposeInternalError(c.req.raw);
45
+ export function handleRouteError(error: unknown, c: HonoContext) {
46
+ const exposeInternalError = getRequestExposeInternalError(c.req.raw);
55
47
 
56
- const { statusCode, code, message, metadata } = deconstructError(
48
+ const { statusCode, group, code, message, metadata } = deconstructError(
57
49
  error,
58
50
  logger(),
59
51
  {
@@ -66,19 +58,20 @@ export function handleRouteError(
66
58
  let encoding: Encoding;
67
59
  try {
68
60
  encoding = getRequestEncoding(c.req);
69
- } catch (err) {
70
- logger().debug("failed to extract encoding", {
71
- error: stringifyError(err),
72
- });
61
+ } catch (_) {
73
62
  encoding = "json";
74
63
  }
75
64
 
76
65
  const output = serializeWithEncoding(
77
66
  encoding,
78
67
  {
68
+ group,
79
69
  code,
80
70
  message,
81
- metadata: bufferToArrayBuffer(cbor.encode(metadata)),
71
+ // TODO: Cannot serialize non-binary meta since it requires ArrayBuffer atm
72
+ metadata: encodingIsBinary(encoding)
73
+ ? bufferToArrayBuffer(cbor.encode(metadata))
74
+ : null,
82
75
  },
83
76
  HTTP_RESPONSE_ERROR_VERSIONED,
84
77
  );
@@ -186,6 +186,7 @@ export interface DeconstructedError {
186
186
  __type: "ActorError";
187
187
  statusCode: ContentfulStatusCode;
188
188
  public: boolean;
189
+ group: string;
189
190
  code: string;
190
191
  message: string;
191
192
  metadata?: unknown;
@@ -203,6 +204,7 @@ export function deconstructError(
203
204
  // We log the error here instead of after generating the code & message because we need to log the original error, not the masked internal error.
204
205
  let statusCode: ContentfulStatusCode;
205
206
  let public_: boolean;
207
+ let group: string;
206
208
  let code: string;
207
209
  let message: string;
208
210
  let metadata: unknown;
@@ -212,60 +214,71 @@ export function deconstructError(
212
214
  "statusCode" in error && error.statusCode ? error.statusCode : 400
213
215
  ) as ContentfulStatusCode;
214
216
  public_ = true;
217
+ group = error.group;
215
218
  code = error.code;
216
219
  message = getErrorMessage(error);
217
220
  metadata = error.metadata;
218
221
 
219
- logger.info("public error", {
222
+ logger.info({
223
+ msg: "public error",
224
+ group,
220
225
  code,
221
226
  message,
222
- issues: "https://github.com/rivet-gg/rivetkit/issues",
223
- support: "https://rivet.gg/discord",
227
+ issues: "https://github.com/rivet-dev/rivetkit/issues",
228
+ support: "https://rivet.dev/discord",
224
229
  ...extraLog,
225
230
  });
226
231
  } else if (exposeInternalError) {
227
232
  if (errors.ActorError.isActorError(error)) {
228
233
  statusCode = 500;
229
234
  public_ = false;
235
+ group = error.group;
230
236
  code = error.code;
231
237
  message = getErrorMessage(error);
232
238
  metadata = error.metadata;
233
239
 
234
- logger.info("internal error", {
240
+ logger.info({
241
+ msg: "internal error",
242
+ group,
235
243
  code,
236
244
  message,
237
- issues: "https://github.com/rivet-gg/rivetkit/issues",
238
- support: "https://rivet.gg/discord",
245
+ issues: "https://github.com/rivet-dev/rivetkit/issues",
246
+ support: "https://rivet.dev/discord",
239
247
  ...extraLog,
240
248
  });
241
249
  } else {
242
250
  statusCode = 500;
243
251
  public_ = false;
252
+ group = "internal";
244
253
  code = errors.INTERNAL_ERROR_CODE;
245
254
  message = getErrorMessage(error);
246
255
 
247
- logger.info("internal error", {
256
+ logger.info({
257
+ msg: "internal error",
258
+ group,
248
259
  code,
249
260
  message,
250
- issues: "https://github.com/rivet-gg/rivetkit/issues",
251
- support: "https://rivet.gg/discord",
261
+ issues: "https://github.com/rivet-dev/rivetkit/issues",
262
+ support: "https://rivet.dev/discord",
252
263
  ...extraLog,
253
264
  });
254
265
  }
255
266
  } else {
256
267
  statusCode = 500;
257
268
  public_ = false;
269
+ group = "internal";
258
270
  code = errors.INTERNAL_ERROR_CODE;
259
271
  message = errors.INTERNAL_ERROR_DESCRIPTION;
260
272
  metadata = {
261
- //url: `https://hub.rivet.gg/projects/${actorMetadata.project.slug}/environments/${actorMetadata.environment.slug}/actors?actorId=${actorMetadata.actor.id}`,
273
+ //url: `https://hub.rivet.dev/projects/${actorMetadata.project.slug}/environments/${actorMetadata.environment.slug}/actors?actorId=${actorMetadata.actor.id}`,
262
274
  } satisfies errors.InternalErrorMetadata;
263
275
 
264
- logger.warn("internal error", {
276
+ logger.warn({
277
+ msg: "internal error",
265
278
  error: getErrorMessage(error),
266
279
  stack: (error as Error)?.stack,
267
- issues: "https://github.com/rivet-gg/rivetkit/issues",
268
- support: "https://rivet.gg/discord",
280
+ issues: "https://github.com/rivet-dev/rivetkit/issues",
281
+ support: "https://rivet.dev/discord",
269
282
  ...extraLog,
270
283
  });
271
284
  }
@@ -274,6 +287,7 @@ export function deconstructError(
274
287
  __type: "ActorError",
275
288
  statusCode,
276
289
  public: public_,
290
+ group,
277
291
  code,
278
292
  message,
279
293
  metadata,
@@ -16,7 +16,6 @@ export async function importWebSocket(): Promise<typeof WebSocket> {
16
16
  if (typeof WebSocket !== "undefined") {
17
17
  // Browser environment
18
18
  _WebSocket = WebSocket as unknown as typeof WebSocket;
19
- logger().debug("using native websocket");
20
19
  } else {
21
20
  // Node.js environment
22
21
  try {
@@ -8,7 +8,6 @@ export {
8
8
  HEADER_CONN_PARAMS,
9
9
  HEADER_CONN_TOKEN,
10
10
  HEADER_ENCODING,
11
- HEADER_EXPOSE_INTERNAL_ERROR,
12
11
  } from "@/actor/router-endpoints";
13
12
  export type {
14
13
  ActorOutput,
@@ -16,6 +15,7 @@ export type {
16
15
  GetForIdInput,
17
16
  GetOrCreateWithKeyInput,
18
17
  GetWithKeyInput,
18
+ ManagerDisplayInformation,
19
19
  ManagerDriver,
20
20
  } from "@/manager/driver";
21
21
  export { DriverConfigSchema, RunConfigSchema } from "@/registry/run-config";
@@ -1,7 +1,5 @@
1
1
  import { getLogger } from "@/common/log";
2
2
 
3
- export const LOGGER_NAME = "test-suite";
4
-
5
3
  export function logger() {
6
- return getLogger(LOGGER_NAME);
4
+ return getLogger("test-suite");
7
5
  }
@@ -4,13 +4,12 @@ import { bundleRequire } from "bundle-require";
4
4
  import invariant from "invariant";
5
5
  import { describe } from "vitest";
6
6
  import type { Transport } from "@/client/mod";
7
- import { createInlineClientDriver } from "@/inline-client-driver/mod";
8
7
  import { createManagerRouter } from "@/manager/router";
9
8
  import type { DriverConfig, Registry, RunConfig } from "@/mod";
10
9
  import { RunConfigSchema } from "@/registry/run-config";
11
10
  import { getPort } from "@/test/mod";
11
+ import { logger } from "./log";
12
12
  import { runActionFeaturesTests } from "./tests/action-features";
13
- import { runActorAuthTests } from "./tests/actor-auth";
14
13
  import { runActorConnTests } from "./tests/actor-conn";
15
14
  import { runActorConnStateTests } from "./tests/actor-conn-state";
16
15
  import {
@@ -26,10 +25,8 @@ import { runActorOnStateChangeTests } from "./tests/actor-onstatechange";
26
25
  import { runActorVarsTests } from "./tests/actor-vars";
27
26
  import { runManagerDriverTests } from "./tests/manager-driver";
28
27
  import { runRawHttpTests } from "./tests/raw-http";
29
- import { runRawHttpDirectRegistryTests } from "./tests/raw-http-direct-registry";
30
28
  import { runRawHttpRequestPropertiesTests } from "./tests/raw-http-request-properties";
31
29
  import { runRawWebSocketTests } from "./tests/raw-websocket";
32
- import { runRawWebSocketDirectRegistryTests } from "./tests/raw-websocket-direct-registry";
33
30
  import { runRequestAccessTests } from "./tests/request-access";
34
31
 
35
32
  export interface SkipTests {
@@ -68,6 +65,8 @@ type ClientType = "http" | "inline";
68
65
 
69
66
  export interface DriverDeployOutput {
70
67
  endpoint: string;
68
+ namespace: string;
69
+ runnerName: string;
71
70
 
72
71
  /** Cleans up the test. */
73
72
  cleanup(): Promise<void>;
@@ -114,8 +113,6 @@ export function runDriverTests(
114
113
 
115
114
  runActorErrorHandlingTests(driverTestConfig);
116
115
 
117
- runActorAuthTests(driverTestConfig);
118
-
119
116
  runActorInlineClientTests(driverTestConfig);
120
117
 
121
118
  runRawHttpTests(driverTestConfig);
@@ -124,9 +121,11 @@ export function runDriverTests(
124
121
 
125
122
  runRawWebSocketTests(driverTestConfig);
126
123
 
127
- runRawHttpDirectRegistryTests(driverTestConfig);
124
+ // TODO: re-expose this once we can have actor queries on the gateway
125
+ // runRawHttpDirectRegistryTests(driverTestConfig);
128
126
 
129
- runRawWebSocketDirectRegistryTests(driverTestConfig);
127
+ // TODO: re-expose this once we can have actor queries on the gateway
128
+ // runRawWebSocketDirectRegistryTests(driverTestConfig);
130
129
 
131
130
  runActorInspectorTests(driverTestConfig);
132
131
  });
@@ -141,6 +140,7 @@ export function runDriverTests(
141
140
  export async function createTestRuntime(
142
141
  registryPath: string,
143
142
  driverFactory: (registry: Registry<any>) => Promise<{
143
+ rivetEngine?: { endpoint: string; namespace: string; runnerName: string };
144
144
  driver: DriverConfig;
145
145
  cleanup?: () => Promise<void>;
146
146
  }>,
@@ -156,58 +156,84 @@ export async function createTestRuntime(
156
156
  registry.config.test.enabled = true;
157
157
 
158
158
  // Build drivers
159
- const { driver, cleanup: driverCleanup } = await driverFactory(registry);
160
-
161
- // Build driver config
162
- let injectWebSocket: NodeWebSocket["injectWebSocket"] | undefined;
163
- let upgradeWebSocket: any;
164
- const config: RunConfig = RunConfigSchema.parse({
159
+ const {
165
160
  driver,
166
- getUpgradeWebSocket: () => upgradeWebSocket!,
167
- inspector: {
168
- enabled: true,
169
- token: () => "token",
170
- },
171
- });
161
+ cleanup: driverCleanup,
162
+ rivetEngine,
163
+ } = await driverFactory(registry);
172
164
 
173
- // Create router
174
- const managerDriver = driver.manager(registry.config, config);
175
- const inlineDriver = createInlineClientDriver(managerDriver);
176
- const { router } = createManagerRouter(
177
- registry.config,
178
- config,
179
- inlineDriver,
180
- managerDriver,
181
- false,
182
- );
183
-
184
- // Inject WebSocket
185
- const nodeWebSocket = createNodeWebSocket({ app: router });
186
- upgradeWebSocket = nodeWebSocket.upgradeWebSocket;
187
- injectWebSocket = nodeWebSocket.injectWebSocket;
188
-
189
- // Start server
190
- const port = await getPort();
191
- const server = honoServe({
192
- fetch: router.fetch,
193
- hostname: "127.0.0.1",
194
- port,
195
- });
196
- invariant(injectWebSocket !== undefined, "should have injectWebSocket");
197
- injectWebSocket(server);
198
- const endpoint = `http://127.0.0.1:${port}`;
199
-
200
- // Cleanup
201
- const cleanup = async () => {
202
- // Stop server
203
- await new Promise((resolve) => server.close(() => resolve(undefined)));
204
-
205
- // Extra cleanup
206
- await driverCleanup?.();
207
- };
208
-
209
- return {
210
- endpoint,
211
- cleanup,
212
- };
165
+ if (rivetEngine) {
166
+ // TODO: We don't need createTestRuntime fort his
167
+ // Using external Rivet engine
168
+
169
+ const cleanup = async () => {
170
+ await driverCleanup?.();
171
+ };
172
+
173
+ return {
174
+ endpoint: rivetEngine.endpoint,
175
+ namespace: rivetEngine.namespace,
176
+ runnerName: rivetEngine.runnerName,
177
+ cleanup,
178
+ };
179
+ } else {
180
+ // Start server for Rivet engine
181
+
182
+ // Build driver config
183
+ // biome-ignore lint/style/useConst: Assigned later
184
+ let upgradeWebSocket: any;
185
+ const config: RunConfig = RunConfigSchema.parse({
186
+ driver,
187
+ getUpgradeWebSocket: () => upgradeWebSocket!,
188
+ inspector: {
189
+ enabled: true,
190
+ token: () => "token",
191
+ },
192
+ });
193
+
194
+ // Create router
195
+ const managerDriver = driver.manager(registry.config, config);
196
+ const { router } = createManagerRouter(
197
+ registry.config,
198
+ config,
199
+ managerDriver,
200
+ false,
201
+ );
202
+
203
+ // Inject WebSocket
204
+ const nodeWebSocket = createNodeWebSocket({ app: router });
205
+ upgradeWebSocket = nodeWebSocket.upgradeWebSocket;
206
+
207
+ // Start server
208
+ const port = await getPort();
209
+ const server = honoServe({
210
+ fetch: router.fetch,
211
+ hostname: "127.0.0.1",
212
+ port,
213
+ });
214
+ invariant(
215
+ nodeWebSocket.injectWebSocket !== undefined,
216
+ "should have injectWebSocket",
217
+ );
218
+ nodeWebSocket.injectWebSocket(server);
219
+ const serverEndpoint = `http://127.0.0.1:${port}`;
220
+
221
+ logger().info({ msg: "test serer listening", port });
222
+
223
+ // Cleanup
224
+ const cleanup = async () => {
225
+ // Stop server
226
+ await new Promise((resolve) => server.close(() => resolve(undefined)));
227
+
228
+ // Extra cleanup
229
+ await driverCleanup?.();
230
+ };
231
+
232
+ return {
233
+ endpoint: serverEndpoint,
234
+ namespace: "default",
235
+ runnerName: "rivetkit",
236
+ cleanup,
237
+ };
238
+ }
213
239
  }
@@ -1,4 +1,5 @@
1
1
  import { describe, expect, test } from "vitest";
2
+ import type { ActorError } from "@/client/mod";
2
3
  import type { DriverTestConfig } from "../mod";
3
4
  import { setupDriverTest } from "../utils";
4
5
 
@@ -74,6 +75,38 @@ export function runActorHandleTests(driverTestConfig: DriverTestConfig) {
74
75
  const retrievedCount = await handle.getCount();
75
76
  expect(retrievedCount).toBe(9);
76
77
  });
78
+
79
+ test("errors when calling create twice with the same key", async (c) => {
80
+ const { client } = await setupDriverTest(c, driverTestConfig);
81
+
82
+ const key = ["duplicate-create-handle", crypto.randomUUID()];
83
+
84
+ // First create should succeed
85
+ await client.counter.create(key);
86
+
87
+ // Second create with same key should throw ActorAlreadyExists
88
+ try {
89
+ await client.counter.create(key);
90
+ expect.fail("did not error on duplicate create");
91
+ } catch (err) {
92
+ expect((err as ActorError).group).toBe("actor");
93
+ expect((err as ActorError).code).toBe("already_exists");
94
+ }
95
+ });
96
+
97
+ test(".get().resolve() errors for non-existent actor", async (c) => {
98
+ const { client } = await setupDriverTest(c, driverTestConfig);
99
+
100
+ const missingId = `nonexistent-${crypto.randomUUID()}`;
101
+
102
+ try {
103
+ await client.counter.get([missingId]).resolve();
104
+ expect.fail("did not error for get().resolve() on missing actor");
105
+ } catch (err) {
106
+ expect((err as ActorError).group).toBe("actor");
107
+ expect((err as ActorError).code).toBe("not_found");
108
+ }
109
+ });
77
110
  });
78
111
 
79
112
  describe("Action Functionality", () => {
@@ -39,7 +39,8 @@ export function runManagerDriverTests(driverTestConfig: DriverTestConfig) {
39
39
  await client.counter.create(uniqueKey);
40
40
  expect.fail("did not error on duplicate create");
41
41
  } catch (err) {
42
- expect((err as ActorError).code).toBe("actor_already_exists");
42
+ expect((err as ActorError).group).toBe("actor");
43
+ expect((err as ActorError).code).toBe("already_exists");
43
44
  }
44
45
 
45
46
  // Verify the original actor still works and has its state
@@ -60,7 +61,8 @@ export function runManagerDriverTests(driverTestConfig: DriverTestConfig) {
60
61
  await client.counter.get([nonexistentId]).resolve();
61
62
  expect.fail("did not error for get");
62
63
  } catch (err) {
63
- expect((err as ActorError).code).toBe("actor_not_found");
64
+ expect((err as ActorError).group).toBe("actor");
65
+ expect((err as ActorError).code).toBe("not_found");
64
66
  }
65
67
 
66
68
  // Create the actor
@@ -319,7 +321,7 @@ export function runManagerDriverTests(driverTestConfig: DriverTestConfig) {
319
321
  });
320
322
 
321
323
  describe("Multiple Actor Instances", () => {
322
- // TODO: This test is flakey https://github.com/rivet-gg/rivetkit/issues/873
324
+ // TODO: This test is flakey https://github.com/rivet-dev/rivetkit/issues/873
323
325
  test("creates multiple actor instances of the same type", async (c) => {
324
326
  const { client } = await setupDriverTest(c, driverTestConfig);
325
327