rivetkit 2.0.22-rc.1 → 2.0.22

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 (124) hide show
  1. package/dist/schemas/actor-persist/v2.ts +259 -0
  2. package/dist/tsup/{chunk-LCQDY73V.cjs → chunk-2GJILCGQ.cjs} +3 -3
  3. package/dist/tsup/{chunk-LCQDY73V.cjs.map → chunk-2GJILCGQ.cjs.map} +1 -1
  4. package/dist/tsup/{chunk-JN6GPVFY.js → chunk-2K2LR56Q.js} +3 -3
  5. package/dist/tsup/{chunk-EEXX243L.js → chunk-2WVCZCJL.js} +6 -6
  6. package/dist/tsup/{chunk-FETQGZN4.js → chunk-3BJJSSTM.js} +272 -89
  7. package/dist/tsup/chunk-3BJJSSTM.js.map +1 -0
  8. package/dist/tsup/{chunk-ZZYMCYAY.cjs → chunk-3LFMVAJV.cjs} +14 -14
  9. package/dist/tsup/{chunk-ZZYMCYAY.cjs.map → chunk-3LFMVAJV.cjs.map} +1 -1
  10. package/dist/tsup/{chunk-NDLOG2JH.js → chunk-6YQKMAMV.js} +2 -2
  11. package/dist/tsup/{chunk-C2U6KGOG.cjs → chunk-AR4S2QJ7.cjs} +3 -3
  12. package/dist/tsup/{chunk-C2U6KGOG.cjs.map → chunk-AR4S2QJ7.cjs.map} +1 -1
  13. package/dist/tsup/{chunk-PELXJCJS.cjs → chunk-B4QZKOMH.cjs} +8 -8
  14. package/dist/tsup/{chunk-PELXJCJS.cjs.map → chunk-B4QZKOMH.cjs.map} +1 -1
  15. package/dist/tsup/{chunk-5EB77IQ2.cjs → chunk-CYA35VI3.cjs} +6 -6
  16. package/dist/tsup/{chunk-5EB77IQ2.cjs.map → chunk-CYA35VI3.cjs.map} +1 -1
  17. package/dist/tsup/{chunk-UBCUW7HD.js → chunk-D7AA2DK5.js} +2 -2
  18. package/dist/tsup/{chunk-I7EJWHYV.js → chunk-EBSGEDD3.js} +51 -47
  19. package/dist/tsup/chunk-EBSGEDD3.js.map +1 -0
  20. package/dist/tsup/{chunk-R6XOZKMU.cjs → chunk-HSO2H2SB.cjs} +467 -284
  21. package/dist/tsup/chunk-HSO2H2SB.cjs.map +1 -0
  22. package/dist/tsup/{chunk-VJLGVVGP.cjs → chunk-HZ4ZM3FL.cjs} +31 -12
  23. package/dist/tsup/chunk-HZ4ZM3FL.cjs.map +1 -0
  24. package/dist/tsup/{chunk-7FEMVD3D.cjs → chunk-LMZSOCYD.cjs} +12 -12
  25. package/dist/tsup/{chunk-7FEMVD3D.cjs.map → chunk-LMZSOCYD.cjs.map} +1 -1
  26. package/dist/tsup/{chunk-ZVEDMBFT.js → chunk-PBFLG45S.js} +3 -3
  27. package/dist/tsup/{chunk-GJPOIJHZ.js → chunk-ST6FGRCH.js} +26 -7
  28. package/dist/tsup/chunk-ST6FGRCH.js.map +1 -0
  29. package/dist/tsup/{chunk-BIOPK7IB.cjs → chunk-TI72NLP3.cjs} +71 -67
  30. package/dist/tsup/chunk-TI72NLP3.cjs.map +1 -0
  31. package/dist/tsup/{chunk-RPI45FGS.js → chunk-TQ4OAC2G.js} +2 -2
  32. package/dist/tsup/{chunk-4B25D5OW.js → chunk-UB4OHFDW.js} +385 -104
  33. package/dist/tsup/chunk-UB4OHFDW.js.map +1 -0
  34. package/dist/tsup/{chunk-6Z3YA6QR.cjs → chunk-V6C34TVH.cjs} +35 -15
  35. package/dist/tsup/chunk-V6C34TVH.cjs.map +1 -0
  36. package/dist/tsup/{chunk-OAB7ECAB.cjs → chunk-WVUAO2F7.cjs} +558 -277
  37. package/dist/tsup/chunk-WVUAO2F7.cjs.map +1 -0
  38. package/dist/tsup/{chunk-JKNDUKFI.js → chunk-WWAZJHTS.js} +36 -16
  39. package/dist/tsup/chunk-WWAZJHTS.js.map +1 -0
  40. package/dist/tsup/client/mod.cjs +9 -9
  41. package/dist/tsup/client/mod.d.cts +2 -2
  42. package/dist/tsup/client/mod.d.ts +2 -2
  43. package/dist/tsup/client/mod.js +8 -8
  44. package/dist/tsup/common/log.cjs +3 -3
  45. package/dist/tsup/common/log.js +2 -2
  46. package/dist/tsup/common/websocket.cjs +4 -4
  47. package/dist/tsup/common/websocket.js +3 -3
  48. package/dist/tsup/{conn-Clu655RU.d.ts → conn-BYXlxnh0.d.ts} +111 -102
  49. package/dist/tsup/{conn-lUvFLo_q.d.cts → conn-BiazosE_.d.cts} +111 -102
  50. package/dist/tsup/driver-helpers/mod.cjs +5 -5
  51. package/dist/tsup/driver-helpers/mod.d.cts +1 -1
  52. package/dist/tsup/driver-helpers/mod.d.ts +1 -1
  53. package/dist/tsup/driver-helpers/mod.js +4 -4
  54. package/dist/tsup/driver-test-suite/mod.cjs +71 -71
  55. package/dist/tsup/driver-test-suite/mod.d.cts +1 -1
  56. package/dist/tsup/driver-test-suite/mod.d.ts +1 -1
  57. package/dist/tsup/driver-test-suite/mod.js +11 -11
  58. package/dist/tsup/inspector/mod.cjs +6 -6
  59. package/dist/tsup/inspector/mod.d.cts +2 -2
  60. package/dist/tsup/inspector/mod.d.ts +2 -2
  61. package/dist/tsup/inspector/mod.js +5 -5
  62. package/dist/tsup/mod.cjs +10 -10
  63. package/dist/tsup/mod.d.cts +3 -3
  64. package/dist/tsup/mod.d.ts +3 -3
  65. package/dist/tsup/mod.js +9 -9
  66. package/dist/tsup/test/mod.cjs +11 -11
  67. package/dist/tsup/test/mod.d.cts +1 -1
  68. package/dist/tsup/test/mod.d.ts +1 -1
  69. package/dist/tsup/test/mod.js +10 -10
  70. package/dist/tsup/utils.cjs +8 -2
  71. package/dist/tsup/utils.cjs.map +1 -1
  72. package/dist/tsup/utils.d.cts +8 -1
  73. package/dist/tsup/utils.d.ts +8 -1
  74. package/dist/tsup/utils.js +7 -1
  75. package/package.json +5 -4
  76. package/src/actor/config.ts +10 -0
  77. package/src/actor/conn-drivers.ts +43 -1
  78. package/src/actor/conn-socket.ts +1 -1
  79. package/src/actor/conn.ts +22 -2
  80. package/src/actor/context.ts +1 -1
  81. package/src/actor/driver.ts +13 -2
  82. package/src/actor/instance.ts +248 -57
  83. package/src/actor/persisted.ts +7 -0
  84. package/src/actor/router-endpoints.ts +67 -45
  85. package/src/actor/router.ts +25 -17
  86. package/src/client/actor-conn.ts +9 -5
  87. package/src/common/cors.ts +57 -0
  88. package/src/common/log.ts +26 -5
  89. package/src/common/utils.ts +5 -9
  90. package/src/common/websocket-interface.ts +10 -0
  91. package/src/driver-helpers/utils.ts +1 -0
  92. package/src/drivers/engine/actor-driver.ts +261 -14
  93. package/src/drivers/engine/config.ts +2 -4
  94. package/src/drivers/file-system/actor.ts +3 -2
  95. package/src/drivers/file-system/global-state.ts +1 -1
  96. package/src/drivers/file-system/manager.ts +3 -0
  97. package/src/engine-process/mod.ts +22 -4
  98. package/src/inspector/config.ts +0 -45
  99. package/src/manager/gateway.ts +45 -32
  100. package/src/manager/hono-websocket-adapter.ts +31 -3
  101. package/src/manager/router.ts +11 -17
  102. package/src/registry/run-config.ts +2 -8
  103. package/src/remote-manager-driver/actor-http-client.ts +5 -8
  104. package/src/remote-manager-driver/actor-websocket-client.ts +2 -14
  105. package/src/remote-manager-driver/mod.ts +0 -1
  106. package/src/schemas/actor-persist/mod.ts +1 -1
  107. package/src/schemas/actor-persist/versioned.ts +22 -10
  108. package/src/utils.ts +26 -0
  109. package/dist/tsup/chunk-4B25D5OW.js.map +0 -1
  110. package/dist/tsup/chunk-6Z3YA6QR.cjs.map +0 -1
  111. package/dist/tsup/chunk-BIOPK7IB.cjs.map +0 -1
  112. package/dist/tsup/chunk-FETQGZN4.js.map +0 -1
  113. package/dist/tsup/chunk-GJPOIJHZ.js.map +0 -1
  114. package/dist/tsup/chunk-I7EJWHYV.js.map +0 -1
  115. package/dist/tsup/chunk-JKNDUKFI.js.map +0 -1
  116. package/dist/tsup/chunk-OAB7ECAB.cjs.map +0 -1
  117. package/dist/tsup/chunk-R6XOZKMU.cjs.map +0 -1
  118. package/dist/tsup/chunk-VJLGVVGP.cjs.map +0 -1
  119. /package/dist/tsup/{chunk-JN6GPVFY.js.map → chunk-2K2LR56Q.js.map} +0 -0
  120. /package/dist/tsup/{chunk-EEXX243L.js.map → chunk-2WVCZCJL.js.map} +0 -0
  121. /package/dist/tsup/{chunk-NDLOG2JH.js.map → chunk-6YQKMAMV.js.map} +0 -0
  122. /package/dist/tsup/{chunk-UBCUW7HD.js.map → chunk-D7AA2DK5.js.map} +0 -0
  123. /package/dist/tsup/{chunk-ZVEDMBFT.js.map → chunk-PBFLG45S.js.map} +0 -0
  124. /package/dist/tsup/{chunk-RPI45FGS.js.map → chunk-TQ4OAC2G.js.map} +0 -0
@@ -4,23 +4,24 @@ import {
4
4
  inspectorLogger,
5
5
  isInspectorEnabled,
6
6
  secureInspector
7
- } from "./chunk-NDLOG2JH.js";
7
+ } from "./chunk-6YQKMAMV.js";
8
8
  import {
9
9
  ActorDefinition,
10
+ PERSIST_SYMBOL,
10
11
  RemoteManagerDriver,
11
12
  createActorInspectorRouter,
12
13
  createClientWithDriver,
13
14
  deserializeActorKey,
14
- generateConnSocketId,
15
+ generateConnRequestId,
15
16
  getDatacenters,
16
17
  getEndpoint,
17
18
  lookupInRegistry,
18
19
  serializeActorKey,
19
20
  updateRunnerConfig
20
- } from "./chunk-FETQGZN4.js";
21
+ } from "./chunk-3BJJSSTM.js";
21
22
  import {
22
23
  CreateActorSchema
23
- } from "./chunk-RPI45FGS.js";
24
+ } from "./chunk-TQ4OAC2G.js";
24
25
  import {
25
26
  ActionContext,
26
27
  ClientConfigSchema,
@@ -32,7 +33,7 @@ import {
32
33
  createVersionedDataHandler,
33
34
  parseMessage,
34
35
  serializeEmptyPersistData
35
- } from "./chunk-I7EJWHYV.js";
36
+ } from "./chunk-EBSGEDD3.js";
36
37
  import {
37
38
  EncodingSchema,
38
39
  HEADER_ACTOR_ID,
@@ -58,24 +59,27 @@ import {
58
59
  generateRandomString,
59
60
  loggerWithoutContext,
60
61
  serializeWithEncoding
61
- } from "./chunk-ZVEDMBFT.js";
62
+ } from "./chunk-PBFLG45S.js";
62
63
  import {
63
64
  configureBaseLogger,
64
65
  configureDefaultLogger,
65
66
  getLogger
66
- } from "./chunk-GJPOIJHZ.js";
67
+ } from "./chunk-ST6FGRCH.js";
67
68
  import {
69
+ EXTRA_ERROR_LOG,
68
70
  VERSION,
71
+ arrayBuffersEqual,
69
72
  assertUnreachable,
70
73
  bufferToArrayBuffer,
71
74
  deconstructError,
72
75
  getEnvUniversal,
76
+ idToStr,
73
77
  noopNext,
74
78
  package_default,
75
79
  promiseWithResolvers,
76
80
  setLongTimeout,
77
81
  stringifyError
78
- } from "./chunk-JKNDUKFI.js";
82
+ } from "./chunk-WWAZJHTS.js";
79
83
  import {
80
84
  ActorAlreadyExists,
81
85
  ConnNotFound,
@@ -124,7 +128,12 @@ var ActorConfigSchema = z.object({
124
128
  connectionLivenessTimeout: z.number().positive().default(2500),
125
129
  connectionLivenessInterval: z.number().positive().default(5e3),
126
130
  noSleep: z.boolean().default(false),
127
- sleepTimeout: z.number().positive().default(3e4)
131
+ sleepTimeout: z.number().positive().default(3e4),
132
+ /** @experimental */
133
+ canHibernatWebSocket: z.union([
134
+ z.boolean(),
135
+ z.function().args(z.custom()).returns(z.boolean())
136
+ ]).default(false)
128
137
  }).strict().default({})
129
138
  }).strict().refine(
130
139
  (data) => !(data.state !== void 0 && data.createState !== void 0),
@@ -148,7 +157,6 @@ var ActorConfigSchema = z.object({
148
157
 
149
158
  // src/actor/router.ts
150
159
  import { Hono } from "hono";
151
- import { cors } from "hono/cors";
152
160
  import invariant2 from "invariant";
153
161
 
154
162
  // src/actor/router-endpoints.ts
@@ -174,11 +182,19 @@ var HonoWebSocketAdapter = class {
174
182
  #eventListeners = /* @__PURE__ */ new Map();
175
183
  #closeCode;
176
184
  #closeReason;
177
- constructor(ws) {
185
+ rivetRequestId;
186
+ isHibernatable;
187
+ constructor(ws, rivetRequestId, isHibernatable) {
178
188
  this.#ws = ws;
189
+ this.rivetRequestId = rivetRequestId;
190
+ this.isHibernatable = isHibernatable;
179
191
  this.#readyState = this.OPEN;
180
192
  setTimeout(() => {
181
- this.#fireEvent("open", { type: "open", target: this });
193
+ this.#fireEvent("open", {
194
+ type: "open",
195
+ target: this,
196
+ rivetRequestId: this.rivetRequestId
197
+ });
182
198
  }, 0);
183
199
  }
184
200
  get readyState() {
@@ -272,7 +288,8 @@ var HonoWebSocketAdapter = class {
272
288
  target: this,
273
289
  code,
274
290
  reason,
275
- wasClean: code === 1e3
291
+ wasClean: code === 1e3,
292
+ rivetRequestId: this.rivetRequestId
276
293
  });
277
294
  } catch (error) {
278
295
  logger().error({ msg: "error closing websocket", error });
@@ -282,7 +299,8 @@ var HonoWebSocketAdapter = class {
282
299
  target: this,
283
300
  code: 1006,
284
301
  reason: "Abnormal closure",
285
- wasClean: false
302
+ wasClean: false,
303
+ rivetRequestId: this.rivetRequestId
286
304
  });
287
305
  }
288
306
  }
@@ -317,12 +335,20 @@ var HonoWebSocketAdapter = class {
317
335
  // Internal method to handle incoming messages from WSContext
318
336
  _handleMessage(data) {
319
337
  let messageData;
338
+ let rivetRequestId;
339
+ let rivetMessageIndex;
320
340
  if (typeof data === "string") {
321
341
  messageData = data;
322
342
  } else if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {
323
343
  messageData = data;
324
344
  } else if (data && typeof data === "object" && "data" in data) {
325
345
  messageData = data.data;
346
+ if ("rivetRequestId" in data) {
347
+ rivetRequestId = data.rivetRequestId;
348
+ }
349
+ if ("rivetMessageIndex" in data) {
350
+ rivetMessageIndex = data.rivetMessageIndex;
351
+ }
326
352
  } else {
327
353
  messageData = String(data);
328
354
  }
@@ -330,12 +356,15 @@ var HonoWebSocketAdapter = class {
330
356
  msg: "bridge handling message",
331
357
  dataType: typeof messageData,
332
358
  isArrayBuffer: messageData instanceof ArrayBuffer,
333
- dataStr: typeof messageData === "string" ? messageData : "<binary>"
359
+ dataStr: typeof messageData === "string" ? messageData : "<binary>",
360
+ rivetMessageIndex
334
361
  });
335
362
  this.#fireEvent("message", {
336
363
  type: "message",
337
364
  target: this,
338
- data: messageData
365
+ data: messageData,
366
+ rivetRequestId,
367
+ rivetMessageIndex
339
368
  });
340
369
  }
341
370
  // Internal method to handle close from WSContext
@@ -350,7 +379,8 @@ var HonoWebSocketAdapter = class {
350
379
  target: this,
351
380
  code,
352
381
  reason,
353
- wasClean: code === 1e3
382
+ wasClean: code === 1e3,
383
+ rivetRequestId: this.rivetRequestId
354
384
  });
355
385
  }
356
386
  // Internal method to handle errors from WSContext
@@ -459,7 +489,7 @@ var HonoWebSocketAdapter = class {
459
489
 
460
490
  // src/actor/router-endpoints.ts
461
491
  var SSE_PING_INTERVAL = 1e3;
462
- async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, encoding, parameters, connId, connToken) {
492
+ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, encoding, parameters, requestId, connId, connToken) {
463
493
  const exposeInternalError = req ? getRequestExposeInternalError(req) : false;
464
494
  const {
465
495
  promise: handlersPromise,
@@ -492,7 +522,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
492
522
  };
493
523
  }
494
524
  const closePromise = promiseWithResolvers();
495
- const socketId = generateConnSocketId();
525
+ let createdConn;
496
526
  return {
497
527
  onOpen: (_evt, ws) => {
498
528
  actor2.rLog.debug("actor websocket open");
@@ -506,7 +536,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
506
536
  });
507
537
  conn = await actor2.createConn(
508
538
  {
509
- socketId,
539
+ requestId,
510
540
  driverState: {
511
541
  [0 /* WEBSOCKET */]: {
512
542
  encoding,
@@ -520,6 +550,7 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
520
550
  connId,
521
551
  connToken
522
552
  );
553
+ createdConn = conn;
523
554
  handlersResolve({ conn, actor: actor2, connId: conn.id });
524
555
  } catch (error) {
525
556
  handlersReject(error);
@@ -596,16 +627,11 @@ async function handleWebSocketConnect(req, runConfig, actorDriver, actorId, enco
596
627
  });
597
628
  }
598
629
  ws.close(1e3, "hack_force_close");
599
- handlersPromise.then(({ conn, actor: actor3 }) => {
600
- const wasClean = event.wasClean || event.code === 1e3;
601
- actor3.__connDisconnected(conn, wasClean, socketId);
602
- }).catch((error) => {
603
- deconstructError(
604
- error,
605
- actor2.rLog,
606
- { wsEvent: "close" },
607
- exposeInternalError
608
- );
630
+ handlersPromise.finally(() => {
631
+ if (createdConn) {
632
+ const wasClean = event.wasClean || event.code === 1e3;
633
+ actor2.__connDisconnected(createdConn, wasClean, requestId);
634
+ }
609
635
  });
610
636
  },
611
637
  onError: (_error) => {
@@ -626,7 +652,7 @@ async function handleSseConnect(c, _runConfig, actorDriver, actorId) {
626
652
  c.header("Content-Encoding", "Identity");
627
653
  const encoding = getRequestEncoding(c.req);
628
654
  const parameters = getRequestConnParams(c.req);
629
- const socketId = generateConnSocketId();
655
+ const requestId = generateConnRequestId();
630
656
  const connId = c.req.header(HEADER_CONN_ID);
631
657
  const connToken = c.req.header(HEADER_CONN_TOKEN);
632
658
  return streamSSE(c, async (stream) => {
@@ -640,7 +666,7 @@ async function handleSseConnect(c, _runConfig, actorDriver, actorId) {
640
666
  });
641
667
  conn = await actor2.createConn(
642
668
  {
643
- socketId,
669
+ requestId,
644
670
  driverState: {
645
671
  [1 /* SSE */]: {
646
672
  encoding,
@@ -662,7 +688,7 @@ async function handleSseConnect(c, _runConfig, actorDriver, actorId) {
662
688
  try {
663
689
  rLog.debug("sse stream aborted");
664
690
  if (conn) {
665
- actor2.__connDisconnected(conn, false, socketId);
691
+ actor2.__connDisconnected(conn, false, requestId);
666
692
  }
667
693
  abortResolver.resolve(void 0);
668
694
  } catch (error) {
@@ -688,7 +714,7 @@ async function handleSseConnect(c, _runConfig, actorDriver, actorId) {
688
714
  error
689
715
  });
690
716
  if (conn && actor2 !== void 0) {
691
- actor2.__connDisconnected(conn, false, socketId);
717
+ actor2.__connDisconnected(conn, false, requestId);
692
718
  }
693
719
  stream.close();
694
720
  }
@@ -704,7 +730,7 @@ async function handleAction(c, _runConfig, actorDriver, actionName, actorId) {
704
730
  HTTP_ACTION_REQUEST_VERSIONED
705
731
  );
706
732
  const actionArgs = cbor.decode(new Uint8Array(request.args));
707
- const socketId = generateConnSocketId();
733
+ const requestId = generateConnRequestId();
708
734
  let actor2;
709
735
  let conn;
710
736
  let output;
@@ -713,7 +739,7 @@ async function handleAction(c, _runConfig, actorDriver, actionName, actorId) {
713
739
  actor2.rLog.debug({ msg: "handling action", actionName, encoding });
714
740
  conn = await actor2.createConn(
715
741
  {
716
- socketId,
742
+ requestId,
717
743
  driverState: { [2 /* HTTP */]: {} }
718
744
  },
719
745
  parameters,
@@ -723,7 +749,7 @@ async function handleAction(c, _runConfig, actorDriver, actionName, actorId) {
723
749
  output = await actor2.executeAction(ctx, actionName, actionArgs);
724
750
  } finally {
725
751
  if (conn) {
726
- actor2 == null ? void 0 : actor2.__connDisconnected(conn, true, socketId);
752
+ actor2 == null ? void 0 : actor2.__connDisconnected(conn, true, requestId);
727
753
  }
728
754
  }
729
755
  const responseData = {
@@ -778,27 +804,30 @@ async function handleConnectionClose(c, _runConfig, actorDriver, connId, connTok
778
804
  async function handleRawWebSocketHandler(req, path4, actorDriver, actorId) {
779
805
  const actor2 = await actorDriver.loadActor(actorId);
780
806
  return {
781
- onOpen: (_evt, ws) => {
782
- const adapter = new HonoWebSocketAdapter(ws);
807
+ onOpen: (evt, ws) => {
808
+ const rivetRequestId = evt == null ? void 0 : evt.rivetRequestId;
809
+ const isHibernatable = actor2[PERSIST_SYMBOL].hibernatableWebSocket.findIndex(
810
+ (ws2) => arrayBuffersEqual(ws2.requestId, rivetRequestId)
811
+ ) !== -1;
812
+ const adapter = new HonoWebSocketAdapter(
813
+ ws,
814
+ rivetRequestId,
815
+ isHibernatable
816
+ );
783
817
  ws.__adapter = adapter;
784
- const url = new URL(path4, "http://actor");
785
- const pathname = url.pathname.replace(/^\/raw\/websocket\/?/, "") || "/";
786
- const normalizedPath = (pathname.startsWith("/") ? pathname : "/" + pathname) + url.search;
818
+ const newPath = truncateRawWebSocketPathPrefix(path4);
787
819
  let newRequest;
788
820
  if (req) {
789
- newRequest = new Request(`http://actor${normalizedPath}`, req);
821
+ newRequest = new Request(`http://actor${newPath}`, req);
790
822
  } else {
791
- newRequest = new Request(`http://actor${normalizedPath}`, {
823
+ newRequest = new Request(`http://actor${newPath}`, {
792
824
  method: "GET"
793
825
  });
794
826
  }
795
827
  actor2.rLog.debug({
796
828
  msg: "rewriting websocket url",
797
- from: path4,
798
- to: newRequest.url,
799
- pathname: url.pathname,
800
- search: url.search,
801
- normalizedPath
829
+ fromPath: path4,
830
+ toUrl: newRequest.url
802
831
  });
803
832
  actor2.handleWebSocket(adapter, {
804
833
  request: newRequest
@@ -851,6 +880,12 @@ function getRequestConnParams(req) {
851
880
  );
852
881
  }
853
882
  }
883
+ function truncateRawWebSocketPathPrefix(path4) {
884
+ const url = new URL(path4, "http://actor");
885
+ const pathname = url.pathname.replace(/^\/raw\/websocket\/?/, "") || "/";
886
+ const normalizedPath = (pathname.startsWith("/") ? pathname : "/" + pathname) + url.search;
887
+ return normalizedPath;
888
+ }
854
889
 
855
890
  // src/common/router.ts
856
891
  import * as cbor2 from "cbor-x";
@@ -963,6 +998,15 @@ function createActorRouter(runConfig, actorDriver, isTest) {
963
998
  strict: false
964
999
  });
965
1000
  router.use("*", loggerMiddleware(loggerWithoutContext()));
1001
+ router.use("*", async (c, next) => {
1002
+ const actor2 = await actorDriver.loadActor(c.env.actorId);
1003
+ actor2.__beginHonoHttpRequest();
1004
+ try {
1005
+ await next();
1006
+ } finally {
1007
+ actor2.__endHonoHttpRequest();
1008
+ }
1009
+ });
966
1010
  router.get("/", (c) => {
967
1011
  return c.text(
968
1012
  "This is an RivetKit actor.\n\nLearn more at https://rivetkit.org"
@@ -1036,6 +1080,7 @@ function createActorRouter(runConfig, actorDriver, isTest) {
1036
1080
  c2.env.actorId,
1037
1081
  encoding,
1038
1082
  connParams,
1083
+ generateConnRequestId(),
1039
1084
  connIdRaw,
1040
1085
  connTokenRaw
1041
1086
  );
@@ -1143,19 +1188,15 @@ function createActorRouter(runConfig, actorDriver, isTest) {
1143
1188
  if (isInspectorEnabled(runConfig, "actor")) {
1144
1189
  router.route(
1145
1190
  "/inspect",
1146
- new Hono().use(
1147
- cors(runConfig.inspector.cors),
1148
- secureInspector(runConfig),
1149
- async (c, next) => {
1150
- const inspector = (await actorDriver.loadActor(c.env.actorId)).inspector;
1151
- invariant2(
1152
- inspector,
1153
- "inspector not supported on this platform"
1154
- );
1155
- c.set("inspector", inspector);
1156
- return next();
1157
- }
1158
- ).route("/", createActorInspectorRouter())
1191
+ new Hono().use(secureInspector(runConfig), async (c, next) => {
1192
+ const inspector = (await actorDriver.loadActor(c.env.actorId)).inspector;
1193
+ invariant2(
1194
+ inspector,
1195
+ "inspector not supported on this platform"
1196
+ );
1197
+ c.set("inspector", inspector);
1198
+ return next();
1199
+ }).route("/", createActorInspectorRouter())
1159
1200
  );
1160
1201
  }
1161
1202
  router.notFound(handleRouteNotFound);
@@ -1539,6 +1580,7 @@ function logger4() {
1539
1580
  }
1540
1581
 
1541
1582
  // src/drivers/engine/actor-driver.ts
1583
+ var RUNNER_SSE_PING_INTERVAL = 1e3;
1542
1584
  var EngineActorDriver = class {
1543
1585
  #registryConfig;
1544
1586
  #runConfig;
@@ -1552,12 +1594,16 @@ var EngineActorDriver = class {
1552
1594
  #alarmTimeout;
1553
1595
  #runnerStarted = promiseWithResolvers();
1554
1596
  #runnerStopped = promiseWithResolvers();
1597
+ #isRunnerStopped = false;
1598
+ // WebSocket message acknowledgment debouncing
1599
+ #wsAckQueue = /* @__PURE__ */ new Map();
1600
+ #wsAckFlushInterval;
1555
1601
  constructor(registryConfig, runConfig, managerDriver, inlineClient) {
1556
1602
  this.#registryConfig = registryConfig;
1557
1603
  this.#runConfig = runConfig;
1558
1604
  this.#managerDriver = managerDriver;
1559
1605
  this.#inlineClient = inlineClient;
1560
- const token = runConfig.token ?? runConfig.token;
1606
+ const token = runConfig.token;
1561
1607
  if (token && runConfig.inspector && runConfig.inspector.enabled) {
1562
1608
  runConfig.inspector.token = () => token;
1563
1609
  }
@@ -1571,10 +1617,10 @@ var EngineActorDriver = class {
1571
1617
  version: this.#version,
1572
1618
  endpoint: getEndpoint(runConfig),
1573
1619
  token,
1574
- namespace: runConfig.namespace ?? runConfig.namespace,
1575
- totalSlots: runConfig.totalSlots ?? runConfig.totalSlots,
1576
- runnerName: runConfig.runnerName ?? runConfig.runnerName,
1577
- runnerKey: runConfig.runnerKey,
1620
+ namespace: runConfig.namespace,
1621
+ totalSlots: runConfig.totalSlots,
1622
+ runnerName: runConfig.runnerName,
1623
+ runnerKey: runConfig.runnerKey ?? crypto.randomUUID(),
1578
1624
  metadata: {
1579
1625
  inspectorToken: this.#runConfig.inspector.token()
1580
1626
  },
@@ -1595,22 +1641,126 @@ var EngineActorDriver = class {
1595
1641
  }
1596
1642
  this.#runnerStarted.resolve(void 0);
1597
1643
  },
1598
- onDisconnected: () => {
1644
+ onDisconnected: (code, reason) => {
1599
1645
  logger4().warn({
1600
1646
  msg: "runner disconnected",
1601
1647
  namespace: this.#runConfig.namespace,
1602
- runnerName: this.#runConfig.runnerName
1648
+ runnerName: this.#runConfig.runnerName,
1649
+ code,
1650
+ reason
1603
1651
  });
1604
1652
  hasDisconnected = true;
1605
1653
  },
1606
1654
  onShutdown: () => {
1607
1655
  this.#runnerStopped.resolve(void 0);
1656
+ this.#isRunnerStopped = true;
1608
1657
  },
1609
1658
  fetch: this.#runnerFetch.bind(this),
1610
1659
  websocket: this.#runnerWebSocket.bind(this),
1611
1660
  onActorStart: this.#runnerOnActorStart.bind(this),
1612
1661
  onActorStop: this.#runnerOnActorStop.bind(this),
1613
- logger: getLogger("engine-runner")
1662
+ logger: getLogger("engine-runner"),
1663
+ getActorHibernationConfig: (actorId, requestId, request) => {
1664
+ var _a;
1665
+ const url = new URL(request.url);
1666
+ const path4 = url.pathname;
1667
+ const actorInstance = this.#runner.getActor(actorId);
1668
+ if (!actorInstance) {
1669
+ logger4().warn({
1670
+ msg: "actor not found in getActorHibernationConfig",
1671
+ actorId
1672
+ });
1673
+ return { enabled: false, lastMsgIndex: void 0 };
1674
+ }
1675
+ const handler = this.#actors.get(actorId);
1676
+ if (!handler) {
1677
+ logger4().warn({
1678
+ msg: "actor handler not found in getActorHibernationConfig",
1679
+ actorId
1680
+ });
1681
+ return { enabled: false, lastMsgIndex: void 0 };
1682
+ }
1683
+ if (!handler.actor) {
1684
+ logger4().warn({
1685
+ msg: "actor not found in getActorHibernationConfig",
1686
+ actorId
1687
+ });
1688
+ return { enabled: false, lastMsgIndex: void 0 };
1689
+ }
1690
+ const existingWs = handler.actor[PERSIST_SYMBOL].hibernatableWebSocket.find(
1691
+ (ws) => arrayBuffersEqual(ws.requestId, requestId)
1692
+ );
1693
+ let hibernationConfig;
1694
+ if (existingWs) {
1695
+ hibernationConfig = {
1696
+ enabled: true,
1697
+ lastMsgIndex: Number(existingWs.msgIndex)
1698
+ };
1699
+ } else {
1700
+ if (path4 === PATH_CONNECT_WEBSOCKET) {
1701
+ hibernationConfig = {
1702
+ enabled: true,
1703
+ lastMsgIndex: void 0
1704
+ };
1705
+ } else if (path4.startsWith(PATH_RAW_WEBSOCKET_PREFIX)) {
1706
+ const definition = lookupInRegistry(
1707
+ this.#registryConfig,
1708
+ actorInstance.config.name
1709
+ );
1710
+ const canHibernatWebSocket = (_a = definition.config.options) == null ? void 0 : _a.canHibernatWebSocket;
1711
+ if (canHibernatWebSocket === true) {
1712
+ hibernationConfig = {
1713
+ enabled: true,
1714
+ lastMsgIndex: void 0
1715
+ };
1716
+ } else if (typeof canHibernatWebSocket === "function") {
1717
+ try {
1718
+ const newPath = truncateRawWebSocketPathPrefix(
1719
+ url.pathname
1720
+ );
1721
+ const truncatedRequest = new Request(
1722
+ `http://actor${newPath}`,
1723
+ request
1724
+ );
1725
+ const canHibernate = canHibernatWebSocket(truncatedRequest);
1726
+ hibernationConfig = {
1727
+ enabled: canHibernate,
1728
+ lastMsgIndex: void 0
1729
+ };
1730
+ } catch (error) {
1731
+ logger4().error({
1732
+ msg: "error calling canHibernatWebSocket",
1733
+ error
1734
+ });
1735
+ hibernationConfig = {
1736
+ enabled: false,
1737
+ lastMsgIndex: void 0
1738
+ };
1739
+ }
1740
+ } else {
1741
+ hibernationConfig = {
1742
+ enabled: false,
1743
+ lastMsgIndex: void 0
1744
+ };
1745
+ }
1746
+ } else {
1747
+ logger4().warn({
1748
+ msg: "unexpected path for getActorHibernationConfig",
1749
+ path: path4
1750
+ });
1751
+ hibernationConfig = {
1752
+ enabled: false,
1753
+ lastMsgIndex: void 0
1754
+ };
1755
+ }
1756
+ }
1757
+ handler.actor[PERSIST_SYMBOL].hibernatableWebSocket.push({
1758
+ requestId,
1759
+ lastSeenTimestamp: BigInt(Date.now()),
1760
+ msgIndex: -1n
1761
+ });
1762
+ return hibernationConfig;
1763
+ }
1614
1764
  };
1615
1765
  this.#runner = new Runner(engineRunnerConfig);
1616
1766
  this.#runner.start();
@@ -1620,6 +1770,7 @@ var EngineActorDriver = class {
1620
1770
  namespace: runConfig.namespace,
1621
1771
  runnerName: runConfig.runnerName
1622
1772
  });
1773
+ this.#wsAckFlushInterval = setInterval(() => this.#flushWsAcks(), 1e3);
1623
1774
  }
1624
1775
  async #loadActorHandler(actorId) {
1625
1776
  const handler = this.#actors.get(actorId);
@@ -1634,6 +1785,16 @@ var EngineActorDriver = class {
1634
1785
  if (!handler.actor) throw new Error(`Actor ${actorId} failed to load`);
1635
1786
  return handler.actor;
1636
1787
  }
1788
+ #flushWsAcks() {
1789
+ if (this.#wsAckQueue.size === 0) return;
1790
+ for (const {
1791
+ requestIdBuf: requestId,
1792
+ messageIndex: index
1793
+ } of this.#wsAckQueue.values()) {
1794
+ this.#runner.sendWebsocketMessageAck(requestId, index);
1795
+ }
1796
+ this.#wsAckQueue.clear();
1797
+ }
1637
1798
  getContext(actorId) {
1638
1799
  return {};
1639
1800
  }
@@ -1714,12 +1875,19 @@ var EngineActorDriver = class {
1714
1875
  logger4().debug({ msg: "runner actor stopping", actorId, generation });
1715
1876
  const handler = this.#actors.get(actorId);
1716
1877
  if (handler == null ? void 0 : handler.actor) {
1717
- await handler.actor._stop();
1878
+ try {
1879
+ await handler.actor._onStop();
1880
+ } catch (err) {
1881
+ logger4().error({
1882
+ msg: "error in _onStop, proceeding with removing actor",
1883
+ err: stringifyError(err)
1884
+ });
1885
+ }
1718
1886
  this.#actors.delete(actorId);
1719
1887
  }
1720
1888
  logger4().debug({ msg: "runner actor stopped", actorId });
1721
1889
  }
1722
- async #runnerFetch(runner, actorId, request) {
1890
+ async #runnerFetch(_runner, actorId, _requestIdBuf, request) {
1723
1891
  logger4().debug({
1724
1892
  msg: "runner fetch",
1725
1893
  actorId,
@@ -1728,8 +1896,9 @@ var EngineActorDriver = class {
1728
1896
  });
1729
1897
  return await this.#actorRouter.fetch(request, { actorId });
1730
1898
  }
1731
- async #runnerWebSocket(runner, actorId, websocketRaw, request) {
1899
+ async #runnerWebSocket(_runner, actorId, websocketRaw, requestIdBuf, request) {
1732
1900
  const websocket = websocketRaw;
1901
+ const requestId = idToStr(requestIdBuf);
1733
1902
  logger4().debug({ msg: "runner websocket", actorId, url: request.url });
1734
1903
  const url = new URL(request.url);
1735
1904
  const protocols = request.headers.get("sec-websocket-protocol");
@@ -1760,6 +1929,7 @@ var EngineActorDriver = class {
1760
1929
  actorId,
1761
1930
  encoding,
1762
1931
  connParams,
1932
+ requestId,
1763
1933
  // Extract connId and connToken from protocols if needed
1764
1934
  void 0,
1765
1935
  void 0
@@ -1799,8 +1969,29 @@ var EngineActorDriver = class {
1799
1969
  var _a;
1800
1970
  return (_a = x.onMessage) == null ? void 0 : _a.call(x, event, wsContext);
1801
1971
  });
1972
+ invariant3(event.rivetRequestId, "missing rivetRequestId");
1973
+ invariant3(event.rivetMessageIndex, "missing rivetMessageIndex");
1974
+ const currentEntry = this.#wsAckQueue.get(requestId);
1975
+ if (currentEntry) {
1976
+ if (event.rivetMessageIndex > currentEntry.messageIndex) {
1977
+ currentEntry.messageIndex = event.rivetMessageIndex;
1978
+ } else {
1979
+ logger4().warn({
1980
+ msg: "received lower index than ack queue for message",
1981
+ requestId,
1982
+ queuedMessageIndex: currentEntry,
1983
+ eventMessageIndex: event.rivetMessageIndex
1984
+ });
1985
+ }
1986
+ } else {
1987
+ this.#wsAckQueue.set(requestId, {
1988
+ requestIdBuf,
1989
+ messageIndex: event.rivetMessageIndex
1990
+ });
1991
+ }
1802
1992
  });
1803
1993
  websocket.addEventListener("close", (event) => {
1994
+ this.#flushWsAcks();
1804
1995
  wsHandlerPromise.then((x) => {
1805
1996
  var _a;
1806
1997
  return (_a = x.onClose) == null ? void 0 : _a.call(x, event, wsContext);
@@ -1813,11 +2004,16 @@ var EngineActorDriver = class {
1813
2004
  });
1814
2005
  });
1815
2006
  }
1816
- async sleep(actorId) {
2007
+ startSleep(actorId) {
1817
2008
  this.#runner.sleepActor(actorId);
1818
2009
  }
1819
- async shutdown(immediate) {
2010
+ async shutdownRunner(immediate) {
1820
2011
  logger4().info({ msg: "stopping engine actor driver" });
2012
+ if (this.#wsAckFlushInterval) {
2013
+ clearInterval(this.#wsAckFlushInterval);
2014
+ this.#wsAckFlushInterval = void 0;
2015
+ }
2016
+ this.#flushWsAcks();
1821
2017
  await this.#runner.shutdown(immediate);
1822
2018
  }
1823
2019
  async serverlessHandleStart(c) {
@@ -1826,15 +2022,36 @@ var EngineActorDriver = class {
1826
2022
  });
1827
2023
  c.req.raw.signal.addEventListener("abort", () => {
1828
2024
  logger4().debug("SSE aborted, shutting down runner");
1829
- this.shutdown(true);
2025
+ this.shutdownRunner(false);
1830
2026
  });
1831
2027
  await this.#runnerStarted.promise;
1832
2028
  const payload = this.#runner.getServerlessInitPacket();
1833
2029
  invariant3(payload, "runnerId not set");
1834
2030
  await stream.writeSSE({ data: payload });
2031
+ while (true) {
2032
+ if (this.#isRunnerStopped) {
2033
+ logger4().debug({
2034
+ msg: "runner is stopped"
2035
+ });
2036
+ break;
2037
+ }
2038
+ if (stream.closed || stream.aborted) {
2039
+ logger4().debug({
2040
+ msg: "runner sse stream closed",
2041
+ closed: stream.closed,
2042
+ aborted: stream.aborted
2043
+ });
2044
+ break;
2045
+ }
2046
+ await stream.writeSSE({ event: "ping", data: "" });
2047
+ await stream.sleep(RUNNER_SSE_PING_INTERVAL);
2048
+ }
1835
2049
  await this.#runnerStopped.promise;
1836
2050
  });
1837
2051
  }
2052
+ getExtraActorLogParams() {
2053
+ return { runnerId: this.#runner.runnerId ?? "-" };
2054
+ }
1838
2055
  };
1839
2056
 
1840
2057
  // src/drivers/engine/mod.ts
@@ -1905,8 +2122,8 @@ var FileSystemActorDriver = class {
1905
2122
  getDatabase(actorId) {
1906
2123
  return this.#state.createDatabase(actorId);
1907
2124
  }
1908
- sleep(actorId) {
1909
- return this.#state.sleepActor(actorId);
2125
+ startSleep(actorId) {
2126
+ this.#state.sleepActor(actorId);
1910
2127
  }
1911
2128
  };
1912
2129
 
@@ -2269,7 +2486,7 @@ var FileSystemGlobalState = class {
2269
2486
  await actor2.startPromise.promise.catch();
2270
2487
  actor2.removed = true;
2271
2488
  invariant4(actor2.actor, "actor should be loaded");
2272
- await actor2.actor._stop();
2489
+ await actor2.actor._onStop();
2273
2490
  this.#actors.delete(actorId);
2274
2491
  }
2275
2492
  /**
@@ -2743,6 +2960,7 @@ var FileSystemManagerDriver = class {
2743
2960
  actorId,
2744
2961
  encoding,
2745
2962
  params,
2963
+ generateConnRequestId(),
2746
2964
  connId,
2747
2965
  connToken
2748
2966
  );
@@ -2778,6 +2996,7 @@ var FileSystemManagerDriver = class {
2778
2996
  actorId,
2779
2997
  encoding,
2780
2998
  connParams,
2999
+ generateConnRequestId(),
2781
3000
  connId,
2782
3001
  connToken
2783
3002
  );
@@ -3001,7 +3220,26 @@ async function ensureEngineProcess(options) {
3001
3220
  cwd: path3.dirname(binaryPath),
3002
3221
  stdio: ["inherit", "pipe", "pipe"],
3003
3222
  env: {
3004
- ...process.env
3223
+ ...process.env,
3224
+ // In development, runners can be terminated without a graceful
3225
+ // shutdown (i.e. SIGKILL instead of SIGTERM). This is treated as a
3226
+ // crash by Rivet Engine in production and implements a backoff for
3227
+ // rescheduling actors in case of a crash loop.
3228
+ //
3229
+ // This is problematic in development since this will cause actors
3230
+ // to become unresponsive if frequently killing your dev server.
3231
+ //
3232
+ // We reduce the timeouts for resetting a runner as healthy in
3233
+ // order to account for this.
3234
+ RIVET__PEGBOARD__RETRY_RESET_DURATION: "100",
3235
+ RIVET__PEGBOARD__BASE_RETRY_TIMEOUT: "100",
3236
+ // Set max exponent to 1 to have a maximum of base_retry_timeout
3237
+ RIVET__PEGBOARD__RESCHEDULE_BACKOFF_MAX_EXPONENT: "1",
3238
+ // Reduce thresholds for faster development iteration
3239
+ //
3240
+ // Default ping interval is 3s, this gives a 2s & 4s grace
3241
+ RIVET__PEGBOARD__RUNNER_ELIGIBLE_THRESHOLD: "5000",
3242
+ RIVET__PEGBOARD__RUNNER_LOST_THRESHOLD: "7000"
3005
3243
  }
3006
3244
  });
3007
3245
  if (!child.pid) {
@@ -3023,8 +3261,7 @@ async function ensureEngineProcess(options) {
3023
3261
  msg: "engine process exited, please report this error",
3024
3262
  code,
3025
3263
  signal,
3026
- issues: "https://github.com/rivet-dev/rivetkit/issues",
3027
- support: "https://rivet.dev/discord"
3264
+ ...EXTRA_ERROR_LOG
3028
3265
  });
3029
3266
  stdoutStream.end();
3030
3267
  stderrStream.end();
@@ -3113,8 +3350,7 @@ async function downloadEngineBinaryIfNeeded(binaryPath, version, varDir) {
3113
3350
  msg: "engine download failed, please report this error",
3114
3351
  tempPath,
3115
3352
  error,
3116
- issues: "https://github.com/rivet-dev/rivetkit/issues",
3117
- support: "https://rivet.dev/discord"
3353
+ ...EXTRA_ERROR_LOG
3118
3354
  });
3119
3355
  try {
3120
3356
  await fs3.unlink(tempPath);
@@ -3238,11 +3474,42 @@ import * as cbor4 from "cbor-x";
3238
3474
  import {
3239
3475
  Hono as Hono3
3240
3476
  } from "hono";
3241
- import { cors as corsMiddleware } from "hono/cors";
3242
3477
  import { createMiddleware } from "hono/factory";
3243
3478
  import invariant6 from "invariant";
3244
3479
  import { z as z6 } from "zod";
3245
3480
 
3481
+ // src/common/cors.ts
3482
+ var cors = () => {
3483
+ return async (c, next) => {
3484
+ const origin = c.req.header("origin") || "*";
3485
+ if (c.req.method === "OPTIONS") {
3486
+ const requestHeaders = c.req.header("access-control-request-headers") || "*";
3487
+ c.header("access-control-allow-origin", origin);
3488
+ c.header("access-control-allow-credentials", "true");
3489
+ c.header(
3490
+ "access-control-allow-methods",
3491
+ "GET, POST, PUT, DELETE, OPTIONS, PATCH"
3492
+ );
3493
+ c.header("access-control-allow-headers", requestHeaders);
3494
+ c.header("access-control-expose-headers", "*");
3495
+ c.header("access-control-max-age", "86400");
3496
+ if (origin !== "*") {
3497
+ c.header("vary", "Origin");
3498
+ }
3499
+ c.res.headers.delete("content-length");
3500
+ c.res.headers.delete("content-type");
3501
+ return c.body(null, 204);
3502
+ }
3503
+ await next();
3504
+ c.header("access-control-allow-origin", origin);
3505
+ c.header("access-control-allow-credentials", "true");
3506
+ c.header("access-control-expose-headers", "*");
3507
+ if (origin !== "*") {
3508
+ c.header("vary", "Origin");
3509
+ }
3510
+ };
3511
+ };
3512
+
3246
3513
  // src/manager-api/actors.ts
3247
3514
  import { z as z4 } from "zod";
3248
3515
 
@@ -3516,32 +3783,41 @@ function parseActorPath(path4) {
3516
3783
  return null;
3517
3784
  }
3518
3785
  const segments = basePath.split("/").filter((s) => s.length > 0);
3519
- if (segments.length < 4) {
3786
+ if (segments.length < 2) {
3520
3787
  return null;
3521
3788
  }
3522
- if (segments[0] !== "gateway" || segments[1] !== "actors") {
3789
+ if (segments[0] !== "gateway") {
3523
3790
  return null;
3524
3791
  }
3525
- if (segments[2].length === 0) {
3792
+ const actorSegment = segments[1];
3793
+ if (actorSegment.length === 0) {
3526
3794
  return null;
3527
3795
  }
3528
- const actorId = segments[2];
3796
+ let actorId;
3529
3797
  let token;
3530
- let remainingPathStartIdx;
3531
- if (segments.length >= 6 && segments[3] === "tokens" && segments[5] === "route") {
3532
- if (segments[4].length === 0) {
3798
+ const atPos = actorSegment.indexOf("@");
3799
+ if (atPos !== -1) {
3800
+ const rawActorId = actorSegment.slice(0, atPos);
3801
+ const rawToken = actorSegment.slice(atPos + 1);
3802
+ if (rawActorId.length === 0 || rawToken.length === 0) {
3803
+ return null;
3804
+ }
3805
+ try {
3806
+ actorId = decodeURIComponent(rawActorId);
3807
+ token = decodeURIComponent(rawToken);
3808
+ } catch (e) {
3533
3809
  return null;
3534
3810
  }
3535
- token = segments[4];
3536
- remainingPathStartIdx = 6;
3537
- } else if (segments.length >= 4 && segments[3] === "route") {
3538
- token = void 0;
3539
- remainingPathStartIdx = 4;
3540
3811
  } else {
3541
- return null;
3812
+ try {
3813
+ actorId = decodeURIComponent(actorSegment);
3814
+ } catch (e) {
3815
+ return null;
3816
+ }
3817
+ token = void 0;
3542
3818
  }
3543
3819
  let prefixLen = 0;
3544
- for (let i = 0; i < remainingPathStartIdx; i++) {
3820
+ for (let i = 0; i < 2; i++) {
3545
3821
  prefixLen += 1 + segments[i].length;
3546
3822
  }
3547
3823
  let remainingBase;
@@ -3782,7 +4058,7 @@ function createManagerRouter(registryConfig, runConfig, managerDriver, driverCon
3782
4058
  const router = new OpenAPIHono({ strict: false }).basePath(
3783
4059
  runConfig.basePath
3784
4060
  );
3785
- router.use("*", loggerMiddleware(logger()));
4061
+ router.use("*", loggerMiddleware(logger()), cors());
3786
4062
  router.use(
3787
4063
  "*",
3788
4064
  createMiddleware(async (c, next) => {
@@ -3814,7 +4090,6 @@ function createManagerRouter(registryConfig, runConfig, managerDriver, driverCon
3814
4090
  return { router, openapi: router };
3815
4091
  }
3816
4092
  function addServerlessRoutes(driverConfig, registryConfig, runConfig, managerDriver, client, router) {
3817
- if (runConfig.cors) router.use("*", corsMiddleware(runConfig.cors));
3818
4093
  router.get("/", (c) => {
3819
4094
  return c.text(
3820
4095
  "This is a RivetKit server.\n\nLearn more at https://rivetkit.org"
@@ -3848,6 +4123,13 @@ function addServerlessRoutes(driverConfig, registryConfig, runConfig, managerDri
3848
4123
  newRunConfig.totalSlots = totalSlots;
3849
4124
  newRunConfig.runnerName = runnerName;
3850
4125
  newRunConfig.namespace = namespace;
4126
+ if (newRunConfig.runnerKey) {
4127
+ logger().warn({
4128
+ msg: "runner keys are not supported by serverless runners, this will be overwritten with a random runner key",
4129
+ oldRunnerKey: newRunConfig.runnerKey
4130
+ });
4131
+ newRunConfig.runnerKey = void 0;
4132
+ }
3851
4133
  const actorDriver = driverConfig.actor(
3852
4134
  registryConfig,
3853
4135
  newRunConfig,
@@ -3874,13 +4156,12 @@ function addManagerRoutes(registryConfig, runConfig, managerDriver, router) {
3874
4156
  }
3875
4157
  router.route(
3876
4158
  "/inspect",
3877
- new Hono3().use(corsMiddleware(runConfig.inspector.cors)).use(secureInspector(runConfig)).use((c, next) => {
4159
+ new Hono3().use(secureInspector(runConfig)).use((c, next) => {
3878
4160
  c.set("inspector", managerDriver.inspector);
3879
4161
  return next();
3880
4162
  }).route("/", createManagerInspectorRouter())
3881
4163
  );
3882
4164
  }
3883
- if (runConfig.cors) router.use("*", corsMiddleware(runConfig.cors));
3884
4165
  router.use("*", actorGateway.bind(void 0, runConfig, managerDriver));
3885
4166
  router.get("/", (c) => {
3886
4167
  return c.text(
@@ -4544,4 +4825,4 @@ export {
4544
4825
  setup
4545
4826
  };
4546
4827
  //! These configs configs hold anything that's not platform-specific about running actors.
4547
- //# sourceMappingURL=chunk-4B25D5OW.js.map
4828
+ //# sourceMappingURL=chunk-UB4OHFDW.js.map