rivetkit 2.1.4 → 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-LK36OGGO.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-ANKZ2FS6.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-AQD4CBZ2.cjs → chunk-DH6UINWA.cjs} +4 -4
- package/dist/tsup/{chunk-AQD4CBZ2.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-HBYEYBIC.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-TEUL4UYN.cjs → chunk-GUHXWPGB.cjs} +1515 -1479
- package/dist/tsup/chunk-GUHXWPGB.cjs.map +1 -0
- package/dist/tsup/{chunk-3B6PCYJB.cjs → chunk-HNE2AK6C.cjs} +2375 -3713
- package/dist/tsup/chunk-HNE2AK6C.cjs.map +1 -0
- package/dist/tsup/{chunk-5UEFNG7P.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-UWAGLDT6.cjs → chunk-JJNZQDUN.cjs} +667 -2517
- package/dist/tsup/chunk-JJNZQDUN.cjs.map +1 -0
- package/dist/tsup/{chunk-M6H4XIF4.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-4KSHPFXF.cjs → chunk-MPLMTJY5.cjs} +123 -23
- package/dist/tsup/chunk-MPLMTJY5.cjs.map +1 -0
- package/dist/tsup/{chunk-UDMRZR6A.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-3GTO6H3E.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-GXRVSSVD.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-QPADHLDU.cjs → chunk-V3JSZR5P.cjs} +3 -3
- package/dist/tsup/{chunk-QPADHLDU.cjs.map → chunk-V3JSZR5P.cjs.map} +1 -1
- package/dist/tsup/{chunk-HKOSZKKZ.cjs → chunk-VBR35EQF.cjs} +271 -339
- package/dist/tsup/chunk-VBR35EQF.cjs.map +1 -0
- package/dist/tsup/{chunk-DZXDUGLL.js → chunk-VWYO36X4.js} +117 -17
- package/dist/tsup/chunk-VWYO36X4.js.map +1 -0
- package/dist/tsup/{chunk-I6PL6QIY.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-KTWY3K6Z.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 +113 -14
- 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-3B6PCYJB.cjs.map +0 -1
- package/dist/tsup/chunk-3GTO6H3E.js.map +0 -1
- package/dist/tsup/chunk-4KSHPFXF.cjs.map +0 -1
- 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-ANKZ2FS6.js.map +0 -1
- package/dist/tsup/chunk-DZXDUGLL.js.map +0 -1
- package/dist/tsup/chunk-GXRVSSVD.cjs.map +0 -1
- package/dist/tsup/chunk-H5TSEPN4.cjs +0 -645
- package/dist/tsup/chunk-H5TSEPN4.cjs.map +0 -1
- package/dist/tsup/chunk-HKOSZKKZ.cjs.map +0 -1
- package/dist/tsup/chunk-I6PL6QIY.js.map +0 -1
- package/dist/tsup/chunk-KJSYAUOM.js.map +0 -1
- package/dist/tsup/chunk-KTWY3K6Z.js.map +0 -1
- package/dist/tsup/chunk-L47L3ZWJ.cjs.map +0 -1
- package/dist/tsup/chunk-LK36OGGO.cjs.map +0 -1
- package/dist/tsup/chunk-M6H4XIF4.js.map +0 -1
- package/dist/tsup/chunk-N4KRDJ56.js.map +0 -1
- package/dist/tsup/chunk-SR3KQE7Q.cjs.map +0 -1
- package/dist/tsup/chunk-TEFYRRAK.js +0 -645
- package/dist/tsup/chunk-TEFYRRAK.js.map +0 -1
- package/dist/tsup/chunk-TEUL4UYN.cjs.map +0 -1
- package/dist/tsup/chunk-UDMRZR6A.js.map +0 -1
- package/dist/tsup/chunk-UWAGLDT6.cjs.map +0 -1
- package/dist/tsup/chunk-VKVNIQRQ.js.map +0 -1
- package/dist/tsup/chunk-ZFY5J2EP.cjs.map +0 -1
- package/src/db/sqlite-vfs.ts +0 -12
- /package/dist/tsup/{chunk-HBYEYBIC.js.map → chunk-EONWXYMN.js.map} +0 -0
- /package/dist/tsup/{chunk-5UEFNG7P.js.map → chunk-I5I6OALK.js.map} +0 -0
|
@@ -0,0 +1,1459 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ACTOR_VERSIONED,
|
|
3
|
+
CURRENT_VERSION2 as CURRENT_VERSION,
|
|
4
|
+
HEADER_ACTOR_ID,
|
|
5
|
+
HEADER_RIVET_ACTOR,
|
|
6
|
+
HEADER_RIVET_TARGET,
|
|
7
|
+
HEADER_RIVET_TOKEN,
|
|
8
|
+
WS_PROTOCOL_ACTOR,
|
|
9
|
+
WS_PROTOCOL_CONN_PARAMS,
|
|
10
|
+
WS_PROTOCOL_ENCODING,
|
|
11
|
+
WS_TEST_PROTOCOL_PATH,
|
|
12
|
+
buildActorNames,
|
|
13
|
+
deserializeActorKey,
|
|
14
|
+
handleHealthRequest,
|
|
15
|
+
handleMetadataRequest,
|
|
16
|
+
handleRouteError,
|
|
17
|
+
handleRouteNotFound,
|
|
18
|
+
loggerMiddleware,
|
|
19
|
+
parseWebSocketProtocols,
|
|
20
|
+
serializeActorKey,
|
|
21
|
+
timingSafeEqual
|
|
22
|
+
} from "./chunk-PQWI44WD.js";
|
|
23
|
+
import {
|
|
24
|
+
KEYS
|
|
25
|
+
} from "./chunk-C22JYHVT.js";
|
|
26
|
+
import {
|
|
27
|
+
bufferToArrayBuffer,
|
|
28
|
+
deconstructError,
|
|
29
|
+
detectRuntime,
|
|
30
|
+
getLogger,
|
|
31
|
+
isDev,
|
|
32
|
+
noopNext,
|
|
33
|
+
promiseWithResolvers,
|
|
34
|
+
stringifyError
|
|
35
|
+
} from "./chunk-VWYO36X4.js";
|
|
36
|
+
import {
|
|
37
|
+
Forbidden,
|
|
38
|
+
MissingActorHeader,
|
|
39
|
+
RestrictedFeature,
|
|
40
|
+
WebSocketsNotEnabled
|
|
41
|
+
} from "./chunk-AKUJ5OTO.js";
|
|
42
|
+
|
|
43
|
+
// src/manager/router.ts
|
|
44
|
+
import { createRoute } from "@hono/zod-openapi";
|
|
45
|
+
import * as cbor from "cbor-x";
|
|
46
|
+
import invariant2 from "invariant";
|
|
47
|
+
import { z as z3 } from "zod/v4";
|
|
48
|
+
|
|
49
|
+
// src/inspector/serve-ui.ts
|
|
50
|
+
import { extract } from "tar";
|
|
51
|
+
|
|
52
|
+
// src/utils/node.ts
|
|
53
|
+
import { createRequire } from "module";
|
|
54
|
+
var nodeCrypto;
|
|
55
|
+
var nodeFsSync;
|
|
56
|
+
var nodeFs;
|
|
57
|
+
var nodePath;
|
|
58
|
+
var nodeOs;
|
|
59
|
+
var nodeChildProcess;
|
|
60
|
+
var nodeStream;
|
|
61
|
+
var nodeUrl;
|
|
62
|
+
var hasImportedDependencies = false;
|
|
63
|
+
function getRequireFn() {
|
|
64
|
+
return createRequire(import.meta.url);
|
|
65
|
+
}
|
|
66
|
+
function importNodeDependencies() {
|
|
67
|
+
if (hasImportedDependencies) return;
|
|
68
|
+
try {
|
|
69
|
+
const requireFn = getRequireFn();
|
|
70
|
+
nodeCrypto = requireFn(
|
|
71
|
+
/* webpackIgnore: true */
|
|
72
|
+
"node:crypto"
|
|
73
|
+
);
|
|
74
|
+
nodeFsSync = requireFn(
|
|
75
|
+
/* webpackIgnore: true */
|
|
76
|
+
"node:fs"
|
|
77
|
+
);
|
|
78
|
+
nodeFs = requireFn(
|
|
79
|
+
/* webpackIgnore: true */
|
|
80
|
+
"node:fs/promises"
|
|
81
|
+
);
|
|
82
|
+
nodePath = requireFn(
|
|
83
|
+
/* webpackIgnore: true */
|
|
84
|
+
"node:path"
|
|
85
|
+
);
|
|
86
|
+
nodeOs = requireFn(
|
|
87
|
+
/* webpackIgnore: true */
|
|
88
|
+
"node:os"
|
|
89
|
+
);
|
|
90
|
+
nodeChildProcess = requireFn(
|
|
91
|
+
/* webpackIgnore: true */
|
|
92
|
+
"node:child_process"
|
|
93
|
+
);
|
|
94
|
+
nodeStream = requireFn(
|
|
95
|
+
/* webpackIgnore: true */
|
|
96
|
+
"node:stream/promises"
|
|
97
|
+
);
|
|
98
|
+
nodeUrl = requireFn(
|
|
99
|
+
/* webpackIgnore: true */
|
|
100
|
+
"node:url"
|
|
101
|
+
);
|
|
102
|
+
hasImportedDependencies = true;
|
|
103
|
+
} catch (err) {
|
|
104
|
+
console.warn(
|
|
105
|
+
"Node.js modules not available, file system driver will not work",
|
|
106
|
+
err
|
|
107
|
+
);
|
|
108
|
+
throw err;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function getNodeCrypto() {
|
|
112
|
+
if (!nodeCrypto) {
|
|
113
|
+
throw new Error(
|
|
114
|
+
"Node crypto module not loaded. Ensure importNodeDependencies() has been called."
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
return nodeCrypto;
|
|
118
|
+
}
|
|
119
|
+
function getNodeFsSync() {
|
|
120
|
+
if (!nodeFsSync) {
|
|
121
|
+
throw new Error(
|
|
122
|
+
"Node fs module not loaded. Ensure importNodeDependencies() has been called."
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
return nodeFsSync;
|
|
126
|
+
}
|
|
127
|
+
function getNodeFs() {
|
|
128
|
+
if (!nodeFs) {
|
|
129
|
+
throw new Error(
|
|
130
|
+
"Node fs/promises module not loaded. Ensure importNodeDependencies() has been called."
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
return nodeFs;
|
|
134
|
+
}
|
|
135
|
+
function getNodePath() {
|
|
136
|
+
if (!nodePath) {
|
|
137
|
+
throw new Error(
|
|
138
|
+
"Node path module not loaded. Ensure importNodeDependencies() has been called."
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
return nodePath;
|
|
142
|
+
}
|
|
143
|
+
function getNodeOs() {
|
|
144
|
+
if (!nodeOs) {
|
|
145
|
+
throw new Error(
|
|
146
|
+
"Node os module not loaded. Ensure importNodeDependencies() has been called."
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
return nodeOs;
|
|
150
|
+
}
|
|
151
|
+
function getNodeChildProcess() {
|
|
152
|
+
if (!nodeChildProcess) {
|
|
153
|
+
throw new Error(
|
|
154
|
+
"Node child_process module not loaded. Ensure importNodeDependencies() has been called."
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
return nodeChildProcess;
|
|
158
|
+
}
|
|
159
|
+
function getNodeStream() {
|
|
160
|
+
if (!nodeStream) {
|
|
161
|
+
throw new Error(
|
|
162
|
+
"Node stream/promises module not loaded. Ensure importNodeDependencies() has been called."
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
return nodeStream;
|
|
166
|
+
}
|
|
167
|
+
function getNodeUrl() {
|
|
168
|
+
if (!nodeUrl) {
|
|
169
|
+
throw new Error(
|
|
170
|
+
"Node url module not loaded. Ensure importNodeDependencies() has been called."
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
return nodeUrl;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// src/inspector/serve-ui.ts
|
|
177
|
+
var extractedDir;
|
|
178
|
+
var extractionPromise;
|
|
179
|
+
async function getInspectorDir() {
|
|
180
|
+
if (extractedDir !== void 0) return extractedDir;
|
|
181
|
+
if (extractionPromise !== void 0) return extractionPromise;
|
|
182
|
+
const nodeFs2 = getNodeFs();
|
|
183
|
+
const os = getNodeOs();
|
|
184
|
+
const url = getNodeUrl();
|
|
185
|
+
const path = getNodePath();
|
|
186
|
+
extractionPromise = (async () => {
|
|
187
|
+
const tarball = path.join(
|
|
188
|
+
path.dirname(url.fileURLToPath(import.meta.url)),
|
|
189
|
+
"../../dist/inspector.tar.gz"
|
|
190
|
+
);
|
|
191
|
+
try {
|
|
192
|
+
await nodeFs2.access(tarball);
|
|
193
|
+
} catch {
|
|
194
|
+
throw new Error(
|
|
195
|
+
`Inspector tarball not found at ${tarball}. Run 'pnpm build:pack-inspector' first.`
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
const dest = path.join(os.tmpdir(), "rivetkit-inspector");
|
|
199
|
+
await nodeFs2.mkdir(dest, { recursive: true });
|
|
200
|
+
await extract({ file: tarball, cwd: dest });
|
|
201
|
+
extractedDir = dest;
|
|
202
|
+
return dest;
|
|
203
|
+
})();
|
|
204
|
+
return extractionPromise;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// src/manager-api/actors.ts
|
|
208
|
+
import { z as z2 } from "zod/v4";
|
|
209
|
+
|
|
210
|
+
// src/manager-api/common.ts
|
|
211
|
+
import { z } from "zod/v4";
|
|
212
|
+
var RivetIdSchema = z.string();
|
|
213
|
+
|
|
214
|
+
// src/manager-api/actors.ts
|
|
215
|
+
var ActorSchema = z2.object({
|
|
216
|
+
actor_id: RivetIdSchema,
|
|
217
|
+
name: z2.string(),
|
|
218
|
+
key: z2.string(),
|
|
219
|
+
namespace_id: RivetIdSchema,
|
|
220
|
+
runner_name_selector: z2.string(),
|
|
221
|
+
create_ts: z2.number(),
|
|
222
|
+
connectable_ts: z2.number().nullable().optional(),
|
|
223
|
+
destroy_ts: z2.number().nullable().optional(),
|
|
224
|
+
sleep_ts: z2.number().nullable().optional(),
|
|
225
|
+
start_ts: z2.number().nullable().optional(),
|
|
226
|
+
error: z2.unknown().nullable().optional()
|
|
227
|
+
});
|
|
228
|
+
var ActorNameSchema = z2.object({
|
|
229
|
+
metadata: z2.record(z2.string(), z2.unknown())
|
|
230
|
+
});
|
|
231
|
+
var ActorsListResponseSchema = z2.object({
|
|
232
|
+
actors: z2.array(ActorSchema)
|
|
233
|
+
});
|
|
234
|
+
var ActorsCreateRequestSchema = z2.object({
|
|
235
|
+
datacenter: z2.string().optional(),
|
|
236
|
+
name: z2.string(),
|
|
237
|
+
runner_name_selector: z2.string(),
|
|
238
|
+
crash_policy: z2.string(),
|
|
239
|
+
key: z2.string().nullable().optional(),
|
|
240
|
+
input: z2.string().nullable().optional()
|
|
241
|
+
});
|
|
242
|
+
var ActorsCreateResponseSchema = z2.object({
|
|
243
|
+
actor: ActorSchema
|
|
244
|
+
});
|
|
245
|
+
var ActorsGetOrCreateRequestSchema = z2.object({
|
|
246
|
+
datacenter: z2.string().optional(),
|
|
247
|
+
name: z2.string(),
|
|
248
|
+
key: z2.string(),
|
|
249
|
+
runner_name_selector: z2.string(),
|
|
250
|
+
crash_policy: z2.string(),
|
|
251
|
+
input: z2.string().nullable().optional()
|
|
252
|
+
});
|
|
253
|
+
var ActorsGetOrCreateResponseSchema = z2.object({
|
|
254
|
+
actor: ActorSchema,
|
|
255
|
+
created: z2.boolean()
|
|
256
|
+
});
|
|
257
|
+
var ActorsDeleteResponseSchema = z2.object({});
|
|
258
|
+
var ActorsListNamesResponseSchema = z2.object({
|
|
259
|
+
names: z2.record(z2.string(), ActorNameSchema)
|
|
260
|
+
});
|
|
261
|
+
var ActorsKvGetResponseSchema = z2.object({
|
|
262
|
+
value: z2.string().nullable()
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
// src/registry/log.ts
|
|
266
|
+
function logger() {
|
|
267
|
+
return getLogger("registry");
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// src/utils/serve.ts
|
|
271
|
+
import getPort from "get-port";
|
|
272
|
+
var DEFAULT_PORT = 6420;
|
|
273
|
+
var serveStaticLoaderPromises = {};
|
|
274
|
+
async function findFreePort(startPort = DEFAULT_PORT) {
|
|
275
|
+
function* portRange(start, count = 100) {
|
|
276
|
+
for (let i = 0; i < count; i++) {
|
|
277
|
+
yield start + i;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return getPort({ port: portRange(startPort) });
|
|
281
|
+
}
|
|
282
|
+
async function crossPlatformServe(config, managerPort, app, runtime = detectRuntime()) {
|
|
283
|
+
logger().debug({ msg: "detected runtime for serve", runtime });
|
|
284
|
+
switch (runtime) {
|
|
285
|
+
case "deno":
|
|
286
|
+
return serveDeno(config, managerPort, app);
|
|
287
|
+
case "bun":
|
|
288
|
+
return serveBun(config, managerPort, app);
|
|
289
|
+
case "node":
|
|
290
|
+
return serveNode(config, managerPort, app);
|
|
291
|
+
default:
|
|
292
|
+
return serveNode(config, managerPort, app);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
async function loadRuntimeServeStatic(runtime) {
|
|
296
|
+
if (!serveStaticLoaderPromises[runtime]) {
|
|
297
|
+
if (runtime === "node") {
|
|
298
|
+
const nodeServeStaticModule = "@hono/node-server/serve-static";
|
|
299
|
+
serveStaticLoaderPromises[runtime] = import(
|
|
300
|
+
/* webpackIgnore: true */
|
|
301
|
+
nodeServeStaticModule
|
|
302
|
+
).then((x) => x.serveStatic);
|
|
303
|
+
} else if (runtime === "bun") {
|
|
304
|
+
const bunModule = "hono/bun";
|
|
305
|
+
serveStaticLoaderPromises[runtime] = import(
|
|
306
|
+
/* webpackIgnore: true */
|
|
307
|
+
bunModule
|
|
308
|
+
).then((x) => x.serveStatic);
|
|
309
|
+
} else if (runtime === "deno") {
|
|
310
|
+
const denoModule = "hono/deno";
|
|
311
|
+
serveStaticLoaderPromises[runtime] = import(
|
|
312
|
+
/* webpackIgnore: true */
|
|
313
|
+
denoModule
|
|
314
|
+
).then((x) => x.serveStatic);
|
|
315
|
+
} else {
|
|
316
|
+
throw new Error(`unsupported runtime: ${runtime}`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return await serveStaticLoaderPromises[runtime];
|
|
320
|
+
}
|
|
321
|
+
async function serveNode(config, managerPort, app) {
|
|
322
|
+
const nodeServerModule = "@hono/node-server";
|
|
323
|
+
let serve;
|
|
324
|
+
try {
|
|
325
|
+
const dep = await import(
|
|
326
|
+
/* webpackIgnore: true */
|
|
327
|
+
nodeServerModule
|
|
328
|
+
);
|
|
329
|
+
serve = dep.serve;
|
|
330
|
+
} catch (err) {
|
|
331
|
+
logger().error({
|
|
332
|
+
msg: "failed to import @hono/node-server. please run 'npm install @hono/node-server @hono/node-ws'",
|
|
333
|
+
error: stringifyError(err)
|
|
334
|
+
});
|
|
335
|
+
process.exit(1);
|
|
336
|
+
}
|
|
337
|
+
const nodeWsModule = "@hono/node-ws";
|
|
338
|
+
let createNodeWebSocket;
|
|
339
|
+
try {
|
|
340
|
+
const dep = await import(
|
|
341
|
+
/* webpackIgnore: true */
|
|
342
|
+
nodeWsModule
|
|
343
|
+
);
|
|
344
|
+
createNodeWebSocket = dep.createNodeWebSocket;
|
|
345
|
+
} catch (err) {
|
|
346
|
+
logger().error({
|
|
347
|
+
msg: "failed to import @hono/node-ws. please run 'npm install @hono/node-server @hono/node-ws'",
|
|
348
|
+
error: stringifyError(err)
|
|
349
|
+
});
|
|
350
|
+
process.exit(1);
|
|
351
|
+
}
|
|
352
|
+
const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({
|
|
353
|
+
app
|
|
354
|
+
});
|
|
355
|
+
const port = managerPort;
|
|
356
|
+
const hostname = config.managerHost;
|
|
357
|
+
const server = serve(
|
|
358
|
+
{ fetch: app.fetch, port, hostname },
|
|
359
|
+
() => logger().info({ msg: "server listening", port, hostname })
|
|
360
|
+
);
|
|
361
|
+
injectWebSocket(server);
|
|
362
|
+
const closeServer = () => {
|
|
363
|
+
server.close();
|
|
364
|
+
};
|
|
365
|
+
return { upgradeWebSocket, closeServer };
|
|
366
|
+
}
|
|
367
|
+
async function serveDeno(config, managerPort, app) {
|
|
368
|
+
const honoDenoModule = "hono/deno";
|
|
369
|
+
let upgradeWebSocket;
|
|
370
|
+
try {
|
|
371
|
+
const dep = await import(
|
|
372
|
+
/* webpackIgnore: true */
|
|
373
|
+
honoDenoModule
|
|
374
|
+
);
|
|
375
|
+
upgradeWebSocket = dep.upgradeWebSocket;
|
|
376
|
+
} catch (err) {
|
|
377
|
+
logger().error({
|
|
378
|
+
msg: "failed to import hono/deno",
|
|
379
|
+
error: stringifyError(err)
|
|
380
|
+
});
|
|
381
|
+
process.exit(1);
|
|
382
|
+
}
|
|
383
|
+
const port = config.managerPort;
|
|
384
|
+
const hostname = config.managerHost;
|
|
385
|
+
Deno.serve({ port, hostname }, app.fetch);
|
|
386
|
+
logger().info({ msg: "server listening", port, hostname });
|
|
387
|
+
return { upgradeWebSocket };
|
|
388
|
+
}
|
|
389
|
+
async function serveBun(config, managerPort, app) {
|
|
390
|
+
const honoBunModule = "hono/bun";
|
|
391
|
+
let createBunWebSocket;
|
|
392
|
+
try {
|
|
393
|
+
const dep = await import(
|
|
394
|
+
/* webpackIgnore: true */
|
|
395
|
+
honoBunModule
|
|
396
|
+
);
|
|
397
|
+
createBunWebSocket = dep.createBunWebSocket;
|
|
398
|
+
} catch (err) {
|
|
399
|
+
logger().error({
|
|
400
|
+
msg: "failed to import hono/bun",
|
|
401
|
+
error: stringifyError(err)
|
|
402
|
+
});
|
|
403
|
+
process.exit(1);
|
|
404
|
+
}
|
|
405
|
+
const { websocket, upgradeWebSocket } = createBunWebSocket();
|
|
406
|
+
const port = config.managerPort;
|
|
407
|
+
const hostname = config.managerHost;
|
|
408
|
+
Bun.serve({
|
|
409
|
+
fetch: app.fetch,
|
|
410
|
+
port,
|
|
411
|
+
hostname,
|
|
412
|
+
websocket
|
|
413
|
+
});
|
|
414
|
+
logger().info({ msg: "server listening", port, hostname });
|
|
415
|
+
return { upgradeWebSocket };
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// src/utils/router.ts
|
|
419
|
+
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
420
|
+
import { createMiddleware } from "hono/factory";
|
|
421
|
+
|
|
422
|
+
// src/common/cors.ts
|
|
423
|
+
var cors = () => {
|
|
424
|
+
return async (c, next) => {
|
|
425
|
+
const origin = c.req.header("origin") || "*";
|
|
426
|
+
if (c.req.method === "OPTIONS") {
|
|
427
|
+
const requestHeaders = c.req.header("access-control-request-headers") || "*";
|
|
428
|
+
c.header("access-control-allow-origin", origin);
|
|
429
|
+
c.header("access-control-allow-credentials", "true");
|
|
430
|
+
c.header(
|
|
431
|
+
"access-control-allow-methods",
|
|
432
|
+
"GET, POST, PUT, DELETE, OPTIONS, PATCH"
|
|
433
|
+
);
|
|
434
|
+
c.header("access-control-allow-headers", requestHeaders);
|
|
435
|
+
c.header("access-control-expose-headers", "*");
|
|
436
|
+
c.header("access-control-max-age", "86400");
|
|
437
|
+
if (origin !== "*") {
|
|
438
|
+
c.header("vary", "Origin");
|
|
439
|
+
}
|
|
440
|
+
c.res.headers.delete("content-length");
|
|
441
|
+
c.res.headers.delete("content-type");
|
|
442
|
+
return c.body(null, 204);
|
|
443
|
+
}
|
|
444
|
+
await next();
|
|
445
|
+
c.header("access-control-allow-origin", origin);
|
|
446
|
+
c.header("access-control-allow-credentials", "true");
|
|
447
|
+
c.header("access-control-expose-headers", "*");
|
|
448
|
+
if (origin !== "*") {
|
|
449
|
+
c.header("vary", "Origin");
|
|
450
|
+
}
|
|
451
|
+
};
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
// src/utils/router.ts
|
|
455
|
+
function logger2() {
|
|
456
|
+
return getLogger("router");
|
|
457
|
+
}
|
|
458
|
+
function createRouter(basePath, builder) {
|
|
459
|
+
const router = new OpenAPIHono({ strict: false }).basePath(basePath);
|
|
460
|
+
router.use("*", loggerMiddleware(logger2()), cors());
|
|
461
|
+
router.use(
|
|
462
|
+
"*",
|
|
463
|
+
createMiddleware(async (c, next) => {
|
|
464
|
+
const upgrade = c.req.header("upgrade");
|
|
465
|
+
const isWebSocket = (upgrade == null ? void 0 : upgrade.toLowerCase()) === "websocket";
|
|
466
|
+
const isGet = c.req.method === "GET";
|
|
467
|
+
if (isGet && isWebSocket) {
|
|
468
|
+
c.header("Sec-WebSocket-Protocol", "rivet");
|
|
469
|
+
}
|
|
470
|
+
await next();
|
|
471
|
+
})
|
|
472
|
+
);
|
|
473
|
+
builder(router);
|
|
474
|
+
router.notFound(handleRouteNotFound);
|
|
475
|
+
router.onError(handleRouteError);
|
|
476
|
+
return { router, openapi: router };
|
|
477
|
+
}
|
|
478
|
+
function buildOpenApiResponses(schema) {
|
|
479
|
+
return {
|
|
480
|
+
200: {
|
|
481
|
+
description: "Success",
|
|
482
|
+
content: {
|
|
483
|
+
"application/json": {
|
|
484
|
+
schema
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
},
|
|
488
|
+
400: {
|
|
489
|
+
description: "User error"
|
|
490
|
+
},
|
|
491
|
+
500: {
|
|
492
|
+
description: "Internal error"
|
|
493
|
+
}
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
function buildOpenApiRequestBody(schema) {
|
|
497
|
+
return {
|
|
498
|
+
required: true,
|
|
499
|
+
content: {
|
|
500
|
+
"application/json": {
|
|
501
|
+
schema
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// src/manager/gateway.ts
|
|
508
|
+
import invariant from "invariant";
|
|
509
|
+
|
|
510
|
+
// src/manager/log.ts
|
|
511
|
+
function logger3() {
|
|
512
|
+
return getLogger("actor-manager");
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// src/manager/gateway.ts
|
|
516
|
+
async function handleWebSocketGatewayPathBased(config, managerDriver, c, actorPathInfo, getUpgradeWebSocket) {
|
|
517
|
+
const upgradeWebSocket = getUpgradeWebSocket == null ? void 0 : getUpgradeWebSocket();
|
|
518
|
+
if (!upgradeWebSocket) {
|
|
519
|
+
throw new WebSocketsNotEnabled();
|
|
520
|
+
}
|
|
521
|
+
const { encoding, connParams } = parseWebSocketProtocols(
|
|
522
|
+
c.req.header("sec-websocket-protocol")
|
|
523
|
+
);
|
|
524
|
+
logger3().debug({
|
|
525
|
+
msg: "proxying websocket to actor via path-based routing",
|
|
526
|
+
actorId: actorPathInfo.actorId,
|
|
527
|
+
path: actorPathInfo.remainingPath,
|
|
528
|
+
encoding
|
|
529
|
+
});
|
|
530
|
+
return await managerDriver.proxyWebSocket(
|
|
531
|
+
c,
|
|
532
|
+
actorPathInfo.remainingPath,
|
|
533
|
+
actorPathInfo.actorId,
|
|
534
|
+
encoding,
|
|
535
|
+
// Will be validated by driver
|
|
536
|
+
connParams
|
|
537
|
+
);
|
|
538
|
+
}
|
|
539
|
+
async function handleHttpGatewayPathBased(managerDriver, c, actorPathInfo) {
|
|
540
|
+
logger3().debug({
|
|
541
|
+
msg: "proxying request to actor via path-based routing",
|
|
542
|
+
actorId: actorPathInfo.actorId,
|
|
543
|
+
path: actorPathInfo.remainingPath,
|
|
544
|
+
method: c.req.method
|
|
545
|
+
});
|
|
546
|
+
const proxyHeaders = new Headers(c.req.raw.headers);
|
|
547
|
+
const proxyUrl = new URL(`http://actor${actorPathInfo.remainingPath}`);
|
|
548
|
+
const proxyRequest = new Request(proxyUrl, {
|
|
549
|
+
method: c.req.raw.method,
|
|
550
|
+
headers: proxyHeaders,
|
|
551
|
+
body: c.req.raw.body,
|
|
552
|
+
signal: c.req.raw.signal,
|
|
553
|
+
duplex: "half"
|
|
554
|
+
});
|
|
555
|
+
return await managerDriver.proxyRequest(
|
|
556
|
+
c,
|
|
557
|
+
proxyRequest,
|
|
558
|
+
actorPathInfo.actorId
|
|
559
|
+
);
|
|
560
|
+
}
|
|
561
|
+
async function actorGateway(config, managerDriver, getUpgradeWebSocket, c, next) {
|
|
562
|
+
if (c.req.path.startsWith("/.test/")) {
|
|
563
|
+
return next();
|
|
564
|
+
}
|
|
565
|
+
let strippedPath = c.req.path;
|
|
566
|
+
if (config.managerBasePath && strippedPath.startsWith(config.managerBasePath)) {
|
|
567
|
+
strippedPath = strippedPath.slice(config.managerBasePath.length);
|
|
568
|
+
if (!strippedPath.startsWith("/")) {
|
|
569
|
+
strippedPath = "/" + strippedPath;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
const pathWithQuery = c.req.url.includes("?") ? strippedPath + c.req.url.substring(c.req.url.indexOf("?")) : strippedPath;
|
|
573
|
+
const actorPathInfo = parseActorPath(pathWithQuery);
|
|
574
|
+
if (actorPathInfo) {
|
|
575
|
+
logger3().debug({
|
|
576
|
+
msg: "routing using path-based actor routing",
|
|
577
|
+
actorPathInfo
|
|
578
|
+
});
|
|
579
|
+
const isWebSocket = c.req.header("upgrade") === "websocket";
|
|
580
|
+
if (isWebSocket) {
|
|
581
|
+
return await handleWebSocketGatewayPathBased(
|
|
582
|
+
config,
|
|
583
|
+
managerDriver,
|
|
584
|
+
c,
|
|
585
|
+
actorPathInfo,
|
|
586
|
+
getUpgradeWebSocket
|
|
587
|
+
);
|
|
588
|
+
}
|
|
589
|
+
return await handleHttpGatewayPathBased(
|
|
590
|
+
managerDriver,
|
|
591
|
+
c,
|
|
592
|
+
actorPathInfo
|
|
593
|
+
);
|
|
594
|
+
}
|
|
595
|
+
if (c.req.header("upgrade") === "websocket") {
|
|
596
|
+
return await handleWebSocketGateway(
|
|
597
|
+
config,
|
|
598
|
+
managerDriver,
|
|
599
|
+
getUpgradeWebSocket,
|
|
600
|
+
c,
|
|
601
|
+
strippedPath
|
|
602
|
+
);
|
|
603
|
+
}
|
|
604
|
+
return await handleHttpGateway(managerDriver, c, next, strippedPath);
|
|
605
|
+
}
|
|
606
|
+
async function handleWebSocketGateway(config, managerDriver, getUpgradeWebSocket, c, strippedPath) {
|
|
607
|
+
const upgradeWebSocket = getUpgradeWebSocket == null ? void 0 : getUpgradeWebSocket();
|
|
608
|
+
if (!upgradeWebSocket) {
|
|
609
|
+
throw new WebSocketsNotEnabled();
|
|
610
|
+
}
|
|
611
|
+
let target;
|
|
612
|
+
let actorId;
|
|
613
|
+
const { encoding, connParams } = parseWebSocketProtocols(
|
|
614
|
+
c.req.header("sec-websocket-protocol")
|
|
615
|
+
);
|
|
616
|
+
if (target !== "actor") {
|
|
617
|
+
return c.text("WebSocket upgrade requires target.actor protocol", 400);
|
|
618
|
+
}
|
|
619
|
+
if (!actorId) {
|
|
620
|
+
throw new MissingActorHeader();
|
|
621
|
+
}
|
|
622
|
+
logger3().debug({
|
|
623
|
+
msg: "proxying websocket to actor",
|
|
624
|
+
actorId,
|
|
625
|
+
path: strippedPath,
|
|
626
|
+
encoding
|
|
627
|
+
});
|
|
628
|
+
const pathWithQuery = c.req.url.includes("?") ? strippedPath + c.req.url.substring(c.req.url.indexOf("?")) : strippedPath;
|
|
629
|
+
return await managerDriver.proxyWebSocket(
|
|
630
|
+
c,
|
|
631
|
+
pathWithQuery,
|
|
632
|
+
actorId,
|
|
633
|
+
encoding,
|
|
634
|
+
connParams
|
|
635
|
+
);
|
|
636
|
+
}
|
|
637
|
+
async function handleHttpGateway(managerDriver, c, next, strippedPath) {
|
|
638
|
+
const target = c.req.header(HEADER_RIVET_TARGET);
|
|
639
|
+
const actorId = c.req.header(HEADER_RIVET_ACTOR);
|
|
640
|
+
if (target !== "actor") {
|
|
641
|
+
return next();
|
|
642
|
+
}
|
|
643
|
+
if (!actorId) {
|
|
644
|
+
throw new MissingActorHeader();
|
|
645
|
+
}
|
|
646
|
+
logger3().debug({
|
|
647
|
+
msg: "proxying request to actor",
|
|
648
|
+
actorId,
|
|
649
|
+
path: strippedPath,
|
|
650
|
+
method: c.req.method
|
|
651
|
+
});
|
|
652
|
+
const proxyHeaders = new Headers(c.req.raw.headers);
|
|
653
|
+
proxyHeaders.delete(HEADER_RIVET_TARGET);
|
|
654
|
+
proxyHeaders.delete(HEADER_RIVET_ACTOR);
|
|
655
|
+
const url = new URL(c.req.url);
|
|
656
|
+
const proxyUrl = new URL(`http://actor${strippedPath}${url.search}`);
|
|
657
|
+
const proxyRequest = new Request(proxyUrl, {
|
|
658
|
+
method: c.req.raw.method,
|
|
659
|
+
headers: proxyHeaders,
|
|
660
|
+
body: c.req.raw.body,
|
|
661
|
+
signal: c.req.raw.signal,
|
|
662
|
+
duplex: "half"
|
|
663
|
+
});
|
|
664
|
+
return await managerDriver.proxyRequest(c, proxyRequest, actorId);
|
|
665
|
+
}
|
|
666
|
+
function parseActorPath(path) {
|
|
667
|
+
const queryPos = path.indexOf("?");
|
|
668
|
+
const fragmentPos = path.indexOf("#");
|
|
669
|
+
let queryString = "";
|
|
670
|
+
if (queryPos !== -1) {
|
|
671
|
+
if (fragmentPos !== -1 && queryPos < fragmentPos) {
|
|
672
|
+
queryString = path.slice(queryPos, fragmentPos);
|
|
673
|
+
} else {
|
|
674
|
+
queryString = path.slice(queryPos);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
let basePath = path;
|
|
678
|
+
if (queryPos !== -1) {
|
|
679
|
+
basePath = path.slice(0, queryPos);
|
|
680
|
+
} else if (fragmentPos !== -1) {
|
|
681
|
+
basePath = path.slice(0, fragmentPos);
|
|
682
|
+
}
|
|
683
|
+
if (basePath.includes("//")) {
|
|
684
|
+
return null;
|
|
685
|
+
}
|
|
686
|
+
const segments = basePath.split("/").filter((s) => s.length > 0);
|
|
687
|
+
if (segments.length < 2) {
|
|
688
|
+
return null;
|
|
689
|
+
}
|
|
690
|
+
if (segments[0] !== "gateway") {
|
|
691
|
+
return null;
|
|
692
|
+
}
|
|
693
|
+
const actorSegment = segments[1];
|
|
694
|
+
if (actorSegment.length === 0) {
|
|
695
|
+
return null;
|
|
696
|
+
}
|
|
697
|
+
let actorId;
|
|
698
|
+
let token;
|
|
699
|
+
const atPos = actorSegment.indexOf("@");
|
|
700
|
+
if (atPos !== -1) {
|
|
701
|
+
const rawActorId = actorSegment.slice(0, atPos);
|
|
702
|
+
const rawToken = actorSegment.slice(atPos + 1);
|
|
703
|
+
if (rawActorId.length === 0 || rawToken.length === 0) {
|
|
704
|
+
return null;
|
|
705
|
+
}
|
|
706
|
+
try {
|
|
707
|
+
actorId = decodeURIComponent(rawActorId);
|
|
708
|
+
token = decodeURIComponent(rawToken);
|
|
709
|
+
} catch (e) {
|
|
710
|
+
return null;
|
|
711
|
+
}
|
|
712
|
+
} else {
|
|
713
|
+
try {
|
|
714
|
+
actorId = decodeURIComponent(actorSegment);
|
|
715
|
+
} catch (e) {
|
|
716
|
+
return null;
|
|
717
|
+
}
|
|
718
|
+
token = void 0;
|
|
719
|
+
}
|
|
720
|
+
let prefixLen = 0;
|
|
721
|
+
for (let i = 0; i < 2; i++) {
|
|
722
|
+
prefixLen += 1 + segments[i].length;
|
|
723
|
+
}
|
|
724
|
+
let remainingBase;
|
|
725
|
+
if (prefixLen < basePath.length) {
|
|
726
|
+
remainingBase = basePath.slice(prefixLen);
|
|
727
|
+
} else {
|
|
728
|
+
remainingBase = "/";
|
|
729
|
+
}
|
|
730
|
+
let remainingPath;
|
|
731
|
+
if (remainingBase.length === 0 || !remainingBase.startsWith("/")) {
|
|
732
|
+
remainingPath = `/${remainingBase}${queryString}`;
|
|
733
|
+
} else {
|
|
734
|
+
remainingPath = `${remainingBase}${queryString}`;
|
|
735
|
+
}
|
|
736
|
+
return {
|
|
737
|
+
actorId,
|
|
738
|
+
token,
|
|
739
|
+
remainingPath
|
|
740
|
+
};
|
|
741
|
+
}
|
|
742
|
+
async function createTestWebSocketProxy(proxyToActorWsPromise) {
|
|
743
|
+
let proxyToActorWs = null;
|
|
744
|
+
const {
|
|
745
|
+
promise: clientToProxyWsPromise,
|
|
746
|
+
resolve: clientToProxyWsResolve,
|
|
747
|
+
reject: clientToProxyWsReject
|
|
748
|
+
} = promiseWithResolvers(
|
|
749
|
+
(reason) => logger3().warn({
|
|
750
|
+
msg: "unhandled client websocket promise rejection",
|
|
751
|
+
reason
|
|
752
|
+
})
|
|
753
|
+
);
|
|
754
|
+
try {
|
|
755
|
+
logger3().debug({ msg: "awaiting client websocket promise" });
|
|
756
|
+
proxyToActorWs = await proxyToActorWsPromise;
|
|
757
|
+
logger3().debug({
|
|
758
|
+
msg: "client websocket promise resolved",
|
|
759
|
+
constructor: proxyToActorWs == null ? void 0 : proxyToActorWs.constructor.name
|
|
760
|
+
});
|
|
761
|
+
await new Promise((resolve, reject) => {
|
|
762
|
+
invariant(proxyToActorWs, "missing proxyToActorWs");
|
|
763
|
+
const onOpen = () => {
|
|
764
|
+
logger3().debug({
|
|
765
|
+
msg: "test websocket connection to actor opened"
|
|
766
|
+
});
|
|
767
|
+
resolve();
|
|
768
|
+
};
|
|
769
|
+
const onError = (error) => {
|
|
770
|
+
logger3().error({
|
|
771
|
+
msg: "test websocket connection failed",
|
|
772
|
+
error
|
|
773
|
+
});
|
|
774
|
+
reject(
|
|
775
|
+
new Error(
|
|
776
|
+
`Failed to open WebSocket: ${error.message || error}`
|
|
777
|
+
)
|
|
778
|
+
);
|
|
779
|
+
clientToProxyWsReject();
|
|
780
|
+
};
|
|
781
|
+
proxyToActorWs.addEventListener("open", onOpen);
|
|
782
|
+
proxyToActorWs.addEventListener("error", onError);
|
|
783
|
+
proxyToActorWs.addEventListener(
|
|
784
|
+
"message",
|
|
785
|
+
async (clientEvt) => {
|
|
786
|
+
var _a, _b;
|
|
787
|
+
const clientToProxyWs = await clientToProxyWsPromise;
|
|
788
|
+
logger3().debug({
|
|
789
|
+
msg: `test websocket connection message from client`,
|
|
790
|
+
dataType: typeof clientEvt.data,
|
|
791
|
+
isBlob: clientEvt.data instanceof Blob,
|
|
792
|
+
isArrayBuffer: clientEvt.data instanceof ArrayBuffer,
|
|
793
|
+
dataConstructor: (_b = (_a = clientEvt.data) == null ? void 0 : _a.constructor) == null ? void 0 : _b.name,
|
|
794
|
+
dataStr: typeof clientEvt.data === "string" ? clientEvt.data.substring(0, 100) : void 0
|
|
795
|
+
});
|
|
796
|
+
if (clientToProxyWs.readyState === 1) {
|
|
797
|
+
if (clientEvt.data instanceof Blob) {
|
|
798
|
+
clientEvt.data.arrayBuffer().then((buffer) => {
|
|
799
|
+
logger3().debug({
|
|
800
|
+
msg: "converted client blob to arraybuffer, sending to server",
|
|
801
|
+
bufferSize: buffer.byteLength
|
|
802
|
+
});
|
|
803
|
+
clientToProxyWs.send(buffer);
|
|
804
|
+
}).catch((error) => {
|
|
805
|
+
logger3().error({
|
|
806
|
+
msg: "failed to convert blob to arraybuffer",
|
|
807
|
+
error
|
|
808
|
+
});
|
|
809
|
+
});
|
|
810
|
+
} else {
|
|
811
|
+
logger3().debug({
|
|
812
|
+
msg: "sending client data directly to server",
|
|
813
|
+
dataType: typeof clientEvt.data,
|
|
814
|
+
dataLength: typeof clientEvt.data === "string" ? clientEvt.data.length : void 0
|
|
815
|
+
});
|
|
816
|
+
clientToProxyWs.send(clientEvt.data);
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
);
|
|
821
|
+
proxyToActorWs.addEventListener("close", async (clientEvt) => {
|
|
822
|
+
const clientToProxyWs = await clientToProxyWsPromise;
|
|
823
|
+
logger3().debug({
|
|
824
|
+
msg: `test websocket connection closed`
|
|
825
|
+
});
|
|
826
|
+
if (clientToProxyWs.readyState !== 3) {
|
|
827
|
+
clientToProxyWs.close(clientEvt.code, clientEvt.reason);
|
|
828
|
+
}
|
|
829
|
+
});
|
|
830
|
+
proxyToActorWs.addEventListener("error", async () => {
|
|
831
|
+
const clientToProxyWs = await clientToProxyWsPromise;
|
|
832
|
+
logger3().debug({
|
|
833
|
+
msg: `test websocket connection error`
|
|
834
|
+
});
|
|
835
|
+
if (clientToProxyWs.readyState !== 3) {
|
|
836
|
+
clientToProxyWs.close(1011, "Error in client websocket");
|
|
837
|
+
}
|
|
838
|
+
});
|
|
839
|
+
});
|
|
840
|
+
} catch (error) {
|
|
841
|
+
logger3().error({
|
|
842
|
+
msg: `failed to establish client websocket connection`,
|
|
843
|
+
error
|
|
844
|
+
});
|
|
845
|
+
return {
|
|
846
|
+
onOpen: (_evt, clientToProxyWs) => {
|
|
847
|
+
clientToProxyWs.close(1011, "Failed to establish connection");
|
|
848
|
+
},
|
|
849
|
+
onMessage: () => {
|
|
850
|
+
},
|
|
851
|
+
onError: () => {
|
|
852
|
+
},
|
|
853
|
+
onClose: () => {
|
|
854
|
+
}
|
|
855
|
+
};
|
|
856
|
+
}
|
|
857
|
+
return {
|
|
858
|
+
onOpen: (_evt, clientToProxyWs) => {
|
|
859
|
+
logger3().debug({
|
|
860
|
+
msg: `test websocket connection from client opened`
|
|
861
|
+
});
|
|
862
|
+
logger3().debug({
|
|
863
|
+
msg: "proxyToActorWs info",
|
|
864
|
+
constructor: proxyToActorWs.constructor.name,
|
|
865
|
+
hasAddEventListener: typeof proxyToActorWs.addEventListener === "function",
|
|
866
|
+
readyState: proxyToActorWs.readyState
|
|
867
|
+
});
|
|
868
|
+
clientToProxyWsResolve(clientToProxyWs);
|
|
869
|
+
},
|
|
870
|
+
onMessage: (evt) => {
|
|
871
|
+
var _a, _b;
|
|
872
|
+
logger3().debug({
|
|
873
|
+
msg: "received message from server",
|
|
874
|
+
dataType: typeof evt.data,
|
|
875
|
+
isBlob: evt.data instanceof Blob,
|
|
876
|
+
isArrayBuffer: evt.data instanceof ArrayBuffer,
|
|
877
|
+
dataConstructor: (_b = (_a = evt.data) == null ? void 0 : _a.constructor) == null ? void 0 : _b.name,
|
|
878
|
+
dataStr: typeof evt.data === "string" ? evt.data.substring(0, 100) : void 0
|
|
879
|
+
});
|
|
880
|
+
if (proxyToActorWs.readyState === 1) {
|
|
881
|
+
if (evt.data instanceof Blob) {
|
|
882
|
+
evt.data.arrayBuffer().then((buffer) => {
|
|
883
|
+
logger3().debug({
|
|
884
|
+
msg: "converted blob to arraybuffer, sending",
|
|
885
|
+
bufferSize: buffer.byteLength
|
|
886
|
+
});
|
|
887
|
+
proxyToActorWs.send(buffer);
|
|
888
|
+
}).catch((error) => {
|
|
889
|
+
logger3().error({
|
|
890
|
+
msg: "failed to convert blob to arraybuffer",
|
|
891
|
+
error
|
|
892
|
+
});
|
|
893
|
+
});
|
|
894
|
+
} else {
|
|
895
|
+
logger3().debug({
|
|
896
|
+
msg: "sending data directly",
|
|
897
|
+
dataType: typeof evt.data,
|
|
898
|
+
dataLength: typeof evt.data === "string" ? evt.data.length : void 0
|
|
899
|
+
});
|
|
900
|
+
proxyToActorWs.send(evt.data);
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
},
|
|
904
|
+
onClose: (event, clientToProxyWs) => {
|
|
905
|
+
logger3().debug({
|
|
906
|
+
msg: `server websocket closed`,
|
|
907
|
+
wasClean: event.wasClean,
|
|
908
|
+
code: event.code,
|
|
909
|
+
reason: event.reason
|
|
910
|
+
});
|
|
911
|
+
clientToProxyWs.close(1e3, "hack_force_close");
|
|
912
|
+
if (proxyToActorWs && proxyToActorWs.readyState !== proxyToActorWs.CLOSED && proxyToActorWs.readyState !== proxyToActorWs.CLOSING) {
|
|
913
|
+
proxyToActorWs.close(1e3, event.reason);
|
|
914
|
+
}
|
|
915
|
+
},
|
|
916
|
+
onError: (error) => {
|
|
917
|
+
logger3().error({
|
|
918
|
+
msg: `error in server websocket`,
|
|
919
|
+
error
|
|
920
|
+
});
|
|
921
|
+
if (proxyToActorWs && proxyToActorWs.readyState !== proxyToActorWs.CLOSED && proxyToActorWs.readyState !== proxyToActorWs.CLOSING) {
|
|
922
|
+
proxyToActorWs.close(1011, "Error in server websocket");
|
|
923
|
+
}
|
|
924
|
+
clientToProxyWsReject();
|
|
925
|
+
}
|
|
926
|
+
};
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
// src/manager/router.ts
|
|
930
|
+
function buildManagerRouter(config, managerDriver, getUpgradeWebSocket, runtime = "node") {
|
|
931
|
+
return createRouter(config.managerBasePath, (router) => {
|
|
932
|
+
var _a;
|
|
933
|
+
router.use(
|
|
934
|
+
"*",
|
|
935
|
+
actorGateway.bind(
|
|
936
|
+
void 0,
|
|
937
|
+
config,
|
|
938
|
+
managerDriver,
|
|
939
|
+
getUpgradeWebSocket
|
|
940
|
+
)
|
|
941
|
+
);
|
|
942
|
+
router.get("/", (c) => {
|
|
943
|
+
return c.text(
|
|
944
|
+
"This is a RivetKit server.\n\nLearn more at https://rivet.dev"
|
|
945
|
+
);
|
|
946
|
+
});
|
|
947
|
+
{
|
|
948
|
+
const route = createRoute({
|
|
949
|
+
method: "get",
|
|
950
|
+
path: "/actors",
|
|
951
|
+
request: {
|
|
952
|
+
query: z3.object({
|
|
953
|
+
name: z3.string().optional(),
|
|
954
|
+
actor_ids: z3.string().optional(),
|
|
955
|
+
key: z3.string().optional()
|
|
956
|
+
})
|
|
957
|
+
},
|
|
958
|
+
responses: buildOpenApiResponses(ActorsListResponseSchema)
|
|
959
|
+
});
|
|
960
|
+
router.openapi(route, async (c) => {
|
|
961
|
+
const { name, actor_ids, key } = c.req.valid("query");
|
|
962
|
+
const actorIdsParsed = actor_ids ? actor_ids.split(",").map((id) => id.trim()).filter((id) => id.length > 0) : void 0;
|
|
963
|
+
const actors = [];
|
|
964
|
+
if (actorIdsParsed && (name || key)) {
|
|
965
|
+
return c.json(
|
|
966
|
+
{
|
|
967
|
+
error: "Cannot provide both actor_ids and (name + key). Use either actor_ids or (name + key)."
|
|
968
|
+
},
|
|
969
|
+
400
|
|
970
|
+
);
|
|
971
|
+
}
|
|
972
|
+
if (key && !name) {
|
|
973
|
+
return c.json(
|
|
974
|
+
{
|
|
975
|
+
error: "Name is required when key is provided."
|
|
976
|
+
},
|
|
977
|
+
400
|
|
978
|
+
);
|
|
979
|
+
}
|
|
980
|
+
if (actorIdsParsed) {
|
|
981
|
+
if (actorIdsParsed.length > 32) {
|
|
982
|
+
return c.json(
|
|
983
|
+
{
|
|
984
|
+
error: `Too many actor IDs. Maximum is 32, got ${actorIdsParsed.length}.`
|
|
985
|
+
},
|
|
986
|
+
400
|
|
987
|
+
);
|
|
988
|
+
}
|
|
989
|
+
if (actorIdsParsed.length === 0) {
|
|
990
|
+
return c.json({
|
|
991
|
+
actors: []
|
|
992
|
+
});
|
|
993
|
+
}
|
|
994
|
+
for (const actorId of actorIdsParsed) {
|
|
995
|
+
if (name) {
|
|
996
|
+
const actorOutput = await managerDriver.getForId({
|
|
997
|
+
c,
|
|
998
|
+
name,
|
|
999
|
+
actorId
|
|
1000
|
+
});
|
|
1001
|
+
if (actorOutput) {
|
|
1002
|
+
actors.push(actorOutput);
|
|
1003
|
+
}
|
|
1004
|
+
} else {
|
|
1005
|
+
for (const actorName of Object.keys(config.use)) {
|
|
1006
|
+
const actorOutput = await managerDriver.getForId({
|
|
1007
|
+
c,
|
|
1008
|
+
name: actorName,
|
|
1009
|
+
actorId
|
|
1010
|
+
});
|
|
1011
|
+
if (actorOutput) {
|
|
1012
|
+
actors.push(actorOutput);
|
|
1013
|
+
break;
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
} else if (key && name) {
|
|
1019
|
+
const actorOutput = await managerDriver.getWithKey({
|
|
1020
|
+
c,
|
|
1021
|
+
name,
|
|
1022
|
+
key: deserializeActorKey(key)
|
|
1023
|
+
});
|
|
1024
|
+
if (actorOutput) {
|
|
1025
|
+
actors.push(actorOutput);
|
|
1026
|
+
}
|
|
1027
|
+
} else {
|
|
1028
|
+
if (!name) {
|
|
1029
|
+
return c.json(
|
|
1030
|
+
{
|
|
1031
|
+
error: "Name is required when not using actor_ids."
|
|
1032
|
+
},
|
|
1033
|
+
400
|
|
1034
|
+
);
|
|
1035
|
+
}
|
|
1036
|
+
const actorOutputs = await managerDriver.listActors({
|
|
1037
|
+
c,
|
|
1038
|
+
name,
|
|
1039
|
+
key,
|
|
1040
|
+
includeDestroyed: false
|
|
1041
|
+
});
|
|
1042
|
+
actors.push(...actorOutputs);
|
|
1043
|
+
}
|
|
1044
|
+
return c.json({
|
|
1045
|
+
actors: actors.map((actor) => createApiActor(actor))
|
|
1046
|
+
});
|
|
1047
|
+
});
|
|
1048
|
+
}
|
|
1049
|
+
{
|
|
1050
|
+
const route = createRoute({
|
|
1051
|
+
method: "get",
|
|
1052
|
+
path: "/actors/names",
|
|
1053
|
+
request: {
|
|
1054
|
+
query: z3.object({
|
|
1055
|
+
namespace: z3.string()
|
|
1056
|
+
})
|
|
1057
|
+
},
|
|
1058
|
+
responses: buildOpenApiResponses(ActorsListNamesResponseSchema)
|
|
1059
|
+
});
|
|
1060
|
+
router.openapi(route, async (c) => {
|
|
1061
|
+
const names = buildActorNames(config);
|
|
1062
|
+
return c.json({
|
|
1063
|
+
names
|
|
1064
|
+
});
|
|
1065
|
+
});
|
|
1066
|
+
}
|
|
1067
|
+
{
|
|
1068
|
+
const route = createRoute({
|
|
1069
|
+
method: "put",
|
|
1070
|
+
path: "/actors",
|
|
1071
|
+
request: {
|
|
1072
|
+
body: buildOpenApiRequestBody(
|
|
1073
|
+
ActorsGetOrCreateRequestSchema
|
|
1074
|
+
)
|
|
1075
|
+
},
|
|
1076
|
+
responses: buildOpenApiResponses(
|
|
1077
|
+
ActorsGetOrCreateResponseSchema
|
|
1078
|
+
)
|
|
1079
|
+
});
|
|
1080
|
+
router.openapi(route, async (c) => {
|
|
1081
|
+
const body = c.req.valid("json");
|
|
1082
|
+
const existingActor = await managerDriver.getWithKey({
|
|
1083
|
+
c,
|
|
1084
|
+
name: body.name,
|
|
1085
|
+
key: deserializeActorKey(body.key)
|
|
1086
|
+
});
|
|
1087
|
+
if (existingActor) {
|
|
1088
|
+
return c.json({
|
|
1089
|
+
actor: createApiActor(existingActor),
|
|
1090
|
+
created: false
|
|
1091
|
+
});
|
|
1092
|
+
}
|
|
1093
|
+
const newActor = await managerDriver.getOrCreateWithKey({
|
|
1094
|
+
c,
|
|
1095
|
+
name: body.name,
|
|
1096
|
+
key: deserializeActorKey(body.key),
|
|
1097
|
+
input: body.input ? cbor.decode(Buffer.from(body.input, "base64")) : void 0,
|
|
1098
|
+
region: void 0
|
|
1099
|
+
// Not provided in the request schema
|
|
1100
|
+
});
|
|
1101
|
+
return c.json({
|
|
1102
|
+
actor: createApiActor(newActor),
|
|
1103
|
+
created: true
|
|
1104
|
+
});
|
|
1105
|
+
});
|
|
1106
|
+
}
|
|
1107
|
+
{
|
|
1108
|
+
const route = createRoute({
|
|
1109
|
+
method: "post",
|
|
1110
|
+
path: "/actors",
|
|
1111
|
+
request: {
|
|
1112
|
+
body: buildOpenApiRequestBody(ActorsCreateRequestSchema)
|
|
1113
|
+
},
|
|
1114
|
+
responses: buildOpenApiResponses(ActorsCreateResponseSchema)
|
|
1115
|
+
});
|
|
1116
|
+
router.openapi(route, async (c) => {
|
|
1117
|
+
const body = c.req.valid("json");
|
|
1118
|
+
const actorOutput = await managerDriver.createActor({
|
|
1119
|
+
c,
|
|
1120
|
+
name: body.name,
|
|
1121
|
+
key: deserializeActorKey(body.key || crypto.randomUUID()),
|
|
1122
|
+
input: body.input ? cbor.decode(Buffer.from(body.input, "base64")) : void 0,
|
|
1123
|
+
region: void 0
|
|
1124
|
+
// Not provided in the request schema
|
|
1125
|
+
});
|
|
1126
|
+
const actor = createApiActor(actorOutput);
|
|
1127
|
+
return c.json({ actor });
|
|
1128
|
+
});
|
|
1129
|
+
}
|
|
1130
|
+
{
|
|
1131
|
+
const route = createRoute({
|
|
1132
|
+
method: "get",
|
|
1133
|
+
path: "/actors/{actor_id}/kv/keys/{key}",
|
|
1134
|
+
request: {
|
|
1135
|
+
params: z3.object({
|
|
1136
|
+
actor_id: z3.string(),
|
|
1137
|
+
key: z3.string()
|
|
1138
|
+
})
|
|
1139
|
+
},
|
|
1140
|
+
responses: buildOpenApiResponses(ActorsKvGetResponseSchema)
|
|
1141
|
+
});
|
|
1142
|
+
router.openapi(route, async (c) => {
|
|
1143
|
+
if (isDev() && !config.token) {
|
|
1144
|
+
logger3().warn({
|
|
1145
|
+
msg: "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."
|
|
1146
|
+
});
|
|
1147
|
+
}
|
|
1148
|
+
if (!isDev()) {
|
|
1149
|
+
if (!config.token) {
|
|
1150
|
+
throw new RestrictedFeature("KV store access");
|
|
1151
|
+
}
|
|
1152
|
+
if (timingSafeEqual(
|
|
1153
|
+
config.token,
|
|
1154
|
+
c.req.header(HEADER_RIVET_TOKEN) || ""
|
|
1155
|
+
) === false) {
|
|
1156
|
+
throw new Forbidden();
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
const { actor_id: actorId, key } = c.req.valid("param");
|
|
1160
|
+
const response = await managerDriver.kvGet(
|
|
1161
|
+
actorId,
|
|
1162
|
+
Buffer.from(key, "base64")
|
|
1163
|
+
);
|
|
1164
|
+
return c.json({
|
|
1165
|
+
value: response ? Buffer.from(response).toString("base64") : null
|
|
1166
|
+
});
|
|
1167
|
+
});
|
|
1168
|
+
}
|
|
1169
|
+
if (config.test.enabled) {
|
|
1170
|
+
router.post(".test/inline-driver/call", async (c) => {
|
|
1171
|
+
const buffer = await c.req.arrayBuffer();
|
|
1172
|
+
const { encoding, method, args } = cbor.decode(new Uint8Array(buffer));
|
|
1173
|
+
logger3().debug({
|
|
1174
|
+
msg: "received inline request",
|
|
1175
|
+
encoding,
|
|
1176
|
+
method,
|
|
1177
|
+
args
|
|
1178
|
+
});
|
|
1179
|
+
let response;
|
|
1180
|
+
try {
|
|
1181
|
+
const output = await managerDriver[method](...args);
|
|
1182
|
+
response = { ok: output };
|
|
1183
|
+
} catch (rawErr) {
|
|
1184
|
+
const err = deconstructError(rawErr, logger3(), {}, true);
|
|
1185
|
+
response = { err };
|
|
1186
|
+
}
|
|
1187
|
+
return c.body(cbor.encode(response));
|
|
1188
|
+
});
|
|
1189
|
+
router.get(".test/inline-driver/connect-websocket/*", async (c) => {
|
|
1190
|
+
const upgradeWebSocket = getUpgradeWebSocket == null ? void 0 : getUpgradeWebSocket();
|
|
1191
|
+
invariant2(
|
|
1192
|
+
upgradeWebSocket,
|
|
1193
|
+
"websockets not supported on this platform"
|
|
1194
|
+
);
|
|
1195
|
+
return upgradeWebSocket(async (c2) => {
|
|
1196
|
+
const protocolHeader = c2.req.header("sec-websocket-protocol") || "";
|
|
1197
|
+
const protocols = protocolHeader.split(/,\s*/);
|
|
1198
|
+
let actorId = "";
|
|
1199
|
+
let encoding = "bare";
|
|
1200
|
+
let path = "";
|
|
1201
|
+
let params;
|
|
1202
|
+
for (const protocol of protocols) {
|
|
1203
|
+
if (protocol.startsWith(WS_PROTOCOL_ACTOR)) {
|
|
1204
|
+
actorId = decodeURIComponent(
|
|
1205
|
+
protocol.substring(WS_PROTOCOL_ACTOR.length)
|
|
1206
|
+
);
|
|
1207
|
+
} else if (protocol.startsWith(WS_PROTOCOL_ENCODING)) {
|
|
1208
|
+
encoding = protocol.substring(
|
|
1209
|
+
WS_PROTOCOL_ENCODING.length
|
|
1210
|
+
);
|
|
1211
|
+
} else if (protocol.startsWith(WS_TEST_PROTOCOL_PATH)) {
|
|
1212
|
+
path = decodeURIComponent(
|
|
1213
|
+
protocol.substring(
|
|
1214
|
+
WS_TEST_PROTOCOL_PATH.length
|
|
1215
|
+
)
|
|
1216
|
+
);
|
|
1217
|
+
} else if (protocol.startsWith(WS_PROTOCOL_CONN_PARAMS)) {
|
|
1218
|
+
const paramsRaw = decodeURIComponent(
|
|
1219
|
+
protocol.substring(
|
|
1220
|
+
WS_PROTOCOL_CONN_PARAMS.length
|
|
1221
|
+
)
|
|
1222
|
+
);
|
|
1223
|
+
params = JSON.parse(paramsRaw);
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
logger3().debug({
|
|
1227
|
+
msg: "received test inline driver websocket",
|
|
1228
|
+
actorId,
|
|
1229
|
+
params,
|
|
1230
|
+
encodingKind: encoding,
|
|
1231
|
+
path
|
|
1232
|
+
});
|
|
1233
|
+
const clientToProxyWsPromise = managerDriver.openWebSocket(
|
|
1234
|
+
path,
|
|
1235
|
+
actorId,
|
|
1236
|
+
encoding,
|
|
1237
|
+
params
|
|
1238
|
+
);
|
|
1239
|
+
return await createTestWebSocketProxy(
|
|
1240
|
+
clientToProxyWsPromise
|
|
1241
|
+
);
|
|
1242
|
+
})(c, noopNext());
|
|
1243
|
+
});
|
|
1244
|
+
router.all(".test/inline-driver/send-request/*", async (c) => {
|
|
1245
|
+
const actorId = c.req.header(HEADER_ACTOR_ID);
|
|
1246
|
+
if (!actorId) {
|
|
1247
|
+
return c.text("Missing required headers", 400);
|
|
1248
|
+
}
|
|
1249
|
+
const pathOnly = c.req.path.split("/.test/inline-driver/send-request/")[1] || "";
|
|
1250
|
+
const url = new URL(c.req.url);
|
|
1251
|
+
const pathWithQuery = pathOnly + url.search;
|
|
1252
|
+
logger3().debug({
|
|
1253
|
+
msg: "received test inline driver raw http",
|
|
1254
|
+
actorId,
|
|
1255
|
+
path: pathWithQuery,
|
|
1256
|
+
method: c.req.method
|
|
1257
|
+
});
|
|
1258
|
+
try {
|
|
1259
|
+
const response = await managerDriver.sendRequest(
|
|
1260
|
+
actorId,
|
|
1261
|
+
new Request(`http://actor/${pathWithQuery}`, {
|
|
1262
|
+
method: c.req.method,
|
|
1263
|
+
headers: c.req.raw.headers,
|
|
1264
|
+
body: c.req.raw.body,
|
|
1265
|
+
duplex: "half"
|
|
1266
|
+
})
|
|
1267
|
+
);
|
|
1268
|
+
return response;
|
|
1269
|
+
} catch (error) {
|
|
1270
|
+
logger3().error({
|
|
1271
|
+
msg: "error in test inline raw http",
|
|
1272
|
+
error: stringifyError(error)
|
|
1273
|
+
});
|
|
1274
|
+
const err = deconstructError(error, logger3(), {}, true);
|
|
1275
|
+
return c.json(
|
|
1276
|
+
{
|
|
1277
|
+
error: {
|
|
1278
|
+
code: err.code,
|
|
1279
|
+
message: err.message,
|
|
1280
|
+
metadata: err.metadata
|
|
1281
|
+
}
|
|
1282
|
+
},
|
|
1283
|
+
err.statusCode
|
|
1284
|
+
);
|
|
1285
|
+
}
|
|
1286
|
+
});
|
|
1287
|
+
router.post("/.test/force-disconnect", async (c) => {
|
|
1288
|
+
const actorId = c.req.query("actor");
|
|
1289
|
+
const connId = c.req.query("conn");
|
|
1290
|
+
if (!actorId || !connId) {
|
|
1291
|
+
return c.text(
|
|
1292
|
+
"Missing actor or conn query parameters",
|
|
1293
|
+
400
|
|
1294
|
+
);
|
|
1295
|
+
}
|
|
1296
|
+
logger3().debug({
|
|
1297
|
+
msg: "forcing unclean disconnect",
|
|
1298
|
+
actorId,
|
|
1299
|
+
connId
|
|
1300
|
+
});
|
|
1301
|
+
try {
|
|
1302
|
+
const response = await managerDriver.sendRequest(
|
|
1303
|
+
actorId,
|
|
1304
|
+
new Request(
|
|
1305
|
+
`http://actor/.test/force-disconnect?conn=${connId}`,
|
|
1306
|
+
{
|
|
1307
|
+
method: "POST"
|
|
1308
|
+
}
|
|
1309
|
+
)
|
|
1310
|
+
);
|
|
1311
|
+
if (!response.ok) {
|
|
1312
|
+
const text = await response.text();
|
|
1313
|
+
return c.text(
|
|
1314
|
+
`Failed to force disconnect: ${text}`,
|
|
1315
|
+
response.status
|
|
1316
|
+
);
|
|
1317
|
+
}
|
|
1318
|
+
return c.json({ success: true });
|
|
1319
|
+
} catch (error) {
|
|
1320
|
+
logger3().error({
|
|
1321
|
+
msg: "error forcing disconnect",
|
|
1322
|
+
error: stringifyError(error)
|
|
1323
|
+
});
|
|
1324
|
+
return c.text(`Error: ${error}`, 500);
|
|
1325
|
+
}
|
|
1326
|
+
});
|
|
1327
|
+
}
|
|
1328
|
+
if (config.inspector.enabled) {
|
|
1329
|
+
let inspectorRoot;
|
|
1330
|
+
router.get("/ui/*", async (c, next) => {
|
|
1331
|
+
let serveStatic;
|
|
1332
|
+
try {
|
|
1333
|
+
serveStatic = await loadRuntimeServeStatic(runtime);
|
|
1334
|
+
} catch (error) {
|
|
1335
|
+
logger3().error({
|
|
1336
|
+
msg: "failed to load inspector static file handler",
|
|
1337
|
+
error: stringifyError(error)
|
|
1338
|
+
});
|
|
1339
|
+
return c.text(
|
|
1340
|
+
`Failed to load static file handler for runtime '${runtime}'.`,
|
|
1341
|
+
500
|
|
1342
|
+
);
|
|
1343
|
+
}
|
|
1344
|
+
if (!inspectorRoot) {
|
|
1345
|
+
inspectorRoot = await getInspectorDir();
|
|
1346
|
+
}
|
|
1347
|
+
const root = inspectorRoot;
|
|
1348
|
+
const rewrite = (path) => path.replace(/^\/ui/, "") || "/";
|
|
1349
|
+
return serveStatic({
|
|
1350
|
+
root,
|
|
1351
|
+
rewriteRequestPath: rewrite,
|
|
1352
|
+
onNotFound: async (_path, c2) => {
|
|
1353
|
+
await serveStatic({ root, path: "index.html" })(
|
|
1354
|
+
c2,
|
|
1355
|
+
next
|
|
1356
|
+
);
|
|
1357
|
+
}
|
|
1358
|
+
})(c, next);
|
|
1359
|
+
});
|
|
1360
|
+
router.get("/ui", (c) => c.redirect("/ui/"));
|
|
1361
|
+
}
|
|
1362
|
+
router.get("/health", (c) => handleHealthRequest(c));
|
|
1363
|
+
router.get(
|
|
1364
|
+
"/metadata",
|
|
1365
|
+
(c) => handleMetadataRequest(
|
|
1366
|
+
c,
|
|
1367
|
+
config,
|
|
1368
|
+
{ normal: {} },
|
|
1369
|
+
config.publicEndpoint,
|
|
1370
|
+
config.publicNamespace,
|
|
1371
|
+
config.publicToken
|
|
1372
|
+
)
|
|
1373
|
+
);
|
|
1374
|
+
(_a = managerDriver.modifyManagerRouter) == null ? void 0 : _a.call(managerDriver, config, router);
|
|
1375
|
+
});
|
|
1376
|
+
}
|
|
1377
|
+
function createApiActor(actor) {
|
|
1378
|
+
return {
|
|
1379
|
+
actor_id: actor.actorId,
|
|
1380
|
+
name: actor.name,
|
|
1381
|
+
key: serializeActorKey(actor.key),
|
|
1382
|
+
namespace_id: "default",
|
|
1383
|
+
// Assert default namespace
|
|
1384
|
+
runner_name_selector: "default",
|
|
1385
|
+
create_ts: actor.createTs ?? Date.now(),
|
|
1386
|
+
connectable_ts: actor.connectableTs ?? null,
|
|
1387
|
+
destroy_ts: actor.destroyTs ?? null,
|
|
1388
|
+
sleep_ts: actor.sleepTs ?? null,
|
|
1389
|
+
start_ts: actor.startTs ?? null
|
|
1390
|
+
};
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1393
|
+
// src/driver-helpers/utils.ts
|
|
1394
|
+
import * as cbor2 from "cbor-x";
|
|
1395
|
+
function serializeEmptyPersistData(input) {
|
|
1396
|
+
const persistData = {
|
|
1397
|
+
input: input !== void 0 ? bufferToArrayBuffer(cbor2.encode(input)) : null,
|
|
1398
|
+
hasInitialized: false,
|
|
1399
|
+
state: bufferToArrayBuffer(cbor2.encode(void 0)),
|
|
1400
|
+
scheduledEvents: []
|
|
1401
|
+
};
|
|
1402
|
+
return ACTOR_VERSIONED.serializeWithEmbeddedVersion(
|
|
1403
|
+
persistData,
|
|
1404
|
+
CURRENT_VERSION
|
|
1405
|
+
);
|
|
1406
|
+
}
|
|
1407
|
+
function getInitialActorKvState(input) {
|
|
1408
|
+
const persistData = serializeEmptyPersistData(input);
|
|
1409
|
+
return [[KEYS.PERSIST_DATA, persistData]];
|
|
1410
|
+
}
|
|
1411
|
+
|
|
1412
|
+
// src/driver-helpers/sqlite-pool.ts
|
|
1413
|
+
var SqliteVfsPoolManager = class {
|
|
1414
|
+
#poolPromise;
|
|
1415
|
+
#config;
|
|
1416
|
+
constructor(config) {
|
|
1417
|
+
this.#config = config;
|
|
1418
|
+
}
|
|
1419
|
+
async acquire(actorId) {
|
|
1420
|
+
if (!this.#poolPromise) {
|
|
1421
|
+
const poolConfig = this.#config.sqlitePool;
|
|
1422
|
+
this.#poolPromise = import("@rivetkit/sqlite-vfs").then(
|
|
1423
|
+
({ SqliteVfsPool }) => new SqliteVfsPool({
|
|
1424
|
+
actorsPerInstance: poolConfig.actorsPerInstance,
|
|
1425
|
+
idleDestroyMs: poolConfig.idleDestroyMs
|
|
1426
|
+
})
|
|
1427
|
+
);
|
|
1428
|
+
}
|
|
1429
|
+
const pool = await this.#poolPromise;
|
|
1430
|
+
return await pool.acquire(actorId);
|
|
1431
|
+
}
|
|
1432
|
+
async shutdown() {
|
|
1433
|
+
if (this.#poolPromise) {
|
|
1434
|
+
const pool = await this.#poolPromise;
|
|
1435
|
+
await pool.shutdown();
|
|
1436
|
+
}
|
|
1437
|
+
}
|
|
1438
|
+
};
|
|
1439
|
+
|
|
1440
|
+
export {
|
|
1441
|
+
getRequireFn,
|
|
1442
|
+
importNodeDependencies,
|
|
1443
|
+
getNodeCrypto,
|
|
1444
|
+
getNodeFsSync,
|
|
1445
|
+
getNodeFs,
|
|
1446
|
+
getNodePath,
|
|
1447
|
+
getNodeOs,
|
|
1448
|
+
getNodeChildProcess,
|
|
1449
|
+
getNodeStream,
|
|
1450
|
+
logger,
|
|
1451
|
+
findFreePort,
|
|
1452
|
+
crossPlatformServe,
|
|
1453
|
+
loadRuntimeServeStatic,
|
|
1454
|
+
createRouter,
|
|
1455
|
+
buildManagerRouter,
|
|
1456
|
+
getInitialActorKvState,
|
|
1457
|
+
SqliteVfsPoolManager
|
|
1458
|
+
};
|
|
1459
|
+
//# sourceMappingURL=chunk-C4EB42ET.js.map
|