rivetkit 2.1.5 → 2.1.6-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/client.d.ts +593 -588
- package/dist/browser/client.js +215 -35
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.js +109 -10
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/inspector.tar.gz +0 -0
- package/dist/tsup/actor/errors.cjs +2 -2
- package/dist/tsup/actor/errors.js +1 -1
- package/dist/tsup/{actor-router-consts-D29T1Z-K.d.cts → actor-router-consts-DU-1IdQj.d.cts} +1 -1
- package/dist/tsup/{actor-router-consts-D29T1Z-K.d.ts → actor-router-consts-DU-1IdQj.d.ts} +1 -1
- package/dist/tsup/chunk-2ELYUO6C.cjs +112 -0
- package/dist/tsup/chunk-2ELYUO6C.cjs.map +1 -0
- package/dist/tsup/chunk-2LY7RW3Y.cjs +2316 -0
- package/dist/tsup/chunk-2LY7RW3Y.cjs.map +1 -0
- package/dist/tsup/{chunk-L47L3ZWJ.cjs → chunk-6G7ZNM27.cjs} +11 -6
- package/dist/tsup/chunk-6G7ZNM27.cjs.map +1 -0
- package/dist/tsup/{chunk-PB5AEMKQ.cjs → chunk-A4KEUCB6.cjs} +84 -34
- package/dist/tsup/chunk-A4KEUCB6.cjs.map +1 -0
- package/dist/tsup/{chunk-7HTNH26M.js → chunk-AKUJ5OTO.js} +11 -6
- package/dist/tsup/chunk-AKUJ5OTO.js.map +1 -0
- package/dist/tsup/{chunk-TADUYCHF.js → chunk-C22JYHVT.js} +77 -27
- package/dist/tsup/chunk-C22JYHVT.js.map +1 -0
- package/dist/tsup/chunk-C4EB42ET.js +1459 -0
- package/dist/tsup/chunk-C4EB42ET.js.map +1 -0
- package/dist/tsup/chunk-CGGGBIDP.cjs +1459 -0
- package/dist/tsup/chunk-CGGGBIDP.cjs.map +1 -0
- package/dist/tsup/chunk-CMQPDBBR.cjs +1486 -0
- package/dist/tsup/chunk-CMQPDBBR.cjs.map +1 -0
- package/dist/tsup/{chunk-GQGRQDRL.cjs → chunk-DH6UINWA.cjs} +4 -4
- package/dist/tsup/{chunk-GQGRQDRL.cjs.map → chunk-DH6UINWA.cjs.map} +1 -1
- package/dist/tsup/chunk-DK46YYCJ.js +1486 -0
- package/dist/tsup/chunk-DK46YYCJ.js.map +1 -0
- package/dist/tsup/chunk-EGWXXBZV.js +2316 -0
- package/dist/tsup/chunk-EGWXXBZV.js.map +1 -0
- package/dist/tsup/{chunk-S662Y6ZU.js → chunk-EONWXYMN.js} +2 -2
- package/dist/tsup/{chunk-N4KRDJ56.js → chunk-GFGRBYO2.js} +35 -6
- package/dist/tsup/chunk-GFGRBYO2.js.map +1 -0
- package/dist/tsup/{chunk-IIJNPVPQ.cjs → chunk-GUHXWPGB.cjs} +1515 -1479
- package/dist/tsup/chunk-GUHXWPGB.cjs.map +1 -0
- package/dist/tsup/{chunk-TI5PXQGG.cjs → chunk-HNE2AK6C.cjs} +2375 -3713
- package/dist/tsup/chunk-HNE2AK6C.cjs.map +1 -0
- package/dist/tsup/{chunk-2OK7S6QF.js → chunk-I5I6OALK.js} +2 -2
- package/dist/tsup/chunk-IHQAF2HV.cjs +23 -0
- package/dist/tsup/chunk-IHQAF2HV.cjs.map +1 -0
- package/dist/tsup/{chunk-U5SMSA27.cjs → chunk-JJNZQDUN.cjs} +667 -2517
- package/dist/tsup/chunk-JJNZQDUN.cjs.map +1 -0
- package/dist/tsup/{chunk-ZPWOYQHN.js → chunk-JJSPHLJN.js} +219 -287
- package/dist/tsup/chunk-JJSPHLJN.js.map +1 -0
- package/dist/tsup/chunk-JRKPV5NJ.js +481 -0
- package/dist/tsup/chunk-JRKPV5NJ.js.map +1 -0
- package/dist/tsup/{chunk-VKVNIQRQ.js → chunk-K7MVU5SI.js} +36 -41
- package/dist/tsup/chunk-K7MVU5SI.js.map +1 -0
- package/dist/tsup/{chunk-KJSYAUOM.js → chunk-MLK3GY6P.js} +43 -27
- package/dist/tsup/chunk-MLK3GY6P.js.map +1 -0
- package/dist/tsup/{chunk-HYPIHCDT.cjs → chunk-MPLMTJY5.cjs} +123 -23
- package/dist/tsup/chunk-MPLMTJY5.cjs.map +1 -0
- package/dist/tsup/{chunk-MIX2KB6U.js → chunk-PQWI44WD.js} +1755 -3093
- package/dist/tsup/chunk-PQWI44WD.js.map +1 -0
- package/dist/tsup/{chunk-SR3KQE7Q.cjs → chunk-SQFCIDCG.cjs} +35 -6
- package/dist/tsup/chunk-SQFCIDCG.cjs.map +1 -0
- package/dist/tsup/{chunk-WY2SHWXQ.js → chunk-SVHJSM2E.js} +110 -24
- package/dist/tsup/chunk-SVHJSM2E.js.map +1 -0
- package/dist/tsup/chunk-T5KYKM6R.js +49 -0
- package/dist/tsup/chunk-T5KYKM6R.js.map +1 -0
- package/dist/tsup/{chunk-7WF2QSIC.cjs → chunk-TJ7DKW6F.cjs} +123 -37
- package/dist/tsup/chunk-TJ7DKW6F.cjs.map +1 -0
- package/dist/tsup/chunk-UQZRMTM3.js +23 -0
- package/dist/tsup/chunk-UQZRMTM3.js.map +1 -0
- package/dist/tsup/{chunk-JC6BEPE7.cjs → chunk-V3JSZR5P.cjs} +3 -3
- package/dist/tsup/{chunk-JC6BEPE7.cjs.map → chunk-V3JSZR5P.cjs.map} +1 -1
- package/dist/tsup/{chunk-OAXJWGMU.cjs → chunk-VBR35EQF.cjs} +271 -339
- package/dist/tsup/chunk-VBR35EQF.cjs.map +1 -0
- package/dist/tsup/{chunk-EIATSBYZ.js → chunk-VWYO36X4.js} +117 -17
- package/dist/tsup/chunk-VWYO36X4.js.map +1 -0
- package/dist/tsup/{chunk-JPXO2H55.js → chunk-WW27B6DM.js} +1452 -1416
- package/dist/tsup/chunk-WW27B6DM.js.map +1 -0
- package/dist/tsup/chunk-YAE3MEJM.cjs +49 -0
- package/dist/tsup/chunk-YAE3MEJM.cjs.map +1 -0
- package/dist/tsup/{chunk-SRIM3GHD.js → chunk-YGYGANCA.js} +473 -2323
- package/dist/tsup/chunk-YGYGANCA.js.map +1 -0
- package/dist/tsup/chunk-YZJWZBY5.cjs +481 -0
- package/dist/tsup/chunk-YZJWZBY5.cjs.map +1 -0
- package/dist/tsup/{chunk-ZFY5J2EP.cjs → chunk-ZZLJ5TSM.cjs} +39 -44
- package/dist/tsup/chunk-ZZLJ5TSM.cjs.map +1 -0
- package/dist/tsup/client/mod.cjs +10 -7
- package/dist/tsup/client/mod.cjs.map +1 -1
- package/dist/tsup/client/mod.d.cts +6 -6
- package/dist/tsup/client/mod.d.ts +6 -6
- package/dist/tsup/client/mod.js +11 -8
- package/dist/tsup/common/log.cjs +3 -3
- package/dist/tsup/common/log.js +2 -2
- package/dist/tsup/common/websocket.cjs +4 -4
- package/dist/tsup/common/websocket.js +3 -3
- package/dist/tsup/{config-Qj-zLJPc.d.ts → config-C2Wwnc69.d.ts} +142 -208
- package/dist/tsup/{config-BiNoIHRs.d.ts → config-DROwzBLT.d.cts} +82 -6
- package/dist/tsup/{config-BiNoIHRs.d.cts → config-DROwzBLT.d.ts} +82 -6
- package/dist/tsup/{config-iPj5l1bL.d.cts → config-ehT-_3BB.d.cts} +142 -208
- package/dist/tsup/{context-DzvH1PBK.d.cts → context-DGMJuAyc.d.ts} +16 -3
- package/dist/tsup/{context-CQCMuHND.d.ts → context-Dpp2RJbW.d.cts} +16 -3
- package/dist/tsup/db/drizzle/mod.cjs +3 -3
- package/dist/tsup/db/drizzle/mod.d.cts +1 -1
- package/dist/tsup/db/drizzle/mod.d.ts +1 -1
- package/dist/tsup/db/drizzle/mod.js +2 -2
- package/dist/tsup/db/mod.cjs +3 -3
- package/dist/tsup/db/mod.d.cts +1 -1
- package/dist/tsup/db/mod.d.ts +1 -1
- package/dist/tsup/db/mod.js +2 -2
- package/dist/tsup/{driver-Jo8v-kbU.d.ts → driver-CYZP9QYo.d.ts} +1 -1
- package/dist/tsup/{driver-iV8J-WMv.d.cts → driver-CoTFpipv.d.cts} +1 -1
- package/dist/tsup/driver-helpers/mod.cjs +7 -5
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
- package/dist/tsup/driver-helpers/mod.d.cts +17 -18
- package/dist/tsup/driver-helpers/mod.d.ts +17 -18
- package/dist/tsup/driver-helpers/mod.js +11 -9
- package/dist/tsup/driver-test-suite/mod.cjs +1275 -228
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +6 -5
- package/dist/tsup/driver-test-suite/mod.d.ts +6 -5
- package/dist/tsup/driver-test-suite/mod.js +1581 -534
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +4 -4
- package/dist/tsup/inspector/mod.js +3 -3
- package/dist/tsup/mod.cjs +15 -9
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +9 -9
- package/dist/tsup/mod.d.ts +9 -9
- package/dist/tsup/mod.js +19 -13
- package/dist/tsup/sandbox/client.cjs +28 -0
- package/dist/tsup/sandbox/client.cjs.map +1 -0
- package/dist/tsup/sandbox/client.d.cts +88 -0
- package/dist/tsup/sandbox/client.d.ts +88 -0
- package/dist/tsup/sandbox/client.js +28 -0
- package/dist/tsup/sandbox/client.js.map +1 -0
- package/dist/tsup/sandbox/index.cjs +761 -0
- package/dist/tsup/sandbox/index.cjs.map +1 -0
- package/dist/tsup/sandbox/index.d.cts +120 -0
- package/dist/tsup/sandbox/index.d.ts +120 -0
- package/dist/tsup/sandbox/index.js +761 -0
- package/dist/tsup/sandbox/index.js.map +1 -0
- package/dist/tsup/sandbox/providers/computesdk.cjs +3 -0
- package/dist/tsup/sandbox/providers/computesdk.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/computesdk.d.cts +7 -0
- package/dist/tsup/sandbox/providers/computesdk.d.ts +7 -0
- package/dist/tsup/sandbox/providers/computesdk.js +3 -0
- package/dist/tsup/sandbox/providers/computesdk.js.map +1 -0
- package/dist/tsup/sandbox/providers/daytona.cjs +3 -0
- package/dist/tsup/sandbox/providers/daytona.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/daytona.d.cts +1 -0
- package/dist/tsup/sandbox/providers/daytona.d.ts +1 -0
- package/dist/tsup/sandbox/providers/daytona.js +3 -0
- package/dist/tsup/sandbox/providers/daytona.js.map +1 -0
- package/dist/tsup/sandbox/providers/docker.cjs +3 -0
- package/dist/tsup/sandbox/providers/docker.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/docker.d.cts +1 -0
- package/dist/tsup/sandbox/providers/docker.d.ts +1 -0
- package/dist/tsup/sandbox/providers/docker.js +3 -0
- package/dist/tsup/sandbox/providers/docker.js.map +1 -0
- package/dist/tsup/sandbox/providers/e2b.cjs +3 -0
- package/dist/tsup/sandbox/providers/e2b.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/e2b.d.cts +1 -0
- package/dist/tsup/sandbox/providers/e2b.d.ts +1 -0
- package/dist/tsup/sandbox/providers/e2b.js +3 -0
- package/dist/tsup/sandbox/providers/e2b.js.map +1 -0
- package/dist/tsup/sandbox/providers/local.cjs +3 -0
- package/dist/tsup/sandbox/providers/local.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/local.d.cts +1 -0
- package/dist/tsup/sandbox/providers/local.d.ts +1 -0
- package/dist/tsup/sandbox/providers/local.js +3 -0
- package/dist/tsup/sandbox/providers/local.js.map +1 -0
- package/dist/tsup/sandbox/providers/modal.cjs +3 -0
- package/dist/tsup/sandbox/providers/modal.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/modal.d.cts +1 -0
- package/dist/tsup/sandbox/providers/modal.d.ts +1 -0
- package/dist/tsup/sandbox/providers/modal.js +3 -0
- package/dist/tsup/sandbox/providers/modal.js.map +1 -0
- package/dist/tsup/sandbox/providers/vercel.cjs +3 -0
- package/dist/tsup/sandbox/providers/vercel.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/vercel.d.cts +1 -0
- package/dist/tsup/sandbox/providers/vercel.d.ts +1 -0
- package/dist/tsup/sandbox/providers/vercel.js +3 -0
- package/dist/tsup/sandbox/providers/vercel.js.map +1 -0
- package/dist/tsup/serve-test-suite/mod.cjs +451 -327
- package/dist/tsup/serve-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/serve-test-suite/mod.js +362 -238
- package/dist/tsup/serve-test-suite/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +17 -14
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +4 -4
- package/dist/tsup/test/mod.d.ts +4 -4
- package/dist/tsup/test/mod.js +14 -11
- package/dist/tsup/test/mod.js.map +1 -1
- package/dist/tsup/utils.cjs +3 -3
- package/dist/tsup/utils.js +2 -2
- package/dist/tsup/workflow/mod.cjs +6 -6
- package/dist/tsup/workflow/mod.d.cts +13 -9
- package/dist/tsup/workflow/mod.d.ts +13 -9
- package/dist/tsup/workflow/mod.js +5 -5
- package/package.json +114 -15
- package/src/actor/config.ts +94 -88
- package/src/actor/conn/drivers/websocket.ts +2 -1
- package/src/actor/contexts/base/actor.ts +27 -4
- package/src/actor/database.ts +6 -1
- package/src/actor/driver.ts +27 -8
- package/src/actor/errors.ts +10 -5
- package/src/actor/instance/connection-manager.ts +4 -3
- package/src/actor/instance/kv.ts +52 -9
- package/src/actor/instance/mod.ts +135 -84
- package/src/actor/instance/queue-manager.ts +2 -5
- package/src/actor/instance/queue.ts +31 -29
- package/src/actor/instance/state-manager.ts +7 -1
- package/src/actor/instance/traces-driver.ts +34 -36
- package/src/actor/metrics.ts +137 -0
- package/src/actor/protocol/old.ts +9 -12
- package/src/actor/router-websocket-endpoints.ts +12 -6
- package/src/actor/router.ts +46 -9
- package/src/actor/schema.ts +14 -22
- package/src/client/actor-common.ts +65 -0
- package/src/client/actor-conn.ts +71 -9
- package/src/client/actor-handle.ts +22 -5
- package/src/client/client.ts +32 -6
- package/src/client/config.ts +18 -21
- package/src/client/mod.ts +1 -0
- package/src/client/queue.ts +8 -6
- package/src/common/inline-websocket-adapter.ts +8 -2
- package/src/common/router.ts +1 -4
- package/src/common/utils.ts +2 -5
- package/src/db/config.ts +10 -5
- package/src/db/drizzle/mod.ts +51 -41
- package/src/db/mod.ts +54 -29
- package/src/db/shared.ts +42 -8
- package/src/driver-helpers/mod.ts +2 -1
- package/src/driver-helpers/sqlite-pool.ts +42 -0
- package/src/driver-helpers/utils.ts +0 -20
- package/src/driver-test-suite/mod.ts +11 -1
- package/src/driver-test-suite/tests/access-control.ts +19 -12
- package/src/driver-test-suite/tests/action-features.ts +20 -8
- package/src/driver-test-suite/tests/actor-conn.ts +94 -8
- package/src/driver-test-suite/tests/actor-db-kv-stats.ts +282 -0
- package/src/driver-test-suite/tests/actor-db-raw.ts +6 -2
- package/src/driver-test-suite/tests/actor-db.ts +101 -31
- package/src/driver-test-suite/tests/actor-inspector.ts +174 -32
- package/src/driver-test-suite/tests/actor-kv.ts +79 -33
- package/src/driver-test-suite/tests/actor-lifecycle.ts +4 -12
- package/src/driver-test-suite/tests/actor-queue.ts +125 -17
- package/src/driver-test-suite/tests/actor-run.ts +59 -55
- package/src/driver-test-suite/tests/actor-sandbox.ts +78 -0
- package/src/driver-test-suite/tests/actor-schedule.ts +1 -4
- package/src/driver-test-suite/tests/actor-sleep.ts +111 -0
- package/src/driver-test-suite/tests/actor-workflow.ts +387 -3
- package/src/driver-test-suite/tests/conn-error-serialization.ts +3 -1
- package/src/driver-test-suite/tests/raw-websocket.ts +5 -1
- package/src/drivers/default.ts +1 -3
- package/src/drivers/engine/actor-driver.ts +94 -21
- package/src/drivers/engine/config.ts +4 -12
- package/src/drivers/engine/mod.ts +1 -5
- package/src/drivers/file-system/actor.ts +43 -8
- package/src/drivers/file-system/global-state.ts +180 -64
- package/src/drivers/file-system/kv-limits.ts +1 -1
- package/src/drivers/file-system/sqlite-runtime.ts +13 -4
- package/src/engine-process/mod.ts +5 -1
- package/src/inspector/actor-inspector.ts +47 -21
- package/src/inspector/config.ts +1 -4
- package/src/inspector/mod.browser.ts +2 -2
- package/src/inspector/mod.ts +4 -1
- package/src/inspector/serve-ui.ts +0 -1
- package/src/inspector/workflow-history-json.ts +309 -0
- package/src/manager/gateway.ts +6 -2
- package/src/manager/router.ts +3 -3
- package/src/registry/config/index.ts +65 -12
- package/src/registry/config/runner.ts +19 -4
- package/src/registry/index.ts +42 -89
- package/src/sandbox/actor/db.ts +36 -0
- package/src/sandbox/actor/index.ts +476 -0
- package/src/sandbox/actor/session.ts +350 -0
- package/src/sandbox/actor.test.ts +36 -0
- package/src/sandbox/client.test.ts +484 -0
- package/src/sandbox/client.ts +707 -0
- package/src/sandbox/config.ts +151 -0
- package/src/sandbox/index.ts +41 -0
- package/src/sandbox/providers/computesdk.ts +1 -0
- package/src/sandbox/providers/daytona.ts +1 -0
- package/src/sandbox/providers/docker.ts +1 -0
- package/src/sandbox/providers/e2b.ts +1 -0
- package/src/sandbox/providers/local.ts +1 -0
- package/src/sandbox/providers/modal.ts +1 -0
- package/src/sandbox/providers/vercel.ts +1 -0
- package/src/sandbox/session-persist-driver.ts +180 -0
- package/src/sandbox/types.ts +138 -0
- package/src/serverless/configure.ts +5 -3
- package/src/serverless/router.test.ts +17 -9
- package/src/serverless/router.ts +20 -13
- package/src/test/mod.ts +3 -4
- package/src/utils/endpoint-parser.test.ts +6 -2
- package/src/utils/endpoint-parser.ts +6 -2
- package/src/utils/env-vars.ts +0 -2
- package/src/utils/node.ts +1 -1
- package/src/utils/serve.ts +10 -5
- package/src/utils.ts +6 -1
- package/src/workflow/constants.ts +1 -2
- package/src/workflow/context.ts +42 -9
- package/src/workflow/driver.ts +57 -23
- package/src/workflow/inspector.ts +7 -13
- package/src/workflow/mod.ts +91 -4
- package/dist/tsup/chunk-6LJAZ5R4.cjs +0 -96
- package/dist/tsup/chunk-6LJAZ5R4.cjs.map +0 -1
- package/dist/tsup/chunk-7HTNH26M.js.map +0 -1
- package/dist/tsup/chunk-7WF2QSIC.cjs.map +0 -1
- package/dist/tsup/chunk-D2SPAJVT.cjs +0 -645
- package/dist/tsup/chunk-D2SPAJVT.cjs.map +0 -1
- package/dist/tsup/chunk-EIATSBYZ.js.map +0 -1
- package/dist/tsup/chunk-HYPIHCDT.cjs.map +0 -1
- package/dist/tsup/chunk-IIJNPVPQ.cjs.map +0 -1
- package/dist/tsup/chunk-JPXO2H55.js.map +0 -1
- package/dist/tsup/chunk-KJSYAUOM.js.map +0 -1
- package/dist/tsup/chunk-L47L3ZWJ.cjs.map +0 -1
- package/dist/tsup/chunk-MIX2KB6U.js.map +0 -1
- package/dist/tsup/chunk-N4KRDJ56.js.map +0 -1
- package/dist/tsup/chunk-OAXJWGMU.cjs.map +0 -1
- package/dist/tsup/chunk-PB5AEMKQ.cjs.map +0 -1
- package/dist/tsup/chunk-R5OQUSLN.js +0 -645
- package/dist/tsup/chunk-R5OQUSLN.js.map +0 -1
- package/dist/tsup/chunk-SR3KQE7Q.cjs.map +0 -1
- package/dist/tsup/chunk-SRIM3GHD.js.map +0 -1
- package/dist/tsup/chunk-TADUYCHF.js.map +0 -1
- package/dist/tsup/chunk-TI5PXQGG.cjs.map +0 -1
- package/dist/tsup/chunk-U5SMSA27.cjs.map +0 -1
- package/dist/tsup/chunk-VKVNIQRQ.js.map +0 -1
- package/dist/tsup/chunk-WY2SHWXQ.js.map +0 -1
- package/dist/tsup/chunk-ZFY5J2EP.cjs.map +0 -1
- package/dist/tsup/chunk-ZPWOYQHN.js.map +0 -1
- package/src/db/sqlite-vfs.ts +0 -12
- /package/dist/tsup/{chunk-S662Y6ZU.js.map → chunk-EONWXYMN.js.map} +0 -0
- /package/dist/tsup/{chunk-2OK7S6QF.js.map → chunk-I5I6OALK.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-CGGGBIDP.cjs","../../src/manager/router.ts","../../src/inspector/serve-ui.ts","../../src/utils/node.ts","../../src/manager-api/actors.ts","../../src/manager-api/common.ts","../../src/registry/log.ts","../../src/utils/serve.ts","../../src/utils/router.ts","../../src/common/cors.ts","../../src/manager/gateway.ts","../../src/manager/log.ts","../../src/driver-helpers/utils.ts","../../src/driver-helpers/sqlite-pool.ts"],"names":["nodeFs","z","logger","invariant","c"],"mappings":"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","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/chunk-CGGGBIDP.cjs","sourcesContent":[null,"import { createRoute } from \"@hono/zod-openapi\";\nimport * as cbor from \"cbor-x\";\nimport type { Hono } from \"hono\";\nimport invariant from \"invariant\";\nimport { z } from \"zod/v4\";\nimport { Forbidden, RestrictedFeature } from \"@/actor/errors\";\nimport { deserializeActorKey, serializeActorKey } from \"@/actor/keys\";\nimport type { Encoding } from \"@/client/mod\";\nimport {\n\tHEADER_RIVET_TOKEN,\n\tWS_PROTOCOL_ACTOR,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n\tWS_TEST_PROTOCOL_PATH,\n} from \"@/common/actor-router-consts\";\nimport { handleHealthRequest, handleMetadataRequest } from \"@/common/router\";\nimport { deconstructError, noopNext, stringifyError } from \"@/common/utils\";\nimport { HEADER_ACTOR_ID } from \"@/driver-helpers/mod\";\nimport type {\n\tTestInlineDriverCallRequest,\n\tTestInlineDriverCallResponse,\n} from \"@/driver-test-suite/test-inline-client-driver\";\nimport { getInspectorDir } from \"@/inspector/serve-ui\";\nimport {\n\tActorsCreateRequestSchema,\n\ttype ActorsCreateResponse,\n\tActorsCreateResponseSchema,\n\tActorsGetOrCreateRequestSchema,\n\ttype ActorsGetOrCreateResponse,\n\tActorsGetOrCreateResponseSchema,\n\ttype ActorsKvGetResponse,\n\tActorsKvGetResponseSchema,\n\ttype ActorsListNamesResponse,\n\tActorsListNamesResponseSchema,\n\ttype ActorsListResponse,\n\tActorsListResponseSchema,\n\ttype Actor as ApiActor,\n} from \"@/manager-api/actors\";\nimport { buildActorNames, type RegistryConfig } from \"@/registry/config\";\nimport { loadRuntimeServeStatic } from \"@/utils/serve\";\nimport type { GetUpgradeWebSocket, Runtime } from \"@/utils\";\nimport { timingSafeEqual } from \"@/utils/crypto\";\nimport { isDev } from \"@/utils/env-vars\";\nimport {\n\tbuildOpenApiRequestBody,\n\tbuildOpenApiResponses,\n\tcreateRouter,\n} from \"@/utils/router\";\nimport type { ActorOutput, ManagerDriver } from \"./driver\";\nimport { actorGateway, createTestWebSocketProxy } from \"./gateway\";\nimport { logger } from \"./log\";\n\nexport function buildManagerRouter(\n\tconfig: RegistryConfig,\n\tmanagerDriver: ManagerDriver,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n\truntime: Runtime = \"node\",\n) {\n\treturn createRouter(config.managerBasePath, (router) => {\n\t\t// Actor gateway\n\t\trouter.use(\n\t\t\t\"*\",\n\t\t\tactorGateway.bind(\n\t\t\t\tundefined,\n\t\t\t\tconfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tgetUpgradeWebSocket,\n\t\t\t),\n\t\t);\n\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://rivet.dev\",\n\t\t\t);\n\t\t});\n\n\t\t// GET /actors\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"get\",\n\t\t\t\tpath: \"/actors\",\n\t\t\t\trequest: {\n\t\t\t\t\tquery: z.object({\n\t\t\t\t\t\tname: z.string().optional(),\n\t\t\t\t\t\tactor_ids: z.string().optional(),\n\t\t\t\t\t\tkey: z.string().optional(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(ActorsListResponseSchema),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tconst { name, actor_ids, key } = c.req.valid(\"query\");\n\n\t\t\t\tconst actorIdsParsed = actor_ids\n\t\t\t\t\t? actor_ids\n\t\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t\t.map((id) => id.trim())\n\t\t\t\t\t\t\t.filter((id) => id.length > 0)\n\t\t\t\t\t: undefined;\n\n\t\t\t\tconst actors: ActorOutput[] = [];\n\n\t\t\t\t// Validate: cannot provide both actor_ids and (name or key)\n\t\t\t\tif (actorIdsParsed && (name || key)) {\n\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: \"Cannot provide both actor_ids and (name + key). Use either actor_ids or (name + key).\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Validate: when key is provided, name must also be provided\n\t\t\t\tif (key && !name) {\n\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: \"Name is required when key is provided.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t400,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (actorIdsParsed) {\n\t\t\t\t\tif (actorIdsParsed.length > 32) {\n\t\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terror: `Too many actor IDs. Maximum is 32, got ${actorIdsParsed.length}.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t400,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (actorIdsParsed.length === 0) {\n\t\t\t\t\t\treturn c.json<ActorsListResponse>({\n\t\t\t\t\t\t\tactors: [],\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fetch actors by ID\n\t\t\t\t\tfor (const actorId of actorIdsParsed) {\n\t\t\t\t\t\tif (name) {\n\t\t\t\t\t\t\t// If name is provided, use it directly\n\t\t\t\t\t\t\tconst actorOutput = await managerDriver.getForId({\n\t\t\t\t\t\t\t\tc,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (actorOutput) {\n\t\t\t\t\t\t\t\tactors.push(actorOutput);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// If no name is provided, try all registered actor types\n\t\t\t\t\t\t\t// Actor IDs are globally unique, so we'll find it in one of them\n\t\t\t\t\t\t\tfor (const actorName of Object.keys(config.use)) {\n\t\t\t\t\t\t\t\tconst actorOutput =\n\t\t\t\t\t\t\t\t\tawait managerDriver.getForId({\n\t\t\t\t\t\t\t\t\t\tc,\n\t\t\t\t\t\t\t\t\t\tname: actorName,\n\t\t\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (actorOutput) {\n\t\t\t\t\t\t\t\t\tactors.push(actorOutput);\n\t\t\t\t\t\t\t\t\tbreak; // Found the actor, no need to check other names\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (key && name) {\n\t\t\t\t\tconst actorOutput = await managerDriver.getWithKey({\n\t\t\t\t\t\tc,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tkey: deserializeActorKey(key),\n\t\t\t\t\t});\n\t\t\t\t\tif (actorOutput) {\n\t\t\t\t\t\tactors.push(actorOutput);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!name) {\n\t\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terror: \"Name is required when not using actor_ids.\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t400,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// List all actors with the given name\n\t\t\t\t\tconst actorOutputs = await managerDriver.listActors({\n\t\t\t\t\t\tc,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tincludeDestroyed: false,\n\t\t\t\t\t});\n\t\t\t\t\tactors.push(...actorOutputs);\n\t\t\t\t}\n\n\t\t\t\treturn c.json<ActorsListResponse>({\n\t\t\t\t\tactors: actors.map((actor) => createApiActor(actor)),\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// GET /actors/names\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"get\",\n\t\t\t\tpath: \"/actors/names\",\n\t\t\t\trequest: {\n\t\t\t\t\tquery: z.object({\n\t\t\t\t\t\tnamespace: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(ActorsListNamesResponseSchema),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tconst names = buildActorNames(config);\n\t\t\t\treturn c.json<ActorsListNamesResponse>({\n\t\t\t\t\tnames,\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// PUT /actors\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"put\",\n\t\t\t\tpath: \"/actors\",\n\t\t\t\trequest: {\n\t\t\t\t\tbody: buildOpenApiRequestBody(\n\t\t\t\t\t\tActorsGetOrCreateRequestSchema,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(\n\t\t\t\t\tActorsGetOrCreateResponseSchema,\n\t\t\t\t),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tconst body = c.req.valid(\"json\");\n\n\t\t\t\t// Check if actor already exists\n\t\t\t\tconst existingActor = await managerDriver.getWithKey({\n\t\t\t\t\tc,\n\t\t\t\t\tname: body.name,\n\t\t\t\t\tkey: deserializeActorKey(body.key),\n\t\t\t\t});\n\n\t\t\t\tif (existingActor) {\n\t\t\t\t\treturn c.json<ActorsGetOrCreateResponse>({\n\t\t\t\t\t\tactor: createApiActor(existingActor),\n\t\t\t\t\t\tcreated: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Create new actor\n\t\t\t\tconst newActor = await managerDriver.getOrCreateWithKey({\n\t\t\t\t\tc,\n\t\t\t\t\tname: body.name,\n\t\t\t\t\tkey: deserializeActorKey(body.key),\n\t\t\t\t\tinput: body.input\n\t\t\t\t\t\t? cbor.decode(Buffer.from(body.input, \"base64\"))\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tregion: undefined, // Not provided in the request schema\n\t\t\t\t});\n\n\t\t\t\treturn c.json<ActorsGetOrCreateResponse>({\n\t\t\t\t\tactor: createApiActor(newActor),\n\t\t\t\t\tcreated: true,\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// POST /actors\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"post\",\n\t\t\t\tpath: \"/actors\",\n\t\t\t\trequest: {\n\t\t\t\t\tbody: buildOpenApiRequestBody(ActorsCreateRequestSchema),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(ActorsCreateResponseSchema),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tconst body = c.req.valid(\"json\");\n\n\t\t\t\t// Create actor using the driver\n\t\t\t\tconst actorOutput = await managerDriver.createActor({\n\t\t\t\t\tc,\n\t\t\t\t\tname: body.name,\n\t\t\t\t\tkey: deserializeActorKey(body.key || crypto.randomUUID()),\n\t\t\t\t\tinput: body.input\n\t\t\t\t\t\t? cbor.decode(Buffer.from(body.input, \"base64\"))\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tregion: undefined, // Not provided in the request schema\n\t\t\t\t});\n\n\t\t\t\t// Transform ActorOutput to match ActorSchema\n\t\t\t\tconst actor = createApiActor(actorOutput);\n\n\t\t\t\treturn c.json<ActorsCreateResponse>({ actor });\n\t\t\t});\n\t\t}\n\n\t\t// GET /actors/{actor_id}/kv/keys/{key}\n\t\t{\n\t\t\tconst route = createRoute({\n\t\t\t\tmethod: \"get\",\n\t\t\t\tpath: \"/actors/{actor_id}/kv/keys/{key}\",\n\t\t\t\trequest: {\n\t\t\t\t\tparams: z.object({\n\t\t\t\t\t\tactor_id: z.string(),\n\t\t\t\t\t\tkey: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tresponses: buildOpenApiResponses(ActorsKvGetResponseSchema),\n\t\t\t});\n\n\t\t\trouter.openapi(route, async (c) => {\n\t\t\t\tif (isDev() && !config.token) {\n\t\t\t\t\tlogger().warn({\n\t\t\t\t\t\tmsg: \"RIVET_TOKEN is not set, skipping KV store access checks in development mode. This endpoint will be disabled in production, unless you set the token.\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (!isDev()) {\n\t\t\t\t\tif (!config.token) {\n\t\t\t\t\t\tthrow new RestrictedFeature(\"KV store access\");\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\ttimingSafeEqual(\n\t\t\t\t\t\t\tconfig.token,\n\t\t\t\t\t\t\tc.req.header(HEADER_RIVET_TOKEN) || \"\",\n\t\t\t\t\t\t) === false\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Forbidden();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst { actor_id: actorId, key } = c.req.valid(\"param\");\n\n\t\t\t\tconst response = await managerDriver.kvGet(\n\t\t\t\t\tactorId,\n\t\t\t\t\tBuffer.from(key, \"base64\"),\n\t\t\t\t);\n\n\t\t\t\treturn c.json<ActorsKvGetResponse>({\n\t\t\t\t\tvalue: response\n\t\t\t\t\t\t? Buffer.from(response).toString(\"base64\")\n\t\t\t\t\t\t: null,\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// TODO:\n\t\t// // DELETE /actors/{actor_id}\n\t\t// {\n\t\t// \tconst route = createRoute({\n\t\t// \t\tmethod: \"delete\",\n\t\t// \t\tpath: \"/actors/{actor_id}\",\n\t\t// \t\trequest: {\n\t\t// \t\t\tparams: z.object({\n\t\t// \t\t\t\tactor_id: RivetIdSchema,\n\t\t// \t\t\t}),\n\t\t// \t\t},\n\t\t// \t\tresponses: buildOpenApiResponses(\n\t\t// \t\t\tActorsDeleteResponseSchema,\n\t\t// \t\t\tvalidateBody,\n\t\t// \t\t),\n\t\t// \t});\n\t\t//\n\t\t// \trouter.openapi(route, async (c) => {\n\t\t// \t\tconst { actor_id } = c.req.valid(\"param\");\n\t\t//\n\t\t// \t});\n\t\t// }\n\n\t\tif (config.test.enabled) {\n\t\t\t// Add HTTP endpoint to test the inline client\n\t\t\t//\n\t\t\t// We have to do this in a router since this needs to run in the same server as the RivetKit registry. Some test contexts to not run in the same server.\n\t\t\trouter.post(\".test/inline-driver/call\", async (c) => {\n\t\t\t\t// TODO: use openapi instead\n\t\t\t\tconst buffer = await c.req.arrayBuffer();\n\t\t\t\tconst { encoding, method, args }: TestInlineDriverCallRequest =\n\t\t\t\t\tcbor.decode(new Uint8Array(buffer));\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"received inline request\",\n\t\t\t\t\tencoding,\n\t\t\t\t\tmethod,\n\t\t\t\t\targs,\n\t\t\t\t});\n\n\t\t\t\t// Forward inline driver request\n\t\t\t\tlet response: TestInlineDriverCallResponse<unknown>;\n\t\t\t\ttry {\n\t\t\t\t\tconst output = await (\n\t\t\t\t\t\t(managerDriver as any)[method] as any\n\t\t\t\t\t)(...args);\n\t\t\t\t\tresponse = { ok: output };\n\t\t\t\t} catch (rawErr) {\n\t\t\t\t\tconst err = deconstructError(rawErr, logger(), {}, true);\n\t\t\t\t\tresponse = { err };\n\t\t\t\t}\n\n\t\t\t\t// TODO: Remove any\n\t\t\t\treturn c.body(cbor.encode(response) as any);\n\t\t\t});\n\n\t\t\trouter.get(\".test/inline-driver/connect-websocket/*\", async (c) => {\n\t\t\t\tconst upgradeWebSocket = getUpgradeWebSocket?.();\n\t\t\t\tinvariant(\n\t\t\t\t\tupgradeWebSocket,\n\t\t\t\t\t\"websockets not supported on this platform\",\n\t\t\t\t);\n\n\t\t\t\treturn upgradeWebSocket(async (c: any) => {\n\t\t\t\t\t// Extract information from sec-websocket-protocol header\n\t\t\t\t\tconst protocolHeader =\n\t\t\t\t\t\tc.req.header(\"sec-websocket-protocol\") || \"\";\n\t\t\t\t\tconst protocols = protocolHeader.split(/,\\s*/);\n\n\t\t\t\t\t// Parse protocols to extract connection info\n\t\t\t\t\tlet actorId = \"\";\n\t\t\t\t\tlet encoding: Encoding = \"bare\";\n\t\t\t\t\tlet path = \"\";\n\t\t\t\t\tlet params: unknown;\n\n\t\t\t\t\tfor (const protocol of protocols) {\n\t\t\t\t\t\tif (protocol.startsWith(WS_PROTOCOL_ACTOR)) {\n\t\t\t\t\t\t\tactorId = decodeURIComponent(\n\t\t\t\t\t\t\t\tprotocol.substring(WS_PROTOCOL_ACTOR.length),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (protocol.startsWith(WS_PROTOCOL_ENCODING)) {\n\t\t\t\t\t\t\tencoding = protocol.substring(\n\t\t\t\t\t\t\t\tWS_PROTOCOL_ENCODING.length,\n\t\t\t\t\t\t\t) as Encoding;\n\t\t\t\t\t\t} else if (protocol.startsWith(WS_TEST_PROTOCOL_PATH)) {\n\t\t\t\t\t\t\tpath = decodeURIComponent(\n\t\t\t\t\t\t\t\tprotocol.substring(\n\t\t\t\t\t\t\t\t\tWS_TEST_PROTOCOL_PATH.length,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tprotocol.startsWith(WS_PROTOCOL_CONN_PARAMS)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst paramsRaw = decodeURIComponent(\n\t\t\t\t\t\t\t\tprotocol.substring(\n\t\t\t\t\t\t\t\t\tWS_PROTOCOL_CONN_PARAMS.length,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tparams = JSON.parse(paramsRaw);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"received test inline driver websocket\",\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\tencodingKind: encoding,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Connect to the actor using the inline client driver - this returns a Promise<WebSocket>\n\t\t\t\t\tconst clientToProxyWsPromise = managerDriver.openWebSocket(\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tencoding,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn await createTestWebSocketProxy(\n\t\t\t\t\t\tclientToProxyWsPromise,\n\t\t\t\t\t);\n\t\t\t\t})(c, noopNext());\n\t\t\t});\n\n\t\t\trouter.all(\".test/inline-driver/send-request/*\", async (c) => {\n\t\t\t\t// Extract parameters from headers\n\t\t\t\tconst actorId = c.req.header(HEADER_ACTOR_ID);\n\n\t\t\t\tif (!actorId) {\n\t\t\t\t\treturn c.text(\"Missing required headers\", 400);\n\t\t\t\t}\n\n\t\t\t\t// Extract the path after /send-request/\n\t\t\t\tconst pathOnly =\n\t\t\t\t\tc.req.path.split(\"/.test/inline-driver/send-request/\")[1] ||\n\t\t\t\t\t\"\";\n\n\t\t\t\t// Include query string\n\t\t\t\tconst url = new URL(c.req.url);\n\t\t\t\tconst pathWithQuery = pathOnly + url.search;\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"received test inline driver raw http\",\n\t\t\t\t\tactorId,\n\t\t\t\t\tpath: pathWithQuery,\n\t\t\t\t\tmethod: c.req.method,\n\t\t\t\t});\n\n\t\t\t\ttry {\n\t\t\t\t\t// Forward the request using the inline client driver\n\t\t\t\t\tconst response = await managerDriver.sendRequest(\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tnew Request(`http://actor/${pathWithQuery}`, {\n\t\t\t\t\t\t\tmethod: c.req.method,\n\t\t\t\t\t\t\theaders: c.req.raw.headers,\n\t\t\t\t\t\t\tbody: c.req.raw.body,\n\t\t\t\t\t\t\tduplex: \"half\",\n\t\t\t\t\t\t} as RequestInit),\n\t\t\t\t\t);\n\n\t\t\t\t\t// Return the response directly\n\t\t\t\t\treturn response;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error in test inline raw http\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\n\t\t\t\t\t// Return error response\n\t\t\t\t\tconst err = deconstructError(error, logger(), {}, true);\n\t\t\t\t\treturn c.json(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\t\tcode: err.code,\n\t\t\t\t\t\t\t\tmessage: err.message,\n\t\t\t\t\t\t\t\tmetadata: err.metadata,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\terr.statusCode,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Test endpoint to force disconnect a connection non-cleanly\n\t\t\trouter.post(\"/.test/force-disconnect\", async (c) => {\n\t\t\t\tconst actorId = c.req.query(\"actor\");\n\t\t\t\tconst connId = c.req.query(\"conn\");\n\n\t\t\t\tif (!actorId || !connId) {\n\t\t\t\t\treturn c.text(\n\t\t\t\t\t\t\"Missing actor or conn query parameters\",\n\t\t\t\t\t\t400,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"forcing unclean disconnect\",\n\t\t\t\t\tactorId,\n\t\t\t\t\tconnId,\n\t\t\t\t});\n\n\t\t\t\ttry {\n\t\t\t\t\t// Send a special request to the actor to force disconnect the connection\n\t\t\t\t\tconst response = await managerDriver.sendRequest(\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tnew Request(\n\t\t\t\t\t\t\t`http://actor/.test/force-disconnect?conn=${connId}`,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tconst text = await response.text();\n\t\t\t\t\t\treturn c.text(\n\t\t\t\t\t\t\t`Failed to force disconnect: ${text}`,\n\t\t\t\t\t\t\tresponse.status as any,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn c.json({ success: true });\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"error forcing disconnect\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t\treturn c.text(`Error: ${error}`, 500);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (config.inspector.enabled) {\n\t\t\tlet inspectorRoot: string | undefined;\n\n\t\t\trouter.get(\"/ui/*\", async (c, next) => {\n\t\t\t\tlet serveStatic;\n\t\t\t\ttry {\n\t\t\t\t\tserveStatic = await loadRuntimeServeStatic(runtime);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"failed to load inspector static file handler\",\n\t\t\t\t\t\terror: stringifyError(error),\n\t\t\t\t\t});\n\t\t\t\t\treturn c.text(\n\t\t\t\t\t\t`Failed to load static file handler for runtime '${runtime}'.`,\n\t\t\t\t\t\t500,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!inspectorRoot) {\n\t\t\t\t\tinspectorRoot = await getInspectorDir();\n\t\t\t\t}\n\t\t\t\tconst root = inspectorRoot;\n\t\t\t\tconst rewrite = (path: string) =>\n\t\t\t\t\tpath.replace(/^\\/ui/, \"\") || \"/\";\n\n\t\t\t\treturn serveStatic({\n\t\t\t\t\troot,\n\t\t\t\t\trewriteRequestPath: rewrite,\n\t\t\t\t\tonNotFound: async (_path, c) => {\n\t\t\t\t\t\tawait serveStatic({ root, path: \"index.html\" })(\n\t\t\t\t\t\t\tc,\n\t\t\t\t\t\t\tnext,\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t})(c, next);\n\t\t\t});\n\n\t\t\trouter.get(\"/ui\", (c) => c.redirect(\"/ui/\"));\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{ normal: {} },\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\n\t\tmanagerDriver.modifyManagerRouter?.(config, router as unknown as Hono);\n\t});\n}\n\nfunction createApiActor(actor: ActorOutput): ApiActor {\n\treturn {\n\t\tactor_id: actor.actorId,\n\t\tname: actor.name,\n\t\tkey: serializeActorKey(actor.key),\n\t\tnamespace_id: \"default\", // Assert default namespace\n\t\trunner_name_selector: \"default\",\n\t\tcreate_ts: actor.createTs ?? Date.now(),\n\t\tconnectable_ts: actor.connectableTs ?? null,\n\t\tdestroy_ts: actor.destroyTs ?? null,\n\t\tsleep_ts: actor.sleepTs ?? null,\n\t\tstart_ts: actor.startTs ?? null,\n\t};\n}\n","import { extract } from \"tar\";\nimport { getNodeFs, getNodeOs, getNodePath, getNodeUrl } from \"@/utils/node\";\n\nlet extractedDir: string | undefined;\nlet extractionPromise: Promise<string> | undefined;\n\nexport async function getInspectorDir(): Promise<string> {\n\tif (extractedDir !== undefined) return extractedDir;\n\tif (extractionPromise !== undefined) return extractionPromise;\n\n\tconst nodeFs = getNodeFs();\n\tconst os = getNodeOs();\n\tconst url = getNodeUrl();\n\tconst path = getNodePath();\n\n\textractionPromise = (async () => {\n\t\tconst tarball = path.join(\n\t\t\tpath.dirname(url.fileURLToPath(import.meta.url)),\n\t\t\t\"../../dist/inspector.tar.gz\",\n\t\t);\n\n\t\ttry {\n\t\t\tawait nodeFs.access(tarball);\n\t\t} catch {\n\t\t\tthrow new Error(\n\t\t\t\t`Inspector tarball not found at ${tarball}. Run 'pnpm build:pack-inspector' first.`,\n\t\t\t);\n\t\t}\n\n\t\tconst dest = path.join(os.tmpdir(), \"rivetkit-inspector\");\n\t\tawait nodeFs.mkdir(dest, { recursive: true });\n\t\tawait extract({ file: tarball, cwd: dest });\n\n\t\textractedDir = dest;\n\t\treturn dest;\n\t})();\n\n\treturn extractionPromise;\n}\n","import { createRequire } from \"node:module\";\n\n// Global variables for Node.js modules.\n//\n// We use synchronous require() instead of async import() for Node.js module loading because:\n// 1. These modules are only needed in Node.js environments (not browser/edge)\n// 2. registry.start() cannot be async and needs immediate access to Node modules\n// 3. The setup process must be synchronous to avoid breaking the API\n//\n// Biome only allows imports of node modules in this file in order to ensure\n// we're forcing the use of dynamic imports.\nlet nodeCrypto: typeof import(\"node:crypto\") | undefined;\nlet nodeFsSync: typeof import(\"node:fs\") | undefined;\nlet nodeFs: typeof import(\"node:fs/promises\") | undefined;\nlet nodePath: typeof import(\"node:path\") | undefined;\nlet nodeOs: typeof import(\"node:os\") | undefined;\nlet nodeChildProcess: typeof import(\"node:child_process\") | undefined;\nlet nodeStream: typeof import(\"node:stream/promises\") | undefined;\nlet nodeUrl: typeof import(\"node:url\") | undefined;\n\nlet hasImportedDependencies = false;\n\n// Helper to get a require function that works in both CommonJS and ESM.\n// We use require() instead of await import() because registry.start() cannot\n// be async and needs immediate access to Node.js modules during setup.\nexport function getRequireFn() {\n\t// TODO: This causes issues in tsup\n\t// CommonJS context - use global require\n\t// if (typeof require !== \"undefined\") {\n\t// \tconsole.log(\"existing require\");\n\t// \treturn require;\n\t// }\n\n\t// ESM context - use createRequire with import.meta.url\n\treturn createRequire(import.meta.url);\n}\n\n/**\n * Dynamically imports all required Node.js dependencies. We do this early in a\n * single function call in order to surface errors early.\n *\n * This function is idempotent and will only import once.\n *\n * @throws Error if Node.js modules are not available (e.g., in browser/edge environments)\n */\nexport function importNodeDependencies(): void {\n\t// Check if already loaded\n\tif (hasImportedDependencies) return;\n\n\ttry {\n\t\t// Get a require function that works in both CommonJS and ESM\n\t\tconst requireFn = getRequireFn();\n\n\t\t// Use requireFn with webpack ignore comment to prevent bundling\n\t\tnodeCrypto = requireFn(/* webpackIgnore: true */ \"node:crypto\");\n\t\tnodeFsSync = requireFn(/* webpackIgnore: true */ \"node:fs\");\n\t\tnodeFs = requireFn(/* webpackIgnore: true */ \"node:fs/promises\");\n\t\tnodePath = requireFn(/* webpackIgnore: true */ \"node:path\");\n\t\tnodeOs = requireFn(/* webpackIgnore: true */ \"node:os\");\n\t\tnodeChildProcess = requireFn(\n\t\t\t/* webpackIgnore: true */ \"node:child_process\",\n\t\t);\n\t\tnodeStream = requireFn(\n\t\t\t/* webpackIgnore: true */ \"node:stream/promises\",\n\t\t);\n\t\tnodeUrl = requireFn(/* webpackIgnore: true */ \"node:url\");\n\t\thasImportedDependencies = true;\n\t} catch (err) {\n\t\tconsole.warn(\n\t\t\t\"Node.js modules not available, file system driver will not work\",\n\t\t\terr,\n\t\t);\n\t\tthrow err;\n\t}\n}\n\n/**\n * Gets the Node.js crypto module.\n * @throws Error if crypto module is not loaded\n */\nexport function getNodeCrypto(): typeof import(\"node:crypto\") {\n\tif (!nodeCrypto) {\n\t\tthrow new Error(\n\t\t\t\"Node crypto module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeCrypto;\n}\n\n/**\n * Gets the Node.js fs module.\n * @throws Error if fs module is not loaded\n */\nexport function getNodeFsSync(): typeof import(\"node:fs\") {\n\tif (!nodeFsSync) {\n\t\tthrow new Error(\n\t\t\t\"Node fs module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeFsSync;\n}\n\n/**\n * Gets the Node.js fs/promises module.\n * @throws Error if fs/promises module is not loaded\n */\nexport function getNodeFs(): typeof import(\"node:fs/promises\") {\n\tif (!nodeFs) {\n\t\tthrow new Error(\n\t\t\t\"Node fs/promises module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeFs;\n}\n\n/**\n * Gets the Node.js path module.\n * @throws Error if path module is not loaded\n */\nexport function getNodePath(): typeof import(\"node:path\") {\n\tif (!nodePath) {\n\t\tthrow new Error(\n\t\t\t\"Node path module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodePath;\n}\n\n/**\n * Gets the Node.js os module.\n * @throws Error if os module is not loaded\n */\nexport function getNodeOs(): typeof import(\"node:os\") {\n\tif (!nodeOs) {\n\t\tthrow new Error(\n\t\t\t\"Node os module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeOs;\n}\n\n/**\n * Gets the Node.js child_process module.\n * @throws Error if child_process module is not loaded\n */\nexport function getNodeChildProcess(): typeof import(\"node:child_process\") {\n\tif (!nodeChildProcess) {\n\t\tthrow new Error(\n\t\t\t\"Node child_process module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeChildProcess;\n}\n\n/**\n * Gets the Node.js stream/promises module.\n * @throws Error if stream/promises module is not loaded\n */\nexport function getNodeStream(): typeof import(\"node:stream/promises\") {\n\tif (!nodeStream) {\n\t\tthrow new Error(\n\t\t\t\"Node stream/promises module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeStream;\n}\n\n/**\n * Gets the Node.js url module lazily.\n */\nexport function getNodeUrl(): typeof import(\"node:url\") {\n\tif (!nodeUrl) {\n\t\tthrow new Error(\n\t\t\t\"Node url module not loaded. Ensure importNodeDependencies() has been called.\",\n\t\t);\n\t}\n\treturn nodeUrl;\n}\n","import { z } from \"zod/v4\";\nimport { RivetIdSchema } from \"./common\";\n\nexport const ActorSchema = z.object({\n\tactor_id: RivetIdSchema,\n\tname: z.string(),\n\tkey: z.string(),\n\tnamespace_id: RivetIdSchema,\n\trunner_name_selector: z.string(),\n\tcreate_ts: z.number(),\n\tconnectable_ts: z.number().nullable().optional(),\n\tdestroy_ts: z.number().nullable().optional(),\n\tsleep_ts: z.number().nullable().optional(),\n\tstart_ts: z.number().nullable().optional(),\n\terror: z.unknown().nullable().optional(),\n});\nexport type Actor = z.infer<typeof ActorSchema>;\n\nexport const ActorNameSchema = z.object({\n\tmetadata: z.record(z.string(), z.unknown()),\n});\nexport type ActorName = z.infer<typeof ActorNameSchema>;\n\n// MARK: GET /actors\nexport const ActorsListResponseSchema = z.object({\n\tactors: z.array(ActorSchema),\n});\nexport type ActorsListResponse = z.infer<typeof ActorsListResponseSchema>;\n\n// MARK: POST /actors\nexport const ActorsCreateRequestSchema = z.object({\n\tdatacenter: z.string().optional(),\n\tname: z.string(),\n\trunner_name_selector: z.string(),\n\tcrash_policy: z.string(),\n\tkey: z.string().nullable().optional(),\n\tinput: z.string().nullable().optional(),\n});\nexport type ActorsCreateRequest = z.infer<typeof ActorsCreateRequestSchema>;\n\nexport const ActorsCreateResponseSchema = z.object({\n\tactor: ActorSchema,\n});\nexport type ActorsCreateResponse = z.infer<typeof ActorsCreateResponseSchema>;\n\n// MARK: PUT /actors\nexport const ActorsGetOrCreateRequestSchema = z.object({\n\tdatacenter: z.string().optional(),\n\tname: z.string(),\n\tkey: z.string(),\n\trunner_name_selector: z.string(),\n\tcrash_policy: z.string(),\n\tinput: z.string().nullable().optional(),\n});\nexport type ActorsGetOrCreateRequest = z.infer<\n\ttypeof ActorsGetOrCreateRequestSchema\n>;\n\nexport const ActorsGetOrCreateResponseSchema = z.object({\n\tactor: ActorSchema,\n\tcreated: z.boolean(),\n});\nexport type ActorsGetOrCreateResponse = z.infer<\n\ttypeof ActorsGetOrCreateResponseSchema\n>;\n\n// MARK: DELETE /actors/{}\nexport const ActorsDeleteResponseSchema = z.object({});\nexport type ActorsDeleteResponse = z.infer<typeof ActorsDeleteResponseSchema>;\n\n// MARK: GET /actors/names\nexport const ActorsListNamesResponseSchema = z.object({\n\tnames: z.record(z.string(), ActorNameSchema),\n});\nexport type ActorsListNamesResponse = z.infer<\n\ttypeof ActorsListNamesResponseSchema\n>;\n\n// MARK: GET /actors/{actor_id}/kv/keys/{key}\nexport const ActorsKvGetResponseSchema = z.object({\n\tvalue: z.string().nullable(),\n});\nexport type ActorsKvGetResponse = z.infer<typeof ActorsKvGetResponseSchema>;\n","import { z } from \"zod/v4\";\n\nexport const RivetIdSchema = z.string();\nexport type RivetId = z.infer<typeof RivetIdSchema>;\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"registry\");\n}\n","import type { Hono } from \"hono\";\nimport { detectRuntime, stringifyError, type Runtime } from \"../utils\";\nimport { RegistryConfig } from \"@/registry/config\";\nimport { logger } from \"@/registry/log\";\n\n// TODO: Go back to dynamic import for this\nimport getPort from \"get-port\";\n\nconst DEFAULT_PORT = 6420;\nexport type ServeStatic =\n\ttypeof import(\"@hono/node-server/serve-static\").serveStatic;\nconst serveStaticLoaderPromises: Partial<\n\tRecord<Runtime, Promise<ServeStatic>>\n> = {};\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\truntime: Runtime = detectRuntime(),\n): Promise<{ upgradeWebSocket: any; closeServer?: () => void }> {\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\nexport async function loadRuntimeServeStatic(\n\truntime: Runtime,\n): Promise<ServeStatic> {\n\tif (!serveStaticLoaderPromises[runtime]) {\n\t\tif (runtime === \"node\") {\n\t\t\tconst nodeServeStaticModule = \"@hono/node-server/serve-static\";\n\t\t\tserveStaticLoaderPromises[runtime] = import(\n\t\t\t\t/* webpackIgnore: true */\n\t\t\t\tnodeServeStaticModule\n\t\t\t).then((x) => x.serveStatic);\n\t\t} else if (runtime === \"bun\") {\n\t\t\tconst bunModule = \"hono/bun\";\n\t\t\tserveStaticLoaderPromises[runtime] = import(\n\t\t\t\t/* webpackIgnore: true */\n\t\t\t\tbunModule\n\t\t\t).then((x) => x.serveStatic as ServeStatic);\n\t\t} else if (runtime === \"deno\") {\n\t\t\tconst denoModule = \"hono/deno\";\n\t\t\tserveStaticLoaderPromises[runtime] = import(\n\t\t\t\t/* webpackIgnore: true */\n\t\t\t\tdenoModule\n\t\t\t).then((x) => x.serveStatic as ServeStatic);\n\t\t} else {\n\t\t\tthrow new Error(`unsupported runtime: ${runtime}`);\n\t\t}\n\t}\n\n\treturn await serveStaticLoaderPromises[runtime]!;\n}\n\nasync function serveNode(\n\tconfig: RegistryConfig,\n\tmanagerPort: number,\n\tapp: Hono<any>,\n): Promise<{ upgradeWebSocket: any; closeServer: () => void }> {\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\tconst closeServer = () => {\n\t\tserver.close();\n\t};\n\n\treturn { upgradeWebSocket, closeServer };\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 { OpenAPIHono } from \"@hono/zod-openapi\";\nimport type { Hono } from \"hono\";\nimport { createMiddleware } from \"hono/factory\";\nimport { cors } from \"@/common/cors\";\nimport {\n\thandleRouteError,\n\thandleRouteNotFound,\n\tloggerMiddleware,\n} from \"@/common/router\";\nimport { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"router\");\n}\n\nexport function createRouter(\n\tbasePath: string,\n\tbuilder: (app: OpenAPIHono) => void,\n): {\n\trouter: Hono;\n\topenapi: OpenAPIHono;\n} {\n\tconst router = new OpenAPIHono({ strict: false }).basePath(basePath);\n\n\trouter.use(\"*\", loggerMiddleware(logger()), cors());\n\n\t// HACK: Add Sec-WebSocket-Protocol header to fix KIT-339\n\t//\n\t// Some Deno WebSocket providers do not auto-set the protocol, which\n\t// will cause some WebSocket clients to fail\n\trouter.use(\n\t\t\"*\",\n\t\tcreateMiddleware(async (c, next) => {\n\t\t\tconst upgrade = c.req.header(\"upgrade\");\n\t\t\tconst isWebSocket = upgrade?.toLowerCase() === \"websocket\";\n\t\t\tconst isGet = c.req.method === \"GET\";\n\n\t\t\tif (isGet && isWebSocket) {\n\t\t\t\tc.header(\"Sec-WebSocket-Protocol\", \"rivet\");\n\t\t\t}\n\n\t\t\tawait next();\n\t\t}),\n\t);\n\n\tbuilder(router);\n\n\t// Error handling\n\trouter.notFound(handleRouteNotFound);\n\trouter.onError(handleRouteError);\n\n\treturn { router: router as Hono, openapi: router };\n}\n\nexport function buildOpenApiResponses<T>(schema: T) {\n\treturn {\n\t\t200: {\n\t\t\tdescription: \"Success\",\n\t\t\tcontent: {\n\t\t\t\t\"application/json\": {\n\t\t\t\t\tschema,\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t400: {\n\t\t\tdescription: \"User error\",\n\t\t},\n\t\t500: {\n\t\t\tdescription: \"Internal error\",\n\t\t},\n\t};\n}\n\nexport function buildOpenApiRequestBody<T>(schema: T) {\n\treturn {\n\t\trequired: true,\n\t\tcontent: {\n\t\t\t\"application/json\": {\n\t\t\t\tschema,\n\t\t\t},\n\t\t},\n\t};\n}\n","import type { MiddlewareHandler } from \"hono\";\n\n/**\n * Simple CORS middleware that matches the gateway behavior.\n *\n * - Echoes back the Origin header from the request\n * - Echoes back the Access-Control-Request-Headers from preflight\n * - Supports credentials\n * - Allows common HTTP methods\n * - Caches preflight for 24 hours\n * - Adds Vary header to prevent cache poisoning\n */\nexport const cors = (): MiddlewareHandler => {\n\treturn async (c, next) => {\n\t\t// Extract origin from request\n\t\tconst origin = c.req.header(\"origin\") || \"*\";\n\n\t\t// Handle preflight OPTIONS request\n\t\tif (c.req.method === \"OPTIONS\") {\n\t\t\tconst requestHeaders =\n\t\t\t\tc.req.header(\"access-control-request-headers\") || \"*\";\n\n\t\t\tc.header(\"access-control-allow-origin\", origin);\n\t\t\tc.header(\"access-control-allow-credentials\", \"true\");\n\t\t\tc.header(\n\t\t\t\t\"access-control-allow-methods\",\n\t\t\t\t\"GET, POST, PUT, DELETE, OPTIONS, PATCH\",\n\t\t\t);\n\t\t\tc.header(\"access-control-allow-headers\", requestHeaders);\n\t\t\tc.header(\"access-control-expose-headers\", \"*\");\n\t\t\tc.header(\"access-control-max-age\", \"86400\");\n\n\t\t\t// Add Vary header to prevent cache poisoning when echoing origin\n\t\t\tif (origin !== \"*\") {\n\t\t\t\tc.header(\"vary\", \"Origin\");\n\t\t\t}\n\n\t\t\t// Remove content headers from preflight response\n\t\t\tc.res.headers.delete(\"content-length\");\n\t\t\tc.res.headers.delete(\"content-type\");\n\n\t\t\treturn c.body(null, 204);\n\t\t}\n\n\t\tawait next();\n\n\t\t// Add CORS headers to actual request\n\t\tc.header(\"access-control-allow-origin\", origin);\n\t\tc.header(\"access-control-allow-credentials\", \"true\");\n\t\tc.header(\"access-control-expose-headers\", \"*\");\n\n\t\t// Add Vary header to prevent cache poisoning when echoing origin\n\t\tif (origin !== \"*\") {\n\t\t\tc.header(\"vary\", \"Origin\");\n\t\t}\n\t};\n};\n","import type { Context as HonoContext, Next } from \"hono\";\nimport type { WSContext } from \"hono/ws\";\nimport invariant from \"invariant\";\nimport { MissingActorHeader, WebSocketsNotEnabled } from \"@/actor/errors\";\nimport {\n\tparseWebSocketProtocols,\n\ttype UpgradeWebSocketArgs,\n} from \"@/actor/router-websocket-endpoints\";\nimport {\n\tHEADER_RIVET_ACTOR,\n\tHEADER_RIVET_TARGET,\n\tWS_PROTOCOL_ACTOR,\n\tWS_PROTOCOL_CONN_PARAMS,\n\tWS_PROTOCOL_ENCODING,\n\tWS_PROTOCOL_TARGET,\n} from \"@/common/actor-router-consts\";\nimport type { UniversalWebSocket } from \"@/mod\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport { type GetUpgradeWebSocket, promiseWithResolvers } from \"@/utils\";\nimport type { ManagerDriver } from \"./driver\";\nimport { logger } from \"./log\";\n\ninterface ActorPathInfo {\n\tactorId: string;\n\ttoken?: string;\n\tremainingPath: string;\n}\n\n/**\n * Handle path-based WebSocket routing\n */\nasync function handleWebSocketGatewayPathBased(\n\tconfig: RegistryConfig,\n\tmanagerDriver: ManagerDriver,\n\tc: HonoContext,\n\tactorPathInfo: ActorPathInfo,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n): Promise<Response> {\n\tconst upgradeWebSocket = getUpgradeWebSocket?.();\n\tif (!upgradeWebSocket) {\n\t\tthrow new WebSocketsNotEnabled();\n\t}\n\n\t// NOTE: Token validation implemented in EE\n\n\t// Parse additional configuration from Sec-WebSocket-Protocol header\n\tconst { encoding, connParams } = parseWebSocketProtocols(\n\t\tc.req.header(\"sec-websocket-protocol\"),\n\t);\n\n\tlogger().debug({\n\t\tmsg: \"proxying websocket to actor via path-based routing\",\n\t\tactorId: actorPathInfo.actorId,\n\t\tpath: actorPathInfo.remainingPath,\n\t\tencoding,\n\t});\n\n\treturn await managerDriver.proxyWebSocket(\n\t\tc,\n\t\tactorPathInfo.remainingPath,\n\t\tactorPathInfo.actorId,\n\t\tencoding as any, // Will be validated by driver\n\t\tconnParams,\n\t);\n}\n\n/**\n * Handle path-based HTTP routing\n */\nasync function handleHttpGatewayPathBased(\n\tmanagerDriver: ManagerDriver,\n\tc: HonoContext,\n\tactorPathInfo: ActorPathInfo,\n): Promise<Response> {\n\t// NOTE: Token validation implemented in EE\n\n\tlogger().debug({\n\t\tmsg: \"proxying request to actor via path-based routing\",\n\t\tactorId: actorPathInfo.actorId,\n\t\tpath: actorPathInfo.remainingPath,\n\t\tmethod: c.req.method,\n\t});\n\n\t// Preserve all headers\n\tconst proxyHeaders = new Headers(c.req.raw.headers);\n\n\t// Build the proxy request with the actor URL format\n\tconst proxyUrl = new URL(`http://actor${actorPathInfo.remainingPath}`);\n\n\tconst proxyRequest = new Request(proxyUrl, {\n\t\tmethod: c.req.raw.method,\n\t\theaders: proxyHeaders,\n\t\tbody: c.req.raw.body,\n\t\tsignal: c.req.raw.signal,\n\t\tduplex: \"half\",\n\t} as RequestInit);\n\n\treturn await managerDriver.proxyRequest(\n\t\tc,\n\t\tproxyRequest,\n\t\tactorPathInfo.actorId,\n\t);\n}\n\n/**\n * Provides an endpoint to connect to individual actors.\n *\n * Routes requests using either path-based routing or header-based routing:\n *\n * Path-based routing (checked first):\n * - /gateway/{actor_id}/{...path}\n * - /gateway/{actor_id}@{token}/{...path}\n *\n * Header-based routing (fallback):\n * - WebSocket requests: Uses sec-websocket-protocol for routing (target.actor, actor.{id})\n * - HTTP requests: Uses x-rivet-target and x-rivet-actor headers for routing\n */\nexport async function actorGateway(\n\tconfig: RegistryConfig,\n\tmanagerDriver: ManagerDriver,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n\tc: HonoContext,\n\tnext: Next,\n) {\n\t// Skip test routes - let them be handled by their specific handlers\n\tif (c.req.path.startsWith(\"/.test/\")) {\n\t\treturn next();\n\t}\n\n\t// Strip basePath from the request path\n\tlet strippedPath = c.req.path;\n\tif (\n\t\tconfig.managerBasePath &&\n\t\tstrippedPath.startsWith(config.managerBasePath)\n\t) {\n\t\tstrippedPath = strippedPath.slice(config.managerBasePath.length);\n\t\t// Ensure the path starts with /\n\t\tif (!strippedPath.startsWith(\"/\")) {\n\t\t\tstrippedPath = \"/\" + strippedPath;\n\t\t}\n\t}\n\n\t// Include query string if present (needed for parseActorPath to preserve query params)\n\tconst pathWithQuery = c.req.url.includes(\"?\")\n\t\t? strippedPath + c.req.url.substring(c.req.url.indexOf(\"?\"))\n\t\t: strippedPath;\n\n\t// First, check if this is an actor path-based route\n\tconst actorPathInfo = parseActorPath(pathWithQuery);\n\tif (actorPathInfo) {\n\t\tlogger().debug({\n\t\t\tmsg: \"routing using path-based actor routing\",\n\t\t\tactorPathInfo,\n\t\t});\n\n\t\t// Check if this is a WebSocket upgrade request\n\t\tconst isWebSocket = c.req.header(\"upgrade\") === \"websocket\";\n\n\t\tif (isWebSocket) {\n\t\t\treturn await handleWebSocketGatewayPathBased(\n\t\t\t\tconfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tc,\n\t\t\t\tactorPathInfo,\n\t\t\t\tgetUpgradeWebSocket,\n\t\t\t);\n\t\t}\n\n\t\t// Handle regular HTTP requests\n\t\treturn await handleHttpGatewayPathBased(\n\t\t\tmanagerDriver,\n\t\t\tc,\n\t\t\tactorPathInfo,\n\t\t);\n\t}\n\n\t// Fallback to header-based routing\n\t// Check if this is a WebSocket upgrade request\n\tif (c.req.header(\"upgrade\") === \"websocket\") {\n\t\treturn await handleWebSocketGateway(\n\t\t\tconfig,\n\t\t\tmanagerDriver,\n\t\t\tgetUpgradeWebSocket,\n\t\t\tc,\n\t\t\tstrippedPath,\n\t\t);\n\t}\n\n\t// Handle regular HTTP requests\n\treturn await handleHttpGateway(managerDriver, c, next, strippedPath);\n}\n\n/**\n * Handle WebSocket requests using sec-websocket-protocol for routing\n */\nasync function handleWebSocketGateway(\n\tconfig: RegistryConfig,\n\tmanagerDriver: ManagerDriver,\n\tgetUpgradeWebSocket: GetUpgradeWebSocket | undefined,\n\tc: HonoContext,\n\tstrippedPath: string,\n) {\n\tconst upgradeWebSocket = getUpgradeWebSocket?.();\n\tif (!upgradeWebSocket) {\n\t\tthrow new WebSocketsNotEnabled();\n\t}\n\n\tlet target: string | undefined;\n\tlet actorId: string | undefined;\n\n\t// Parse configuration from Sec-WebSocket-Protocol header\n\tconst { encoding, connParams } = parseWebSocketProtocols(\n\t\tc.req.header(\"sec-websocket-protocol\"),\n\t);\n\n\tif (target !== \"actor\") {\n\t\treturn c.text(\"WebSocket upgrade requires target.actor protocol\", 400);\n\t}\n\n\tif (!actorId) {\n\t\tthrow new MissingActorHeader();\n\t}\n\n\tlogger().debug({\n\t\tmsg: \"proxying websocket to actor\",\n\t\tactorId,\n\t\tpath: strippedPath,\n\t\tencoding,\n\t});\n\n\t// Include query string if present\n\tconst pathWithQuery = c.req.url.includes(\"?\")\n\t\t? strippedPath + c.req.url.substring(c.req.url.indexOf(\"?\"))\n\t\t: strippedPath;\n\n\treturn await managerDriver.proxyWebSocket(\n\t\tc,\n\t\tpathWithQuery,\n\t\tactorId,\n\t\tencoding,\n\t\tconnParams,\n\t);\n}\n\n/**\n * Handle HTTP requests using x-rivet headers for routing\n */\nasync function handleHttpGateway(\n\tmanagerDriver: ManagerDriver,\n\tc: HonoContext,\n\tnext: Next,\n\tstrippedPath: string,\n) {\n\tconst target = c.req.header(HEADER_RIVET_TARGET);\n\tconst actorId = c.req.header(HEADER_RIVET_ACTOR);\n\n\tif (target !== \"actor\") {\n\t\treturn next();\n\t}\n\n\tif (!actorId) {\n\t\tthrow new MissingActorHeader();\n\t}\n\n\tlogger().debug({\n\t\tmsg: \"proxying request to actor\",\n\t\tactorId,\n\t\tpath: strippedPath,\n\t\tmethod: c.req.method,\n\t});\n\n\t// Preserve all headers except the routing headers\n\tconst proxyHeaders = new Headers(c.req.raw.headers);\n\tproxyHeaders.delete(HEADER_RIVET_TARGET);\n\tproxyHeaders.delete(HEADER_RIVET_ACTOR);\n\n\t// Build the proxy request with the actor URL format\n\tconst url = new URL(c.req.url);\n\tconst proxyUrl = new URL(`http://actor${strippedPath}${url.search}`);\n\n\tconst proxyRequest = new Request(proxyUrl, {\n\t\tmethod: c.req.raw.method,\n\t\theaders: proxyHeaders,\n\t\tbody: c.req.raw.body,\n\t\tsignal: c.req.raw.signal,\n\t\tduplex: \"half\",\n\t} as RequestInit);\n\n\treturn await managerDriver.proxyRequest(c, proxyRequest, actorId);\n}\n\n/**\n * Parse actor routing information from path\n * Matches patterns:\n * - /gateway/{actor_id}/{...path}\n * - /gateway/{actor_id}@{token}/{...path}\n */\nexport function parseActorPath(path: string): ActorPathInfo | null {\n\t// Find query string position (everything from ? onwards, but before fragment)\n\tconst queryPos = path.indexOf(\"?\");\n\tconst fragmentPos = path.indexOf(\"#\");\n\n\t// Extract query string (excluding fragment)\n\tlet queryString = \"\";\n\tif (queryPos !== -1) {\n\t\tif (fragmentPos !== -1 && queryPos < fragmentPos) {\n\t\t\tqueryString = path.slice(queryPos, fragmentPos);\n\t\t} else {\n\t\t\tqueryString = path.slice(queryPos);\n\t\t}\n\t}\n\n\t// Extract base path (before query and fragment)\n\tlet basePath = path;\n\tif (queryPos !== -1) {\n\t\tbasePath = path.slice(0, queryPos);\n\t} else if (fragmentPos !== -1) {\n\t\tbasePath = path.slice(0, fragmentPos);\n\t}\n\n\t// Check for double slashes (invalid path)\n\tif (basePath.includes(\"//\")) {\n\t\treturn null;\n\t}\n\n\t// Split the path into segments\n\tconst segments = basePath.split(\"/\").filter((s) => s.length > 0);\n\n\t// Check minimum required segments: gateway, {actor_id}\n\tif (segments.length < 2) {\n\t\treturn null;\n\t}\n\n\t// Verify the first segment is \"gateway\"\n\tif (segments[0] !== \"gateway\") {\n\t\treturn null;\n\t}\n\n\t// Extract actor_id segment (may contain @token)\n\tconst actorSegment = segments[1];\n\n\t// Check for empty actor segment\n\tif (actorSegment.length === 0) {\n\t\treturn null;\n\t}\n\n\t// Parse actor_id and optional token from the segment\n\tlet actorId: string;\n\tlet token: string | undefined;\n\n\tconst atPos = actorSegment.indexOf(\"@\");\n\tif (atPos !== -1) {\n\t\t// Pattern: /gateway/{actor_id}@{token}/{...path}\n\t\tconst rawActorId = actorSegment.slice(0, atPos);\n\t\tconst rawToken = actorSegment.slice(atPos + 1);\n\n\t\t// Check for empty actor_id or token\n\t\tif (rawActorId.length === 0 || rawToken.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// URL-decode both actor_id and token\n\t\ttry {\n\t\t\tactorId = decodeURIComponent(rawActorId);\n\t\t\ttoken = decodeURIComponent(rawToken);\n\t\t} catch (e) {\n\t\t\t// Invalid URL encoding\n\t\t\treturn null;\n\t\t}\n\t} else {\n\t\t// Pattern: /gateway/{actor_id}/{...path}\n\t\t// URL-decode actor_id\n\t\ttry {\n\t\t\tactorId = decodeURIComponent(actorSegment);\n\t\t} catch (e) {\n\t\t\t// Invalid URL encoding\n\t\t\treturn null;\n\t\t}\n\t\ttoken = undefined;\n\t}\n\n\t// Calculate remaining path\n\t// The remaining path starts after /gateway/{actor_id[@token]}/\n\tlet prefixLen = 0;\n\tfor (let i = 0; i < 2; i++) {\n\t\tprefixLen += 1 + segments[i].length; // +1 for the slash\n\t}\n\n\t// Extract the remaining path preserving trailing slashes\n\tlet remainingBase: string;\n\tif (prefixLen < basePath.length) {\n\t\tremainingBase = basePath.slice(prefixLen);\n\t} else {\n\t\tremainingBase = \"/\";\n\t}\n\n\t// Ensure remaining path starts with /\n\tlet remainingPath: string;\n\tif (remainingBase.length === 0 || !remainingBase.startsWith(\"/\")) {\n\t\tremainingPath = `/${remainingBase}${queryString}`;\n\t} else {\n\t\tremainingPath = `${remainingBase}${queryString}`;\n\t}\n\n\treturn {\n\t\tactorId,\n\t\ttoken,\n\t\tremainingPath,\n\t};\n}\n\n/**\n * Creates a WebSocket proxy for test endpoints that forwards messages between server and client WebSockets\n *\n * clientToProxyWs = the websocket from the client -> the proxy\n * proxyToActorWs = the websocket from the proxy -> the actor\n */\nexport async function createTestWebSocketProxy(\n\tproxyToActorWsPromise: Promise<UniversalWebSocket>,\n): Promise<UpgradeWebSocketArgs> {\n\t// Store a reference to the resolved WebSocket\n\tlet proxyToActorWs: UniversalWebSocket | null = null;\n\tconst {\n\t\tpromise: clientToProxyWsPromise,\n\t\tresolve: clientToProxyWsResolve,\n\t\treject: clientToProxyWsReject,\n\t} = promiseWithResolvers<WSContext>((reason) =>\n\t\tlogger().warn({\n\t\t\tmsg: \"unhandled client websocket promise rejection\",\n\t\t\treason,\n\t\t}),\n\t);\n\ttry {\n\t\t// Resolve the client WebSocket promise\n\t\tlogger().debug({ msg: \"awaiting client websocket promise\" });\n\t\tproxyToActorWs = await proxyToActorWsPromise;\n\t\tlogger().debug({\n\t\t\tmsg: \"client websocket promise resolved\",\n\t\t\tconstructor: proxyToActorWs?.constructor.name,\n\t\t});\n\n\t\t// Wait for ws to open\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tinvariant(proxyToActorWs, \"missing proxyToActorWs\");\n\n\t\t\tconst onOpen = () => {\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: \"test websocket connection to actor opened\",\n\t\t\t\t});\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tconst onError = (error: any) => {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"test websocket connection failed\",\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t\treject(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t`Failed to open WebSocket: ${error.message || error}`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tclientToProxyWsReject();\n\t\t\t};\n\n\t\t\tproxyToActorWs.addEventListener(\"open\", onOpen);\n\n\t\t\tproxyToActorWs.addEventListener(\"error\", onError);\n\n\t\t\tproxyToActorWs.addEventListener(\n\t\t\t\t\"message\",\n\t\t\t\tasync (clientEvt: MessageEvent) => {\n\t\t\t\t\tconst clientToProxyWs = await clientToProxyWsPromise;\n\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: `test websocket connection message from client`,\n\t\t\t\t\t\tdataType: typeof clientEvt.data,\n\t\t\t\t\t\tisBlob: clientEvt.data instanceof Blob,\n\t\t\t\t\t\tisArrayBuffer: clientEvt.data instanceof ArrayBuffer,\n\t\t\t\t\t\tdataConstructor: clientEvt.data?.constructor?.name,\n\t\t\t\t\t\tdataStr:\n\t\t\t\t\t\t\ttypeof clientEvt.data === \"string\"\n\t\t\t\t\t\t\t\t? clientEvt.data.substring(0, 100)\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (clientToProxyWs.readyState === 1) {\n\t\t\t\t\t\t// OPEN\n\t\t\t\t\t\t// Handle Blob data\n\t\t\t\t\t\tif (clientEvt.data instanceof Blob) {\n\t\t\t\t\t\t\tclientEvt.data\n\t\t\t\t\t\t\t\t.arrayBuffer()\n\t\t\t\t\t\t\t\t.then((buffer) => {\n\t\t\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\t\t\tmsg: \"converted client blob to arraybuffer, sending to server\",\n\t\t\t\t\t\t\t\t\t\tbufferSize: buffer.byteLength,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tclientToProxyWs.send(buffer as any);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\t\t\t\tmsg: \"failed to convert blob to arraybuffer\",\n\t\t\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\tmsg: \"sending client data directly to server\",\n\t\t\t\t\t\t\t\tdataType: typeof clientEvt.data,\n\t\t\t\t\t\t\t\tdataLength:\n\t\t\t\t\t\t\t\t\ttypeof clientEvt.data === \"string\"\n\t\t\t\t\t\t\t\t\t\t? clientEvt.data.length\n\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tclientToProxyWs.send(clientEvt.data as any);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tproxyToActorWs.addEventListener(\"close\", async (clientEvt: any) => {\n\t\t\t\tconst clientToProxyWs = await clientToProxyWsPromise;\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: `test websocket connection closed`,\n\t\t\t\t});\n\n\t\t\t\tif (clientToProxyWs.readyState !== 3) {\n\t\t\t\t\t// Not CLOSED\n\t\t\t\t\tclientToProxyWs.close(clientEvt.code, clientEvt.reason);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tproxyToActorWs.addEventListener(\"error\", async () => {\n\t\t\t\tconst clientToProxyWs = await clientToProxyWsPromise;\n\n\t\t\t\tlogger().debug({\n\t\t\t\t\tmsg: `test websocket connection error`,\n\t\t\t\t});\n\n\t\t\t\tif (clientToProxyWs.readyState !== 3) {\n\t\t\t\t\t// Not CLOSED\n\t\t\t\t\tclientToProxyWs.close(1011, \"Error in client websocket\");\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} catch (error) {\n\t\tlogger().error({\n\t\t\tmsg: `failed to establish client websocket connection`,\n\t\t\terror,\n\t\t});\n\t\treturn {\n\t\t\tonOpen: (_evt, clientToProxyWs) => {\n\t\t\t\tclientToProxyWs.close(1011, \"Failed to establish connection\");\n\t\t\t},\n\t\t\tonMessage: () => {},\n\t\t\tonError: () => {},\n\t\t\tonClose: () => {},\n\t\t};\n\t}\n\n\t// Create WebSocket proxy handlers to relay messages between client and server\n\treturn {\n\t\tonOpen: (_evt: any, clientToProxyWs: WSContext) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: `test websocket connection from client opened`,\n\t\t\t});\n\n\t\t\t// Check WebSocket type\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"proxyToActorWs info\",\n\t\t\t\tconstructor: proxyToActorWs.constructor.name,\n\t\t\t\thasAddEventListener:\n\t\t\t\t\ttypeof proxyToActorWs.addEventListener === \"function\",\n\t\t\t\treadyState: proxyToActorWs.readyState,\n\t\t\t});\n\n\t\t\tclientToProxyWsResolve(clientToProxyWs);\n\t\t},\n\t\tonMessage: (evt: { data: any }) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"received message from server\",\n\t\t\t\tdataType: typeof evt.data,\n\t\t\t\tisBlob: evt.data instanceof Blob,\n\t\t\t\tisArrayBuffer: evt.data instanceof ArrayBuffer,\n\t\t\t\tdataConstructor: evt.data?.constructor?.name,\n\t\t\t\tdataStr:\n\t\t\t\t\ttypeof evt.data === \"string\"\n\t\t\t\t\t\t? evt.data.substring(0, 100)\n\t\t\t\t\t\t: undefined,\n\t\t\t});\n\n\t\t\t// Forward messages from server websocket to client websocket\n\t\t\tif (proxyToActorWs.readyState === 1) {\n\t\t\t\t// OPEN\n\t\t\t\t// Handle Blob data\n\t\t\t\tif (evt.data instanceof Blob) {\n\t\t\t\t\tevt.data\n\t\t\t\t\t\t.arrayBuffer()\n\t\t\t\t\t\t.then((buffer) => {\n\t\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\t\tmsg: \"converted blob to arraybuffer, sending\",\n\t\t\t\t\t\t\t\tbufferSize: buffer.byteLength,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tproxyToActorWs.send(buffer);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\t\tmsg: \"failed to convert blob to arraybuffer\",\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"sending data directly\",\n\t\t\t\t\t\tdataType: typeof evt.data,\n\t\t\t\t\t\tdataLength:\n\t\t\t\t\t\t\ttypeof evt.data === \"string\"\n\t\t\t\t\t\t\t\t? evt.data.length\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t});\n\t\t\t\t\tproxyToActorWs.send(evt.data);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonClose: (\n\t\t\tevent: {\n\t\t\t\twasClean: boolean;\n\t\t\t\tcode: number;\n\t\t\t\treason: string;\n\t\t\t},\n\t\t\tclientToProxyWs: WSContext,\n\t\t) => {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: `server websocket closed`,\n\t\t\t\twasClean: event.wasClean,\n\t\t\t\tcode: event.code,\n\t\t\t\treason: event.reason,\n\t\t\t});\n\n\t\t\t// HACK: Close socket in order to fix bug with Cloudflare leaving WS in closing state\n\t\t\t// https://github.com/cloudflare/workerd/issues/2569\n\t\t\tclientToProxyWs.close(1000, \"hack_force_close\");\n\n\t\t\t// Close the client websocket when the server websocket closes\n\t\t\tif (\n\t\t\t\tproxyToActorWs &&\n\t\t\t\tproxyToActorWs.readyState !== proxyToActorWs.CLOSED &&\n\t\t\t\tproxyToActorWs.readyState !== proxyToActorWs.CLOSING\n\t\t\t) {\n\t\t\t\t// Don't pass code/message since this may affect how close events are triggered\n\t\t\t\tproxyToActorWs.close(1000, event.reason);\n\t\t\t}\n\t\t},\n\t\tonError: (error: unknown) => {\n\t\t\tlogger().error({\n\t\t\t\tmsg: `error in server websocket`,\n\t\t\t\terror,\n\t\t\t});\n\n\t\t\t// Close the client websocket on error\n\t\t\tif (\n\t\t\t\tproxyToActorWs &&\n\t\t\t\tproxyToActorWs.readyState !== proxyToActorWs.CLOSED &&\n\t\t\t\tproxyToActorWs.readyState !== proxyToActorWs.CLOSING\n\t\t\t) {\n\t\t\t\tproxyToActorWs.close(1011, \"Error in server websocket\");\n\t\t\t}\n\n\t\t\tclientToProxyWsReject();\n\t\t},\n\t};\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"actor-manager\");\n}\n","import * as cbor from \"cbor-x\";\nimport { KEYS } from \"@/actor/instance/keys\";\nimport type * as persistSchema from \"@/schemas/actor-persist/mod\";\nimport {\n\tACTOR_VERSIONED,\n\tCURRENT_VERSION,\n} from \"@/schemas/actor-persist/versioned\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nfunction serializeEmptyPersistData(input: unknown | undefined): Uint8Array {\n\tconst persistData: persistSchema.Actor = {\n\t\tinput:\n\t\t\tinput !== undefined\n\t\t\t\t? bufferToArrayBuffer(cbor.encode(input))\n\t\t\t\t: null,\n\t\thasInitialized: false,\n\t\tstate: bufferToArrayBuffer(cbor.encode(undefined)),\n\t\tscheduledEvents: [],\n\t};\n\treturn ACTOR_VERSIONED.serializeWithEmbeddedVersion(\n\t\tpersistData,\n\t\tCURRENT_VERSION,\n\t);\n}\n\n/**\n * Returns the initial KV state for a new actor. This is ued by the drivers to\n * write the initial state in to KV storage before starting the actor.\n */\nexport function getInitialActorKvState(\n\tinput: unknown | undefined,\n): [Uint8Array, Uint8Array][] {\n\tconst persistData = serializeEmptyPersistData(input);\n\treturn [[KEYS.PERSIST_DATA, persistData]];\n}\n","import type { ISqliteVfs } from \"@rivetkit/sqlite-vfs\";\nimport type { RegistryConfig } from \"@/registry/config\";\n\n/**\n * Manages a lazily-created SqliteVfsPool shared across actors in a driver.\n * Uses dynamic import to keep @rivetkit/sqlite-vfs tree-shakeable.\n */\nexport class SqliteVfsPoolManager {\n\t#poolPromise:\n\t\t| Promise<{\n\t\t\t\tacquire(actorId: string): Promise<ISqliteVfs>;\n\t\t\t\tshutdown(): Promise<void>;\n\t\t }>\n\t\t| undefined;\n\t#config: RegistryConfig;\n\n\tconstructor(config: RegistryConfig) {\n\t\tthis.#config = config;\n\t}\n\n\tasync acquire(actorId: string): Promise<ISqliteVfs> {\n\t\tif (!this.#poolPromise) {\n\t\t\tconst poolConfig = this.#config.sqlitePool;\n\t\t\tthis.#poolPromise = import(\"@rivetkit/sqlite-vfs\").then(\n\t\t\t\t({ SqliteVfsPool }) =>\n\t\t\t\t\tnew SqliteVfsPool({\n\t\t\t\t\t\tactorsPerInstance: poolConfig.actorsPerInstance,\n\t\t\t\t\t\tidleDestroyMs: poolConfig.idleDestroyMs,\n\t\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tconst pool = await this.#poolPromise;\n\t\treturn await pool.acquire(actorId);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tif (this.#poolPromise) {\n\t\t\tconst pool = await this.#poolPromise;\n\t\t\tawait pool.shutdown();\n\t\t}\n\t}\n}\n"]}
|