rivetkit 2.3.0-rc.10 → 2.3.0-rc.11

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 (205) hide show
  1. package/dist/browser/client.d.ts +105 -56
  2. package/dist/browser/client.js +128 -87
  3. package/dist/browser/client.js.map +1 -1
  4. package/dist/browser/inspector/client.js +40 -20
  5. package/dist/browser/inspector/client.js.map +1 -1
  6. package/dist/tsup/actor/errors.cjs +2 -2
  7. package/dist/tsup/actor/errors.js +1 -1
  8. package/dist/tsup/agent-os/index.cjs +2103 -2090
  9. package/dist/tsup/agent-os/index.cjs.map +1 -1
  10. package/dist/tsup/agent-os/index.d.cts +106 -66
  11. package/dist/tsup/agent-os/index.d.ts +106 -66
  12. package/dist/tsup/agent-os/index.js +2102 -2089
  13. package/dist/tsup/agent-os/index.js.map +1 -1
  14. package/dist/tsup/{chunk-4K3MV2MW.cjs → chunk-2NXFKPRB.cjs} +10 -10
  15. package/dist/tsup/chunk-2NXFKPRB.cjs.map +1 -0
  16. package/dist/tsup/{chunk-6BI2MS3S.js → chunk-3P2JUHWJ.js} +2 -2
  17. package/dist/tsup/{chunk-KU6VKVEK.js → chunk-4FP4FFB5.js} +18 -6
  18. package/dist/tsup/chunk-4FP4FFB5.js.map +1 -0
  19. package/dist/tsup/{chunk-KIWH5H3K.js → chunk-BRP62GZC.js} +3 -3
  20. package/dist/tsup/chunk-BRP62GZC.js.map +1 -0
  21. package/dist/tsup/{chunk-G34LIR7S.js → chunk-GRFBV2U7.js} +22 -7
  22. package/dist/tsup/chunk-GRFBV2U7.js.map +1 -0
  23. package/dist/tsup/{chunk-PWFGP2US.cjs → chunk-GX6W4MW3.cjs} +138 -24
  24. package/dist/tsup/chunk-GX6W4MW3.cjs.map +1 -0
  25. package/dist/tsup/{chunk-3YY5S6TV.js → chunk-HXUEHHJF.js} +2 -2
  26. package/dist/tsup/chunk-HXUEHHJF.js.map +1 -0
  27. package/dist/tsup/{chunk-PCBNKI2J.js → chunk-JZ7TWV65.js} +1 -1
  28. package/dist/tsup/chunk-JZ7TWV65.js.map +1 -0
  29. package/dist/tsup/{chunk-QAZLM4WT.cjs → chunk-KORQB2IR.cjs} +3 -3
  30. package/dist/tsup/{chunk-QAZLM4WT.cjs.map → chunk-KORQB2IR.cjs.map} +1 -1
  31. package/dist/tsup/{chunk-BM3EOY7M.js → chunk-KRC4L3YB.js} +134 -20
  32. package/dist/tsup/chunk-KRC4L3YB.js.map +1 -0
  33. package/dist/tsup/{chunk-G5RULGYQ.cjs → chunk-LNP7Q6I6.cjs} +24 -9
  34. package/dist/tsup/chunk-LNP7Q6I6.cjs.map +1 -0
  35. package/dist/tsup/{chunk-Z4C3W2CQ.cjs → chunk-LW5HNCWD.cjs} +3 -3
  36. package/dist/tsup/{chunk-Z4C3W2CQ.cjs.map → chunk-LW5HNCWD.cjs.map} +1 -1
  37. package/dist/tsup/{chunk-J5P6S2LC.cjs → chunk-RDBGKI66.cjs} +25 -13
  38. package/dist/tsup/chunk-RDBGKI66.cjs.map +1 -0
  39. package/dist/tsup/{chunk-T6YVRM4K.js → chunk-T3VCJ4PV.js} +3 -1
  40. package/dist/tsup/chunk-T3VCJ4PV.js.map +1 -0
  41. package/dist/tsup/{chunk-WU2O2KIE.js → chunk-TTLUIDVH.js} +61 -77
  42. package/dist/tsup/chunk-TTLUIDVH.js.map +1 -0
  43. package/dist/tsup/{chunk-LD5YASJU.cjs → chunk-VE2X4KMG.cjs} +2 -2
  44. package/dist/tsup/{chunk-LD5YASJU.cjs.map → chunk-VE2X4KMG.cjs.map} +1 -1
  45. package/dist/tsup/{chunk-XV52XUWU.js → chunk-WXYWDLJY.js} +4 -4
  46. package/dist/tsup/chunk-WXYWDLJY.js.map +1 -0
  47. package/dist/tsup/{chunk-WQ4HNA4W.cjs → chunk-XCDCURZ4.cjs} +4 -2
  48. package/dist/tsup/chunk-XCDCURZ4.cjs.map +1 -0
  49. package/dist/tsup/{chunk-TE4VCDNY.cjs → chunk-XG25CGSW.cjs} +217 -233
  50. package/dist/tsup/chunk-XG25CGSW.cjs.map +1 -0
  51. package/dist/tsup/{chunk-3LGP4JSO.cjs → chunk-Y3JBOFBG.cjs} +8 -8
  52. package/dist/tsup/{chunk-3LGP4JSO.cjs.map → chunk-Y3JBOFBG.cjs.map} +1 -1
  53. package/dist/tsup/{chunk-CMYS77J6.js → chunk-YRQ4F5CD.js} +3 -3
  54. package/dist/tsup/{chunk-2NDZ7JCR.cjs → chunk-ZA7FLHKH.cjs} +1 -1
  55. package/dist/tsup/chunk-ZA7FLHKH.cjs.map +1 -0
  56. package/dist/tsup/client/mod.cjs +9 -9
  57. package/dist/tsup/client/mod.d.cts +4 -4
  58. package/dist/tsup/client/mod.d.ts +4 -4
  59. package/dist/tsup/client/mod.js +8 -8
  60. package/dist/tsup/common/log.cjs +3 -3
  61. package/dist/tsup/common/log.js +2 -2
  62. package/dist/tsup/common/websocket.cjs +4 -4
  63. package/dist/tsup/common/websocket.js +3 -3
  64. package/dist/tsup/{config-Ca8dN4cS.d.cts → config-CTwe3WwC.d.cts} +69 -19
  65. package/dist/tsup/{config-CxjGYf4K.d.cts → config-D49x8NpL.d.cts} +1 -2
  66. package/dist/tsup/{config-CxjGYf4K.d.ts → config-D49x8NpL.d.ts} +1 -2
  67. package/dist/tsup/{config-0Ta55UV0.d.ts → config-De5UVu0V.d.ts} +69 -19
  68. package/dist/tsup/{context-B_IWbWne.d.ts → context-DPHISlUi.d.ts} +8 -8
  69. package/dist/tsup/{context-CUrQ9MHc.d.cts → context-Dmj477Uh.d.cts} +8 -8
  70. package/dist/tsup/db/drizzle.cjs +3 -3
  71. package/dist/tsup/db/drizzle.d.cts +1 -1
  72. package/dist/tsup/db/drizzle.d.ts +1 -1
  73. package/dist/tsup/db/drizzle.js +1 -1
  74. package/dist/tsup/db/mod.cjs +2 -2
  75. package/dist/tsup/db/mod.d.cts +2 -2
  76. package/dist/tsup/db/mod.d.ts +2 -2
  77. package/dist/tsup/db/mod.js +1 -1
  78. package/dist/tsup/dynamic/mod.cjs +24 -0
  79. package/dist/tsup/dynamic/mod.cjs.map +1 -0
  80. package/dist/tsup/dynamic/mod.d.cts +37 -0
  81. package/dist/tsup/dynamic/mod.d.ts +37 -0
  82. package/dist/tsup/dynamic/mod.js +24 -0
  83. package/dist/tsup/dynamic/mod.js.map +1 -0
  84. package/dist/tsup/inspector/mod.cjs +6 -6
  85. package/dist/tsup/inspector/mod.js +5 -5
  86. package/dist/tsup/mod.cjs +501 -315
  87. package/dist/tsup/mod.cjs.map +1 -1
  88. package/dist/tsup/mod.d.cts +4 -4
  89. package/dist/tsup/mod.d.ts +4 -4
  90. package/dist/tsup/mod.js +405 -219
  91. package/dist/tsup/mod.js.map +1 -1
  92. package/dist/tsup/test/mod.cjs +21 -18
  93. package/dist/tsup/test/mod.cjs.map +1 -1
  94. package/dist/tsup/test/mod.d.cts +3 -3
  95. package/dist/tsup/test/mod.d.ts +3 -3
  96. package/dist/tsup/test/mod.js +18 -15
  97. package/dist/tsup/test/mod.js.map +1 -1
  98. package/dist/tsup/utils.cjs +3 -3
  99. package/dist/tsup/utils.d.cts +1 -1
  100. package/dist/tsup/utils.d.ts +1 -1
  101. package/dist/tsup/utils.js +2 -2
  102. package/dist/tsup/workflow/mod.cjs +307 -282
  103. package/dist/tsup/workflow/mod.cjs.map +1 -1
  104. package/dist/tsup/workflow/mod.d.cts +5 -5
  105. package/dist/tsup/workflow/mod.d.ts +5 -5
  106. package/dist/tsup/workflow/mod.js +501 -476
  107. package/dist/tsup/workflow/mod.js.map +1 -1
  108. package/package.json +22 -11
  109. package/src/actor/config.ts +48 -41
  110. package/src/actor/contexts/index.ts +7 -2
  111. package/src/actor/definition.ts +11 -14
  112. package/src/actor/driver.ts +3 -3
  113. package/src/actor/errors.ts +9 -3
  114. package/src/actor/instance/mod.ts +22 -30
  115. package/src/actor/keys.ts +1 -1
  116. package/src/actor/mod.ts +20 -20
  117. package/src/actor/schema.ts +2 -2
  118. package/src/agent-os/actor/index.ts +38 -18
  119. package/src/agent-os/actor/preview.ts +1 -2
  120. package/src/agent-os/actor/session.ts +2 -2
  121. package/src/agent-os/config.ts +1 -1
  122. package/src/agent-os/fs/database-vfs.ts +1 -1
  123. package/src/agent-os/index.ts +16 -15
  124. package/src/client/actor-common.ts +90 -54
  125. package/src/client/actor-conn.ts +8 -36
  126. package/src/client/actor-handle.ts +67 -50
  127. package/src/client/actor-query.ts +5 -5
  128. package/src/client/errors.ts +1 -1
  129. package/src/client/lifecycle-errors.ts +2 -4
  130. package/src/client/query.ts +1 -1
  131. package/src/client/queue.ts +8 -3
  132. package/src/client/raw-utils.ts +8 -6
  133. package/src/client/resolve-gateway-target.ts +1 -1
  134. package/src/client/utils.ts +2 -7
  135. package/src/common/actor-websocket.ts +3 -1
  136. package/src/common/bare/actor-persist/v1.ts +205 -163
  137. package/src/common/bare/actor-persist/v2.ts +265 -213
  138. package/src/common/bare/actor-persist/v3.ts +176 -172
  139. package/src/common/bare/actor-persist/v4.ts +254 -253
  140. package/src/common/bare/transport/v1.ts +659 -543
  141. package/src/common/client-protocol-versioned.ts +66 -64
  142. package/src/common/database/config.ts +2 -8
  143. package/src/common/database/native-database.ts +1 -1
  144. package/src/common/database/shared.ts +1 -0
  145. package/src/common/encoding.ts +250 -16
  146. package/src/common/eventsource.ts +1 -1
  147. package/src/common/inline-websocket-adapter.ts +14 -13
  148. package/src/common/log.ts +1 -0
  149. package/src/common/router.ts +13 -17
  150. package/src/common/utils.ts +0 -149
  151. package/src/common/websocket-interface.ts +1 -1
  152. package/src/db/mod.ts +1 -1
  153. package/src/drivers/engine/actor-driver.ts +63 -72
  154. package/src/dynamic/instance.ts +32 -0
  155. package/src/dynamic/internal.ts +50 -0
  156. package/src/dynamic/isolate-runtime.ts +66 -0
  157. package/src/dynamic/mod.ts +32 -0
  158. package/src/engine-client/actor-http-client.ts +1 -1
  159. package/src/engine-client/actor-websocket-client.ts +6 -5
  160. package/src/engine-client/api-endpoints.ts +47 -2
  161. package/src/engine-client/api-utils.ts +2 -2
  162. package/src/engine-client/driver.ts +1 -1
  163. package/src/engine-client/mod.ts +6 -3
  164. package/src/engine-client/ws-proxy.ts +4 -4
  165. package/src/inspector/client.browser.ts +5 -11
  166. package/src/inspector/mod.ts +1 -3
  167. package/src/registry/config/envoy.ts +1 -2
  168. package/src/registry/config/index.ts +7 -7
  169. package/src/registry/index.ts +70 -71
  170. package/src/registry/napi-runtime.ts +7 -2
  171. package/src/registry/native-validation.ts +10 -12
  172. package/src/registry/native.ts +179 -153
  173. package/src/registry/process-metrics.ts +238 -0
  174. package/src/registry/runtime.ts +1 -3
  175. package/src/registry/wasm-runtime.ts +3 -2
  176. package/src/registry/write-through-proxy.ts +40 -0
  177. package/src/serde.ts +2 -2
  178. package/src/serverless/configure.ts +18 -7
  179. package/src/test/mod.ts +11 -8
  180. package/src/utils/endpoint-parser.ts +1 -1
  181. package/src/utils/router.ts +1 -1
  182. package/src/utils/serve.ts +4 -5
  183. package/src/utils.ts +1 -2
  184. package/src/workflow/context.ts +61 -33
  185. package/src/workflow/driver.ts +4 -6
  186. package/src/workflow/inspector.ts +4 -3
  187. package/src/workflow/mod.ts +15 -17
  188. package/dist/tsup/chunk-2NDZ7JCR.cjs.map +0 -1
  189. package/dist/tsup/chunk-3YY5S6TV.js.map +0 -1
  190. package/dist/tsup/chunk-4K3MV2MW.cjs.map +0 -1
  191. package/dist/tsup/chunk-BM3EOY7M.js.map +0 -1
  192. package/dist/tsup/chunk-G34LIR7S.js.map +0 -1
  193. package/dist/tsup/chunk-G5RULGYQ.cjs.map +0 -1
  194. package/dist/tsup/chunk-J5P6S2LC.cjs.map +0 -1
  195. package/dist/tsup/chunk-KIWH5H3K.js.map +0 -1
  196. package/dist/tsup/chunk-KU6VKVEK.js.map +0 -1
  197. package/dist/tsup/chunk-PCBNKI2J.js.map +0 -1
  198. package/dist/tsup/chunk-PWFGP2US.cjs.map +0 -1
  199. package/dist/tsup/chunk-T6YVRM4K.js.map +0 -1
  200. package/dist/tsup/chunk-TE4VCDNY.cjs.map +0 -1
  201. package/dist/tsup/chunk-WQ4HNA4W.cjs.map +0 -1
  202. package/dist/tsup/chunk-WU2O2KIE.js.map +0 -1
  203. package/dist/tsup/chunk-XV52XUWU.js.map +0 -1
  204. /package/dist/tsup/{chunk-6BI2MS3S.js.map → chunk-3P2JUHWJ.js.map} +0 -0
  205. /package/dist/tsup/{chunk-CMYS77J6.js.map → chunk-YRQ4F5CD.js.map} +0 -0
package/dist/tsup/mod.js CHANGED
@@ -2,13 +2,14 @@ import {
2
2
  ACTOR_CONTEXT_INTERNAL_SYMBOL,
3
3
  ActorConfigSchema,
4
4
  CONN_STATE_MANAGER_SYMBOL,
5
+ RAW_STATE_SYMBOL,
5
6
  getRunFunction,
6
7
  getRunInspectorConfig,
7
8
  getRunMetadata
8
- } from "./chunk-T6YVRM4K.js";
9
+ } from "./chunk-T3VCJ4PV.js";
9
10
  import {
10
11
  decodeWorkflowHistoryTransport
11
- } from "./chunk-G34LIR7S.js";
12
+ } from "./chunk-GRFBV2U7.js";
12
13
  import {
13
14
  ALLOWED_PUBLIC_HEADERS,
14
15
  HEADER_CONN_PARAMS,
@@ -18,7 +19,7 @@ import {
18
19
  getDatacenters,
19
20
  tryParseEndpoint,
20
21
  updateRunnerConfig
21
- } from "./chunk-WU2O2KIE.js";
22
+ } from "./chunk-TTLUIDVH.js";
22
23
  import {
23
24
  KEYS,
24
25
  makePrefixedKey,
@@ -26,18 +27,19 @@ import {
26
27
  queueMetadataKey,
27
28
  removePrefixFromKey,
28
29
  workflowStoragePrefix
29
- } from "./chunk-3YY5S6TV.js";
30
+ } from "./chunk-HXUEHHJF.js";
30
31
  import {
32
+ assertJsonCompatValue,
31
33
  decodeCborCompat,
32
- decodeCborJsonCompat,
33
34
  encodeCborCompat
34
- } from "./chunk-BM3EOY7M.js";
35
- import "./chunk-PCBNKI2J.js";
36
- import "./chunk-6BI2MS3S.js";
35
+ } from "./chunk-KRC4L3YB.js";
36
+ import "./chunk-JZ7TWV65.js";
37
+ import "./chunk-3P2JUHWJ.js";
37
38
  import {
38
39
  LogLevelSchema,
39
40
  VERSION,
40
41
  deconstructError,
42
+ detectRuntime,
41
43
  getEnvUniversal,
42
44
  getLogger,
43
45
  getNodeEnv,
@@ -57,7 +59,7 @@ import {
57
59
  noopNext,
58
60
  stringifyError,
59
61
  toUint8Array
60
- } from "./chunk-KU6VKVEK.js";
62
+ } from "./chunk-4FP4FFB5.js";
61
63
  import {
62
64
  INTERNAL_ERROR_CODE,
63
65
  RivetError,
@@ -68,7 +70,7 @@ import {
68
70
  isRivetErrorLike,
69
71
  toRivetError,
70
72
  unsupportedFeature
71
- } from "./chunk-KIWH5H3K.js";
73
+ } from "./chunk-BRP62GZC.js";
72
74
 
73
75
  // src/actor/log.ts
74
76
  function loggerWithoutContext() {
@@ -140,7 +142,7 @@ function hasSchemaConfigKey(schemas, key) {
140
142
  if (!schemas) {
141
143
  return false;
142
144
  }
143
- return Object.prototype.hasOwnProperty.call(schemas, key);
145
+ return Object.hasOwn(schemas, key);
144
146
  }
145
147
  function getEventCanSubscribe(schemas, key) {
146
148
  const schema = schemas == null ? void 0 : schemas[key];
@@ -201,8 +203,8 @@ function validateSchemaSync(schemas, key, data) {
201
203
  }
202
204
 
203
205
  // src/common/inline-websocket-adapter.ts
204
- import { WSContext } from "hono/ws";
205
206
  import { VirtualWebSocket } from "@rivetkit/virtual-websocket";
207
+ import { WSContext } from "hono/ws";
206
208
  function logger() {
207
209
  return getLogger("inline-websocket-adapter");
208
210
  }
@@ -314,24 +316,24 @@ var InlineWebSocketAdapter = class {
314
316
  this.#close(1011, "Internal error during initialization");
315
317
  }
316
318
  }
317
- #handleError(err) {
318
- console.error("INLINE_WEBSOCKET_ADAPTER_ERROR", err);
319
+ #handleError(error) {
320
+ console.error("INLINE_WEBSOCKET_ADAPTER_ERROR", error);
319
321
  logger().error({
320
322
  msg: "error in websocket",
321
- error: err,
322
- errorMessage: err instanceof Error ? err.message : String(err),
323
- stack: err instanceof Error ? err.stack : void 0
323
+ error,
324
+ errorMessage: error instanceof Error ? error.message : String(error),
325
+ stack: error instanceof Error ? error.stack : void 0
324
326
  });
325
327
  try {
326
- this.#handler.onError(err, this.#wsContext);
327
- } catch (handlerErr) {
328
+ this.#handler.onError(error, this.#wsContext);
329
+ } catch (error2) {
328
330
  logger().error({
329
331
  msg: "error in onError handler",
330
- error: handlerErr
332
+ error: error2
331
333
  });
332
334
  }
333
- this.#clientWs.triggerError(err);
334
- this.#actorWs.triggerError(err);
335
+ this.#clientWs.triggerError(error);
336
+ this.#actorWs.triggerError(error);
335
337
  }
336
338
  #close(code, reason) {
337
339
  if (this.#readyState === 3 || this.#readyState === 2) {
@@ -344,8 +346,8 @@ var InlineWebSocketAdapter = class {
344
346
  { code, reason, wasClean: true },
345
347
  this.#wsContext
346
348
  );
347
- } catch (err) {
348
- logger().error({ msg: "error closing websocket", error: err });
349
+ } catch (error) {
350
+ logger().error({ msg: "error closing websocket", error });
349
351
  } finally {
350
352
  this.#readyState = 3;
351
353
  this.#clientWs.triggerClose(code, reason);
@@ -354,6 +356,9 @@ var InlineWebSocketAdapter = class {
354
356
  }
355
357
  };
356
358
 
359
+ // src/registry/index.ts
360
+ import { Hono } from "hono";
361
+
357
362
  // src/common/engine.ts
358
363
  var ENGINE_PORT = 6420;
359
364
  var ENGINE_ENDPOINT = `http://127.0.0.1:${ENGINE_PORT}`;
@@ -371,10 +376,13 @@ function sleep(ms) {
371
376
  }
372
377
  function configureTimeoutMs() {
373
378
  const value = process.env.RIVET_SERVERLESS_CONFIGURE_TIMEOUT_MS;
374
- if (value === void 0 || value === "") return DEFAULT_CONFIGURE_TIMEOUT_MS;
379
+ if (value === void 0 || value === "")
380
+ return DEFAULT_CONFIGURE_TIMEOUT_MS;
375
381
  const parsed = Number(value);
376
382
  if (!Number.isFinite(parsed) || parsed < 0) {
377
- throw new Error("RIVET_SERVERLESS_CONFIGURE_TIMEOUT_MS must be a finite non-negative number");
383
+ throw new Error(
384
+ "RIVET_SERVERLESS_CONFIGURE_TIMEOUT_MS must be a finite non-negative number"
385
+ );
378
386
  }
379
387
  return parsed;
380
388
  }
@@ -388,13 +396,19 @@ async function configureServerlessPool(config) {
388
396
  attempts += 1;
389
397
  try {
390
398
  if (!config.namespace) {
391
- throw new Error("namespace is required for serverless configuration");
399
+ throw new Error(
400
+ "namespace is required for serverless configuration"
401
+ );
392
402
  }
393
403
  if (!config.endpoint) {
394
- throw new Error("endpoint is required for serverless configuration");
404
+ throw new Error(
405
+ "endpoint is required for serverless configuration"
406
+ );
395
407
  }
396
408
  if (!config.configurePool) {
397
- throw new Error("configurePool is required for serverless configuration");
409
+ throw new Error(
410
+ "configurePool is required for serverless configuration"
411
+ );
398
412
  }
399
413
  const customConfig = config.configurePool;
400
414
  const clientConfig = convertRegistryConfigToClientConfig(config);
@@ -450,6 +464,145 @@ async function configureServerlessPool(config) {
450
464
  throw lastError;
451
465
  }
452
466
 
467
+ // src/utils/serve.ts
468
+ import getPort from "get-port";
469
+ var serveStaticLoaderPromises = {};
470
+ async function crossPlatformServe(config, httpPort, app, runtime = detectRuntime()) {
471
+ logger2().debug({ msg: "detected runtime for serve", runtime });
472
+ switch (runtime) {
473
+ case "deno":
474
+ return serveDeno(config, httpPort, app);
475
+ case "bun":
476
+ return serveBun(config, httpPort, app);
477
+ case "node":
478
+ return serveNode(config, httpPort, app);
479
+ default:
480
+ return serveNode(config, httpPort, app);
481
+ }
482
+ }
483
+ async function loadRuntimeServeStatic(runtime) {
484
+ if (!serveStaticLoaderPromises[runtime]) {
485
+ if (runtime === "node") {
486
+ const nodeServeStaticModule = "@hono/node-server/serve-static";
487
+ serveStaticLoaderPromises[runtime] = import(
488
+ /* webpackIgnore: true */
489
+ nodeServeStaticModule
490
+ ).then((x) => x.serveStatic);
491
+ } else if (runtime === "bun") {
492
+ const bunModule = "hono/bun";
493
+ serveStaticLoaderPromises[runtime] = import(
494
+ /* webpackIgnore: true */
495
+ bunModule
496
+ ).then((x) => x.serveStatic);
497
+ } else if (runtime === "deno") {
498
+ const denoModule = "hono/deno";
499
+ serveStaticLoaderPromises[runtime] = import(
500
+ /* webpackIgnore: true */
501
+ denoModule
502
+ ).then((x) => x.serveStatic);
503
+ } else {
504
+ throw new Error(`unsupported runtime: ${runtime}`);
505
+ }
506
+ }
507
+ return await serveStaticLoaderPromises[runtime];
508
+ }
509
+ async function serveNode(config, httpPort, app) {
510
+ const nodeServerModule = "@hono/node-server";
511
+ let serve;
512
+ try {
513
+ const dep = await import(
514
+ /* webpackIgnore: true */
515
+ nodeServerModule
516
+ );
517
+ serve = dep.serve;
518
+ } catch (err) {
519
+ logger2().error({
520
+ msg: "failed to import @hono/node-server. please run 'npm install @hono/node-server @hono/node-ws'",
521
+ error: stringifyError(err)
522
+ });
523
+ process.exit(1);
524
+ }
525
+ const nodeWsModule = "@hono/node-ws";
526
+ let createNodeWebSocket;
527
+ try {
528
+ const dep = await import(
529
+ /* webpackIgnore: true */
530
+ nodeWsModule
531
+ );
532
+ createNodeWebSocket = dep.createNodeWebSocket;
533
+ } catch (err) {
534
+ logger2().error({
535
+ msg: "failed to import @hono/node-ws. please run 'npm install @hono/node-server @hono/node-ws'",
536
+ error: stringifyError(err)
537
+ });
538
+ process.exit(1);
539
+ }
540
+ const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({
541
+ app
542
+ });
543
+ const port = httpPort;
544
+ const hostname = config.httpHost;
545
+ const server = serve(
546
+ { fetch: app.fetch, port, hostname },
547
+ () => logger2().info({ msg: "server listening", port, hostname })
548
+ );
549
+ injectWebSocket(server);
550
+ const closeServer = () => {
551
+ server.close();
552
+ };
553
+ return { upgradeWebSocket, closeServer };
554
+ }
555
+ async function serveDeno(config, httpPort, app) {
556
+ const honoDenoModule = "hono/deno";
557
+ let upgradeWebSocket;
558
+ try {
559
+ const dep = await import(
560
+ /* webpackIgnore: true */
561
+ honoDenoModule
562
+ );
563
+ upgradeWebSocket = dep.upgradeWebSocket;
564
+ } catch (err) {
565
+ logger2().error({
566
+ msg: "failed to import hono/deno",
567
+ error: stringifyError(err)
568
+ });
569
+ process.exit(1);
570
+ }
571
+ const port = httpPort;
572
+ const hostname = config.httpHost;
573
+ Deno.serve({ port, hostname }, app.fetch);
574
+ logger2().info({ msg: "server listening", port, hostname });
575
+ return { upgradeWebSocket };
576
+ }
577
+ async function serveBun(config, httpPort, app) {
578
+ const honoBunModule = "hono/bun";
579
+ let createBunWebSocket;
580
+ try {
581
+ const dep = await import(
582
+ /* webpackIgnore: true */
583
+ honoBunModule
584
+ );
585
+ createBunWebSocket = dep.createBunWebSocket;
586
+ } catch (err) {
587
+ logger2().error({
588
+ msg: "failed to import hono/bun",
589
+ error: stringifyError(err)
590
+ });
591
+ process.exit(1);
592
+ }
593
+ const { websocket, upgradeWebSocket } = createBunWebSocket();
594
+ const port = httpPort;
595
+ const hostname = config.httpHost;
596
+ Bun.serve({
597
+ fetch: app.fetch,
598
+ port,
599
+ hostname,
600
+ websocket
601
+ });
602
+ logger2().info({ msg: "server listening", port, hostname });
603
+ return { upgradeWebSocket };
604
+ }
605
+
453
606
  // src/registry/config/index.ts
454
607
  import { z as z3 } from "zod";
455
608
 
@@ -700,12 +853,12 @@ var RegistryConfigSchema = z3.object({
700
853
  shutdown: z3.object({
701
854
  /**
702
855
  * Wait this many milliseconds for the serve promise to resolve
703
- * after calling `CoreRegistry::shutdown()`. Defaults to the
704
- * engine-provided actor stop threshold once the envoy connects.
856
+ * after calling `CoreRegistry::shutdown()`. Defaults to 30s,
857
+ * matching Kubernetes `terminationGracePeriodSeconds`.
705
858
  *
706
- * Must be >= rivetkit-core's drain timeout (20s) + margin.
859
+ * Must be long enough for rivetkit-core to drain the envoy.
707
860
  */
708
- gracePeriodMs: z3.number().int().min(1e3).optional(),
861
+ gracePeriodMs: z3.number().int().min(1e3).optional().default(3e4),
709
862
  /**
710
863
  * If true, rivetkit will not install SIGINT/SIGTERM handlers.
711
864
  * Use when the host application owns signal policy and will
@@ -713,6 +866,7 @@ var RegistryConfigSchema = z3.object({
713
866
  */
714
867
  disableSignalHandlers: z3.boolean().optional().default(false)
715
868
  }).optional().default(() => ({
869
+ gracePeriodMs: 3e4,
716
870
  disableSignalHandlers: false
717
871
  }))
718
872
  }).transform((config, ctx) => {
@@ -1535,8 +1689,12 @@ var NapiCoreRuntime = class {
1535
1689
  )
1536
1690
  );
1537
1691
  }
1538
- async actorQueueWaitForNamesAvailable(ctx, names, options) {
1539
- await asNativeActorContext(ctx).queue().waitForNamesAvailable(names, options);
1692
+ async actorQueueWaitForNamesAvailable(ctx, names, options, signal) {
1693
+ await asNativeActorContext(ctx).queue().waitForNamesAvailable(
1694
+ names,
1695
+ options,
1696
+ signal ? asNativeCancellationToken(signal) : signal
1697
+ );
1540
1698
  }
1541
1699
  async actorQueueEnqueueAndWait(ctx, name, body, options, signal) {
1542
1700
  return await asNativeActorContext(ctx).queue().enqueueAndWait(
@@ -1670,20 +1828,18 @@ function validateQueueComplete(schemas, name, response) {
1670
1828
  response
1671
1829
  );
1672
1830
  if (!result.success) {
1673
- throw validationError(`queue \`${name}\` completion response`, result.issues);
1831
+ throw validationError(
1832
+ `queue \`${name}\` completion response`,
1833
+ result.issues
1834
+ );
1674
1835
  }
1675
1836
  return result.data;
1676
1837
  }
1677
1838
  function validationError(target, issues) {
1678
- return new RivetError(
1679
- "actor",
1680
- "validation_error",
1681
- `Invalid ${target}`,
1682
- {
1683
- public: true,
1684
- metadata: { issues }
1685
- }
1686
- );
1839
+ return new RivetError("actor", "validation_error", `Invalid ${target}`, {
1840
+ public: true,
1841
+ metadata: { issues }
1842
+ });
1687
1843
  }
1688
1844
 
1689
1845
  // src/registry/wasm-runtime.ts
@@ -2154,9 +2310,9 @@ var WasmCoreRuntime = class {
2154
2310
  )
2155
2311
  );
2156
2312
  }
2157
- async actorQueueWaitForNamesAvailable(ctx, names, options) {
2313
+ async actorQueueWaitForNamesAvailable(ctx, names, options, signal) {
2158
2314
  const queue2 = childHandle(asWasmActorContext(ctx), "queue");
2159
- await callHandleAsync(queue2, "waitForNamesAvailable", names, options);
2315
+ await callHandleAsync(queue2, "waitForNamesAvailable", names, options, signal);
2160
2316
  }
2161
2317
  async actorQueueEnqueueAndWait(ctx, name, body, options, signal) {
2162
2318
  const queue2 = childHandle(asWasmActorContext(ctx), "queue");
@@ -2248,6 +2404,29 @@ async function loadWasmRuntime(config) {
2248
2404
  };
2249
2405
  }
2250
2406
 
2407
+ // src/registry/write-through-proxy.ts
2408
+ import onChange from "@rivetkit/on-change";
2409
+ function createWriteThroughProxy(value, commit, beforeChange) {
2410
+ if (!value || typeof value !== "object") {
2411
+ return value;
2412
+ }
2413
+ return onChange(
2414
+ value,
2415
+ () => {
2416
+ commit(value);
2417
+ },
2418
+ {
2419
+ // Rejection is throw-based: beforeChange throws to prevent the
2420
+ // mutation. We always return true so on-change applies the change
2421
+ // if beforeChange did not throw.
2422
+ onValidate(_path, newValue) {
2423
+ beforeChange == null ? void 0 : beforeChange(newValue);
2424
+ return true;
2425
+ }
2426
+ }
2427
+ );
2428
+ }
2429
+
2251
2430
  // src/registry/native.ts
2252
2431
  var textEncoder = new TextEncoder();
2253
2432
  var textDecoder = new TextDecoder();
@@ -2401,6 +2580,14 @@ function databaseNotConfiguredError() {
2401
2580
  { public: true }
2402
2581
  );
2403
2582
  }
2583
+ function databaseClientNotReadyError() {
2584
+ return new RivetError(
2585
+ "actor",
2586
+ "database_client_not_ready",
2587
+ "actor database client was not initialized before user code ran. this is an internal lifecycle error; the migration callback should have pre-warmed the client. file an issue if you can reproduce.",
2588
+ { public: true }
2589
+ );
2590
+ }
2404
2591
  function stateNotEnabledError() {
2405
2592
  return new RivetError(
2406
2593
  "actor",
@@ -2558,7 +2745,7 @@ function decodeValue(value) {
2558
2745
  if (!value || value.length === 0) {
2559
2746
  return void 0;
2560
2747
  }
2561
- return decodeCborJsonCompat(value);
2748
+ return decodeCborCompat(value);
2562
2749
  }
2563
2750
  function encodeValue(value) {
2564
2751
  return encodeCborCompat(value);
@@ -2618,12 +2805,6 @@ function callNativeSync(invoke) {
2618
2805
  throw normalizeNativeBridgeError(error);
2619
2806
  }
2620
2807
  }
2621
- function actorAbortedError() {
2622
- return Object.assign(new Error("Actor aborted"), {
2623
- group: "actor",
2624
- code: "aborted"
2625
- });
2626
- }
2627
2808
  function isClosedTaskRegistrationError(error) {
2628
2809
  const metadata = error instanceof RivetError ? error.metadata : void 0;
2629
2810
  const metadataError = metadata && typeof metadata === "object" && "error" in metadata ? metadata.error : void 0;
@@ -2756,7 +2937,7 @@ function serializeWorkflowHistoryForJson(data) {
2756
2937
  return null;
2757
2938
  }
2758
2939
  const history = decodeWorkflowHistoryTransport(data);
2759
- return {
2940
+ return jsonSafe({
2760
2941
  nameRegistry: [...history.nameRegistry],
2761
2942
  entries: history.entries.map((entry) => ({
2762
2943
  id: entry.id,
@@ -2780,7 +2961,7 @@ function serializeWorkflowHistoryForJson(data) {
2780
2961
  ]
2781
2962
  )
2782
2963
  )
2783
- };
2964
+ });
2784
2965
  }
2785
2966
  function toHttpJsonCompatible(value) {
2786
2967
  return JSON.parse(
@@ -2833,44 +3014,6 @@ function decodeArgs(value) {
2833
3014
  const decoded = decodeValue(value);
2834
3015
  return Array.isArray(decoded) ? decoded : decoded === void 0 ? [] : [decoded];
2835
3016
  }
2836
- function createWriteThroughProxy(value, commit, beforeChange) {
2837
- if (!value || typeof value !== "object") {
2838
- return value;
2839
- }
2840
- const proxies = /* @__PURE__ */ new WeakMap();
2841
- const wrap = (target) => {
2842
- const cached = proxies.get(target);
2843
- if (cached) {
2844
- return cached;
2845
- }
2846
- const proxy = new Proxy(target, {
2847
- get(innerTarget, property, receiver) {
2848
- const result = Reflect.get(innerTarget, property, receiver);
2849
- return result && typeof result === "object" ? wrap(result) : result;
2850
- },
2851
- set(innerTarget, property, nextValue, receiver) {
2852
- beforeChange == null ? void 0 : beforeChange();
2853
- const updated = Reflect.set(
2854
- innerTarget,
2855
- property,
2856
- nextValue,
2857
- receiver
2858
- );
2859
- commit(value);
2860
- return updated;
2861
- },
2862
- deleteProperty(innerTarget, property) {
2863
- beforeChange == null ? void 0 : beforeChange();
2864
- const updated = Reflect.deleteProperty(innerTarget, property);
2865
- commit(value);
2866
- return updated;
2867
- }
2868
- });
2869
- proxies.set(target, proxy);
2870
- return proxy;
2871
- };
2872
- return wrap(value);
2873
- }
2874
3017
  function buildRequest(init) {
2875
3018
  const url = init.uri.startsWith("http") ? init.uri : new URL(init.uri, "http://127.0.0.1").toString();
2876
3019
  const body = init.body && init.body.length > 0 ? runtimeBytesToArrayBuffer(init.body) : void 0;
@@ -2923,13 +3066,23 @@ var NativeConnAdapter = class {
2923
3066
  decodeValue(this.#runtime.connParams(this.#conn))
2924
3067
  );
2925
3068
  }
3069
+ [RAW_STATE_SYMBOL]() {
3070
+ return this.#readState();
3071
+ }
2926
3072
  get state() {
2927
3073
  const nextState = this.#readState();
2928
- return createWriteThroughProxy(nextState, (nextValue) => {
2929
- this.#writeState(nextValue, { writeNative: true });
2930
- });
3074
+ return createWriteThroughProxy(
3075
+ nextState,
3076
+ (nextValue) => {
3077
+ this.#writeState(nextValue, { writeNative: true });
3078
+ },
3079
+ (newValue) => {
3080
+ assertJsonCompatValue(newValue);
3081
+ }
3082
+ );
2931
3083
  }
2932
3084
  set state(value) {
3085
+ assertJsonCompatValue(value);
2933
3086
  this.#writeState(value, { writeNative: true });
2934
3087
  }
2935
3088
  initializeState(value) {
@@ -3281,44 +3434,23 @@ var NativeQueueAdapter = class {
3281
3434
  }
3282
3435
  }
3283
3436
  async waitForNamesAvailable(names, options) {
3284
- if (!(options == null ? void 0 : options.signal)) {
3437
+ const { token, cleanup } = await createCancellationTokenHandle(
3438
+ this.#runtime,
3439
+ options == null ? void 0 : options.signal
3440
+ );
3441
+ try {
3285
3442
  await callNative(
3286
3443
  () => this.#runtime.actorQueueWaitForNamesAvailable(
3287
3444
  this.#ctx,
3288
3445
  [...names],
3289
3446
  {
3290
3447
  timeoutMs: options == null ? void 0 : options.timeout
3291
- }
3448
+ },
3449
+ token
3292
3450
  )
3293
3451
  );
3294
- return;
3295
- }
3296
- const deadline = options.timeout === void 0 ? void 0 : Date.now() + options.timeout;
3297
- for (; ; ) {
3298
- if (options.signal.aborted) {
3299
- throw actorAbortedError();
3300
- }
3301
- const remainingTimeout = deadline === void 0 ? void 0 : Math.max(0, deadline - Date.now());
3302
- const sliceTimeout = remainingTimeout === void 0 ? 100 : Math.min(remainingTimeout, 100);
3303
- try {
3304
- await callNative(
3305
- () => this.#runtime.actorQueueWaitForNamesAvailable(
3306
- this.#ctx,
3307
- [...names],
3308
- {
3309
- timeoutMs: sliceTimeout
3310
- }
3311
- )
3312
- );
3313
- return;
3314
- } catch (error) {
3315
- if (error.group === "queue" && error.code === "timed_out") {
3316
- if (remainingTimeout === void 0 || remainingTimeout > 100) {
3317
- continue;
3318
- }
3319
- }
3320
- throw error;
3321
- }
3452
+ } finally {
3453
+ cleanup == null ? void 0 : cleanup();
3322
3454
  }
3323
3455
  }
3324
3456
  async enqueueAndWait(name, body, options) {
@@ -3753,6 +3885,68 @@ var TrackedWebSocketHandleAdapter = class {
3753
3885
  return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
3754
3886
  }
3755
3887
  };
3888
+ var NativeConnectionMap = class {
3889
+ #runtime;
3890
+ #ctx;
3891
+ #schemas;
3892
+ constructor(runtime, ctx, schemas) {
3893
+ this.#runtime = runtime;
3894
+ this.#ctx = ctx;
3895
+ this.#schemas = schemas;
3896
+ }
3897
+ #connToAdapter(conn) {
3898
+ return new NativeConnAdapter(
3899
+ this.#runtime,
3900
+ conn,
3901
+ this.#schemas,
3902
+ this.#ctx,
3903
+ (connId) => callNativeSync(
3904
+ () => this.#runtime.actorQueueHibernationRemoval(
3905
+ this.#ctx,
3906
+ connId
3907
+ )
3908
+ )
3909
+ );
3910
+ }
3911
+ get size() {
3912
+ return callNativeSync(() => this.#runtime.actorConns(this.#ctx)).length;
3913
+ }
3914
+ get(key) {
3915
+ const conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));
3916
+ const conn = conns.find((c) => this.#runtime.connId(c) === key);
3917
+ if (!conn) return void 0;
3918
+ return this.#connToAdapter(conn);
3919
+ }
3920
+ has(key) {
3921
+ const conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));
3922
+ return conns.some((c) => this.#runtime.connId(c) === key);
3923
+ }
3924
+ keys() {
3925
+ const conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));
3926
+ return conns.map((c) => this.#runtime.connId(c))[Symbol.iterator]();
3927
+ }
3928
+ values() {
3929
+ const conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));
3930
+ return conns.map((c) => this.#connToAdapter(c))[Symbol.iterator]();
3931
+ }
3932
+ entries() {
3933
+ const conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));
3934
+ return conns.map(
3935
+ (c) => [this.#runtime.connId(c), this.#connToAdapter(c)]
3936
+ )[Symbol.iterator]();
3937
+ }
3938
+ forEach(callback, thisArg) {
3939
+ const conns = callNativeSync(() => this.#runtime.actorConns(this.#ctx));
3940
+ for (const conn of conns) {
3941
+ const id = this.#runtime.connId(conn);
3942
+ callback.call(thisArg, this.#connToAdapter(conn), id, this);
3943
+ }
3944
+ }
3945
+ [Symbol.iterator]() {
3946
+ return this.entries();
3947
+ }
3948
+ [Symbol.toStringTag] = "NativeConnectionMap";
3949
+ };
3756
3950
  var ActorContextHandleAdapter = class {
3757
3951
  #runtime;
3758
3952
  #ctx;
@@ -3761,9 +3955,9 @@ var ActorContextHandleAdapter = class {
3761
3955
  #abortSignalCleanup;
3762
3956
  #client;
3763
3957
  #clientFactory;
3958
+ #connMap;
3764
3959
  #databaseProvider;
3765
3960
  #db;
3766
- #dbProxy;
3767
3961
  #dispatchCancelToken;
3768
3962
  #kv;
3769
3963
  #queue;
@@ -3806,30 +4000,22 @@ var ActorContextHandleAdapter = class {
3806
4000
  if (!this.#databaseProvider) {
3807
4001
  throw databaseNotConfiguredError();
3808
4002
  }
3809
- if (!this.#dbProxy) {
3810
- this.#dbProxy = new Proxy(
3811
- {},
3812
- {
3813
- get: (_target, property) => {
3814
- if (property === "then") {
3815
- return void 0;
3816
- }
3817
- return async (...args) => {
3818
- const client = await this.ensureDatabaseClient();
3819
- const value = Reflect.get(
3820
- client,
3821
- property
3822
- );
3823
- if (typeof value !== "function") {
3824
- return value;
3825
- }
3826
- return await value.apply(client, args);
3827
- };
3828
- }
3829
- }
3830
- );
4003
+ if (this.#db) {
4004
+ return this.#db;
4005
+ }
4006
+ const runtimeState = getNativeRuntimeState(this.#runtime, this.#ctx);
4007
+ const cachedClient = runtimeState.databaseClient;
4008
+ if (cachedClient) {
4009
+ this.#db = cachedClient.client;
4010
+ return this.#db;
4011
+ }
4012
+ throw databaseClientNotReadyError();
4013
+ }
4014
+ [RAW_STATE_SYMBOL]() {
4015
+ if (!this.#stateEnabled) {
4016
+ throw stateNotEnabledError();
3831
4017
  }
3832
- return this.#dbProxy;
4018
+ return this.#readState();
3833
4019
  }
3834
4020
  get state() {
3835
4021
  if (!this.#stateEnabled) {
@@ -3844,8 +4030,9 @@ var ActorContextHandleAdapter = class {
3844
4030
  (nextValue) => {
3845
4031
  this.#writeState(nextValue, { scheduleSave: true });
3846
4032
  },
3847
- () => {
4033
+ (newValue) => {
3848
4034
  this.#assertCanMutateState();
4035
+ assertJsonCompatValue(newValue);
3849
4036
  }
3850
4037
  );
3851
4038
  }
@@ -3856,6 +4043,7 @@ var ActorContextHandleAdapter = class {
3856
4043
  throw stateNotEnabledError();
3857
4044
  }
3858
4045
  this.#assertCanMutateState();
4046
+ assertJsonCompatValue(value);
3859
4047
  this.#writeState(value, { scheduleSave: true });
3860
4048
  }
3861
4049
  initializeState(value) {
@@ -3912,25 +4100,14 @@ var ActorContextHandleAdapter = class {
3912
4100
  return callNativeSync(() => this.#runtime.actorRegion(this.#ctx));
3913
4101
  }
3914
4102
  get conns() {
3915
- return new Map(
3916
- callNativeSync(() => this.#runtime.actorConns(this.#ctx)).map(
3917
- (conn) => [
3918
- this.#runtime.connId(conn),
3919
- new NativeConnAdapter(
3920
- this.#runtime,
3921
- conn,
3922
- this.#schemas,
3923
- this.#ctx,
3924
- (connId) => callNativeSync(
3925
- () => this.#runtime.actorQueueHibernationRemoval(
3926
- this.#ctx,
3927
- connId
3928
- )
3929
- )
3930
- )
3931
- ]
3932
- )
3933
- );
4103
+ if (!this.#connMap) {
4104
+ this.#connMap = new NativeConnectionMap(
4105
+ this.#runtime,
4106
+ this.#ctx,
4107
+ this.#schemas
4108
+ );
4109
+ }
4110
+ return this.#connMap;
3934
4111
  }
3935
4112
  get log() {
3936
4113
  return logger2();
@@ -4687,6 +4864,10 @@ function buildNativeFactory(runtime, registryConfig, definition) {
4687
4864
  isWorkflowEnabled: getNativeWorkflowInspector(ctx) !== void 0
4688
4865
  });
4689
4866
  } catch (error) {
4867
+ logger2().error({
4868
+ msg: "error replaying workflow history",
4869
+ error
4870
+ });
4690
4871
  return errorResponse(error);
4691
4872
  }
4692
4873
  }
@@ -4838,6 +5019,10 @@ function buildNativeFactory(runtime, registryConfig, definition) {
4838
5019
  );
4839
5020
  return jsonResponse({ output });
4840
5021
  } catch (error) {
5022
+ logger2().error({
5023
+ msg: "Error handling inspector action request",
5024
+ error
5025
+ });
4841
5026
  return errorResponse(error);
4842
5027
  }
4843
5028
  }
@@ -4851,6 +5036,10 @@ function buildNativeFactory(runtime, registryConfig, definition) {
4851
5036
  { status: 404 }
4852
5037
  );
4853
5038
  } catch (error) {
5039
+ logger2().error({
5040
+ msg: "Error handling inspector request",
5041
+ error
5042
+ });
4854
5043
  return errorResponse(error);
4855
5044
  } finally {
4856
5045
  await actorCtx.dispose();
@@ -5472,20 +5661,6 @@ async function buildConfiguredRegistry(config) {
5472
5661
  }
5473
5662
 
5474
5663
  // src/registry/index.ts
5475
- function signalExitCode(signal) {
5476
- switch (signal) {
5477
- case "SIGINT":
5478
- return 130;
5479
- case "SIGTERM":
5480
- return 143;
5481
- }
5482
- }
5483
- function finishShutdownSignal(signal) {
5484
- if (process.pid === 1) {
5485
- process.exit(signalExitCode(signal));
5486
- }
5487
- process.kill(process.pid, signal);
5488
- }
5489
5664
  var Registry = class {
5490
5665
  #config;
5491
5666
  routes;
@@ -5514,12 +5689,12 @@ var Registry = class {
5514
5689
  #ensureServerlessPoolConfigured(config) {
5515
5690
  if (!config.configurePool) return void 0;
5516
5691
  if (!this.#configureServerlessPoolPromise) {
5517
- this.#configureServerlessPoolPromise = configureServerlessPool(config).catch(
5518
- (error) => {
5519
- this.#configureServerlessPoolPromise = void 0;
5520
- throw error;
5521
- }
5522
- );
5692
+ this.#configureServerlessPoolPromise = configureServerlessPool(
5693
+ config
5694
+ ).catch((error) => {
5695
+ this.#configureServerlessPoolPromise = void 0;
5696
+ throw error;
5697
+ });
5523
5698
  this.#configureServerlessPoolPromise.catch(() => {
5524
5699
  });
5525
5700
  }
@@ -5555,7 +5730,7 @@ var Registry = class {
5555
5730
  if (isStartRequest) {
5556
5731
  try {
5557
5732
  await this.#ensureServerlessPoolConfigured(config);
5558
- } catch (error) {
5733
+ } catch (_error) {
5559
5734
  return new Response(
5560
5735
  JSON.stringify({
5561
5736
  group: "guard",
@@ -5669,7 +5844,7 @@ var Registry = class {
5669
5844
  if (isMetadataRequest && !isEngineMetadataRequest) {
5670
5845
  try {
5671
5846
  await this.#ensureServerlessPoolConfigured(config);
5672
- } catch (error) {
5847
+ } catch (_error) {
5673
5848
  return new Response(
5674
5849
  JSON.stringify({
5675
5850
  group: "guard",
@@ -5702,6 +5877,33 @@ var Registry = class {
5702
5877
  fetch: (request) => this.handler(request)
5703
5878
  };
5704
5879
  }
5880
+ /**
5881
+ * Starts an HTTP server that dispatches every request through the
5882
+ * serverless handler. Uses `crossPlatformServe` to pick the right
5883
+ * runtime (Node, Bun, Deno).
5884
+ *
5885
+ * @param opts.port Port to listen on. Defaults to 3000.
5886
+ * @param opts.publicDir If set, serves static files from this directory
5887
+ * before falling through to the registry handler.
5888
+ *
5889
+ * @example
5890
+ * ```ts
5891
+ * await registry.listen();
5892
+ * await registry.listen({ port: 8080, publicDir: "./public" });
5893
+ * ```
5894
+ */
5895
+ async listen(opts = {}) {
5896
+ const port = opts.port ?? 3e3;
5897
+ const config = this.parseConfig();
5898
+ const runtime = detectRuntime();
5899
+ const app = new Hono();
5900
+ if (opts.publicDir) {
5901
+ const serveStatic = await loadRuntimeServeStatic(runtime);
5902
+ app.use("*", serveStatic({ root: opts.publicDir }));
5903
+ }
5904
+ app.all("*", (c) => this.handler(c.req.raw));
5905
+ await crossPlatformServe(config, port, app, runtime);
5906
+ }
5705
5907
  /**
5706
5908
  * Returns a health response suitable for mounting in a user-owned router.
5707
5909
  */
@@ -5795,8 +5997,8 @@ var Registry = class {
5795
5997
  this.#runtimeServeConfiguredPromise = configuredRegistryPromise;
5796
5998
  this.#runtimeServePromise = configuredRegistryPromise.then(async ({ runtime, registry, serveConfig }) => {
5797
5999
  await runtime.serveRegistry(registry, serveConfig);
5798
- }).catch((err) => {
5799
- logger2().warn({ err }, "runtime registry serve errored");
6000
+ }).catch((error) => {
6001
+ logger2().warn({ error }, "runtime registry serve errored");
5800
6002
  });
5801
6003
  this.#installSignalHandlers(config, configuredRegistryPromise);
5802
6004
  }
@@ -5827,29 +6029,29 @@ var Registry = class {
5827
6029
  #onShutdownSignal(signal, config, configuredRegistryPromise) {
5828
6030
  if (this.#shutdownInFlight !== null) {
5829
6031
  this.#removeSignalHandlers();
5830
- finishShutdownSignal(signal);
6032
+ process.kill(process.pid, signal);
5831
6033
  return;
5832
6034
  }
5833
6035
  this.#shutdownInFlight = this.#runShutdown(
5834
6036
  signal,
5835
6037
  config,
5836
6038
  configuredRegistryPromise
5837
- ).catch((err) => {
5838
- logger2().warn({ err }, "shutdown error");
6039
+ ).catch((error) => {
6040
+ logger2().warn({ error }, "shutdown error");
5839
6041
  });
5840
6042
  }
5841
6043
  async #runShutdown(signal, config, configuredRegistryPromise) {
5842
6044
  var _a;
5843
- const gracePeriodMs = ((_a = config.shutdown) == null ? void 0 : _a.gracePeriodMs) ?? await this.#actorStopThresholdMs(configuredRegistryPromise) ?? 30 * 60 * 1e3;
6045
+ const gracePeriodMs = ((_a = config.shutdown) == null ? void 0 : _a.gracePeriodMs) ?? 3e4;
5844
6046
  const drain = async () => {
5845
6047
  const registries = [
5846
6048
  (async () => {
5847
6049
  try {
5848
6050
  const { runtime, registry } = await configuredRegistryPromise;
5849
6051
  await runtime.shutdownRegistry(registry);
5850
- } catch (err) {
6052
+ } catch (error) {
5851
6053
  logger2().warn(
5852
- { err },
6054
+ { error },
5853
6055
  "runtime registry shutdown errored (mode A)"
5854
6056
  );
5855
6057
  }
@@ -5864,7 +6066,7 @@ var Registry = class {
5864
6066
  await runtime.shutdownRegistry(registry);
5865
6067
  } catch (err) {
5866
6068
  logger2().warn(
5867
- { err },
6069
+ { error: err },
5868
6070
  "runtime registry shutdown errored (mode B)"
5869
6071
  );
5870
6072
  }
@@ -5887,23 +6089,7 @@ var Registry = class {
5887
6089
  )
5888
6090
  ]);
5889
6091
  this.#removeSignalHandlers();
5890
- finishShutdownSignal(signal);
5891
- }
5892
- async #actorStopThresholdMs(configuredRegistryPromise) {
5893
- var _a;
5894
- try {
5895
- const { runtime, registry } = await configuredRegistryPromise;
5896
- const thresholdMs = await ((_a = runtime.registryActorStopThresholdMs) == null ? void 0 : _a.call(runtime, registry));
5897
- if (thresholdMs !== void 0 && Number.isFinite(thresholdMs) && thresholdMs > 0) {
5898
- return thresholdMs;
5899
- }
5900
- } catch (err) {
5901
- logger2().warn(
5902
- { err },
5903
- "failed to read actor stop threshold for shutdown grace"
5904
- );
5905
- }
5906
- return void 0;
6092
+ process.kill(process.pid, signal);
5907
6093
  }
5908
6094
  #removeSignalHandlers() {
5909
6095
  for (const [signal, handler] of Object.entries(