rivetkit 2.0.39 → 2.0.41

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 (103) hide show
  1. package/dist/schemas/actor-persist/v1.js +167 -0
  2. package/dist/schemas/actor-persist/v2.js +200 -0
  3. package/dist/schemas/actor-persist/v3.js +200 -0
  4. package/dist/schemas/client-protocol/v1.js +301 -0
  5. package/dist/schemas/client-protocol/v2.js +299 -0
  6. package/dist/schemas/file-system-driver/v1.js +76 -0
  7. package/dist/schemas/file-system-driver/v2.js +103 -0
  8. package/dist/schemas/file-system-driver/v3.js +122 -0
  9. package/dist/tsup/actor/errors.cjs.map +1 -1
  10. package/dist/tsup/{chunk-OJZRCEIA.js → chunk-4J5EFV3E.js} +5 -5
  11. package/dist/tsup/{chunk-7E3RWMR6.cjs → chunk-4UHJ3ADW.cjs} +173 -107
  12. package/dist/tsup/chunk-4UHJ3ADW.cjs.map +1 -0
  13. package/dist/tsup/{chunk-BQ36VTSB.js → chunk-7KIR3QLO.js} +86 -20
  14. package/dist/tsup/{chunk-BQ36VTSB.js.map → chunk-7KIR3QLO.js.map} +1 -1
  15. package/dist/tsup/{chunk-KMYFL3OL.cjs → chunk-B5UXC4QV.cjs} +75 -64
  16. package/dist/tsup/chunk-B5UXC4QV.cjs.map +1 -0
  17. package/dist/tsup/{chunk-C64FV764.cjs → chunk-DSNSFYDL.cjs} +3 -3
  18. package/dist/tsup/chunk-DSNSFYDL.cjs.map +1 -0
  19. package/dist/tsup/chunk-GBENOENJ.cjs.map +1 -1
  20. package/dist/tsup/{chunk-DY4H3ASE.cjs → chunk-GTQKDCM4.cjs} +46 -46
  21. package/dist/tsup/chunk-GTQKDCM4.cjs.map +1 -0
  22. package/dist/tsup/chunk-KDFWJKMJ.cjs.map +1 -1
  23. package/dist/tsup/{chunk-CDK6DRO2.js → chunk-LMG4QMDO.js} +2 -2
  24. package/dist/tsup/{chunk-CDK6DRO2.js.map → chunk-LMG4QMDO.js.map} +1 -1
  25. package/dist/tsup/{chunk-T7IPDBWH.js → chunk-NRP2OHSW.js} +4 -4
  26. package/dist/tsup/{chunk-PVKUXMOA.js → chunk-OXN6EZUB.js} +19 -8
  27. package/dist/tsup/chunk-OXN6EZUB.js.map +1 -0
  28. package/dist/tsup/{chunk-MZPYVTVG.cjs → chunk-QDVKDX7G.cjs} +9 -9
  29. package/dist/tsup/chunk-QDVKDX7G.cjs.map +1 -0
  30. package/dist/tsup/{chunk-X72X7I7T.cjs → chunk-S6F7EKC7.cjs} +2 -2
  31. package/dist/tsup/chunk-S6F7EKC7.cjs.map +1 -0
  32. package/dist/tsup/chunk-SNAUKDDK.cjs.map +1 -1
  33. package/dist/tsup/{chunk-XU74APB4.js → chunk-UGOCTUBG.js} +6 -5
  34. package/dist/tsup/chunk-UGOCTUBG.js.map +1 -0
  35. package/dist/tsup/{chunk-UAX5E3EU.cjs → chunk-WYZLRPQM.cjs} +250 -249
  36. package/dist/tsup/chunk-WYZLRPQM.cjs.map +1 -0
  37. package/dist/tsup/{chunk-PHCD25XO.js → chunk-Y7ZDTLD2.js} +2 -2
  38. package/dist/tsup/client/mod.cjs +5 -5
  39. package/dist/tsup/client/mod.cjs.map +1 -1
  40. package/dist/tsup/client/mod.d.cts +2 -2
  41. package/dist/tsup/client/mod.d.ts +2 -2
  42. package/dist/tsup/client/mod.js +4 -4
  43. package/dist/tsup/common/log.cjs +2 -2
  44. package/dist/tsup/common/log.cjs.map +1 -1
  45. package/dist/tsup/common/log.d.cts +2 -2
  46. package/dist/tsup/common/log.d.ts +2 -2
  47. package/dist/tsup/common/log.js +1 -1
  48. package/dist/tsup/common/websocket.cjs +3 -3
  49. package/dist/tsup/common/websocket.cjs.map +1 -1
  50. package/dist/tsup/common/websocket.js +2 -2
  51. package/dist/tsup/{config-BuBlMs6C.d.cts → config-COyis_uH.d.cts} +22 -10
  52. package/dist/tsup/{config-CBwo4ooA.d.ts → config-D43N-CFi.d.ts} +22 -10
  53. package/dist/tsup/{driver-CPXmh8f8.d.cts → driver-Bt7B-qMd.d.cts} +1 -1
  54. package/dist/tsup/{driver-DxWa6HUO.d.ts → driver-KyM2v645.d.ts} +1 -1
  55. package/dist/tsup/driver-helpers/mod.cjs +3 -3
  56. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  57. package/dist/tsup/driver-helpers/mod.d.cts +2 -2
  58. package/dist/tsup/driver-helpers/mod.d.ts +2 -2
  59. package/dist/tsup/driver-helpers/mod.js +2 -2
  60. package/dist/tsup/driver-test-suite/mod.cjs +62 -34
  61. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  62. package/dist/tsup/driver-test-suite/mod.d.cts +2 -2
  63. package/dist/tsup/driver-test-suite/mod.d.ts +2 -2
  64. package/dist/tsup/driver-test-suite/mod.js +35 -7
  65. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  66. package/dist/tsup/inspector/mod.cjs.map +1 -1
  67. package/dist/tsup/mod.cjs +7 -7
  68. package/dist/tsup/mod.cjs.map +1 -1
  69. package/dist/tsup/mod.d.cts +4 -4
  70. package/dist/tsup/mod.d.ts +4 -4
  71. package/dist/tsup/mod.js +6 -6
  72. package/dist/tsup/test/mod.cjs +7 -7
  73. package/dist/tsup/test/mod.cjs.map +1 -1
  74. package/dist/tsup/test/mod.d.cts +1 -1
  75. package/dist/tsup/test/mod.d.ts +1 -1
  76. package/dist/tsup/test/mod.js +6 -6
  77. package/dist/tsup/utils.cjs +2 -2
  78. package/dist/tsup/utils.cjs.map +1 -1
  79. package/dist/tsup/utils.js +1 -1
  80. package/package.json +2 -2
  81. package/src/actor/instance/schedule-manager.ts +2 -1
  82. package/src/actor/router-websocket-endpoints.test.ts +54 -0
  83. package/src/actor/router-websocket-endpoints.ts +9 -4
  84. package/src/common/router.ts +2 -0
  85. package/src/driver-test-suite/tests/raw-websocket.ts +40 -0
  86. package/src/engine-process/mod.ts +69 -7
  87. package/src/registry/config/index.ts +7 -0
  88. package/src/registry/config/serverless.ts +2 -0
  89. package/src/registry/serve.ts +9 -5
  90. package/src/remote-manager-driver/api-endpoints.ts +2 -0
  91. package/src/serverless/configure.ts +3 -0
  92. package/dist/tsup/chunk-7E3RWMR6.cjs.map +0 -1
  93. package/dist/tsup/chunk-C64FV764.cjs.map +0 -1
  94. package/dist/tsup/chunk-DY4H3ASE.cjs.map +0 -1
  95. package/dist/tsup/chunk-KMYFL3OL.cjs.map +0 -1
  96. package/dist/tsup/chunk-MZPYVTVG.cjs.map +0 -1
  97. package/dist/tsup/chunk-PVKUXMOA.js.map +0 -1
  98. package/dist/tsup/chunk-UAX5E3EU.cjs.map +0 -1
  99. package/dist/tsup/chunk-X72X7I7T.cjs.map +0 -1
  100. package/dist/tsup/chunk-XU74APB4.js.map +0 -1
  101. /package/dist/tsup/{chunk-OJZRCEIA.js.map → chunk-4J5EFV3E.js.map} +0 -0
  102. /package/dist/tsup/{chunk-T7IPDBWH.js.map → chunk-NRP2OHSW.js.map} +0 -0
  103. /package/dist/tsup/{chunk-PHCD25XO.js.map → chunk-Y7ZDTLD2.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/actor/config.ts","../../src/actor/mod.ts","../../src/drivers/engine/actor-driver.ts","../../src/drivers/engine/log.ts","../../src/drivers/engine/config.ts","../../src/drivers/engine/mod.ts","../../src/registry/config/legacy-runner.ts","../../runtime/index.ts","../../src/drivers/default.ts","../../src/engine-process/log.ts","../../src/engine-process/mod.ts","../../src/inspector/utils.ts","../../src/serverless/log.ts","../../src/serverless/configure.ts","../../src/registry/log.ts","../../src/registry/serve.ts","../../src/serverless/router.ts","../../src/manager/router-schema.ts","../../src/registry/index.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport type { Conn } from \"./conn/mod\";\nimport type {\n\tActionContext,\n\tActorContext,\n\tBeforeActionResponseContext,\n\tBeforeConnectContext,\n\tConnectContext,\n\tCreateConnStateContext,\n\tCreateContext,\n\tCreateVarsContext,\n\tDestroyContext,\n\tDisconnectContext,\n\tRequestContext,\n\tSleepContext,\n\tStateChangeContext,\n\tWakeContext,\n\tWebSocketContext,\n} from \"./contexts\";\nimport type { AnyDatabaseProvider } from \"./database\";\n\nexport interface ActorTypes<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> {\n\tstate?: TState;\n\tconnParams?: TConnParams;\n\tconnState?: TConnState;\n\tvars?: TVars;\n\tinput?: TInput;\n\tdatabase?: TDatabase;\n}\n\n// Helper for validating function types - accepts generic for specific function signatures\nconst zFunction = <\n\tT extends (...args: any[]) => any = (...args: unknown[]) => unknown,\n>() => z.custom<T>((val) => typeof val === \"function\");\n\n// This schema is used to validate the input at runtime. The generic types are defined below in `ActorConfig`.\n//\n// We don't use Zod generics with `z.custom` because:\n// (a) there seems to be a weird bug in either Zod, tsup, or TSC that causese external packages to have different types from `z.infer` than from within the same package and\n// (b) it makes the type definitions incredibly difficult to read as opposed to vanilla TypeScript.\nexport const ActorConfigSchema = z\n\t.object({\n\t\tonCreate: zFunction().optional(),\n\t\tonDestroy: zFunction().optional(),\n\t\tonWake: zFunction().optional(),\n\t\tonSleep: zFunction().optional(),\n\t\tonStateChange: zFunction().optional(),\n\t\tonBeforeConnect: zFunction().optional(),\n\t\tonConnect: zFunction().optional(),\n\t\tonDisconnect: zFunction().optional(),\n\t\tonBeforeActionResponse: zFunction().optional(),\n\t\tonRequest: zFunction().optional(),\n\t\tonWebSocket: zFunction().optional(),\n\t\tactions: z.record(z.string(), zFunction()).default(() => ({})),\n\t\tstate: z.any().optional(),\n\t\tcreateState: zFunction().optional(),\n\t\tconnState: z.any().optional(),\n\t\tcreateConnState: zFunction().optional(),\n\t\tvars: z.any().optional(),\n\t\tdb: z.any().optional(),\n\t\tcreateVars: zFunction().optional(),\n\t\toptions: z\n\t\t\t.object({\n\t\t\t\tcreateVarsTimeout: z.number().positive().default(5000),\n\t\t\t\tcreateConnStateTimeout: z.number().positive().default(5000),\n\t\t\t\tonConnectTimeout: z.number().positive().default(5000),\n\t\t\t\t// This must be less than ACTOR_STOP_THRESHOLD_MS\n\t\t\t\tonSleepTimeout: z.number().positive().default(5000),\n\t\t\t\tonDestroyTimeout: z.number().positive().default(5000),\n\t\t\t\tstateSaveInterval: z.number().positive().default(10_000),\n\t\t\t\tactionTimeout: z.number().positive().default(60_000),\n\t\t\t\t// Max time to wait for waitUntil background promises during shutdown\n\t\t\t\twaitUntilTimeout: z.number().positive().default(15_000),\n\t\t\t\tconnectionLivenessTimeout: z.number().positive().default(2500),\n\t\t\t\tconnectionLivenessInterval: z.number().positive().default(5000),\n\t\t\t\tnoSleep: z.boolean().default(false),\n\t\t\t\tsleepTimeout: z.number().positive().default(30_000),\n\t\t\t\t/**\n\t\t\t\t * Can hibernate WebSockets for onWebSocket.\n\t\t\t\t *\n\t\t\t\t * WebSockets using actions/events are hibernatable by default.\n\t\t\t\t *\n\t\t\t\t * @experimental\n\t\t\t\t **/\n\t\t\t\tcanHibernateWebSocket: z\n\t\t\t\t\t.union([\n\t\t\t\t\t\tz.boolean(),\n\t\t\t\t\t\tzFunction<(request: Request) => boolean>(),\n\t\t\t\t\t])\n\t\t\t\t\t.default(false),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.prefault(() => ({})),\n\t})\n\t.strict()\n\t.refine(\n\t\t(data) => !(data.state !== undefined && data.createState !== undefined),\n\t\t{\n\t\t\tmessage: \"Cannot define both 'state' and 'createState'\",\n\t\t\tpath: [\"state\"],\n\t\t},\n\t)\n\t.refine(\n\t\t(data) =>\n\t\t\t!(\n\t\t\t\tdata.connState !== undefined &&\n\t\t\t\tdata.createConnState !== undefined\n\t\t\t),\n\t\t{\n\t\t\tmessage: \"Cannot define both 'connState' and 'createConnState'\",\n\t\t\tpath: [\"connState\"],\n\t\t},\n\t)\n\t.refine(\n\t\t(data) => !(data.vars !== undefined && data.createVars !== undefined),\n\t\t{\n\t\t\tmessage: \"Cannot define both 'vars' and 'createVars'\",\n\t\t\tpath: [\"vars\"],\n\t\t},\n\t);\n\n// Creates state config\n//\n// This must have only one or the other or else TState will not be able to be inferred\n//\n// Data returned from this handler will be available on `c.state`.\ntype CreateState<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> =\n\t| { state: TState }\n\t| {\n\t\t\tcreateState: (\n\t\t\t\tc: CreateContext<TState, TInput, TDatabase>,\n\t\t\t\tinput: TInput,\n\t\t\t) => TState | Promise<TState>;\n\t }\n\t| Record<never, never>;\n\n// Creates connection state config\n//\n// This must have only one or the other or else TState will not be able to be inferred\n//\n// Data returned from this handler will be available on `c.conn.state`.\ntype CreateConnState<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> =\n\t| { connState: TConnState }\n\t| {\n\t\t\tcreateConnState: (\n\t\t\t\tc: CreateConnStateContext<TState, TVars, TInput, TDatabase>,\n\t\t\t\tparams: TConnParams,\n\t\t\t) => TConnState | Promise<TConnState>;\n\t }\n\t| Record<never, never>;\n\n// Creates vars config\n//\n// This must have only one or the other or else TState will not be able to be inferred\n/**\n * @experimental\n */\ntype CreateVars<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> =\n\t| {\n\t\t\t/**\n\t\t\t * @experimental\n\t\t\t */\n\t\t\tvars: TVars;\n\t }\n\t| {\n\t\t\t/**\n\t\t\t * @experimental\n\t\t\t */\n\t\t\tcreateVars: (\n\t\t\t\tc: CreateVarsContext<TState, TInput, TDatabase>,\n\t\t\t\tdriverCtx: any,\n\t\t\t) => TVars | Promise<TVars>;\n\t }\n\t| Record<never, never>;\n\nexport interface Actions<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> {\n\t[Action: string]: (\n\t\tc: ActionContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\t...args: any[]\n\t) => any;\n}\n\n//export type ActorConfig<TState, TConnParams, TConnState, TVars, TInput, TAuthData> = BaseActorConfig<TState, TConnParams, TConnState, TVars, TInput, TAuthData> &\n//\tActorConfigLifecycle<TState, TConnParams, TConnState, TVars, TInput, TAuthData> &\n//\tCreateState<TState, TConnParams, TConnState, TVars, TInput, TAuthData> &\n//\tCreateConnState<TState, TConnParams, TConnState, TVars, TInput, TAuthData>;\n\n/**\n * @experimental\n */\nexport type AuthIntent = \"get\" | \"create\" | \"connect\" | \"action\" | \"message\";\n\ninterface BaseActorConfig<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTActions extends Actions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>,\n> {\n\t/**\n\t * Called when the actor is first initialized.\n\t *\n\t * Use this hook to initialize your actor's state.\n\t * This is called before any other lifecycle hooks.\n\t */\n\tonCreate?: (\n\t\tc: CreateContext<TState, TInput, TDatabase>,\n\t\tinput: TInput,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when the actor is destroyed.\n\t */\n\tonDestroy?: (\n\t\tc: DestroyContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when the actor is started and ready to receive connections and action.\n\t *\n\t * Use this hook to initialize resources needed for the actor's operation\n\t * (timers, external connections, etc.)\n\t *\n\t * @returns Void or a Promise that resolves when startup is complete\n\t */\n\tonWake?: (\n\t\tc: WakeContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when the actor is stopping or sleeping.\n\t *\n\t * Use this hook to clean up resources, save state, or perform\n\t * any shutdown operations before the actor sleeps or stops.\n\t *\n\t * Not supported on all platforms.\n\t *\n\t * @returns Void or a Promise that resolves when shutdown is complete\n\t */\n\tonSleep?: (\n\t\tc: SleepContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when the actor's state changes.\n\t *\n\t * Use this hook to react to state changes, such as updating\n\t * external systems or triggering events.\n\t *\n\t * State changes made within this hook will NOT trigger\n\t * another onStateChange call, preventing infinite recursion.\n\t *\n\t * @param newState The updated state\n\t */\n\tonStateChange?: (\n\t\tc: StateChangeContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tnewState: TState,\n\t) => void;\n\n\t/**\n\t * Called before a client connects to the actor.\n\t *\n\t * Use this hook to determine if a connection should be accepted\n\t * and to initialize connection-specific state.\n\t *\n\t * @param opts Connection parameters including client-provided data\n\t * @returns The initial connection state or a Promise that resolves to it\n\t * @throws Throw an error to reject the connection\n\t */\n\tonBeforeConnect?: (\n\t\tc: BeforeConnectContext<TState, TVars, TInput, TDatabase>,\n\t\tparams: TConnParams,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when a client successfully connects to the actor.\n\t *\n\t * Use this hook to perform actions when a connection is established,\n\t * such as sending initial data or updating the actor's state.\n\t *\n\t * @param conn The connection object\n\t * @returns Void or a Promise that resolves when connection handling is complete\n\t */\n\tonConnect?: (\n\t\tc: ConnectContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tconn: Conn<TState, TConnParams, TConnState, TVars, TInput, TDatabase>,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when a client disconnects from the actor.\n\t *\n\t * Use this hook to clean up resources associated with the connection\n\t * or update the actor's state.\n\t *\n\t * @param conn The connection that is being closed\n\t * @returns Void or a Promise that resolves when disconnect handling is complete\n\t */\n\tonDisconnect?: (\n\t\tc: DisconnectContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tconn: Conn<TState, TConnParams, TConnState, TVars, TInput, TDatabase>,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called before sending an action response to the client.\n\t *\n\t * Use this hook to modify or transform the output of an action before it's sent\n\t * to the client. This is useful for formatting responses, adding metadata,\n\t * or applying transformations to the output.\n\t *\n\t * @param name The name of the action that was called\n\t * @param args The arguments that were passed to the action\n\t * @param output The output that will be sent to the client\n\t * @returns The modified output to send to the client\n\t */\n\tonBeforeActionResponse?: <Out>(\n\t\tc: BeforeActionResponseContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tname: string,\n\t\targs: unknown[],\n\t\toutput: Out,\n\t) => Out | Promise<Out>;\n\n\t/**\n\t * Called when a raw HTTP request is made to the actor.\n\t *\n\t * This handler receives raw HTTP requests made to `/actors/{actorName}/http/*` endpoints.\n\t * Use this hook to handle custom HTTP patterns, REST APIs, or other HTTP-based protocols.\n\t *\n\t * @param c The request context with access to the connection\n\t * @param request The raw HTTP request object\n\t * @param opts Additional options\n\t * @returns A Response object to send back, or void to continue with default routing\n\t */\n\tonRequest?: (\n\t\tc: RequestContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\trequest: Request,\n\t) => Response | Promise<Response>;\n\n\t/**\n\t * Called when a raw WebSocket connection is established to the actor.\n\t *\n\t * This handler receives WebSocket connections made to `/actors/{actorName}/websocket/*` endpoints.\n\t * Use this hook to handle custom WebSocket protocols, binary streams, or other WebSocket-based communication.\n\t *\n\t * @param c The WebSocket context with access to the connection\n\t * @param websocket The raw WebSocket connection\n\t * @param opts Additional options including the original HTTP upgrade request\n\t */\n\tonWebSocket?: (\n\t\tc: WebSocketContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\twebsocket: UniversalWebSocket,\n\t) => void | Promise<void>;\n\n\tactions?: TActions;\n}\n\ntype ActorDatabaseConfig<TDatabase extends AnyDatabaseProvider> =\n\t| {\n\t\t\t/**\n\t\t\t * @experimental\n\t\t\t */\n\t\t\tdb: TDatabase;\n\t }\n\t| Record<never, never>;\n\n// 1. Infer schema\n// 2. Omit keys that we'll manually define (because of generics)\n// 3. Define our own types that have generic constraints\nexport type ActorConfig<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> = Omit<\n\tz.infer<typeof ActorConfigSchema>,\n\t| \"actions\"\n\t| \"onCreate\"\n\t| \"onDestroy\"\n\t| \"onWake\"\n\t| \"onStateChange\"\n\t| \"onBeforeConnect\"\n\t| \"onConnect\"\n\t| \"onDisconnect\"\n\t| \"onBeforeActionResponse\"\n\t| \"onRequest\"\n\t| \"onWebSocket\"\n\t| \"state\"\n\t| \"createState\"\n\t| \"connState\"\n\t| \"createConnState\"\n\t| \"vars\"\n\t| \"createVars\"\n\t| \"db\"\n> &\n\tBaseActorConfig<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tActions<TState, TConnParams, TConnState, TVars, TInput, TDatabase>\n\t> &\n\tCreateState<TState, TConnParams, TConnState, TVars, TInput, TDatabase> &\n\tCreateConnState<TState, TConnParams, TConnState, TVars, TInput, TDatabase> &\n\tCreateVars<TState, TConnParams, TConnState, TVars, TInput, TDatabase> &\n\tActorDatabaseConfig<TDatabase>;\n\n// See description on `ActorConfig`\nexport type ActorConfigInput<\n\tTState = undefined,\n\tTConnParams = undefined,\n\tTConnState = undefined,\n\tTVars = undefined,\n\tTInput = undefined,\n\tTDatabase extends AnyDatabaseProvider = undefined,\n\tTActions extends Actions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t> = Record<never, never>,\n> = {\n\ttypes?: ActorTypes<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>;\n} & Omit<\n\tz.input<typeof ActorConfigSchema>,\n\t| \"actions\"\n\t| \"onCreate\"\n\t| \"onDestroy\"\n\t| \"onWake\"\n\t| \"onSleep\"\n\t| \"onStateChange\"\n\t| \"onBeforeConnect\"\n\t| \"onConnect\"\n\t| \"onDisconnect\"\n\t| \"onBeforeActionResponse\"\n\t| \"onRequest\"\n\t| \"onWebSocket\"\n\t| \"state\"\n\t| \"createState\"\n\t| \"connState\"\n\t| \"createConnState\"\n\t| \"vars\"\n\t| \"createVars\"\n\t| \"db\"\n> &\n\tBaseActorConfig<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTActions\n\t> &\n\tCreateState<TState, TConnParams, TConnState, TVars, TInput, TDatabase> &\n\tCreateConnState<TState, TConnParams, TConnState, TVars, TInput, TDatabase> &\n\tCreateVars<TState, TConnParams, TConnState, TVars, TInput, TDatabase> &\n\tActorDatabaseConfig<TDatabase>;\n\n// For testing type definitions:\nexport function test<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTActions extends Actions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>,\n>(\n\tinput: ActorConfigInput<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTActions\n\t>,\n): ActorConfig<TState, TConnParams, TConnState, TVars, TInput, TDatabase> {\n\tconst config = ActorConfigSchema.parse(input) as ActorConfig<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>;\n\treturn config;\n}\n\n// MARK: Documentation Schema\n// This schema is JSON-serializable for documentation generation.\n// It excludes function types and focuses on the configurable options.\n\nexport const DocActorOptionsSchema = z\n\t.object({\n\t\tcreateVarsTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Timeout in ms for createVars handler. Default: 5000\"),\n\t\tcreateConnStateTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Timeout in ms for createConnState handler. Default: 5000\",\n\t\t\t),\n\t\tonConnectTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Timeout in ms for onConnect handler. Default: 5000\"),\n\t\tonSleepTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Timeout in ms for onSleep handler. Must be less than ACTOR_STOP_THRESHOLD_MS. Default: 5000\",\n\t\t\t),\n\t\tonDestroyTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Timeout in ms for onDestroy handler. Default: 5000\"),\n\t\tstateSaveInterval: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Interval in ms between automatic state saves. Default: 10000\",\n\t\t\t),\n\t\tactionTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Timeout in ms for action handlers. Default: 60000\"),\n\t\twaitUntilTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Max time in ms to wait for waitUntil background promises during shutdown. Default: 15000\",\n\t\t\t),\n\t\tconnectionLivenessTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Timeout in ms for connection liveness checks. Default: 2500\",\n\t\t\t),\n\t\tconnectionLivenessInterval: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Interval in ms between connection liveness checks. Default: 5000\",\n\t\t\t),\n\t\tnoSleep: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\"If true, the actor will never sleep. Default: false\"),\n\t\tsleepTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Time in ms of inactivity before the actor sleeps. Default: 30000\",\n\t\t\t),\n\t\tcanHibernateWebSocket: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Whether WebSockets using onWebSocket can be hibernated. WebSockets using actions/events are hibernatable by default. Default: false\",\n\t\t\t),\n\t})\n\t.describe(\"Actor options for timeouts and behavior configuration.\");\n\nexport const DocActorConfigSchema = z\n\t.object({\n\t\tstate: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Initial state value for the actor. Cannot be used with createState.\",\n\t\t\t),\n\t\tcreateState: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Function to create initial state. Receives context and input. Cannot be used with state.\",\n\t\t\t),\n\t\tconnState: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Initial connection state value. Cannot be used with createConnState.\",\n\t\t\t),\n\t\tcreateConnState: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Function to create connection state. Receives context and connection params. Cannot be used with connState.\",\n\t\t\t),\n\t\tvars: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Initial ephemeral variables value. Cannot be used with createVars.\",\n\t\t\t),\n\t\tcreateVars: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Function to create ephemeral variables. Receives context and driver context. Cannot be used with vars.\",\n\t\t\t),\n\t\tdb: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\"Database provider instance for the actor.\"),\n\t\tonCreate: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when the actor is first initialized. Use to initialize state.\",\n\t\t\t),\n\t\tonDestroy: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\"Called when the actor is destroyed.\"),\n\t\tonWake: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when the actor wakes up and is ready to receive connections and actions.\",\n\t\t\t),\n\t\tonSleep: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when the actor is stopping or sleeping. Use to clean up resources.\",\n\t\t\t),\n\t\tonStateChange: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when the actor's state changes. State changes within this hook won't trigger recursion.\",\n\t\t\t),\n\t\tonBeforeConnect: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called before a client connects. Throw an error to reject the connection.\",\n\t\t\t),\n\t\tonConnect: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\"Called when a client successfully connects.\"),\n\t\tonDisconnect: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\"Called when a client disconnects.\"),\n\t\tonBeforeActionResponse: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called before sending an action response. Use to transform output.\",\n\t\t\t),\n\t\tonRequest: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called for raw HTTP requests to /actors/{name}/http/* endpoints.\",\n\t\t\t),\n\t\tonWebSocket: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called for raw WebSocket connections to /actors/{name}/websocket/* endpoints.\",\n\t\t\t),\n\t\tactions: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Map of action name to handler function. Defaults to an empty object.\",\n\t\t\t),\n\t\toptions: DocActorOptionsSchema.optional(),\n\t})\n\t.describe(\"Actor configuration passed to the actor() function.\");\n","import {\n\ttype Actions,\n\ttype ActorConfig,\n\ttype ActorConfigInput,\n\tActorConfigSchema,\n\tActorTypes,\n} from \"./config\";\nimport type { AnyDatabaseProvider } from \"./database\";\nimport { ActorDefinition } from \"./definition\";\n\nexport function actor<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTActions extends Actions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>,\n>(\n\tinput: ActorConfigInput<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTActions\n\t>,\n): ActorDefinition<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTActions\n> {\n\tconst config = ActorConfigSchema.parse(input) as ActorConfig<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>;\n\treturn new ActorDefinition(config);\n}\nexport type { Encoding } from \"@/actor/protocol/serde\";\nexport {\n\tALLOWED_PUBLIC_HEADERS,\n\tPATH_CONNECT,\n\tPATH_WEBSOCKET_PREFIX,\n} from \"@/common/actor-router-consts\";\nexport type {\n\tUniversalErrorEvent,\n\tUniversalEvent,\n\tUniversalEventSource,\n\tUniversalMessageEvent,\n} from \"@/common/eventsource-interface\";\nexport type {\n\tRivetCloseEvent,\n\tRivetEvent,\n\tRivetMessageEvent,\n\tUniversalWebSocket,\n} from \"@/common/websocket-interface\";\nexport type { ActorKey } from \"@/manager/protocol/query\";\nexport type * from \"./config\";\nexport type { AnyConn, Conn } from \"./conn/mod\";\nexport type { ActorDefinition, AnyActorDefinition } from \"./definition\";\nexport { lookupInRegistry } from \"./definition\";\nexport { UserError, type UserErrorOptions } from \"./errors\";\nexport { KEYS as KV_KEYS } from \"./instance/keys\";\nexport { ActorKv } from \"./instance/kv\";\nexport type { AnyActorInstance } from \"./instance/mod\";\nexport {\n\ttype ActorRouter,\n\tcreateActorRouter,\n} from \"./router\";\nexport { routeWebSocket } from \"./router-websocket-endpoints\";\n","import type {\n\tActorConfig as EngineActorConfig,\n\tRunnerConfig as EngineRunnerConfig,\n\tHibernatingWebSocketMetadata,\n} from \"@rivetkit/engine-runner\";\nimport { idToStr, Runner } from \"@rivetkit/engine-runner\";\nimport * as cbor from \"cbor-x\";\nimport type { Context as HonoContext } from \"hono\";\nimport { streamSSE } from \"hono/streaming\";\nimport { WSContext, type WSContextInit } from \"hono/ws\";\nimport invariant from \"invariant\";\nimport { type AnyConn, CONN_STATE_MANAGER_SYMBOL } from \"@/actor/conn/mod\";\nimport { lookupInRegistry } from \"@/actor/definition\";\nimport { KEYS } from \"@/actor/instance/keys\";\nimport { deserializeActorKey } from \"@/actor/keys\";\nimport { getValueLength } from \"@/actor/protocol/old\";\nimport { type ActorRouter, createActorRouter } from \"@/actor/router\";\nimport {\n\tparseWebSocketProtocols,\n\trouteWebSocket,\n\ttruncateRawWebSocketPathPrefix,\n\ttype UpgradeWebSocketArgs,\n} from \"@/actor/router-websocket-endpoints\";\nimport type { Client } from \"@/client/client\";\nimport {\n\tPATH_CONNECT,\n\tPATH_INSPECTOR_CONNECT,\n\tPATH_WEBSOCKET_BASE,\n\tPATH_WEBSOCKET_PREFIX,\n} from \"@/common/actor-router-consts\";\nimport { getLogger } from \"@/common/log\";\nimport type {\n\tRivetMessageEvent,\n\tUniversalWebSocket,\n} from \"@/common/websocket-interface\";\nimport {\n\ttype ActorDriver,\n\ttype AnyActorInstance,\n\tgetInitialActorKvState,\n\ttype ManagerDriver,\n} from \"@/driver-helpers/mod\";\nimport { buildActorNames, type RegistryConfig } from \"@/registry/config\";\nimport { getEndpoint } from \"@/remote-manager-driver/api-utils\";\nimport {\n\ttype LongTimeoutHandle,\n\tpromiseWithResolvers,\n\tsetLongTimeout,\n\tstringifyError,\n\tVERSION,\n} from \"@/utils\";\nimport { logger } from \"./log\";\n\nconst RUNNER_SSE_PING_INTERVAL = 1000;\n\n// Message ack deadline is 30s on the gateway, but we will ack more frequently\n// in order to minimize the message buffer size on the gateway and to give\n// generous breathing room for the timeout.\n//\n// See engine/packages/pegboard-gateway/src/shared_state.rs\n// (HWS_MESSAGE_ACK_TIMEOUT)\nconst CONN_MESSAGE_ACK_DEADLINE = 5_000;\n\n// Force saveState when cumulative message size reaches this threshold (0.5 MB)\n//\n// See engine/packages/pegboard-gateway/src/shared_state.rs\n// (HWS_MAX_PENDING_MSGS_SIZE_PER_REQ)\nconst CONN_BUFFERED_MESSAGE_SIZE_THRESHOLD = 500_000;\n\ninterface ActorHandler {\n\tactor?: AnyActorInstance;\n\tactorStartPromise?: ReturnType<typeof promiseWithResolvers<void>>;\n\talarmTimeout?: LongTimeoutHandle;\n}\n\nexport type DriverContext = {};\n\nexport class EngineActorDriver implements ActorDriver {\n\t#config: RegistryConfig;\n\t#managerDriver: ManagerDriver;\n\t#inlineClient: Client<any>;\n\t#runner: Runner;\n\t#actors: Map<string, ActorHandler> = new Map();\n\t#actorRouter: ActorRouter;\n\n\t#runnerStarted: PromiseWithResolvers<undefined> = promiseWithResolvers();\n\t#runnerStopped: PromiseWithResolvers<undefined> = promiseWithResolvers();\n\t#isRunnerStopped: boolean = false;\n\n\t// HACK: Track actor stop intent locally since the runner protocol doesn't\n\t// pass the stop reason to onActorStop. This will be fixed when the runner\n\t// protocol is updated to send the intent directly (see RVT-5284)\n\t#actorStopIntent: Map<string, \"sleep\" | \"destroy\"> = new Map();\n\n\t// Map of conn IDs to message index waiting to be persisted before sending\n\t// an ack\n\t//\n\t// serverMessageIndex is updated and pendingAck is flagged in needed in\n\t// onBeforePersistConnect, then the HWS ack message is sent in\n\t// onAfterPersistConn. This allows us to track what's about to be written\n\t// to storage to prevent race conditions with the serverMessageIndex being\n\t// updated while writing the existing state.\n\t//\n\t// bufferedMessageSize tracks the total bytes received since last persist\n\t// to force a saveState when threshold is reached. This is the amount of\n\t// data currently buffered on the gateway.\n\t#hwsMessageIndex = new Map<\n\t\tstring,\n\t\t{\n\t\t\tserverMessageIndex: number;\n\t\t\tbufferedMessageSize: number;\n\t\t\tpendingAckFromMessageIndex: boolean;\n\t\t\tpendingAckFromBufferSize: boolean;\n\t\t}\n\t>();\n\n\tconstructor(\n\t\tconfig: RegistryConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tinlineClient: Client<any>,\n\t) {\n\t\tthis.#config = config;\n\t\tthis.#managerDriver = managerDriver;\n\t\tthis.#inlineClient = inlineClient;\n\n\t\t// HACK: Override inspector token (which are likely to be\n\t\t// removed later on) with token from x-rivet-token header\n\t\tconst token = config.token;\n\t\t// TODO:\n\t\t// if (token && runConfig.inspector && runConfig.inspector.enabled) {\n\t\t// \trunConfig.inspector.token = () => token;\n\t\t// }\n\n\t\tthis.#actorRouter = createActorRouter(\n\t\t\tconfig,\n\t\t\tthis,\n\t\t\tundefined,\n\t\t\tconfig.test.enabled,\n\t\t);\n\n\t\t// Create runner configuration\n\t\tconst engineRunnerConfig: EngineRunnerConfig = {\n\t\t\tversion: config.runner.version,\n\t\t\tendpoint: getEndpoint(config),\n\t\t\ttoken,\n\t\t\tnamespace: config.namespace,\n\t\t\ttotalSlots: config.runner.totalSlots,\n\t\t\trunnerName: config.runner.runnerName,\n\t\t\trunnerKey: config.runner.runnerKey ?? crypto.randomUUID(),\n\t\t\tmetadata: {\n\t\t\t\trivetkit: { version: VERSION },\n\t\t\t},\n\t\t\tprepopulateActorNames: buildActorNames(config),\n\t\t\tonConnected: () => {\n\t\t\t\tthis.#runnerStarted.resolve(undefined);\n\t\t\t},\n\t\t\tonDisconnected: (_code, _reason) => {},\n\t\t\tonShutdown: () => {\n\t\t\t\tthis.#runnerStopped.resolve(undefined);\n\t\t\t\tthis.#isRunnerStopped = true;\n\t\t\t},\n\t\t\tfetch: this.#runnerFetch.bind(this),\n\t\t\twebsocket: this.#runnerWebSocket.bind(this),\n\t\t\thibernatableWebSocket: {\n\t\t\t\tcanHibernate: this.#hwsCanHibernate.bind(this),\n\t\t\t},\n\t\t\tonActorStart: this.#runnerOnActorStart.bind(this),\n\t\t\tonActorStop: this.#runnerOnActorStop.bind(this),\n\t\t\tlogger: getLogger(\"engine-runner\"),\n\t\t};\n\n\t\t// Create and start runner\n\t\tthis.#runner = new Runner(engineRunnerConfig);\n\t\tthis.#runner.start();\n\t\tlogger().debug({\n\t\t\tmsg: \"engine runner started\",\n\t\t\tendpoint: config.endpoint,\n\t\t\tnamespace: config.namespace,\n\t\t\trunnerName: config.runner.runnerName,\n\t\t});\n\t}\n\n\tgetExtraActorLogParams(): Record<string, string> {\n\t\treturn { runnerId: this.#runner.runnerId ?? \"-\" };\n\t}\n\n\tasync #loadActorHandler(actorId: string): Promise<ActorHandler> {\n\t\t// Check if actor is already loaded\n\t\tconst handler = this.#actors.get(actorId);\n\t\tif (!handler)\n\t\t\tthrow new Error(`Actor handler does not exist ${actorId}`);\n\t\tif (handler.actorStartPromise) await handler.actorStartPromise.promise;\n\t\tif (!handler.actor) throw new Error(\"Actor should be loaded\");\n\t\treturn handler;\n\t}\n\n\tgetContext(actorId: string): DriverContext {\n\t\treturn {};\n\t}\n\n\tasync setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {\n\t\tconst handler = this.#actors.get(actor.id);\n\t\tif (!handler) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"no handler for actor to set alarm\",\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear prev timeout\n\t\tif (handler.alarmTimeout) {\n\t\t\thandler.alarmTimeout.abort();\n\t\t\thandler.alarmTimeout = undefined;\n\t\t}\n\n\t\t// Set alarm\n\t\tconst delay = Math.max(0, timestamp - Date.now());\n\t\thandler.alarmTimeout = setLongTimeout(() => {\n\t\t\tactor.onAlarm();\n\t\t\thandler.alarmTimeout = undefined;\n\t\t}, delay);\n\n\t\t// TODO: This call may not be needed on ActorInstance.start, but it does help ensure that the local state is synced with the alarm state\n\t\t// Set alarm on Rivet\n\t\t//\n\t\t// This does not call an \"alarm\" event like Durable Objects.\n\t\t// Instead, it just wakes the actor on the alarm (if not\n\t\t// already awake).\n\t\t//\n\t\t// onAlarm is automatically called on `ActorInstance.start` when waking\n\t\t// again.\n\t\tthis.#runner.setAlarm(actor.id, timestamp);\n\t}\n\n\tasync getDatabase(_actorId: string): Promise<unknown | undefined> {\n\t\treturn undefined;\n\t}\n\n\t// MARK: - Batch KV operations\n\tasync kvBatchPut(\n\t\tactorId: string,\n\t\tentries: [Uint8Array, Uint8Array][],\n\t): Promise<void> {\n\t\tawait this.#runner.kvPut(actorId, entries);\n\t}\n\n\tasync kvBatchGet(\n\t\tactorId: string,\n\t\tkeys: Uint8Array[],\n\t): Promise<(Uint8Array | null)[]> {\n\t\treturn await this.#runner.kvGet(actorId, keys);\n\t}\n\n\tasync kvBatchDelete(actorId: string, keys: Uint8Array[]): Promise<void> {\n\t\tawait this.#runner.kvDelete(actorId, keys);\n\t}\n\n\tasync kvList(actorId: string): Promise<Uint8Array[]> {\n\t\tconst entries = await this.#runner.kvListPrefix(\n\t\t\tactorId,\n\t\t\tnew Uint8Array(),\n\t\t);\n\t\tconst keys = entries.map(([key]) => key);\n\t\tlogger().info({\n\t\t\tmsg: \"kvList called\",\n\t\t\tactorId,\n\t\t\tkeysCount: keys.length,\n\t\t\tkeys: keys.map((k) => new TextDecoder().decode(k)),\n\t\t});\n\t\treturn keys;\n\t}\n\n\tasync kvListPrefix(\n\t\tactorId: string,\n\t\tprefix: Uint8Array,\n\t): Promise<[Uint8Array, Uint8Array][]> {\n\t\tconst result = await this.#runner.kvListPrefix(actorId, prefix);\n\t\tlogger().info({\n\t\t\tmsg: \"kvListPrefix called\",\n\t\t\tactorId,\n\t\t\tprefixStr: new TextDecoder().decode(prefix),\n\t\t\tentriesCount: result.length,\n\t\t\tkeys: result.map(([key]) => new TextDecoder().decode(key)),\n\t\t});\n\t\treturn result;\n\t}\n\n\t// MARK: - Actor Lifecycle\n\tasync loadActor(actorId: string): Promise<AnyActorInstance> {\n\t\tconst handler = await this.#loadActorHandler(actorId);\n\t\tif (!handler.actor) throw new Error(`Actor ${actorId} failed to load`);\n\t\treturn handler.actor;\n\t}\n\n\tstartSleep(actorId: string) {\n\t\t// HACK: Track intent for onActorStop (see RVT-5284)\n\t\tthis.#actorStopIntent.set(actorId, \"sleep\");\n\t\tthis.#runner.sleepActor(actorId);\n\t}\n\n\tstartDestroy(actorId: string) {\n\t\t// HACK: Track intent for onActorStop (see RVT-5284)\n\t\tthis.#actorStopIntent.set(actorId, \"destroy\");\n\t\tthis.#runner.stopActor(actorId);\n\t}\n\n\tasync shutdownRunner(immediate: boolean): Promise<void> {\n\t\tlogger().info({ msg: \"stopping engine actor driver\", immediate });\n\n\t\t// TODO: We need to update the runner to have a draining state so:\n\t\t// 1. Send ToServerDraining\n\t\t//\t\t- This causes Pegboard to stop allocating actors to this runner\n\t\t// 2. Pegboard sends ToClientStopActor for all actors on this runner which handles the graceful migration of each actor independently\n\t\t// 3. Send ToServerStopping once all actors have successfully stopped\n\t\t//\n\t\t// What's happening right now is:\n\t\t// 1. All actors enter stopped state\n\t\t// 2. Actors still respond to requests because only RivetKit knows it's\n\t\t// stopping, this causes all requests to issue errors that the actor is\n\t\t// stopping. (This will NOT return a 503 bc the runner has no idea the\n\t\t// actors are stopping.)\n\t\t// 3. Once the last actor stops, then the runner finally stops + actors\n\t\t// reschedule\n\t\t//\n\t\t// This means that:\n\t\t// - All actors on this runner are bricked until the slowest onStop finishes\n\t\t// - Guard will not gracefully handle requests bc it's not receiving a 503\n\t\t// - Actors can still be scheduled to this runner while the other\n\t\t// actors are stopping, meaning that those actors will NOT get onStop\n\t\t// and will potentiall corrupt their state\n\t\t//\n\t\t// HACK: Stop all actors to allow state to be saved\n\t\t// NOTE: onStop is only supposed to be called by the runner, we're\n\t\t// abusing it here\n\t\tlogger().debug({\n\t\t\tmsg: \"stopping all actors before shutdown\",\n\t\t\tactorCount: this.#actors.size,\n\t\t});\n\t\tconst stopPromises: Promise<void>[] = [];\n\t\tfor (const [_actorId, handler] of this.#actors.entries()) {\n\t\t\tif (handler.actor) {\n\t\t\t\tstopPromises.push(\n\t\t\t\t\thandler.actor.onStop(\"sleep\").catch((err) => {\n\t\t\t\t\t\thandler.actor?.rLog.error({\n\t\t\t\t\t\t\tmsg: \"onStop errored\",\n\t\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tawait Promise.all(stopPromises);\n\t\tlogger().debug({ msg: \"all actors stopped\" });\n\n\t\tawait this.#runner.shutdown(immediate);\n\t}\n\n\tasync serverlessHandleStart(c: HonoContext): Promise<Response> {\n\t\treturn streamSSE(c, async (stream) => {\n\t\t\t// NOTE: onAbort does not work reliably\n\t\t\tstream.onAbort(() => {});\n\t\t\tc.req.raw.signal.addEventListener(\"abort\", () => {\n\t\t\t\tlogger().debug(\"SSE aborted, shutting down runner\");\n\n\t\t\t\t// We cannot assume that the request will always be closed gracefully by Rivet. We always proceed with a graceful shutdown in case the request was terminated for any other reason.\n\t\t\t\t//\n\t\t\t\t// If we did not use a graceful shutdown, the runner would\n\t\t\t\tthis.shutdownRunner(false);\n\t\t\t});\n\n\t\t\tawait this.#runnerStarted.promise;\n\n\t\t\t// Runner id should be set if the runner started\n\t\t\tconst payload = this.#runner.getServerlessInitPacket();\n\t\t\tinvariant(payload, \"runnerId not set\");\n\t\t\tawait stream.writeSSE({ data: payload });\n\n\t\t\t// Send ping every second to keep the connection alive\n\t\t\twhile (true) {\n\t\t\t\tif (this.#isRunnerStopped) {\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"runner is stopped\",\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (stream.closed || stream.aborted) {\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"runner sse stream closed\",\n\t\t\t\t\t\tclosed: stream.closed,\n\t\t\t\t\t\taborted: stream.aborted,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tawait stream.writeSSE({ event: \"ping\", data: \"\" });\n\t\t\t\tawait stream.sleep(RUNNER_SSE_PING_INTERVAL);\n\t\t\t}\n\n\t\t\t// Wait for the runner to stop if the SSE stream aborted early for any reason\n\t\t\tawait this.#runnerStopped.promise;\n\t\t});\n\t}\n\n\tasync #runnerOnActorStart(\n\t\tactorId: string,\n\t\tgeneration: number,\n\t\tactorConfig: EngineActorConfig,\n\t): Promise<void> {\n\t\tlogger().debug({\n\t\t\tmsg: \"runner actor starting\",\n\t\t\tactorId,\n\t\t\tname: actorConfig.name,\n\t\t\tkey: actorConfig.key,\n\t\t\tgeneration,\n\t\t});\n\n\t\t// Deserialize input\n\t\tlet input: any;\n\t\tif (actorConfig.input) {\n\t\t\tinput = cbor.decode(actorConfig.input);\n\t\t}\n\n\t\t// Get or create handler\n\t\tlet handler = this.#actors.get(actorId);\n\t\tif (!handler) {\n\t\t\t// IMPORTANT: We must set the handler in the map synchronously before doing any\n\t\t\t// async operations to avoid race conditions where multiple calls might try to\n\t\t\t// create the same handler simultaneously.\n\t\t\thandler = {\n\t\t\t\tactorStartPromise: promiseWithResolvers(),\n\t\t\t};\n\t\t\tthis.#actors.set(actorId, handler);\n\t\t}\n\n\t\tconst name = actorConfig.name as string;\n\t\tinvariant(actorConfig.key, \"actor should have a key\");\n\t\tconst key = deserializeActorKey(actorConfig.key);\n\n\t\t// Initialize storage\n\t\tconst [persistDataBuffer] = await this.#runner.kvGet(actorId, [\n\t\t\tKEYS.PERSIST_DATA,\n\t\t]);\n\t\tif (persistDataBuffer === null) {\n\t\t\tconst initialKvState = getInitialActorKvState(input);\n\t\t\tawait this.#runner.kvPut(actorId, initialKvState);\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"initialized persist data for new actor\",\n\t\t\t\tactorId,\n\t\t\t});\n\t\t} else {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"found existing persist data for actor\",\n\t\t\t\tactorId,\n\t\t\t\tdataSize: persistDataBuffer.byteLength,\n\t\t\t});\n\t\t}\n\n\t\t// Create actor instance\n\t\tconst definition = lookupInRegistry(this.#config, actorConfig.name);\n\t\thandler.actor = definition.instantiate();\n\n\t\t// Start actor\n\t\tawait handler.actor.start(\n\t\t\tthis,\n\t\t\tthis.#inlineClient,\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t\t\"unknown\", // TODO: Add regions\n\t\t);\n\n\t\tlogger().debug({ msg: \"runner actor started\", actorId, name, key });\n\t}\n\n\tasync #runnerOnActorStop(\n\t\tactorId: string,\n\t\tgeneration: number,\n\t): Promise<void> {\n\t\tlogger().debug({ msg: \"runner actor stopping\", actorId, generation });\n\n\t\t// HACK: Retrieve the stop intent we tracked locally (see RVT-5284)\n\t\t// Default to \"sleep\" if no intent was recorded (e.g., if the runner\n\t\t// initiated the stop)\n\t\t//\n\t\t// TODO: This will not work if the actor is destroyed from the API\n\t\t// correctly. Currently, it will use the sleep intent, but it's\n\t\t// actually a destroy intent.\n\t\tconst reason = this.#actorStopIntent.get(actorId) ?? \"sleep\";\n\t\tthis.#actorStopIntent.delete(actorId);\n\n\t\tconst handler = this.#actors.get(actorId);\n\t\tif (handler?.actor) {\n\t\t\ttry {\n\t\t\t\tawait handler.actor.onStop(reason);\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"error in onStop, proceeding with removing actor\",\n\t\t\t\t\terr: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.#actors.delete(actorId);\n\t\t}\n\n\t\tlogger().debug({ msg: \"runner actor stopped\", actorId, reason });\n\t}\n\n\t// MARK: - Runner Networking\n\tasync #runnerFetch(\n\t\t_runner: Runner,\n\t\tactorId: string,\n\t\t_gatewayIdBuf: ArrayBuffer,\n\t\t_requestIdBuf: ArrayBuffer,\n\t\trequest: Request,\n\t): Promise<Response> {\n\t\tlogger().debug({\n\t\t\tmsg: \"runner fetch\",\n\t\t\tactorId,\n\t\t\turl: request.url,\n\t\t\tmethod: request.method,\n\t\t});\n\t\treturn await this.#actorRouter.fetch(request, { actorId });\n\t}\n\n\tasync #runnerWebSocket(\n\t\t_runner: Runner,\n\t\tactorId: string,\n\t\twebsocketRaw: any,\n\t\tgatewayIdBuf: ArrayBuffer,\n\t\trequestIdBuf: ArrayBuffer,\n\t\trequest: Request,\n\t\trequestPath: string,\n\t\trequestHeaders: Record<string, string>,\n\t\tisHibernatable: boolean,\n\t\tisRestoringHibernatable: boolean,\n\t): Promise<void> {\n\t\tconst websocket = websocketRaw as UniversalWebSocket;\n\n\t\t// Add a unique ID to track this WebSocket object\n\t\tconst wsUniqueId = `ws_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\t\t(websocket as any).__rivet_ws_id = wsUniqueId;\n\n\t\tlogger().debug({\n\t\t\tmsg: \"runner websocket\",\n\t\t\tactorId,\n\t\t\turl: request.url,\n\t\t\tisRestoringHibernatable,\n\t\t\twebsocketObjectId: websocketRaw\n\t\t\t\t? Object.prototype.toString.call(websocketRaw)\n\t\t\t\t: \"null\",\n\t\t\twebsocketType: websocketRaw?.constructor?.name,\n\t\t\twsUniqueId,\n\t\t\twebsocketProps: websocketRaw\n\t\t\t\t? Object.keys(websocketRaw).join(\", \")\n\t\t\t\t: \"null\",\n\t\t});\n\n\t\t// Parse configuration from Sec-WebSocket-Protocol header (optional for path-based routing)\n\t\tconst protocols = request.headers.get(\"sec-websocket-protocol\");\n\t\tconst { encoding, connParams } = parseWebSocketProtocols(protocols);\n\n\t\t// Fetch WS handler\n\t\t//\n\t\t// We store the promise since we need to add WebSocket event listeners immediately that will wait for the promise to resolve\n\t\tlet wsHandler: UpgradeWebSocketArgs;\n\t\ttry {\n\t\t\twsHandler = await routeWebSocket(\n\t\t\t\trequest,\n\t\t\t\trequestPath,\n\t\t\t\trequestHeaders,\n\t\t\t\tthis.#config,\n\t\t\t\tthis,\n\t\t\t\tactorId,\n\t\t\t\tencoding,\n\t\t\t\tconnParams,\n\t\t\t\tgatewayIdBuf,\n\t\t\t\trequestIdBuf,\n\t\t\t\tisHibernatable,\n\t\t\t\tisRestoringHibernatable,\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tlogger().error({ msg: \"building websocket handlers errored\", err });\n\t\t\twebsocketRaw.close(1011, \"ws.route_error\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Connect the Hono WS hook to the adapter\n\t\t//\n\t\t// We need to assign to `raw` in order for WSContext to expose it on\n\t\t// `ws.raw`\n\t\t(websocket as WSContextInit).raw = websocket;\n\t\tconst wsContext = new WSContext(websocket);\n\n\t\t// Get connection and actor from wsHandler (may be undefined for inspector endpoint)\n\t\tconst conn = wsHandler.conn;\n\t\tconst actor = wsHandler.actor;\n\t\tconst connStateManager = conn?.[CONN_STATE_MANAGER_SYMBOL];\n\n\t\t// Bind event listeners to Hono WebSocket handlers\n\t\t//\n\t\t// We update the HWS data after calling handlers in order to ensure\n\t\t// that the handler ran successfully. By doing this, we ensure at least\n\t\t// once delivery of events to the event handlers.\n\n\t\t// Log when attaching event listeners\n\t\tlogger().debug({\n\t\t\tmsg: \"attaching websocket event listeners\",\n\t\t\tactorId,\n\t\t\tconnId: conn?.id,\n\t\t\twsUniqueId: (websocket as any).__rivet_ws_id,\n\t\t\tisRestoringHibernatable,\n\t\t\twebsocketType: websocket?.constructor?.name,\n\t\t});\n\n\t\tif (isRestoringHibernatable) {\n\t\t\twsHandler.onRestore?.(wsContext);\n\t\t}\n\n\t\twebsocket.addEventListener(\"open\", (event) => {\n\t\t\twsHandler.onOpen(event, wsContext);\n\t\t});\n\n\t\twebsocket.addEventListener(\"message\", (event: RivetMessageEvent) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"websocket message event listener triggered\",\n\t\t\t\tconnId: conn?.id,\n\t\t\t\tactorId: actor?.id,\n\t\t\t\tmessageIndex: event.rivetMessageIndex,\n\t\t\t\thasWsHandler: !!wsHandler,\n\t\t\t\thasOnMessage: !!wsHandler?.onMessage,\n\t\t\t\tactorIsStopping: actor?.isStopping,\n\t\t\t\twebsocketType: websocket?.constructor?.name,\n\t\t\t\twsUniqueId: (websocket as any).__rivet_ws_id,\n\t\t\t\teventTargetWsId: (event.target as any)?.__rivet_ws_id,\n\t\t\t});\n\n\t\t\t// Check if actor is stopping - if so, don't process new messages.\n\t\t\t// These messages will be reprocessed when the actor wakes up from hibernation.\n\t\t\t// TODO: This will never retransmit the socket and the socket will close\n\t\t\tif (actor?.isStopping) {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"ignoring ws message, actor is stopping\",\n\t\t\t\t\tconnId: conn?.id,\n\t\t\t\t\tactorId: actor?.id,\n\t\t\t\t\tmessageIndex: event.rivetMessageIndex,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Process message\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"calling wsHandler.onMessage\",\n\t\t\t\tconnId: conn?.id,\n\t\t\t\tmessageIndex: event.rivetMessageIndex,\n\t\t\t});\n\t\t\twsHandler.onMessage(event, wsContext);\n\n\t\t\t// Persist message index for hibernatable connections\n\t\t\tconst hibernate = connStateManager?.hibernatableData;\n\n\t\t\tif (hibernate && conn && actor) {\n\t\t\t\tinvariant(\n\t\t\t\t\ttypeof event.rivetMessageIndex === \"number\",\n\t\t\t\t\t\"missing event.rivetMessageIndex\",\n\t\t\t\t);\n\n\t\t\t\t// Persist message index\n\t\t\t\tconst previousMsgIndex = hibernate.serverMessageIndex;\n\t\t\t\thibernate.serverMessageIndex = event.rivetMessageIndex;\n\t\t\t\tlogger().info({\n\t\t\t\t\tmsg: \"persisting message index\",\n\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\tpreviousMsgIndex,\n\t\t\t\t\tnewMsgIndex: event.rivetMessageIndex,\n\t\t\t\t});\n\n\t\t\t\t// Calculate message size and track cumulative size\n\t\t\t\tconst entry = this.#hwsMessageIndex.get(conn.id);\n\t\t\t\tif (entry) {\n\t\t\t\t\t// Track message length\n\t\t\t\t\tconst messageLength = getValueLength(event.data);\n\t\t\t\t\tentry.bufferedMessageSize += messageLength;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tentry.bufferedMessageSize >=\n\t\t\t\t\t\tCONN_BUFFERED_MESSAGE_SIZE_THRESHOLD\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Reset buffered message size immeidatley (instead\n\t\t\t\t\t\t// of waiting for onAfterPersistConn) since we may\n\t\t\t\t\t\t// receive more messages before onAfterPersistConn\n\t\t\t\t\t\t// is called, which would called saveState\n\t\t\t\t\t\t// immediate multiple times\n\t\t\t\t\t\tentry.bufferedMessageSize = 0;\n\t\t\t\t\t\tentry.pendingAckFromBufferSize = true;\n\n\t\t\t\t\t\t// Save state immediately if approaching buffer threshold\n\t\t\t\t\t\tactor.stateManager.saveState({\n\t\t\t\t\t\t\timmediate: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Save message index. The maxWait is set to the ack deadline\n\t\t\t\t\t\t// since we ack the message immediately after persisting the index.\n\t\t\t\t\t\t// If cumulative size exceeds threshold, force immediate persist.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// This will call EngineActorDriver.onAfterPersistConn after\n\t\t\t\t\t\t// persist to send the ack to the gateway.\n\t\t\t\t\t\tactor.stateManager.saveState({\n\t\t\t\t\t\t\tmaxWait: CONN_MESSAGE_ACK_DEADLINE,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Fallback if entry missing\n\t\t\t\t\tactor.stateManager.saveState({\n\t\t\t\t\t\tmaxWait: CONN_MESSAGE_ACK_DEADLINE,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\twebsocket.addEventListener(\"close\", (event) => {\n\t\t\twsHandler.onClose(event, wsContext);\n\n\t\t\t// NOTE: Persisted connection is removed when `conn.disconnect`\n\t\t\t// is called by the WebSocket route\n\t\t});\n\n\t\twebsocket.addEventListener(\"error\", (event) => {\n\t\t\twsHandler.onError(event, wsContext);\n\t\t});\n\n\t\t// Log event listener attachment for restored connections\n\t\tif (isRestoringHibernatable) {\n\t\t\tlogger().info({\n\t\t\t\tmsg: \"event listeners attached to restored websocket\",\n\t\t\t\tactorId,\n\t\t\t\tconnId: conn?.id,\n\t\t\t\tgatewayId: idToStr(gatewayIdBuf),\n\t\t\t\trequestId: idToStr(requestIdBuf),\n\t\t\t\twebsocketType: websocket?.constructor?.name,\n\t\t\t\thasMessageListener: !!websocket.addEventListener,\n\t\t\t});\n\t\t}\n\t}\n\n\t// MARK: - Hibernating WebSockets\n\t#hwsCanHibernate(\n\t\tactorId: string,\n\t\tgatewayId: ArrayBuffer,\n\t\trequestId: ArrayBuffer,\n\t\trequest: Request,\n\t): boolean {\n\t\tconst url = new URL(request.url);\n\t\tconst path = url.pathname;\n\n\t\t// Get actor instance from runner to access actor name\n\t\tconst actorInstance = this.#runner.getActor(actorId);\n\t\tif (!actorInstance) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"actor not found in #hwsCanHibernate\",\n\t\t\t\tactorId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\n\t\t// Load actor handler to access persisted data\n\t\tconst handler = this.#actors.get(actorId);\n\t\tif (!handler) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"actor handler not found in #hwsCanHibernate\",\n\t\t\t\tactorId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t\tif (!handler.actor) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"actor not found in #hwsCanHibernate\",\n\t\t\t\tactorId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\n\t\t// Determine configuration for new WS\n\t\tlogger().debug({\n\t\t\tmsg: \"no existing hibernatable websocket found\",\n\t\t\tgatewayId: idToStr(gatewayId),\n\t\t\trequestId: idToStr(requestId),\n\t\t});\n\t\tif (path === PATH_CONNECT) {\n\t\t\treturn true;\n\t\t} else if (\n\t\t\tpath === PATH_WEBSOCKET_BASE ||\n\t\t\tpath.startsWith(PATH_WEBSOCKET_PREFIX)\n\t\t) {\n\t\t\t// Find actor config\n\t\t\tconst definition = lookupInRegistry(\n\t\t\t\tthis.#config,\n\t\t\t\tactorInstance.config.name,\n\t\t\t);\n\n\t\t\t// Check if can hibernate\n\t\t\tconst canHibernateWebSocket =\n\t\t\t\tdefinition.config.options?.canHibernateWebSocket;\n\t\t\tif (canHibernateWebSocket === true) {\n\t\t\t\treturn true;\n\t\t\t} else if (typeof canHibernateWebSocket === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\t// Truncate the path to match the behavior on onRawWebSocket\n\t\t\t\t\tconst newPath = truncateRawWebSocketPathPrefix(\n\t\t\t\t\t\turl.pathname,\n\t\t\t\t\t);\n\t\t\t\t\tconst truncatedRequest = new Request(\n\t\t\t\t\t\t`http://actor${newPath}`,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst canHibernate =\n\t\t\t\t\t\tcanHibernateWebSocket(truncatedRequest);\n\t\t\t\t\treturn canHibernate;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error calling canHibernateWebSocket\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (path === PATH_INSPECTOR_CONNECT) {\n\t\t\treturn false;\n\t\t} else {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"unexpected path for getActorHibernationConfig\",\n\t\t\t\tpath,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync #hwsLoadAll(\n\t\tactorId: string,\n\t): Promise<HibernatingWebSocketMetadata[]> {\n\t\tconst actor = await this.loadActor(actorId);\n\t\treturn actor.conns\n\t\t\t.values()\n\t\t\t.map((conn) => {\n\t\t\t\tconst connStateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\t\tconst hibernatable = connStateManager.hibernatableData;\n\t\t\t\tif (!hibernatable) return undefined;\n\t\t\t\treturn {\n\t\t\t\t\tgatewayId: hibernatable.gatewayId,\n\t\t\t\t\trequestId: hibernatable.requestId,\n\t\t\t\t\tserverMessageIndex: hibernatable.serverMessageIndex,\n\t\t\t\t\tclientMessageIndex: hibernatable.clientMessageIndex,\n\t\t\t\t\tpath: hibernatable.requestPath,\n\t\t\t\t\theaders: hibernatable.requestHeaders,\n\t\t\t\t} satisfies HibernatingWebSocketMetadata;\n\t\t\t})\n\t\t\t.filter((x) => x !== undefined)\n\t\t\t.toArray();\n\t}\n\n\tasync onBeforeActorStart(actor: AnyActorInstance): Promise<void> {\n\t\t// Resolve promise if waiting\n\t\tconst handler = this.#actors.get(actor.id);\n\t\tinvariant(handler, \"missing actor handler in onBeforeActorReady\");\n\t\thandler.actorStartPromise?.resolve();\n\t\thandler.actorStartPromise = undefined;\n\n\t\t// Restore hibernating requests\n\t\tconst metaEntries = await this.#hwsLoadAll(actor.id);\n\t\tawait this.#runner.restoreHibernatingRequests(actor.id, metaEntries);\n\t}\n\n\tonCreateConn(conn: AnyConn) {\n\t\tconst hibernatable = conn[CONN_STATE_MANAGER_SYMBOL].hibernatableData;\n\t\tif (!hibernatable) return;\n\n\t\tthis.#hwsMessageIndex.set(conn.id, {\n\t\t\tserverMessageIndex: hibernatable.serverMessageIndex,\n\t\t\tbufferedMessageSize: 0,\n\t\t\tpendingAckFromMessageIndex: false,\n\t\t\tpendingAckFromBufferSize: false,\n\t\t});\n\n\t\tlogger().debug({\n\t\t\tmsg: \"created #hwsMessageIndex entry\",\n\t\t\tconnId: conn.id,\n\t\t\tserverMessageIndex: hibernatable.serverMessageIndex,\n\t\t});\n\t}\n\n\tonDestroyConn(conn: AnyConn) {\n\t\tthis.#hwsMessageIndex.delete(conn.id);\n\n\t\tlogger().debug({\n\t\t\tmsg: \"removed #hwsMessageIndex entry\",\n\t\t\tconnId: conn.id,\n\t\t});\n\t}\n\n\tonBeforePersistConn(conn: AnyConn) {\n\t\tconst stateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\tconst hibernatable = stateManager.hibernatableDataOrError();\n\n\t\tconst entry = this.#hwsMessageIndex.get(conn.id);\n\t\tif (!entry) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"missing EngineActorDriver.#hwsMessageIndex entry for conn\",\n\t\t\t\tconnId: conn.id,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// There is a newer message index\n\t\tentry.pendingAckFromMessageIndex =\n\t\t\thibernatable.serverMessageIndex > entry.serverMessageIndex;\n\t\tentry.serverMessageIndex = hibernatable.serverMessageIndex;\n\t}\n\n\tonAfterPersistConn(conn: AnyConn) {\n\t\tconst stateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\tconst hibernatable = stateManager.hibernatableDataOrError();\n\n\t\tconst entry = this.#hwsMessageIndex.get(conn.id);\n\t\tif (!entry) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"missing EngineActorDriver.#hwsMessageIndex entry for conn\",\n\t\t\t\tconnId: conn.id,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Ack entry\n\t\tif (\n\t\t\tentry.pendingAckFromMessageIndex ||\n\t\t\tentry.pendingAckFromBufferSize\n\t\t) {\n\t\t\tthis.#runner.sendHibernatableWebSocketMessageAck(\n\t\t\t\thibernatable.gatewayId,\n\t\t\t\thibernatable.requestId,\n\t\t\t\tentry.serverMessageIndex,\n\t\t\t);\n\t\t\tentry.pendingAckFromMessageIndex = false;\n\t\t\tentry.pendingAckFromBufferSize = false;\n\t\t\tentry.bufferedMessageSize = 0;\n\t\t}\n\t}\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"driver-engine\");\n}\n","import { z } from \"zod\";\nimport {\n\tClientConfigSchemaBase,\n\ttransformClientConfig,\n} from \"@/client/config\";\nimport { getRivetRunnerKey } from \"@/utils/env-vars\";\n\n/**\n * Base engine config schema without transforms so it can be merged in to other schemas.\n *\n * We include the client config since this includes the common properties like endpoint, namespace, etc.\n */\nexport const EngineConfigSchemaBase = ClientConfigSchemaBase.extend({\n\t/** Unique key for this runner. Runners connecting a given key will replace any other runner connected with the same key. */\n\trunnerKey: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetRunnerKey()),\n\n\t/** How many actors this runner can run. */\n\ttotalSlots: z.number().default(100_000),\n});\n\nconst EngineConfigSchemaTransformed = EngineConfigSchemaBase.transform(\n\t(config, ctx) => transformEngineConfig(config, ctx),\n);\n\nexport const EngineConfigSchema = EngineConfigSchemaTransformed.default(() =>\n\tEngineConfigSchemaTransformed.parse({}),\n);\n\nexport type EngineConfig = z.infer<typeof EngineConfigSchema>;\nexport type EngineConfigInput = z.input<typeof EngineConfigSchema>;\n\nexport function transformEngineConfig(\n\tconfig: z.infer<typeof EngineConfigSchemaBase>,\n\tctx: z.RefinementCtx,\n) {\n\treturn {\n\t\t...transformClientConfig(config, ctx),\n\t\trunnerKey: config.runnerKey,\n\t};\n}\n","import type { Client } from \"@/client/client\";\nimport { convertRegistryConfigToClientConfig } from \"@/client/config\";\nimport type { ManagerDriver } from \"@/manager/driver\";\nimport { RemoteManagerDriver } from \"@/remote-manager-driver/mod\";\nimport { EngineActorDriver } from \"./actor-driver\";\nimport { RegistryConfig, DriverConfig } from \"@/registry/config\";\n\nexport { EngineActorDriver } from \"./actor-driver\";\nexport {\n\ttype EngineConfig as Config,\n\ttype EngineConfigInput as InputConfig,\n\tEngineConfigSchema as ConfigSchema,\n} from \"./config\";\n\nexport function createEngineDriver(): DriverConfig {\n\treturn {\n\t\tname: \"engine\",\n\t\tdisplayName: \"Engine\",\n\t\tmanager: (config: RegistryConfig) => {\n\t\t\tconst clientConfig = convertRegistryConfigToClientConfig(config);\n\t\t\treturn new RemoteManagerDriver(clientConfig);\n\t\t},\n\t\tactor: (\n\t\t\tconfig: RegistryConfig,\n\t\t\tmanagerDriver: ManagerDriver,\n\t\t\tinlineClient: Client<any>,\n\t\t) => {\n\t\t\treturn new EngineActorDriver(\n\t\t\t\tconfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tinlineClient,\n\t\t\t);\n\t\t},\n\t\tautoStartActorDriver: true,\n\t};\n}\n","import type { Logger } from \"pino\";\nimport { z } from \"zod\";\nimport type { ActorDriverBuilder } from \"@/actor/driver\";\nimport { LogLevelSchema } from \"@/common/log\";\nimport {\n\tEngineConfigSchemaBase,\n\ttransformEngineConfig,\n} from \"@/drivers/engine/config\";\nimport { InspectorConfigSchema } from \"@/inspector/config\";\nimport type { ManagerDriverBuilder } from \"@/manager/driver\";\nimport type { GetUpgradeWebSocket } from \"@/utils\";\nimport { getEnvUniversal, VERSION } from \"@/utils\";\nimport {\n\tgetRivetRunEngine,\n\tgetRivetRunEngineVersion,\n\tgetRivetRunnerKind,\n\tgetRivetToken,\n} from \"@/utils/env-vars\";\n\nexport const LegacyDriverConfigSchema = z.object({\n\t/** Machine-readable name to identify this driver by. */\n\tname: z.string(),\n\tmanager: z.custom<ManagerDriverBuilder>(),\n\tactor: z.custom<ActorDriverBuilder>(),\n});\n\nexport type LegacyDriverConfig = z.infer<typeof LegacyDriverConfigSchema>;\n\n/** Base config used for the actor config across all platforms. */\nconst LegacyRunnerConfigSchemaUnmerged = z\n\t.object({\n\t\tdriver: LegacyDriverConfigSchema.optional(),\n\n\t\t/** @experimental */\n\t\tmaxIncomingMessageSize: z.number().optional().default(65_536),\n\n\t\t/** @experimental */\n\t\tmaxOutgoingMessageSize: z.number().optional().default(1_048_576),\n\n\t\t/** @experimental */\n\t\tinspector: InspectorConfigSchema,\n\n\t\t/** @experimental */\n\t\tdisableDefaultServer: z.boolean().optional().default(false),\n\n\t\t/** @experimental */\n\t\tdefaultServerPort: z.number().default(6420),\n\n\t\t/** @experimental */\n\t\trunEngine: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.default(() => getRivetRunEngine()),\n\n\t\t/** @experimental */\n\t\trunEngineVersion: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.default(() => getRivetRunEngineVersion() ?? VERSION),\n\n\t\t/** @experimental */\n\t\toverrideServerAddress: z.string().optional(),\n\n\t\t/** @experimental */\n\t\tdisableActorDriver: z.boolean().optional().default(false),\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Whether to run runners normally or have them managed\n\t\t * serverlessly (by the Rivet Engine for example).\n\t\t */\n\t\trunnerKind: z\n\t\t\t.enum([\"serverless\", \"normal\"])\n\t\t\t.optional()\n\t\t\t.default(() =>\n\t\t\t\tgetRivetRunnerKind() === \"serverless\" ? \"serverless\" : \"normal\",\n\t\t\t),\n\t\ttotalSlots: z.number().optional(),\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Base path for the router. This is used to prefix all routes.\n\t\t * For example, if the base path is `/api`, then the route `/actors` will be\n\t\t * available at `/api/actors`.\n\t\t */\n\t\tbasePath: z.string().optional().default(\"/\"),\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Disable welcome message.\n\t\t * */\n\t\tnoWelcome: z.boolean().optional().default(false),\n\n\t\t/**\n\t\t * @experimental\n\t\t * */\n\t\tlogging: z\n\t\t\t.object({\n\t\t\t\tbaseLogger: z.custom<Logger>().optional(),\n\t\t\t\tlevel: LogLevelSchema.optional(),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.default(() => ({})),\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Automatically configure serverless runners in the engine.\n\t\t * Can only be used when runnerKind is \"serverless\".\n\t\t * If true, uses default configuration. Can also provide custom configuration.\n\t\t */\n\t\tautoConfigureServerless: z\n\t\t\t.union([\n\t\t\t\tz.boolean(),\n\t\t\t\tz.object({\n\t\t\t\t\turl: z.string().optional(),\n\t\t\t\t\theaders: z.record(z.string(), z.string()).optional(),\n\t\t\t\t\tmaxRunners: z.number().optional(),\n\t\t\t\t\tminRunners: z.number().optional(),\n\t\t\t\t\trequestLifespan: z.number().optional(),\n\t\t\t\t\trunnersMargin: z.number().optional(),\n\t\t\t\t\tslotsPerRunner: z.number().optional(),\n\t\t\t\t\tmetadata: z.record(z.string(), z.unknown()).optional(),\n\t\t\t\t}),\n\t\t\t])\n\t\t\t.optional(),\n\n\t\t// This is a function to allow for lazy configuration of upgradeWebSocket on the\n\t\t// fly. This is required since the dependencies that upgradeWebSocket\n\t\t// (specifically Node.js) can sometimes only be specified after the router is\n\t\t// created or must be imported async using `await import(...)`\n\t\tgetUpgradeWebSocket: z.custom<GetUpgradeWebSocket>().optional(),\n\n\t\t/** @experimental */\n\t\ttoken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((v) => v || getRivetToken()),\n\t})\n\t.merge(EngineConfigSchemaBase);\n\nconst LegacyRunnerConfigSchemaTransformed =\n\tLegacyRunnerConfigSchemaUnmerged.transform((config, ctx) => ({\n\t\t...config,\n\t\t...transformEngineConfig(config, ctx),\n\t}));\n\nexport const LegacyRunnerConfigSchema =\n\tLegacyRunnerConfigSchemaTransformed.default(() =>\n\t\tLegacyRunnerConfigSchemaTransformed.parse({}),\n\t);\n\nexport type LegacyRunnerConfig = z.infer<typeof LegacyRunnerConfigSchema>;\nexport type LegacyRunnerConfigInput = z.input<typeof LegacyRunnerConfigSchema>;\n","import invariant from \"invariant\";\nimport { createClientWithDriver } from \"@/client/client\";\nimport { configureBaseLogger, configureDefaultLogger } from \"@/common/log\";\nimport { chooseDefaultDriver } from \"@/drivers/default\";\nimport { ENGINE_PORT, ensureEngineProcess } from \"@/engine-process/mod\";\nimport { getInspectorUrl } from \"@/inspector/utils\";\nimport { buildManagerRouter } from \"@/manager/router\";\nimport { configureServerlessRunner } from \"@/serverless/configure\";\nimport type { GetUpgradeWebSocket } from \"@/utils\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport {\n\ttype DriverConfig,\n\ttype RegistryActors,\n\ttype RegistryConfig,\n} from \"@/registry/config\";\nimport { logger } from \"../src/registry/log\";\nimport { crossPlatformServe, findFreePort } from \"@/registry/serve\";\nimport { ManagerDriver } from \"@/manager/driver\";\nimport { buildServerlessRouter } from \"@/serverless/router\";\nimport type { Registry } from \"@/registry\";\n\n/** Tracks whether the runtime was started as serverless or runner. */\nexport type StartKind = \"serverless\" | \"runner\";\n\nfunction logLine(label: string, value: string): void {\n\tconst padding = \" \".repeat(Math.max(0, 13 - label.length));\n\tconsole.log(` - ${label}:${padding}${value}`);\n}\n\n/**\n * Manages the lifecycle of RivetKit.\n *\n * Startup happens in two phases:\n * 1. `Runtime.create()` initializes shared infrastructure like the manager\n * server and engine process. This runs before we know the deployment mode.\n * 2. `startServerless()` or `startRunner()` configures mode-specific behavior.\n * These are idempotent and called lazily when the first request arrives\n * or when explicitly starting a runner.\n */\nexport class Runtime<A extends RegistryActors> {\n\t#registry: Registry<A>;\n\t#config: RegistryConfig;\n\t#driver: DriverConfig;\n\t#managerDriver: ManagerDriver;\n\t#startKind?: StartKind;\n\n\tmanagerPort?: number;\n\t#serverlessRouter?: ReturnType<typeof buildServerlessRouter>[\"router\"];\n\n\tget config() {\n\t\treturn this.#config;\n\t}\n\n\tget driver() {\n\t\treturn this.#driver;\n\t}\n\n\tget managerDriver() {\n\t\treturn this.#managerDriver;\n\t}\n\n\t/** Use Runtime.create() instead */\n\tprivate constructor(\n\t\tregistry: Registry<A>,\n\t\tconfig: RegistryConfig,\n\t\tdriver: DriverConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tmanagerPort?: number,\n\t) {\n\t\tthis.#registry = registry;\n\t\tthis.#config = config;\n\t\tthis.#driver = driver;\n\t\tthis.#managerDriver = managerDriver;\n\t\tthis.managerPort = managerPort;\n\t}\n\n\tstatic async create<A extends RegistryActors>(\n\t\tregistry: Registry<A>,\n\t): Promise<Runtime<A>> {\n\t\tlogger().info(\"rivetkit starting\");\n\n\t\tconst config = registry.parseConfig();\n\n\t\tif (config.logging?.baseLogger) {\n\t\t\tconfigureBaseLogger(config.logging.baseLogger);\n\t\t} else {\n\t\t\tconfigureDefaultLogger(config.logging?.level);\n\t\t}\n\n\t\t// This should be unreachable: Zod defaults serveManager to false when\n\t\t// spawnEngine is enabled (since endpoint gets set to ENGINE_ENDPOINT).\n\t\t// We check anyway as a safety net for explicit misconfiguration.\n\t\tinvariant(\n\t\t\t!(config.serverless.spawnEngine && config.serveManager),\n\t\t\t\"cannot specify both spawnEngine and serveManager\",\n\t\t);\n\n\t\tconst driver = chooseDefaultDriver(config);\n\t\tconst managerDriver = driver.manager(config);\n\n\t\t// Start main server. This is either:\n\t\t// - Manager: Run a server in-process on port 6420 that mimics the\n\t\t// engine's API for development.\n\t\t// - Engine: Download and run the full Rivet engine binary on port\n\t\t// 6420. This is a fallback for platforms that cannot use the manager\n\t\t// like Next.js.\n\t\t//\n\t\t// We do this before startServerless or startRunner has been called\n\t\t// since the engine API needs to be available on port 6420 before\n\t\t// anything else happens. For example, serverless platforms use\n\t\t// `registry.handler(req)` so `startServerless` is called lazily.\n\t\t// Starting the server preemptively allows for clients to reach 6420\n\t\t// BEFORE `startServerless` is called.\n\t\tlet managerPort: number | undefined;\n\t\tif (config.serverless.spawnEngine) {\n\t\t\tmanagerPort = ENGINE_PORT;\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"spawning engine\",\n\t\t\t\tversion: config.serverless.engineVersion,\n\t\t\t});\n\t\t\tawait ensureEngineProcess({\n\t\t\t\tversion: config.serverless.engineVersion,\n\t\t\t});\n\t\t} else if (config.serveManager) {\n\t\t\tlet upgradeWebSocket: any;\n\t\t\tconst getUpgradeWebSocket: GetUpgradeWebSocket = () =>\n\t\t\t\tupgradeWebSocket;\n\t\t\tmanagerDriver.setGetUpgradeWebSocket(getUpgradeWebSocket);\n\n\t\t\tconst { router: managerRouter } = buildManagerRouter(\n\t\t\t\tconfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tgetUpgradeWebSocket,\n\t\t\t);\n\n\t\t\tmanagerPort = await findFreePort(config.managerPort);\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"serving manager\",\n\t\t\t\tport: managerPort,\n\t\t\t});\n\n\t\t\tconst out = await crossPlatformServe(\n\t\t\t\tconfig,\n\t\t\t\tmanagerPort,\n\t\t\t\tmanagerRouter,\n\t\t\t);\n\t\t\tupgradeWebSocket = out.upgradeWebSocket;\n\t\t}\n\n\t\t// Create runtime\n\t\tconst runtime = new Runtime(\n\t\t\tregistry,\n\t\t\tconfig,\n\t\t\tdriver,\n\t\t\tmanagerDriver,\n\t\t\tmanagerPort,\n\t\t);\n\n\t\t// Log ready\n\t\tconst driverLog = managerDriver.extraStartupLog?.() ?? {};\n\t\tlogger().info({\n\t\t\tmsg: \"rivetkit ready\",\n\t\t\tdriver: driver.name,\n\t\t\tdefinitions: Object.keys(config.use).length,\n\t\t\t...driverLog,\n\t\t});\n\n\t\treturn runtime;\n\t}\n\n\tstartServerless(): void {\n\t\tif (this.#startKind === \"serverless\") return;\n\t\tinvariant(!this.#startKind, \"Runtime already started as runner\");\n\t\tthis.#startKind = \"serverless\";\n\n\t\tthis.#serverlessRouter = buildServerlessRouter(\n\t\t\tthis.#driver,\n\t\t\tthis.#config,\n\t\t).router;\n\n\t\tthis.#printWelcome();\n\n\t\tif (this.#config.serverless.configureRunnerPool) {\n\t\t\t// biome-ignore lint/nursery/noFloatingPromises: intentional\n\t\t\tconfigureServerlessRunner(this.#config);\n\t\t}\n\t}\n\n\tstartRunner(): void {\n\t\tif (this.#startKind === \"runner\") return;\n\t\tinvariant(!this.#startKind, \"Runtime already started as serverless\");\n\t\tthis.#startKind = \"runner\";\n\n\t\tif (this.#config.runner && this.#driver.autoStartActorDriver) {\n\t\t\tlogger().debug(\"starting actor driver\");\n\t\t\tconst inlineClient = createClientWithDriver<Registry<A>>(\n\t\t\t\tthis.#managerDriver,\n\t\t\t);\n\t\t\tthis.#driver.actor(this.#config, this.#managerDriver, inlineClient);\n\t\t}\n\n\t\tthis.#printWelcome();\n\t}\n\n\t#printWelcome(): void {\n\t\tif (this.#config.noWelcome) return;\n\n\t\tconst inspectorUrl = this.managerPort\n\t\t\t? getInspectorUrl(this.#config, this.managerPort)\n\t\t\t: undefined;\n\n\t\tconsole.log();\n\t\tconsole.log(\n\t\t\t` RivetKit ${pkg.version} (${this.#driver.displayName} - ${this.#startKind === \"serverless\" ? \"Serverless\" : \"Runner\"})`,\n\t\t);\n\n\t\t// Show namespace\n\t\tif (this.#config.namespace !== \"default\") {\n\t\t\tlogLine(\"Namespace\", this.#config.namespace);\n\t\t}\n\n\t\t// Show backend endpoint (where we connect to engine)\n\t\tif (this.#config.endpoint) {\n\t\t\tconst endpointType = this.#config.serverless.spawnEngine\n\t\t\t\t? \"local native\"\n\t\t\t\t: this.#config.serveManager\n\t\t\t\t\t? \"local manager\"\n\t\t\t\t\t: \"remote\";\n\t\t\tlogLine(\"Endpoint\", `${this.#config.endpoint} (${endpointType})`);\n\t\t}\n\n\t\t// Show public endpoint (where clients connect)\n\t\tif (this.#startKind === \"serverless\" && this.#config.publicEndpoint) {\n\t\t\tlogLine(\"Client\", this.#config.publicEndpoint);\n\t\t}\n\n\t\t// Show inspector\n\t\tif (inspectorUrl && this.#config.inspector.enabled) {\n\t\t\tlogLine(\"Inspector\", inspectorUrl);\n\t\t}\n\n\t\t// Show actor count\n\t\tconst actorCount = Object.keys(this.#config.use).length;\n\t\tlogLine(\"Actors\", actorCount.toString());\n\n\t\t// Show driver-specific info\n\t\tconst displayInfo = this.#managerDriver.displayInformation();\n\t\tfor (const [k, v] of Object.entries(displayInfo.properties)) {\n\t\t\tlogLine(k, v);\n\t\t}\n\n\t\tconsole.log();\n\t}\n\n\t/** Handle serverless request */\n\thandleServerlessRequest(request: Request): Response | Promise<Response> {\n\t\tinvariant(\n\t\t\tthis.#startKind === \"serverless\",\n\t\t\t\"not started as serverless\",\n\t\t);\n\t\tinvariant(this.#serverlessRouter, \"serverless router not initialized\");\n\t\treturn this.#serverlessRouter.fetch(request);\n\t}\n}\n","import { UserError } from \"@/actor/errors\";\nimport { loggerWithoutContext } from \"@/actor/log\";\nimport { createEngineDriver } from \"@/drivers/engine/mod\";\nimport { createFileSystemOrMemoryDriver } from \"@/drivers/file-system/mod\";\nimport { DriverConfig, RegistryConfig } from \"@/registry/config\";\n\n/**\n * Chooses the appropriate driver based on the run configuration.\n */\nexport function chooseDefaultDriver(\n\tconfig: RegistryConfig,\n): DriverConfig {\n\tif (config.endpoint && config.driver) {\n\t\tthrow new UserError(\n\t\t\t\"Cannot specify both 'endpoint' and 'driver' in configuration\",\n\t\t);\n\t}\n\n\tif (config.driver) {\n\t\treturn config.driver;\n\t}\n\n\tif (config.endpoint || config.token) {\n\t\tloggerWithoutContext().debug({\n\t\t\tmsg: \"using rivet engine driver\",\n\t\t\tendpoint: config.endpoint,\n\t\t});\n\t\treturn createEngineDriver();\n\t}\n\n\tloggerWithoutContext().debug({ msg: \"using default file system driver\" });\n\treturn createFileSystemOrMemoryDriver(true);\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"engine-process\");\n}\n","import {\n\tensureDirectoryExists,\n\tgetStoragePath,\n} from \"@/drivers/file-system/utils\";\nimport {\n\tgetNodeChildProcess,\n\tgetNodeCrypto,\n\tgetNodeFs,\n\tgetNodeFsSync,\n\tgetNodePath,\n\tgetNodeStream,\n\timportNodeDependencies,\n} from \"@/utils/node\";\nimport { logger } from \"./log\";\nimport { ENGINE_ENDPOINT, ENGINE_PORT } from \"./constants\";\n\nexport { ENGINE_ENDPOINT, ENGINE_PORT };\n\nconst ENGINE_BASE_URL = \"https://releases.rivet.dev/rivet\";\nconst ENGINE_BINARY_NAME = \"rivet-engine\";\n\ninterface EnsureEngineProcessOptions {\n\tversion: string;\n}\n\nexport async function ensureEngineProcess(\n\toptions: EnsureEngineProcessOptions,\n): Promise<void> {\n\timportNodeDependencies();\n\n\tlogger().debug({\n\t\tmsg: \"ensuring engine process\",\n\t\tversion: options.version,\n\t});\n\n\tconst path = getNodePath();\n\tconst storageRoot = getStoragePath();\n\tconst binDir = path.join(storageRoot, \"bin\");\n\tconst varDir = path.join(storageRoot, \"var\");\n\tconst logsDir = path.join(varDir, \"logs\", \"rivet-engine\");\n\tawait ensureDirectoryExists(binDir);\n\tawait ensureDirectoryExists(varDir);\n\tawait ensureDirectoryExists(logsDir);\n\n\t// Check if the engine is already running on the port before downloading\n\tif (await isEngineRunning()) {\n\t\ttry {\n\t\t\tconst health = await waitForEngineHealth();\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"engine already running and healthy\",\n\t\t\t\tversion: health.version,\n\t\t\t});\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"existing engine process not healthy, cannot restart automatically\",\n\t\t\t\terror,\n\t\t\t});\n\t\t\tthrow new Error(\n\t\t\t\t\"Engine process exists but is not healthy. Please manually stop the process on port 6420 and retry.\",\n\t\t\t);\n\t\t}\n\t}\n\n\tconst executableName =\n\t\tprocess.platform === \"win32\"\n\t\t\t? `${ENGINE_BINARY_NAME}-${options.version}.exe`\n\t\t\t: `${ENGINE_BINARY_NAME}-${options.version}`;\n\tconst binaryPath = path.join(binDir, executableName);\n\tawait downloadEngineBinaryIfNeeded(binaryPath, options.version, varDir);\n\t// Create log file streams with timestamp in the filename\n\tconst timestamp = new Date()\n\t\t.toISOString()\n\t\t.replace(/:/g, \"-\")\n\t\t.replace(/\\./g, \"-\");\n\tconst stdoutLogPath = path.join(logsDir, `engine-${timestamp}-stdout.log`);\n\tconst stderrLogPath = path.join(logsDir, `engine-${timestamp}-stderr.log`);\n\n\tconst fsSync = getNodeFsSync();\n\tconst stdoutStream = fsSync.createWriteStream(stdoutLogPath, {\n\t\tflags: \"a\",\n\t});\n\tconst stderrStream = fsSync.createWriteStream(stderrLogPath, {\n\t\tflags: \"a\",\n\t});\n\n\tlogger().debug({\n\t\tmsg: \"creating engine log files\",\n\t\tstdout: stdoutLogPath,\n\t\tstderr: stderrLogPath,\n\t});\n\n\tconst childProcess = getNodeChildProcess();\n\tconst child = childProcess.spawn(binaryPath, [\"start\"], {\n\t\tcwd: path.dirname(binaryPath),\n\t\tstdio: [\"inherit\", \"pipe\", \"pipe\"],\n\t\tenv: {\n\t\t\t...process.env,\n\t\t},\n\t});\n\n\tif (!child.pid) {\n\t\tthrow new Error(\"failed to spawn rivet engine process\");\n\t}\n\n\t// Pipe stdout and stderr to log files\n\tif (child.stdout) {\n\t\tchild.stdout.pipe(stdoutStream);\n\t}\n\tif (child.stderr) {\n\t\tchild.stderr.pipe(stderrStream);\n\t}\n\tlogger().debug({\n\t\tmsg: \"spawned engine process\",\n\t\tpid: child.pid,\n\t\tcwd: path.dirname(binaryPath),\n\t});\n\n\tchild.once(\"exit\", (code, signal) => {\n\t\tlogger().warn({\n\t\t\tmsg: \"engine process exited, please report this error\",\n\t\t\tcode,\n\t\t\tsignal,\n\t\t\tissues: \"https://github.com/rivet-dev/rivetkit/issues\",\n\t\t\tsupport: \"https://rivet.dev/discord\",\n\t\t});\n\t\t// Clean up log streams\n\t\tstdoutStream.end();\n\t\tstderrStream.end();\n\t});\n\n\tchild.once(\"error\", (error) => {\n\t\tlogger().error({\n\t\t\tmsg: \"engine process failed\",\n\t\t\terror,\n\t\t});\n\t\t// Clean up log streams on error\n\t\tstdoutStream.end();\n\t\tstderrStream.end();\n\t});\n\n\t// Wait for engine to be ready\n\tawait waitForEngineHealth();\n\n\tlogger().info({\n\t\tmsg: \"engine process started\",\n\t\tpid: child.pid,\n\t\tversion: options.version,\n\t\tlogs: {\n\t\t\tstdout: stdoutLogPath,\n\t\t\tstderr: stderrLogPath,\n\t\t},\n\t});\n}\n\nasync function downloadEngineBinaryIfNeeded(\n\tbinaryPath: string,\n\tversion: string,\n\tvarDir: string,\n): Promise<void> {\n\tconst binaryExists = await fileExists(binaryPath);\n\tif (binaryExists) {\n\t\tlogger().debug({\n\t\t\tmsg: \"engine binary already cached\",\n\t\t\tversion,\n\t\t\tpath: binaryPath,\n\t\t});\n\t\treturn;\n\t}\n\n\tconst { targetTriplet, extension } = resolveTargetTriplet();\n\tconst remoteFile = `${ENGINE_BINARY_NAME}-${targetTriplet}${extension}`;\n\tconst downloadUrl = `${ENGINE_BASE_URL}/${version}/engine/${remoteFile}`;\n\tlogger().info({\n\t\tmsg: \"downloading engine binary\",\n\t\turl: downloadUrl,\n\t\tpath: binaryPath,\n\t\tversion,\n\t});\n\n\tconst response = await fetch(downloadUrl);\n\tif (!response.ok || !response.body) {\n\t\tthrow new Error(\n\t\t\t`failed to download rivet engine binary from ${downloadUrl}: ${response.status} ${response.statusText}`,\n\t\t);\n\t}\n\n\t// Generate unique temp file name to prevent parallel download conflicts\n\tconst crypto = getNodeCrypto();\n\tconst tempPath = `${binaryPath}.${crypto.randomUUID()}.tmp`;\n\tconst startTime = Date.now();\n\n\tlogger().debug({\n\t\tmsg: \"starting binary download\",\n\t\ttempPath,\n\t\tcontentLength: response.headers.get(\"content-length\"),\n\t});\n\n\t// Warn user if download is taking a long time\n\tconst slowDownloadWarning = setTimeout(() => {\n\t\tlogger().warn({\n\t\t\tmsg: \"engine binary download is taking longer than expected, please be patient\",\n\t\t\tversion,\n\t\t});\n\t}, 5000);\n\n\ttry {\n\t\tconst stream = getNodeStream();\n\t\tconst fsSync = getNodeFsSync();\n\t\tawait stream.pipeline(\n\t\t\tresponse.body as any,\n\t\t\tfsSync.createWriteStream(tempPath),\n\t\t);\n\n\t\t// Clear the slow download warning\n\t\tclearTimeout(slowDownloadWarning);\n\n\t\t// Get file size to verify download\n\t\tconst fs = getNodeFs();\n\t\tconst stats = await fs.stat(tempPath);\n\t\tconst downloadDuration = Date.now() - startTime;\n\n\t\tif (process.platform !== \"win32\") {\n\t\t\tawait fs.chmod(tempPath, 0o755);\n\t\t}\n\t\tawait fs.rename(tempPath, binaryPath);\n\n\t\tlogger().debug({\n\t\t\tmsg: \"engine binary download complete\",\n\t\t\tversion,\n\t\t\tpath: binaryPath,\n\t\t\tsize: stats.size,\n\t\t\tdurationMs: downloadDuration,\n\t\t});\n\t\tlogger().info({\n\t\t\tmsg: \"engine binary downloaded\",\n\t\t\tversion,\n\t\t\tpath: binaryPath,\n\t\t});\n\t} catch (error) {\n\t\t// Clear the slow download warning\n\t\tclearTimeout(slowDownloadWarning);\n\n\t\t// Clean up partial temp file on error\n\t\tlogger().warn({\n\t\t\tmsg: \"engine download failed, please report this error\",\n\t\t\ttempPath,\n\t\t\terror,\n\t\t\tissues: \"https://github.com/rivet-dev/rivetkit/issues\",\n\t\t\tsupport: \"https://rivet.dev/discord\",\n\t\t});\n\t\ttry {\n\t\t\tconst fs = getNodeFs();\n\t\t\tawait fs.unlink(tempPath);\n\t\t} catch (unlinkError) {\n\t\t\t// Ignore errors when cleaning up (file may not exist)\n\t\t}\n\t\tthrow error;\n\t}\n}\n//\nfunction resolveTargetTriplet(): { targetTriplet: string; extension: string } {\n\treturn resolveTargetTripletFor(process.platform, process.arch);\n}\n\nexport function resolveTargetTripletFor(\n\tplatform: NodeJS.Platform,\n\tarch: typeof process.arch,\n): { targetTriplet: string; extension: string } {\n\tswitch (platform) {\n\t\tcase \"darwin\":\n\t\t\tif (arch === \"arm64\") {\n\t\t\t\treturn { targetTriplet: \"aarch64-apple-darwin\", extension: \"\" };\n\t\t\t}\n\t\t\tif (arch === \"x64\") {\n\t\t\t\treturn { targetTriplet: \"x86_64-apple-darwin\", extension: \"\" };\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"linux\":\n\t\t\tif (arch === \"x64\") {\n\t\t\t\treturn {\n\t\t\t\t\ttargetTriplet: \"x86_64-unknown-linux-musl\",\n\t\t\t\t\textension: \"\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"win32\":\n\t\t\tif (arch === \"x64\") {\n\t\t\t\treturn {\n\t\t\t\t\ttargetTriplet: \"x86_64-pc-windows-gnu\",\n\t\t\t\t\textension: \".exe\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tthrow new Error(\n\t\t`unsupported platform for rivet engine binary: ${platform}/${arch}`,\n\t);\n}\nasync function isEngineRunning(): Promise<boolean> {\n\t// Check if the engine is running on the port\n\treturn await checkIfEngineAlreadyRunningOnPort(ENGINE_PORT);\n}\n\nasync function checkIfEngineAlreadyRunningOnPort(\n\tport: number,\n): Promise<boolean> {\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(`http://127.0.0.1:${port}/health`);\n\t} catch (err) {\n\t\t// Nothing is running on this port\n\t\treturn false;\n\t}\n\n\tif (response.ok) {\n\t\tconst health = (await response.json()) as EngineHealthResponse;\n\n\t\t// Check what's running on this port\n\t\tif (health.runtime === \"engine\") {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"rivet engine already running on port\",\n\t\t\t\tport,\n\t\t\t});\n\t\t\treturn true;\n\t\t} else if (health.runtime === \"rivetkit\") {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"another rivetkit process is already running on port\",\n\t\t\t\tport,\n\t\t\t});\n\t\t\tthrow new Error(\n\t\t\t\t\"RivetKit process already running on port 6420, stop that process and restart this.\",\n\t\t\t);\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t\"Unknown process running on port 6420, cannot identify what it is.\",\n\t\t\t);\n\t\t}\n\t}\n\n\t// Port responded but not with OK status\n\treturn false;\n}\nasync function fileExists(filePath: string): Promise<boolean> {\n\ttry {\n\t\tconst fs = getNodeFs();\n\t\tawait fs.access(filePath);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nconst HEALTH_MAX_WAIT = 10_000;\nconst HEALTH_INTERVAL = 100;\n\ninterface EngineHealthResponse {\n\tstatus?: string;\n\truntime?: string;\n\tversion?: string;\n}\n\nasync function waitForEngineHealth(): Promise<EngineHealthResponse> {\n\tconst maxRetries = Math.ceil(HEALTH_MAX_WAIT / HEALTH_INTERVAL);\n\n\tlogger().debug({ msg: \"waiting for engine health check\" });\n\n\tfor (let i = 0; i < maxRetries; i++) {\n\t\ttry {\n\t\t\tconst response = await fetch(`${ENGINE_ENDPOINT}/health`, {\n\t\t\t\tsignal: AbortSignal.timeout(1000),\n\t\t\t});\n\t\t\tif (response.ok) {\n\t\t\t\tconst health = (await response.json()) as EngineHealthResponse;\n\t\t\t\tlogger().debug({ msg: \"engine health check passed\" });\n\t\t\t\treturn health;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Expected to fail while engine is starting up\n\t\t\tlogger().debug({ msg: \"engine health check failed\", error });\n\t\t\tif (i === maxRetries - 1) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`engine health check failed after ${maxRetries} retries: ${error}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (i < maxRetries - 1) {\n\t\t\tlogger().trace({\n\t\t\t\tmsg: \"engine not ready, retrying\",\n\t\t\t\tattempt: i + 1,\n\t\t\t\tmaxRetries,\n\t\t\t});\n\t\t\tawait new Promise((resolve) =>\n\t\t\t\tsetTimeout(resolve, HEALTH_INTERVAL),\n\t\t\t);\n\t\t}\n\t}\n\n\tthrow new Error(`engine health check failed after ${maxRetries} retries`);\n}\n","import { createMiddleware } from \"hono/factory\";\nimport { inspectorLogger } from \"./log\";\nimport type { RegistryConfig } from \"@/registry/config\";\n\nexport function compareSecrets(providedSecret: string, validSecret: string) {\n\t// Early length check to avoid unnecessary processing\n\tif (providedSecret.length !== validSecret.length) {\n\t\treturn false;\n\t}\n\n\tconst encoder = new TextEncoder();\n\n\tconst a = encoder.encode(providedSecret);\n\tconst b = encoder.encode(validSecret);\n\n\tif (a.byteLength !== b.byteLength) {\n\t\treturn false;\n\t}\n\n\t// TODO:\n\t// // Perform timing-safe comparison\n\t// if (!crypto.timingSafeEqual(a, b)) {\n\t// \treturn false;\n\t// }\n\treturn true;\n}\n\nexport const secureInspector = (config: RegistryConfig) =>\n\tcreateMiddleware(async (c, next) => {\n\t\tconst userToken = c.req.header(\"Authorization\")?.replace(\"Bearer \", \"\");\n\t\tif (!userToken) {\n\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t}\n\n\t\tconst inspectorToken = config.inspector.token();\n\t\tif (!inspectorToken) {\n\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t}\n\n\t\tconst isValid = compareSecrets(userToken, inspectorToken);\n\t\tif (!isValid) {\n\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t}\n\t\tawait next();\n\t});\n\nexport function getInspectorUrl(\n\tconfig: RegistryConfig,\n\tmanagerPort: number,\n): string | undefined {\n\tif (!config.inspector.enabled) return undefined;\n\n\tconst url = new URL(\"https://inspect.rivet.dev\");\n\n\t// Only override endpoint if using non-default port or custom endpoint is set\n\tconst endpoint =\n\t\tconfig.inspector.defaultEndpoint ??\n\t\t(config.managerPort !== 6420\n\t\t\t? `http://127.0.0.1:${managerPort}`\n\t\t\t: undefined);\n\tif (endpoint) {\n\t\turl.searchParams.set(\"u\", endpoint);\n\t}\n\n\treturn url.href;\n}\n","import { getLogger } from \"@/common//log\";\n\nexport function logger() {\n\treturn getLogger(\"serverless\");\n}\n","import { RegistryConfig } from \"@/registry/config\";\nimport { logger } from \"./log\";\nimport invariant from \"invariant\";\nimport { convertRegistryConfigToClientConfig } from \"@/client/config\";\nimport {\n\tgetDatacenters,\n\tupdateRunnerConfig,\n} from \"@/remote-manager-driver/api-endpoints\";\n\nexport async function configureServerlessRunner(\n\tconfig: RegistryConfig,\n): Promise<void> {\n\tlogger().debug(\"configuring serverless runner\");\n\n\ttry {\n\t\t// Ensure we have required config values\n\t\tif (!config.namespace) {\n\t\t\tthrow new Error(\n\t\t\t\t\"namespace is required for serverless configuration\",\n\t\t\t);\n\t\t}\n\t\tif (!config.endpoint) {\n\t\t\tthrow new Error(\n\t\t\t\t\"endpoint is required for serverless configuration\",\n\t\t\t);\n\t\t}\n\n\t\t// Prepare the configuration\n\t\tconst customConfig = config.serverless.configureRunnerPool;\n\t\tinvariant(customConfig, \"configureRunnerPool should exist\");\n\n\t\tconst clientConfig = convertRegistryConfigToClientConfig(config);\n\n\t\t// Fetch all datacenters\n\t\tlogger().debug({\n\t\t\tmsg: \"fetching datacenters\",\n\t\t\tendpoint: config.endpoint,\n\t\t});\n\t\tconst dcsRes = await getDatacenters(clientConfig);\n\n\t\t// Build the request body\n\t\tconst runnerName = customConfig.name ?? \"default\";\n\t\tlogger().debug({\n\t\t\tmsg: \"configuring serverless runner\",\n\t\t\trunnerName,\n\t\t\tnamespace: config.namespace,\n\t\t});\n\t\tconst serverlessConfig = {\n\t\t\tserverless: {\n\t\t\t\turl: customConfig.url,\n\t\t\t\theaders: customConfig.headers ?? {},\n\t\t\t\tmax_runners: customConfig.maxRunners ?? 1000,\n\t\t\t\tmin_runners: customConfig.minRunners ?? 0,\n\t\t\t\trequest_lifespan: customConfig.requestLifespan ?? 15 * 60,\n\t\t\t\trunners_margin: customConfig.runnersMargin ?? 0,\n\t\t\t\tslots_per_runner: customConfig.slotsPerRunner ?? 1,\n\t\t\t},\n\t\t\tmetadata: customConfig.metadata ?? {},\n\t\t};\n\t\tawait updateRunnerConfig(clientConfig, runnerName, {\n\t\t\tdatacenters: Object.fromEntries(\n\t\t\t\tdcsRes.datacenters.map((dc) => [dc.name, serverlessConfig]),\n\t\t\t),\n\t\t});\n\n\t\tlogger().info({\n\t\t\tmsg: \"serverless runner configured successfully\",\n\t\t\trunnerName,\n\t\t\tnamespace: config.namespace,\n\t\t});\n\t} catch (error) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to configure serverless runner, validate endpoint is configured correctly then restart this process\",\n\t\t\terror,\n\t\t});\n\n\t\t// Don't throw, allow the runner to continue\n\t}\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"registry\");\n}\n","import type { Hono } from \"hono\";\nimport { detectRuntime, stringifyError } from \"../utils\";\nimport { logger } from \"./log\";\nimport { RegistryConfig } from \"./config\";\n\n// TODO: Go back to dynamic import for this\nimport getPort from \"get-port\";\n\nconst DEFAULT_PORT = 6420;\n\n/**\n * Finds a free port starting from the given port.\n *\n * Tries ports incrementally until a free one is found.\n */\nexport async function findFreePort(\n\tstartPort: number = DEFAULT_PORT,\n): Promise<number> {\n\t// TODO: Fix this\n\t// const getPortModule = \"get-port\";\n\t// const { default: getPort } = await import(/* webpackIgnore: true */ getPortModule);\n\n\t// Create an iterable of ports starting from startPort\n\tfunction* portRange(start: number, count: number = 100): Iterable<number> {\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tyield start + i;\n\t\t}\n\t}\n\n\treturn getPort({ port: portRange(startPort) });\n}\n\nexport async function crossPlatformServe(\n\tconfig: RegistryConfig,\n\tmanagerPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any }> {\n\tconst runtime = detectRuntime();\n\tlogger().debug({ msg: \"detected runtime for serve\", runtime });\n\n\tswitch (runtime) {\n\t\tcase \"deno\":\n\t\t\treturn serveDeno(config, managerPort, app);\n\t\tcase \"bun\":\n\t\t\treturn serveBun(config, managerPort, app);\n\t\tcase \"node\":\n\t\t\treturn serveNode(config, managerPort, app);\n\t\tdefault:\n\t\t\treturn serveNode(config, managerPort, app);\n\t}\n}\n\nasync function serveNode(\n\tconfig: RegistryConfig,\n\tmanagerPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any }> {\n\t// Import @hono/node-server using string variable to prevent static analysis\n\tconst nodeServerModule = \"@hono/node-server\";\n\tlet serve: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\tnodeServerModule\n\t\t);\n\t\tserve = dep.serve;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import @hono/node-server. please run 'npm install @hono/node-server @hono/node-ws'\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\t// Import @hono/node-ws using string variable to prevent static analysis\n\tconst nodeWsModule = \"@hono/node-ws\";\n\tlet createNodeWebSocket: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\tnodeWsModule\n\t\t);\n\t\tcreateNodeWebSocket = dep.createNodeWebSocket;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import @hono/node-ws. please run 'npm install @hono/node-server @hono/node-ws'\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\t// Inject WS\n\tconst { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({\n\t\tapp: app,\n\t});\n\n\t// Start server\n\tconst port = managerPort;\n\tconst server = serve({ fetch: app.fetch, port }, () =>\n\t\tlogger().info({ msg: \"server listening\", port }),\n\t);\n\tinjectWebSocket(server);\n\n\treturn { upgradeWebSocket };\n}\n\nasync function serveDeno(\n\tconfig: RegistryConfig,\n\tmanagerPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any }> {\n\t// Import hono/deno using string variable to prevent static analysis\n\tconst honoDenoModule = \"hono/deno\";\n\tlet upgradeWebSocket: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\thonoDenoModule\n\t\t);\n\t\tupgradeWebSocket = dep.upgradeWebSocket;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import hono/deno\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\tconst port = config.managerPort;\n\n\t// Use Deno.serve\n\tDeno.serve({ port }, app.fetch);\n\tlogger().info({ msg: \"server listening\", port });\n\n\treturn { upgradeWebSocket };\n}\n\nasync function serveBun(\n\tconfig: RegistryConfig,\n\tmanagerPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any }> {\n\t// Import hono/bun using string variable to prevent static analysis\n\tconst honoBunModule = \"hono/bun\";\n\tlet createBunWebSocket: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\thonoBunModule\n\t\t);\n\t\tcreateBunWebSocket = dep.createBunWebSocket;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import hono/bun\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\tconst { websocket, upgradeWebSocket } = createBunWebSocket();\n\n\tconst port = config.managerPort;\n\n\t// Use Bun.serve\n\t// @ts-expect-error - Bun global\n\tBun.serve({\n\t\tfetch: app.fetch,\n\t\tport,\n\t\twebsocket,\n\t});\n\tlogger().info({ msg: \"server listening\", port });\n\n\treturn { upgradeWebSocket };\n}\n","import invariant from \"invariant\";\nimport {\n\tEndpointMismatch,\n\tInvalidRequest,\n\tNamespaceMismatch,\n} from \"@/actor/errors\";\nimport { convertRegistryConfigToClientConfig } from \"@/client/config\";\nimport { handleHealthRequest, handleMetadataRequest } from \"@/common/router\";\nimport { ServerlessStartHeadersSchema } from \"@/manager/router-schema\";\nimport { createClientWithDriver } from \"@/mod\";\nimport type { DriverConfig, RegistryConfig } from \"@/registry/config\";\nimport { RemoteManagerDriver } from \"@/remote-manager-driver/mod\";\nimport { createRouter } from \"@/utils/router\";\nimport { logger } from \"./log\";\n\nexport function buildServerlessRouter(\n\tdriverConfig: DriverConfig,\n\tconfig: RegistryConfig,\n) {\n\treturn createRouter(config.serverless.basePath, (router) => {\n\t\t// GET /\n\t\trouter.get(\"/\", (c) => {\n\t\t\treturn c.text(\n\t\t\t\t\"This is a RivetKit server.\\n\\nLearn more at https://rivetkit.org\",\n\t\t\t);\n\t\t});\n\n\t\t// Serverless start endpoint\n\t\trouter.get(\"/start\", async (c) => {\n\t\t\t// Parse headers\n\t\t\tconst parseResult = ServerlessStartHeadersSchema.safeParse({\n\t\t\t\tendpoint: c.req.header(\"x-rivet-endpoint\"),\n\t\t\t\ttoken: c.req.header(\"x-rivet-token\") ?? undefined,\n\t\t\t\ttotalSlots: c.req.header(\"x-rivet-total-slots\"),\n\t\t\t\trunnerName: c.req.header(\"x-rivet-runner-name\"),\n\t\t\t\tnamespace: c.req.header(\"x-rivet-namespace-name\"),\n\t\t\t});\n\t\t\tif (!parseResult.success) {\n\t\t\t\tthrow new InvalidRequest(\n\t\t\t\t\tparseResult.error.issues[0]?.message ??\n\t\t\t\t\t\t\"invalid serverless start headers\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst { endpoint, token, totalSlots, runnerName, namespace } =\n\t\t\t\tparseResult.data;\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"received serverless runner start request\",\n\t\t\t\tendpoint,\n\t\t\t\ttotalSlots,\n\t\t\t\trunnerName,\n\t\t\t\tnamespace,\n\t\t\t});\n\n\t\t\t// Validate endpoint and namespace match config to catch\n\t\t\t// misconfiguration or malicious requests.\n\t\t\t//\n\t\t\t// Only verify if namespace matches if endpoint configured since\n\t\t\t// configuring an endpoint indicates you want to assert the\n\t\t\t// incoming serverless requests.\n\t\t\tif (config.endpoint) {\n\t\t\t\tif (!endpointsMatch(endpoint, config.endpoint)) {\n\t\t\t\t\tthrow new EndpointMismatch(config.endpoint, endpoint);\n\t\t\t\t}\n\n\t\t\t\tif (namespace !== config.namespace) {\n\t\t\t\t\tthrow new NamespaceMismatch(config.namespace, namespace);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Convert config to runner config\n\t\t\tconst newConfig: RegistryConfig = {\n\t\t\t\t...config,\n\t\t\t\tendpoint: endpoint,\n\t\t\t\tnamespace: namespace,\n\t\t\t\ttoken: token,\n\t\t\t\trunner: {\n\t\t\t\t\t...config.runner,\n\t\t\t\t\ttotalSlots: totalSlots,\n\t\t\t\t\trunnerName: runnerName,\n\t\t\t\t\t// Not supported on serverless\n\t\t\t\t\trunnerKey: undefined,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\t// Create manager driver on demand based on the properties provided\n\t\t\t// by headers\n\t\t\t//\n\t\t\t// NOTE: This relies on the `newConfig.runner.runnerName` to\n\t\t\t// configure which runner to create actors on.\n\t\t\tconst managerDriver = new RemoteManagerDriver(\n\t\t\t\tconvertRegistryConfigToClientConfig(newConfig),\n\t\t\t);\n\t\t\tconst client = createClientWithDriver(managerDriver);\n\n\t\t\t// Create new actor driver with updated config\n\t\t\tconst actorDriver = driverConfig.actor(\n\t\t\t\tnewConfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tclient,\n\t\t\t);\n\t\t\tinvariant(\n\t\t\t\tactorDriver.serverlessHandleStart,\n\t\t\t\t\"missing serverlessHandleStart on ActorDriver\",\n\t\t\t);\n\n\t\t\treturn await actorDriver.serverlessHandleStart(c);\n\t\t});\n\n\t\trouter.get(\"/health\", (c) => handleHealthRequest(c));\n\n\t\trouter.get(\"/metadata\", (c) =>\n\t\t\thandleMetadataRequest(\n\t\t\t\tc,\n\t\t\t\tconfig,\n\t\t\t\t{ serverless: {} },\n\t\t\t\tconfig.publicEndpoint,\n\t\t\t\tconfig.publicNamespace,\n\t\t\t\tconfig.publicToken,\n\t\t\t),\n\t\t);\n\t});\n}\n\n/**\n * Normalizes a URL for comparison by extracting protocol, host, port, and pathname.\n * Normalizes loopback addresses (127.0.0.1, 0.0.0.0, ::1) to localhost for consistent comparison.\n * Normalizes regional endpoints (api-*.domain) to base endpoints (api.domain).\n * Returns null if the URL is invalid.\n */\nexport function normalizeEndpointUrl(url: string): string | null {\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\t// Normalize pathname by removing trailing slash (except for root)\n\t\tconst pathname =\n\t\t\tparsed.pathname === \"/\" ? \"/\" : parsed.pathname.replace(/\\/+$/, \"\");\n\n\t\t// Normalize loopback addresses to localhost\n\t\tlet hostname = isLoopbackAddress(parsed.hostname)\n\t\t\t? \"localhost\"\n\t\t\t: parsed.hostname;\n\n\t\t// Normalize regional endpoints (api-region.domain) to base endpoints (api.domain)\n\t\t// HACK: This is specific to Rivet Cloud and will not work for self-hosted\n\t\t// engines with different regional endpoint naming conventions.\n\t\thostname = normalizeRegionalHostname(hostname);\n\n\t\t// Reconstruct host with normalized hostname and port\n\t\tconst host = parsed.port ? `${hostname}:${parsed.port}` : hostname;\n\n\t\t// Reconstruct normalized URL with protocol, host, and pathname\n\t\treturn `${parsed.protocol}//${host}${pathname}`;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Normalizes regional hostnames (api-region.domain) to base hostnames (api.domain).\n * Only applies to rivet.dev domains.\n *\n * Examples:\n * - api-us-west-1.rivet.dev -> api.rivet.dev\n * - api-lax.staging.rivet.dev -> api.staging.rivet.dev\n * - api.rivet.dev -> api.rivet.dev (unchanged)\n * - api-us-west-1.example.com -> api-us-west-1.example.com (unchanged, not rivet.dev)\n * - foo-bar.rivet.dev -> foo-bar.rivet.dev (unchanged, not api- prefix)\n */\nfunction normalizeRegionalHostname(hostname: string): string {\n\t// Only apply to rivet.dev domains\n\tif (!hostname.endsWith(\".rivet.dev\")) {\n\t\treturn hostname;\n\t}\n\n\tif (!hostname.startsWith(\"api-\")) {\n\t\treturn hostname;\n\t}\n\n\t// Find the first dot after \"api-\"\n\tconst withoutPrefix = hostname.slice(4); // Remove \"api-\"\n\tconst firstDotIndex = withoutPrefix.indexOf(\".\");\n\tif (firstDotIndex === -1) {\n\t\treturn hostname;\n\t}\n\n\t// Extract the domain part and prepend \"api.\"\n\tconst domain = withoutPrefix.slice(firstDotIndex + 1);\n\treturn `api.${domain}`;\n}\n\n/**\n * Compares two endpoint URLs after normalization.\n * Returns true if they match (same protocol, host, port, and path).\n */\nexport function endpointsMatch(a: string, b: string): boolean {\n\tconst normalizedA = normalizeEndpointUrl(a);\n\tconst normalizedB = normalizeEndpointUrl(b);\n\tif (normalizedA === null || normalizedB === null) {\n\t\t// If either URL is invalid, fall back to string comparison\n\t\treturn a === b;\n\t}\n\treturn normalizedA === normalizedB;\n}\n\n/**\n * Checks if a hostname is a loopback address that should be normalized to localhost.\n */\nfunction isLoopbackAddress(hostname: string): boolean {\n\treturn (\n\t\thostname === \"127.0.0.1\" ||\n\t\thostname === \"0.0.0.0\" ||\n\t\thostname === \"::1\" ||\n\t\thostname === \"[::1]\"\n\t);\n}\n","import { z } from \"zod\";\n\nexport const ServerlessStartHeadersSchema = z.object({\n\tendpoint: z.string({\n\t\terror: \"x-rivet-endpoint header is required\",\n\t}),\n\ttoken: z\n\t\t.string({ error: \"x-rivet-token header must be a string\" })\n\t\t.optional(),\n\ttotalSlots: z.coerce\n\t\t.number({\n\t\t\terror: \"x-rivet-total-slots header must be a number\",\n\t\t})\n\t\t.int({ error: \"x-rivet-total-slots header must be an integer\" })\n\t\t.gte(1, { error: \"x-rivet-total-slots header must be positive\" }),\n\trunnerName: z.string({\n\t\terror: \"x-rivet-runner-name header is required\",\n\t}),\n\tnamespace: z.string({\n\t\terror: \"x-rivet-namespace-name header is required\",\n\t}),\n});\n","import type { Client } from \"@/client/client\";\nimport { createClient } from \"@/client/mod\";\nimport { isDev } from \"@/utils/env-vars\";\nimport {\n\ttype RegistryActors,\n\ttype RegistryConfig,\n\ttype RegistryConfigInput,\n\tRegistryConfigSchema,\n} from \"./config\";\nimport {\n\ttype LegacyRunnerConfig,\n\ttype LegacyRunnerConfigInput,\n\tLegacyRunnerConfigSchema,\n} from \"./config/legacy-runner\";\nimport { Runtime } from \"../../runtime\";\n\nexport type FetchHandler = (\n\trequest: Request,\n\t...args: any\n) => Response | Promise<Response>;\n\nexport interface ServerlessHandler {\n\tfetch: FetchHandler;\n}\n\nexport interface LegacyStartServerOutput<A extends Registry<any>> {\n\t/** Client to communicate with the actors. */\n\tclient: Client<A>;\n\t/** Fetch handler to manually route requests to the Rivet manager API. */\n\tfetch: FetchHandler;\n}\n\nexport class Registry<A extends RegistryActors> {\n\t#config: RegistryConfigInput<A>;\n\n\tget config(): RegistryConfigInput<A> {\n\t\treturn this.#config;\n\t}\n\n\tparseConfig(): RegistryConfig {\n\t\treturn RegistryConfigSchema.parse(this.#config);\n\t}\n\n\t// Shared runtime instance\n\t#runtime?: Runtime<A>;\n\t#runtimePromise?: Promise<Runtime<A>>;\n\n\tconstructor(config: RegistryConfigInput<A>) {\n\t\tthis.#config = config;\n\n\t\t// Auto-prepare on next tick (gives time for sync config modification)\n\t\tsetTimeout(() => {\n\t\t\t// biome-ignore lint/nursery/noFloatingPromises: fire-and-forget auto-prepare\n\t\t\tthis.#ensureRuntime();\n\t\t}, 0);\n\t}\n\n\t/** Creates runtime if not already created. Idempotent. */\n\t#ensureRuntime(): Promise<Runtime<A>> {\n\t\tif (!this.#runtimePromise) {\n\t\t\tthis.#runtimePromise = Runtime.create(this);\n\t\t\t// biome-ignore lint/nursery/noFloatingPromises: bg task\n\t\t\tthis.#runtimePromise.then((rt) => {\n\t\t\t\tthis.#runtime = rt;\n\t\t\t});\n\t\t}\n\t\treturn this.#runtimePromise;\n\t}\n\n\t/**\n\t * Handle an incoming HTTP request for serverless deployments.\n\t *\n\t * @example\n\t * ```ts\n\t * const app = new Hono();\n\t * app.all(\"/api/rivet/*\", (c) => registry.handler(c.req.raw));\n\t * export default app;\n\t * ```\n\t */\n\tpublic async handler(request: Request): Promise<Response> {\n\t\tconst runtime = await this.#ensureRuntime();\n\t\truntime.startServerless();\n\t\treturn await runtime.handleServerlessRequest(request);\n\t}\n\n\t/**\n\t * Returns a fetch handler for serverless deployments.\n\t *\n\t * @example\n\t * ```ts\n\t * export default registry.serve();\n\t * ```\n\t */\n\tpublic serve(): ServerlessHandler {\n\t\treturn { fetch: this.handler.bind(this) };\n\t}\n\n\t/**\n\t * Starts an actor runner for standalone server deployments.\n\t */\n\tpublic startRunner() {\n\t\t// biome-ignore lint/nursery/noFloatingPromises: bg task\n\t\tthis.#ensureRuntime().then((runtime) => runtime.startRunner());\n\t}\n\n\t// MARK: Legacy\n\t/**\n\t * Runs the registry for a server.\n\t *\n\t * @deprecated Use {@link Registry.startRunner} for long-running servers or {@link Registry.handler} for serverless deployments.\n\t */\n\tpublic start(\n\t\tinputConfig?: LegacyRunnerConfigInput,\n\t): LegacyStartServerOutput<this> {\n\t\tconst config = LegacyRunnerConfigSchema.parse(inputConfig);\n\n\t\t// Validate autoConfigureServerless is only used with serverless runner\n\t\tif (\n\t\t\tconfig.autoConfigureServerless &&\n\t\t\tconfig.runnerKind !== \"serverless\"\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t\"autoConfigureServerless can only be configured when runnerKind is 'serverless'\",\n\t\t\t);\n\t\t}\n\n\t\t// Auto-configure serverless runner if not in prod\n\t\tconst isDevEnv = isDev();\n\t\tif (isDevEnv && config.runnerKind === \"serverless\") {\n\t\t\tif (inputConfig?.runEngine === undefined) config.runEngine = true;\n\t\t\tif (inputConfig?.autoConfigureServerless === undefined)\n\t\t\t\tconfig.autoConfigureServerless = true;\n\t\t}\n\n\t\t// Convert to new config format and call appropriate handler\n\t\tif (config.runnerKind === \"serverless\") {\n\t\t\treturn this.#legacyStartServerless(config, inputConfig);\n\t\t} else {\n\t\t\treturn this.#legacyStartNormal(config);\n\t\t}\n\t}\n\n\t#legacyStartServerless(\n\t\tconfig: LegacyRunnerConfig,\n\t\t_inputConfig: LegacyRunnerConfigInput | undefined,\n\t): LegacyStartServerOutput<this> {\n\t\t// Create client for the legacy return value\n\t\t// For serverless, we don't have an endpoint until /start is called,\n\t\t// so we create a placeholder client\n\t\tconst client = createClient<this>({\n\t\t\tendpoint: config.endpoint,\n\t\t\ttoken: config.token,\n\t\t\tnamespace: config.namespace,\n\t\t\theaders: config.headers,\n\t\t});\n\n\t\treturn {\n\t\t\tclient,\n\t\t\tfetch: this.handler.bind(this),\n\t\t};\n\t}\n\n\t#legacyStartNormal(\n\t\tconfig: LegacyRunnerConfig,\n\t): LegacyStartServerOutput<this> {\n\t\t// Start the runner (fire-and-forget to maintain sync API)\n\t\t// biome-ignore lint/nursery/noFloatingPromises: legacy sync API\n\t\tthis.#ensureRuntime().then((runtime) => runtime.startRunner());\n\n\t\t// Create client for the legacy return value\n\t\tconst client = createClient<this>({\n\t\t\tendpoint: config.endpoint,\n\t\t\ttoken: config.token,\n\t\t\tnamespace: config.namespace,\n\t\t\theaders: config.headers,\n\t\t});\n\n\t\treturn {\n\t\t\tclient,\n\t\t\tfetch: this.handler.bind(this),\n\t\t};\n\t}\n}\n\nexport function setup<A extends RegistryActors>(\n\tinput: RegistryConfigInput<A>,\n): Registry<A> {\n\treturn new Registry(input);\n}\n\nexport type { RegistryConfig, RegistryActors };\nexport { RegistryConfigSchema };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,SAAS;AAuClB,IAAM,YAAY,MAEX,EAAE,OAAU,CAAC,QAAQ,OAAO,QAAQ,UAAU;AAO9C,IAAM,oBAAoB,EAC/B,OAAO;AAAA,EACP,UAAU,UAAU,EAAE,SAAS;AAAA,EAC/B,WAAW,UAAU,EAAE,SAAS;AAAA,EAChC,QAAQ,UAAU,EAAE,SAAS;AAAA,EAC7B,SAAS,UAAU,EAAE,SAAS;AAAA,EAC9B,eAAe,UAAU,EAAE,SAAS;AAAA,EACpC,iBAAiB,UAAU,EAAE,SAAS;AAAA,EACtC,WAAW,UAAU,EAAE,SAAS;AAAA,EAChC,cAAc,UAAU,EAAE,SAAS;AAAA,EACnC,wBAAwB,UAAU,EAAE,SAAS;AAAA,EAC7C,WAAW,UAAU,EAAE,SAAS;AAAA,EAChC,aAAa,UAAU,EAAE,SAAS;AAAA,EAClC,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,CAAC,EAAE,QAAQ,OAAO,CAAC,EAAE;AAAA,EAC7D,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACxB,aAAa,UAAU,EAAE,SAAS;AAAA,EAClC,WAAW,EAAE,IAAI,EAAE,SAAS;AAAA,EAC5B,iBAAiB,UAAU,EAAE,SAAS;AAAA,EACtC,MAAM,EAAE,IAAI,EAAE,SAAS;AAAA,EACvB,IAAI,EAAE,IAAI,EAAE,SAAS;AAAA,EACrB,YAAY,UAAU,EAAE,SAAS;AAAA,EACjC,SAAS,EACP,OAAO;AAAA,IACP,mBAAmB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAI;AAAA,IACrD,wBAAwB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAI;AAAA,IAC1D,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAI;AAAA;AAAA,IAEpD,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAI;AAAA,IAClD,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAI;AAAA,IACpD,mBAAmB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAM;AAAA,IACvD,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAM;AAAA;AAAA,IAEnD,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAM;AAAA,IACtD,2BAA2B,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,IAC7D,4BAA4B,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAI;AAAA,IAC9D,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IAClC,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQlD,uBAAuB,EACrB,MAAM;AAAA,MACN,EAAE,QAAQ;AAAA,MACV,UAAyC;AAAA,IAC1C,CAAC,EACA,QAAQ,KAAK;AAAA,EAChB,CAAC,EACA,OAAO,EACP,SAAS,OAAO,CAAC,EAAE;AACtB,CAAC,EACA,OAAO,EACP;AAAA,EACA,CAAC,SAAS,EAAE,KAAK,UAAU,UAAa,KAAK,gBAAgB;AAAA,EAC7D;AAAA,IACC,SAAS;AAAA,IACT,MAAM,CAAC,OAAO;AAAA,EACf;AACD,EACC;AAAA,EACA,CAAC,SACA,EACC,KAAK,cAAc,UACnB,KAAK,oBAAoB;AAAA,EAE3B;AAAA,IACC,SAAS;AAAA,IACT,MAAM,CAAC,WAAW;AAAA,EACnB;AACD,EACC;AAAA,EACA,CAAC,SAAS,EAAE,KAAK,SAAS,UAAa,KAAK,eAAe;AAAA,EAC3D;AAAA,IACC,SAAS;AAAA,IACT,MAAM,CAAC,MAAM;AAAA,EACd;AACD;AAofM,IAAM,wBAAwB,EACnC,OAAO;AAAA,EACP,mBAAmB,EACjB,OAAO,EACP,SAAS,EACT,SAAS,qDAAqD;AAAA,EAChE,wBAAwB,EACtB,OAAO,EACP,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,kBAAkB,EAChB,OAAO,EACP,SAAS,EACT,SAAS,oDAAoD;AAAA,EAC/D,gBAAgB,EACd,OAAO,EACP,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,kBAAkB,EAChB,OAAO,EACP,SAAS,EACT,SAAS,oDAAoD;AAAA,EAC/D,mBAAmB,EACjB,OAAO,EACP,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,eAAe,EACb,OAAO,EACP,SAAS,EACT,SAAS,mDAAmD;AAAA,EAC9D,kBAAkB,EAChB,OAAO,EACP,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,2BAA2B,EACzB,OAAO,EACP,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,4BAA4B,EAC1B,OAAO,EACP,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,SAAS,EACP,QAAQ,EACR,SAAS,EACT,SAAS,qDAAqD;AAAA,EAChE,cAAc,EACZ,OAAO,EACP,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,uBAAuB,EACrB,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AACF,CAAC,EACA,SAAS,wDAAwD;AAE5D,IAAM,uBAAuB,EAClC,OAAO;AAAA,EACP,OAAO,EACL,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,aAAa,EACX,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,WAAW,EACT,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,iBAAiB,EACf,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,MAAM,EACJ,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,YAAY,EACV,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,IAAI,EACF,QAAQ,EACR,SAAS,EACT,SAAS,2CAA2C;AAAA,EACtD,UAAU,EACR,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,WAAW,EACT,QAAQ,EACR,SAAS,EACT,SAAS,qCAAqC;AAAA,EAChD,QAAQ,EACN,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,SAAS,EACP,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,eAAe,EACb,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,iBAAiB,EACf,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,WAAW,EACT,QAAQ,EACR,SAAS,EACT,SAAS,6CAA6C;AAAA,EACxD,cAAc,EACZ,QAAQ,EACR,SAAS,EACT,SAAS,mCAAmC;AAAA,EAC9C,wBAAwB,EACtB,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,WAAW,EACT,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,aAAa,EACX,QAAQ,EACR,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,SAAS,EACP,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAC9B,SAAS,EACT;AAAA,IACA;AAAA,EACD;AAAA,EACD,SAAS,sBAAsB,SAAS;AACzC,CAAC,EACA,SAAS,qDAAqD;;;AChyBzD,SAAS,MAgBf,OAiBC;AACD,QAAM,SAAS,kBAAkB,MAAM,KAAK;AAQ5C,SAAO,IAAI,gBAAgB,MAAM;AAClC;;;AChDA,SAAS,SAAS,cAAc;AAChC,YAAY,UAAU;AAEtB,SAAS,iBAAiB;AAC1B,SAAS,iBAAqC;AAC9C,OAAO,eAAe;;;ACRf,SAAS,SAAS;AACxB,SAAO,UAAU,eAAe;AACjC;;;ADgDA,IAAM,2BAA2B;AAQjC,IAAM,4BAA4B;AAMlC,IAAM,uCAAuC;AAUtC,IAAM,oBAAN,MAA+C;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAqC,oBAAI,IAAI;AAAA,EAC7C;AAAA,EAEA,iBAAkD,qBAAqB;AAAA,EACvE,iBAAkD,qBAAqB;AAAA,EACvE,mBAA4B;AAAA;AAAA;AAAA;AAAA,EAK5B,mBAAqD,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc7D,mBAAmB,oBAAI,IAQrB;AAAA,EAEF,YACC,QACA,eACA,cACC;AACD,SAAK,UAAU;AACf,SAAK,iBAAiB;AACtB,SAAK,gBAAgB;AAIrB,UAAM,QAAQ,OAAO;AAMrB,SAAK,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,KAAK;AAAA,IACb;AAGA,UAAM,qBAAyC;AAAA,MAC9C,SAAS,OAAO,OAAO;AAAA,MACvB,UAAU,YAAY,MAAM;AAAA,MAC5B;AAAA,MACA,WAAW,OAAO;AAAA,MAClB,YAAY,OAAO,OAAO;AAAA,MAC1B,YAAY,OAAO,OAAO;AAAA,MAC1B,WAAW,OAAO,OAAO,aAAa,OAAO,WAAW;AAAA,MACxD,UAAU;AAAA,QACT,UAAU,EAAE,SAAS,QAAQ;AAAA,MAC9B;AAAA,MACA,uBAAuB,gBAAgB,MAAM;AAAA,MAC7C,aAAa,MAAM;AAClB,aAAK,eAAe,QAAQ,MAAS;AAAA,MACtC;AAAA,MACA,gBAAgB,CAAC,OAAO,YAAY;AAAA,MAAC;AAAA,MACrC,YAAY,MAAM;AACjB,aAAK,eAAe,QAAQ,MAAS;AACrC,aAAK,mBAAmB;AAAA,MACzB;AAAA,MACA,OAAO,KAAK,aAAa,KAAK,IAAI;AAAA,MAClC,WAAW,KAAK,iBAAiB,KAAK,IAAI;AAAA,MAC1C,uBAAuB;AAAA,QACtB,cAAc,KAAK,iBAAiB,KAAK,IAAI;AAAA,MAC9C;AAAA,MACA,cAAc,KAAK,oBAAoB,KAAK,IAAI;AAAA,MAChD,aAAa,KAAK,mBAAmB,KAAK,IAAI;AAAA,MAC9C,QAAQ,UAAU,eAAe;AAAA,IAClC;AAGA,SAAK,UAAU,IAAI,OAAO,kBAAkB;AAC5C,SAAK,QAAQ,MAAM;AACnB,WAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,MAClB,YAAY,OAAO,OAAO;AAAA,IAC3B,CAAC;AAAA,EACF;AAAA,EAEA,yBAAiD;AAChD,WAAO,EAAE,UAAU,KAAK,QAAQ,YAAY,IAAI;AAAA,EACjD;AAAA,EAEA,MAAM,kBAAkB,SAAwC;AAE/D,UAAM,UAAU,KAAK,QAAQ,IAAI,OAAO;AACxC,QAAI,CAAC;AACJ,YAAM,IAAI,MAAM,gCAAgC,OAAO,EAAE;AAC1D,QAAI,QAAQ,kBAAmB,OAAM,QAAQ,kBAAkB;AAC/D,QAAI,CAAC,QAAQ,MAAO,OAAM,IAAI,MAAM,wBAAwB;AAC5D,WAAO;AAAA,EACR;AAAA,EAEA,WAAW,SAAgC;AAC1C,WAAO,CAAC;AAAA,EACT;AAAA,EAEA,MAAM,SAASA,QAAyB,WAAkC;AACzE,UAAM,UAAU,KAAK,QAAQ,IAAIA,OAAM,EAAE;AACzC,QAAI,CAAC,SAAS;AACb,aAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,MACN,CAAC;AAED;AAAA,IACD;AAGA,QAAI,QAAQ,cAAc;AACzB,cAAQ,aAAa,MAAM;AAC3B,cAAQ,eAAe;AAAA,IACxB;AAGA,UAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,KAAK,IAAI,CAAC;AAChD,YAAQ,eAAe,eAAe,MAAM;AAC3C,MAAAA,OAAM,QAAQ;AACd,cAAQ,eAAe;AAAA,IACxB,GAAG,KAAK;AAWR,SAAK,QAAQ,SAASA,OAAM,IAAI,SAAS;AAAA,EAC1C;AAAA,EAEA,MAAM,YAAY,UAAgD;AACjE,WAAO;AAAA,EACR;AAAA;AAAA,EAGA,MAAM,WACL,SACA,SACgB;AAChB,UAAM,KAAK,QAAQ,MAAM,SAAS,OAAO;AAAA,EAC1C;AAAA,EAEA,MAAM,WACL,SACA,MACiC;AACjC,WAAO,MAAM,KAAK,QAAQ,MAAM,SAAS,IAAI;AAAA,EAC9C;AAAA,EAEA,MAAM,cAAc,SAAiB,MAAmC;AACvE,UAAM,KAAK,QAAQ,SAAS,SAAS,IAAI;AAAA,EAC1C;AAAA,EAEA,MAAM,OAAO,SAAwC;AACpD,UAAM,UAAU,MAAM,KAAK,QAAQ;AAAA,MAClC;AAAA,MACA,IAAI,WAAW;AAAA,IAChB;AACA,UAAM,OAAO,QAAQ,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG;AACvC,WAAO,EAAE,KAAK;AAAA,MACb,KAAK;AAAA,MACL;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,YAAY,EAAE,OAAO,CAAC,CAAC;AAAA,IAClD,CAAC;AACD,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,aACL,SACA,QACsC;AACtC,UAAM,SAAS,MAAM,KAAK,QAAQ,aAAa,SAAS,MAAM;AAC9D,WAAO,EAAE,KAAK;AAAA,MACb,KAAK;AAAA,MACL;AAAA,MACA,WAAW,IAAI,YAAY,EAAE,OAAO,MAAM;AAAA,MAC1C,cAAc,OAAO;AAAA,MACrB,MAAM,OAAO,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,YAAY,EAAE,OAAO,GAAG,CAAC;AAAA,IAC1D,CAAC;AACD,WAAO;AAAA,EACR;AAAA;AAAA,EAGA,MAAM,UAAU,SAA4C;AAC3D,UAAM,UAAU,MAAM,KAAK,kBAAkB,OAAO;AACpD,QAAI,CAAC,QAAQ,MAAO,OAAM,IAAI,MAAM,SAAS,OAAO,iBAAiB;AACrE,WAAO,QAAQ;AAAA,EAChB;AAAA,EAEA,WAAW,SAAiB;AAE3B,SAAK,iBAAiB,IAAI,SAAS,OAAO;AAC1C,SAAK,QAAQ,WAAW,OAAO;AAAA,EAChC;AAAA,EAEA,aAAa,SAAiB;AAE7B,SAAK,iBAAiB,IAAI,SAAS,SAAS;AAC5C,SAAK,QAAQ,UAAU,OAAO;AAAA,EAC/B;AAAA,EAEA,MAAM,eAAe,WAAmC;AACvD,WAAO,EAAE,KAAK,EAAE,KAAK,gCAAgC,UAAU,CAAC;AA2BhE,WAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,YAAY,KAAK,QAAQ;AAAA,IAC1B,CAAC;AACD,UAAM,eAAgC,CAAC;AACvC,eAAW,CAAC,UAAU,OAAO,KAAK,KAAK,QAAQ,QAAQ,GAAG;AACzD,UAAI,QAAQ,OAAO;AAClB,qBAAa;AAAA,UACZ,QAAQ,MAAM,OAAO,OAAO,EAAE,MAAM,CAAC,QAAQ;AAtVlD;AAuVM,0BAAQ,UAAR,mBAAe,KAAK,MAAM;AAAA,cACzB,KAAK;AAAA,cACL,OAAO,eAAe,GAAG;AAAA,YAC1B;AAAA,UACD,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AACA,UAAM,QAAQ,IAAI,YAAY;AAC9B,WAAO,EAAE,MAAM,EAAE,KAAK,qBAAqB,CAAC;AAE5C,UAAM,KAAK,QAAQ,SAAS,SAAS;AAAA,EACtC;AAAA,EAEA,MAAM,sBAAsB,GAAmC;AAC9D,WAAO,UAAU,GAAG,OAAO,WAAW;AAErC,aAAO,QAAQ,MAAM;AAAA,MAAC,CAAC;AACvB,QAAE,IAAI,IAAI,OAAO,iBAAiB,SAAS,MAAM;AAChD,eAAO,EAAE,MAAM,mCAAmC;AAKlD,aAAK,eAAe,KAAK;AAAA,MAC1B,CAAC;AAED,YAAM,KAAK,eAAe;AAG1B,YAAM,UAAU,KAAK,QAAQ,wBAAwB;AACrD,gBAAU,SAAS,kBAAkB;AACrC,YAAM,OAAO,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGvC,aAAO,MAAM;AACZ,YAAI,KAAK,kBAAkB;AAC1B,iBAAO,EAAE,MAAM;AAAA,YACd,KAAK;AAAA,UACN,CAAC;AACD;AAAA,QACD;AAEA,YAAI,OAAO,UAAU,OAAO,SAAS;AACpC,iBAAO,EAAE,MAAM;AAAA,YACd,KAAK;AAAA,YACL,QAAQ,OAAO;AAAA,YACf,SAAS,OAAO;AAAA,UACjB,CAAC;AACD;AAAA,QACD;AAEA,cAAM,OAAO,SAAS,EAAE,OAAO,QAAQ,MAAM,GAAG,CAAC;AACjD,cAAM,OAAO,MAAM,wBAAwB;AAAA,MAC5C;AAGA,YAAM,KAAK,eAAe;AAAA,IAC3B,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,oBACL,SACA,YACA,aACgB;AAChB,WAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL;AAAA,MACA,MAAM,YAAY;AAAA,MAClB,KAAK,YAAY;AAAA,MACjB;AAAA,IACD,CAAC;AAGD,QAAI;AACJ,QAAI,YAAY,OAAO;AACtB,cAAa,YAAO,YAAY,KAAK;AAAA,IACtC;AAGA,QAAI,UAAU,KAAK,QAAQ,IAAI,OAAO;AACtC,QAAI,CAAC,SAAS;AAIb,gBAAU;AAAA,QACT,mBAAmB,qBAAqB;AAAA,MACzC;AACA,WAAK,QAAQ,IAAI,SAAS,OAAO;AAAA,IAClC;AAEA,UAAM,OAAO,YAAY;AACzB,cAAU,YAAY,KAAK,yBAAyB;AACpD,UAAM,MAAM,oBAAoB,YAAY,GAAG;AAG/C,UAAM,CAAC,iBAAiB,IAAI,MAAM,KAAK,QAAQ,MAAM,SAAS;AAAA,MAC7D,KAAK;AAAA,IACN,CAAC;AACD,QAAI,sBAAsB,MAAM;AAC/B,YAAM,iBAAiB,uBAAuB,KAAK;AACnD,YAAM,KAAK,QAAQ,MAAM,SAAS,cAAc;AAChD,aAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AAAA,IACF,OAAO;AACN,aAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA,UAAU,kBAAkB;AAAA,MAC7B,CAAC;AAAA,IACF;AAGA,UAAM,aAAa,iBAAiB,KAAK,SAAS,YAAY,IAAI;AAClE,YAAQ,QAAQ,WAAW,YAAY;AAGvC,UAAM,QAAQ,MAAM;AAAA,MACnB;AAAA,MACA,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,IACD;AAEA,WAAO,EAAE,MAAM,EAAE,KAAK,wBAAwB,SAAS,MAAM,IAAI,CAAC;AAAA,EACnE;AAAA,EAEA,MAAM,mBACL,SACA,YACgB;AAChB,WAAO,EAAE,MAAM,EAAE,KAAK,yBAAyB,SAAS,WAAW,CAAC;AASpE,UAAM,SAAS,KAAK,iBAAiB,IAAI,OAAO,KAAK;AACrD,SAAK,iBAAiB,OAAO,OAAO;AAEpC,UAAM,UAAU,KAAK,QAAQ,IAAI,OAAO;AACxC,QAAI,mCAAS,OAAO;AACnB,UAAI;AACH,cAAM,QAAQ,MAAM,OAAO,MAAM;AAAA,MAClC,SAAS,KAAK;AACb,eAAO,EAAE,MAAM;AAAA,UACd,KAAK;AAAA,UACL,KAAK,eAAe,GAAG;AAAA,QACxB,CAAC;AAAA,MACF;AACA,WAAK,QAAQ,OAAO,OAAO;AAAA,IAC5B;AAEA,WAAO,EAAE,MAAM,EAAE,KAAK,wBAAwB,SAAS,OAAO,CAAC;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,aACL,SACA,SACA,eACA,eACA,SACoB;AACpB,WAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL;AAAA,MACA,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,IACjB,CAAC;AACD,WAAO,MAAM,KAAK,aAAa,MAAM,SAAS,EAAE,QAAQ,CAAC;AAAA,EAC1D;AAAA,EAEA,MAAM,iBACL,SACA,SACA,cACA,cACA,cACA,SACA,aACA,gBACA,gBACA,yBACgB;AAvhBlB;AAwhBE,UAAM,YAAY;AAGlB,UAAM,aAAa,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAC9E,IAAC,UAAkB,gBAAgB;AAEnC,WAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL;AAAA,MACA,KAAK,QAAQ;AAAA,MACb;AAAA,MACA,mBAAmB,eAChB,OAAO,UAAU,SAAS,KAAK,YAAY,IAC3C;AAAA,MACH,gBAAe,kDAAc,gBAAd,mBAA2B;AAAA,MAC1C;AAAA,MACA,gBAAgB,eACb,OAAO,KAAK,YAAY,EAAE,KAAK,IAAI,IACnC;AAAA,IACJ,CAAC;AAGD,UAAM,YAAY,QAAQ,QAAQ,IAAI,wBAAwB;AAC9D,UAAM,EAAE,UAAU,WAAW,IAAI,wBAAwB,SAAS;AAKlE,QAAI;AACJ,QAAI;AACH,kBAAY,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IACD,SAAS,KAAK;AACb,aAAO,EAAE,MAAM,EAAE,KAAK,uCAAuC,IAAI,CAAC;AAClE,mBAAa,MAAM,MAAM,gBAAgB;AACzC;AAAA,IACD;AAMA,IAAC,UAA4B,MAAM;AACnC,UAAM,YAAY,IAAI,UAAU,SAAS;AAGzC,UAAM,OAAO,UAAU;AACvB,UAAMA,SAAQ,UAAU;AACxB,UAAM,mBAAmB,6BAAO;AAShC,WAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL;AAAA,MACA,QAAQ,6BAAM;AAAA,MACd,YAAa,UAAkB;AAAA,MAC/B;AAAA,MACA,gBAAe,4CAAW,gBAAX,mBAAwB;AAAA,IACxC,CAAC;AAED,QAAI,yBAAyB;AAC5B,sBAAU,cAAV,mCAAsB;AAAA,IACvB;AAEA,cAAU,iBAAiB,QAAQ,CAAC,UAAU;AAC7C,gBAAU,OAAO,OAAO,SAAS;AAAA,IAClC,CAAC;AAED,cAAU,iBAAiB,WAAW,CAAC,UAA6B;AA9mBtE,UAAAC,KAAAC;AA+mBG,aAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,QAAQ,6BAAM;AAAA,QACd,SAASF,UAAA,gBAAAA,OAAO;AAAA,QAChB,cAAc,MAAM;AAAA,QACpB,cAAc,CAAC,CAAC;AAAA,QAChB,cAAc,CAAC,EAAC,uCAAW;AAAA,QAC3B,iBAAiBA,UAAA,gBAAAA,OAAO;AAAA,QACxB,gBAAeC,MAAA,uCAAW,gBAAX,gBAAAA,IAAwB;AAAA,QACvC,YAAa,UAAkB;AAAA,QAC/B,kBAAkBC,MAAA,MAAM,WAAN,gBAAAA,IAAsB;AAAA,MACzC,CAAC;AAKD,UAAIF,UAAA,gBAAAA,OAAO,YAAY;AACtB,eAAO,EAAE,MAAM;AAAA,UACd,KAAK;AAAA,UACL,QAAQ,6BAAM;AAAA,UACd,SAASA,UAAA,gBAAAA,OAAO;AAAA,UAChB,cAAc,MAAM;AAAA,QACrB,CAAC;AACD;AAAA,MACD;AAGA,aAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,QAAQ,6BAAM;AAAA,QACd,cAAc,MAAM;AAAA,MACrB,CAAC;AACD,gBAAU,UAAU,OAAO,SAAS;AAGpC,YAAM,YAAY,qDAAkB;AAEpC,UAAI,aAAa,QAAQA,QAAO;AAC/B;AAAA,UACC,OAAO,MAAM,sBAAsB;AAAA,UACnC;AAAA,QACD;AAGA,cAAM,mBAAmB,UAAU;AACnC,kBAAU,qBAAqB,MAAM;AACrC,eAAO,EAAE,KAAK;AAAA,UACb,KAAK;AAAA,UACL,QAAQ,KAAK;AAAA,UACb;AAAA,UACA,aAAa,MAAM;AAAA,QACpB,CAAC;AAGD,cAAM,QAAQ,KAAK,iBAAiB,IAAI,KAAK,EAAE;AAC/C,YAAI,OAAO;AAEV,gBAAM,gBAAgB,eAAe,MAAM,IAAI;AAC/C,gBAAM,uBAAuB;AAE7B,cACC,MAAM,uBACN,sCACC;AAMD,kBAAM,sBAAsB;AAC5B,kBAAM,2BAA2B;AAGjC,YAAAA,OAAM,aAAa,UAAU;AAAA,cAC5B,WAAW;AAAA,YACZ,CAAC;AAAA,UACF,OAAO;AAON,YAAAA,OAAM,aAAa,UAAU;AAAA,cAC5B,SAAS;AAAA,YACV,CAAC;AAAA,UACF;AAAA,QACD,OAAO;AAEN,UAAAA,OAAM,aAAa,UAAU;AAAA,YAC5B,SAAS;AAAA,UACV,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD,CAAC;AAED,cAAU,iBAAiB,SAAS,CAAC,UAAU;AAC9C,gBAAU,QAAQ,OAAO,SAAS;AAAA,IAInC,CAAC;AAED,cAAU,iBAAiB,SAAS,CAAC,UAAU;AAC9C,gBAAU,QAAQ,OAAO,SAAS;AAAA,IACnC,CAAC;AAGD,QAAI,yBAAyB;AAC5B,aAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL;AAAA,QACA,QAAQ,6BAAM;AAAA,QACd,WAAW,QAAQ,YAAY;AAAA,QAC/B,WAAW,QAAQ,YAAY;AAAA,QAC/B,gBAAe,4CAAW,gBAAX,mBAAwB;AAAA,QACvC,oBAAoB,CAAC,CAAC,UAAU;AAAA,MACjC,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA,EAGA,iBACC,SACA,WACA,WACA,SACU;AA9uBZ;AA+uBE,UAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,UAAM,OAAO,IAAI;AAGjB,UAAM,gBAAgB,KAAK,QAAQ,SAAS,OAAO;AACnD,QAAI,CAAC,eAAe;AACnB,aAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AACD,aAAO;AAAA,IACR;AAGA,UAAM,UAAU,KAAK,QAAQ,IAAI,OAAO;AACxC,QAAI,CAAC,SAAS;AACb,aAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AACD,aAAO;AAAA,IACR;AACA,QAAI,CAAC,QAAQ,OAAO;AACnB,aAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AACD,aAAO;AAAA,IACR;AAGA,WAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,WAAW,QAAQ,SAAS;AAAA,MAC5B,WAAW,QAAQ,SAAS;AAAA,IAC7B,CAAC;AACD,QAAI,SAAS,cAAc;AAC1B,aAAO;AAAA,IACR,WACC,SAAS,uBACT,KAAK,WAAW,qBAAqB,GACpC;AAED,YAAM,aAAa;AAAA,QAClB,KAAK;AAAA,QACL,cAAc,OAAO;AAAA,MACtB;AAGA,YAAM,yBACL,gBAAW,OAAO,YAAlB,mBAA2B;AAC5B,UAAI,0BAA0B,MAAM;AACnC,eAAO;AAAA,MACR,WAAW,OAAO,0BAA0B,YAAY;AACvD,YAAI;AAEH,gBAAM,UAAU;AAAA,YACf,IAAI;AAAA,UACL;AACA,gBAAM,mBAAmB,IAAI;AAAA,YAC5B,eAAe,OAAO;AAAA,YACtB;AAAA,UACD;AAEA,gBAAM,eACL,sBAAsB,gBAAgB;AACvC,iBAAO;AAAA,QACR,SAAS,OAAO;AACf,iBAAO,EAAE,MAAM;AAAA,YACd,KAAK;AAAA,YACL;AAAA,UACD,CAAC;AACD,iBAAO;AAAA,QACR;AAAA,MACD,OAAO;AACN,eAAO;AAAA,MACR;AAAA,IACD,WAAW,SAAS,wBAAwB;AAC3C,aAAO;AAAA,IACR,OAAO;AACN,aAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AACD,aAAO;AAAA,IACR;AAAA,EACD;AAAA,EAEA,MAAM,YACL,SAC0C;AAC1C,UAAMA,SAAQ,MAAM,KAAK,UAAU,OAAO;AAC1C,WAAOA,OAAM,MACX,OAAO,EACP,IAAI,CAAC,SAAS;AACd,YAAM,mBAAmB,KAAK,yBAAyB;AACvD,YAAM,eAAe,iBAAiB;AACtC,UAAI,CAAC,aAAc,QAAO;AAC1B,aAAO;AAAA,QACN,WAAW,aAAa;AAAA,QACxB,WAAW,aAAa;AAAA,QACxB,oBAAoB,aAAa;AAAA,QACjC,oBAAoB,aAAa;AAAA,QACjC,MAAM,aAAa;AAAA,QACnB,SAAS,aAAa;AAAA,MACvB;AAAA,IACD,CAAC,EACA,OAAO,CAAC,MAAM,MAAM,MAAS,EAC7B,QAAQ;AAAA,EACX;AAAA,EAEA,MAAM,mBAAmBA,QAAwC;AA91BlE;AAg2BE,UAAM,UAAU,KAAK,QAAQ,IAAIA,OAAM,EAAE;AACzC,cAAU,SAAS,6CAA6C;AAChE,kBAAQ,sBAAR,mBAA2B;AAC3B,YAAQ,oBAAoB;AAG5B,UAAM,cAAc,MAAM,KAAK,YAAYA,OAAM,EAAE;AACnD,UAAM,KAAK,QAAQ,2BAA2BA,OAAM,IAAI,WAAW;AAAA,EACpE;AAAA,EAEA,aAAa,MAAe;AAC3B,UAAM,eAAe,KAAK,yBAAyB,EAAE;AACrD,QAAI,CAAC,aAAc;AAEnB,SAAK,iBAAiB,IAAI,KAAK,IAAI;AAAA,MAClC,oBAAoB,aAAa;AAAA,MACjC,qBAAqB;AAAA,MACrB,4BAA4B;AAAA,MAC5B,0BAA0B;AAAA,IAC3B,CAAC;AAED,WAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,oBAAoB,aAAa;AAAA,IAClC,CAAC;AAAA,EACF;AAAA,EAEA,cAAc,MAAe;AAC5B,SAAK,iBAAiB,OAAO,KAAK,EAAE;AAEpC,WAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,QAAQ,KAAK;AAAA,IACd,CAAC;AAAA,EACF;AAAA,EAEA,oBAAoB,MAAe;AAClC,UAAM,eAAe,KAAK,yBAAyB;AACnD,UAAM,eAAe,aAAa,wBAAwB;AAE1D,UAAM,QAAQ,KAAK,iBAAiB,IAAI,KAAK,EAAE;AAC/C,QAAI,CAAC,OAAO;AACX,aAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL,QAAQ,KAAK;AAAA,MACd,CAAC;AACD;AAAA,IACD;AAGA,UAAM,6BACL,aAAa,qBAAqB,MAAM;AACzC,UAAM,qBAAqB,aAAa;AAAA,EACzC;AAAA,EAEA,mBAAmB,MAAe;AACjC,UAAM,eAAe,KAAK,yBAAyB;AACnD,UAAM,eAAe,aAAa,wBAAwB;AAE1D,UAAM,QAAQ,KAAK,iBAAiB,IAAI,KAAK,EAAE;AAC/C,QAAI,CAAC,OAAO;AACX,aAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL,QAAQ,KAAK;AAAA,MACd,CAAC;AACD;AAAA,IACD;AAGA,QACC,MAAM,8BACN,MAAM,0BACL;AACD,WAAK,QAAQ;AAAA,QACZ,aAAa;AAAA,QACb,aAAa;AAAA,QACb,MAAM;AAAA,MACP;AACA,YAAM,6BAA6B;AACnC,YAAM,2BAA2B;AACjC,YAAM,sBAAsB;AAAA,IAC7B;AAAA,EACD;AACD;;;AEp7BA,SAAS,KAAAG,UAAS;AAYX,IAAM,yBAAyB,uBAAuB,OAAO;AAAA;AAAA,EAEnE,WAAWC,GACT,OAAO,EACP,SAAS,EACT,UAAU,CAAC,QAAQ,OAAO,kBAAkB,CAAC;AAAA;AAAA,EAG/C,YAAYA,GAAE,OAAO,EAAE,QAAQ,GAAO;AACvC,CAAC;AAED,IAAM,gCAAgC,uBAAuB;AAAA,EAC5D,CAAC,QAAQ,QAAQ,sBAAsB,QAAQ,GAAG;AACnD;AAEO,IAAM,qBAAqB,8BAA8B;AAAA,EAAQ,MACvE,8BAA8B,MAAM,CAAC,CAAC;AACvC;AAKO,SAAS,sBACf,QACA,KACC;AACD,SAAO;AAAA,IACN,GAAG,sBAAsB,QAAQ,GAAG;AAAA,IACpC,WAAW,OAAO;AAAA,EACnB;AACD;;;AC5BO,SAAS,qBAAmC;AAClD,SAAO;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,CAAC,WAA2B;AACpC,YAAM,eAAe,oCAAoC,MAAM;AAC/D,aAAO,IAAI,oBAAoB,YAAY;AAAA,IAC5C;AAAA,IACA,OAAO,CACN,QACA,eACA,iBACI;AACJ,aAAO,IAAI;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAAA,IACA,sBAAsB;AAAA,EACvB;AACD;;;AClCA,SAAS,KAAAC,UAAS;AAkBX,IAAM,2BAA2BC,GAAE,OAAO;AAAA;AAAA,EAEhD,MAAMA,GAAE,OAAO;AAAA,EACf,SAASA,GAAE,OAA6B;AAAA,EACxC,OAAOA,GAAE,OAA2B;AACrC,CAAC;AAKD,IAAM,mCAAmCA,GACvC,OAAO;AAAA,EACP,QAAQ,yBAAyB,SAAS;AAAA;AAAA,EAG1C,wBAAwBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAM;AAAA;AAAA,EAG5D,wBAAwBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,OAAS;AAAA;AAAA,EAG/D,WAAW;AAAA;AAAA,EAGX,sBAAsBA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA;AAAA,EAG1D,mBAAmBA,GAAE,OAAO,EAAE,QAAQ,IAAI;AAAA;AAAA,EAG1C,WAAWA,GACT,QAAQ,EACR,SAAS,EACT,QAAQ,MAAM,kBAAkB,CAAC;AAAA;AAAA,EAGnC,kBAAkBA,GAChB,OAAO,EACP,SAAS,EACT,QAAQ,MAAM,yBAAyB,KAAK,OAAO;AAAA;AAAA,EAGrD,uBAAuBA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAG3C,oBAAoBA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQxD,YAAYA,GACV,KAAK,CAAC,cAAc,QAAQ,CAAC,EAC7B,SAAS,EACT;AAAA,IAAQ,MACR,mBAAmB,MAAM,eAAe,eAAe;AAAA,EACxD;AAAA,EACD,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShC,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3C,WAAWA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA,EAK/C,SAASA,GACP,OAAO;AAAA,IACP,YAAYA,GAAE,OAAe,EAAE,SAAS;AAAA,IACxC,OAAO,eAAe,SAAS;AAAA,EAChC,CAAC,EACA,SAAS,EACT,QAAQ,OAAO,CAAC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASpB,yBAAyBA,GACvB,MAAM;AAAA,IACNA,GAAE,QAAQ;AAAA,IACVA,GAAE,OAAO;AAAA,MACR,KAAKA,GAAE,OAAO,EAAE,SAAS;AAAA,MACzB,SAASA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACnD,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,iBAAiBA,GAAE,OAAO,EAAE,SAAS;AAAA,MACrC,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,MACnC,gBAAgBA,GAAE,OAAO,EAAE,SAAS;AAAA,MACpC,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,IACtD,CAAC;AAAA,EACF,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,qBAAqBA,GAAE,OAA4B,EAAE,SAAS;AAAA;AAAA,EAG9D,OAAOA,GACL,OAAO,EACP,SAAS,EACT,UAAU,CAAC,MAAM,KAAK,cAAc,CAAC;AACxC,CAAC,EACA,MAAM,sBAAsB;AAE9B,IAAM,sCACL,iCAAiC,UAAU,CAAC,QAAQ,SAAS;AAAA,EAC5D,GAAG;AAAA,EACH,GAAG,sBAAsB,QAAQ,GAAG;AACrC,EAAE;AAEI,IAAM,2BACZ,oCAAoC;AAAA,EAAQ,MAC3C,oCAAoC,MAAM,CAAC,CAAC;AAC7C;;;ACzJD,OAAOC,gBAAe;;;ACSf,SAAS,oBACf,QACe;AACf,MAAI,OAAO,YAAY,OAAO,QAAQ;AACrC,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAEA,MAAI,OAAO,QAAQ;AAClB,WAAO,OAAO;AAAA,EACf;AAEA,MAAI,OAAO,YAAY,OAAO,OAAO;AACpC,yBAAqB,EAAE,MAAM;AAAA,MAC5B,KAAK;AAAA,MACL,UAAU,OAAO;AAAA,IAClB,CAAC;AACD,WAAO,mBAAmB;AAAA,EAC3B;AAEA,uBAAqB,EAAE,MAAM,EAAE,KAAK,mCAAmC,CAAC;AACxE,SAAO,+BAA+B,IAAI;AAC3C;;;AC9BO,SAASC,UAAS;AACxB,SAAO,UAAU,gBAAgB;AAClC;;;ACcA,IAAM,kBAAkB;AACxB,IAAM,qBAAqB;AAM3B,eAAsB,oBACrB,SACgB;AAChB,yBAAuB;AAEvB,EAAAC,QAAO,EAAE,MAAM;AAAA,IACd,KAAK;AAAA,IACL,SAAS,QAAQ;AAAA,EAClB,CAAC;AAED,QAAM,OAAO,YAAY;AACzB,QAAM,cAAc,eAAe;AACnC,QAAM,SAAS,KAAK,KAAK,aAAa,KAAK;AAC3C,QAAM,SAAS,KAAK,KAAK,aAAa,KAAK;AAC3C,QAAM,UAAU,KAAK,KAAK,QAAQ,QAAQ,cAAc;AACxD,QAAM,sBAAsB,MAAM;AAClC,QAAM,sBAAsB,MAAM;AAClC,QAAM,sBAAsB,OAAO;AAGnC,MAAI,MAAM,gBAAgB,GAAG;AAC5B,QAAI;AACH,YAAM,SAAS,MAAM,oBAAoB;AACzC,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,SAAS,OAAO;AAAA,MACjB,CAAC;AACD;AAAA,IACD,SAAS,OAAO;AACf,MAAAA,QAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AACD,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,QAAM,iBACL,QAAQ,aAAa,UAClB,GAAG,kBAAkB,IAAI,QAAQ,OAAO,SACxC,GAAG,kBAAkB,IAAI,QAAQ,OAAO;AAC5C,QAAM,aAAa,KAAK,KAAK,QAAQ,cAAc;AACnD,QAAM,6BAA6B,YAAY,QAAQ,SAAS,MAAM;AAEtE,QAAM,aAAY,oBAAI,KAAK,GACzB,YAAY,EACZ,QAAQ,MAAM,GAAG,EACjB,QAAQ,OAAO,GAAG;AACpB,QAAM,gBAAgB,KAAK,KAAK,SAAS,UAAU,SAAS,aAAa;AACzE,QAAM,gBAAgB,KAAK,KAAK,SAAS,UAAU,SAAS,aAAa;AAEzE,QAAM,SAAS,cAAc;AAC7B,QAAM,eAAe,OAAO,kBAAkB,eAAe;AAAA,IAC5D,OAAO;AAAA,EACR,CAAC;AACD,QAAM,eAAe,OAAO,kBAAkB,eAAe;AAAA,IAC5D,OAAO;AAAA,EACR,CAAC;AAED,EAAAA,QAAO,EAAE,MAAM;AAAA,IACd,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,EACT,CAAC;AAED,QAAM,eAAe,oBAAoB;AACzC,QAAM,QAAQ,aAAa,MAAM,YAAY,CAAC,OAAO,GAAG;AAAA,IACvD,KAAK,KAAK,QAAQ,UAAU;AAAA,IAC5B,OAAO,CAAC,WAAW,QAAQ,MAAM;AAAA,IACjC,KAAK;AAAA,MACJ,GAAG,QAAQ;AAAA,IACZ;AAAA,EACD,CAAC;AAED,MAAI,CAAC,MAAM,KAAK;AACf,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACvD;AAGA,MAAI,MAAM,QAAQ;AACjB,UAAM,OAAO,KAAK,YAAY;AAAA,EAC/B;AACA,MAAI,MAAM,QAAQ;AACjB,UAAM,OAAO,KAAK,YAAY;AAAA,EAC/B;AACA,EAAAA,QAAO,EAAE,MAAM;AAAA,IACd,KAAK;AAAA,IACL,KAAK,MAAM;AAAA,IACX,KAAK,KAAK,QAAQ,UAAU;AAAA,EAC7B,CAAC;AAED,QAAM,KAAK,QAAQ,CAAC,MAAM,WAAW;AACpC,IAAAA,QAAO,EAAE,KAAK;AAAA,MACb,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,IACV,CAAC;AAED,iBAAa,IAAI;AACjB,iBAAa,IAAI;AAAA,EAClB,CAAC;AAED,QAAM,KAAK,SAAS,CAAC,UAAU;AAC9B,IAAAA,QAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL;AAAA,IACD,CAAC;AAED,iBAAa,IAAI;AACjB,iBAAa,IAAI;AAAA,EAClB,CAAC;AAGD,QAAM,oBAAoB;AAE1B,EAAAA,QAAO,EAAE,KAAK;AAAA,IACb,KAAK;AAAA,IACL,KAAK,MAAM;AAAA,IACX,SAAS,QAAQ;AAAA,IACjB,MAAM;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IACT;AAAA,EACD,CAAC;AACF;AAEA,eAAe,6BACd,YACA,SACA,QACgB;AAChB,QAAM,eAAe,MAAM,WAAW,UAAU;AAChD,MAAI,cAAc;AACjB,IAAAA,QAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL;AAAA,MACA,MAAM;AAAA,IACP,CAAC;AACD;AAAA,EACD;AAEA,QAAM,EAAE,eAAe,UAAU,IAAI,qBAAqB;AAC1D,QAAM,aAAa,GAAG,kBAAkB,IAAI,aAAa,GAAG,SAAS;AACrE,QAAM,cAAc,GAAG,eAAe,IAAI,OAAO,WAAW,UAAU;AACtE,EAAAA,QAAO,EAAE,KAAK;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EACD,CAAC;AAED,QAAM,WAAW,MAAM,MAAM,WAAW;AACxC,MAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AACnC,UAAM,IAAI;AAAA,MACT,+CAA+C,WAAW,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IACtG;AAAA,EACD;AAGA,QAAMC,UAAS,cAAc;AAC7B,QAAM,WAAW,GAAG,UAAU,IAAIA,QAAO,WAAW,CAAC;AACrD,QAAM,YAAY,KAAK,IAAI;AAE3B,EAAAD,QAAO,EAAE,MAAM;AAAA,IACd,KAAK;AAAA,IACL;AAAA,IACA,eAAe,SAAS,QAAQ,IAAI,gBAAgB;AAAA,EACrD,CAAC;AAGD,QAAM,sBAAsB,WAAW,MAAM;AAC5C,IAAAA,QAAO,EAAE,KAAK;AAAA,MACb,KAAK;AAAA,MACL;AAAA,IACD,CAAC;AAAA,EACF,GAAG,GAAI;AAEP,MAAI;AACH,UAAM,SAAS,cAAc;AAC7B,UAAM,SAAS,cAAc;AAC7B,UAAM,OAAO;AAAA,MACZ,SAAS;AAAA,MACT,OAAO,kBAAkB,QAAQ;AAAA,IAClC;AAGA,iBAAa,mBAAmB;AAGhC,UAAM,KAAK,UAAU;AACrB,UAAM,QAAQ,MAAM,GAAG,KAAK,QAAQ;AACpC,UAAM,mBAAmB,KAAK,IAAI,IAAI;AAEtC,QAAI,QAAQ,aAAa,SAAS;AACjC,YAAM,GAAG,MAAM,UAAU,GAAK;AAAA,IAC/B;AACA,UAAM,GAAG,OAAO,UAAU,UAAU;AAEpC,IAAAA,QAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,MAAM,MAAM;AAAA,MACZ,YAAY;AAAA,IACb,CAAC;AACD,IAAAA,QAAO,EAAE,KAAK;AAAA,MACb,KAAK;AAAA,MACL;AAAA,MACA,MAAM;AAAA,IACP,CAAC;AAAA,EACF,SAAS,OAAO;AAEf,iBAAa,mBAAmB;AAGhC,IAAAA,QAAO,EAAE,KAAK;AAAA,MACb,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,IACV,CAAC;AACD,QAAI;AACH,YAAM,KAAK,UAAU;AACrB,YAAM,GAAG,OAAO,QAAQ;AAAA,IACzB,SAAS,aAAa;AAAA,IAEtB;AACA,UAAM;AAAA,EACP;AACD;AAEA,SAAS,uBAAqE;AAC7E,SAAO,wBAAwB,QAAQ,UAAU,QAAQ,IAAI;AAC9D;AAEO,SAAS,wBACf,UACA,MAC+C;AAC/C,UAAQ,UAAU;AAAA,IACjB,KAAK;AACJ,UAAI,SAAS,SAAS;AACrB,eAAO,EAAE,eAAe,wBAAwB,WAAW,GAAG;AAAA,MAC/D;AACA,UAAI,SAAS,OAAO;AACnB,eAAO,EAAE,eAAe,uBAAuB,WAAW,GAAG;AAAA,MAC9D;AACA;AAAA,IACD,KAAK;AACJ,UAAI,SAAS,OAAO;AACnB,eAAO;AAAA,UACN,eAAe;AAAA,UACf,WAAW;AAAA,QACZ;AAAA,MACD;AACA;AAAA,IACD,KAAK;AACJ,UAAI,SAAS,OAAO;AACnB,eAAO;AAAA,UACN,eAAe;AAAA,UACf,WAAW;AAAA,QACZ;AAAA,MACD;AACA;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACT,iDAAiD,QAAQ,IAAI,IAAI;AAAA,EAClE;AACD;AACA,eAAe,kBAAoC;AAElD,SAAO,MAAM,kCAAkC,WAAW;AAC3D;AAEA,eAAe,kCACd,MACmB;AACnB,MAAI;AACJ,MAAI;AACH,eAAW,MAAM,MAAM,oBAAoB,IAAI,SAAS;AAAA,EACzD,SAAS,KAAK;AAEb,WAAO;AAAA,EACR;AAEA,MAAI,SAAS,IAAI;AAChB,UAAM,SAAU,MAAM,SAAS,KAAK;AAGpC,QAAI,OAAO,YAAY,UAAU;AAChC,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AACD,aAAO;AAAA,IACR,WAAW,OAAO,YAAY,YAAY;AACzC,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AACD,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD,OAAO;AACN,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,SAAO;AACR;AACA,eAAe,WAAW,UAAoC;AAC7D,MAAI;AACH,UAAM,KAAK,UAAU;AACrB,UAAM,GAAG,OAAO,QAAQ;AACxB,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AAQxB,eAAe,sBAAqD;AACnE,QAAM,aAAa,KAAK,KAAK,kBAAkB,eAAe;AAE9D,EAAAA,QAAO,EAAE,MAAM,EAAE,KAAK,kCAAkC,CAAC;AAEzD,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACpC,QAAI;AACH,YAAM,WAAW,MAAM,MAAM,GAAG,eAAe,WAAW;AAAA,QACzD,QAAQ,YAAY,QAAQ,GAAI;AAAA,MACjC,CAAC;AACD,UAAI,SAAS,IAAI;AAChB,cAAM,SAAU,MAAM,SAAS,KAAK;AACpC,QAAAA,QAAO,EAAE,MAAM,EAAE,KAAK,6BAA6B,CAAC;AACpD,eAAO;AAAA,MACR;AAAA,IACD,SAAS,OAAO;AAEf,MAAAA,QAAO,EAAE,MAAM,EAAE,KAAK,8BAA8B,MAAM,CAAC;AAC3D,UAAI,MAAM,aAAa,GAAG;AACzB,cAAM,IAAI;AAAA,UACT,oCAAoC,UAAU,aAAa,KAAK;AAAA,QACjE;AAAA,MACD;AAAA,IACD;AAEA,QAAI,IAAI,aAAa,GAAG;AACvB,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,SAAS,IAAI;AAAA,QACb;AAAA,MACD,CAAC;AACD,YAAM,IAAI;AAAA,QAAQ,CAAC,YAClB,WAAW,SAAS,eAAe;AAAA,MACpC;AAAA,IACD;AAAA,EACD;AAEA,QAAM,IAAI,MAAM,oCAAoC,UAAU,UAAU;AACzE;;;ACjZA,SAAS,wBAAwB;AA8C1B,SAAS,gBACf,QACA,aACqB;AACrB,MAAI,CAAC,OAAO,UAAU,QAAS,QAAO;AAEtC,QAAM,MAAM,IAAI,IAAI,2BAA2B;AAG/C,QAAM,WACL,OAAO,UAAU,oBAChB,OAAO,gBAAgB,OACrB,oBAAoB,WAAW,KAC/B;AACJ,MAAI,UAAU;AACb,QAAI,aAAa,IAAI,KAAK,QAAQ;AAAA,EACnC;AAEA,SAAO,IAAI;AACZ;;;AC/DO,SAASE,UAAS;AACxB,SAAO,UAAU,YAAY;AAC9B;;;ACFA,OAAOC,gBAAe;AAOtB,eAAsB,0BACrB,QACgB;AAChB,EAAAC,QAAO,EAAE,MAAM,+BAA+B;AAE9C,MAAI;AAEH,QAAI,CAAC,OAAO,WAAW;AACtB,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AACA,QAAI,CAAC,OAAO,UAAU;AACrB,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAGA,UAAM,eAAe,OAAO,WAAW;AACvC,IAAAC,WAAU,cAAc,kCAAkC;AAE1D,UAAM,eAAe,oCAAoC,MAAM;AAG/D,IAAAD,QAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,UAAU,OAAO;AAAA,IAClB,CAAC;AACD,UAAM,SAAS,MAAM,eAAe,YAAY;AAGhD,UAAM,aAAa,aAAa,QAAQ;AACxC,IAAAA,QAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL;AAAA,MACA,WAAW,OAAO;AAAA,IACnB,CAAC;AACD,UAAM,mBAAmB;AAAA,MACxB,YAAY;AAAA,QACX,KAAK,aAAa;AAAA,QAClB,SAAS,aAAa,WAAW,CAAC;AAAA,QAClC,aAAa,aAAa,cAAc;AAAA,QACxC,aAAa,aAAa,cAAc;AAAA,QACxC,kBAAkB,aAAa,mBAAmB,KAAK;AAAA,QACvD,gBAAgB,aAAa,iBAAiB;AAAA,QAC9C,kBAAkB,aAAa,kBAAkB;AAAA,MAClD;AAAA,MACA,UAAU,aAAa,YAAY,CAAC;AAAA,IACrC;AACA,UAAM,mBAAmB,cAAc,YAAY;AAAA,MAClD,aAAa,OAAO;AAAA,QACnB,OAAO,YAAY,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,gBAAgB,CAAC;AAAA,MAC3D;AAAA,IACD,CAAC;AAED,IAAAA,QAAO,EAAE,KAAK;AAAA,MACb,KAAK;AAAA,MACL;AAAA,MACA,WAAW,OAAO;AAAA,IACnB,CAAC;AAAA,EACF,SAAS,OAAO;AACf,IAAAA,QAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL;AAAA,IACD,CAAC;AAAA,EAGF;AACD;;;AC5EO,SAASE,UAAS;AACxB,SAAO,UAAU,UAAU;AAC5B;;;ACEA,OAAO,aAAa;AAEpB,IAAM,eAAe;AAOrB,eAAsB,aACrB,YAAoB,cACF;AAMlB,YAAU,UAAU,OAAe,QAAgB,KAAuB;AACzE,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC/B,YAAM,QAAQ;AAAA,IACf;AAAA,EACD;AAEA,SAAO,QAAQ,EAAE,MAAM,UAAU,SAAS,EAAE,CAAC;AAC9C;AAEA,eAAsB,mBACrB,QACA,aACA,KACqC;AACrC,QAAM,UAAU,cAAc;AAC9B,EAAAC,QAAO,EAAE,MAAM,EAAE,KAAK,8BAA8B,QAAQ,CAAC;AAE7D,UAAQ,SAAS;AAAA,IAChB,KAAK;AACJ,aAAO,UAAU,QAAQ,aAAa,GAAG;AAAA,IAC1C,KAAK;AACJ,aAAO,SAAS,QAAQ,aAAa,GAAG;AAAA,IACzC,KAAK;AACJ,aAAO,UAAU,QAAQ,aAAa,GAAG;AAAA,IAC1C;AACC,aAAO,UAAU,QAAQ,aAAa,GAAG;AAAA,EAC3C;AACD;AAEA,eAAe,UACd,QACA,aACA,KACqC;AAErC,QAAM,mBAAmB;AACzB,MAAI;AACJ,MAAI;AACH,UAAM,MAAM,MAAM;AAAA;AAAA,MAEjB;AAAA;AAED,YAAQ,IAAI;AAAA,EACb,SAAS,KAAK;AACb,IAAAA,QAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,OAAO,eAAe,GAAG;AAAA,IAC1B,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EACf;AAGA,QAAM,eAAe;AACrB,MAAI;AACJ,MAAI;AACH,UAAM,MAAM,MAAM;AAAA;AAAA,MAEjB;AAAA;AAED,0BAAsB,IAAI;AAAA,EAC3B,SAAS,KAAK;AACb,IAAAA,QAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,OAAO,eAAe,GAAG;AAAA,IAC1B,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EACf;AAGA,QAAM,EAAE,iBAAiB,iBAAiB,IAAI,oBAAoB;AAAA,IACjE;AAAA,EACD,CAAC;AAGD,QAAM,OAAO;AACb,QAAM,SAAS;AAAA,IAAM,EAAE,OAAO,IAAI,OAAO,KAAK;AAAA,IAAG,MAChDA,QAAO,EAAE,KAAK,EAAE,KAAK,oBAAoB,KAAK,CAAC;AAAA,EAChD;AACA,kBAAgB,MAAM;AAEtB,SAAO,EAAE,iBAAiB;AAC3B;AAEA,eAAe,UACd,QACA,aACA,KACqC;AAErC,QAAM,iBAAiB;AACvB,MAAI;AACJ,MAAI;AACH,UAAM,MAAM,MAAM;AAAA;AAAA,MAEjB;AAAA;AAED,uBAAmB,IAAI;AAAA,EACxB,SAAS,KAAK;AACb,IAAAA,QAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,OAAO,eAAe,GAAG;AAAA,IAC1B,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,OAAO,OAAO;AAGpB,OAAK,MAAM,EAAE,KAAK,GAAG,IAAI,KAAK;AAC9B,EAAAA,QAAO,EAAE,KAAK,EAAE,KAAK,oBAAoB,KAAK,CAAC;AAE/C,SAAO,EAAE,iBAAiB;AAC3B;AAEA,eAAe,SACd,QACA,aACA,KACqC;AAErC,QAAM,gBAAgB;AACtB,MAAI;AACJ,MAAI;AACH,UAAM,MAAM,MAAM;AAAA;AAAA,MAEjB;AAAA;AAED,yBAAqB,IAAI;AAAA,EAC1B,SAAS,KAAK;AACb,IAAAA,QAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,OAAO,eAAe,GAAG;AAAA,IAC1B,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,EAAE,WAAW,iBAAiB,IAAI,mBAAmB;AAE3D,QAAM,OAAO,OAAO;AAIpB,MAAI,MAAM;AAAA,IACT,OAAO,IAAI;AAAA,IACX;AAAA,IACA;AAAA,EACD,CAAC;AACD,EAAAA,QAAO,EAAE,KAAK,EAAE,KAAK,oBAAoB,KAAK,CAAC;AAE/C,SAAO,EAAE,iBAAiB;AAC3B;;;AC7KA,OAAOC,gBAAe;;;ACAtB,SAAS,KAAAC,UAAS;AAEX,IAAM,+BAA+BA,GAAE,OAAO;AAAA,EACpD,UAAUA,GAAE,OAAO;AAAA,IAClB,OAAO;AAAA,EACR,CAAC;AAAA,EACD,OAAOA,GACL,OAAO,EAAE,OAAO,wCAAwC,CAAC,EACzD,SAAS;AAAA,EACX,YAAYA,GAAE,OACZ,OAAO;AAAA,IACP,OAAO;AAAA,EACR,CAAC,EACA,IAAI,EAAE,OAAO,gDAAgD,CAAC,EAC9D,IAAI,GAAG,EAAE,OAAO,8CAA8C,CAAC;AAAA,EACjE,YAAYA,GAAE,OAAO;AAAA,IACpB,OAAO;AAAA,EACR,CAAC;AAAA,EACD,WAAWA,GAAE,OAAO;AAAA,IACnB,OAAO;AAAA,EACR,CAAC;AACF,CAAC;;;ADNM,SAAS,sBACf,cACA,QACC;AACD,SAAO,aAAa,OAAO,WAAW,UAAU,CAAC,WAAW;AAE3D,WAAO,IAAI,KAAK,CAAC,MAAM;AACtB,aAAO,EAAE;AAAA,QACR;AAAA,MACD;AAAA,IACD,CAAC;AAGD,WAAO,IAAI,UAAU,OAAO,MAAM;AA5BpC;AA8BG,YAAM,cAAc,6BAA6B,UAAU;AAAA,QAC1D,UAAU,EAAE,IAAI,OAAO,kBAAkB;AAAA,QACzC,OAAO,EAAE,IAAI,OAAO,eAAe,KAAK;AAAA,QACxC,YAAY,EAAE,IAAI,OAAO,qBAAqB;AAAA,QAC9C,YAAY,EAAE,IAAI,OAAO,qBAAqB;AAAA,QAC9C,WAAW,EAAE,IAAI,OAAO,wBAAwB;AAAA,MACjD,CAAC;AACD,UAAI,CAAC,YAAY,SAAS;AACzB,cAAM,IAAI;AAAA,YACT,iBAAY,MAAM,OAAO,CAAC,MAA1B,mBAA6B,YAC5B;AAAA,QACF;AAAA,MACD;AACA,YAAM,EAAE,UAAU,OAAO,YAAY,YAAY,UAAU,IAC1D,YAAY;AAEb,MAAAC,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AAQD,UAAI,OAAO,UAAU;AACpB,YAAI,CAAC,eAAe,UAAU,OAAO,QAAQ,GAAG;AAC/C,gBAAM,IAAI,iBAAiB,OAAO,UAAU,QAAQ;AAAA,QACrD;AAEA,YAAI,cAAc,OAAO,WAAW;AACnC,gBAAM,IAAI,kBAAkB,OAAO,WAAW,SAAS;AAAA,QACxD;AAAA,MACD;AAGA,YAAM,YAA4B;AAAA,QACjC,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,UACP,GAAG,OAAO;AAAA,UACV;AAAA,UACA;AAAA;AAAA,UAEA,WAAW;AAAA,QACZ;AAAA,MACD;AAOA,YAAM,gBAAgB,IAAI;AAAA,QACzB,oCAAoC,SAAS;AAAA,MAC9C;AACA,YAAM,SAAS,uBAAuB,aAAa;AAGnD,YAAM,cAAc,aAAa;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,MACD;AACA,MAAAC;AAAA,QACC,YAAY;AAAA,QACZ;AAAA,MACD;AAEA,aAAO,MAAM,YAAY,sBAAsB,CAAC;AAAA,IACjD,CAAC;AAED,WAAO,IAAI,WAAW,CAAC,MAAM,oBAAoB,CAAC,CAAC;AAEnD,WAAO;AAAA,MAAI;AAAA,MAAa,CAAC,MACxB;AAAA,QACC;AAAA,QACA;AAAA,QACA,EAAE,YAAY,CAAC,EAAE;AAAA,QACjB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD,CAAC;AACF;AAQO,SAAS,qBAAqB,KAA4B;AAChE,MAAI;AACH,UAAM,SAAS,IAAI,IAAI,GAAG;AAE1B,UAAM,WACL,OAAO,aAAa,MAAM,MAAM,OAAO,SAAS,QAAQ,QAAQ,EAAE;AAGnE,QAAI,WAAW,kBAAkB,OAAO,QAAQ,IAC7C,cACA,OAAO;AAKV,eAAW,0BAA0B,QAAQ;AAG7C,UAAM,OAAO,OAAO,OAAO,GAAG,QAAQ,IAAI,OAAO,IAAI,KAAK;AAG1D,WAAO,GAAG,OAAO,QAAQ,KAAK,IAAI,GAAG,QAAQ;AAAA,EAC9C,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAaA,SAAS,0BAA0B,UAA0B;AAE5D,MAAI,CAAC,SAAS,SAAS,YAAY,GAAG;AACrC,WAAO;AAAA,EACR;AAEA,MAAI,CAAC,SAAS,WAAW,MAAM,GAAG;AACjC,WAAO;AAAA,EACR;AAGA,QAAM,gBAAgB,SAAS,MAAM,CAAC;AACtC,QAAM,gBAAgB,cAAc,QAAQ,GAAG;AAC/C,MAAI,kBAAkB,IAAI;AACzB,WAAO;AAAA,EACR;AAGA,QAAM,SAAS,cAAc,MAAM,gBAAgB,CAAC;AACpD,SAAO,OAAO,MAAM;AACrB;AAMO,SAAS,eAAe,GAAW,GAAoB;AAC7D,QAAM,cAAc,qBAAqB,CAAC;AAC1C,QAAM,cAAc,qBAAqB,CAAC;AAC1C,MAAI,gBAAgB,QAAQ,gBAAgB,MAAM;AAEjD,WAAO,MAAM;AAAA,EACd;AACA,SAAO,gBAAgB;AACxB;AAKA,SAAS,kBAAkB,UAA2B;AACrD,SACC,aAAa,eACb,aAAa,aACb,aAAa,SACb,aAAa;AAEf;;;AT9LA,SAAS,QAAQ,OAAe,OAAqB;AACpD,QAAM,UAAU,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC;AACzD,UAAQ,IAAI,OAAO,KAAK,IAAI,OAAO,GAAG,KAAK,EAAE;AAC9C;AAYO,IAAM,UAAN,MAAM,SAAkC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA,IAAI,SAAS;AACZ,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,SAAS;AACZ,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,gBAAgB;AACnB,WAAO,KAAK;AAAA,EACb;AAAA;AAAA,EAGQ,YACP,UACA,QACA,QACA,eACA,aACC;AACD,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,iBAAiB;AACtB,SAAK,cAAc;AAAA,EACpB;AAAA,EAEA,aAAa,OACZ,UACsB;AA9ExB;AA+EE,IAAAC,QAAO,EAAE,KAAK,mBAAmB;AAEjC,UAAM,SAAS,SAAS,YAAY;AAEpC,SAAI,YAAO,YAAP,mBAAgB,YAAY;AAC/B,0BAAoB,OAAO,QAAQ,UAAU;AAAA,IAC9C,OAAO;AACN,8BAAuB,YAAO,YAAP,mBAAgB,KAAK;AAAA,IAC7C;AAKA,IAAAC;AAAA,MACC,EAAE,OAAO,WAAW,eAAe,OAAO;AAAA,MAC1C;AAAA,IACD;AAEA,UAAM,SAAS,oBAAoB,MAAM;AACzC,UAAM,gBAAgB,OAAO,QAAQ,MAAM;AAe3C,QAAI;AACJ,QAAI,OAAO,WAAW,aAAa;AAClC,oBAAc;AACd,MAAAD,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,SAAS,OAAO,WAAW;AAAA,MAC5B,CAAC;AACD,YAAM,oBAAoB;AAAA,QACzB,SAAS,OAAO,WAAW;AAAA,MAC5B,CAAC;AAAA,IACF,WAAW,OAAO,cAAc;AAC/B,UAAI;AACJ,YAAM,sBAA2C,MAChD;AACD,oBAAc,uBAAuB,mBAAmB;AAExD,YAAM,EAAE,QAAQ,cAAc,IAAI;AAAA,QACjC;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAEA,oBAAc,MAAM,aAAa,OAAO,WAAW;AAEnD,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,MAAM;AAAA,MACP,CAAC;AAED,YAAM,MAAM,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,MACD;AACA,yBAAmB,IAAI;AAAA,IACxB;AAGA,UAAM,UAAU,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAGA,UAAM,cAAY,mBAAc,oBAAd,2CAAqC,CAAC;AACxD,IAAAA,QAAO,EAAE,KAAK;AAAA,MACb,KAAK;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,aAAa,OAAO,KAAK,OAAO,GAAG,EAAE;AAAA,MACrC,GAAG;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACR;AAAA,EAEA,kBAAwB;AACvB,QAAI,KAAK,eAAe,aAAc;AACtC,IAAAC,WAAU,CAAC,KAAK,YAAY,mCAAmC;AAC/D,SAAK,aAAa;AAElB,SAAK,oBAAoB;AAAA,MACxB,KAAK;AAAA,MACL,KAAK;AAAA,IACN,EAAE;AAEF,SAAK,cAAc;AAEnB,QAAI,KAAK,QAAQ,WAAW,qBAAqB;AAEhD,gCAA0B,KAAK,OAAO;AAAA,IACvC;AAAA,EACD;AAAA,EAEA,cAAoB;AACnB,QAAI,KAAK,eAAe,SAAU;AAClC,IAAAA,WAAU,CAAC,KAAK,YAAY,uCAAuC;AACnE,SAAK,aAAa;AAElB,QAAI,KAAK,QAAQ,UAAU,KAAK,QAAQ,sBAAsB;AAC7D,MAAAD,QAAO,EAAE,MAAM,uBAAuB;AACtC,YAAM,eAAe;AAAA,QACpB,KAAK;AAAA,MACN;AACA,WAAK,QAAQ,MAAM,KAAK,SAAS,KAAK,gBAAgB,YAAY;AAAA,IACnE;AAEA,SAAK,cAAc;AAAA,EACpB;AAAA,EAEA,gBAAsB;AACrB,QAAI,KAAK,QAAQ,UAAW;AAE5B,UAAM,eAAe,KAAK,cACvB,gBAAgB,KAAK,SAAS,KAAK,WAAW,IAC9C;AAEH,YAAQ,IAAI;AACZ,YAAQ;AAAA,MACP,cAAc,gBAAI,OAAO,KAAK,KAAK,QAAQ,WAAW,MAAM,KAAK,eAAe,eAAe,eAAe,QAAQ;AAAA,IACvH;AAGA,QAAI,KAAK,QAAQ,cAAc,WAAW;AACzC,cAAQ,aAAa,KAAK,QAAQ,SAAS;AAAA,IAC5C;AAGA,QAAI,KAAK,QAAQ,UAAU;AAC1B,YAAM,eAAe,KAAK,QAAQ,WAAW,cAC1C,iBACA,KAAK,QAAQ,eACZ,kBACA;AACJ,cAAQ,YAAY,GAAG,KAAK,QAAQ,QAAQ,KAAK,YAAY,GAAG;AAAA,IACjE;AAGA,QAAI,KAAK,eAAe,gBAAgB,KAAK,QAAQ,gBAAgB;AACpE,cAAQ,UAAU,KAAK,QAAQ,cAAc;AAAA,IAC9C;AAGA,QAAI,gBAAgB,KAAK,QAAQ,UAAU,SAAS;AACnD,cAAQ,aAAa,YAAY;AAAA,IAClC;AAGA,UAAM,aAAa,OAAO,KAAK,KAAK,QAAQ,GAAG,EAAE;AACjD,YAAQ,UAAU,WAAW,SAAS,CAAC;AAGvC,UAAM,cAAc,KAAK,eAAe,mBAAmB;AAC3D,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,YAAY,UAAU,GAAG;AAC5D,cAAQ,GAAG,CAAC;AAAA,IACb;AAEA,YAAQ,IAAI;AAAA,EACb;AAAA;AAAA,EAGA,wBAAwB,SAAgD;AACvE,IAAAC;AAAA,MACC,KAAK,eAAe;AAAA,MACpB;AAAA,IACD;AACA,IAAAA,WAAU,KAAK,mBAAmB,mCAAmC;AACrE,WAAO,KAAK,kBAAkB,MAAM,OAAO;AAAA,EAC5C;AACD;;;AWxOO,IAAM,WAAN,MAAyC;AAAA,EAC/C;AAAA,EAEA,IAAI,SAAiC;AACpC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,cAA8B;AAC7B,WAAO,qBAAqB,MAAM,KAAK,OAAO;AAAA,EAC/C;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EAEA,YAAY,QAAgC;AAC3C,SAAK,UAAU;AAGf,eAAW,MAAM;AAEhB,WAAK,eAAe;AAAA,IACrB,GAAG,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,iBAAsC;AACrC,QAAI,CAAC,KAAK,iBAAiB;AAC1B,WAAK,kBAAkB,QAAQ,OAAO,IAAI;AAE1C,WAAK,gBAAgB,KAAK,CAAC,OAAO;AACjC,aAAK,WAAW;AAAA,MACjB,CAAC;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAa,QAAQ,SAAqC;AACzD,UAAM,UAAU,MAAM,KAAK,eAAe;AAC1C,YAAQ,gBAAgB;AACxB,WAAO,MAAM,QAAQ,wBAAwB,OAAO;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,QAA2B;AACjC,WAAO,EAAE,OAAO,KAAK,QAAQ,KAAK,IAAI,EAAE;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKO,cAAc;AAEpB,SAAK,eAAe,EAAE,KAAK,CAAC,YAAY,QAAQ,YAAY,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,MACN,aACgC;AAChC,UAAM,SAAS,yBAAyB,MAAM,WAAW;AAGzD,QACC,OAAO,2BACP,OAAO,eAAe,cACrB;AACD,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAGA,UAAM,WAAW,MAAM;AACvB,QAAI,YAAY,OAAO,eAAe,cAAc;AACnD,WAAI,2CAAa,eAAc,OAAW,QAAO,YAAY;AAC7D,WAAI,2CAAa,6BAA4B;AAC5C,eAAO,0BAA0B;AAAA,IACnC;AAGA,QAAI,OAAO,eAAe,cAAc;AACvC,aAAO,KAAK,uBAAuB,QAAQ,WAAW;AAAA,IACvD,OAAO;AACN,aAAO,KAAK,mBAAmB,MAAM;AAAA,IACtC;AAAA,EACD;AAAA,EAEA,uBACC,QACA,cACgC;AAIhC,UAAM,SAAS,aAAmB;AAAA,MACjC,UAAU,OAAO;AAAA,MACjB,OAAO,OAAO;AAAA,MACd,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,IACjB,CAAC;AAED,WAAO;AAAA,MACN;AAAA,MACA,OAAO,KAAK,QAAQ,KAAK,IAAI;AAAA,IAC9B;AAAA,EACD;AAAA,EAEA,mBACC,QACgC;AAGhC,SAAK,eAAe,EAAE,KAAK,CAAC,YAAY,QAAQ,YAAY,CAAC;AAG7D,UAAM,SAAS,aAAmB;AAAA,MACjC,UAAU,OAAO;AAAA,MACjB,OAAO,OAAO;AAAA,MACd,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,IACjB,CAAC;AAED,WAAO;AAAA,MACN;AAAA,MACA,OAAO,KAAK,QAAQ,KAAK,IAAI;AAAA,IAC9B;AAAA,EACD;AACD;AAEO,SAAS,MACf,OACc;AACd,SAAO,IAAI,SAAS,KAAK;AAC1B;","names":["actor","_a","_b","z","z","z","z","invariant","logger","logger","crypto","logger","invariant","logger","invariant","logger","logger","invariant","z","logger","invariant","logger","invariant"]}
1
+ {"version":3,"sources":["../../src/actor/config.ts","../../src/actor/mod.ts","../../src/drivers/engine/actor-driver.ts","../../src/drivers/engine/log.ts","../../src/drivers/engine/config.ts","../../src/drivers/engine/mod.ts","../../src/registry/config/legacy-runner.ts","../../runtime/index.ts","../../src/drivers/default.ts","../../src/engine-process/log.ts","../../src/engine-process/mod.ts","../../src/inspector/utils.ts","../../src/serverless/log.ts","../../src/serverless/configure.ts","../../src/registry/log.ts","../../src/registry/serve.ts","../../src/serverless/router.ts","../../src/manager/router-schema.ts","../../src/registry/index.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport type { Conn } from \"./conn/mod\";\nimport type {\n\tActionContext,\n\tActorContext,\n\tBeforeActionResponseContext,\n\tBeforeConnectContext,\n\tConnectContext,\n\tCreateConnStateContext,\n\tCreateContext,\n\tCreateVarsContext,\n\tDestroyContext,\n\tDisconnectContext,\n\tRequestContext,\n\tSleepContext,\n\tStateChangeContext,\n\tWakeContext,\n\tWebSocketContext,\n} from \"./contexts\";\nimport type { AnyDatabaseProvider } from \"./database\";\n\nexport interface ActorTypes<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> {\n\tstate?: TState;\n\tconnParams?: TConnParams;\n\tconnState?: TConnState;\n\tvars?: TVars;\n\tinput?: TInput;\n\tdatabase?: TDatabase;\n}\n\n// Helper for validating function types - accepts generic for specific function signatures\nconst zFunction = <\n\tT extends (...args: any[]) => any = (...args: unknown[]) => unknown,\n>() => z.custom<T>((val) => typeof val === \"function\");\n\n// This schema is used to validate the input at runtime. The generic types are defined below in `ActorConfig`.\n//\n// We don't use Zod generics with `z.custom` because:\n// (a) there seems to be a weird bug in either Zod, tsup, or TSC that causese external packages to have different types from `z.infer` than from within the same package and\n// (b) it makes the type definitions incredibly difficult to read as opposed to vanilla TypeScript.\nexport const ActorConfigSchema = z\n\t.object({\n\t\tonCreate: zFunction().optional(),\n\t\tonDestroy: zFunction().optional(),\n\t\tonWake: zFunction().optional(),\n\t\tonSleep: zFunction().optional(),\n\t\tonStateChange: zFunction().optional(),\n\t\tonBeforeConnect: zFunction().optional(),\n\t\tonConnect: zFunction().optional(),\n\t\tonDisconnect: zFunction().optional(),\n\t\tonBeforeActionResponse: zFunction().optional(),\n\t\tonRequest: zFunction().optional(),\n\t\tonWebSocket: zFunction().optional(),\n\t\tactions: z.record(z.string(), zFunction()).default(() => ({})),\n\t\tstate: z.any().optional(),\n\t\tcreateState: zFunction().optional(),\n\t\tconnState: z.any().optional(),\n\t\tcreateConnState: zFunction().optional(),\n\t\tvars: z.any().optional(),\n\t\tdb: z.any().optional(),\n\t\tcreateVars: zFunction().optional(),\n\t\toptions: z\n\t\t\t.object({\n\t\t\t\tcreateVarsTimeout: z.number().positive().default(5000),\n\t\t\t\tcreateConnStateTimeout: z.number().positive().default(5000),\n\t\t\t\tonConnectTimeout: z.number().positive().default(5000),\n\t\t\t\t// This must be less than ACTOR_STOP_THRESHOLD_MS\n\t\t\t\tonSleepTimeout: z.number().positive().default(5000),\n\t\t\t\tonDestroyTimeout: z.number().positive().default(5000),\n\t\t\t\tstateSaveInterval: z.number().positive().default(10_000),\n\t\t\t\tactionTimeout: z.number().positive().default(60_000),\n\t\t\t\t// Max time to wait for waitUntil background promises during shutdown\n\t\t\t\twaitUntilTimeout: z.number().positive().default(15_000),\n\t\t\t\tconnectionLivenessTimeout: z.number().positive().default(2500),\n\t\t\t\tconnectionLivenessInterval: z.number().positive().default(5000),\n\t\t\t\tnoSleep: z.boolean().default(false),\n\t\t\t\tsleepTimeout: z.number().positive().default(30_000),\n\t\t\t\t/**\n\t\t\t\t * Can hibernate WebSockets for onWebSocket.\n\t\t\t\t *\n\t\t\t\t * WebSockets using actions/events are hibernatable by default.\n\t\t\t\t *\n\t\t\t\t * @experimental\n\t\t\t\t **/\n\t\t\t\tcanHibernateWebSocket: z\n\t\t\t\t\t.union([\n\t\t\t\t\t\tz.boolean(),\n\t\t\t\t\t\tzFunction<(request: Request) => boolean>(),\n\t\t\t\t\t])\n\t\t\t\t\t.default(false),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.prefault(() => ({})),\n\t})\n\t.strict()\n\t.refine(\n\t\t(data) => !(data.state !== undefined && data.createState !== undefined),\n\t\t{\n\t\t\tmessage: \"Cannot define both 'state' and 'createState'\",\n\t\t\tpath: [\"state\"],\n\t\t},\n\t)\n\t.refine(\n\t\t(data) =>\n\t\t\t!(\n\t\t\t\tdata.connState !== undefined &&\n\t\t\t\tdata.createConnState !== undefined\n\t\t\t),\n\t\t{\n\t\t\tmessage: \"Cannot define both 'connState' and 'createConnState'\",\n\t\t\tpath: [\"connState\"],\n\t\t},\n\t)\n\t.refine(\n\t\t(data) => !(data.vars !== undefined && data.createVars !== undefined),\n\t\t{\n\t\t\tmessage: \"Cannot define both 'vars' and 'createVars'\",\n\t\t\tpath: [\"vars\"],\n\t\t},\n\t);\n\n// Creates state config\n//\n// This must have only one or the other or else TState will not be able to be inferred\n//\n// Data returned from this handler will be available on `c.state`.\ntype CreateState<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> =\n\t| { state: TState }\n\t| {\n\t\t\tcreateState: (\n\t\t\t\tc: CreateContext<TState, TInput, TDatabase>,\n\t\t\t\tinput: TInput,\n\t\t\t) => TState | Promise<TState>;\n\t }\n\t| Record<never, never>;\n\n// Creates connection state config\n//\n// This must have only one or the other or else TState will not be able to be inferred\n//\n// Data returned from this handler will be available on `c.conn.state`.\ntype CreateConnState<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> =\n\t| { connState: TConnState }\n\t| {\n\t\t\tcreateConnState: (\n\t\t\t\tc: CreateConnStateContext<TState, TVars, TInput, TDatabase>,\n\t\t\t\tparams: TConnParams,\n\t\t\t) => TConnState | Promise<TConnState>;\n\t }\n\t| Record<never, never>;\n\n// Creates vars config\n//\n// This must have only one or the other or else TState will not be able to be inferred\n/**\n * @experimental\n */\ntype CreateVars<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> =\n\t| {\n\t\t\t/**\n\t\t\t * @experimental\n\t\t\t */\n\t\t\tvars: TVars;\n\t }\n\t| {\n\t\t\t/**\n\t\t\t * @experimental\n\t\t\t */\n\t\t\tcreateVars: (\n\t\t\t\tc: CreateVarsContext<TState, TInput, TDatabase>,\n\t\t\t\tdriverCtx: any,\n\t\t\t) => TVars | Promise<TVars>;\n\t }\n\t| Record<never, never>;\n\nexport interface Actions<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> {\n\t[Action: string]: (\n\t\tc: ActionContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\t...args: any[]\n\t) => any;\n}\n\n//export type ActorConfig<TState, TConnParams, TConnState, TVars, TInput, TAuthData> = BaseActorConfig<TState, TConnParams, TConnState, TVars, TInput, TAuthData> &\n//\tActorConfigLifecycle<TState, TConnParams, TConnState, TVars, TInput, TAuthData> &\n//\tCreateState<TState, TConnParams, TConnState, TVars, TInput, TAuthData> &\n//\tCreateConnState<TState, TConnParams, TConnState, TVars, TInput, TAuthData>;\n\n/**\n * @experimental\n */\nexport type AuthIntent = \"get\" | \"create\" | \"connect\" | \"action\" | \"message\";\n\ninterface BaseActorConfig<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTActions extends Actions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>,\n> {\n\t/**\n\t * Called when the actor is first initialized.\n\t *\n\t * Use this hook to initialize your actor's state.\n\t * This is called before any other lifecycle hooks.\n\t */\n\tonCreate?: (\n\t\tc: CreateContext<TState, TInput, TDatabase>,\n\t\tinput: TInput,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when the actor is destroyed.\n\t */\n\tonDestroy?: (\n\t\tc: DestroyContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when the actor is started and ready to receive connections and action.\n\t *\n\t * Use this hook to initialize resources needed for the actor's operation\n\t * (timers, external connections, etc.)\n\t *\n\t * @returns Void or a Promise that resolves when startup is complete\n\t */\n\tonWake?: (\n\t\tc: WakeContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when the actor is stopping or sleeping.\n\t *\n\t * Use this hook to clean up resources, save state, or perform\n\t * any shutdown operations before the actor sleeps or stops.\n\t *\n\t * Not supported on all platforms.\n\t *\n\t * @returns Void or a Promise that resolves when shutdown is complete\n\t */\n\tonSleep?: (\n\t\tc: SleepContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when the actor's state changes.\n\t *\n\t * Use this hook to react to state changes, such as updating\n\t * external systems or triggering events.\n\t *\n\t * State changes made within this hook will NOT trigger\n\t * another onStateChange call, preventing infinite recursion.\n\t *\n\t * @param newState The updated state\n\t */\n\tonStateChange?: (\n\t\tc: StateChangeContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tnewState: TState,\n\t) => void;\n\n\t/**\n\t * Called before a client connects to the actor.\n\t *\n\t * Use this hook to determine if a connection should be accepted\n\t * and to initialize connection-specific state.\n\t *\n\t * @param opts Connection parameters including client-provided data\n\t * @returns The initial connection state or a Promise that resolves to it\n\t * @throws Throw an error to reject the connection\n\t */\n\tonBeforeConnect?: (\n\t\tc: BeforeConnectContext<TState, TVars, TInput, TDatabase>,\n\t\tparams: TConnParams,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when a client successfully connects to the actor.\n\t *\n\t * Use this hook to perform actions when a connection is established,\n\t * such as sending initial data or updating the actor's state.\n\t *\n\t * @param conn The connection object\n\t * @returns Void or a Promise that resolves when connection handling is complete\n\t */\n\tonConnect?: (\n\t\tc: ConnectContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tconn: Conn<TState, TConnParams, TConnState, TVars, TInput, TDatabase>,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called when a client disconnects from the actor.\n\t *\n\t * Use this hook to clean up resources associated with the connection\n\t * or update the actor's state.\n\t *\n\t * @param conn The connection that is being closed\n\t * @returns Void or a Promise that resolves when disconnect handling is complete\n\t */\n\tonDisconnect?: (\n\t\tc: DisconnectContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tconn: Conn<TState, TConnParams, TConnState, TVars, TInput, TDatabase>,\n\t) => void | Promise<void>;\n\n\t/**\n\t * Called before sending an action response to the client.\n\t *\n\t * Use this hook to modify or transform the output of an action before it's sent\n\t * to the client. This is useful for formatting responses, adding metadata,\n\t * or applying transformations to the output.\n\t *\n\t * @param name The name of the action that was called\n\t * @param args The arguments that were passed to the action\n\t * @param output The output that will be sent to the client\n\t * @returns The modified output to send to the client\n\t */\n\tonBeforeActionResponse?: <Out>(\n\t\tc: BeforeActionResponseContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tname: string,\n\t\targs: unknown[],\n\t\toutput: Out,\n\t) => Out | Promise<Out>;\n\n\t/**\n\t * Called when a raw HTTP request is made to the actor.\n\t *\n\t * This handler receives raw HTTP requests made to `/actors/{actorName}/http/*` endpoints.\n\t * Use this hook to handle custom HTTP patterns, REST APIs, or other HTTP-based protocols.\n\t *\n\t * @param c The request context with access to the connection\n\t * @param request The raw HTTP request object\n\t * @param opts Additional options\n\t * @returns A Response object to send back, or void to continue with default routing\n\t */\n\tonRequest?: (\n\t\tc: RequestContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\trequest: Request,\n\t) => Response | Promise<Response>;\n\n\t/**\n\t * Called when a raw WebSocket connection is established to the actor.\n\t *\n\t * This handler receives WebSocket connections made to `/actors/{actorName}/websocket/*` endpoints.\n\t * Use this hook to handle custom WebSocket protocols, binary streams, or other WebSocket-based communication.\n\t *\n\t * @param c The WebSocket context with access to the connection\n\t * @param websocket The raw WebSocket connection\n\t * @param opts Additional options including the original HTTP upgrade request\n\t */\n\tonWebSocket?: (\n\t\tc: WebSocketContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\twebsocket: UniversalWebSocket,\n\t) => void | Promise<void>;\n\n\tactions?: TActions;\n}\n\ntype ActorDatabaseConfig<TDatabase extends AnyDatabaseProvider> =\n\t| {\n\t\t\t/**\n\t\t\t * @experimental\n\t\t\t */\n\t\t\tdb: TDatabase;\n\t }\n\t| Record<never, never>;\n\n// 1. Infer schema\n// 2. Omit keys that we'll manually define (because of generics)\n// 3. Define our own types that have generic constraints\nexport type ActorConfig<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> = Omit<\n\tz.infer<typeof ActorConfigSchema>,\n\t| \"actions\"\n\t| \"onCreate\"\n\t| \"onDestroy\"\n\t| \"onWake\"\n\t| \"onStateChange\"\n\t| \"onBeforeConnect\"\n\t| \"onConnect\"\n\t| \"onDisconnect\"\n\t| \"onBeforeActionResponse\"\n\t| \"onRequest\"\n\t| \"onWebSocket\"\n\t| \"state\"\n\t| \"createState\"\n\t| \"connState\"\n\t| \"createConnState\"\n\t| \"vars\"\n\t| \"createVars\"\n\t| \"db\"\n> &\n\tBaseActorConfig<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tActions<TState, TConnParams, TConnState, TVars, TInput, TDatabase>\n\t> &\n\tCreateState<TState, TConnParams, TConnState, TVars, TInput, TDatabase> &\n\tCreateConnState<TState, TConnParams, TConnState, TVars, TInput, TDatabase> &\n\tCreateVars<TState, TConnParams, TConnState, TVars, TInput, TDatabase> &\n\tActorDatabaseConfig<TDatabase>;\n\n// See description on `ActorConfig`\nexport type ActorConfigInput<\n\tTState = undefined,\n\tTConnParams = undefined,\n\tTConnState = undefined,\n\tTVars = undefined,\n\tTInput = undefined,\n\tTDatabase extends AnyDatabaseProvider = undefined,\n\tTActions extends Actions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t> = Record<never, never>,\n> = {\n\ttypes?: ActorTypes<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>;\n} & Omit<\n\tz.input<typeof ActorConfigSchema>,\n\t| \"actions\"\n\t| \"onCreate\"\n\t| \"onDestroy\"\n\t| \"onWake\"\n\t| \"onSleep\"\n\t| \"onStateChange\"\n\t| \"onBeforeConnect\"\n\t| \"onConnect\"\n\t| \"onDisconnect\"\n\t| \"onBeforeActionResponse\"\n\t| \"onRequest\"\n\t| \"onWebSocket\"\n\t| \"state\"\n\t| \"createState\"\n\t| \"connState\"\n\t| \"createConnState\"\n\t| \"vars\"\n\t| \"createVars\"\n\t| \"db\"\n> &\n\tBaseActorConfig<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTActions\n\t> &\n\tCreateState<TState, TConnParams, TConnState, TVars, TInput, TDatabase> &\n\tCreateConnState<TState, TConnParams, TConnState, TVars, TInput, TDatabase> &\n\tCreateVars<TState, TConnParams, TConnState, TVars, TInput, TDatabase> &\n\tActorDatabaseConfig<TDatabase>;\n\n// For testing type definitions:\nexport function test<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTActions extends Actions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>,\n>(\n\tinput: ActorConfigInput<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTActions\n\t>,\n): ActorConfig<TState, TConnParams, TConnState, TVars, TInput, TDatabase> {\n\tconst config = ActorConfigSchema.parse(input) as ActorConfig<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>;\n\treturn config;\n}\n\n// MARK: Documentation Schema\n// This schema is JSON-serializable for documentation generation.\n// It excludes function types and focuses on the configurable options.\n\nexport const DocActorOptionsSchema = z\n\t.object({\n\t\tcreateVarsTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Timeout in ms for createVars handler. Default: 5000\"),\n\t\tcreateConnStateTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Timeout in ms for createConnState handler. Default: 5000\",\n\t\t\t),\n\t\tonConnectTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Timeout in ms for onConnect handler. Default: 5000\"),\n\t\tonSleepTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Timeout in ms for onSleep handler. Must be less than ACTOR_STOP_THRESHOLD_MS. Default: 5000\",\n\t\t\t),\n\t\tonDestroyTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Timeout in ms for onDestroy handler. Default: 5000\"),\n\t\tstateSaveInterval: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Interval in ms between automatic state saves. Default: 10000\",\n\t\t\t),\n\t\tactionTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\"Timeout in ms for action handlers. Default: 60000\"),\n\t\twaitUntilTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Max time in ms to wait for waitUntil background promises during shutdown. Default: 15000\",\n\t\t\t),\n\t\tconnectionLivenessTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Timeout in ms for connection liveness checks. Default: 2500\",\n\t\t\t),\n\t\tconnectionLivenessInterval: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Interval in ms between connection liveness checks. Default: 5000\",\n\t\t\t),\n\t\tnoSleep: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\"If true, the actor will never sleep. Default: false\"),\n\t\tsleepTimeout: z\n\t\t\t.number()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Time in ms of inactivity before the actor sleeps. Default: 30000\",\n\t\t\t),\n\t\tcanHibernateWebSocket: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Whether WebSockets using onWebSocket can be hibernated. WebSockets using actions/events are hibernatable by default. Default: false\",\n\t\t\t),\n\t})\n\t.describe(\"Actor options for timeouts and behavior configuration.\");\n\nexport const DocActorConfigSchema = z\n\t.object({\n\t\tstate: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Initial state value for the actor. Cannot be used with createState.\",\n\t\t\t),\n\t\tcreateState: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Function to create initial state. Receives context and input. Cannot be used with state.\",\n\t\t\t),\n\t\tconnState: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Initial connection state value. Cannot be used with createConnState.\",\n\t\t\t),\n\t\tcreateConnState: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Function to create connection state. Receives context and connection params. Cannot be used with connState.\",\n\t\t\t),\n\t\tvars: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Initial ephemeral variables value. Cannot be used with createVars.\",\n\t\t\t),\n\t\tcreateVars: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Function to create ephemeral variables. Receives context and driver context. Cannot be used with vars.\",\n\t\t\t),\n\t\tdb: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\"Database provider instance for the actor.\"),\n\t\tonCreate: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when the actor is first initialized. Use to initialize state.\",\n\t\t\t),\n\t\tonDestroy: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\"Called when the actor is destroyed.\"),\n\t\tonWake: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when the actor wakes up and is ready to receive connections and actions.\",\n\t\t\t),\n\t\tonSleep: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when the actor is stopping or sleeping. Use to clean up resources.\",\n\t\t\t),\n\t\tonStateChange: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called when the actor's state changes. State changes within this hook won't trigger recursion.\",\n\t\t\t),\n\t\tonBeforeConnect: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called before a client connects. Throw an error to reject the connection.\",\n\t\t\t),\n\t\tonConnect: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\"Called when a client successfully connects.\"),\n\t\tonDisconnect: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\"Called when a client disconnects.\"),\n\t\tonBeforeActionResponse: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called before sending an action response. Use to transform output.\",\n\t\t\t),\n\t\tonRequest: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called for raw HTTP requests to /actors/{name}/http/* endpoints.\",\n\t\t\t),\n\t\tonWebSocket: z\n\t\t\t.unknown()\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Called for raw WebSocket connections to /actors/{name}/websocket/* endpoints.\",\n\t\t\t),\n\t\tactions: z\n\t\t\t.record(z.string(), z.unknown())\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Map of action name to handler function. Defaults to an empty object.\",\n\t\t\t),\n\t\toptions: DocActorOptionsSchema.optional(),\n\t})\n\t.describe(\"Actor configuration passed to the actor() function.\");\n","import {\n\ttype Actions,\n\ttype ActorConfig,\n\ttype ActorConfigInput,\n\tActorConfigSchema,\n\tActorTypes,\n} from \"./config\";\nimport type { AnyDatabaseProvider } from \"./database\";\nimport { ActorDefinition } from \"./definition\";\n\nexport function actor<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n\tTActions extends Actions<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>,\n>(\n\tinput: ActorConfigInput<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase,\n\t\tTActions\n\t>,\n): ActorDefinition<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase,\n\tTActions\n> {\n\tconst config = ActorConfigSchema.parse(input) as ActorConfig<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>;\n\treturn new ActorDefinition(config);\n}\nexport type { Encoding } from \"@/actor/protocol/serde\";\nexport {\n\tALLOWED_PUBLIC_HEADERS,\n\tPATH_CONNECT,\n\tPATH_WEBSOCKET_PREFIX,\n} from \"@/common/actor-router-consts\";\nexport type {\n\tUniversalErrorEvent,\n\tUniversalEvent,\n\tUniversalEventSource,\n\tUniversalMessageEvent,\n} from \"@/common/eventsource-interface\";\nexport type {\n\tRivetCloseEvent,\n\tRivetEvent,\n\tRivetMessageEvent,\n\tUniversalWebSocket,\n} from \"@/common/websocket-interface\";\nexport type { ActorKey } from \"@/manager/protocol/query\";\nexport type * from \"./config\";\nexport type { AnyConn, Conn } from \"./conn/mod\";\nexport type { ActorDefinition, AnyActorDefinition } from \"./definition\";\nexport { lookupInRegistry } from \"./definition\";\nexport { UserError, type UserErrorOptions } from \"./errors\";\nexport { KEYS as KV_KEYS } from \"./instance/keys\";\nexport { ActorKv } from \"./instance/kv\";\nexport type { AnyActorInstance } from \"./instance/mod\";\nexport {\n\ttype ActorRouter,\n\tcreateActorRouter,\n} from \"./router\";\nexport { routeWebSocket } from \"./router-websocket-endpoints\";\n","import type {\n\tActorConfig as EngineActorConfig,\n\tRunnerConfig as EngineRunnerConfig,\n\tHibernatingWebSocketMetadata,\n} from \"@rivetkit/engine-runner\";\nimport { idToStr, Runner } from \"@rivetkit/engine-runner\";\nimport * as cbor from \"cbor-x\";\nimport type { Context as HonoContext } from \"hono\";\nimport { streamSSE } from \"hono/streaming\";\nimport { WSContext, type WSContextInit } from \"hono/ws\";\nimport invariant from \"invariant\";\nimport { type AnyConn, CONN_STATE_MANAGER_SYMBOL } from \"@/actor/conn/mod\";\nimport { lookupInRegistry } from \"@/actor/definition\";\nimport { KEYS } from \"@/actor/instance/keys\";\nimport { deserializeActorKey } from \"@/actor/keys\";\nimport { getValueLength } from \"@/actor/protocol/old\";\nimport { type ActorRouter, createActorRouter } from \"@/actor/router\";\nimport {\n\tparseWebSocketProtocols,\n\trouteWebSocket,\n\ttruncateRawWebSocketPathPrefix,\n\ttype UpgradeWebSocketArgs,\n} from \"@/actor/router-websocket-endpoints\";\nimport type { Client } from \"@/client/client\";\nimport {\n\tPATH_CONNECT,\n\tPATH_INSPECTOR_CONNECT,\n\tPATH_WEBSOCKET_BASE,\n\tPATH_WEBSOCKET_PREFIX,\n} from \"@/common/actor-router-consts\";\nimport { getLogger } from \"@/common/log\";\nimport type {\n\tRivetMessageEvent,\n\tUniversalWebSocket,\n} from \"@/common/websocket-interface\";\nimport {\n\ttype ActorDriver,\n\ttype AnyActorInstance,\n\tgetInitialActorKvState,\n\ttype ManagerDriver,\n} from \"@/driver-helpers/mod\";\nimport { buildActorNames, type RegistryConfig } from \"@/registry/config\";\nimport { getEndpoint } from \"@/remote-manager-driver/api-utils\";\nimport {\n\ttype LongTimeoutHandle,\n\tpromiseWithResolvers,\n\tsetLongTimeout,\n\tstringifyError,\n\tVERSION,\n} from \"@/utils\";\nimport { logger } from \"./log\";\n\nconst RUNNER_SSE_PING_INTERVAL = 1000;\n\n// Message ack deadline is 30s on the gateway, but we will ack more frequently\n// in order to minimize the message buffer size on the gateway and to give\n// generous breathing room for the timeout.\n//\n// See engine/packages/pegboard-gateway/src/shared_state.rs\n// (HWS_MESSAGE_ACK_TIMEOUT)\nconst CONN_MESSAGE_ACK_DEADLINE = 5_000;\n\n// Force saveState when cumulative message size reaches this threshold (0.5 MB)\n//\n// See engine/packages/pegboard-gateway/src/shared_state.rs\n// (HWS_MAX_PENDING_MSGS_SIZE_PER_REQ)\nconst CONN_BUFFERED_MESSAGE_SIZE_THRESHOLD = 500_000;\n\ninterface ActorHandler {\n\tactor?: AnyActorInstance;\n\tactorStartPromise?: ReturnType<typeof promiseWithResolvers<void>>;\n\talarmTimeout?: LongTimeoutHandle;\n}\n\nexport type DriverContext = {};\n\nexport class EngineActorDriver implements ActorDriver {\n\t#config: RegistryConfig;\n\t#managerDriver: ManagerDriver;\n\t#inlineClient: Client<any>;\n\t#runner: Runner;\n\t#actors: Map<string, ActorHandler> = new Map();\n\t#actorRouter: ActorRouter;\n\n\t#runnerStarted: PromiseWithResolvers<undefined> = promiseWithResolvers();\n\t#runnerStopped: PromiseWithResolvers<undefined> = promiseWithResolvers();\n\t#isRunnerStopped: boolean = false;\n\n\t// HACK: Track actor stop intent locally since the runner protocol doesn't\n\t// pass the stop reason to onActorStop. This will be fixed when the runner\n\t// protocol is updated to send the intent directly (see RVT-5284)\n\t#actorStopIntent: Map<string, \"sleep\" | \"destroy\"> = new Map();\n\n\t// Map of conn IDs to message index waiting to be persisted before sending\n\t// an ack\n\t//\n\t// serverMessageIndex is updated and pendingAck is flagged in needed in\n\t// onBeforePersistConnect, then the HWS ack message is sent in\n\t// onAfterPersistConn. This allows us to track what's about to be written\n\t// to storage to prevent race conditions with the serverMessageIndex being\n\t// updated while writing the existing state.\n\t//\n\t// bufferedMessageSize tracks the total bytes received since last persist\n\t// to force a saveState when threshold is reached. This is the amount of\n\t// data currently buffered on the gateway.\n\t#hwsMessageIndex = new Map<\n\t\tstring,\n\t\t{\n\t\t\tserverMessageIndex: number;\n\t\t\tbufferedMessageSize: number;\n\t\t\tpendingAckFromMessageIndex: boolean;\n\t\t\tpendingAckFromBufferSize: boolean;\n\t\t}\n\t>();\n\n\tconstructor(\n\t\tconfig: RegistryConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tinlineClient: Client<any>,\n\t) {\n\t\tthis.#config = config;\n\t\tthis.#managerDriver = managerDriver;\n\t\tthis.#inlineClient = inlineClient;\n\n\t\t// HACK: Override inspector token (which are likely to be\n\t\t// removed later on) with token from x-rivet-token header\n\t\tconst token = config.token;\n\t\t// TODO:\n\t\t// if (token && runConfig.inspector && runConfig.inspector.enabled) {\n\t\t// \trunConfig.inspector.token = () => token;\n\t\t// }\n\n\t\tthis.#actorRouter = createActorRouter(\n\t\t\tconfig,\n\t\t\tthis,\n\t\t\tundefined,\n\t\t\tconfig.test.enabled,\n\t\t);\n\n\t\t// Create runner configuration\n\t\tconst engineRunnerConfig: EngineRunnerConfig = {\n\t\t\tversion: config.runner.version,\n\t\t\tendpoint: getEndpoint(config),\n\t\t\ttoken,\n\t\t\tnamespace: config.namespace,\n\t\t\ttotalSlots: config.runner.totalSlots,\n\t\t\trunnerName: config.runner.runnerName,\n\t\t\trunnerKey: config.runner.runnerKey ?? crypto.randomUUID(),\n\t\t\tmetadata: {\n\t\t\t\trivetkit: { version: VERSION },\n\t\t\t},\n\t\t\tprepopulateActorNames: buildActorNames(config),\n\t\t\tonConnected: () => {\n\t\t\t\tthis.#runnerStarted.resolve(undefined);\n\t\t\t},\n\t\t\tonDisconnected: (_code, _reason) => {},\n\t\t\tonShutdown: () => {\n\t\t\t\tthis.#runnerStopped.resolve(undefined);\n\t\t\t\tthis.#isRunnerStopped = true;\n\t\t\t},\n\t\t\tfetch: this.#runnerFetch.bind(this),\n\t\t\twebsocket: this.#runnerWebSocket.bind(this),\n\t\t\thibernatableWebSocket: {\n\t\t\t\tcanHibernate: this.#hwsCanHibernate.bind(this),\n\t\t\t},\n\t\t\tonActorStart: this.#runnerOnActorStart.bind(this),\n\t\t\tonActorStop: this.#runnerOnActorStop.bind(this),\n\t\t\tlogger: getLogger(\"engine-runner\"),\n\t\t};\n\n\t\t// Create and start runner\n\t\tthis.#runner = new Runner(engineRunnerConfig);\n\t\tthis.#runner.start();\n\t\tlogger().debug({\n\t\t\tmsg: \"engine runner started\",\n\t\t\tendpoint: config.endpoint,\n\t\t\tnamespace: config.namespace,\n\t\t\trunnerName: config.runner.runnerName,\n\t\t});\n\t}\n\n\tgetExtraActorLogParams(): Record<string, string> {\n\t\treturn { runnerId: this.#runner.runnerId ?? \"-\" };\n\t}\n\n\tasync #loadActorHandler(actorId: string): Promise<ActorHandler> {\n\t\t// Check if actor is already loaded\n\t\tconst handler = this.#actors.get(actorId);\n\t\tif (!handler)\n\t\t\tthrow new Error(`Actor handler does not exist ${actorId}`);\n\t\tif (handler.actorStartPromise) await handler.actorStartPromise.promise;\n\t\tif (!handler.actor) throw new Error(\"Actor should be loaded\");\n\t\treturn handler;\n\t}\n\n\tgetContext(actorId: string): DriverContext {\n\t\treturn {};\n\t}\n\n\tasync setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {\n\t\tconst handler = this.#actors.get(actor.id);\n\t\tif (!handler) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"no handler for actor to set alarm\",\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear prev timeout\n\t\tif (handler.alarmTimeout) {\n\t\t\thandler.alarmTimeout.abort();\n\t\t\thandler.alarmTimeout = undefined;\n\t\t}\n\n\t\t// Set alarm\n\t\tconst delay = Math.max(0, timestamp - Date.now());\n\t\thandler.alarmTimeout = setLongTimeout(() => {\n\t\t\tactor.onAlarm();\n\t\t\thandler.alarmTimeout = undefined;\n\t\t}, delay);\n\n\t\t// TODO: This call may not be needed on ActorInstance.start, but it does help ensure that the local state is synced with the alarm state\n\t\t// Set alarm on Rivet\n\t\t//\n\t\t// This does not call an \"alarm\" event like Durable Objects.\n\t\t// Instead, it just wakes the actor on the alarm (if not\n\t\t// already awake).\n\t\t//\n\t\t// onAlarm is automatically called on `ActorInstance.start` when waking\n\t\t// again.\n\t\tthis.#runner.setAlarm(actor.id, timestamp);\n\t}\n\n\tasync getDatabase(_actorId: string): Promise<unknown | undefined> {\n\t\treturn undefined;\n\t}\n\n\t// MARK: - Batch KV operations\n\tasync kvBatchPut(\n\t\tactorId: string,\n\t\tentries: [Uint8Array, Uint8Array][],\n\t): Promise<void> {\n\t\tawait this.#runner.kvPut(actorId, entries);\n\t}\n\n\tasync kvBatchGet(\n\t\tactorId: string,\n\t\tkeys: Uint8Array[],\n\t): Promise<(Uint8Array | null)[]> {\n\t\treturn await this.#runner.kvGet(actorId, keys);\n\t}\n\n\tasync kvBatchDelete(actorId: string, keys: Uint8Array[]): Promise<void> {\n\t\tawait this.#runner.kvDelete(actorId, keys);\n\t}\n\n\tasync kvList(actorId: string): Promise<Uint8Array[]> {\n\t\tconst entries = await this.#runner.kvListPrefix(\n\t\t\tactorId,\n\t\t\tnew Uint8Array(),\n\t\t);\n\t\tconst keys = entries.map(([key]) => key);\n\t\tlogger().info({\n\t\t\tmsg: \"kvList called\",\n\t\t\tactorId,\n\t\t\tkeysCount: keys.length,\n\t\t\tkeys: keys.map((k) => new TextDecoder().decode(k)),\n\t\t});\n\t\treturn keys;\n\t}\n\n\tasync kvListPrefix(\n\t\tactorId: string,\n\t\tprefix: Uint8Array,\n\t): Promise<[Uint8Array, Uint8Array][]> {\n\t\tconst result = await this.#runner.kvListPrefix(actorId, prefix);\n\t\tlogger().info({\n\t\t\tmsg: \"kvListPrefix called\",\n\t\t\tactorId,\n\t\t\tprefixStr: new TextDecoder().decode(prefix),\n\t\t\tentriesCount: result.length,\n\t\t\tkeys: result.map(([key]) => new TextDecoder().decode(key)),\n\t\t});\n\t\treturn result;\n\t}\n\n\t// MARK: - Actor Lifecycle\n\tasync loadActor(actorId: string): Promise<AnyActorInstance> {\n\t\tconst handler = await this.#loadActorHandler(actorId);\n\t\tif (!handler.actor) throw new Error(`Actor ${actorId} failed to load`);\n\t\treturn handler.actor;\n\t}\n\n\tstartSleep(actorId: string) {\n\t\t// HACK: Track intent for onActorStop (see RVT-5284)\n\t\tthis.#actorStopIntent.set(actorId, \"sleep\");\n\t\tthis.#runner.sleepActor(actorId);\n\t}\n\n\tstartDestroy(actorId: string) {\n\t\t// HACK: Track intent for onActorStop (see RVT-5284)\n\t\tthis.#actorStopIntent.set(actorId, \"destroy\");\n\t\tthis.#runner.stopActor(actorId);\n\t}\n\n\tasync shutdownRunner(immediate: boolean): Promise<void> {\n\t\tlogger().info({ msg: \"stopping engine actor driver\", immediate });\n\n\t\t// TODO: We need to update the runner to have a draining state so:\n\t\t// 1. Send ToServerDraining\n\t\t//\t\t- This causes Pegboard to stop allocating actors to this runner\n\t\t// 2. Pegboard sends ToClientStopActor for all actors on this runner which handles the graceful migration of each actor independently\n\t\t// 3. Send ToServerStopping once all actors have successfully stopped\n\t\t//\n\t\t// What's happening right now is:\n\t\t// 1. All actors enter stopped state\n\t\t// 2. Actors still respond to requests because only RivetKit knows it's\n\t\t// stopping, this causes all requests to issue errors that the actor is\n\t\t// stopping. (This will NOT return a 503 bc the runner has no idea the\n\t\t// actors are stopping.)\n\t\t// 3. Once the last actor stops, then the runner finally stops + actors\n\t\t// reschedule\n\t\t//\n\t\t// This means that:\n\t\t// - All actors on this runner are bricked until the slowest onStop finishes\n\t\t// - Guard will not gracefully handle requests bc it's not receiving a 503\n\t\t// - Actors can still be scheduled to this runner while the other\n\t\t// actors are stopping, meaning that those actors will NOT get onStop\n\t\t// and will potentiall corrupt their state\n\t\t//\n\t\t// HACK: Stop all actors to allow state to be saved\n\t\t// NOTE: onStop is only supposed to be called by the runner, we're\n\t\t// abusing it here\n\t\tlogger().debug({\n\t\t\tmsg: \"stopping all actors before shutdown\",\n\t\t\tactorCount: this.#actors.size,\n\t\t});\n\t\tconst stopPromises: Promise<void>[] = [];\n\t\tfor (const [_actorId, handler] of this.#actors.entries()) {\n\t\t\tif (handler.actor) {\n\t\t\t\tstopPromises.push(\n\t\t\t\t\thandler.actor.onStop(\"sleep\").catch((err) => {\n\t\t\t\t\t\thandler.actor?.rLog.error({\n\t\t\t\t\t\t\tmsg: \"onStop errored\",\n\t\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tawait Promise.all(stopPromises);\n\t\tlogger().debug({ msg: \"all actors stopped\" });\n\n\t\tawait this.#runner.shutdown(immediate);\n\t}\n\n\tasync serverlessHandleStart(c: HonoContext): Promise<Response> {\n\t\treturn streamSSE(c, async (stream) => {\n\t\t\t// NOTE: onAbort does not work reliably\n\t\t\tstream.onAbort(() => {});\n\t\t\tc.req.raw.signal.addEventListener(\"abort\", () => {\n\t\t\t\tlogger().debug(\"SSE aborted, shutting down runner\");\n\n\t\t\t\t// We cannot assume that the request will always be closed gracefully by Rivet. We always proceed with a graceful shutdown in case the request was terminated for any other reason.\n\t\t\t\t//\n\t\t\t\t// If we did not use a graceful shutdown, the runner would\n\t\t\t\tthis.shutdownRunner(false);\n\t\t\t});\n\n\t\t\tawait this.#runnerStarted.promise;\n\n\t\t\t// Runner id should be set if the runner started\n\t\t\tconst payload = this.#runner.getServerlessInitPacket();\n\t\t\tinvariant(payload, \"runnerId not set\");\n\t\t\tawait stream.writeSSE({ data: payload });\n\n\t\t\t// Send ping every second to keep the connection alive\n\t\t\twhile (true) {\n\t\t\t\tif (this.#isRunnerStopped) {\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"runner is stopped\",\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (stream.closed || stream.aborted) {\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"runner sse stream closed\",\n\t\t\t\t\t\tclosed: stream.closed,\n\t\t\t\t\t\taborted: stream.aborted,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tawait stream.writeSSE({ event: \"ping\", data: \"\" });\n\t\t\t\tawait stream.sleep(RUNNER_SSE_PING_INTERVAL);\n\t\t\t}\n\n\t\t\t// Wait for the runner to stop if the SSE stream aborted early for any reason\n\t\t\tawait this.#runnerStopped.promise;\n\t\t});\n\t}\n\n\tasync #runnerOnActorStart(\n\t\tactorId: string,\n\t\tgeneration: number,\n\t\tactorConfig: EngineActorConfig,\n\t): Promise<void> {\n\t\tlogger().debug({\n\t\t\tmsg: \"runner actor starting\",\n\t\t\tactorId,\n\t\t\tname: actorConfig.name,\n\t\t\tkey: actorConfig.key,\n\t\t\tgeneration,\n\t\t});\n\n\t\t// Deserialize input\n\t\tlet input: any;\n\t\tif (actorConfig.input) {\n\t\t\tinput = cbor.decode(actorConfig.input);\n\t\t}\n\n\t\t// Get or create handler\n\t\tlet handler = this.#actors.get(actorId);\n\t\tif (!handler) {\n\t\t\t// IMPORTANT: We must set the handler in the map synchronously before doing any\n\t\t\t// async operations to avoid race conditions where multiple calls might try to\n\t\t\t// create the same handler simultaneously.\n\t\t\thandler = {\n\t\t\t\tactorStartPromise: promiseWithResolvers(),\n\t\t\t};\n\t\t\tthis.#actors.set(actorId, handler);\n\t\t}\n\n\t\tconst name = actorConfig.name as string;\n\t\tinvariant(actorConfig.key, \"actor should have a key\");\n\t\tconst key = deserializeActorKey(actorConfig.key);\n\n\t\t// Initialize storage\n\t\tconst [persistDataBuffer] = await this.#runner.kvGet(actorId, [\n\t\t\tKEYS.PERSIST_DATA,\n\t\t]);\n\t\tif (persistDataBuffer === null) {\n\t\t\tconst initialKvState = getInitialActorKvState(input);\n\t\t\tawait this.#runner.kvPut(actorId, initialKvState);\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"initialized persist data for new actor\",\n\t\t\t\tactorId,\n\t\t\t});\n\t\t} else {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"found existing persist data for actor\",\n\t\t\t\tactorId,\n\t\t\t\tdataSize: persistDataBuffer.byteLength,\n\t\t\t});\n\t\t}\n\n\t\t// Create actor instance\n\t\tconst definition = lookupInRegistry(this.#config, actorConfig.name);\n\t\thandler.actor = definition.instantiate();\n\n\t\t// Start actor\n\t\tawait handler.actor.start(\n\t\t\tthis,\n\t\t\tthis.#inlineClient,\n\t\t\tactorId,\n\t\t\tname,\n\t\t\tkey,\n\t\t\t\"unknown\", // TODO: Add regions\n\t\t);\n\n\t\tlogger().debug({ msg: \"runner actor started\", actorId, name, key });\n\t}\n\n\tasync #runnerOnActorStop(\n\t\tactorId: string,\n\t\tgeneration: number,\n\t): Promise<void> {\n\t\tlogger().debug({ msg: \"runner actor stopping\", actorId, generation });\n\n\t\t// HACK: Retrieve the stop intent we tracked locally (see RVT-5284)\n\t\t// Default to \"sleep\" if no intent was recorded (e.g., if the runner\n\t\t// initiated the stop)\n\t\t//\n\t\t// TODO: This will not work if the actor is destroyed from the API\n\t\t// correctly. Currently, it will use the sleep intent, but it's\n\t\t// actually a destroy intent.\n\t\tconst reason = this.#actorStopIntent.get(actorId) ?? \"sleep\";\n\t\tthis.#actorStopIntent.delete(actorId);\n\n\t\tconst handler = this.#actors.get(actorId);\n\t\tif (handler?.actor) {\n\t\t\ttry {\n\t\t\t\tawait handler.actor.onStop(reason);\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"error in onStop, proceeding with removing actor\",\n\t\t\t\t\terr: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.#actors.delete(actorId);\n\t\t}\n\n\t\tlogger().debug({ msg: \"runner actor stopped\", actorId, reason });\n\t}\n\n\t// MARK: - Runner Networking\n\tasync #runnerFetch(\n\t\t_runner: Runner,\n\t\tactorId: string,\n\t\t_gatewayIdBuf: ArrayBuffer,\n\t\t_requestIdBuf: ArrayBuffer,\n\t\trequest: Request,\n\t): Promise<Response> {\n\t\tlogger().debug({\n\t\t\tmsg: \"runner fetch\",\n\t\t\tactorId,\n\t\t\turl: request.url,\n\t\t\tmethod: request.method,\n\t\t});\n\t\treturn await this.#actorRouter.fetch(request, { actorId });\n\t}\n\n\tasync #runnerWebSocket(\n\t\t_runner: Runner,\n\t\tactorId: string,\n\t\twebsocketRaw: any,\n\t\tgatewayIdBuf: ArrayBuffer,\n\t\trequestIdBuf: ArrayBuffer,\n\t\trequest: Request,\n\t\trequestPath: string,\n\t\trequestHeaders: Record<string, string>,\n\t\tisHibernatable: boolean,\n\t\tisRestoringHibernatable: boolean,\n\t): Promise<void> {\n\t\tconst websocket = websocketRaw as UniversalWebSocket;\n\n\t\t// Add a unique ID to track this WebSocket object\n\t\tconst wsUniqueId = `ws_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\t\t(websocket as any).__rivet_ws_id = wsUniqueId;\n\n\t\tlogger().debug({\n\t\t\tmsg: \"runner websocket\",\n\t\t\tactorId,\n\t\t\turl: request.url,\n\t\t\tisRestoringHibernatable,\n\t\t\twebsocketObjectId: websocketRaw\n\t\t\t\t? Object.prototype.toString.call(websocketRaw)\n\t\t\t\t: \"null\",\n\t\t\twebsocketType: websocketRaw?.constructor?.name,\n\t\t\twsUniqueId,\n\t\t\twebsocketProps: websocketRaw\n\t\t\t\t? Object.keys(websocketRaw).join(\", \")\n\t\t\t\t: \"null\",\n\t\t});\n\n\t\t// Parse configuration from Sec-WebSocket-Protocol header (optional for path-based routing)\n\t\tconst protocols = request.headers.get(\"sec-websocket-protocol\");\n\t\tconst { encoding, connParams } = parseWebSocketProtocols(protocols);\n\n\t\t// Fetch WS handler\n\t\t//\n\t\t// We store the promise since we need to add WebSocket event listeners immediately that will wait for the promise to resolve\n\t\tlet wsHandler: UpgradeWebSocketArgs;\n\t\ttry {\n\t\t\twsHandler = await routeWebSocket(\n\t\t\t\trequest,\n\t\t\t\trequestPath,\n\t\t\t\trequestHeaders,\n\t\t\t\tthis.#config,\n\t\t\t\tthis,\n\t\t\t\tactorId,\n\t\t\t\tencoding,\n\t\t\t\tconnParams,\n\t\t\t\tgatewayIdBuf,\n\t\t\t\trequestIdBuf,\n\t\t\t\tisHibernatable,\n\t\t\t\tisRestoringHibernatable,\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tlogger().error({ msg: \"building websocket handlers errored\", err });\n\t\t\twebsocketRaw.close(1011, \"ws.route_error\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Connect the Hono WS hook to the adapter\n\t\t//\n\t\t// We need to assign to `raw` in order for WSContext to expose it on\n\t\t// `ws.raw`\n\t\t(websocket as WSContextInit).raw = websocket;\n\t\tconst wsContext = new WSContext(websocket);\n\n\t\t// Get connection and actor from wsHandler (may be undefined for inspector endpoint)\n\t\tconst conn = wsHandler.conn;\n\t\tconst actor = wsHandler.actor;\n\t\tconst connStateManager = conn?.[CONN_STATE_MANAGER_SYMBOL];\n\n\t\t// Bind event listeners to Hono WebSocket handlers\n\t\t//\n\t\t// We update the HWS data after calling handlers in order to ensure\n\t\t// that the handler ran successfully. By doing this, we ensure at least\n\t\t// once delivery of events to the event handlers.\n\n\t\t// Log when attaching event listeners\n\t\tlogger().debug({\n\t\t\tmsg: \"attaching websocket event listeners\",\n\t\t\tactorId,\n\t\t\tconnId: conn?.id,\n\t\t\twsUniqueId: (websocket as any).__rivet_ws_id,\n\t\t\tisRestoringHibernatable,\n\t\t\twebsocketType: websocket?.constructor?.name,\n\t\t});\n\n\t\tif (isRestoringHibernatable) {\n\t\t\twsHandler.onRestore?.(wsContext);\n\t\t}\n\n\t\twebsocket.addEventListener(\"open\", (event) => {\n\t\t\twsHandler.onOpen(event, wsContext);\n\t\t});\n\n\t\twebsocket.addEventListener(\"message\", (event: RivetMessageEvent) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"websocket message event listener triggered\",\n\t\t\t\tconnId: conn?.id,\n\t\t\t\tactorId: actor?.id,\n\t\t\t\tmessageIndex: event.rivetMessageIndex,\n\t\t\t\thasWsHandler: !!wsHandler,\n\t\t\t\thasOnMessage: !!wsHandler?.onMessage,\n\t\t\t\tactorIsStopping: actor?.isStopping,\n\t\t\t\twebsocketType: websocket?.constructor?.name,\n\t\t\t\twsUniqueId: (websocket as any).__rivet_ws_id,\n\t\t\t\teventTargetWsId: (event.target as any)?.__rivet_ws_id,\n\t\t\t});\n\n\t\t\t// Check if actor is stopping - if so, don't process new messages.\n\t\t\t// These messages will be reprocessed when the actor wakes up from hibernation.\n\t\t\t// TODO: This will never retransmit the socket and the socket will close\n\t\t\tif (actor?.isStopping) {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"ignoring ws message, actor is stopping\",\n\t\t\t\t\tconnId: conn?.id,\n\t\t\t\t\tactorId: actor?.id,\n\t\t\t\t\tmessageIndex: event.rivetMessageIndex,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Process message\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"calling wsHandler.onMessage\",\n\t\t\t\tconnId: conn?.id,\n\t\t\t\tmessageIndex: event.rivetMessageIndex,\n\t\t\t});\n\t\t\twsHandler.onMessage(event, wsContext);\n\n\t\t\t// Persist message index for hibernatable connections\n\t\t\tconst hibernate = connStateManager?.hibernatableData;\n\n\t\t\tif (hibernate && conn && actor) {\n\t\t\t\tinvariant(\n\t\t\t\t\ttypeof event.rivetMessageIndex === \"number\",\n\t\t\t\t\t\"missing event.rivetMessageIndex\",\n\t\t\t\t);\n\n\t\t\t\t// Persist message index\n\t\t\t\tconst previousMsgIndex = hibernate.serverMessageIndex;\n\t\t\t\thibernate.serverMessageIndex = event.rivetMessageIndex;\n\t\t\t\tlogger().info({\n\t\t\t\t\tmsg: \"persisting message index\",\n\t\t\t\t\tconnId: conn.id,\n\t\t\t\t\tpreviousMsgIndex,\n\t\t\t\t\tnewMsgIndex: event.rivetMessageIndex,\n\t\t\t\t});\n\n\t\t\t\t// Calculate message size and track cumulative size\n\t\t\t\tconst entry = this.#hwsMessageIndex.get(conn.id);\n\t\t\t\tif (entry) {\n\t\t\t\t\t// Track message length\n\t\t\t\t\tconst messageLength = getValueLength(event.data);\n\t\t\t\t\tentry.bufferedMessageSize += messageLength;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tentry.bufferedMessageSize >=\n\t\t\t\t\t\tCONN_BUFFERED_MESSAGE_SIZE_THRESHOLD\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Reset buffered message size immeidatley (instead\n\t\t\t\t\t\t// of waiting for onAfterPersistConn) since we may\n\t\t\t\t\t\t// receive more messages before onAfterPersistConn\n\t\t\t\t\t\t// is called, which would called saveState\n\t\t\t\t\t\t// immediate multiple times\n\t\t\t\t\t\tentry.bufferedMessageSize = 0;\n\t\t\t\t\t\tentry.pendingAckFromBufferSize = true;\n\n\t\t\t\t\t\t// Save state immediately if approaching buffer threshold\n\t\t\t\t\t\tactor.stateManager.saveState({\n\t\t\t\t\t\t\timmediate: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Save message index. The maxWait is set to the ack deadline\n\t\t\t\t\t\t// since we ack the message immediately after persisting the index.\n\t\t\t\t\t\t// If cumulative size exceeds threshold, force immediate persist.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// This will call EngineActorDriver.onAfterPersistConn after\n\t\t\t\t\t\t// persist to send the ack to the gateway.\n\t\t\t\t\t\tactor.stateManager.saveState({\n\t\t\t\t\t\t\tmaxWait: CONN_MESSAGE_ACK_DEADLINE,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Fallback if entry missing\n\t\t\t\t\tactor.stateManager.saveState({\n\t\t\t\t\t\tmaxWait: CONN_MESSAGE_ACK_DEADLINE,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\twebsocket.addEventListener(\"close\", (event) => {\n\t\t\twsHandler.onClose(event, wsContext);\n\n\t\t\t// NOTE: Persisted connection is removed when `conn.disconnect`\n\t\t\t// is called by the WebSocket route\n\t\t});\n\n\t\twebsocket.addEventListener(\"error\", (event) => {\n\t\t\twsHandler.onError(event, wsContext);\n\t\t});\n\n\t\t// Log event listener attachment for restored connections\n\t\tif (isRestoringHibernatable) {\n\t\t\tlogger().info({\n\t\t\t\tmsg: \"event listeners attached to restored websocket\",\n\t\t\t\tactorId,\n\t\t\t\tconnId: conn?.id,\n\t\t\t\tgatewayId: idToStr(gatewayIdBuf),\n\t\t\t\trequestId: idToStr(requestIdBuf),\n\t\t\t\twebsocketType: websocket?.constructor?.name,\n\t\t\t\thasMessageListener: !!websocket.addEventListener,\n\t\t\t});\n\t\t}\n\t}\n\n\t// MARK: - Hibernating WebSockets\n\t#hwsCanHibernate(\n\t\tactorId: string,\n\t\tgatewayId: ArrayBuffer,\n\t\trequestId: ArrayBuffer,\n\t\trequest: Request,\n\t): boolean {\n\t\tconst url = new URL(request.url);\n\t\tconst path = url.pathname;\n\n\t\t// Get actor instance from runner to access actor name\n\t\tconst actorInstance = this.#runner.getActor(actorId);\n\t\tif (!actorInstance) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"actor not found in #hwsCanHibernate\",\n\t\t\t\tactorId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\n\t\t// Load actor handler to access persisted data\n\t\tconst handler = this.#actors.get(actorId);\n\t\tif (!handler) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"actor handler not found in #hwsCanHibernate\",\n\t\t\t\tactorId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t\tif (!handler.actor) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"actor not found in #hwsCanHibernate\",\n\t\t\t\tactorId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\n\t\t// Determine configuration for new WS\n\t\tlogger().debug({\n\t\t\tmsg: \"no existing hibernatable websocket found\",\n\t\t\tgatewayId: idToStr(gatewayId),\n\t\t\trequestId: idToStr(requestId),\n\t\t});\n\t\tif (path === PATH_CONNECT) {\n\t\t\treturn true;\n\t\t} else if (\n\t\t\tpath === PATH_WEBSOCKET_BASE ||\n\t\t\tpath.startsWith(PATH_WEBSOCKET_PREFIX)\n\t\t) {\n\t\t\t// Find actor config\n\t\t\tconst definition = lookupInRegistry(\n\t\t\t\tthis.#config,\n\t\t\t\tactorInstance.config.name,\n\t\t\t);\n\n\t\t\t// Check if can hibernate\n\t\t\tconst canHibernateWebSocket =\n\t\t\t\tdefinition.config.options?.canHibernateWebSocket;\n\t\t\tif (canHibernateWebSocket === true) {\n\t\t\t\treturn true;\n\t\t\t} else if (typeof canHibernateWebSocket === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\t// Truncate the path to match the behavior on onRawWebSocket\n\t\t\t\t\tconst newPath = truncateRawWebSocketPathPrefix(\n\t\t\t\t\t\turl.pathname,\n\t\t\t\t\t);\n\t\t\t\t\tconst truncatedRequest = new Request(\n\t\t\t\t\t\t`http://actor${newPath}`,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst canHibernate =\n\t\t\t\t\t\tcanHibernateWebSocket(truncatedRequest);\n\t\t\t\t\treturn canHibernate;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error calling canHibernateWebSocket\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (path === PATH_INSPECTOR_CONNECT) {\n\t\t\treturn false;\n\t\t} else {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"unexpected path for getActorHibernationConfig\",\n\t\t\t\tpath,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync #hwsLoadAll(\n\t\tactorId: string,\n\t): Promise<HibernatingWebSocketMetadata[]> {\n\t\tconst actor = await this.loadActor(actorId);\n\t\treturn actor.conns\n\t\t\t.values()\n\t\t\t.map((conn) => {\n\t\t\t\tconst connStateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\t\t\tconst hibernatable = connStateManager.hibernatableData;\n\t\t\t\tif (!hibernatable) return undefined;\n\t\t\t\treturn {\n\t\t\t\t\tgatewayId: hibernatable.gatewayId,\n\t\t\t\t\trequestId: hibernatable.requestId,\n\t\t\t\t\tserverMessageIndex: hibernatable.serverMessageIndex,\n\t\t\t\t\tclientMessageIndex: hibernatable.clientMessageIndex,\n\t\t\t\t\tpath: hibernatable.requestPath,\n\t\t\t\t\theaders: hibernatable.requestHeaders,\n\t\t\t\t} satisfies HibernatingWebSocketMetadata;\n\t\t\t})\n\t\t\t.filter((x) => x !== undefined)\n\t\t\t.toArray();\n\t}\n\n\tasync onBeforeActorStart(actor: AnyActorInstance): Promise<void> {\n\t\t// Resolve promise if waiting\n\t\tconst handler = this.#actors.get(actor.id);\n\t\tinvariant(handler, \"missing actor handler in onBeforeActorReady\");\n\t\thandler.actorStartPromise?.resolve();\n\t\thandler.actorStartPromise = undefined;\n\n\t\t// Restore hibernating requests\n\t\tconst metaEntries = await this.#hwsLoadAll(actor.id);\n\t\tawait this.#runner.restoreHibernatingRequests(actor.id, metaEntries);\n\t}\n\n\tonCreateConn(conn: AnyConn) {\n\t\tconst hibernatable = conn[CONN_STATE_MANAGER_SYMBOL].hibernatableData;\n\t\tif (!hibernatable) return;\n\n\t\tthis.#hwsMessageIndex.set(conn.id, {\n\t\t\tserverMessageIndex: hibernatable.serverMessageIndex,\n\t\t\tbufferedMessageSize: 0,\n\t\t\tpendingAckFromMessageIndex: false,\n\t\t\tpendingAckFromBufferSize: false,\n\t\t});\n\n\t\tlogger().debug({\n\t\t\tmsg: \"created #hwsMessageIndex entry\",\n\t\t\tconnId: conn.id,\n\t\t\tserverMessageIndex: hibernatable.serverMessageIndex,\n\t\t});\n\t}\n\n\tonDestroyConn(conn: AnyConn) {\n\t\tthis.#hwsMessageIndex.delete(conn.id);\n\n\t\tlogger().debug({\n\t\t\tmsg: \"removed #hwsMessageIndex entry\",\n\t\t\tconnId: conn.id,\n\t\t});\n\t}\n\n\tonBeforePersistConn(conn: AnyConn) {\n\t\tconst stateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\tconst hibernatable = stateManager.hibernatableDataOrError();\n\n\t\tconst entry = this.#hwsMessageIndex.get(conn.id);\n\t\tif (!entry) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"missing EngineActorDriver.#hwsMessageIndex entry for conn\",\n\t\t\t\tconnId: conn.id,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// There is a newer message index\n\t\tentry.pendingAckFromMessageIndex =\n\t\t\thibernatable.serverMessageIndex > entry.serverMessageIndex;\n\t\tentry.serverMessageIndex = hibernatable.serverMessageIndex;\n\t}\n\n\tonAfterPersistConn(conn: AnyConn) {\n\t\tconst stateManager = conn[CONN_STATE_MANAGER_SYMBOL];\n\t\tconst hibernatable = stateManager.hibernatableDataOrError();\n\n\t\tconst entry = this.#hwsMessageIndex.get(conn.id);\n\t\tif (!entry) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"missing EngineActorDriver.#hwsMessageIndex entry for conn\",\n\t\t\t\tconnId: conn.id,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Ack entry\n\t\tif (\n\t\t\tentry.pendingAckFromMessageIndex ||\n\t\t\tentry.pendingAckFromBufferSize\n\t\t) {\n\t\t\tthis.#runner.sendHibernatableWebSocketMessageAck(\n\t\t\t\thibernatable.gatewayId,\n\t\t\t\thibernatable.requestId,\n\t\t\t\tentry.serverMessageIndex,\n\t\t\t);\n\t\t\tentry.pendingAckFromMessageIndex = false;\n\t\t\tentry.pendingAckFromBufferSize = false;\n\t\t\tentry.bufferedMessageSize = 0;\n\t\t}\n\t}\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"driver-engine\");\n}\n","import { z } from \"zod\";\nimport {\n\tClientConfigSchemaBase,\n\ttransformClientConfig,\n} from \"@/client/config\";\nimport { getRivetRunnerKey } from \"@/utils/env-vars\";\n\n/**\n * Base engine config schema without transforms so it can be merged in to other schemas.\n *\n * We include the client config since this includes the common properties like endpoint, namespace, etc.\n */\nexport const EngineConfigSchemaBase = ClientConfigSchemaBase.extend({\n\t/** Unique key for this runner. Runners connecting a given key will replace any other runner connected with the same key. */\n\trunnerKey: z\n\t\t.string()\n\t\t.optional()\n\t\t.transform((val) => val ?? getRivetRunnerKey()),\n\n\t/** How many actors this runner can run. */\n\ttotalSlots: z.number().default(100_000),\n});\n\nconst EngineConfigSchemaTransformed = EngineConfigSchemaBase.transform(\n\t(config, ctx) => transformEngineConfig(config, ctx),\n);\n\nexport const EngineConfigSchema = EngineConfigSchemaTransformed.default(() =>\n\tEngineConfigSchemaTransformed.parse({}),\n);\n\nexport type EngineConfig = z.infer<typeof EngineConfigSchema>;\nexport type EngineConfigInput = z.input<typeof EngineConfigSchema>;\n\nexport function transformEngineConfig(\n\tconfig: z.infer<typeof EngineConfigSchemaBase>,\n\tctx: z.RefinementCtx,\n) {\n\treturn {\n\t\t...transformClientConfig(config, ctx),\n\t\trunnerKey: config.runnerKey,\n\t};\n}\n","import type { Client } from \"@/client/client\";\nimport { convertRegistryConfigToClientConfig } from \"@/client/config\";\nimport type { ManagerDriver } from \"@/manager/driver\";\nimport { RemoteManagerDriver } from \"@/remote-manager-driver/mod\";\nimport { EngineActorDriver } from \"./actor-driver\";\nimport { RegistryConfig, DriverConfig } from \"@/registry/config\";\n\nexport { EngineActorDriver } from \"./actor-driver\";\nexport {\n\ttype EngineConfig as Config,\n\ttype EngineConfigInput as InputConfig,\n\tEngineConfigSchema as ConfigSchema,\n} from \"./config\";\n\nexport function createEngineDriver(): DriverConfig {\n\treturn {\n\t\tname: \"engine\",\n\t\tdisplayName: \"Engine\",\n\t\tmanager: (config: RegistryConfig) => {\n\t\t\tconst clientConfig = convertRegistryConfigToClientConfig(config);\n\t\t\treturn new RemoteManagerDriver(clientConfig);\n\t\t},\n\t\tactor: (\n\t\t\tconfig: RegistryConfig,\n\t\t\tmanagerDriver: ManagerDriver,\n\t\t\tinlineClient: Client<any>,\n\t\t) => {\n\t\t\treturn new EngineActorDriver(\n\t\t\t\tconfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tinlineClient,\n\t\t\t);\n\t\t},\n\t\tautoStartActorDriver: true,\n\t};\n}\n","import type { Logger } from \"pino\";\nimport { z } from \"zod\";\nimport type { ActorDriverBuilder } from \"@/actor/driver\";\nimport { LogLevelSchema } from \"@/common/log\";\nimport {\n\tEngineConfigSchemaBase,\n\ttransformEngineConfig,\n} from \"@/drivers/engine/config\";\nimport { InspectorConfigSchema } from \"@/inspector/config\";\nimport type { ManagerDriverBuilder } from \"@/manager/driver\";\nimport type { GetUpgradeWebSocket } from \"@/utils\";\nimport { getEnvUniversal, VERSION } from \"@/utils\";\nimport {\n\tgetRivetRunEngine,\n\tgetRivetRunEngineVersion,\n\tgetRivetRunnerKind,\n\tgetRivetToken,\n} from \"@/utils/env-vars\";\n\nexport const LegacyDriverConfigSchema = z.object({\n\t/** Machine-readable name to identify this driver by. */\n\tname: z.string(),\n\tmanager: z.custom<ManagerDriverBuilder>(),\n\tactor: z.custom<ActorDriverBuilder>(),\n});\n\nexport type LegacyDriverConfig = z.infer<typeof LegacyDriverConfigSchema>;\n\n/** Base config used for the actor config across all platforms. */\nconst LegacyRunnerConfigSchemaUnmerged = z\n\t.object({\n\t\tdriver: LegacyDriverConfigSchema.optional(),\n\n\t\t/** @experimental */\n\t\tmaxIncomingMessageSize: z.number().optional().default(65_536),\n\n\t\t/** @experimental */\n\t\tmaxOutgoingMessageSize: z.number().optional().default(1_048_576),\n\n\t\t/** @experimental */\n\t\tinspector: InspectorConfigSchema,\n\n\t\t/** @experimental */\n\t\tdisableDefaultServer: z.boolean().optional().default(false),\n\n\t\t/** @experimental */\n\t\tdefaultServerPort: z.number().default(6420),\n\n\t\t/** @experimental */\n\t\trunEngine: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.default(() => getRivetRunEngine()),\n\n\t\t/** @experimental */\n\t\trunEngineVersion: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.default(() => getRivetRunEngineVersion() ?? VERSION),\n\n\t\t/** @experimental */\n\t\toverrideServerAddress: z.string().optional(),\n\n\t\t/** @experimental */\n\t\tdisableActorDriver: z.boolean().optional().default(false),\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Whether to run runners normally or have them managed\n\t\t * serverlessly (by the Rivet Engine for example).\n\t\t */\n\t\trunnerKind: z\n\t\t\t.enum([\"serverless\", \"normal\"])\n\t\t\t.optional()\n\t\t\t.default(() =>\n\t\t\t\tgetRivetRunnerKind() === \"serverless\" ? \"serverless\" : \"normal\",\n\t\t\t),\n\t\ttotalSlots: z.number().optional(),\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Base path for the router. This is used to prefix all routes.\n\t\t * For example, if the base path is `/api`, then the route `/actors` will be\n\t\t * available at `/api/actors`.\n\t\t */\n\t\tbasePath: z.string().optional().default(\"/\"),\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Disable welcome message.\n\t\t * */\n\t\tnoWelcome: z.boolean().optional().default(false),\n\n\t\t/**\n\t\t * @experimental\n\t\t * */\n\t\tlogging: z\n\t\t\t.object({\n\t\t\t\tbaseLogger: z.custom<Logger>().optional(),\n\t\t\t\tlevel: LogLevelSchema.optional(),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.default(() => ({})),\n\n\t\t/**\n\t\t * @experimental\n\t\t *\n\t\t * Automatically configure serverless runners in the engine.\n\t\t * Can only be used when runnerKind is \"serverless\".\n\t\t * If true, uses default configuration. Can also provide custom configuration.\n\t\t */\n\t\tautoConfigureServerless: z\n\t\t\t.union([\n\t\t\t\tz.boolean(),\n\t\t\t\tz.object({\n\t\t\t\t\turl: z.string().optional(),\n\t\t\t\t\theaders: z.record(z.string(), z.string()).optional(),\n\t\t\t\t\tmaxRunners: z.number().optional(),\n\t\t\t\t\tminRunners: z.number().optional(),\n\t\t\t\t\trequestLifespan: z.number().optional(),\n\t\t\t\t\trunnersMargin: z.number().optional(),\n\t\t\t\t\tslotsPerRunner: z.number().optional(),\n\t\t\t\t\tmetadata: z.record(z.string(), z.unknown()).optional(),\n\t\t\t\t}),\n\t\t\t])\n\t\t\t.optional(),\n\n\t\t// This is a function to allow for lazy configuration of upgradeWebSocket on the\n\t\t// fly. This is required since the dependencies that upgradeWebSocket\n\t\t// (specifically Node.js) can sometimes only be specified after the router is\n\t\t// created or must be imported async using `await import(...)`\n\t\tgetUpgradeWebSocket: z.custom<GetUpgradeWebSocket>().optional(),\n\n\t\t/** @experimental */\n\t\ttoken: z\n\t\t\t.string()\n\t\t\t.optional()\n\t\t\t.transform((v) => v || getRivetToken()),\n\t})\n\t.merge(EngineConfigSchemaBase);\n\nconst LegacyRunnerConfigSchemaTransformed =\n\tLegacyRunnerConfigSchemaUnmerged.transform((config, ctx) => ({\n\t\t...config,\n\t\t...transformEngineConfig(config, ctx),\n\t}));\n\nexport const LegacyRunnerConfigSchema =\n\tLegacyRunnerConfigSchemaTransformed.default(() =>\n\t\tLegacyRunnerConfigSchemaTransformed.parse({}),\n\t);\n\nexport type LegacyRunnerConfig = z.infer<typeof LegacyRunnerConfigSchema>;\nexport type LegacyRunnerConfigInput = z.input<typeof LegacyRunnerConfigSchema>;\n","import invariant from \"invariant\";\nimport { createClientWithDriver } from \"@/client/client\";\nimport { configureBaseLogger, configureDefaultLogger } from \"@/common/log\";\nimport { chooseDefaultDriver } from \"@/drivers/default\";\nimport { ENGINE_PORT, ensureEngineProcess } from \"@/engine-process/mod\";\nimport { getInspectorUrl } from \"@/inspector/utils\";\nimport { buildManagerRouter } from \"@/manager/router\";\nimport { configureServerlessRunner } from \"@/serverless/configure\";\nimport type { GetUpgradeWebSocket } from \"@/utils\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport {\n\ttype DriverConfig,\n\ttype RegistryActors,\n\ttype RegistryConfig,\n} from \"@/registry/config\";\nimport { logger } from \"../src/registry/log\";\nimport { crossPlatformServe, findFreePort } from \"@/registry/serve\";\nimport { ManagerDriver } from \"@/manager/driver\";\nimport { buildServerlessRouter } from \"@/serverless/router\";\nimport type { Registry } from \"@/registry\";\n\n/** Tracks whether the runtime was started as serverless or runner. */\nexport type StartKind = \"serverless\" | \"runner\";\n\nfunction logLine(label: string, value: string): void {\n\tconst padding = \" \".repeat(Math.max(0, 13 - label.length));\n\tconsole.log(` - ${label}:${padding}${value}`);\n}\n\n/**\n * Manages the lifecycle of RivetKit.\n *\n * Startup happens in two phases:\n * 1. `Runtime.create()` initializes shared infrastructure like the manager\n * server and engine process. This runs before we know the deployment mode.\n * 2. `startServerless()` or `startRunner()` configures mode-specific behavior.\n * These are idempotent and called lazily when the first request arrives\n * or when explicitly starting a runner.\n */\nexport class Runtime<A extends RegistryActors> {\n\t#registry: Registry<A>;\n\t#config: RegistryConfig;\n\t#driver: DriverConfig;\n\t#managerDriver: ManagerDriver;\n\t#startKind?: StartKind;\n\n\tmanagerPort?: number;\n\t#serverlessRouter?: ReturnType<typeof buildServerlessRouter>[\"router\"];\n\n\tget config() {\n\t\treturn this.#config;\n\t}\n\n\tget driver() {\n\t\treturn this.#driver;\n\t}\n\n\tget managerDriver() {\n\t\treturn this.#managerDriver;\n\t}\n\n\t/** Use Runtime.create() instead */\n\tprivate constructor(\n\t\tregistry: Registry<A>,\n\t\tconfig: RegistryConfig,\n\t\tdriver: DriverConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tmanagerPort?: number,\n\t) {\n\t\tthis.#registry = registry;\n\t\tthis.#config = config;\n\t\tthis.#driver = driver;\n\t\tthis.#managerDriver = managerDriver;\n\t\tthis.managerPort = managerPort;\n\t}\n\n\tstatic async create<A extends RegistryActors>(\n\t\tregistry: Registry<A>,\n\t): Promise<Runtime<A>> {\n\t\tlogger().info(\"rivetkit starting\");\n\n\t\tconst config = registry.parseConfig();\n\n\t\tif (config.logging?.baseLogger) {\n\t\t\tconfigureBaseLogger(config.logging.baseLogger);\n\t\t} else {\n\t\t\tconfigureDefaultLogger(config.logging?.level);\n\t\t}\n\n\t\t// This should be unreachable: Zod defaults serveManager to false when\n\t\t// spawnEngine is enabled (since endpoint gets set to ENGINE_ENDPOINT).\n\t\t// We check anyway as a safety net for explicit misconfiguration.\n\t\tinvariant(\n\t\t\t!(config.serverless.spawnEngine && config.serveManager),\n\t\t\t\"cannot specify both spawnEngine and serveManager\",\n\t\t);\n\n\t\tconst driver = chooseDefaultDriver(config);\n\t\tconst managerDriver = driver.manager(config);\n\n\t\t// Start main server. This is either:\n\t\t// - Manager: Run a server in-process on port 6420 that mimics the\n\t\t// engine's API for development.\n\t\t// - Engine: Download and run the full Rivet engine binary on port\n\t\t// 6420. This is a fallback for platforms that cannot use the manager\n\t\t// like Next.js.\n\t\t//\n\t\t// We do this before startServerless or startRunner has been called\n\t\t// since the engine API needs to be available on port 6420 before\n\t\t// anything else happens. For example, serverless platforms use\n\t\t// `registry.handler(req)` so `startServerless` is called lazily.\n\t\t// Starting the server preemptively allows for clients to reach 6420\n\t\t// BEFORE `startServerless` is called.\n\t\tlet managerPort: number | undefined;\n\t\tif (config.serverless.spawnEngine) {\n\t\t\tmanagerPort = ENGINE_PORT;\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"spawning engine\",\n\t\t\t\tversion: config.serverless.engineVersion,\n\t\t\t});\n\t\t\tawait ensureEngineProcess({\n\t\t\t\tversion: config.serverless.engineVersion,\n\t\t\t});\n\t\t} else if (config.serveManager) {\n\t\t\tlet upgradeWebSocket: any;\n\t\t\tconst getUpgradeWebSocket: GetUpgradeWebSocket = () =>\n\t\t\t\tupgradeWebSocket;\n\t\t\tmanagerDriver.setGetUpgradeWebSocket(getUpgradeWebSocket);\n\n\t\t\tconst { router: managerRouter } = buildManagerRouter(\n\t\t\t\tconfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tgetUpgradeWebSocket,\n\t\t\t);\n\n\t\t\tmanagerPort = await findFreePort(config.managerPort);\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"serving manager\",\n\t\t\t\tport: managerPort,\n\t\t\t});\n\n\t\t\tconst out = await crossPlatformServe(\n\t\t\t\tconfig,\n\t\t\t\tmanagerPort,\n\t\t\t\tmanagerRouter,\n\t\t\t);\n\t\t\tupgradeWebSocket = out.upgradeWebSocket;\n\t\t}\n\n\t\t// Create runtime\n\t\tconst runtime = new Runtime(\n\t\t\tregistry,\n\t\t\tconfig,\n\t\t\tdriver,\n\t\t\tmanagerDriver,\n\t\t\tmanagerPort,\n\t\t);\n\n\t\t// Log ready\n\t\tconst driverLog = managerDriver.extraStartupLog?.() ?? {};\n\t\tlogger().info({\n\t\t\tmsg: \"rivetkit ready\",\n\t\t\tdriver: driver.name,\n\t\t\tdefinitions: Object.keys(config.use).length,\n\t\t\t...driverLog,\n\t\t});\n\n\t\treturn runtime;\n\t}\n\n\tstartServerless(): void {\n\t\tif (this.#startKind === \"serverless\") return;\n\t\tinvariant(!this.#startKind, \"Runtime already started as runner\");\n\t\tthis.#startKind = \"serverless\";\n\n\t\tthis.#serverlessRouter = buildServerlessRouter(\n\t\t\tthis.#driver,\n\t\t\tthis.#config,\n\t\t).router;\n\n\t\tthis.#printWelcome();\n\n\t\tif (this.#config.serverless.configureRunnerPool) {\n\t\t\t// biome-ignore lint/nursery/noFloatingPromises: intentional\n\t\t\tconfigureServerlessRunner(this.#config);\n\t\t}\n\t}\n\n\tstartRunner(): void {\n\t\tif (this.#startKind === \"runner\") return;\n\t\tinvariant(!this.#startKind, \"Runtime already started as serverless\");\n\t\tthis.#startKind = \"runner\";\n\n\t\tif (this.#config.runner && this.#driver.autoStartActorDriver) {\n\t\t\tlogger().debug(\"starting actor driver\");\n\t\t\tconst inlineClient = createClientWithDriver<Registry<A>>(\n\t\t\t\tthis.#managerDriver,\n\t\t\t);\n\t\t\tthis.#driver.actor(this.#config, this.#managerDriver, inlineClient);\n\t\t}\n\n\t\tthis.#printWelcome();\n\t}\n\n\t#printWelcome(): void {\n\t\tif (this.#config.noWelcome) return;\n\n\t\tconst inspectorUrl = this.managerPort\n\t\t\t? getInspectorUrl(this.#config, this.managerPort)\n\t\t\t: undefined;\n\n\t\tconsole.log();\n\t\tconsole.log(\n\t\t\t` RivetKit ${pkg.version} (${this.#driver.displayName} - ${this.#startKind === \"serverless\" ? \"Serverless\" : \"Runner\"})`,\n\t\t);\n\n\t\t// Show namespace\n\t\tif (this.#config.namespace !== \"default\") {\n\t\t\tlogLine(\"Namespace\", this.#config.namespace);\n\t\t}\n\n\t\t// Show backend endpoint (where we connect to engine)\n\t\tif (this.#config.endpoint) {\n\t\t\tconst endpointType = this.#config.serverless.spawnEngine\n\t\t\t\t? \"local native\"\n\t\t\t\t: this.#config.serveManager\n\t\t\t\t\t? \"local manager\"\n\t\t\t\t\t: \"remote\";\n\t\t\tlogLine(\"Endpoint\", `${this.#config.endpoint} (${endpointType})`);\n\t\t}\n\n\t\t// Show public endpoint (where clients connect)\n\t\tif (this.#startKind === \"serverless\" && this.#config.publicEndpoint) {\n\t\t\tlogLine(\"Client\", this.#config.publicEndpoint);\n\t\t}\n\n\t\t// Show inspector\n\t\tif (inspectorUrl && this.#config.inspector.enabled) {\n\t\t\tlogLine(\"Inspector\", inspectorUrl);\n\t\t}\n\n\t\t// Show actor count\n\t\tconst actorCount = Object.keys(this.#config.use).length;\n\t\tlogLine(\"Actors\", actorCount.toString());\n\n\t\t// Show driver-specific info\n\t\tconst displayInfo = this.#managerDriver.displayInformation();\n\t\tfor (const [k, v] of Object.entries(displayInfo.properties)) {\n\t\t\tlogLine(k, v);\n\t\t}\n\n\t\tconsole.log();\n\t}\n\n\t/** Handle serverless request */\n\thandleServerlessRequest(request: Request): Response | Promise<Response> {\n\t\tinvariant(\n\t\t\tthis.#startKind === \"serverless\",\n\t\t\t\"not started as serverless\",\n\t\t);\n\t\tinvariant(this.#serverlessRouter, \"serverless router not initialized\");\n\t\treturn this.#serverlessRouter.fetch(request);\n\t}\n}\n","import { UserError } from \"@/actor/errors\";\nimport { loggerWithoutContext } from \"@/actor/log\";\nimport { createEngineDriver } from \"@/drivers/engine/mod\";\nimport { createFileSystemOrMemoryDriver } from \"@/drivers/file-system/mod\";\nimport { DriverConfig, RegistryConfig } from \"@/registry/config\";\n\n/**\n * Chooses the appropriate driver based on the run configuration.\n */\nexport function chooseDefaultDriver(\n\tconfig: RegistryConfig,\n): DriverConfig {\n\tif (config.endpoint && config.driver) {\n\t\tthrow new UserError(\n\t\t\t\"Cannot specify both 'endpoint' and 'driver' in configuration\",\n\t\t);\n\t}\n\n\tif (config.driver) {\n\t\treturn config.driver;\n\t}\n\n\tif (config.endpoint || config.token) {\n\t\tloggerWithoutContext().debug({\n\t\t\tmsg: \"using rivet engine driver\",\n\t\t\tendpoint: config.endpoint,\n\t\t});\n\t\treturn createEngineDriver();\n\t}\n\n\tloggerWithoutContext().debug({ msg: \"using default file system driver\" });\n\treturn createFileSystemOrMemoryDriver(true);\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"engine-process\");\n}\n","import {\n\tensureDirectoryExists,\n\tgetStoragePath,\n} from \"@/drivers/file-system/utils\";\nimport {\n\tgetNodeChildProcess,\n\tgetNodeCrypto,\n\tgetNodeFs,\n\tgetNodeFsSync,\n\tgetNodePath,\n\tgetNodeStream,\n\timportNodeDependencies,\n} from \"@/utils/node\";\nimport { logger } from \"./log\";\nimport { ENGINE_ENDPOINT, ENGINE_PORT } from \"./constants\";\n\nexport { ENGINE_ENDPOINT, ENGINE_PORT };\n\nconst ENGINE_BASE_URL = \"https://releases.rivet.dev/rivet\";\nconst ENGINE_BINARY_NAME = \"rivet-engine\";\n\ninterface EnsureEngineProcessOptions {\n\tversion: string;\n}\n\nexport async function ensureEngineProcess(\n\toptions: EnsureEngineProcessOptions,\n): Promise<void> {\n\timportNodeDependencies();\n\n\tlogger().debug({\n\t\tmsg: \"ensuring engine process\",\n\t\tversion: options.version,\n\t});\n\n\tconst path = getNodePath();\n\tconst storageRoot = getStoragePath();\n\tconst binDir = path.join(storageRoot, \"bin\");\n\tconst varDir = path.join(storageRoot, \"var\");\n\tconst logsDir = path.join(varDir, \"logs\", \"rivet-engine\");\n\tawait ensureDirectoryExists(binDir);\n\tawait ensureDirectoryExists(varDir);\n\tawait ensureDirectoryExists(logsDir);\n\n\t// Check if the engine is already running on the port before downloading\n\tif (await isEngineRunning()) {\n\t\ttry {\n\t\t\tconst health = await waitForEngineHealth();\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"engine already running and healthy\",\n\t\t\t\tversion: health.version,\n\t\t\t});\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"existing engine process not healthy, cannot restart automatically\",\n\t\t\t\terror,\n\t\t\t});\n\t\t\tthrow new Error(\n\t\t\t\t\"Engine process exists but is not healthy. Please manually stop the process on port 6420 and retry.\",\n\t\t\t);\n\t\t}\n\t}\n\n\tconst executableName =\n\t\tprocess.platform === \"win32\"\n\t\t\t? `${ENGINE_BINARY_NAME}-${options.version}.exe`\n\t\t\t: `${ENGINE_BINARY_NAME}-${options.version}`;\n\tconst binaryPath = path.join(binDir, executableName);\n\tawait downloadEngineBinaryIfNeeded(binaryPath, options.version, varDir);\n\t// Create log file streams with timestamp in the filename\n\tconst timestamp = new Date()\n\t\t.toISOString()\n\t\t.replace(/:/g, \"-\")\n\t\t.replace(/\\./g, \"-\");\n\tconst stdoutLogPath = path.join(logsDir, `engine-${timestamp}-stdout.log`);\n\tconst stderrLogPath = path.join(logsDir, `engine-${timestamp}-stderr.log`);\n\n\tconst fsSync = getNodeFsSync();\n\tconst stdoutStream = fsSync.createWriteStream(stdoutLogPath, {\n\t\tflags: \"a\",\n\t});\n\tconst stderrStream = fsSync.createWriteStream(stderrLogPath, {\n\t\tflags: \"a\",\n\t});\n\n\tlogger().debug({\n\t\tmsg: \"creating engine log files\",\n\t\tstdout: stdoutLogPath,\n\t\tstderr: stderrLogPath,\n\t});\n\n\tconst childProcess = getNodeChildProcess();\n\tconst child = childProcess.spawn(binaryPath, [\"start\"], {\n\t\tcwd: path.dirname(binaryPath),\n\t\tstdio: [\"inherit\", \"pipe\", \"pipe\"],\n\t\tenv: {\n\t\t\t...process.env,\n\t\t\t// Development environment overrides for Rivet Engine.\n\t\t\t//\n\t\t\t// NOTE: When modifying these env vars, also update scripts/run/dev-env.sh\n\t\t\t// to keep them in sync for manual engine runs.\n\t\t\t//\n\t\t\t// In development, runners can be terminated without a graceful\n\t\t\t// shutdown (i.e. SIGKILL instead of SIGTERM). This is treated as a\n\t\t\t// crash by Rivet Engine in production and implements a backoff for\n\t\t\t// rescheduling actors in case of a crash loop.\n\t\t\t//\n\t\t\t// This is problematic in development since this will cause actors\n\t\t\t// to become unresponsive if frequently killing your dev server.\n\t\t\t//\n\t\t\t// We reduce the timeouts for resetting a runner as healthy in\n\t\t\t// order to account for this.\n\t\t\tRIVET__PEGBOARD__RETRY_RESET_DURATION: \"100\",\n\t\t\tRIVET__PEGBOARD__BASE_RETRY_TIMEOUT: \"100\",\n\t\t\t// Set max exponent to 1 to have a maximum of base_retry_timeout\n\t\t\tRIVET__PEGBOARD__RESCHEDULE_BACKOFF_MAX_EXPONENT: \"1\",\n\t\t\t// Reduce thresholds for faster development iteration\n\t\t\t//\n\t\t\t// Default ping interval is 3s, this gives a 2s & 4s grace\n\t\t\tRIVET__PEGBOARD__RUNNER_ELIGIBLE_THRESHOLD: \"5000\",\n\t\t\tRIVET__PEGBOARD__RUNNER_LOST_THRESHOLD: \"7000\",\n\t\t\t// Allow faster metadata polling for hot-reload in development (in milliseconds)\n\t\t\tRIVET__PEGBOARD__MIN_METADATA_POLL_INTERVAL: \"1000\",\n\t\t\t// Reduce shutdown durations for faster development iteration (in seconds)\n\t\t\tRIVET__RUNTIME__WORKER_SHUTDOWN_DURATION: \"1\",\n\t\t\tRIVET__RUNTIME__GUARD_SHUTDOWN_DURATION: \"1\",\n\t\t\t// Force exit after this duration (must be > worker and guard shutdown durations)\n\t\t\tRIVET__RUNTIME__FORCE_SHUTDOWN_DURATION: \"2\",\n\t\t},\n\t});\n\n\tif (!child.pid) {\n\t\tthrow new Error(\"failed to spawn rivet engine process\");\n\t}\n\n\t// Pipe stdout and stderr to log files\n\tif (child.stdout) {\n\t\tchild.stdout.pipe(stdoutStream);\n\t}\n\t// Collect stderr for error detection\n\tconst stderrChunks: Buffer[] = [];\n\tif (child.stderr) {\n\t\tchild.stderr.on(\"data\", (chunk: Buffer) => {\n\t\t\tstderrChunks.push(chunk);\n\t\t});\n\t\tchild.stderr.pipe(stderrStream);\n\t}\n\tlogger().debug({\n\t\tmsg: \"spawned engine process\",\n\t\tpid: child.pid,\n\t\tcwd: path.dirname(binaryPath),\n\t});\n\n\tchild.once(\"exit\", (code, signal) => {\n\t\tconst stderrOutput = Buffer.concat(stderrChunks).toString(\"utf-8\");\n\n\t\t// Check for specific error conditions\n\t\tif (stderrOutput.includes(\"LOCK: Resource temporarily unavailable\")) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"another instance of rivet engine is unexpectedly running, this is an internal error\",\n\t\t\t\tcode,\n\t\t\t\tsignal,\n\t\t\t\tstdoutLog: stdoutLogPath,\n\t\t\t\tstderrLog: stderrLogPath,\n\t\t\t\tissues: \"https://github.com/rivet-dev/rivetkit/issues\",\n\t\t\t\tsupport: \"https://rivet.dev/discord\",\n\t\t\t});\n\t\t} else if (stderrOutput.includes(\"Rivet Engine has been rolled back to a previous version\")) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"rivet engine version downgrade detected\",\n\t\t\t\thint: `You attempted to downgrade the RivetKit version in development. To fix this, nuke the database by running: '${binaryPath}' database nuke --yes`,\n\t\t\t\tcode,\n\t\t\t\tsignal,\n\t\t\t\tstdoutLog: stdoutLogPath,\n\t\t\t\tstderrLog: stderrLogPath,\n\t\t\t});\n\t\t} else {\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"engine process exited, please report this error\",\n\t\t\t\tcode,\n\t\t\t\tsignal,\n\t\t\t\tstdoutLog: stdoutLogPath,\n\t\t\t\tstderrLog: stderrLogPath,\n\t\t\t\tissues: \"https://github.com/rivet-dev/rivetkit/issues\",\n\t\t\t\tsupport: \"https://rivet.dev/discord\",\n\t\t\t});\n\t\t}\n\t\t// Clean up log streams\n\t\tstdoutStream.end();\n\t\tstderrStream.end();\n\t});\n\n\tchild.once(\"error\", (error) => {\n\t\tlogger().error({\n\t\t\tmsg: \"engine process failed\",\n\t\t\terror,\n\t\t});\n\t\t// Clean up log streams on error\n\t\tstdoutStream.end();\n\t\tstderrStream.end();\n\t});\n\n\t// Wait for engine to be ready\n\tawait waitForEngineHealth();\n\n\tlogger().info({\n\t\tmsg: \"engine process started\",\n\t\tpid: child.pid,\n\t\tversion: options.version,\n\t\tlogs: {\n\t\t\tstdout: stdoutLogPath,\n\t\t\tstderr: stderrLogPath,\n\t\t},\n\t});\n}\n\nasync function downloadEngineBinaryIfNeeded(\n\tbinaryPath: string,\n\tversion: string,\n\tvarDir: string,\n): Promise<void> {\n\tconst binaryExists = await fileExists(binaryPath);\n\tif (binaryExists) {\n\t\tlogger().debug({\n\t\t\tmsg: \"engine binary already cached\",\n\t\t\tversion,\n\t\t\tpath: binaryPath,\n\t\t});\n\t\treturn;\n\t}\n\n\tconst { targetTriplet, extension } = resolveTargetTriplet();\n\tconst remoteFile = `${ENGINE_BINARY_NAME}-${targetTriplet}${extension}`;\n\tconst downloadUrl = `${ENGINE_BASE_URL}/${version}/engine/${remoteFile}`;\n\tlogger().info({\n\t\tmsg: \"downloading engine binary\",\n\t\turl: downloadUrl,\n\t\tpath: binaryPath,\n\t\tversion,\n\t});\n\n\tconst response = await fetch(downloadUrl);\n\tif (!response.ok || !response.body) {\n\t\tthrow new Error(\n\t\t\t`failed to download rivet engine binary from ${downloadUrl}: ${response.status} ${response.statusText}`,\n\t\t);\n\t}\n\n\t// Generate unique temp file name to prevent parallel download conflicts\n\tconst crypto = getNodeCrypto();\n\tconst tempPath = `${binaryPath}.${crypto.randomUUID()}.tmp`;\n\tconst startTime = Date.now();\n\n\tlogger().debug({\n\t\tmsg: \"starting binary download\",\n\t\ttempPath,\n\t\tcontentLength: response.headers.get(\"content-length\"),\n\t});\n\n\t// Warn user if download is taking a long time\n\tconst slowDownloadWarning = setTimeout(() => {\n\t\tlogger().warn({\n\t\t\tmsg: \"engine binary download is taking longer than expected, please be patient\",\n\t\t\tversion,\n\t\t});\n\t}, 5000);\n\n\ttry {\n\t\tconst stream = getNodeStream();\n\t\tconst fsSync = getNodeFsSync();\n\t\tawait stream.pipeline(\n\t\t\tresponse.body as any,\n\t\t\tfsSync.createWriteStream(tempPath),\n\t\t);\n\n\t\t// Clear the slow download warning\n\t\tclearTimeout(slowDownloadWarning);\n\n\t\t// Get file size to verify download\n\t\tconst fs = getNodeFs();\n\t\tconst stats = await fs.stat(tempPath);\n\t\tconst downloadDuration = Date.now() - startTime;\n\n\t\tif (process.platform !== \"win32\") {\n\t\t\tawait fs.chmod(tempPath, 0o755);\n\t\t}\n\t\tawait fs.rename(tempPath, binaryPath);\n\n\t\tlogger().debug({\n\t\t\tmsg: \"engine binary download complete\",\n\t\t\tversion,\n\t\t\tpath: binaryPath,\n\t\t\tsize: stats.size,\n\t\t\tdurationMs: downloadDuration,\n\t\t});\n\t\tlogger().info({\n\t\t\tmsg: \"engine binary downloaded\",\n\t\t\tversion,\n\t\t\tpath: binaryPath,\n\t\t});\n\t} catch (error) {\n\t\t// Clear the slow download warning\n\t\tclearTimeout(slowDownloadWarning);\n\n\t\t// Clean up partial temp file on error\n\t\tlogger().warn({\n\t\t\tmsg: \"engine download failed, please report this error\",\n\t\t\ttempPath,\n\t\t\terror,\n\t\t\tissues: \"https://github.com/rivet-dev/rivetkit/issues\",\n\t\t\tsupport: \"https://rivet.dev/discord\",\n\t\t});\n\t\ttry {\n\t\t\tconst fs = getNodeFs();\n\t\t\tawait fs.unlink(tempPath);\n\t\t} catch (unlinkError) {\n\t\t\t// Ignore errors when cleaning up (file may not exist)\n\t\t}\n\t\tthrow error;\n\t}\n}\n//\nfunction resolveTargetTriplet(): { targetTriplet: string; extension: string } {\n\treturn resolveTargetTripletFor(process.platform, process.arch);\n}\n\nexport function resolveTargetTripletFor(\n\tplatform: NodeJS.Platform,\n\tarch: typeof process.arch,\n): { targetTriplet: string; extension: string } {\n\tswitch (platform) {\n\t\tcase \"darwin\":\n\t\t\tif (arch === \"arm64\") {\n\t\t\t\treturn { targetTriplet: \"aarch64-apple-darwin\", extension: \"\" };\n\t\t\t}\n\t\t\tif (arch === \"x64\") {\n\t\t\t\treturn { targetTriplet: \"x86_64-apple-darwin\", extension: \"\" };\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"linux\":\n\t\t\tif (arch === \"x64\") {\n\t\t\t\treturn {\n\t\t\t\t\ttargetTriplet: \"x86_64-unknown-linux-musl\",\n\t\t\t\t\textension: \"\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"win32\":\n\t\t\tif (arch === \"x64\") {\n\t\t\t\treturn {\n\t\t\t\t\ttargetTriplet: \"x86_64-pc-windows-gnu\",\n\t\t\t\t\textension: \".exe\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tthrow new Error(\n\t\t`unsupported platform for rivet engine binary: ${platform}/${arch}`,\n\t);\n}\nasync function isEngineRunning(): Promise<boolean> {\n\t// Check if the engine is running on the port\n\treturn await checkIfEngineAlreadyRunningOnPort(ENGINE_PORT);\n}\n\nasync function checkIfEngineAlreadyRunningOnPort(\n\tport: number,\n): Promise<boolean> {\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(`http://127.0.0.1:${port}/health`);\n\t} catch (err) {\n\t\t// Nothing is running on this port\n\t\treturn false;\n\t}\n\n\tif (response.ok) {\n\t\tconst health = (await response.json()) as EngineHealthResponse;\n\n\t\t// Check what's running on this port\n\t\tif (health.runtime === \"engine\") {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"rivet engine already running on port\",\n\t\t\t\tport,\n\t\t\t});\n\t\t\treturn true;\n\t\t} else if (health.runtime === \"rivetkit\") {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"another rivetkit process is already running on port\",\n\t\t\t\tport,\n\t\t\t});\n\t\t\tthrow new Error(\n\t\t\t\t\"RivetKit process already running on port 6420, stop that process and restart this.\",\n\t\t\t);\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t\"Unknown process running on port 6420, cannot identify what it is.\",\n\t\t\t);\n\t\t}\n\t}\n\n\t// Port responded but not with OK status\n\treturn false;\n}\nasync function fileExists(filePath: string): Promise<boolean> {\n\ttry {\n\t\tconst fs = getNodeFs();\n\t\tawait fs.access(filePath);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nconst HEALTH_MAX_WAIT = 10_000;\nconst HEALTH_INTERVAL = 100;\n\ninterface EngineHealthResponse {\n\tstatus?: string;\n\truntime?: string;\n\tversion?: string;\n}\n\nasync function waitForEngineHealth(): Promise<EngineHealthResponse> {\n\tconst maxRetries = Math.ceil(HEALTH_MAX_WAIT / HEALTH_INTERVAL);\n\n\tlogger().debug({ msg: \"waiting for engine health check\" });\n\n\tfor (let i = 0; i < maxRetries; i++) {\n\t\ttry {\n\t\t\tconst response = await fetch(`${ENGINE_ENDPOINT}/health`, {\n\t\t\t\tsignal: AbortSignal.timeout(1000),\n\t\t\t});\n\t\t\tif (response.ok) {\n\t\t\t\tconst health = (await response.json()) as EngineHealthResponse;\n\t\t\t\tlogger().debug({ msg: \"engine health check passed\" });\n\t\t\t\treturn health;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Expected to fail while engine is starting up\n\t\t\tlogger().debug({ msg: \"engine health check failed\", error });\n\t\t\tif (i === maxRetries - 1) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`engine health check failed after ${maxRetries} retries: ${error}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (i < maxRetries - 1) {\n\t\t\tlogger().trace({\n\t\t\t\tmsg: \"engine not ready, retrying\",\n\t\t\t\tattempt: i + 1,\n\t\t\t\tmaxRetries,\n\t\t\t});\n\t\t\tawait new Promise((resolve) =>\n\t\t\t\tsetTimeout(resolve, HEALTH_INTERVAL),\n\t\t\t);\n\t\t}\n\t}\n\n\tthrow new Error(`engine health check failed after ${maxRetries} retries`);\n}\n","import { createMiddleware } from \"hono/factory\";\nimport { inspectorLogger } from \"./log\";\nimport type { RegistryConfig } from \"@/registry/config\";\n\nexport function compareSecrets(providedSecret: string, validSecret: string) {\n\t// Early length check to avoid unnecessary processing\n\tif (providedSecret.length !== validSecret.length) {\n\t\treturn false;\n\t}\n\n\tconst encoder = new TextEncoder();\n\n\tconst a = encoder.encode(providedSecret);\n\tconst b = encoder.encode(validSecret);\n\n\tif (a.byteLength !== b.byteLength) {\n\t\treturn false;\n\t}\n\n\t// TODO:\n\t// // Perform timing-safe comparison\n\t// if (!crypto.timingSafeEqual(a, b)) {\n\t// \treturn false;\n\t// }\n\treturn true;\n}\n\nexport const secureInspector = (config: RegistryConfig) =>\n\tcreateMiddleware(async (c, next) => {\n\t\tconst userToken = c.req.header(\"Authorization\")?.replace(\"Bearer \", \"\");\n\t\tif (!userToken) {\n\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t}\n\n\t\tconst inspectorToken = config.inspector.token();\n\t\tif (!inspectorToken) {\n\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t}\n\n\t\tconst isValid = compareSecrets(userToken, inspectorToken);\n\t\tif (!isValid) {\n\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t}\n\t\tawait next();\n\t});\n\nexport function getInspectorUrl(\n\tconfig: RegistryConfig,\n\tmanagerPort: number,\n): string | undefined {\n\tif (!config.inspector.enabled) return undefined;\n\n\tconst url = new URL(\"https://inspect.rivet.dev\");\n\n\t// Only override endpoint if using non-default port or custom endpoint is set\n\tconst endpoint =\n\t\tconfig.inspector.defaultEndpoint ??\n\t\t(config.managerPort !== 6420\n\t\t\t? `http://127.0.0.1:${managerPort}`\n\t\t\t: undefined);\n\tif (endpoint) {\n\t\turl.searchParams.set(\"u\", endpoint);\n\t}\n\n\treturn url.href;\n}\n","import { getLogger } from \"@/common//log\";\n\nexport function logger() {\n\treturn getLogger(\"serverless\");\n}\n","import { RegistryConfig } from \"@/registry/config\";\nimport { logger } from \"./log\";\nimport invariant from \"invariant\";\nimport { convertRegistryConfigToClientConfig } from \"@/client/config\";\nimport {\n\tgetDatacenters,\n\tupdateRunnerConfig,\n} from \"@/remote-manager-driver/api-endpoints\";\n\nexport async function configureServerlessRunner(\n\tconfig: RegistryConfig,\n): Promise<void> {\n\tlogger().debug(\"configuring serverless runner\");\n\n\ttry {\n\t\t// Ensure we have required config values\n\t\tif (!config.namespace) {\n\t\t\tthrow new Error(\n\t\t\t\t\"namespace is required for serverless configuration\",\n\t\t\t);\n\t\t}\n\t\tif (!config.endpoint) {\n\t\t\tthrow new Error(\n\t\t\t\t\"endpoint is required for serverless configuration\",\n\t\t\t);\n\t\t}\n\n\t\t// Prepare the configuration\n\t\tconst customConfig = config.serverless.configureRunnerPool;\n\t\tinvariant(customConfig, \"configureRunnerPool should exist\");\n\n\t\tconst clientConfig = convertRegistryConfigToClientConfig(config);\n\n\t\t// Fetch all datacenters\n\t\tlogger().debug({\n\t\t\tmsg: \"fetching datacenters\",\n\t\t\tendpoint: config.endpoint,\n\t\t});\n\t\tconst dcsRes = await getDatacenters(clientConfig);\n\n\t\t// Build the request body\n\t\tconst runnerName = customConfig.name ?? \"default\";\n\t\tlogger().debug({\n\t\t\tmsg: \"configuring serverless runner\",\n\t\t\trunnerName,\n\t\t\tnamespace: config.namespace,\n\t\t});\n\t\tconst serverlessConfig = {\n\t\t\tserverless: {\n\t\t\t\turl: customConfig.url,\n\t\t\t\theaders: customConfig.headers ?? {},\n\t\t\t\tmax_runners: customConfig.maxRunners ?? 1000,\n\t\t\t\tmin_runners: customConfig.minRunners ?? 0,\n\t\t\t\trequest_lifespan: customConfig.requestLifespan ?? 15 * 60,\n\t\t\t\trunners_margin: customConfig.runnersMargin ?? 0,\n\t\t\t\tslots_per_runner: customConfig.slotsPerRunner ?? 1,\n\t\t\t\tmetadata_poll_interval: customConfig.metadataPollInterval ?? 1000,\n\t\t\t},\n\t\t\tmetadata: customConfig.metadata ?? {},\n\t\t\tdrain_on_version_upgrade: customConfig.drainOnVersionUpgrade ?? true,\n\t\t\tmetadataPollInterval: customConfig.metadataPollInterval ?? 1000,\n\t\t};\n\t\tawait updateRunnerConfig(clientConfig, runnerName, {\n\t\t\tdatacenters: Object.fromEntries(\n\t\t\t\tdcsRes.datacenters.map((dc) => [dc.name, serverlessConfig]),\n\t\t\t),\n\t\t});\n\n\t\tlogger().info({\n\t\t\tmsg: \"serverless runner configured successfully\",\n\t\t\trunnerName,\n\t\t\tnamespace: config.namespace,\n\t\t});\n\t} catch (error) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to configure serverless runner, validate endpoint is configured correctly then restart this process\",\n\t\t\terror,\n\t\t});\n\n\t\t// Don't throw, allow the runner to continue\n\t}\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"registry\");\n}\n","import type { Hono } from \"hono\";\nimport { detectRuntime, stringifyError } from \"../utils\";\nimport { logger } from \"./log\";\nimport { RegistryConfig } from \"./config\";\n\n// TODO: Go back to dynamic import for this\nimport getPort from \"get-port\";\n\nconst DEFAULT_PORT = 6420;\n\n/**\n * Finds a free port starting from the given port.\n *\n * Tries ports incrementally until a free one is found.\n */\nexport async function findFreePort(\n\tstartPort: number = DEFAULT_PORT,\n): Promise<number> {\n\t// TODO: Fix this\n\t// const getPortModule = \"get-port\";\n\t// const { default: getPort } = await import(/* webpackIgnore: true */ getPortModule);\n\n\t// Create an iterable of ports starting from startPort\n\tfunction* portRange(start: number, count: number = 100): Iterable<number> {\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tyield start + i;\n\t\t}\n\t}\n\n\treturn getPort({ port: portRange(startPort) });\n}\n\nexport async function crossPlatformServe(\n\tconfig: RegistryConfig,\n\tmanagerPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any }> {\n\tconst runtime = detectRuntime();\n\tlogger().debug({ msg: \"detected runtime for serve\", runtime });\n\n\tswitch (runtime) {\n\t\tcase \"deno\":\n\t\t\treturn serveDeno(config, managerPort, app);\n\t\tcase \"bun\":\n\t\t\treturn serveBun(config, managerPort, app);\n\t\tcase \"node\":\n\t\t\treturn serveNode(config, managerPort, app);\n\t\tdefault:\n\t\t\treturn serveNode(config, managerPort, app);\n\t}\n}\n\nasync function serveNode(\n\tconfig: RegistryConfig,\n\tmanagerPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any }> {\n\t// Import @hono/node-server using string variable to prevent static analysis\n\tconst nodeServerModule = \"@hono/node-server\";\n\tlet serve: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\tnodeServerModule\n\t\t);\n\t\tserve = dep.serve;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import @hono/node-server. please run 'npm install @hono/node-server @hono/node-ws'\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\t// Import @hono/node-ws using string variable to prevent static analysis\n\tconst nodeWsModule = \"@hono/node-ws\";\n\tlet createNodeWebSocket: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\tnodeWsModule\n\t\t);\n\t\tcreateNodeWebSocket = dep.createNodeWebSocket;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import @hono/node-ws. please run 'npm install @hono/node-server @hono/node-ws'\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\t// Inject WS\n\tconst { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({\n\t\tapp: app,\n\t});\n\n\t// Start server\n\tconst port = managerPort;\n\tconst hostname = config.managerHost;\n\tconst server = serve({ fetch: app.fetch, port, hostname }, () =>\n\t\tlogger().info({ msg: \"server listening\", port, hostname }),\n\t);\n\tinjectWebSocket(server);\n\n\treturn { upgradeWebSocket };\n}\n\nasync function serveDeno(\n\tconfig: RegistryConfig,\n\tmanagerPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any }> {\n\t// Import hono/deno using string variable to prevent static analysis\n\tconst honoDenoModule = \"hono/deno\";\n\tlet upgradeWebSocket: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\thonoDenoModule\n\t\t);\n\t\tupgradeWebSocket = dep.upgradeWebSocket;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import hono/deno\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\tconst port = config.managerPort;\n\tconst hostname = config.managerHost;\n\n\t// Use Deno.serve\n\tDeno.serve({ port, hostname }, app.fetch);\n\tlogger().info({ msg: \"server listening\", port, hostname });\n\n\treturn { upgradeWebSocket };\n}\n\nasync function serveBun(\n\tconfig: RegistryConfig,\n\tmanagerPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any }> {\n\t// Import hono/bun using string variable to prevent static analysis\n\tconst honoBunModule = \"hono/bun\";\n\tlet createBunWebSocket: any;\n\ttry {\n\t\tconst dep = await import(\n\t\t\t/* webpackIgnore: true */\n\t\t\thonoBunModule\n\t\t);\n\t\tcreateBunWebSocket = dep.createBunWebSocket;\n\t} catch (err) {\n\t\tlogger().error({\n\t\t\tmsg: \"failed to import hono/bun\",\n\t\t\terror: stringifyError(err),\n\t\t});\n\t\tprocess.exit(1);\n\t}\n\n\tconst { websocket, upgradeWebSocket } = createBunWebSocket();\n\n\tconst port = config.managerPort;\n\tconst hostname = config.managerHost;\n\n\t// Use Bun.serve\n\t// @ts-expect-error - Bun global\n\tBun.serve({\n\t\tfetch: app.fetch,\n\t\tport,\n\t\thostname,\n\t\twebsocket,\n\t});\n\tlogger().info({ msg: \"server listening\", port, hostname });\n\n\treturn { upgradeWebSocket };\n}\n","import invariant from \"invariant\";\nimport {\n\tEndpointMismatch,\n\tInvalidRequest,\n\tNamespaceMismatch,\n} from \"@/actor/errors\";\nimport { convertRegistryConfigToClientConfig } from \"@/client/config\";\nimport { handleHealthRequest, handleMetadataRequest } from \"@/common/router\";\nimport { ServerlessStartHeadersSchema } from \"@/manager/router-schema\";\nimport { createClientWithDriver } from \"@/mod\";\nimport type { DriverConfig, RegistryConfig } from \"@/registry/config\";\nimport { RemoteManagerDriver } from \"@/remote-manager-driver/mod\";\nimport { createRouter } from \"@/utils/router\";\nimport { logger } from \"./log\";\n\nexport function buildServerlessRouter(\n\tdriverConfig: DriverConfig,\n\tconfig: RegistryConfig,\n) {\n\treturn createRouter(config.serverless.basePath, (router) => {\n\t\t// GET /\n\t\trouter.get(\"/\", (c) => {\n\t\t\treturn c.text(\n\t\t\t\t\"This is a RivetKit server.\\n\\nLearn more at https://rivetkit.org\",\n\t\t\t);\n\t\t});\n\n\t\t// Serverless start endpoint\n\t\trouter.get(\"/start\", async (c) => {\n\t\t\t// Parse headers\n\t\t\tconst parseResult = ServerlessStartHeadersSchema.safeParse({\n\t\t\t\tendpoint: c.req.header(\"x-rivet-endpoint\"),\n\t\t\t\ttoken: c.req.header(\"x-rivet-token\") ?? undefined,\n\t\t\t\ttotalSlots: c.req.header(\"x-rivet-total-slots\"),\n\t\t\t\trunnerName: c.req.header(\"x-rivet-runner-name\"),\n\t\t\t\tnamespace: c.req.header(\"x-rivet-namespace-name\"),\n\t\t\t});\n\t\t\tif (!parseResult.success) {\n\t\t\t\tthrow new InvalidRequest(\n\t\t\t\t\tparseResult.error.issues[0]?.message ??\n\t\t\t\t\t\t\"invalid serverless start headers\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst { endpoint, token, totalSlots, runnerName, namespace } =\n\t\t\t\tparseResult.data;\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"received serverless runner start request\",\n\t\t\t\tendpoint,\n\t\t\t\ttotalSlots,\n\t\t\t\trunnerName,\n\t\t\t\tnamespace,\n\t\t\t});\n\n\t\t\t// Validate endpoint and namespace match config to catch\n\t\t\t// misconfiguration or malicious requests.\n\t\t\t//\n\t\t\t// Only verify if namespace matches if endpoint configured since\n\t\t\t// configuring an endpoint indicates you want to assert the\n\t\t\t// incoming serverless requests.\n\t\t\tif (config.endpoint) {\n\t\t\t\tif (!endpointsMatch(endpoint, config.endpoint)) {\n\t\t\t\t\tthrow new EndpointMismatch(config.endpoint, endpoint);\n\t\t\t\t}\n\n\t\t\t\tif (namespace !== config.namespace) {\n\t\t\t\t\tthrow new NamespaceMismatch(config.namespace, namespace);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Convert config to runner config\n\t\t\tconst newConfig: RegistryConfig = {\n\t\t\t\t...config,\n\t\t\t\tendpoint: endpoint,\n\t\t\t\tnamespace: namespace,\n\t\t\t\ttoken: token,\n\t\t\t\trunner: {\n\t\t\t\t\t...config.runner,\n\t\t\t\t\ttotalSlots: totalSlots,\n\t\t\t\t\trunnerName: runnerName,\n\t\t\t\t\t// Not supported on serverless\n\t\t\t\t\trunnerKey: undefined,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\t// Create manager driver on demand based on the properties provided\n\t\t\t// by headers\n\t\t\t//\n\t\t\t// NOTE: This relies on the `newConfig.runner.runnerName` to\n\t\t\t// configure which runner to create actors on.\n\t\t\tconst managerDriver = new RemoteManagerDriver(\n\t\t\t\tconvertRegistryConfigToClientConfig(newConfig),\n\t\t\t);\n\t\t\tconst client = createClientWithDriver(managerDriver);\n\n\t\t\t// Create new actor driver with updated config\n\t\t\tconst actorDriver = driverConfig.actor(\n\t\t\t\tnewConfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tclient,\n\t\t\t);\n\t\t\tinvariant(\n\t\t\t\tactorDriver.serverlessHandleStart,\n\t\t\t\t\"missing serverlessHandleStart on ActorDriver\",\n\t\t\t);\n\n\t\t\treturn await actorDriver.serverlessHandleStart(c);\n\t\t});\n\n\t\trouter.get(\"/health\", (c) => handleHealthRequest(c));\n\n\t\trouter.get(\"/metadata\", (c) =>\n\t\t\thandleMetadataRequest(\n\t\t\t\tc,\n\t\t\t\tconfig,\n\t\t\t\t{ serverless: {} },\n\t\t\t\tconfig.publicEndpoint,\n\t\t\t\tconfig.publicNamespace,\n\t\t\t\tconfig.publicToken,\n\t\t\t),\n\t\t);\n\t});\n}\n\n/**\n * Normalizes a URL for comparison by extracting protocol, host, port, and pathname.\n * Normalizes loopback addresses (127.0.0.1, 0.0.0.0, ::1) to localhost for consistent comparison.\n * Normalizes regional endpoints (api-*.domain) to base endpoints (api.domain).\n * Returns null if the URL is invalid.\n */\nexport function normalizeEndpointUrl(url: string): string | null {\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\t// Normalize pathname by removing trailing slash (except for root)\n\t\tconst pathname =\n\t\t\tparsed.pathname === \"/\" ? \"/\" : parsed.pathname.replace(/\\/+$/, \"\");\n\n\t\t// Normalize loopback addresses to localhost\n\t\tlet hostname = isLoopbackAddress(parsed.hostname)\n\t\t\t? \"localhost\"\n\t\t\t: parsed.hostname;\n\n\t\t// Normalize regional endpoints (api-region.domain) to base endpoints (api.domain)\n\t\t// HACK: This is specific to Rivet Cloud and will not work for self-hosted\n\t\t// engines with different regional endpoint naming conventions.\n\t\thostname = normalizeRegionalHostname(hostname);\n\n\t\t// Reconstruct host with normalized hostname and port\n\t\tconst host = parsed.port ? `${hostname}:${parsed.port}` : hostname;\n\n\t\t// Reconstruct normalized URL with protocol, host, and pathname\n\t\treturn `${parsed.protocol}//${host}${pathname}`;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Normalizes regional hostnames (api-region.domain) to base hostnames (api.domain).\n * Only applies to rivet.dev domains.\n *\n * Examples:\n * - api-us-west-1.rivet.dev -> api.rivet.dev\n * - api-lax.staging.rivet.dev -> api.staging.rivet.dev\n * - api.rivet.dev -> api.rivet.dev (unchanged)\n * - api-us-west-1.example.com -> api-us-west-1.example.com (unchanged, not rivet.dev)\n * - foo-bar.rivet.dev -> foo-bar.rivet.dev (unchanged, not api- prefix)\n */\nfunction normalizeRegionalHostname(hostname: string): string {\n\t// Only apply to rivet.dev domains\n\tif (!hostname.endsWith(\".rivet.dev\")) {\n\t\treturn hostname;\n\t}\n\n\tif (!hostname.startsWith(\"api-\")) {\n\t\treturn hostname;\n\t}\n\n\t// Find the first dot after \"api-\"\n\tconst withoutPrefix = hostname.slice(4); // Remove \"api-\"\n\tconst firstDotIndex = withoutPrefix.indexOf(\".\");\n\tif (firstDotIndex === -1) {\n\t\treturn hostname;\n\t}\n\n\t// Extract the domain part and prepend \"api.\"\n\tconst domain = withoutPrefix.slice(firstDotIndex + 1);\n\treturn `api.${domain}`;\n}\n\n/**\n * Compares two endpoint URLs after normalization.\n * Returns true if they match (same protocol, host, port, and path).\n */\nexport function endpointsMatch(a: string, b: string): boolean {\n\tconst normalizedA = normalizeEndpointUrl(a);\n\tconst normalizedB = normalizeEndpointUrl(b);\n\tif (normalizedA === null || normalizedB === null) {\n\t\t// If either URL is invalid, fall back to string comparison\n\t\treturn a === b;\n\t}\n\treturn normalizedA === normalizedB;\n}\n\n/**\n * Checks if a hostname is a loopback address that should be normalized to localhost.\n */\nfunction isLoopbackAddress(hostname: string): boolean {\n\treturn (\n\t\thostname === \"127.0.0.1\" ||\n\t\thostname === \"0.0.0.0\" ||\n\t\thostname === \"::1\" ||\n\t\thostname === \"[::1]\"\n\t);\n}\n","import { z } from \"zod\";\n\nexport const ServerlessStartHeadersSchema = z.object({\n\tendpoint: z.string({\n\t\terror: \"x-rivet-endpoint header is required\",\n\t}),\n\ttoken: z\n\t\t.string({ error: \"x-rivet-token header must be a string\" })\n\t\t.optional(),\n\ttotalSlots: z.coerce\n\t\t.number({\n\t\t\terror: \"x-rivet-total-slots header must be a number\",\n\t\t})\n\t\t.int({ error: \"x-rivet-total-slots header must be an integer\" })\n\t\t.gte(1, { error: \"x-rivet-total-slots header must be positive\" }),\n\trunnerName: z.string({\n\t\terror: \"x-rivet-runner-name header is required\",\n\t}),\n\tnamespace: z.string({\n\t\terror: \"x-rivet-namespace-name header is required\",\n\t}),\n});\n","import type { Client } from \"@/client/client\";\nimport { createClient } from \"@/client/mod\";\nimport { isDev } from \"@/utils/env-vars\";\nimport {\n\ttype RegistryActors,\n\ttype RegistryConfig,\n\ttype RegistryConfigInput,\n\tRegistryConfigSchema,\n} from \"./config\";\nimport {\n\ttype LegacyRunnerConfig,\n\ttype LegacyRunnerConfigInput,\n\tLegacyRunnerConfigSchema,\n} from \"./config/legacy-runner\";\nimport { Runtime } from \"../../runtime\";\n\nexport type FetchHandler = (\n\trequest: Request,\n\t...args: any\n) => Response | Promise<Response>;\n\nexport interface ServerlessHandler {\n\tfetch: FetchHandler;\n}\n\nexport interface LegacyStartServerOutput<A extends Registry<any>> {\n\t/** Client to communicate with the actors. */\n\tclient: Client<A>;\n\t/** Fetch handler to manually route requests to the Rivet manager API. */\n\tfetch: FetchHandler;\n}\n\nexport class Registry<A extends RegistryActors> {\n\t#config: RegistryConfigInput<A>;\n\n\tget config(): RegistryConfigInput<A> {\n\t\treturn this.#config;\n\t}\n\n\tparseConfig(): RegistryConfig {\n\t\treturn RegistryConfigSchema.parse(this.#config);\n\t}\n\n\t// Shared runtime instance\n\t#runtime?: Runtime<A>;\n\t#runtimePromise?: Promise<Runtime<A>>;\n\n\tconstructor(config: RegistryConfigInput<A>) {\n\t\tthis.#config = config;\n\n\t\t// Auto-prepare on next tick (gives time for sync config modification)\n\t\tsetTimeout(() => {\n\t\t\t// biome-ignore lint/nursery/noFloatingPromises: fire-and-forget auto-prepare\n\t\t\tthis.#ensureRuntime();\n\t\t}, 0);\n\t}\n\n\t/** Creates runtime if not already created. Idempotent. */\n\t#ensureRuntime(): Promise<Runtime<A>> {\n\t\tif (!this.#runtimePromise) {\n\t\t\tthis.#runtimePromise = Runtime.create(this);\n\t\t\t// biome-ignore lint/nursery/noFloatingPromises: bg task\n\t\t\tthis.#runtimePromise.then((rt) => {\n\t\t\t\tthis.#runtime = rt;\n\t\t\t});\n\t\t}\n\t\treturn this.#runtimePromise;\n\t}\n\n\t/**\n\t * Handle an incoming HTTP request for serverless deployments.\n\t *\n\t * @example\n\t * ```ts\n\t * const app = new Hono();\n\t * app.all(\"/api/rivet/*\", (c) => registry.handler(c.req.raw));\n\t * export default app;\n\t * ```\n\t */\n\tpublic async handler(request: Request): Promise<Response> {\n\t\tconst runtime = await this.#ensureRuntime();\n\t\truntime.startServerless();\n\t\treturn await runtime.handleServerlessRequest(request);\n\t}\n\n\t/**\n\t * Returns a fetch handler for serverless deployments.\n\t *\n\t * @example\n\t * ```ts\n\t * export default registry.serve();\n\t * ```\n\t */\n\tpublic serve(): ServerlessHandler {\n\t\treturn { fetch: this.handler.bind(this) };\n\t}\n\n\t/**\n\t * Starts an actor runner for standalone server deployments.\n\t */\n\tpublic startRunner() {\n\t\t// biome-ignore lint/nursery/noFloatingPromises: bg task\n\t\tthis.#ensureRuntime().then((runtime) => runtime.startRunner());\n\t}\n\n\t// MARK: Legacy\n\t/**\n\t * Runs the registry for a server.\n\t *\n\t * @deprecated Use {@link Registry.startRunner} for long-running servers or {@link Registry.handler} for serverless deployments.\n\t */\n\tpublic start(\n\t\tinputConfig?: LegacyRunnerConfigInput,\n\t): LegacyStartServerOutput<this> {\n\t\tconst config = LegacyRunnerConfigSchema.parse(inputConfig);\n\n\t\t// Validate autoConfigureServerless is only used with serverless runner\n\t\tif (\n\t\t\tconfig.autoConfigureServerless &&\n\t\t\tconfig.runnerKind !== \"serverless\"\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t\"autoConfigureServerless can only be configured when runnerKind is 'serverless'\",\n\t\t\t);\n\t\t}\n\n\t\t// Auto-configure serverless runner if not in prod\n\t\tconst isDevEnv = isDev();\n\t\tif (isDevEnv && config.runnerKind === \"serverless\") {\n\t\t\tif (inputConfig?.runEngine === undefined) config.runEngine = true;\n\t\t\tif (inputConfig?.autoConfigureServerless === undefined)\n\t\t\t\tconfig.autoConfigureServerless = true;\n\t\t}\n\n\t\t// Convert to new config format and call appropriate handler\n\t\tif (config.runnerKind === \"serverless\") {\n\t\t\treturn this.#legacyStartServerless(config, inputConfig);\n\t\t} else {\n\t\t\treturn this.#legacyStartNormal(config);\n\t\t}\n\t}\n\n\t#legacyStartServerless(\n\t\tconfig: LegacyRunnerConfig,\n\t\t_inputConfig: LegacyRunnerConfigInput | undefined,\n\t): LegacyStartServerOutput<this> {\n\t\t// Create client for the legacy return value\n\t\t// For serverless, we don't have an endpoint until /start is called,\n\t\t// so we create a placeholder client\n\t\tconst client = createClient<this>({\n\t\t\tendpoint: config.endpoint,\n\t\t\ttoken: config.token,\n\t\t\tnamespace: config.namespace,\n\t\t\theaders: config.headers,\n\t\t});\n\n\t\treturn {\n\t\t\tclient,\n\t\t\tfetch: this.handler.bind(this),\n\t\t};\n\t}\n\n\t#legacyStartNormal(\n\t\tconfig: LegacyRunnerConfig,\n\t): LegacyStartServerOutput<this> {\n\t\t// Start the runner (fire-and-forget to maintain sync API)\n\t\t// biome-ignore lint/nursery/noFloatingPromises: legacy sync API\n\t\tthis.#ensureRuntime().then((runtime) => runtime.startRunner());\n\n\t\t// Create client for the legacy return value\n\t\tconst client = createClient<this>({\n\t\t\tendpoint: config.endpoint,\n\t\t\ttoken: config.token,\n\t\t\tnamespace: config.namespace,\n\t\t\theaders: config.headers,\n\t\t});\n\n\t\treturn {\n\t\t\tclient,\n\t\t\tfetch: this.handler.bind(this),\n\t\t};\n\t}\n}\n\nexport function setup<A extends RegistryActors>(\n\tinput: RegistryConfigInput<A>,\n): Registry<A> {\n\treturn new Registry(input);\n}\n\nexport type { RegistryConfig, RegistryActors };\nexport { RegistryConfigSchema };\n"],"mappings":"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","names":["actor","_a","_b","z","z","z","z","invariant","logger","logger","crypto","logger","invariant","logger","invariant","logger","logger","invariant","z","logger","invariant","logger","invariant"]}