rivetkit 2.0.20 → 2.0.22-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 (169) hide show
  1. package/dist/tsup/actor/errors.cjs.map +1 -1
  2. package/dist/tsup/{chunk-L3YPHXPE.js → chunk-4B25D5OW.js} +481 -100
  3. package/dist/tsup/chunk-4B25D5OW.js.map +1 -0
  4. package/dist/tsup/{chunk-G6JGHCG4.cjs → chunk-5EB77IQ2.cjs} +6 -6
  5. package/dist/tsup/chunk-5EB77IQ2.cjs.map +1 -0
  6. package/dist/tsup/{chunk-KUZWEM23.cjs → chunk-6Z3YA6QR.cjs} +8 -4
  7. package/dist/tsup/chunk-6Z3YA6QR.cjs.map +1 -0
  8. package/dist/tsup/{chunk-ZODINJWN.cjs → chunk-7FEMVD3D.cjs} +12 -12
  9. package/dist/tsup/chunk-7FEMVD3D.cjs.map +1 -0
  10. package/dist/tsup/{chunk-FYP3TZXD.cjs → chunk-BIOPK7IB.cjs} +32 -26
  11. package/dist/tsup/chunk-BIOPK7IB.cjs.map +1 -0
  12. package/dist/tsup/{chunk-KKRR7DSG.cjs → chunk-C2U6KGOG.cjs} +3 -3
  13. package/dist/tsup/chunk-C2U6KGOG.cjs.map +1 -0
  14. package/dist/tsup/{chunk-5F6X4AFU.js → chunk-EEXX243L.js} +6 -6
  15. package/dist/tsup/chunk-EEXX243L.js.map +1 -0
  16. package/dist/tsup/{chunk-GQ5WTE64.js → chunk-FETQGZN4.js} +263 -97
  17. package/dist/tsup/chunk-FETQGZN4.js.map +1 -0
  18. package/dist/tsup/{chunk-ER5OT3SQ.js → chunk-GJPOIJHZ.js} +2 -2
  19. package/dist/tsup/chunk-GJPOIJHZ.js.map +1 -0
  20. package/dist/tsup/{chunk-7ACKZS3T.js → chunk-I7EJWHYV.js} +13 -7
  21. package/dist/tsup/chunk-I7EJWHYV.js.map +1 -0
  22. package/dist/tsup/{chunk-QMVCFQ37.js → chunk-JKNDUKFI.js} +8 -4
  23. package/dist/tsup/chunk-JKNDUKFI.js.map +1 -0
  24. package/dist/tsup/{chunk-M6LIJ6BK.js → chunk-JN6GPVFY.js} +3 -3
  25. package/dist/tsup/chunk-KSRXX3Z4.cjs.map +1 -1
  26. package/dist/tsup/{chunk-DUOTOMP7.cjs → chunk-LCQDY73V.cjs} +3 -3
  27. package/dist/tsup/chunk-LCQDY73V.cjs.map +1 -0
  28. package/dist/tsup/{chunk-RI4YHZZW.js → chunk-NDLOG2JH.js} +2 -2
  29. package/dist/tsup/{chunk-RI4YHZZW.js.map → chunk-NDLOG2JH.js.map} +1 -1
  30. package/dist/tsup/{chunk-2S7HJMMY.cjs → chunk-OAB7ECAB.cjs} +630 -249
  31. package/dist/tsup/chunk-OAB7ECAB.cjs.map +1 -0
  32. package/dist/tsup/{chunk-PV22ZBDE.cjs → chunk-PELXJCJS.cjs} +16 -10
  33. package/dist/tsup/chunk-PELXJCJS.cjs.map +1 -0
  34. package/dist/tsup/{chunk-JZD6FEOE.cjs → chunk-R6XOZKMU.cjs} +455 -289
  35. package/dist/tsup/chunk-R6XOZKMU.cjs.map +1 -0
  36. package/dist/tsup/{chunk-QRUGCDA5.js → chunk-RPI45FGS.js} +2 -2
  37. package/dist/tsup/{chunk-MGHPBNWB.js → chunk-UBCUW7HD.js} +2 -2
  38. package/dist/tsup/{chunk-RJVSNJO7.cjs → chunk-VJLGVVGP.cjs} +7 -7
  39. package/dist/tsup/chunk-VJLGVVGP.cjs.map +1 -0
  40. package/dist/tsup/{chunk-YFFCPYHY.js → chunk-ZVEDMBFT.js} +11 -5
  41. package/dist/tsup/chunk-ZVEDMBFT.js.map +1 -0
  42. package/dist/tsup/{chunk-2I6L3VRO.cjs → chunk-ZZYMCYAY.cjs} +14 -14
  43. package/dist/tsup/chunk-ZZYMCYAY.cjs.map +1 -0
  44. package/dist/tsup/client/mod.cjs +9 -9
  45. package/dist/tsup/client/mod.cjs.map +1 -1
  46. package/dist/tsup/client/mod.d.cts +2 -2
  47. package/dist/tsup/client/mod.d.ts +2 -2
  48. package/dist/tsup/client/mod.js +8 -8
  49. package/dist/tsup/common/log.cjs +3 -3
  50. package/dist/tsup/common/log.cjs.map +1 -1
  51. package/dist/tsup/common/log.js +2 -2
  52. package/dist/tsup/common/websocket.cjs +4 -4
  53. package/dist/tsup/common/websocket.cjs.map +1 -1
  54. package/dist/tsup/common/websocket.js +3 -3
  55. package/dist/tsup/{conn-CmPcqOCF.d.ts → conn-Clu655RU.d.ts} +72 -71
  56. package/dist/tsup/{conn-DU5EbfCu.d.cts → conn-lUvFLo_q.d.cts} +72 -71
  57. package/dist/tsup/driver-helpers/mod.cjs +5 -5
  58. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  59. package/dist/tsup/driver-helpers/mod.d.cts +1 -1
  60. package/dist/tsup/driver-helpers/mod.d.ts +1 -1
  61. package/dist/tsup/driver-helpers/mod.js +4 -4
  62. package/dist/tsup/driver-test-suite/mod.cjs +603 -294
  63. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  64. package/dist/tsup/driver-test-suite/mod.d.cts +1 -1
  65. package/dist/tsup/driver-test-suite/mod.d.ts +1 -1
  66. package/dist/tsup/driver-test-suite/mod.js +574 -265
  67. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  68. package/dist/tsup/inspector/mod.cjs +6 -6
  69. package/dist/tsup/inspector/mod.cjs.map +1 -1
  70. package/dist/tsup/inspector/mod.d.cts +68 -7
  71. package/dist/tsup/inspector/mod.d.ts +68 -7
  72. package/dist/tsup/inspector/mod.js +5 -5
  73. package/dist/tsup/mod.cjs +10 -10
  74. package/dist/tsup/mod.cjs.map +1 -1
  75. package/dist/tsup/mod.d.cts +2 -2
  76. package/dist/tsup/mod.d.ts +2 -2
  77. package/dist/tsup/mod.js +9 -9
  78. package/dist/tsup/test/mod.cjs +11 -11
  79. package/dist/tsup/test/mod.cjs.map +1 -1
  80. package/dist/tsup/test/mod.d.cts +1 -1
  81. package/dist/tsup/test/mod.d.ts +1 -1
  82. package/dist/tsup/test/mod.js +10 -10
  83. package/dist/tsup/utils.cjs +2 -2
  84. package/dist/tsup/utils.cjs.map +1 -1
  85. package/dist/tsup/utils.js +1 -1
  86. package/package.json +4 -3
  87. package/src/actor/config.ts +108 -15
  88. package/src/actor/conn-drivers.ts +2 -1
  89. package/src/actor/instance.ts +119 -35
  90. package/src/actor/keys.test.ts +13 -4
  91. package/src/actor/protocol/old.ts +10 -3
  92. package/src/actor/router-endpoints.ts +26 -16
  93. package/src/actor/router.ts +41 -13
  94. package/src/actor/unstable-react.ts +1 -1
  95. package/src/client/actor-common.ts +3 -1
  96. package/src/client/actor-conn.ts +44 -12
  97. package/src/client/actor-handle.ts +4 -1
  98. package/src/client/client.ts +32 -18
  99. package/src/client/utils.ts +21 -8
  100. package/src/common/actor-router-consts.ts +2 -0
  101. package/src/common/inline-websocket-adapter2.ts +24 -6
  102. package/src/common/log.ts +6 -2
  103. package/src/common/logfmt.ts +3 -1
  104. package/src/common/router.ts +3 -1
  105. package/src/common/utils.ts +6 -2
  106. package/src/driver-helpers/utils.ts +4 -1
  107. package/src/driver-test-suite/mod.ts +15 -4
  108. package/src/driver-test-suite/test-inline-client-driver.ts +35 -13
  109. package/src/driver-test-suite/tests/action-features.ts +6 -2
  110. package/src/driver-test-suite/tests/actor-conn-state.ts +18 -8
  111. package/src/driver-test-suite/tests/actor-conn.ts +35 -13
  112. package/src/driver-test-suite/tests/actor-handle.ts +35 -15
  113. package/src/driver-test-suite/tests/actor-inline-client.ts +34 -23
  114. package/src/driver-test-suite/tests/actor-inspector.ts +241 -131
  115. package/src/driver-test-suite/tests/actor-reconnect.ts +14 -4
  116. package/src/driver-test-suite/tests/actor-schedule.ts +12 -3
  117. package/src/driver-test-suite/tests/actor-sleep.ts +6 -3
  118. package/src/driver-test-suite/tests/actor-vars.ts +6 -2
  119. package/src/driver-test-suite/tests/manager-driver.ts +16 -6
  120. package/src/driver-test-suite/tests/raw-http-request-properties.ts +64 -25
  121. package/src/driver-test-suite/tests/raw-http.ts +17 -5
  122. package/src/driver-test-suite/tests/raw-websocket.ts +36 -12
  123. package/src/driver-test-suite/tests/request-access.ts +18 -8
  124. package/src/drivers/engine/actor-driver.ts +46 -25
  125. package/src/drivers/engine/config.ts +2 -1
  126. package/src/drivers/file-system/global-state.ts +58 -16
  127. package/src/drivers/file-system/manager.ts +35 -12
  128. package/src/drivers/file-system/mod.ts +6 -1
  129. package/src/drivers/file-system/utils.ts +8 -2
  130. package/src/engine-process/mod.ts +15 -4
  131. package/src/inspector/actor.ts +63 -23
  132. package/src/inspector/config.ts +2 -1
  133. package/src/inspector/manager.ts +10 -3
  134. package/src/inspector/utils.ts +2 -1
  135. package/src/manager/driver.ts +4 -1
  136. package/src/manager/gateway.ts +278 -8
  137. package/src/manager/hono-websocket-adapter.ts +33 -10
  138. package/src/manager/router-schema.ts +4 -2
  139. package/src/manager/router.ts +78 -12
  140. package/src/manager-api/actors.ts +2 -0
  141. package/src/registry/mod.ts +31 -9
  142. package/src/registry/run-config.ts +3 -1
  143. package/src/remote-manager-driver/api-endpoints.ts +2 -2
  144. package/src/remote-manager-driver/mod.ts +23 -7
  145. package/src/remote-manager-driver/ws-proxy.ts +21 -5
  146. package/src/serde.ts +6 -2
  147. package/src/test/mod.ts +2 -1
  148. package/src/utils.ts +6 -2
  149. package/dist/tsup/chunk-2I6L3VRO.cjs.map +0 -1
  150. package/dist/tsup/chunk-2S7HJMMY.cjs.map +0 -1
  151. package/dist/tsup/chunk-5F6X4AFU.js.map +0 -1
  152. package/dist/tsup/chunk-7ACKZS3T.js.map +0 -1
  153. package/dist/tsup/chunk-DUOTOMP7.cjs.map +0 -1
  154. package/dist/tsup/chunk-ER5OT3SQ.js.map +0 -1
  155. package/dist/tsup/chunk-FYP3TZXD.cjs.map +0 -1
  156. package/dist/tsup/chunk-G6JGHCG4.cjs.map +0 -1
  157. package/dist/tsup/chunk-GQ5WTE64.js.map +0 -1
  158. package/dist/tsup/chunk-JZD6FEOE.cjs.map +0 -1
  159. package/dist/tsup/chunk-KKRR7DSG.cjs.map +0 -1
  160. package/dist/tsup/chunk-KUZWEM23.cjs.map +0 -1
  161. package/dist/tsup/chunk-L3YPHXPE.js.map +0 -1
  162. package/dist/tsup/chunk-PV22ZBDE.cjs.map +0 -1
  163. package/dist/tsup/chunk-QMVCFQ37.js.map +0 -1
  164. package/dist/tsup/chunk-RJVSNJO7.cjs.map +0 -1
  165. package/dist/tsup/chunk-YFFCPYHY.js.map +0 -1
  166. package/dist/tsup/chunk-ZODINJWN.cjs.map +0 -1
  167. /package/dist/tsup/{chunk-M6LIJ6BK.js.map → chunk-JN6GPVFY.js.map} +0 -0
  168. /package/dist/tsup/{chunk-QRUGCDA5.js.map → chunk-RPI45FGS.js.map} +0 -0
  169. /package/dist/tsup/{chunk-MGHPBNWB.js.map → chunk-UBCUW7HD.js.map} +0 -0
@@ -4,7 +4,7 @@ import {
4
4
  inspectorLogger,
5
5
  isInspectorEnabled,
6
6
  secureInspector
7
- } from "./chunk-RI4YHZZW.js";
7
+ } from "./chunk-NDLOG2JH.js";
8
8
  import {
9
9
  ActorDefinition,
10
10
  RemoteManagerDriver,
@@ -17,10 +17,10 @@ import {
17
17
  lookupInRegistry,
18
18
  serializeActorKey,
19
19
  updateRunnerConfig
20
- } from "./chunk-GQ5WTE64.js";
20
+ } from "./chunk-FETQGZN4.js";
21
21
  import {
22
22
  CreateActorSchema
23
- } from "./chunk-QRUGCDA5.js";
23
+ } from "./chunk-RPI45FGS.js";
24
24
  import {
25
25
  ActionContext,
26
26
  ClientConfigSchema,
@@ -32,7 +32,7 @@ import {
32
32
  createVersionedDataHandler,
33
33
  parseMessage,
34
34
  serializeEmptyPersistData
35
- } from "./chunk-7ACKZS3T.js";
35
+ } from "./chunk-I7EJWHYV.js";
36
36
  import {
37
37
  EncodingSchema,
38
38
  HEADER_ACTOR_ID,
@@ -58,12 +58,12 @@ import {
58
58
  generateRandomString,
59
59
  loggerWithoutContext,
60
60
  serializeWithEncoding
61
- } from "./chunk-YFFCPYHY.js";
61
+ } from "./chunk-ZVEDMBFT.js";
62
62
  import {
63
63
  configureBaseLogger,
64
64
  configureDefaultLogger,
65
65
  getLogger
66
- } from "./chunk-ER5OT3SQ.js";
66
+ } from "./chunk-GJPOIJHZ.js";
67
67
  import {
68
68
  VERSION,
69
69
  assertUnreachable,
@@ -75,7 +75,7 @@ import {
75
75
  promiseWithResolvers,
76
76
  setLongTimeout,
77
77
  stringifyError
78
- } from "./chunk-QMVCFQ37.js";
78
+ } from "./chunk-JKNDUKFI.js";
79
79
  import {
80
80
  ActorAlreadyExists,
81
81
  ConnNotFound,
@@ -237,7 +237,11 @@ var HonoWebSocketAdapter = class {
237
237
  msg: "failed to convert blob to arraybuffer",
238
238
  error
239
239
  });
240
- this.#fireEvent("error", { type: "error", target: this, error });
240
+ this.#fireEvent("error", {
241
+ type: "error",
242
+ target: this,
243
+ error
244
+ });
241
245
  });
242
246
  } else {
243
247
  logger().warn({
@@ -364,7 +368,10 @@ var HonoWebSocketAdapter = class {
364
368
  try {
365
369
  listener(event);
366
370
  } catch (error) {
367
- logger().error({ msg: `error in ${type} event listener`, error });
371
+ logger().error({
372
+ msg: `error in ${type} event listener`,
373
+ error
374
+ });
368
375
  }
369
376
  }
370
377
  }
@@ -374,7 +381,10 @@ var HonoWebSocketAdapter = class {
374
381
  try {
375
382
  this.#onopen(event);
376
383
  } catch (error) {
377
- logger().error({ msg: "error in onopen handler", error });
384
+ logger().error({
385
+ msg: "error in onopen handler",
386
+ error
387
+ });
378
388
  }
379
389
  }
380
390
  break;
@@ -383,7 +393,10 @@ var HonoWebSocketAdapter = class {
383
393
  try {
384
394
  this.#onclose(event);
385
395
  } catch (error) {
386
- logger().error({ msg: "error in onclose handler", error });
396
+ logger().error({
397
+ msg: "error in onclose handler",
398
+ error
399
+ });
387
400
  }
388
401
  }
389
402
  break;
@@ -392,7 +405,10 @@ var HonoWebSocketAdapter = class {
392
405
  try {
393
406
  this.#onerror(event);
394
407
  } catch (error) {
395
- logger().error({ msg: "error in onerror handler", error });
408
+ logger().error({
409
+ msg: "error in onerror handler",
410
+ error
411
+ });
396
412
  }
397
413
  }
398
414
  break;
@@ -401,7 +417,10 @@ var HonoWebSocketAdapter = class {
401
417
  try {
402
418
  this.#onmessage(event);
403
419
  } catch (error) {
404
- logger().error({ msg: "error in onmessage handler", error });
420
+ logger().error({
421
+ msg: "error in onmessage handler",
422
+ error
423
+ });
405
424
  }
406
425
  }
407
426
  break;
@@ -664,7 +683,10 @@ async function handleSseConnect(c, _runConfig, actorDriver, actorId) {
664
683
  await stream.sleep(SSE_PING_INTERVAL);
665
684
  }
666
685
  } catch (error) {
667
- loggerWithoutContext().error({ msg: "error in sse connection", error });
686
+ loggerWithoutContext().error({
687
+ msg: "error in sse connection",
688
+ error
689
+ });
668
690
  if (conn && actor2 !== void 0) {
669
691
  actor2.__connDisconnected(conn, false, socketId);
670
692
  }
@@ -937,7 +959,9 @@ function handleHealthRequest(c) {
937
959
 
938
960
  // src/actor/router.ts
939
961
  function createActorRouter(runConfig, actorDriver, isTest) {
940
- const router = new Hono({ strict: false });
962
+ const router = new Hono({
963
+ strict: false
964
+ });
941
965
  router.use("*", loggerMiddleware(loggerWithoutContext()));
942
966
  router.get("/", (c) => {
943
967
  return c.text(
@@ -983,15 +1007,23 @@ function createActorRouter(runConfig, actorDriver, isTest) {
983
1007
  const protocolList = protocols.split(",").map((p) => p.trim());
984
1008
  for (const protocol of protocolList) {
985
1009
  if (protocol.startsWith(WS_PROTOCOL_ENCODING)) {
986
- encodingRaw = protocol.substring(WS_PROTOCOL_ENCODING.length);
1010
+ encodingRaw = protocol.substring(
1011
+ WS_PROTOCOL_ENCODING.length
1012
+ );
987
1013
  } else if (protocol.startsWith(WS_PROTOCOL_CONN_PARAMS)) {
988
1014
  connParamsRaw = decodeURIComponent(
989
- protocol.substring(WS_PROTOCOL_CONN_PARAMS.length)
1015
+ protocol.substring(
1016
+ WS_PROTOCOL_CONN_PARAMS.length
1017
+ )
990
1018
  );
991
1019
  } else if (protocol.startsWith(WS_PROTOCOL_CONN_ID)) {
992
- connIdRaw = protocol.substring(WS_PROTOCOL_CONN_ID.length);
1020
+ connIdRaw = protocol.substring(
1021
+ WS_PROTOCOL_CONN_ID.length
1022
+ );
993
1023
  } else if (protocol.startsWith(WS_PROTOCOL_CONN_TOKEN)) {
994
- connTokenRaw = protocol.substring(WS_PROTOCOL_CONN_TOKEN.length);
1024
+ connTokenRaw = protocol.substring(
1025
+ WS_PROTOCOL_CONN_TOKEN.length
1026
+ );
995
1027
  }
996
1028
  }
997
1029
  }
@@ -1020,7 +1052,13 @@ function createActorRouter(runConfig, actorDriver, isTest) {
1020
1052
  });
1021
1053
  router.post("/action/:action", async (c) => {
1022
1054
  const actionName = c.req.param("action");
1023
- return handleAction(c, runConfig, actorDriver, actionName, c.env.actorId);
1055
+ return handleAction(
1056
+ c,
1057
+ runConfig,
1058
+ actorDriver,
1059
+ actionName,
1060
+ c.env.actorId
1061
+ );
1024
1062
  });
1025
1063
  router.post("/connections/message", async (c) => {
1026
1064
  const connId = c.req.header(HEADER_CONN_ID);
@@ -1110,7 +1148,10 @@ function createActorRouter(runConfig, actorDriver, isTest) {
1110
1148
  secureInspector(runConfig),
1111
1149
  async (c, next) => {
1112
1150
  const inspector = (await actorDriver.loadActor(c.env.actorId)).inspector;
1113
- invariant2(inspector, "inspector not supported on this platform");
1151
+ invariant2(
1152
+ inspector,
1153
+ "inspector not supported on this platform"
1154
+ );
1114
1155
  c.set("inspector", inspector);
1115
1156
  return next();
1116
1157
  }
@@ -1213,7 +1254,10 @@ var InlineWebSocketAdapter2 = class {
1213
1254
  logger3().debug({ msg: "closing fake websocket", code, reason });
1214
1255
  this.#readyState = this.CLOSING;
1215
1256
  try {
1216
- this.#handler.onClose({ code, reason, wasClean: true }, this.#wsContext);
1257
+ this.#handler.onClose(
1258
+ { code, reason, wasClean: true },
1259
+ this.#wsContext
1260
+ );
1217
1261
  } catch (err) {
1218
1262
  logger3().error({ msg: "error closing websocket", error: err });
1219
1263
  } finally {
@@ -1352,7 +1396,10 @@ var InlineWebSocketAdapter2 = class {
1352
1396
  try {
1353
1397
  this.#onopen(event);
1354
1398
  } catch (error) {
1355
- logger3().error({ msg: "error in onopen handler", error });
1399
+ logger3().error({
1400
+ msg: "error in onopen handler",
1401
+ error
1402
+ });
1356
1403
  }
1357
1404
  }
1358
1405
  break;
@@ -1361,7 +1408,10 @@ var InlineWebSocketAdapter2 = class {
1361
1408
  try {
1362
1409
  this.#onclose(event);
1363
1410
  } catch (error) {
1364
- logger3().error({ msg: "error in onclose handler", error });
1411
+ logger3().error({
1412
+ msg: "error in onclose handler",
1413
+ error
1414
+ });
1365
1415
  }
1366
1416
  }
1367
1417
  break;
@@ -1370,7 +1420,10 @@ var InlineWebSocketAdapter2 = class {
1370
1420
  try {
1371
1421
  this.#onerror(event);
1372
1422
  } catch (error) {
1373
- logger3().error({ msg: "error in onerror handler", error });
1423
+ logger3().error({
1424
+ msg: "error in onerror handler",
1425
+ error
1426
+ });
1374
1427
  }
1375
1428
  }
1376
1429
  break;
@@ -1379,7 +1432,10 @@ var InlineWebSocketAdapter2 = class {
1379
1432
  try {
1380
1433
  this.#onmessage(event);
1381
1434
  } catch (error) {
1382
- logger3().error({ msg: "error in onmessage handler", error });
1435
+ logger3().error({
1436
+ msg: "error in onmessage handler",
1437
+ error
1438
+ });
1383
1439
  }
1384
1440
  }
1385
1441
  break;
@@ -1494,8 +1550,8 @@ var EngineActorDriver = class {
1494
1550
  #version = 1;
1495
1551
  // Version for the runner protocol
1496
1552
  #alarmTimeout;
1497
- #runnerStarted = Promise.withResolvers();
1498
- #runnerStopped = Promise.withResolvers();
1553
+ #runnerStarted = promiseWithResolvers();
1554
+ #runnerStopped = promiseWithResolvers();
1499
1555
  constructor(registryConfig, runConfig, managerDriver, inlineClient) {
1500
1556
  this.#registryConfig = registryConfig;
1501
1557
  this.#runConfig = runConfig;
@@ -1567,7 +1623,8 @@ var EngineActorDriver = class {
1567
1623
  }
1568
1624
  async #loadActorHandler(actorId) {
1569
1625
  const handler = this.#actors.get(actorId);
1570
- if (!handler) throw new Error(`Actor handler does not exist ${actorId}`);
1626
+ if (!handler)
1627
+ throw new Error(`Actor handler does not exist ${actorId}`);
1571
1628
  if (handler.actorStartPromise) await handler.actorStartPromise.promise;
1572
1629
  if (!handler.actor) throw new Error("Actor should be loaded");
1573
1630
  return handler;
@@ -1607,18 +1664,18 @@ var EngineActorDriver = class {
1607
1664
  return void 0;
1608
1665
  }
1609
1666
  // Runner lifecycle callbacks
1610
- async #runnerOnActorStart(actorId, generation, runConfig) {
1667
+ async #runnerOnActorStart(actorId, generation, actorConfig) {
1611
1668
  var _a;
1612
1669
  logger4().debug({
1613
1670
  msg: "runner actor starting",
1614
1671
  actorId,
1615
- name: runConfig.name,
1616
- key: runConfig.key,
1672
+ name: actorConfig.name,
1673
+ key: actorConfig.key,
1617
1674
  generation
1618
1675
  });
1619
1676
  let input;
1620
- if (runConfig.input) {
1621
- input = cbor3.decode(runConfig.input);
1677
+ if (actorConfig.input) {
1678
+ input = cbor3.decode(actorConfig.input);
1622
1679
  }
1623
1680
  let handler = this.#actors.get(actorId);
1624
1681
  if (!handler) {
@@ -1632,10 +1689,13 @@ var EngineActorDriver = class {
1632
1689
  ]);
1633
1690
  handler.persistedData = persistedValue !== null ? persistedValue : serializeEmptyPersistData(input);
1634
1691
  }
1635
- const name = runConfig.name;
1636
- invariant3(runConfig.key, "actor should have a key");
1637
- const key = deserializeActorKey(runConfig.key);
1638
- const definition = lookupInRegistry(this.#registryConfig, runConfig.name);
1692
+ const name = actorConfig.name;
1693
+ invariant3(actorConfig.key, "actor should have a key");
1694
+ const key = deserializeActorKey(actorConfig.key);
1695
+ const definition = lookupInRegistry(
1696
+ this.#registryConfig,
1697
+ actorConfig.name
1698
+ );
1639
1699
  handler.actor = definition.instantiate();
1640
1700
  await handler.actor.start(
1641
1701
  this,
@@ -1659,7 +1719,7 @@ var EngineActorDriver = class {
1659
1719
  }
1660
1720
  logger4().debug({ msg: "runner actor stopped", actorId });
1661
1721
  }
1662
- async #runnerFetch(actorId, request) {
1722
+ async #runnerFetch(runner, actorId, request) {
1663
1723
  logger4().debug({
1664
1724
  msg: "runner fetch",
1665
1725
  actorId,
@@ -1668,20 +1728,20 @@ var EngineActorDriver = class {
1668
1728
  });
1669
1729
  return await this.#actorRouter.fetch(request, { actorId });
1670
1730
  }
1671
- async #runnerWebSocket(actorId, websocketRaw, request) {
1731
+ async #runnerWebSocket(runner, actorId, websocketRaw, request) {
1672
1732
  const websocket = websocketRaw;
1673
1733
  logger4().debug({ msg: "runner websocket", actorId, url: request.url });
1674
1734
  const url = new URL(request.url);
1675
1735
  const protocols = request.headers.get("sec-websocket-protocol");
1676
- if (protocols === null)
1677
- throw new Error(`Missing sec-websocket-protocol header`);
1678
1736
  let encodingRaw;
1679
1737
  let connParamsRaw;
1680
1738
  if (protocols) {
1681
1739
  const protocolList = protocols.split(",").map((p) => p.trim());
1682
1740
  for (const protocol of protocolList) {
1683
1741
  if (protocol.startsWith(WS_PROTOCOL_ENCODING)) {
1684
- encodingRaw = protocol.substring(WS_PROTOCOL_ENCODING.length);
1742
+ encodingRaw = protocol.substring(
1743
+ WS_PROTOCOL_ENCODING.length
1744
+ );
1685
1745
  } else if (protocol.startsWith(WS_PROTOCOL_CONN_PARAMS)) {
1686
1746
  connParamsRaw = decodeURIComponent(
1687
1747
  protocol.substring(WS_PROTOCOL_CONN_PARAMS.length)
@@ -1720,10 +1780,12 @@ var EngineActorDriver = class {
1720
1780
  wsContext.close(1011, `${err}`);
1721
1781
  });
1722
1782
  if (websocket.readyState === 1) {
1723
- wsHandlerPromise.then((x) => {
1724
- var _a;
1725
- return (_a = x.onOpen) == null ? void 0 : _a.call(x, new Event("open"), wsContext);
1726
- });
1783
+ wsHandlerPromise.then(
1784
+ (x) => {
1785
+ var _a;
1786
+ return (_a = x.onOpen) == null ? void 0 : _a.call(x, new Event("open"), wsContext);
1787
+ }
1788
+ );
1727
1789
  } else {
1728
1790
  websocket.addEventListener("open", (event) => {
1729
1791
  wsHandlerPromise.then((x) => {
@@ -1759,13 +1821,18 @@ var EngineActorDriver = class {
1759
1821
  await this.#runner.shutdown(immediate);
1760
1822
  }
1761
1823
  async serverlessHandleStart(c) {
1762
- await this.#runnerStarted.promise;
1763
1824
  return streamSSE2(c, async (stream) => {
1764
- stream.onAbort(() => this.shutdown(true));
1825
+ stream.onAbort(() => {
1826
+ });
1827
+ c.req.raw.signal.addEventListener("abort", () => {
1828
+ logger4().debug("SSE aborted, shutting down runner");
1829
+ this.shutdown(true);
1830
+ });
1831
+ await this.#runnerStarted.promise;
1765
1832
  const payload = this.#runner.getServerlessInitPacket();
1766
1833
  invariant3(payload, "runnerId not set");
1767
1834
  await stream.writeSSE({ data: payload });
1768
- return this.#runnerStopped.promise;
1835
+ await this.#runnerStopped.promise;
1769
1836
  });
1770
1837
  }
1771
1838
  };
@@ -2001,7 +2068,12 @@ function getDataPath(appName) {
2001
2068
  appName
2002
2069
  );
2003
2070
  case "darwin":
2004
- return path.join(homeDir, "Library", "Application Support", appName);
2071
+ return path.join(
2072
+ homeDir,
2073
+ "Library",
2074
+ "Application Support",
2075
+ appName
2076
+ );
2005
2077
  default:
2006
2078
  return path.join(
2007
2079
  process.env.XDG_DATA_HOME || path.join(homeDir, ".local", "share"),
@@ -2053,7 +2125,10 @@ var FileSystemGlobalState = class {
2053
2125
  try {
2054
2126
  this.#cleanupTempFilesSync();
2055
2127
  } catch (err) {
2056
- logger5().error({ msg: "failed to cleanup temp files", error: err });
2128
+ logger5().error({
2129
+ msg: "failed to cleanup temp files",
2130
+ error: err
2131
+ });
2057
2132
  }
2058
2133
  } else {
2059
2134
  logger5().debug({ msg: "memory driver ready" });
@@ -2083,7 +2158,11 @@ var FileSystemGlobalState = class {
2083
2158
  const state = await this.loadActorStateOrError(actorId);
2084
2159
  yield state;
2085
2160
  } catch (error) {
2086
- logger5().error({ msg: "failed to load actor state", actorId, error });
2161
+ logger5().error({
2162
+ msg: "failed to load actor state",
2163
+ actorId,
2164
+ error
2165
+ });
2087
2166
  }
2088
2167
  }
2089
2168
  }
@@ -2117,7 +2196,9 @@ var FileSystemGlobalState = class {
2117
2196
  name,
2118
2197
  key,
2119
2198
  createdAt: BigInt(Date.now()),
2120
- persistedData: bufferToArrayBuffer(serializeEmptyPersistData(input))
2199
+ persistedData: bufferToArrayBuffer(
2200
+ serializeEmptyPersistData(input)
2201
+ )
2121
2202
  };
2122
2203
  await this.writeActor(actorId, entry.state);
2123
2204
  return entry;
@@ -2153,7 +2234,9 @@ var FileSystemGlobalState = class {
2153
2234
  entry.loadPromise = void 0;
2154
2235
  return entry;
2155
2236
  }
2156
- const error = new Error(`Failed to load actor state: ${innerError}`);
2237
+ const error = new Error(
2238
+ `Failed to load actor state: ${innerError}`
2239
+ );
2157
2240
  throw error;
2158
2241
  }
2159
2242
  }
@@ -2165,7 +2248,9 @@ var FileSystemGlobalState = class {
2165
2248
  name,
2166
2249
  key,
2167
2250
  createdAt: BigInt(Date.now()),
2168
- persistedData: bufferToArrayBuffer(serializeEmptyPersistData(input))
2251
+ persistedData: bufferToArrayBuffer(
2252
+ serializeEmptyPersistData(input)
2253
+ )
2169
2254
  };
2170
2255
  await this.writeActor(actorId, entry.state);
2171
2256
  }
@@ -2180,7 +2265,8 @@ var FileSystemGlobalState = class {
2180
2265
  const actor2 = this.#actors.get(actorId);
2181
2266
  invariant4(actor2, `tried to sleep ${actorId}, does not exist`);
2182
2267
  if (actor2.loadPromise) await actor2.loadPromise.catch();
2183
- if ((_a = actor2.startPromise) == null ? void 0 : _a.promise) await actor2.startPromise.promise.catch();
2268
+ if ((_a = actor2.startPromise) == null ? void 0 : _a.promise)
2269
+ await actor2.startPromise.promise.catch();
2184
2270
  actor2.removed = true;
2185
2271
  invariant4(actor2.actor, "actor should be loaded");
2186
2272
  await actor2.actor._stop();
@@ -2209,7 +2295,9 @@ var FileSystemGlobalState = class {
2209
2295
  actorId,
2210
2296
  timestamp: BigInt(timestamp)
2211
2297
  };
2212
- const data = ACTOR_ALARM_VERSIONED.serializeWithEmbeddedVersion(alarmData);
2298
+ const data = ACTOR_ALARM_VERSIONED.serializeWithEmbeddedVersion(
2299
+ alarmData
2300
+ );
2213
2301
  await fs2.writeFile(tempPath, data);
2214
2302
  await fs2.rename(tempPath, alarmPath);
2215
2303
  } catch (error) {
@@ -2217,7 +2305,11 @@ var FileSystemGlobalState = class {
2217
2305
  await fs2.unlink(tempPath);
2218
2306
  } catch {
2219
2307
  }
2220
- logger5().error({ msg: "failed to write alarm", actorId, error });
2308
+ logger5().error({
2309
+ msg: "failed to write alarm",
2310
+ actorId,
2311
+ error
2312
+ });
2221
2313
  throw new Error(`Failed to write alarm: ${error}`);
2222
2314
  }
2223
2315
  }
@@ -2246,7 +2338,11 @@ var FileSystemGlobalState = class {
2246
2338
  await fs2.unlink(tempPath);
2247
2339
  } catch {
2248
2340
  }
2249
- logger5().error({ msg: "failed to save actor state", actorId, error });
2341
+ logger5().error({
2342
+ msg: "failed to save actor state",
2343
+ actorId,
2344
+ error
2345
+ });
2250
2346
  throw new Error(`Failed to save actor state: ${error}`);
2251
2347
  }
2252
2348
  }
@@ -2270,7 +2366,10 @@ var FileSystemGlobalState = class {
2270
2366
  try {
2271
2367
  this.#loadAlarmsSync();
2272
2368
  } catch (err) {
2273
- logger5().error({ msg: "failed to load alarms on startup", error: err });
2369
+ logger5().error({
2370
+ msg: "failed to load alarms on startup",
2371
+ error: err
2372
+ });
2274
2373
  }
2275
2374
  }
2276
2375
  async startActor(registryConfig, runConfig, inlineClient, actorDriver, actorId) {
@@ -2291,7 +2390,10 @@ var FileSystemGlobalState = class {
2291
2390
  }
2292
2391
  entry.startPromise = promiseWithResolvers();
2293
2392
  try {
2294
- const definition = lookupInRegistry(registryConfig, entry.state.name);
2393
+ const definition = lookupInRegistry(
2394
+ registryConfig,
2395
+ entry.state.name
2396
+ );
2295
2397
  entry.actor = definition.instantiate();
2296
2398
  await entry.actor.start(
2297
2399
  actorDriver,
@@ -2343,9 +2445,15 @@ var FileSystemGlobalState = class {
2343
2445
  );
2344
2446
  const timestamp = Number(alarmData.timestamp);
2345
2447
  if (Number.isFinite(timestamp)) {
2346
- this.#scheduleAlarmTimeout(alarmData.actorId, timestamp);
2448
+ this.#scheduleAlarmTimeout(
2449
+ alarmData.actorId,
2450
+ timestamp
2451
+ );
2347
2452
  } else {
2348
- logger5().debug({ msg: "invalid alarm file contents", file });
2453
+ logger5().debug({
2454
+ msg: "invalid alarm file contents",
2455
+ file
2456
+ });
2349
2457
  }
2350
2458
  } catch (err) {
2351
2459
  logger5().error({
@@ -2356,7 +2464,10 @@ var FileSystemGlobalState = class {
2356
2464
  }
2357
2465
  }
2358
2466
  } catch (err) {
2359
- logger5().error({ msg: "failed to list alarms directory", error: err });
2467
+ logger5().error({
2468
+ msg: "failed to list alarms directory",
2469
+ error: err
2470
+ });
2360
2471
  }
2361
2472
  }
2362
2473
  /**
@@ -2396,7 +2507,8 @@ var FileSystemGlobalState = class {
2396
2507
  try {
2397
2508
  logger5().debug({ msg: "triggering alarm", actorId, timestamp });
2398
2509
  const loaded = await this.loadActor(actorId);
2399
- if (!loaded.state) throw new Error(`Actor does not exist: ${actorId}`);
2510
+ if (!loaded.state)
2511
+ throw new Error(`Actor does not exist: ${actorId}`);
2400
2512
  const runnerParams = this.#runnerParams;
2401
2513
  invariant4(runnerParams, "missing runner params");
2402
2514
  if (!loaded.actor) {
@@ -2486,7 +2598,10 @@ function createManagerInspectorRouter() {
2486
2598
  });
2487
2599
  return c.json(actors, 200);
2488
2600
  } catch (error) {
2489
- inspectorLogger().error({ msg: "Failed to fetch actors", error });
2601
+ inspectorLogger().error({
2602
+ msg: "Failed to fetch actors",
2603
+ error
2604
+ });
2490
2605
  return c.json("Failed to fetch actors", 500);
2491
2606
  }
2492
2607
  }).post("/actors", sValidator("json", CreateActorSchema), async (c) => {
@@ -2540,7 +2655,9 @@ var FileSystemManagerDriver = class {
2540
2655
  name: actorState.name,
2541
2656
  key: actorState.key,
2542
2657
  startedAt,
2543
- createdAt: new Date(Number(actorState.createdAt)).toISOString(),
2658
+ createdAt: new Date(
2659
+ Number(actorState.createdAt)
2660
+ ).toISOString(),
2544
2661
  features: [
2545
2662
  "state" /* State */,
2546
2663
  "connections" /* Connections */,
@@ -2574,14 +2691,18 @@ var FileSystemManagerDriver = class {
2574
2691
  }
2575
2692
  },
2576
2693
  getBuilds: async () => {
2577
- return Object.keys(this.#registryConfig.use).map((name) => ({
2578
- name
2579
- }));
2694
+ return Object.keys(this.#registryConfig.use).map(
2695
+ (name) => ({
2696
+ name
2697
+ })
2698
+ );
2580
2699
  },
2581
2700
  createActor: async (input) => {
2582
2701
  const { actorId } = await this.createActor(input);
2583
2702
  try {
2584
- const result = await this.#state.loadActorStateOrError(actorId);
2703
+ const result = await this.#state.loadActorStateOrError(
2704
+ actorId
2705
+ );
2585
2706
  return transformActor2(result);
2586
2707
  } catch {
2587
2708
  return null;
@@ -2673,7 +2794,9 @@ var FileSystemManagerDriver = class {
2673
2794
  throw new Error(`Unreachable path: ${path4}`);
2674
2795
  }
2675
2796
  }
2676
- async getForId({ actorId }) {
2797
+ async getForId({
2798
+ actorId
2799
+ }) {
2677
2800
  const actor2 = await this.#state.loadActor(actorId);
2678
2801
  if (!actor2.state) {
2679
2802
  return void 0;
@@ -2685,7 +2808,11 @@ var FileSystemManagerDriver = class {
2685
2808
  key: actor2.state.key
2686
2809
  };
2687
2810
  } catch (error) {
2688
- logger5().error({ msg: "failed to read actor state", actorId, error });
2811
+ logger5().error({
2812
+ msg: "failed to read actor state",
2813
+ actorId,
2814
+ error
2815
+ });
2689
2816
  return void 0;
2690
2817
  }
2691
2818
  }
@@ -2767,7 +2894,12 @@ function createFileSystemOrMemoryDriver(persist = true, customPath) {
2767
2894
  inlineClient,
2768
2895
  state
2769
2896
  );
2770
- state.onRunnerStart(registryConfig, runConfig, inlineClient, actorDriver);
2897
+ state.onRunnerStart(
2898
+ registryConfig,
2899
+ runConfig,
2900
+ inlineClient,
2901
+ actorDriver
2902
+ );
2771
2903
  return actorDriver;
2772
2904
  }
2773
2905
  };
@@ -2823,7 +2955,10 @@ var ENGINE_ENDPOINT = `http://localhost:${ENGINE_PORT}`;
2823
2955
  var ENGINE_BASE_URL = "https://releases.rivet.gg/engine";
2824
2956
  var ENGINE_BINARY_NAME = "rivet-engine";
2825
2957
  async function ensureEngineProcess(options) {
2826
- logger6().debug({ msg: "ensuring engine process", version: options.version });
2958
+ logger6().debug({
2959
+ msg: "ensuring engine process",
2960
+ version: options.version
2961
+ });
2827
2962
  const storageRoot = getStoragePath();
2828
2963
  const binDir = path3.join(storageRoot, "bin");
2829
2964
  const varDir = path3.join(storageRoot, "var");
@@ -3003,12 +3138,18 @@ function resolveTargetTripletFor(platform, arch) {
3003
3138
  break;
3004
3139
  case "linux":
3005
3140
  if (arch === "x64") {
3006
- return { targetTriplet: "x86_64-unknown-linux-musl", extension: "" };
3141
+ return {
3142
+ targetTriplet: "x86_64-unknown-linux-musl",
3143
+ extension: ""
3144
+ };
3007
3145
  }
3008
3146
  break;
3009
3147
  case "win32":
3010
3148
  if (arch === "x64") {
3011
- return { targetTriplet: "x86_64-pc-windows-gnu", extension: ".exe" };
3149
+ return {
3150
+ targetTriplet: "x86_64-pc-windows-gnu",
3151
+ extension: ".exe"
3152
+ };
3012
3153
  }
3013
3154
  break;
3014
3155
  }
@@ -3083,7 +3224,9 @@ async function waitForEngineHealth() {
3083
3224
  attempt: i + 1,
3084
3225
  maxRetries
3085
3226
  });
3086
- await new Promise((resolve) => setTimeout(resolve, HEALTH_INTERVAL));
3227
+ await new Promise(
3228
+ (resolve) => setTimeout(resolve, HEALTH_INTERVAL)
3229
+ );
3087
3230
  }
3088
3231
  }
3089
3232
  throw new Error(`engine health check failed after ${maxRetries} retries`);
@@ -3124,6 +3267,7 @@ var ActorsListResponseSchema = z4.object({
3124
3267
  actors: z4.array(ActorSchema)
3125
3268
  });
3126
3269
  var ActorsCreateRequestSchema = z4.object({
3270
+ datacenter: z4.string().optional(),
3127
3271
  name: z4.string(),
3128
3272
  runner_name_selector: z4.string(),
3129
3273
  crash_policy: z4.string(),
@@ -3134,6 +3278,7 @@ var ActorsCreateResponseSchema = z4.object({
3134
3278
  actor: ActorSchema
3135
3279
  });
3136
3280
  var ActorsGetOrCreateRequestSchema = z4.object({
3281
+ datacenter: z4.string().optional(),
3137
3282
  name: z4.string(),
3138
3283
  key: z4.string(),
3139
3284
  runner_name_selector: z4.string(),
@@ -3147,6 +3292,76 @@ var ActorsGetOrCreateResponseSchema = z4.object({
3147
3292
  var ActorsDeleteResponseSchema = z4.object({});
3148
3293
 
3149
3294
  // src/manager/gateway.ts
3295
+ async function handleWebSocketGatewayPathBased(runConfig, managerDriver, c, actorPathInfo) {
3296
+ var _a;
3297
+ const upgradeWebSocket = (_a = runConfig.getUpgradeWebSocket) == null ? void 0 : _a.call(runConfig);
3298
+ if (!upgradeWebSocket) {
3299
+ throw new WebSocketsNotEnabled();
3300
+ }
3301
+ const protocols = c.req.header("sec-websocket-protocol");
3302
+ let encodingRaw;
3303
+ let connParamsRaw;
3304
+ let connIdRaw;
3305
+ let connTokenRaw;
3306
+ if (protocols) {
3307
+ const protocolList = protocols.split(",").map((p) => p.trim());
3308
+ for (const protocol of protocolList) {
3309
+ if (protocol.startsWith(WS_PROTOCOL_ENCODING)) {
3310
+ encodingRaw = protocol.substring(WS_PROTOCOL_ENCODING.length);
3311
+ } else if (protocol.startsWith(WS_PROTOCOL_CONN_PARAMS)) {
3312
+ connParamsRaw = decodeURIComponent(
3313
+ protocol.substring(WS_PROTOCOL_CONN_PARAMS.length)
3314
+ );
3315
+ } else if (protocol.startsWith(WS_PROTOCOL_CONN_ID)) {
3316
+ connIdRaw = protocol.substring(WS_PROTOCOL_CONN_ID.length);
3317
+ } else if (protocol.startsWith(WS_PROTOCOL_CONN_TOKEN)) {
3318
+ connTokenRaw = protocol.substring(
3319
+ WS_PROTOCOL_CONN_TOKEN.length
3320
+ );
3321
+ }
3322
+ }
3323
+ }
3324
+ logger().debug({
3325
+ msg: "proxying websocket to actor via path-based routing",
3326
+ actorId: actorPathInfo.actorId,
3327
+ path: actorPathInfo.remainingPath,
3328
+ encoding: encodingRaw
3329
+ });
3330
+ const encoding = encodingRaw || "json";
3331
+ const connParams = connParamsRaw ? JSON.parse(connParamsRaw) : void 0;
3332
+ return await managerDriver.proxyWebSocket(
3333
+ c,
3334
+ actorPathInfo.remainingPath,
3335
+ actorPathInfo.actorId,
3336
+ encoding,
3337
+ // Will be validated by driver
3338
+ connParams,
3339
+ connIdRaw,
3340
+ connTokenRaw
3341
+ );
3342
+ }
3343
+ async function handleHttpGatewayPathBased(managerDriver, c, actorPathInfo) {
3344
+ logger().debug({
3345
+ msg: "proxying request to actor via path-based routing",
3346
+ actorId: actorPathInfo.actorId,
3347
+ path: actorPathInfo.remainingPath,
3348
+ method: c.req.method
3349
+ });
3350
+ const proxyHeaders = new Headers(c.req.raw.headers);
3351
+ const proxyUrl = new URL(`http://actor${actorPathInfo.remainingPath}`);
3352
+ const proxyRequest = new Request(proxyUrl, {
3353
+ method: c.req.raw.method,
3354
+ headers: proxyHeaders,
3355
+ body: c.req.raw.body,
3356
+ signal: c.req.raw.signal,
3357
+ duplex: "half"
3358
+ });
3359
+ return await managerDriver.proxyRequest(
3360
+ c,
3361
+ proxyRequest,
3362
+ actorPathInfo.actorId
3363
+ );
3364
+ }
3150
3365
  async function actorGateway(runConfig, managerDriver, c, next) {
3151
3366
  if (c.req.path.startsWith("/.test/")) {
3152
3367
  return next();
@@ -3158,6 +3373,28 @@ async function actorGateway(runConfig, managerDriver, c, next) {
3158
3373
  strippedPath = "/" + strippedPath;
3159
3374
  }
3160
3375
  }
3376
+ const pathWithQuery = c.req.url.includes("?") ? strippedPath + c.req.url.substring(c.req.url.indexOf("?")) : strippedPath;
3377
+ const actorPathInfo = parseActorPath(pathWithQuery);
3378
+ if (actorPathInfo) {
3379
+ logger().debug({
3380
+ msg: "routing using path-based actor routing",
3381
+ actorPathInfo
3382
+ });
3383
+ const isWebSocket = c.req.header("upgrade") === "websocket";
3384
+ if (isWebSocket) {
3385
+ return await handleWebSocketGatewayPathBased(
3386
+ runConfig,
3387
+ managerDriver,
3388
+ c,
3389
+ actorPathInfo
3390
+ );
3391
+ }
3392
+ return await handleHttpGatewayPathBased(
3393
+ managerDriver,
3394
+ c,
3395
+ actorPathInfo
3396
+ );
3397
+ }
3161
3398
  if (c.req.header("upgrade") === "websocket") {
3162
3399
  return await handleWebSocketGateway(
3163
3400
  runConfig,
@@ -3197,7 +3434,9 @@ async function handleWebSocketGateway(runConfig, managerDriver, c, strippedPath)
3197
3434
  } else if (protocol.startsWith(WS_PROTOCOL_CONN_ID)) {
3198
3435
  connIdRaw = protocol.substring(WS_PROTOCOL_CONN_ID.length);
3199
3436
  } else if (protocol.startsWith(WS_PROTOCOL_CONN_TOKEN)) {
3200
- connTokenRaw = protocol.substring(WS_PROTOCOL_CONN_TOKEN.length);
3437
+ connTokenRaw = protocol.substring(
3438
+ WS_PROTOCOL_CONN_TOKEN.length
3439
+ );
3201
3440
  }
3202
3441
  }
3203
3442
  }
@@ -3256,6 +3495,73 @@ async function handleHttpGateway(managerDriver, c, next, strippedPath) {
3256
3495
  });
3257
3496
  return await managerDriver.proxyRequest(c, proxyRequest, actorId);
3258
3497
  }
3498
+ function parseActorPath(path4) {
3499
+ const queryPos = path4.indexOf("?");
3500
+ const fragmentPos = path4.indexOf("#");
3501
+ let queryString = "";
3502
+ if (queryPos !== -1) {
3503
+ if (fragmentPos !== -1 && queryPos < fragmentPos) {
3504
+ queryString = path4.slice(queryPos, fragmentPos);
3505
+ } else {
3506
+ queryString = path4.slice(queryPos);
3507
+ }
3508
+ }
3509
+ let basePath = path4;
3510
+ if (queryPos !== -1) {
3511
+ basePath = path4.slice(0, queryPos);
3512
+ } else if (fragmentPos !== -1) {
3513
+ basePath = path4.slice(0, fragmentPos);
3514
+ }
3515
+ if (basePath.includes("//")) {
3516
+ return null;
3517
+ }
3518
+ const segments = basePath.split("/").filter((s) => s.length > 0);
3519
+ if (segments.length < 4) {
3520
+ return null;
3521
+ }
3522
+ if (segments[0] !== "gateway" || segments[1] !== "actors") {
3523
+ return null;
3524
+ }
3525
+ if (segments[2].length === 0) {
3526
+ return null;
3527
+ }
3528
+ const actorId = segments[2];
3529
+ let token;
3530
+ let remainingPathStartIdx;
3531
+ if (segments.length >= 6 && segments[3] === "tokens" && segments[5] === "route") {
3532
+ if (segments[4].length === 0) {
3533
+ return null;
3534
+ }
3535
+ token = segments[4];
3536
+ remainingPathStartIdx = 6;
3537
+ } else if (segments.length >= 4 && segments[3] === "route") {
3538
+ token = void 0;
3539
+ remainingPathStartIdx = 4;
3540
+ } else {
3541
+ return null;
3542
+ }
3543
+ let prefixLen = 0;
3544
+ for (let i = 0; i < remainingPathStartIdx; i++) {
3545
+ prefixLen += 1 + segments[i].length;
3546
+ }
3547
+ let remainingBase;
3548
+ if (prefixLen < basePath.length) {
3549
+ remainingBase = basePath.slice(prefixLen);
3550
+ } else {
3551
+ remainingBase = "/";
3552
+ }
3553
+ let remainingPath;
3554
+ if (remainingBase.length === 0 || !remainingBase.startsWith("/")) {
3555
+ remainingPath = `/${remainingBase}${queryString}`;
3556
+ } else {
3557
+ remainingPath = `${remainingBase}${queryString}`;
3558
+ }
3559
+ return {
3560
+ actorId,
3561
+ token,
3562
+ remainingPath
3563
+ };
3564
+ }
3259
3565
  async function createTestWebSocketProxy(clientWsPromise) {
3260
3566
  let clientWs = null;
3261
3567
  const {
@@ -3273,13 +3579,20 @@ async function createTestWebSocketProxy(clientWsPromise) {
3273
3579
  });
3274
3580
  await new Promise((resolve, reject) => {
3275
3581
  const onOpen = () => {
3276
- logger().debug({ msg: "test websocket connection to actor opened" });
3582
+ logger().debug({
3583
+ msg: "test websocket connection to actor opened"
3584
+ });
3277
3585
  resolve();
3278
3586
  };
3279
3587
  const onError = (error) => {
3280
- logger().error({ msg: "test websocket connection failed", error });
3588
+ logger().error({
3589
+ msg: "test websocket connection failed",
3590
+ error
3591
+ });
3281
3592
  reject(
3282
- new Error(`Failed to open WebSocket: ${error.message || error}`)
3593
+ new Error(
3594
+ `Failed to open WebSocket: ${error.message || error}`
3595
+ )
3283
3596
  );
3284
3597
  serverWsReject();
3285
3598
  };
@@ -3431,7 +3744,9 @@ async function createTestWebSocketProxy(clientWsPromise) {
3431
3744
  // src/manager/router-schema.ts
3432
3745
  import { z as z5 } from "zod";
3433
3746
  var ServerlessStartHeadersSchema = z5.object({
3434
- endpoint: z5.string({ required_error: "x-rivet-endpoint header is required" }),
3747
+ endpoint: z5.string({
3748
+ required_error: "x-rivet-endpoint header is required"
3749
+ }),
3435
3750
  token: z5.string({ invalid_type_error: "x-rivet-token header must be a string" }).optional(),
3436
3751
  totalSlots: z5.coerce.number({
3437
3752
  invalid_type_error: "x-rivet-total-slots header must be a number"
@@ -3440,7 +3755,7 @@ var ServerlessStartHeadersSchema = z5.object({
3440
3755
  required_error: "x-rivet-runner-name header is required"
3441
3756
  }),
3442
3757
  namespace: z5.string({
3443
- required_error: "x-rivet-namespace-id header is required"
3758
+ required_error: "x-rivet-namespace-name header is required"
3444
3759
  })
3445
3760
  });
3446
3761
 
@@ -3512,7 +3827,7 @@ function addServerlessRoutes(driverConfig, registryConfig, runConfig, managerDri
3512
3827
  token: c.req.header("x-rivet-token") ?? void 0,
3513
3828
  totalSlots: c.req.header("x-rivet-total-slots"),
3514
3829
  runnerName: c.req.header("x-rivet-runner-name"),
3515
- namespace: c.req.header("x-rivet-namespace-id")
3830
+ namespace: c.req.header("x-rivet-namespace-name")
3516
3831
  });
3517
3832
  if (!parseResult.success) {
3518
3833
  throw new InvalidRequest(
@@ -3578,7 +3893,7 @@ function addManagerRoutes(registryConfig, runConfig, managerDriver, router) {
3578
3893
  path: "/actors",
3579
3894
  request: {
3580
3895
  query: z6.object({
3581
- name: z6.string(),
3896
+ name: z6.string().optional(),
3582
3897
  actor_ids: z6.string().optional(),
3583
3898
  key: z6.string().optional()
3584
3899
  })
@@ -3589,6 +3904,30 @@ function addManagerRoutes(registryConfig, runConfig, managerDriver, router) {
3589
3904
  const { name, actor_ids, key } = c.req.valid("query");
3590
3905
  const actorIdsParsed = actor_ids ? actor_ids.split(",").map((id) => id.trim()).filter((id) => id.length > 0) : void 0;
3591
3906
  const actors = [];
3907
+ if (actorIdsParsed && (name || key)) {
3908
+ return c.json(
3909
+ {
3910
+ error: "Cannot provide both actor_ids and (name + key). Use either actor_ids or (name + key)."
3911
+ },
3912
+ 400
3913
+ );
3914
+ }
3915
+ if (key && !name) {
3916
+ return c.json(
3917
+ {
3918
+ error: "When providing 'key', 'name' must also be provided."
3919
+ },
3920
+ 400
3921
+ );
3922
+ }
3923
+ if (!actorIdsParsed && !key) {
3924
+ return c.json(
3925
+ {
3926
+ error: "Must provide either 'actor_ids' or both 'name' and 'key'."
3927
+ },
3928
+ 400
3929
+ );
3930
+ }
3592
3931
  if (actorIdsParsed) {
3593
3932
  if (actorIdsParsed.length > 32) {
3594
3933
  return c.json(
@@ -3613,6 +3952,20 @@ function addManagerRoutes(registryConfig, runConfig, managerDriver, router) {
3613
3952
  if (actorOutput) {
3614
3953
  actors.push(actorOutput);
3615
3954
  }
3955
+ } else {
3956
+ for (const actorName of Object.keys(
3957
+ registryConfig.use
3958
+ )) {
3959
+ const actorOutput = await managerDriver.getForId({
3960
+ c,
3961
+ name: actorName,
3962
+ actorId
3963
+ });
3964
+ if (actorOutput) {
3965
+ actors.push(actorOutput);
3966
+ break;
3967
+ }
3968
+ }
3616
3969
  }
3617
3970
  }
3618
3971
  } else if (key) {
@@ -3710,7 +4063,14 @@ function addManagerRoutes(registryConfig, runConfig, managerDriver, router) {
3710
4063
  if (registryConfig.test.enabled) {
3711
4064
  router.post(".test/inline-driver/call", async (c) => {
3712
4065
  const buffer = await c.req.arrayBuffer();
3713
- const { encoding, transport, method, args } = cbor4.decode(new Uint8Array(buffer));
4066
+ const {
4067
+ encoding,
4068
+ transport,
4069
+ method,
4070
+ args
4071
+ } = cbor4.decode(
4072
+ new Uint8Array(buffer)
4073
+ );
3714
4074
  logger().debug({
3715
4075
  msg: "received inline request",
3716
4076
  encoding,
@@ -3720,7 +4080,9 @@ function addManagerRoutes(registryConfig, runConfig, managerDriver, router) {
3720
4080
  });
3721
4081
  let response;
3722
4082
  try {
3723
- const output = await managerDriver[method](...args);
4083
+ const output = await managerDriver[method](
4084
+ ...args
4085
+ );
3724
4086
  response = { ok: output };
3725
4087
  } catch (rawErr) {
3726
4088
  const err = deconstructError(rawErr, logger(), {}, true);
@@ -3731,7 +4093,10 @@ function addManagerRoutes(registryConfig, runConfig, managerDriver, router) {
3731
4093
  router.get(".test/inline-driver/connect-websocket/*", async (c) => {
3732
4094
  var _a2;
3733
4095
  const upgradeWebSocket = (_a2 = runConfig.getUpgradeWebSocket) == null ? void 0 : _a2.call(runConfig);
3734
- invariant6(upgradeWebSocket, "websockets not supported on this platform");
4096
+ invariant6(
4097
+ upgradeWebSocket,
4098
+ "websockets not supported on this platform"
4099
+ );
3735
4100
  return upgradeWebSocket(async (c2) => {
3736
4101
  const protocolHeader = c2.req.header("sec-websocket-protocol") || "";
3737
4102
  const protocols = protocolHeader.split(/,\s*/);
@@ -3765,7 +4130,9 @@ function addManagerRoutes(registryConfig, runConfig, managerDriver, router) {
3765
4130
  } else if (protocol.startsWith(WS_PROTOCOL_CONN_ID)) {
3766
4131
  connId = protocol.substring(WS_PROTOCOL_CONN_ID.length);
3767
4132
  } else if (protocol.startsWith(WS_PROTOCOL_CONN_TOKEN)) {
3768
- connToken = protocol.substring(WS_PROTOCOL_CONN_TOKEN.length);
4133
+ connToken = protocol.substring(
4134
+ WS_PROTOCOL_CONN_TOKEN.length
4135
+ );
3769
4136
  }
3770
4137
  }
3771
4138
  logger().debug({
@@ -3844,9 +4211,12 @@ function addManagerRoutes(registryConfig, runConfig, managerDriver, router) {
3844
4211
  try {
3845
4212
  const response = await managerDriver.sendRequest(
3846
4213
  actorId,
3847
- new Request(`http://actor/.test/force-disconnect?conn=${connId}`, {
3848
- method: "POST"
3849
- })
4214
+ new Request(
4215
+ `http://actor/.test/force-disconnect?conn=${connId}`,
4216
+ {
4217
+ method: "POST"
4218
+ }
4219
+ )
3850
4220
  );
3851
4221
  if (!response.ok) {
3852
4222
  const text = await response.text();
@@ -4024,7 +4394,10 @@ var Registry = class {
4024
4394
  ...driverLog
4025
4395
  });
4026
4396
  if (isInspectorEnabled(config2, "manager") && managerDriver.inspector) {
4027
- logger7().info({ msg: "inspector ready", url: getInspectorUrl(config2) });
4397
+ logger7().info({
4398
+ msg: "inspector ready",
4399
+ url: getInspectorUrl(config2)
4400
+ });
4028
4401
  }
4029
4402
  if (!config2.noWelcome) {
4030
4403
  const displayInfo = managerDriver.displayInformation();
@@ -4033,7 +4406,9 @@ var Registry = class {
4033
4406
  if (!config2.disableDefaultServer) {
4034
4407
  console.log(` - Endpoint: ${getEndpoint(config2)}`);
4035
4408
  } else if (config2.overrideServerAddress) {
4036
- console.log(` - Endpoint: ${config2.overrideServerAddress}`);
4409
+ console.log(
4410
+ ` - Endpoint: ${config2.overrideServerAddress}`
4411
+ );
4037
4412
  }
4038
4413
  if (config2.runEngine) {
4039
4414
  const padding = " ".repeat(Math.max(0, 13 - "Engine".length));
@@ -4082,13 +4457,19 @@ async function configureServerlessRunner(config2) {
4082
4457
  logger7().debug("configuring serverless runner");
4083
4458
  try {
4084
4459
  if (!config2.runnerName) {
4085
- throw new Error("runnerName is required for serverless configuration");
4460
+ throw new Error(
4461
+ "runnerName is required for serverless configuration"
4462
+ );
4086
4463
  }
4087
4464
  if (!config2.namespace) {
4088
- throw new Error("namespace is required for serverless configuration");
4465
+ throw new Error(
4466
+ "namespace is required for serverless configuration"
4467
+ );
4089
4468
  }
4090
4469
  if (!config2.endpoint) {
4091
- throw new Error("endpoint is required for serverless configuration");
4470
+ throw new Error(
4471
+ "endpoint is required for serverless configuration"
4472
+ );
4092
4473
  }
4093
4474
  const customConfig = typeof config2.autoConfigureServerless === "object" ? config2.autoConfigureServerless : {};
4094
4475
  const clientConfig = {
@@ -4163,4 +4544,4 @@ export {
4163
4544
  setup
4164
4545
  };
4165
4546
  //! These configs configs hold anything that's not platform-specific about running actors.
4166
- //# sourceMappingURL=chunk-L3YPHXPE.js.map
4547
+ //# sourceMappingURL=chunk-4B25D5OW.js.map