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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
importWebSocket,
|
|
3
3
|
logger
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-I5I6OALK.js";
|
|
5
5
|
import {
|
|
6
6
|
CURRENT_VERSION,
|
|
7
7
|
EncodingSchema,
|
|
@@ -36,12 +36,11 @@ import {
|
|
|
36
36
|
serializeWithEncoding,
|
|
37
37
|
tryParseEndpoint,
|
|
38
38
|
uint8ArrayToBase64
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-PQWI44WD.js";
|
|
40
40
|
import {
|
|
41
41
|
assertUnreachable as assertUnreachable2
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-C22JYHVT.js";
|
|
43
43
|
import {
|
|
44
|
-
VERSION,
|
|
45
44
|
assertUnreachable,
|
|
46
45
|
bufferToArrayBuffer,
|
|
47
46
|
combineUrlPath,
|
|
@@ -58,46 +57,11 @@ import {
|
|
|
58
57
|
noopNext,
|
|
59
58
|
promiseWithResolvers,
|
|
60
59
|
stringifyError
|
|
61
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-VWYO36X4.js";
|
|
62
61
|
import {
|
|
63
62
|
ActorNotFound,
|
|
64
63
|
InvalidRequest
|
|
65
|
-
} from "./chunk-
|
|
66
|
-
|
|
67
|
-
// src/devtools-loader/log.ts
|
|
68
|
-
function logger2() {
|
|
69
|
-
return getLogger("devtools");
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// src/devtools-loader/index.ts
|
|
73
|
-
var DEFAULT_DEVTOOLS_URL = (version = VERSION) => `https://releases.rivet.dev/rivet/latest/devtools/mod.js?v=${version}`;
|
|
74
|
-
var scriptId = "rivetkit-devtools-script";
|
|
75
|
-
function injectDevtools(config) {
|
|
76
|
-
if (!window) {
|
|
77
|
-
logger2().warn("devtools not available outside browser environment");
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
if (!document.getElementById(scriptId)) {
|
|
81
|
-
const script = document.createElement("script");
|
|
82
|
-
script.id = scriptId;
|
|
83
|
-
script.src = DEFAULT_DEVTOOLS_URL();
|
|
84
|
-
script.async = true;
|
|
85
|
-
document.head.appendChild(script);
|
|
86
|
-
}
|
|
87
|
-
window.__rivetkit = window.__rivetkit || [];
|
|
88
|
-
window.__rivetkit.push(config);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// src/remote-manager-driver/mod.ts
|
|
92
|
-
import * as cbor2 from "cbor-x";
|
|
93
|
-
import invariant2 from "invariant";
|
|
94
|
-
|
|
95
|
-
// src/remote-manager-driver/api-utils.ts
|
|
96
|
-
import { z } from "zod/v4";
|
|
97
|
-
|
|
98
|
-
// src/client/utils.ts
|
|
99
|
-
import * as cbor from "cbor-x";
|
|
100
|
-
import invariant from "invariant";
|
|
64
|
+
} from "./chunk-AKUJ5OTO.js";
|
|
101
65
|
|
|
102
66
|
// src/client/errors.ts
|
|
103
67
|
var ActorClientError = class extends Error {
|
|
@@ -152,7 +116,102 @@ var ActorSchedulingError = class extends ActorError {
|
|
|
152
116
|
}
|
|
153
117
|
};
|
|
154
118
|
|
|
119
|
+
// src/client/actor-conn.ts
|
|
120
|
+
import * as cbor4 from "cbor-x";
|
|
121
|
+
import invariant4 from "invariant";
|
|
122
|
+
import pRetry from "p-retry";
|
|
123
|
+
|
|
124
|
+
// src/client/actor-query.ts
|
|
125
|
+
async function queryActor(c, query, managerDriver) {
|
|
126
|
+
logger().debug({ msg: "querying actor", query: JSON.stringify(query) });
|
|
127
|
+
let actorOutput;
|
|
128
|
+
if ("getForId" in query) {
|
|
129
|
+
const output = await managerDriver.getForId({
|
|
130
|
+
c,
|
|
131
|
+
name: query.getForId.name,
|
|
132
|
+
actorId: query.getForId.actorId
|
|
133
|
+
});
|
|
134
|
+
if (!output) throw new ActorNotFound(query.getForId.actorId);
|
|
135
|
+
actorOutput = output;
|
|
136
|
+
} else if ("getForKey" in query) {
|
|
137
|
+
const existingActor = await managerDriver.getWithKey({
|
|
138
|
+
c,
|
|
139
|
+
name: query.getForKey.name,
|
|
140
|
+
key: query.getForKey.key
|
|
141
|
+
});
|
|
142
|
+
if (!existingActor) {
|
|
143
|
+
throw new ActorNotFound(
|
|
144
|
+
`${query.getForKey.name}:${JSON.stringify(query.getForKey.key)}`
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
actorOutput = existingActor;
|
|
148
|
+
} else if ("getOrCreateForKey" in query) {
|
|
149
|
+
const getOrCreateOutput = await managerDriver.getOrCreateWithKey({
|
|
150
|
+
c,
|
|
151
|
+
name: query.getOrCreateForKey.name,
|
|
152
|
+
key: query.getOrCreateForKey.key,
|
|
153
|
+
input: query.getOrCreateForKey.input,
|
|
154
|
+
region: query.getOrCreateForKey.region
|
|
155
|
+
});
|
|
156
|
+
actorOutput = {
|
|
157
|
+
actorId: getOrCreateOutput.actorId
|
|
158
|
+
};
|
|
159
|
+
} else if ("create" in query) {
|
|
160
|
+
const createOutput = await managerDriver.createActor({
|
|
161
|
+
c,
|
|
162
|
+
name: query.create.name,
|
|
163
|
+
key: query.create.key,
|
|
164
|
+
input: query.create.input,
|
|
165
|
+
region: query.create.region
|
|
166
|
+
});
|
|
167
|
+
actorOutput = {
|
|
168
|
+
actorId: createOutput.actorId
|
|
169
|
+
};
|
|
170
|
+
} else {
|
|
171
|
+
throw new InvalidRequest("Invalid query format");
|
|
172
|
+
}
|
|
173
|
+
logger().debug({ msg: "actor query result", actorId: actorOutput.actorId });
|
|
174
|
+
return { actorId: actorOutput.actorId };
|
|
175
|
+
}
|
|
176
|
+
function getActorNameFromQuery(query) {
|
|
177
|
+
if ("getForId" in query) return query.getForId.name;
|
|
178
|
+
if ("getForKey" in query) return query.getForKey.name;
|
|
179
|
+
if ("getOrCreateForKey" in query) return query.getOrCreateForKey.name;
|
|
180
|
+
if ("create" in query) return query.create.name;
|
|
181
|
+
throw new InvalidRequest("Invalid query format");
|
|
182
|
+
}
|
|
183
|
+
async function checkForSchedulingError(group, code, actorId, query, driver) {
|
|
184
|
+
const name = getActorNameFromQuery(query);
|
|
185
|
+
try {
|
|
186
|
+
const actor = await driver.getForId({ name, actorId });
|
|
187
|
+
if (actor == null ? void 0 : actor.error) {
|
|
188
|
+
logger().info({
|
|
189
|
+
msg: "found actor scheduling error",
|
|
190
|
+
actorId,
|
|
191
|
+
error: actor.error
|
|
192
|
+
});
|
|
193
|
+
return new ActorSchedulingError(group, code, actorId, actor.error);
|
|
194
|
+
}
|
|
195
|
+
} catch (err) {
|
|
196
|
+
logger().warn({
|
|
197
|
+
msg: "failed to fetch actor details for scheduling error check",
|
|
198
|
+
actorId,
|
|
199
|
+
error: stringifyError(err)
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// src/client/actor-handle.ts
|
|
206
|
+
import * as cbor3 from "cbor-x";
|
|
207
|
+
import invariant3 from "invariant";
|
|
208
|
+
|
|
209
|
+
// src/client/queue.ts
|
|
210
|
+
import * as cbor2 from "cbor-x";
|
|
211
|
+
|
|
155
212
|
// src/client/utils.ts
|
|
213
|
+
import * as cbor from "cbor-x";
|
|
214
|
+
import invariant from "invariant";
|
|
156
215
|
function parseWebSocketCloseReason(reason) {
|
|
157
216
|
const [mainPart, rayId] = reason.split("#");
|
|
158
217
|
const [group, code] = mainPart.split(".");
|
|
@@ -291,804 +350,664 @@ ${textResponse}`
|
|
|
291
350
|
}
|
|
292
351
|
}
|
|
293
352
|
|
|
294
|
-
// src/
|
|
295
|
-
function
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
353
|
+
// src/client/queue.ts
|
|
354
|
+
function createQueueSender(senderOptions) {
|
|
355
|
+
async function send(name, body, options) {
|
|
356
|
+
const wait = (options == null ? void 0 : options.wait) ?? false;
|
|
357
|
+
const timeout = options == null ? void 0 : options.timeout;
|
|
358
|
+
const result = await sendHttpRequest({
|
|
359
|
+
url: `http://actor/queue/${encodeURIComponent(name)}`,
|
|
360
|
+
method: "POST",
|
|
361
|
+
headers: {
|
|
362
|
+
[HEADER_ENCODING]: senderOptions.encoding,
|
|
363
|
+
...senderOptions.params !== void 0 ? {
|
|
364
|
+
[HEADER_CONN_PARAMS]: JSON.stringify(
|
|
365
|
+
senderOptions.params
|
|
366
|
+
)
|
|
367
|
+
} : {}
|
|
368
|
+
},
|
|
369
|
+
body: { body, wait, timeout },
|
|
370
|
+
encoding: senderOptions.encoding,
|
|
371
|
+
customFetch: senderOptions.customFetch,
|
|
372
|
+
signal: options == null ? void 0 : options.signal,
|
|
373
|
+
requestVersion: CURRENT_VERSION,
|
|
374
|
+
requestVersionedDataHandler: HTTP_QUEUE_SEND_REQUEST_VERSIONED,
|
|
375
|
+
responseVersion: CURRENT_VERSION,
|
|
376
|
+
responseVersionedDataHandler: HTTP_QUEUE_SEND_RESPONSE_VERSIONED,
|
|
377
|
+
requestZodSchema: HttpQueueSendRequestSchema,
|
|
378
|
+
responseZodSchema: HttpQueueSendResponseSchema,
|
|
379
|
+
requestToJson: (value) => ({
|
|
380
|
+
...value,
|
|
381
|
+
name
|
|
382
|
+
}),
|
|
383
|
+
requestToBare: (value) => ({
|
|
384
|
+
name: value.name ?? name,
|
|
385
|
+
body: bufferToArrayBuffer(cbor2.encode(value.body)),
|
|
386
|
+
wait: value.wait ?? false,
|
|
387
|
+
timeout: value.timeout !== void 0 ? BigInt(value.timeout) : null
|
|
388
|
+
}),
|
|
389
|
+
responseFromJson: (json) => {
|
|
390
|
+
if (json.response === void 0) {
|
|
391
|
+
return { status: json.status };
|
|
392
|
+
}
|
|
393
|
+
return {
|
|
394
|
+
status: json.status,
|
|
395
|
+
response: json.response
|
|
396
|
+
};
|
|
397
|
+
},
|
|
398
|
+
responseFromBare: (bare) => {
|
|
399
|
+
if (bare.response === null || bare.response === void 0) {
|
|
400
|
+
return { status: bare.status };
|
|
401
|
+
}
|
|
402
|
+
return {
|
|
403
|
+
status: bare.status,
|
|
404
|
+
response: cbor2.decode(new Uint8Array(bare.response))
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
if (wait) {
|
|
409
|
+
return result;
|
|
410
|
+
}
|
|
411
|
+
return;
|
|
306
412
|
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
return config.endpoint ?? "http://127.0.0.1:6420";
|
|
310
|
-
}
|
|
311
|
-
async function apiCall(config, method, path, body) {
|
|
312
|
-
const endpoint = getEndpoint(config);
|
|
313
|
-
const url = combineUrlPath(endpoint, path, {
|
|
314
|
-
namespace: config.namespace
|
|
315
|
-
});
|
|
316
|
-
logger3().debug({ msg: "making api call", method, url });
|
|
317
|
-
const headers = {
|
|
318
|
-
...config.headers
|
|
413
|
+
return {
|
|
414
|
+
send
|
|
319
415
|
};
|
|
320
|
-
if (config.token) {
|
|
321
|
-
headers.Authorization = `Bearer ${config.token}`;
|
|
322
|
-
}
|
|
323
|
-
return await sendHttpRequest({
|
|
324
|
-
method,
|
|
325
|
-
url,
|
|
326
|
-
headers,
|
|
327
|
-
body,
|
|
328
|
-
encoding: "json",
|
|
329
|
-
skipParseResponse: false,
|
|
330
|
-
requestVersionedDataHandler: void 0,
|
|
331
|
-
requestVersion: void 0,
|
|
332
|
-
responseVersionedDataHandler: void 0,
|
|
333
|
-
responseVersion: void 0,
|
|
334
|
-
requestZodSchema: z.any(),
|
|
335
|
-
responseZodSchema: z.any(),
|
|
336
|
-
// Identity conversions (passthrough for generic API calls)
|
|
337
|
-
requestToJson: (value) => value,
|
|
338
|
-
requestToBare: (value) => value,
|
|
339
|
-
responseFromJson: (value) => value,
|
|
340
|
-
responseFromBare: (value) => value
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
// src/remote-manager-driver/actor-websocket-client.ts
|
|
345
|
-
function buildActorGatewayUrl(endpoint, actorId, token, path = "") {
|
|
346
|
-
const tokenSegment = token !== void 0 ? `@${encodeURIComponent(token)}` : "";
|
|
347
|
-
const gatewayPath = `/gateway/${encodeURIComponent(actorId)}${tokenSegment}${path}`;
|
|
348
|
-
return combineUrlPath(endpoint, gatewayPath);
|
|
349
|
-
}
|
|
350
|
-
async function openWebSocketToActor(runConfig, path, actorId, encoding, params) {
|
|
351
|
-
const WebSocket2 = await importWebSocket();
|
|
352
|
-
const endpoint = getEndpoint(runConfig);
|
|
353
|
-
const guardUrl = buildActorGatewayUrl(
|
|
354
|
-
endpoint,
|
|
355
|
-
actorId,
|
|
356
|
-
runConfig.token,
|
|
357
|
-
path
|
|
358
|
-
);
|
|
359
|
-
logger3().debug({
|
|
360
|
-
msg: "opening websocket to actor via guard",
|
|
361
|
-
actorId,
|
|
362
|
-
path,
|
|
363
|
-
guardUrl
|
|
364
|
-
});
|
|
365
|
-
const ws = new WebSocket2(
|
|
366
|
-
guardUrl,
|
|
367
|
-
buildWebSocketProtocols(runConfig, encoding, params)
|
|
368
|
-
);
|
|
369
|
-
ws.binaryType = "arraybuffer";
|
|
370
|
-
logger3().debug({ msg: "websocket connection opened", actorId });
|
|
371
|
-
return ws;
|
|
372
|
-
}
|
|
373
|
-
function buildWebSocketProtocols(runConfig, encoding, params) {
|
|
374
|
-
const protocols = [];
|
|
375
|
-
protocols.push(WS_PROTOCOL_STANDARD);
|
|
376
|
-
protocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);
|
|
377
|
-
if (params) {
|
|
378
|
-
protocols.push(
|
|
379
|
-
`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`
|
|
380
|
-
);
|
|
381
|
-
}
|
|
382
|
-
return protocols;
|
|
383
416
|
}
|
|
384
417
|
|
|
385
|
-
// src/
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
)
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
418
|
+
// src/client/raw-utils.ts
|
|
419
|
+
import invariant2 from "invariant";
|
|
420
|
+
async function rawHttpFetch(driver, actorQuery, params, input, init) {
|
|
421
|
+
let path;
|
|
422
|
+
let mergedInit = init || {};
|
|
423
|
+
if (typeof input === "string") {
|
|
424
|
+
path = input;
|
|
425
|
+
} else if (input instanceof URL) {
|
|
426
|
+
path = input.pathname + input.search;
|
|
427
|
+
} else if (input instanceof Request) {
|
|
428
|
+
const url = new URL(input.url);
|
|
429
|
+
path = url.pathname + url.search;
|
|
430
|
+
const requestHeaders = new Headers(input.headers);
|
|
431
|
+
const initHeaders = new Headers((init == null ? void 0 : init.headers) || {});
|
|
432
|
+
const mergedHeaders = new Headers(requestHeaders);
|
|
433
|
+
initHeaders.forEach((value, key) => {
|
|
434
|
+
mergedHeaders.set(key, value);
|
|
435
|
+
});
|
|
436
|
+
mergedInit = {
|
|
437
|
+
method: input.method,
|
|
438
|
+
body: input.body,
|
|
439
|
+
mode: input.mode,
|
|
440
|
+
credentials: input.credentials,
|
|
441
|
+
redirect: input.redirect,
|
|
442
|
+
referrer: input.referrer,
|
|
443
|
+
referrerPolicy: input.referrerPolicy,
|
|
444
|
+
integrity: input.integrity,
|
|
445
|
+
keepalive: input.keepalive,
|
|
446
|
+
signal: input.signal,
|
|
447
|
+
...mergedInit,
|
|
448
|
+
// init overrides Request properties
|
|
449
|
+
headers: mergedHeaders
|
|
450
|
+
// headers must be set after spread to ensure proper merge
|
|
451
|
+
};
|
|
452
|
+
if (mergedInit.body) {
|
|
453
|
+
mergedInit.duplex = "half";
|
|
410
454
|
}
|
|
455
|
+
} else {
|
|
456
|
+
throw new TypeError("Invalid input type for fetch");
|
|
411
457
|
}
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
return new Response(fetchRes.body, fetchRes);
|
|
422
|
-
}
|
|
423
|
-
function buildGuardHeadersForHttp(runConfig, actorRequest, actorId) {
|
|
424
|
-
const headers = new Headers();
|
|
425
|
-
actorRequest.headers.forEach((value, key) => {
|
|
426
|
-
headers.set(key, value);
|
|
427
|
-
});
|
|
428
|
-
for (const [key, value] of Object.entries(runConfig.headers)) {
|
|
429
|
-
headers.set(key, value);
|
|
430
|
-
}
|
|
431
|
-
if (runConfig.token) {
|
|
432
|
-
headers.set(HEADER_RIVET_TOKEN, runConfig.token);
|
|
433
|
-
}
|
|
434
|
-
return headers;
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
// src/remote-manager-driver/api-endpoints.ts
|
|
438
|
-
async function getActor(config, _, actorId) {
|
|
439
|
-
return apiCall(
|
|
440
|
-
config,
|
|
441
|
-
"GET",
|
|
442
|
-
`/actors?actor_ids=${encodeURIComponent(actorId)}`
|
|
443
|
-
);
|
|
444
|
-
}
|
|
445
|
-
async function getActorByKey(config, name, key) {
|
|
446
|
-
const serializedKey = serializeActorKey(key);
|
|
447
|
-
return apiCall(
|
|
448
|
-
config,
|
|
449
|
-
"GET",
|
|
450
|
-
`/actors?name=${encodeURIComponent(name)}&key=${encodeURIComponent(serializedKey)}`
|
|
451
|
-
);
|
|
452
|
-
}
|
|
453
|
-
async function listActorsByName(config, name) {
|
|
454
|
-
return apiCall(
|
|
455
|
-
config,
|
|
456
|
-
"GET",
|
|
457
|
-
`/actors?name=${encodeURIComponent(name)}`
|
|
458
|
-
);
|
|
459
|
-
}
|
|
460
|
-
async function getOrCreateActor(config, request) {
|
|
461
|
-
return apiCall(
|
|
462
|
-
config,
|
|
463
|
-
"PUT",
|
|
464
|
-
`/actors`,
|
|
465
|
-
request
|
|
466
|
-
);
|
|
467
|
-
}
|
|
468
|
-
async function createActor(config, request) {
|
|
469
|
-
return apiCall(
|
|
470
|
-
config,
|
|
471
|
-
"POST",
|
|
472
|
-
`/actors`,
|
|
473
|
-
request
|
|
474
|
-
);
|
|
475
|
-
}
|
|
476
|
-
async function destroyActor(config, actorId) {
|
|
477
|
-
return apiCall(
|
|
478
|
-
config,
|
|
479
|
-
"DELETE",
|
|
480
|
-
`/actors/${encodeURIComponent(actorId)}`
|
|
481
|
-
);
|
|
482
|
-
}
|
|
483
|
-
async function getMetadata(config) {
|
|
484
|
-
return apiCall(config, "GET", `/metadata`);
|
|
485
|
-
}
|
|
486
|
-
async function getDatacenters(config) {
|
|
487
|
-
return apiCall(config, "GET", `/datacenters`);
|
|
488
|
-
}
|
|
489
|
-
async function updateRunnerConfig(config, runnerName, request) {
|
|
490
|
-
return apiCall(
|
|
491
|
-
config,
|
|
492
|
-
"PUT",
|
|
493
|
-
`/runner-configs/${runnerName}`,
|
|
494
|
-
request
|
|
495
|
-
);
|
|
496
|
-
}
|
|
497
|
-
async function kvGet(config, actorId, key) {
|
|
498
|
-
return apiCall(
|
|
499
|
-
config,
|
|
500
|
-
"GET",
|
|
501
|
-
`/actors/${encodeURIComponent(actorId)}/kv/keys/${encodeURIComponent(key)}`
|
|
502
|
-
);
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
// src/remote-manager-driver/metadata.ts
|
|
506
|
-
import pRetry from "p-retry";
|
|
507
|
-
var metadataLookupCache = /* @__PURE__ */ new Map();
|
|
508
|
-
async function lookupMetadataCached(config) {
|
|
509
|
-
const endpoint = getEndpoint(config);
|
|
510
|
-
const existingPromise = metadataLookupCache.get(endpoint);
|
|
511
|
-
if (existingPromise) {
|
|
512
|
-
return existingPromise;
|
|
513
|
-
}
|
|
514
|
-
const metadataLookupPromise = pRetry(
|
|
515
|
-
async () => {
|
|
516
|
-
logger3().debug({
|
|
517
|
-
msg: "fetching metadata",
|
|
518
|
-
endpoint
|
|
519
|
-
});
|
|
520
|
-
const metadataData = await getMetadata(config);
|
|
521
|
-
logger3().debug({
|
|
522
|
-
msg: "received metadata",
|
|
523
|
-
endpoint,
|
|
524
|
-
clientEndpoint: metadataData.clientEndpoint
|
|
525
|
-
});
|
|
526
|
-
return metadataData;
|
|
527
|
-
},
|
|
528
|
-
{
|
|
529
|
-
forever: true,
|
|
530
|
-
minTimeout: 500,
|
|
531
|
-
maxTimeout: 15e3,
|
|
532
|
-
onFailedAttempt: (error) => {
|
|
533
|
-
if (error.attemptNumber > 1) {
|
|
534
|
-
logger3().warn({
|
|
535
|
-
msg: "failed to fetch metadata, retrying",
|
|
536
|
-
endpoint,
|
|
537
|
-
attempt: error.attemptNumber,
|
|
538
|
-
error: stringifyError(error)
|
|
539
|
-
});
|
|
540
|
-
}
|
|
541
|
-
}
|
|
458
|
+
try {
|
|
459
|
+
const { actorId } = await queryActor(void 0, actorQuery, driver);
|
|
460
|
+
logger().debug({ msg: "found actor for raw http", actorId });
|
|
461
|
+
invariant2(actorId, "Missing actor ID");
|
|
462
|
+
const normalizedPath = path.startsWith("/") ? path.slice(1) : path;
|
|
463
|
+
const url = new URL(`http://actor/request/${normalizedPath}`);
|
|
464
|
+
const proxyRequestHeaders = new Headers(mergedInit.headers);
|
|
465
|
+
if (params) {
|
|
466
|
+
proxyRequestHeaders.set(HEADER_CONN_PARAMS, JSON.stringify(params));
|
|
542
467
|
}
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
468
|
+
const proxyRequest = new Request(url, {
|
|
469
|
+
...mergedInit,
|
|
470
|
+
headers: proxyRequestHeaders
|
|
471
|
+
});
|
|
472
|
+
return driver.sendRequest(actorId, proxyRequest);
|
|
473
|
+
} catch (err) {
|
|
474
|
+
const { group, code, message, metadata } = deconstructError(
|
|
475
|
+
err,
|
|
476
|
+
logger(),
|
|
477
|
+
{},
|
|
478
|
+
true
|
|
479
|
+
);
|
|
480
|
+
throw new ActorError(group, code, message, metadata);
|
|
481
|
+
}
|
|
546
482
|
}
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
});
|
|
609
|
-
state.targetWs.addEventListener("error", (error) => {
|
|
610
|
-
logger3().error({
|
|
611
|
-
msg: "target websocket error",
|
|
612
|
-
targetUrl,
|
|
613
|
-
error: stringifyError(error)
|
|
614
|
-
});
|
|
615
|
-
closeWebSocketIfOpen(clientWs, 1011, "Target WebSocket error");
|
|
616
|
-
});
|
|
617
|
-
},
|
|
618
|
-
onMessage: async (event, clientWs) => {
|
|
619
|
-
if (!state.targetWs || !state.connectPromise) {
|
|
620
|
-
logger3().error({
|
|
621
|
-
msg: "websocket state not initialized",
|
|
622
|
-
targetUrl
|
|
623
|
-
});
|
|
624
|
-
return;
|
|
625
|
-
}
|
|
626
|
-
try {
|
|
627
|
-
await state.connectPromise;
|
|
628
|
-
if (state.targetWs.readyState === WebSocket2.OPEN) {
|
|
629
|
-
state.targetWs.send(event.data);
|
|
630
|
-
} else {
|
|
631
|
-
logger3().warn({
|
|
632
|
-
msg: "target websocket not open",
|
|
633
|
-
targetUrl,
|
|
634
|
-
readyState: state.targetWs.readyState
|
|
635
|
-
});
|
|
636
|
-
}
|
|
637
|
-
} catch (error) {
|
|
638
|
-
logger3().error({
|
|
639
|
-
msg: "failed to connect to target websocket",
|
|
640
|
-
targetUrl,
|
|
641
|
-
error
|
|
642
|
-
});
|
|
643
|
-
closeWebSocketIfOpen(
|
|
644
|
-
clientWs,
|
|
645
|
-
1011,
|
|
646
|
-
"Failed to connect to target"
|
|
483
|
+
async function rawWebSocket(driver, actorQuery, params, path, protocols) {
|
|
484
|
+
const encoding = "bare";
|
|
485
|
+
const { actorId } = await queryActor(void 0, actorQuery, driver);
|
|
486
|
+
logger().debug({ msg: "found actor for action", actorId });
|
|
487
|
+
invariant2(actorId, "Missing actor ID");
|
|
488
|
+
let pathPortion = "";
|
|
489
|
+
let queryPortion = "";
|
|
490
|
+
if (path) {
|
|
491
|
+
const queryIndex = path.indexOf("?");
|
|
492
|
+
if (queryIndex !== -1) {
|
|
493
|
+
pathPortion = path.substring(0, queryIndex);
|
|
494
|
+
queryPortion = path.substring(queryIndex);
|
|
495
|
+
} else {
|
|
496
|
+
pathPortion = path;
|
|
497
|
+
}
|
|
498
|
+
if (pathPortion.startsWith("/")) {
|
|
499
|
+
pathPortion = pathPortion.slice(1);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
const fullPath = `${PATH_WEBSOCKET_PREFIX}${pathPortion}${queryPortion}`;
|
|
503
|
+
logger().debug({
|
|
504
|
+
msg: "opening websocket",
|
|
505
|
+
actorId,
|
|
506
|
+
encoding,
|
|
507
|
+
path: fullPath
|
|
508
|
+
});
|
|
509
|
+
const ws = await driver.openWebSocket(fullPath, actorId, encoding, params);
|
|
510
|
+
return ws;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// src/client/actor-handle.ts
|
|
514
|
+
var ActorHandleRaw = class {
|
|
515
|
+
#client;
|
|
516
|
+
#driver;
|
|
517
|
+
#encoding;
|
|
518
|
+
#actorQuery;
|
|
519
|
+
#params;
|
|
520
|
+
#getParams;
|
|
521
|
+
#queueSender;
|
|
522
|
+
/**
|
|
523
|
+
* Do not call this directly.
|
|
524
|
+
*
|
|
525
|
+
* Creates an instance of ActorHandleRaw.
|
|
526
|
+
*
|
|
527
|
+
* @protected
|
|
528
|
+
*/
|
|
529
|
+
constructor(client, driver, params, getParams, encoding, actorQuery) {
|
|
530
|
+
this.#client = client;
|
|
531
|
+
this.#driver = driver;
|
|
532
|
+
this.#encoding = encoding;
|
|
533
|
+
this.#actorQuery = actorQuery;
|
|
534
|
+
this.#params = params;
|
|
535
|
+
this.#getParams = getParams;
|
|
536
|
+
this.#queueSender = createQueueSender({
|
|
537
|
+
encoding: this.#encoding,
|
|
538
|
+
params: this.#params,
|
|
539
|
+
customFetch: async (request) => {
|
|
540
|
+
const { actorId } = await queryActor(
|
|
541
|
+
void 0,
|
|
542
|
+
this.#actorQuery,
|
|
543
|
+
this.#driver
|
|
647
544
|
);
|
|
545
|
+
return this.#driver.sendRequest(actorId, request);
|
|
648
546
|
}
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
async #resolveConnectionParams() {
|
|
550
|
+
if (this.#getParams) {
|
|
551
|
+
return await this.#getParams();
|
|
552
|
+
}
|
|
553
|
+
return this.#params;
|
|
554
|
+
}
|
|
555
|
+
send(name, body, options) {
|
|
556
|
+
return this.#queueSender.send(name, body, options);
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Call a raw action. This method sends an HTTP request to invoke the named action.
|
|
560
|
+
*
|
|
561
|
+
* @see {@link ActorHandle}
|
|
562
|
+
* @template Args - The type of arguments to pass to the action function.
|
|
563
|
+
* @template Response - The type of the response returned by the action function.
|
|
564
|
+
*/
|
|
565
|
+
async action(opts) {
|
|
566
|
+
let actorId;
|
|
567
|
+
try {
|
|
568
|
+
const result = await queryActor(
|
|
569
|
+
void 0,
|
|
570
|
+
this.#actorQuery,
|
|
571
|
+
this.#driver
|
|
572
|
+
);
|
|
573
|
+
actorId = result.actorId;
|
|
574
|
+
logger().debug({ msg: "found actor for action", actorId });
|
|
575
|
+
invariant3(actorId, "Missing actor ID");
|
|
576
|
+
logger().debug({
|
|
577
|
+
msg: "handling action",
|
|
578
|
+
name: opts.name,
|
|
579
|
+
encoding: this.#encoding
|
|
657
580
|
});
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
)
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
581
|
+
const responseData = await sendHttpRequest({
|
|
582
|
+
url: `http://actor/action/${encodeURIComponent(opts.name)}`,
|
|
583
|
+
method: "POST",
|
|
584
|
+
headers: {
|
|
585
|
+
[HEADER_ENCODING]: this.#encoding,
|
|
586
|
+
...this.#params !== void 0 ? { [HEADER_CONN_PARAMS]: JSON.stringify(this.#params) } : {}
|
|
587
|
+
},
|
|
588
|
+
body: opts.args,
|
|
589
|
+
encoding: this.#encoding,
|
|
590
|
+
customFetch: this.#driver.sendRequest.bind(
|
|
591
|
+
this.#driver,
|
|
592
|
+
actorId
|
|
593
|
+
),
|
|
594
|
+
signal: opts == null ? void 0 : opts.signal,
|
|
595
|
+
requestVersion: CURRENT_VERSION,
|
|
596
|
+
requestVersionedDataHandler: HTTP_ACTION_REQUEST_VERSIONED,
|
|
597
|
+
responseVersion: CURRENT_VERSION,
|
|
598
|
+
responseVersionedDataHandler: HTTP_ACTION_RESPONSE_VERSIONED,
|
|
599
|
+
requestZodSchema: HttpActionRequestSchema,
|
|
600
|
+
responseZodSchema: HttpActionResponseSchema,
|
|
601
|
+
// JSON Request: args is the raw value
|
|
602
|
+
requestToJson: (args) => ({
|
|
603
|
+
args
|
|
604
|
+
}),
|
|
605
|
+
// BARE Request: args needs to be CBOR-encoded
|
|
606
|
+
requestToBare: (args) => ({
|
|
607
|
+
args: bufferToArrayBuffer(cbor3.encode(args))
|
|
608
|
+
}),
|
|
609
|
+
// JSON Response: output is the raw value
|
|
610
|
+
responseFromJson: (json) => json.output,
|
|
611
|
+
// BARE Response: output is ArrayBuffer that needs CBOR-decoding
|
|
612
|
+
responseFromBare: (bare) => cbor3.decode(new Uint8Array(bare.output))
|
|
613
|
+
});
|
|
614
|
+
return responseData;
|
|
615
|
+
} catch (err) {
|
|
616
|
+
const { group, code, message, metadata } = deconstructError(
|
|
617
|
+
err,
|
|
618
|
+
logger(),
|
|
619
|
+
{},
|
|
620
|
+
true
|
|
621
|
+
);
|
|
622
|
+
if (actorId && isSchedulingError(group, code)) {
|
|
623
|
+
const schedulingError = await checkForSchedulingError(
|
|
624
|
+
group,
|
|
625
|
+
code,
|
|
626
|
+
actorId,
|
|
627
|
+
this.#actorQuery,
|
|
628
|
+
this.#driver
|
|
629
|
+
);
|
|
630
|
+
if (schedulingError) {
|
|
631
|
+
throw schedulingError;
|
|
674
632
|
}
|
|
675
633
|
}
|
|
634
|
+
throw new ActorError(group, code, message, metadata);
|
|
676
635
|
}
|
|
677
|
-
};
|
|
678
|
-
}
|
|
679
|
-
function closeWebSocketIfOpen(ws, code, reason) {
|
|
680
|
-
if (ws.readyState === 1) {
|
|
681
|
-
ws.close(code, reason);
|
|
682
|
-
} else if ("close" in ws && ws.readyState === WebSocket.OPEN) {
|
|
683
|
-
ws.close(code, reason);
|
|
684
636
|
}
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
637
|
+
/**
|
|
638
|
+
* Establishes a persistent connection to the actor.
|
|
639
|
+
*
|
|
640
|
+
* @template AD The actor class that this connection is for.
|
|
641
|
+
* @returns {ActorConn<AD>} A connection to the actor.
|
|
642
|
+
*/
|
|
643
|
+
connect() {
|
|
644
|
+
logger().debug({
|
|
645
|
+
msg: "establishing connection from handle",
|
|
646
|
+
query: this.#actorQuery
|
|
647
|
+
});
|
|
648
|
+
const conn = new ActorConnRaw(
|
|
649
|
+
this.#client,
|
|
650
|
+
this.#driver,
|
|
651
|
+
this.#params,
|
|
652
|
+
this.#getParams,
|
|
653
|
+
this.#encoding,
|
|
654
|
+
this.#actorQuery
|
|
655
|
+
);
|
|
656
|
+
return this.#client[CREATE_ACTOR_CONN_PROXY](
|
|
657
|
+
conn
|
|
658
|
+
);
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* Fetches a resource from this actor via the /request endpoint. This is a
|
|
662
|
+
* convenience wrapper around the raw HTTP API.
|
|
663
|
+
*/
|
|
664
|
+
fetch(input, init) {
|
|
665
|
+
return rawHttpFetch(
|
|
666
|
+
this.#driver,
|
|
667
|
+
this.#actorQuery,
|
|
668
|
+
this.#params,
|
|
669
|
+
input,
|
|
670
|
+
init
|
|
671
|
+
);
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Opens a raw WebSocket connection to this actor.
|
|
675
|
+
*/
|
|
676
|
+
async webSocket(path, protocols) {
|
|
677
|
+
const params = await this.#resolveConnectionParams();
|
|
678
|
+
return rawWebSocket(
|
|
679
|
+
this.#driver,
|
|
680
|
+
this.#actorQuery,
|
|
681
|
+
params,
|
|
682
|
+
path,
|
|
683
|
+
protocols
|
|
684
|
+
);
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Resolves the actor to get its unique actor ID.
|
|
688
|
+
*/
|
|
689
|
+
async resolve() {
|
|
690
|
+
if ("getForKey" in this.#actorQuery) {
|
|
691
|
+
const name = this.#actorQuery.getForKey.name;
|
|
692
|
+
const { actorId } = await queryActor(
|
|
693
|
+
void 0,
|
|
694
|
+
this.#actorQuery,
|
|
695
|
+
this.#driver
|
|
695
696
|
);
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
this.#
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
if (metadataData.clientNamespace) {
|
|
705
|
-
this.#config.namespace = metadataData.clientNamespace;
|
|
706
|
-
}
|
|
707
|
-
if (metadataData.clientToken) {
|
|
708
|
-
this.#config.token = metadataData.clientToken;
|
|
709
|
-
}
|
|
710
|
-
logger3().info({
|
|
711
|
-
msg: "overriding client endpoint",
|
|
712
|
-
endpoint: metadataData.clientEndpoint,
|
|
713
|
-
namespace: metadataData.clientNamespace,
|
|
714
|
-
token: metadataData.clientToken
|
|
715
|
-
});
|
|
716
|
-
}
|
|
717
|
-
logger3().info({
|
|
718
|
-
msg: "connected to rivetkit manager",
|
|
719
|
-
runtime: metadataData.runtime,
|
|
720
|
-
version: metadataData.version,
|
|
721
|
-
runner: metadataData.runner
|
|
722
|
-
});
|
|
723
|
-
}
|
|
697
|
+
this.#actorQuery = { getForId: { actorId, name } };
|
|
698
|
+
return actorId;
|
|
699
|
+
} else if ("getOrCreateForKey" in this.#actorQuery) {
|
|
700
|
+
const name = this.#actorQuery.getOrCreateForKey.name;
|
|
701
|
+
const { actorId } = await queryActor(
|
|
702
|
+
void 0,
|
|
703
|
+
this.#actorQuery,
|
|
704
|
+
this.#driver
|
|
724
705
|
);
|
|
706
|
+
this.#actorQuery = { getForId: { actorId, name } };
|
|
707
|
+
return actorId;
|
|
708
|
+
} else if ("getForId" in this.#actorQuery) {
|
|
709
|
+
return this.#actorQuery.getForId.actorId;
|
|
710
|
+
} else if ("create" in this.#actorQuery) {
|
|
711
|
+
invariant3(false, "actorQuery cannot be create");
|
|
712
|
+
} else {
|
|
713
|
+
assertUnreachable2(this.#actorQuery);
|
|
725
714
|
}
|
|
726
715
|
}
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
if (!actor) return void 0;
|
|
738
|
-
if (actor.name !== name) {
|
|
739
|
-
logger3().debug({
|
|
740
|
-
msg: "actor name mismatch from api",
|
|
741
|
-
actorId,
|
|
742
|
-
apiName: actor.name,
|
|
743
|
-
requestedName: name
|
|
744
|
-
});
|
|
745
|
-
return void 0;
|
|
746
|
-
}
|
|
747
|
-
return apiActorToOutput(actor);
|
|
716
|
+
/**
|
|
717
|
+
* Returns the raw URL for routing traffic to the actor.
|
|
718
|
+
*/
|
|
719
|
+
async getGatewayUrl() {
|
|
720
|
+
const { actorId } = await queryActor(
|
|
721
|
+
void 0,
|
|
722
|
+
this.#actorQuery,
|
|
723
|
+
this.#driver
|
|
724
|
+
);
|
|
725
|
+
return await this.#driver.buildGatewayUrl(actorId);
|
|
748
726
|
}
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
name,
|
|
766
|
-
key
|
|
767
|
-
});
|
|
768
|
-
return apiActorToOutput(actor);
|
|
769
|
-
} catch (error) {
|
|
770
|
-
if (error instanceof EngineApiError && error.group === "actor" && error.code === "not_found") {
|
|
771
|
-
return void 0;
|
|
772
|
-
}
|
|
773
|
-
throw error;
|
|
774
|
-
}
|
|
727
|
+
};
|
|
728
|
+
|
|
729
|
+
// src/client/client.ts
|
|
730
|
+
var ACTOR_CONNS_SYMBOL = /* @__PURE__ */ Symbol("actorConns");
|
|
731
|
+
var CREATE_ACTOR_CONN_PROXY = /* @__PURE__ */ Symbol("createActorConnProxy");
|
|
732
|
+
var ClientRaw = class {
|
|
733
|
+
#disposed = false;
|
|
734
|
+
[ACTOR_CONNS_SYMBOL] = /* @__PURE__ */ new Set();
|
|
735
|
+
#driver;
|
|
736
|
+
#encodingKind;
|
|
737
|
+
/**
|
|
738
|
+
* Creates an instance of Client.
|
|
739
|
+
*/
|
|
740
|
+
constructor(driver, encoding) {
|
|
741
|
+
this.#driver = driver;
|
|
742
|
+
this.#encodingKind = encoding ?? "bare";
|
|
775
743
|
}
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
name,
|
|
789
|
-
key: serializeActorKey(key),
|
|
790
|
-
runner_name_selector: this.#config.runnerName,
|
|
791
|
-
input: actorInput ? uint8ArrayToBase64(cbor2.encode(actorInput)) : void 0,
|
|
792
|
-
crash_policy: "sleep"
|
|
793
|
-
});
|
|
794
|
-
logger3().info({
|
|
795
|
-
msg: "getOrCreateWithKey: actor ready",
|
|
796
|
-
actorId: actor.actor_id,
|
|
744
|
+
/**
|
|
745
|
+
* Gets a stateless handle to a actor by its ID.
|
|
746
|
+
*
|
|
747
|
+
* @template AD The actor class that this handle is for.
|
|
748
|
+
* @param {string} name - The name of the actor.
|
|
749
|
+
* @param {string} actorId - The ID of the actor.
|
|
750
|
+
* @param {GetWithIdOptions} [opts] - Options for getting the actor.
|
|
751
|
+
* @returns {ActorHandle<AD>} - A handle to the actor.
|
|
752
|
+
*/
|
|
753
|
+
getForId(name, actorId, opts) {
|
|
754
|
+
logger().debug({
|
|
755
|
+
msg: "get handle to actor with id",
|
|
797
756
|
name,
|
|
798
|
-
|
|
799
|
-
|
|
757
|
+
actorId,
|
|
758
|
+
params: opts == null ? void 0 : opts.params
|
|
800
759
|
});
|
|
801
|
-
|
|
760
|
+
const actorQuery = {
|
|
761
|
+
getForId: {
|
|
762
|
+
name,
|
|
763
|
+
actorId
|
|
764
|
+
}
|
|
765
|
+
};
|
|
766
|
+
const handle = this.#createHandle(
|
|
767
|
+
opts == null ? void 0 : opts.params,
|
|
768
|
+
opts == null ? void 0 : opts.getParams,
|
|
769
|
+
actorQuery
|
|
770
|
+
);
|
|
771
|
+
return createActorProxy(handle);
|
|
802
772
|
}
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
name,
|
|
817
|
-
runner_name_selector: this.#config.runnerName,
|
|
818
|
-
key: serializeActorKey(key),
|
|
819
|
-
input: input ? uint8ArrayToBase64(cbor2.encode(input)) : void 0,
|
|
820
|
-
crash_policy: "sleep"
|
|
821
|
-
});
|
|
822
|
-
logger3().info({
|
|
823
|
-
msg: "actor created",
|
|
824
|
-
actorId: result.actor.actor_id,
|
|
773
|
+
/**
|
|
774
|
+
* Gets a stateless handle to a actor by its key, but does not create the actor if it doesn't exist.
|
|
775
|
+
*
|
|
776
|
+
* @template AD The actor class that this handle is for.
|
|
777
|
+
* @param {string} name - The name of the actor.
|
|
778
|
+
* @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.
|
|
779
|
+
* @param {GetWithIdOptions} [opts] - Options for getting the actor.
|
|
780
|
+
* @returns {ActorHandle<AD>} - A handle to the actor.
|
|
781
|
+
*/
|
|
782
|
+
get(name, key, opts) {
|
|
783
|
+
const keyArray = typeof key === "string" ? [key] : key || [];
|
|
784
|
+
logger().debug({
|
|
785
|
+
msg: "get handle to actor",
|
|
825
786
|
name,
|
|
826
|
-
key
|
|
787
|
+
key: keyArray,
|
|
788
|
+
parameters: opts == null ? void 0 : opts.params
|
|
827
789
|
});
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
async destroyActor(actorId) {
|
|
839
|
-
if (this.#metadataPromise) {
|
|
840
|
-
await this.#metadataPromise;
|
|
841
|
-
}
|
|
842
|
-
logger3().info({ msg: "destroying actor via engine api", actorId });
|
|
843
|
-
await destroyActor(this.#config, actorId);
|
|
844
|
-
logger3().info({ msg: "actor destroyed", actorId });
|
|
845
|
-
}
|
|
846
|
-
async sendRequest(actorId, actorRequest) {
|
|
847
|
-
if (this.#metadataPromise) {
|
|
848
|
-
await this.#metadataPromise;
|
|
849
|
-
}
|
|
850
|
-
return await sendHttpRequestToActor(
|
|
851
|
-
this.#config,
|
|
852
|
-
actorId,
|
|
853
|
-
actorRequest
|
|
790
|
+
const actorQuery = {
|
|
791
|
+
getForKey: {
|
|
792
|
+
name,
|
|
793
|
+
key: keyArray
|
|
794
|
+
}
|
|
795
|
+
};
|
|
796
|
+
const handle = this.#createHandle(
|
|
797
|
+
opts == null ? void 0 : opts.params,
|
|
798
|
+
opts == null ? void 0 : opts.getParams,
|
|
799
|
+
actorQuery
|
|
854
800
|
);
|
|
801
|
+
return createActorProxy(handle);
|
|
855
802
|
}
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
803
|
+
/**
|
|
804
|
+
* Gets a stateless handle to a actor by its key, creating it if necessary.
|
|
805
|
+
*
|
|
806
|
+
* @template AD The actor class that this handle is for.
|
|
807
|
+
* @param {string} name - The name of the actor.
|
|
808
|
+
* @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.
|
|
809
|
+
* @param {GetOptions} [opts] - Options for getting the actor.
|
|
810
|
+
* @returns {ActorHandle<AD>} - A handle to the actor.
|
|
811
|
+
*/
|
|
812
|
+
getOrCreate(name, key, opts) {
|
|
813
|
+
const keyArray = typeof key === "string" ? [key] : key || [];
|
|
814
|
+
logger().debug({
|
|
815
|
+
msg: "get or create handle to actor",
|
|
816
|
+
name,
|
|
817
|
+
key: keyArray,
|
|
818
|
+
parameters: opts == null ? void 0 : opts.params,
|
|
819
|
+
createInRegion: opts == null ? void 0 : opts.createInRegion
|
|
820
|
+
});
|
|
821
|
+
const actorQuery = {
|
|
822
|
+
getOrCreateForKey: {
|
|
823
|
+
name,
|
|
824
|
+
key: keyArray,
|
|
825
|
+
input: opts == null ? void 0 : opts.createWithInput,
|
|
826
|
+
region: opts == null ? void 0 : opts.createInRegion
|
|
827
|
+
}
|
|
828
|
+
};
|
|
829
|
+
const handle = this.#createHandle(
|
|
830
|
+
opts == null ? void 0 : opts.params,
|
|
831
|
+
opts == null ? void 0 : opts.getParams,
|
|
832
|
+
actorQuery
|
|
866
833
|
);
|
|
834
|
+
return createActorProxy(handle);
|
|
867
835
|
}
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
836
|
+
/**
|
|
837
|
+
* Creates a new actor with the provided key and returns a stateless handle to it.
|
|
838
|
+
* Resolves the actor ID and returns a handle with getForId query.
|
|
839
|
+
*
|
|
840
|
+
* @template AD The actor class that this handle is for.
|
|
841
|
+
* @param {string} name - The name of the actor.
|
|
842
|
+
* @param {string | string[]} key - The key to identify the actor. Can be a single string or an array of strings.
|
|
843
|
+
* @param {CreateOptions} [opts] - Options for creating the actor (excluding name and key).
|
|
844
|
+
* @returns {Promise<ActorHandle<AD>>} - A promise that resolves to a handle to the actor.
|
|
845
|
+
*/
|
|
846
|
+
async create(name, key, opts) {
|
|
847
|
+
const keyArray = typeof key === "string" ? [key] : key || [];
|
|
848
|
+
const createQuery = {
|
|
849
|
+
create: {
|
|
850
|
+
...opts,
|
|
851
|
+
// Do these last to override `opts`
|
|
852
|
+
name,
|
|
853
|
+
key: keyArray
|
|
854
|
+
}
|
|
855
|
+
};
|
|
856
|
+
logger().debug({
|
|
857
|
+
msg: "create actor handle",
|
|
858
|
+
name,
|
|
859
|
+
key: keyArray,
|
|
860
|
+
parameters: opts == null ? void 0 : opts.params,
|
|
861
|
+
create: createQuery.create
|
|
862
|
+
});
|
|
863
|
+
const { actorId } = await queryActor(
|
|
864
|
+
void 0,
|
|
865
|
+
createQuery,
|
|
866
|
+
this.#driver
|
|
883
867
|
);
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
}
|
|
890
|
-
const upgradeWebSocket = (_b = (_a = this.#config).getUpgradeWebSocket) == null ? void 0 : _b.call(_a);
|
|
891
|
-
invariant2(upgradeWebSocket, "missing getUpgradeWebSocket");
|
|
892
|
-
const endpoint = getEndpoint(this.#config);
|
|
893
|
-
const guardUrl = combineUrlPath(endpoint, path);
|
|
894
|
-
const wsGuardUrl = guardUrl.replace("http://", "ws://");
|
|
895
|
-
logger3().debug({
|
|
896
|
-
msg: "forwarding websocket to actor via guard",
|
|
897
|
-
actorId,
|
|
898
|
-
path,
|
|
899
|
-
guardUrl
|
|
868
|
+
logger().debug({
|
|
869
|
+
msg: "created actor with ID",
|
|
870
|
+
name,
|
|
871
|
+
key: keyArray,
|
|
872
|
+
actorId
|
|
900
873
|
});
|
|
901
|
-
const
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
874
|
+
const getForIdQuery = {
|
|
875
|
+
getForId: {
|
|
876
|
+
name,
|
|
877
|
+
actorId
|
|
878
|
+
}
|
|
879
|
+
};
|
|
880
|
+
const handle = this.#createHandle(
|
|
881
|
+
opts == null ? void 0 : opts.params,
|
|
882
|
+
opts == null ? void 0 : opts.getParams,
|
|
883
|
+
getForIdQuery
|
|
905
884
|
);
|
|
906
|
-
const
|
|
907
|
-
return
|
|
885
|
+
const proxy = createActorProxy(handle);
|
|
886
|
+
return proxy;
|
|
908
887
|
}
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
this.#
|
|
916
|
-
|
|
917
|
-
new TextDecoder("utf8").decode(key)
|
|
888
|
+
#createHandle(params, getParams, actorQuery) {
|
|
889
|
+
return new ActorHandleRaw(
|
|
890
|
+
this,
|
|
891
|
+
this.#driver,
|
|
892
|
+
params,
|
|
893
|
+
getParams,
|
|
894
|
+
this.#encodingKind,
|
|
895
|
+
actorQuery
|
|
918
896
|
);
|
|
919
|
-
return response.value;
|
|
920
|
-
}
|
|
921
|
-
displayInformation() {
|
|
922
|
-
return { properties: {} };
|
|
923
897
|
}
|
|
924
|
-
|
|
925
|
-
this
|
|
898
|
+
[CREATE_ACTOR_CONN_PROXY](conn) {
|
|
899
|
+
this[ACTOR_CONNS_SYMBOL].add(conn);
|
|
900
|
+
conn[CONNECT_SYMBOL]();
|
|
901
|
+
return createActorProxy(conn);
|
|
926
902
|
}
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
sleepTs: actor.sleep_ts ?? null,
|
|
937
|
-
destroyTs: actor.destroy_ts ?? null,
|
|
938
|
-
error: actor.error ?? void 0
|
|
939
|
-
};
|
|
940
|
-
}
|
|
941
|
-
|
|
942
|
-
// src/client/actor-conn.ts
|
|
943
|
-
import * as cbor4 from "cbor-x";
|
|
944
|
-
import invariant3 from "invariant";
|
|
945
|
-
import pRetry2 from "p-retry";
|
|
946
|
-
|
|
947
|
-
// src/client/actor-query.ts
|
|
948
|
-
async function queryActor(c, query, managerDriver) {
|
|
949
|
-
logger().debug({ msg: "querying actor", query: JSON.stringify(query) });
|
|
950
|
-
let actorOutput;
|
|
951
|
-
if ("getForId" in query) {
|
|
952
|
-
const output = await managerDriver.getForId({
|
|
953
|
-
c,
|
|
954
|
-
name: query.getForId.name,
|
|
955
|
-
actorId: query.getForId.actorId
|
|
956
|
-
});
|
|
957
|
-
if (!output) throw new ActorNotFound(query.getForId.actorId);
|
|
958
|
-
actorOutput = output;
|
|
959
|
-
} else if ("getForKey" in query) {
|
|
960
|
-
const existingActor = await managerDriver.getWithKey({
|
|
961
|
-
c,
|
|
962
|
-
name: query.getForKey.name,
|
|
963
|
-
key: query.getForKey.key
|
|
964
|
-
});
|
|
965
|
-
if (!existingActor) {
|
|
966
|
-
throw new ActorNotFound(
|
|
967
|
-
`${query.getForKey.name}:${JSON.stringify(query.getForKey.key)}`
|
|
968
|
-
);
|
|
903
|
+
/**
|
|
904
|
+
* Disconnects from all actors.
|
|
905
|
+
*
|
|
906
|
+
* @returns {Promise<void>} A promise that resolves when all connections are closed.
|
|
907
|
+
*/
|
|
908
|
+
async dispose() {
|
|
909
|
+
if (this.#disposed) {
|
|
910
|
+
logger().warn({ msg: "client already disconnected" });
|
|
911
|
+
return;
|
|
969
912
|
}
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
const
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
key: query.getOrCreateForKey.key,
|
|
976
|
-
input: query.getOrCreateForKey.input,
|
|
977
|
-
region: query.getOrCreateForKey.region
|
|
978
|
-
});
|
|
979
|
-
actorOutput = {
|
|
980
|
-
actorId: getOrCreateOutput.actorId
|
|
981
|
-
};
|
|
982
|
-
} else if ("create" in query) {
|
|
983
|
-
const createOutput = await managerDriver.createActor({
|
|
984
|
-
c,
|
|
985
|
-
name: query.create.name,
|
|
986
|
-
key: query.create.key,
|
|
987
|
-
input: query.create.input,
|
|
988
|
-
region: query.create.region
|
|
989
|
-
});
|
|
990
|
-
actorOutput = {
|
|
991
|
-
actorId: createOutput.actorId
|
|
992
|
-
};
|
|
993
|
-
} else {
|
|
994
|
-
throw new InvalidRequest("Invalid query format");
|
|
995
|
-
}
|
|
996
|
-
logger().debug({ msg: "actor query result", actorId: actorOutput.actorId });
|
|
997
|
-
return { actorId: actorOutput.actorId };
|
|
998
|
-
}
|
|
999
|
-
function getActorNameFromQuery(query) {
|
|
1000
|
-
if ("getForId" in query) return query.getForId.name;
|
|
1001
|
-
if ("getForKey" in query) return query.getForKey.name;
|
|
1002
|
-
if ("getOrCreateForKey" in query) return query.getOrCreateForKey.name;
|
|
1003
|
-
if ("create" in query) return query.create.name;
|
|
1004
|
-
throw new InvalidRequest("Invalid query format");
|
|
1005
|
-
}
|
|
1006
|
-
async function checkForSchedulingError(group, code, actorId, query, driver) {
|
|
1007
|
-
const name = getActorNameFromQuery(query);
|
|
1008
|
-
try {
|
|
1009
|
-
const actor = await driver.getForId({ name, actorId });
|
|
1010
|
-
if (actor == null ? void 0 : actor.error) {
|
|
1011
|
-
logger().info({
|
|
1012
|
-
msg: "found actor scheduling error",
|
|
1013
|
-
actorId,
|
|
1014
|
-
error: actor.error
|
|
1015
|
-
});
|
|
1016
|
-
return new ActorSchedulingError(group, code, actorId, actor.error);
|
|
913
|
+
this.#disposed = true;
|
|
914
|
+
logger().debug({ msg: "disposing client" });
|
|
915
|
+
const disposePromises = [];
|
|
916
|
+
for (const conn of this[ACTOR_CONNS_SYMBOL].values()) {
|
|
917
|
+
disposePromises.push(conn.dispose());
|
|
1017
918
|
}
|
|
1018
|
-
|
|
1019
|
-
logger().warn({
|
|
1020
|
-
msg: "failed to fetch actor details for scheduling error check",
|
|
1021
|
-
actorId,
|
|
1022
|
-
error: stringifyError(err)
|
|
1023
|
-
});
|
|
919
|
+
await Promise.all(disposePromises);
|
|
1024
920
|
}
|
|
1025
|
-
|
|
921
|
+
};
|
|
922
|
+
function createClientWithDriver(driver, config = {}) {
|
|
923
|
+
const client = new ClientRaw(driver, config.encoding);
|
|
924
|
+
return new Proxy(client, {
|
|
925
|
+
get: (target, prop, receiver) => {
|
|
926
|
+
if (typeof prop === "symbol" || prop in target) {
|
|
927
|
+
const value = Reflect.get(target, prop, receiver);
|
|
928
|
+
if (typeof value === "function") {
|
|
929
|
+
return value.bind(target);
|
|
930
|
+
}
|
|
931
|
+
return value;
|
|
932
|
+
}
|
|
933
|
+
if (typeof prop === "string") {
|
|
934
|
+
return {
|
|
935
|
+
// Handle methods (stateless action)
|
|
936
|
+
get: (key, opts) => {
|
|
937
|
+
return target.get(prop, key, opts);
|
|
938
|
+
},
|
|
939
|
+
getOrCreate: (key, opts) => {
|
|
940
|
+
return target.getOrCreate(prop, key, opts);
|
|
941
|
+
},
|
|
942
|
+
getForId: (actorId, opts) => {
|
|
943
|
+
return target.getForId(prop, actorId, opts);
|
|
944
|
+
},
|
|
945
|
+
create: async (key, opts = {}) => {
|
|
946
|
+
return await target.create(prop, key, opts);
|
|
947
|
+
}
|
|
948
|
+
};
|
|
949
|
+
}
|
|
950
|
+
return void 0;
|
|
951
|
+
}
|
|
952
|
+
});
|
|
1026
953
|
}
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
[HEADER_ENCODING]: senderOptions.encoding,
|
|
1039
|
-
...senderOptions.params !== void 0 ? {
|
|
1040
|
-
[HEADER_CONN_PARAMS]: JSON.stringify(
|
|
1041
|
-
senderOptions.params
|
|
1042
|
-
)
|
|
1043
|
-
} : {}
|
|
1044
|
-
},
|
|
1045
|
-
body: { body, wait, timeout },
|
|
1046
|
-
encoding: senderOptions.encoding,
|
|
1047
|
-
customFetch: senderOptions.customFetch,
|
|
1048
|
-
signal: options == null ? void 0 : options.signal,
|
|
1049
|
-
requestVersion: CURRENT_VERSION,
|
|
1050
|
-
requestVersionedDataHandler: HTTP_QUEUE_SEND_REQUEST_VERSIONED,
|
|
1051
|
-
responseVersion: CURRENT_VERSION,
|
|
1052
|
-
responseVersionedDataHandler: HTTP_QUEUE_SEND_RESPONSE_VERSIONED,
|
|
1053
|
-
requestZodSchema: HttpQueueSendRequestSchema,
|
|
1054
|
-
responseZodSchema: HttpQueueSendResponseSchema,
|
|
1055
|
-
requestToJson: (value) => ({
|
|
1056
|
-
...value,
|
|
1057
|
-
name
|
|
1058
|
-
}),
|
|
1059
|
-
requestToBare: (value) => ({
|
|
1060
|
-
name: value.name ?? name,
|
|
1061
|
-
body: bufferToArrayBuffer(cbor3.encode(value.body)),
|
|
1062
|
-
wait: value.wait ?? false,
|
|
1063
|
-
timeout: value.timeout !== void 0 ? BigInt(value.timeout) : null
|
|
1064
|
-
}),
|
|
1065
|
-
responseFromJson: (json) => {
|
|
1066
|
-
if (json.response === void 0) {
|
|
1067
|
-
return { status: json.status };
|
|
954
|
+
function createActorProxy(handle) {
|
|
955
|
+
const methodCache = /* @__PURE__ */ new Map();
|
|
956
|
+
return new Proxy(handle, {
|
|
957
|
+
get(target, prop, receiver) {
|
|
958
|
+
if (typeof prop === "symbol") {
|
|
959
|
+
return Reflect.get(target, prop, receiver);
|
|
960
|
+
}
|
|
961
|
+
if (prop === "constructor" || prop in target) {
|
|
962
|
+
const value = Reflect.get(target, prop, target);
|
|
963
|
+
if (typeof value === "function") {
|
|
964
|
+
return value.bind(target);
|
|
1068
965
|
}
|
|
1069
|
-
return
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
966
|
+
return value;
|
|
967
|
+
}
|
|
968
|
+
if (typeof prop === "string") {
|
|
969
|
+
if (prop === "then") return void 0;
|
|
970
|
+
let method = methodCache.get(prop);
|
|
971
|
+
if (!method) {
|
|
972
|
+
method = (...args) => target.action({ name: prop, args });
|
|
973
|
+
methodCache.set(prop, method);
|
|
1077
974
|
}
|
|
975
|
+
return method;
|
|
976
|
+
}
|
|
977
|
+
},
|
|
978
|
+
// Support for 'in' operator
|
|
979
|
+
has(target, prop) {
|
|
980
|
+
if (typeof prop === "string") return true;
|
|
981
|
+
return Reflect.has(target, prop);
|
|
982
|
+
},
|
|
983
|
+
// Support instanceof checks
|
|
984
|
+
getPrototypeOf(target) {
|
|
985
|
+
return Reflect.getPrototypeOf(target);
|
|
986
|
+
},
|
|
987
|
+
// Prevent property enumeration of non-existent action methods
|
|
988
|
+
ownKeys(target) {
|
|
989
|
+
return Reflect.ownKeys(target);
|
|
990
|
+
},
|
|
991
|
+
// Support proper property descriptors
|
|
992
|
+
getOwnPropertyDescriptor(target, prop) {
|
|
993
|
+
const targetDescriptor = Reflect.getOwnPropertyDescriptor(
|
|
994
|
+
target,
|
|
995
|
+
prop
|
|
996
|
+
);
|
|
997
|
+
if (targetDescriptor) {
|
|
998
|
+
return targetDescriptor;
|
|
999
|
+
}
|
|
1000
|
+
if (typeof prop === "string") {
|
|
1078
1001
|
return {
|
|
1079
|
-
|
|
1080
|
-
|
|
1002
|
+
configurable: true,
|
|
1003
|
+
enumerable: false,
|
|
1004
|
+
writable: false,
|
|
1005
|
+
value: (...args) => target.action({ name: prop, args })
|
|
1081
1006
|
};
|
|
1082
1007
|
}
|
|
1083
|
-
|
|
1084
|
-
if (wait) {
|
|
1085
|
-
return result;
|
|
1008
|
+
return void 0;
|
|
1086
1009
|
}
|
|
1087
|
-
|
|
1088
|
-
}
|
|
1089
|
-
return {
|
|
1090
|
-
send
|
|
1091
|
-
};
|
|
1010
|
+
});
|
|
1092
1011
|
}
|
|
1093
1012
|
|
|
1094
1013
|
// src/client/actor-conn.ts
|
|
@@ -1123,6 +1042,7 @@ var ActorConnRaw = class {
|
|
|
1123
1042
|
#client;
|
|
1124
1043
|
#driver;
|
|
1125
1044
|
#params;
|
|
1045
|
+
#getParams;
|
|
1126
1046
|
#encoding;
|
|
1127
1047
|
#actorQuery;
|
|
1128
1048
|
// TODO: ws message queue
|
|
@@ -1133,10 +1053,11 @@ var ActorConnRaw = class {
|
|
|
1133
1053
|
*
|
|
1134
1054
|
* @protected
|
|
1135
1055
|
*/
|
|
1136
|
-
constructor(client, driver, params, encoding, actorQuery) {
|
|
1056
|
+
constructor(client, driver, params, getParams, encoding, actorQuery) {
|
|
1137
1057
|
this.#client = client;
|
|
1138
1058
|
this.#driver = driver;
|
|
1139
1059
|
this.#params = params;
|
|
1060
|
+
this.#getParams = getParams;
|
|
1140
1061
|
this.#encoding = encoding;
|
|
1141
1062
|
this.#actorQuery = actorQuery;
|
|
1142
1063
|
this.#queueSender = createQueueSender({
|
|
@@ -1173,7 +1094,12 @@ var ActorConnRaw = class {
|
|
|
1173
1094
|
logger().debug({ msg: "action", name: opts.name, args: opts.args });
|
|
1174
1095
|
const actionId = this.#actionIdCounter;
|
|
1175
1096
|
this.#actionIdCounter += 1;
|
|
1176
|
-
const { promise, resolve, reject } = promiseWithResolvers(
|
|
1097
|
+
const { promise, resolve, reject } = promiseWithResolvers(
|
|
1098
|
+
(reason) => logger().warn({
|
|
1099
|
+
msg: "unhandled action promise rejection",
|
|
1100
|
+
reason
|
|
1101
|
+
})
|
|
1102
|
+
);
|
|
1177
1103
|
this.#actionsInFlight.set(actionId, {
|
|
1178
1104
|
name: opts.name,
|
|
1179
1105
|
resolve,
|
|
@@ -1252,7 +1178,7 @@ var ActorConnRaw = class {
|
|
|
1252
1178
|
}
|
|
1253
1179
|
#connectWithRetry() {
|
|
1254
1180
|
this.#setConnStatus("connecting");
|
|
1255
|
-
|
|
1181
|
+
pRetry(this.#connectAndWait.bind(this), {
|
|
1256
1182
|
forever: true,
|
|
1257
1183
|
minTimeout: 250,
|
|
1258
1184
|
maxTimeout: 3e4,
|
|
@@ -1280,13 +1206,46 @@ var ActorConnRaw = class {
|
|
|
1280
1206
|
try {
|
|
1281
1207
|
if (this.#onOpenPromise)
|
|
1282
1208
|
throw new Error("#onOpenPromise already defined");
|
|
1283
|
-
this.#onOpenPromise = promiseWithResolvers(
|
|
1209
|
+
this.#onOpenPromise = promiseWithResolvers(
|
|
1210
|
+
(reason) => logger().warn({
|
|
1211
|
+
msg: "unhandled open promise rejection",
|
|
1212
|
+
reason
|
|
1213
|
+
})
|
|
1214
|
+
);
|
|
1284
1215
|
await this.#connectWebSocket();
|
|
1285
1216
|
await this.#onOpenPromise.promise;
|
|
1286
1217
|
} finally {
|
|
1287
1218
|
this.#onOpenPromise = void 0;
|
|
1288
1219
|
}
|
|
1289
1220
|
}
|
|
1221
|
+
#clearQueuedMessages() {
|
|
1222
|
+
if (this.#messageQueue.length === 0) return;
|
|
1223
|
+
logger().debug({
|
|
1224
|
+
msg: "clearing queued connection messages",
|
|
1225
|
+
queueLength: this.#messageQueue.length
|
|
1226
|
+
});
|
|
1227
|
+
this.#messageQueue = [];
|
|
1228
|
+
}
|
|
1229
|
+
async #resolveConnectionParams() {
|
|
1230
|
+
if (!this.#getParams) {
|
|
1231
|
+
return this.#params;
|
|
1232
|
+
}
|
|
1233
|
+
try {
|
|
1234
|
+
return await this.#getParams();
|
|
1235
|
+
} catch (err) {
|
|
1236
|
+
const errorMessage = stringifyError(err);
|
|
1237
|
+
const error = new ActorError(
|
|
1238
|
+
"client",
|
|
1239
|
+
"get_params_failed",
|
|
1240
|
+
`Failed to resolve connection params: ${errorMessage}`,
|
|
1241
|
+
{ error: errorMessage }
|
|
1242
|
+
);
|
|
1243
|
+
this.#clearQueuedMessages();
|
|
1244
|
+
this.#rejectPendingPromises(error, false);
|
|
1245
|
+
this.#dispatchActorError(error);
|
|
1246
|
+
throw error;
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1290
1249
|
async #connectWebSocket() {
|
|
1291
1250
|
const { actorId } = await queryActor(
|
|
1292
1251
|
void 0,
|
|
@@ -1294,11 +1253,12 @@ var ActorConnRaw = class {
|
|
|
1294
1253
|
this.#driver
|
|
1295
1254
|
);
|
|
1296
1255
|
this.#actorId = actorId;
|
|
1256
|
+
const params = await this.#resolveConnectionParams();
|
|
1297
1257
|
const ws = await this.#driver.openWebSocket(
|
|
1298
1258
|
PATH_CONNECT,
|
|
1299
1259
|
actorId,
|
|
1300
1260
|
this.#encoding,
|
|
1301
|
-
|
|
1261
|
+
params
|
|
1302
1262
|
);
|
|
1303
1263
|
logger().debug({
|
|
1304
1264
|
msg: "opened websocket",
|
|
@@ -1333,7 +1293,7 @@ var ActorConnRaw = class {
|
|
|
1333
1293
|
});
|
|
1334
1294
|
}
|
|
1335
1295
|
});
|
|
1336
|
-
ws.addEventListener("error", (
|
|
1296
|
+
ws.addEventListener("error", () => {
|
|
1337
1297
|
try {
|
|
1338
1298
|
this.#handleOnError();
|
|
1339
1299
|
} catch (err) {
|
|
@@ -1846,7 +1806,7 @@ var ActorConnRaw = class {
|
|
|
1846
1806
|
}
|
|
1847
1807
|
}
|
|
1848
1808
|
async #parseMessage(data) {
|
|
1849
|
-
|
|
1809
|
+
invariant4(this.#websocket, "websocket must be defined");
|
|
1850
1810
|
const buffer = await inputDataToBuffer(data);
|
|
1851
1811
|
return deserializeWithEncoding(
|
|
1852
1812
|
this.#encoding,
|
|
@@ -1945,7 +1905,12 @@ var ActorConnRaw = class {
|
|
|
1945
1905
|
if (this.#websocket) {
|
|
1946
1906
|
const ws = this.#websocket;
|
|
1947
1907
|
if (ws.readyState !== 2 && ws.readyState !== 3) {
|
|
1948
|
-
const { promise, resolve } = promiseWithResolvers(
|
|
1908
|
+
const { promise, resolve } = promiseWithResolvers(
|
|
1909
|
+
(reason) => logger().warn({
|
|
1910
|
+
msg: "unhandled websocket close promise rejection",
|
|
1911
|
+
reason
|
|
1912
|
+
})
|
|
1913
|
+
);
|
|
1949
1914
|
ws.addEventListener("close", () => resolve(void 0));
|
|
1950
1915
|
ws.close(1e3, "Disposed");
|
|
1951
1916
|
await promise;
|
|
@@ -1971,669 +1936,743 @@ var ActorConnRaw = class {
|
|
|
1971
1936
|
}
|
|
1972
1937
|
};
|
|
1973
1938
|
|
|
1974
|
-
// src/client/
|
|
1939
|
+
// src/client/config.ts
|
|
1940
|
+
import z from "zod/v4";
|
|
1941
|
+
var DEFAULT_ENDPOINT = "http://localhost:6420";
|
|
1942
|
+
var hasWarnedMissingEndpoint = false;
|
|
1943
|
+
var ClientConfigSchemaBase = z.object({
|
|
1944
|
+
/**
|
|
1945
|
+
* Endpoint to connect to for Rivet Engine or RivetKit manager API.
|
|
1946
|
+
*
|
|
1947
|
+
* Supports URL auth syntax for namespace and token:
|
|
1948
|
+
* - `https://namespace:token@api.rivet.dev`
|
|
1949
|
+
* - `https://namespace@api.rivet.dev`
|
|
1950
|
+
*
|
|
1951
|
+
* Can also be set via RIVET_ENDPOINT environment variables.
|
|
1952
|
+
*
|
|
1953
|
+
* Defaults to http://localhost:6420.
|
|
1954
|
+
*/
|
|
1955
|
+
endpoint: z.string().optional().transform((val) => {
|
|
1956
|
+
const resolved = val ?? getRivetEngine() ?? getRivetEndpoint();
|
|
1957
|
+
if (!resolved && !hasWarnedMissingEndpoint) {
|
|
1958
|
+
hasWarnedMissingEndpoint = true;
|
|
1959
|
+
console.warn(
|
|
1960
|
+
`[rivetkit] No endpoint provided to client. Defaulting to ${DEFAULT_ENDPOINT}. Starting in 2.2.0, an explicit endpoint will be required. Pass an endpoint to createClient() or createRivetKit(), or set the RIVET_ENDPOINT environment variable.`
|
|
1961
|
+
);
|
|
1962
|
+
}
|
|
1963
|
+
return resolved ?? DEFAULT_ENDPOINT;
|
|
1964
|
+
}),
|
|
1965
|
+
/** Token to use to authenticate with the API. */
|
|
1966
|
+
token: z.string().optional().transform((val) => val ?? getRivetToken()),
|
|
1967
|
+
/** Namespace to connect to. */
|
|
1968
|
+
namespace: z.string().optional().transform((val) => val ?? getRivetNamespace()),
|
|
1969
|
+
/** Name of the runner. This is used to group together runners in to different pools. */
|
|
1970
|
+
runnerName: z.string().default(() => getRivetRunner() ?? "default"),
|
|
1971
|
+
encoding: EncodingSchema.default("bare"),
|
|
1972
|
+
headers: z.record(z.string(), z.string()).optional().default(() => ({})),
|
|
1973
|
+
// See RunConfig.getUpgradeWebSocket
|
|
1974
|
+
//
|
|
1975
|
+
// This is required in the client config in order to support
|
|
1976
|
+
// `proxyWebSocket`
|
|
1977
|
+
getUpgradeWebSocket: z.custom().optional(),
|
|
1978
|
+
/** Whether to automatically perform health checks when the client is created. */
|
|
1979
|
+
disableMetadataLookup: z.boolean().optional().default(false),
|
|
1980
|
+
/** Whether to enable RivetKit Devtools integration. */
|
|
1981
|
+
devtools: z.boolean().default(
|
|
1982
|
+
() => {
|
|
1983
|
+
var _a, _b;
|
|
1984
|
+
return typeof window !== "undefined" && (((_a = window == null ? void 0 : window.location) == null ? void 0 : _a.hostname) === "127.0.0.1" || ((_b = window.location) == null ? void 0 : _b.hostname) === "localhost");
|
|
1985
|
+
}
|
|
1986
|
+
)
|
|
1987
|
+
});
|
|
1988
|
+
var ClientConfigSchema = ClientConfigSchemaBase.transform(
|
|
1989
|
+
(config, ctx) => transformClientConfig(config, ctx)
|
|
1990
|
+
);
|
|
1991
|
+
function transformClientConfig(config, ctx) {
|
|
1992
|
+
const parsedEndpoint = tryParseEndpoint(ctx, {
|
|
1993
|
+
endpoint: config.endpoint,
|
|
1994
|
+
path: ["endpoint"],
|
|
1995
|
+
namespace: config.namespace,
|
|
1996
|
+
token: config.token
|
|
1997
|
+
});
|
|
1998
|
+
return {
|
|
1999
|
+
...config,
|
|
2000
|
+
endpoint: parsedEndpoint == null ? void 0 : parsedEndpoint.endpoint,
|
|
2001
|
+
namespace: (parsedEndpoint == null ? void 0 : parsedEndpoint.namespace) ?? config.namespace ?? "default",
|
|
2002
|
+
token: (parsedEndpoint == null ? void 0 : parsedEndpoint.token) ?? config.token
|
|
2003
|
+
};
|
|
2004
|
+
}
|
|
2005
|
+
function convertRegistryConfigToClientConfig(config) {
|
|
2006
|
+
var _a, _b;
|
|
2007
|
+
return {
|
|
2008
|
+
endpoint: config.endpoint,
|
|
2009
|
+
token: config.token,
|
|
2010
|
+
namespace: config.namespace,
|
|
2011
|
+
runnerName: config.runner.runnerName,
|
|
2012
|
+
headers: config.headers,
|
|
2013
|
+
encoding: "bare",
|
|
2014
|
+
getUpgradeWebSocket: void 0,
|
|
2015
|
+
// We don't need health checks for internal clients
|
|
2016
|
+
disableMetadataLookup: true,
|
|
2017
|
+
devtools: typeof window !== "undefined" && (((_a = window == null ? void 0 : window.location) == null ? void 0 : _a.hostname) === "127.0.0.1" || ((_b = window == null ? void 0 : window.location) == null ? void 0 : _b.hostname) === "localhost")
|
|
2018
|
+
};
|
|
2019
|
+
}
|
|
2020
|
+
|
|
2021
|
+
// src/remote-manager-driver/mod.ts
|
|
1975
2022
|
import * as cbor5 from "cbor-x";
|
|
1976
2023
|
import invariant5 from "invariant";
|
|
1977
2024
|
|
|
1978
|
-
// src/
|
|
1979
|
-
import
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
initHeaders.forEach((value, key) => {
|
|
1994
|
-
mergedHeaders.set(key, value);
|
|
1995
|
-
});
|
|
1996
|
-
mergedInit = {
|
|
1997
|
-
method: input.method,
|
|
1998
|
-
body: input.body,
|
|
1999
|
-
mode: input.mode,
|
|
2000
|
-
credentials: input.credentials,
|
|
2001
|
-
redirect: input.redirect,
|
|
2002
|
-
referrer: input.referrer,
|
|
2003
|
-
referrerPolicy: input.referrerPolicy,
|
|
2004
|
-
integrity: input.integrity,
|
|
2005
|
-
keepalive: input.keepalive,
|
|
2006
|
-
signal: input.signal,
|
|
2007
|
-
...mergedInit,
|
|
2008
|
-
// init overrides Request properties
|
|
2009
|
-
headers: mergedHeaders
|
|
2010
|
-
// headers must be set after spread to ensure proper merge
|
|
2011
|
-
};
|
|
2012
|
-
if (mergedInit.body) {
|
|
2013
|
-
mergedInit.duplex = "half";
|
|
2014
|
-
}
|
|
2015
|
-
} else {
|
|
2016
|
-
throw new TypeError("Invalid input type for fetch");
|
|
2025
|
+
// src/remote-manager-driver/api-utils.ts
|
|
2026
|
+
import { z as z2 } from "zod/v4";
|
|
2027
|
+
|
|
2028
|
+
// src/remote-manager-driver/log.ts
|
|
2029
|
+
function logger2() {
|
|
2030
|
+
return getLogger("remote-manager-driver");
|
|
2031
|
+
}
|
|
2032
|
+
|
|
2033
|
+
// src/remote-manager-driver/api-utils.ts
|
|
2034
|
+
var EngineApiError = class extends Error {
|
|
2035
|
+
constructor(group, code, message) {
|
|
2036
|
+
super(message || `Engine API error: ${group}/${code}`);
|
|
2037
|
+
this.group = group;
|
|
2038
|
+
this.code = code;
|
|
2039
|
+
this.name = "EngineApiError";
|
|
2017
2040
|
}
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
}
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2041
|
+
};
|
|
2042
|
+
function getEndpoint(config) {
|
|
2043
|
+
return config.endpoint ?? "http://127.0.0.1:6420";
|
|
2044
|
+
}
|
|
2045
|
+
async function apiCall(config, method, path, body) {
|
|
2046
|
+
const endpoint = getEndpoint(config);
|
|
2047
|
+
const url = combineUrlPath(endpoint, path, {
|
|
2048
|
+
namespace: config.namespace
|
|
2049
|
+
});
|
|
2050
|
+
logger2().debug({ msg: "making api call", method, url });
|
|
2051
|
+
const headers = {
|
|
2052
|
+
...config.headers
|
|
2053
|
+
};
|
|
2054
|
+
if (config.token) {
|
|
2055
|
+
headers.Authorization = `Bearer ${config.token}`;
|
|
2056
|
+
}
|
|
2057
|
+
return await sendHttpRequest({
|
|
2058
|
+
method,
|
|
2059
|
+
url,
|
|
2060
|
+
headers,
|
|
2061
|
+
body,
|
|
2062
|
+
encoding: "json",
|
|
2063
|
+
skipParseResponse: false,
|
|
2064
|
+
requestVersionedDataHandler: void 0,
|
|
2065
|
+
requestVersion: void 0,
|
|
2066
|
+
responseVersionedDataHandler: void 0,
|
|
2067
|
+
responseVersion: void 0,
|
|
2068
|
+
requestZodSchema: z2.any(),
|
|
2069
|
+
responseZodSchema: z2.any(),
|
|
2070
|
+
// Identity conversions (passthrough for generic API calls)
|
|
2071
|
+
requestToJson: (value) => value,
|
|
2072
|
+
requestToBare: (value) => value,
|
|
2073
|
+
responseFromJson: (value) => value,
|
|
2074
|
+
responseFromBare: (value) => value
|
|
2075
|
+
});
|
|
2076
|
+
}
|
|
2077
|
+
|
|
2078
|
+
// src/remote-manager-driver/actor-websocket-client.ts
|
|
2079
|
+
function buildActorGatewayUrl(endpoint, actorId, token, path = "") {
|
|
2080
|
+
const tokenSegment = token !== void 0 ? `@${encodeURIComponent(token)}` : "";
|
|
2081
|
+
const gatewayPath = `/gateway/${encodeURIComponent(actorId)}${tokenSegment}${path}`;
|
|
2082
|
+
return combineUrlPath(endpoint, gatewayPath);
|
|
2083
|
+
}
|
|
2084
|
+
async function openWebSocketToActor(runConfig, path, actorId, encoding, params) {
|
|
2085
|
+
const WebSocket2 = await importWebSocket();
|
|
2086
|
+
const endpoint = getEndpoint(runConfig);
|
|
2087
|
+
const guardUrl = buildActorGatewayUrl(
|
|
2088
|
+
endpoint,
|
|
2089
|
+
actorId,
|
|
2090
|
+
runConfig.token,
|
|
2091
|
+
path
|
|
2092
|
+
);
|
|
2093
|
+
logger2().debug({
|
|
2094
|
+
msg: "opening websocket to actor via guard",
|
|
2095
|
+
actorId,
|
|
2096
|
+
path,
|
|
2097
|
+
guardUrl
|
|
2098
|
+
});
|
|
2099
|
+
const ws = new WebSocket2(
|
|
2100
|
+
guardUrl,
|
|
2101
|
+
buildWebSocketProtocols(runConfig, encoding, params)
|
|
2102
|
+
);
|
|
2103
|
+
ws.binaryType = "arraybuffer";
|
|
2104
|
+
logger2().debug({ msg: "websocket connection opened", actorId });
|
|
2105
|
+
return ws;
|
|
2106
|
+
}
|
|
2107
|
+
function buildWebSocketProtocols(runConfig, encoding, params) {
|
|
2108
|
+
const protocols = [];
|
|
2109
|
+
protocols.push(WS_PROTOCOL_STANDARD);
|
|
2110
|
+
protocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);
|
|
2111
|
+
if (params) {
|
|
2112
|
+
protocols.push(
|
|
2113
|
+
`${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`
|
|
2039
2114
|
);
|
|
2040
|
-
throw new ActorError(group, code, message, metadata);
|
|
2041
2115
|
}
|
|
2116
|
+
return protocols;
|
|
2042
2117
|
}
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2118
|
+
|
|
2119
|
+
// src/remote-manager-driver/actor-http-client.ts
|
|
2120
|
+
async function sendHttpRequestToActor(runConfig, actorId, actorRequest) {
|
|
2121
|
+
const url = new URL(actorRequest.url);
|
|
2122
|
+
const endpoint = getEndpoint(runConfig);
|
|
2123
|
+
const guardUrl = buildActorGatewayUrl(
|
|
2124
|
+
endpoint,
|
|
2125
|
+
actorId,
|
|
2126
|
+
runConfig.token,
|
|
2127
|
+
`${url.pathname}${url.search}`
|
|
2128
|
+
);
|
|
2129
|
+
let bodyToSend = null;
|
|
2130
|
+
const guardHeaders = buildGuardHeadersForHttp(
|
|
2131
|
+
runConfig,
|
|
2132
|
+
actorRequest,
|
|
2133
|
+
actorId
|
|
2134
|
+
);
|
|
2135
|
+
if (actorRequest.method !== "GET" && actorRequest.method !== "HEAD") {
|
|
2136
|
+
if (actorRequest.bodyUsed) {
|
|
2137
|
+
throw new Error("Request body has already been consumed");
|
|
2057
2138
|
}
|
|
2058
|
-
|
|
2059
|
-
|
|
2139
|
+
const reqBody = await actorRequest.arrayBuffer();
|
|
2140
|
+
if (reqBody.byteLength !== 0) {
|
|
2141
|
+
bodyToSend = reqBody;
|
|
2142
|
+
guardHeaders.delete("transfer-encoding");
|
|
2143
|
+
guardHeaders.set("content-length", String(bodyToSend.byteLength));
|
|
2060
2144
|
}
|
|
2061
2145
|
}
|
|
2062
|
-
const
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
path: fullPath
|
|
2146
|
+
const guardRequest = new Request(guardUrl, {
|
|
2147
|
+
method: actorRequest.method,
|
|
2148
|
+
headers: guardHeaders,
|
|
2149
|
+
body: bodyToSend,
|
|
2150
|
+
signal: actorRequest.signal
|
|
2068
2151
|
});
|
|
2069
|
-
|
|
2070
|
-
return ws;
|
|
2152
|
+
return mutableResponse(await fetch(guardRequest));
|
|
2071
2153
|
}
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
* Do not call this directly.
|
|
2083
|
-
*
|
|
2084
|
-
* Creates an instance of ActorHandleRaw.
|
|
2085
|
-
*
|
|
2086
|
-
* @protected
|
|
2087
|
-
*/
|
|
2088
|
-
constructor(client, driver, params, encoding, actorQuery) {
|
|
2089
|
-
this.#client = client;
|
|
2090
|
-
this.#driver = driver;
|
|
2091
|
-
this.#encoding = encoding;
|
|
2092
|
-
this.#actorQuery = actorQuery;
|
|
2093
|
-
this.#params = params;
|
|
2094
|
-
this.#queueSender = createQueueSender({
|
|
2095
|
-
encoding: this.#encoding,
|
|
2096
|
-
params: this.#params,
|
|
2097
|
-
customFetch: async (request) => {
|
|
2098
|
-
const { actorId } = await queryActor(
|
|
2099
|
-
void 0,
|
|
2100
|
-
this.#actorQuery,
|
|
2101
|
-
this.#driver
|
|
2102
|
-
);
|
|
2103
|
-
return this.#driver.sendRequest(actorId, request);
|
|
2104
|
-
}
|
|
2105
|
-
});
|
|
2154
|
+
function mutableResponse(fetchRes) {
|
|
2155
|
+
return new Response(fetchRes.body, fetchRes);
|
|
2156
|
+
}
|
|
2157
|
+
function buildGuardHeadersForHttp(runConfig, actorRequest, actorId) {
|
|
2158
|
+
const headers = new Headers();
|
|
2159
|
+
actorRequest.headers.forEach((value, key) => {
|
|
2160
|
+
headers.set(key, value);
|
|
2161
|
+
});
|
|
2162
|
+
for (const [key, value] of Object.entries(runConfig.headers)) {
|
|
2163
|
+
headers.set(key, value);
|
|
2106
2164
|
}
|
|
2107
|
-
|
|
2108
|
-
|
|
2165
|
+
if (runConfig.token) {
|
|
2166
|
+
headers.set(HEADER_RIVET_TOKEN, runConfig.token);
|
|
2109
2167
|
}
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2168
|
+
return headers;
|
|
2169
|
+
}
|
|
2170
|
+
|
|
2171
|
+
// src/remote-manager-driver/api-endpoints.ts
|
|
2172
|
+
async function getActor(config, _, actorId) {
|
|
2173
|
+
return apiCall(
|
|
2174
|
+
config,
|
|
2175
|
+
"GET",
|
|
2176
|
+
`/actors?actor_ids=${encodeURIComponent(actorId)}`
|
|
2177
|
+
);
|
|
2178
|
+
}
|
|
2179
|
+
async function getActorByKey(config, name, key) {
|
|
2180
|
+
const serializedKey = serializeActorKey(key);
|
|
2181
|
+
return apiCall(
|
|
2182
|
+
config,
|
|
2183
|
+
"GET",
|
|
2184
|
+
`/actors?name=${encodeURIComponent(name)}&key=${encodeURIComponent(serializedKey)}`
|
|
2185
|
+
);
|
|
2186
|
+
}
|
|
2187
|
+
async function listActorsByName(config, name) {
|
|
2188
|
+
return apiCall(
|
|
2189
|
+
config,
|
|
2190
|
+
"GET",
|
|
2191
|
+
`/actors?name=${encodeURIComponent(name)}`
|
|
2192
|
+
);
|
|
2193
|
+
}
|
|
2194
|
+
async function getOrCreateActor(config, request) {
|
|
2195
|
+
return apiCall(
|
|
2196
|
+
config,
|
|
2197
|
+
"PUT",
|
|
2198
|
+
`/actors`,
|
|
2199
|
+
request
|
|
2200
|
+
);
|
|
2201
|
+
}
|
|
2202
|
+
async function createActor(config, request) {
|
|
2203
|
+
return apiCall(
|
|
2204
|
+
config,
|
|
2205
|
+
"POST",
|
|
2206
|
+
`/actors`,
|
|
2207
|
+
request
|
|
2208
|
+
);
|
|
2209
|
+
}
|
|
2210
|
+
async function destroyActor(config, actorId) {
|
|
2211
|
+
return apiCall(
|
|
2212
|
+
config,
|
|
2213
|
+
"DELETE",
|
|
2214
|
+
`/actors/${encodeURIComponent(actorId)}`
|
|
2215
|
+
);
|
|
2216
|
+
}
|
|
2217
|
+
async function getMetadata(config) {
|
|
2218
|
+
return apiCall(config, "GET", `/metadata`);
|
|
2219
|
+
}
|
|
2220
|
+
async function getDatacenters(config) {
|
|
2221
|
+
return apiCall(config, "GET", `/datacenters`);
|
|
2222
|
+
}
|
|
2223
|
+
async function updateRunnerConfig(config, runnerName, request) {
|
|
2224
|
+
return apiCall(
|
|
2225
|
+
config,
|
|
2226
|
+
"PUT",
|
|
2227
|
+
`/runner-configs/${runnerName}`,
|
|
2228
|
+
request
|
|
2229
|
+
);
|
|
2230
|
+
}
|
|
2231
|
+
async function kvGet(config, actorId, key) {
|
|
2232
|
+
return apiCall(
|
|
2233
|
+
config,
|
|
2234
|
+
"GET",
|
|
2235
|
+
`/actors/${encodeURIComponent(actorId)}/kv/keys/${encodeURIComponent(key)}`
|
|
2236
|
+
);
|
|
2237
|
+
}
|
|
2238
|
+
|
|
2239
|
+
// src/remote-manager-driver/metadata.ts
|
|
2240
|
+
import pRetry2 from "p-retry";
|
|
2241
|
+
var metadataLookupCache = /* @__PURE__ */ new Map();
|
|
2242
|
+
async function lookupMetadataCached(config) {
|
|
2243
|
+
const endpoint = getEndpoint(config);
|
|
2244
|
+
const existingPromise = metadataLookupCache.get(endpoint);
|
|
2245
|
+
if (existingPromise) {
|
|
2246
|
+
return existingPromise;
|
|
2247
|
+
}
|
|
2248
|
+
const metadataLookupPromise = pRetry2(
|
|
2249
|
+
async () => {
|
|
2250
|
+
logger2().debug({
|
|
2251
|
+
msg: "fetching metadata",
|
|
2252
|
+
endpoint
|
|
2253
|
+
});
|
|
2254
|
+
const metadataData = await getMetadata(config);
|
|
2255
|
+
logger2().debug({
|
|
2256
|
+
msg: "received metadata",
|
|
2257
|
+
endpoint,
|
|
2258
|
+
clientEndpoint: metadataData.clientEndpoint
|
|
2259
|
+
});
|
|
2260
|
+
return metadataData;
|
|
2261
|
+
},
|
|
2262
|
+
{
|
|
2263
|
+
forever: true,
|
|
2264
|
+
minTimeout: 500,
|
|
2265
|
+
maxTimeout: 15e3,
|
|
2266
|
+
onFailedAttempt: (error) => {
|
|
2267
|
+
if (error.attemptNumber > 1) {
|
|
2268
|
+
logger2().warn({
|
|
2269
|
+
msg: "failed to fetch metadata, retrying",
|
|
2270
|
+
endpoint,
|
|
2271
|
+
attempt: error.attemptNumber,
|
|
2272
|
+
error: stringifyError(error)
|
|
2273
|
+
});
|
|
2274
|
+
}
|
|
2275
|
+
}
|
|
2276
|
+
}
|
|
2277
|
+
);
|
|
2278
|
+
metadataLookupCache.set(endpoint, metadataLookupPromise);
|
|
2279
|
+
return metadataLookupPromise;
|
|
2280
|
+
}
|
|
2281
|
+
|
|
2282
|
+
// src/remote-manager-driver/ws-proxy.ts
|
|
2283
|
+
async function createWebSocketProxy(c, targetUrl, protocols) {
|
|
2284
|
+
const WebSocket2 = await importWebSocket();
|
|
2285
|
+
const state = {};
|
|
2286
|
+
return {
|
|
2287
|
+
onOpen: async (event, clientWs) => {
|
|
2288
|
+
logger2().debug({ msg: "client websocket connected", targetUrl });
|
|
2289
|
+
if (clientWs.readyState !== 1) {
|
|
2290
|
+
logger2().warn({
|
|
2291
|
+
msg: "client websocket not open on connection",
|
|
2292
|
+
targetUrl,
|
|
2293
|
+
readyState: clientWs.readyState
|
|
2294
|
+
});
|
|
2295
|
+
return;
|
|
2296
|
+
}
|
|
2297
|
+
const targetWs = new WebSocket2(targetUrl, protocols);
|
|
2298
|
+
state.targetWs = targetWs;
|
|
2299
|
+
state.connectPromise = new Promise((resolve, reject) => {
|
|
2300
|
+
targetWs.addEventListener("open", () => {
|
|
2301
|
+
logger2().debug({
|
|
2302
|
+
msg: "target websocket connected",
|
|
2303
|
+
targetUrl
|
|
2304
|
+
});
|
|
2305
|
+
if (clientWs.readyState !== 1) {
|
|
2306
|
+
logger2().warn({
|
|
2307
|
+
msg: "client websocket closed before target connected",
|
|
2308
|
+
targetUrl,
|
|
2309
|
+
clientReadyState: clientWs.readyState
|
|
2310
|
+
});
|
|
2311
|
+
targetWs.close(1001, "Client disconnected");
|
|
2312
|
+
reject(new Error("Client disconnected"));
|
|
2313
|
+
return;
|
|
2314
|
+
}
|
|
2315
|
+
resolve();
|
|
2316
|
+
});
|
|
2317
|
+
targetWs.addEventListener("error", (error) => {
|
|
2318
|
+
logger2().warn({
|
|
2319
|
+
msg: "target websocket error during connection",
|
|
2320
|
+
targetUrl
|
|
2321
|
+
});
|
|
2322
|
+
reject(error);
|
|
2323
|
+
});
|
|
2132
2324
|
});
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
encoding: this.#encoding,
|
|
2142
|
-
customFetch: this.#driver.sendRequest.bind(
|
|
2143
|
-
this.#driver,
|
|
2144
|
-
actorId
|
|
2145
|
-
),
|
|
2146
|
-
signal: opts == null ? void 0 : opts.signal,
|
|
2147
|
-
requestVersion: CURRENT_VERSION,
|
|
2148
|
-
requestVersionedDataHandler: HTTP_ACTION_REQUEST_VERSIONED,
|
|
2149
|
-
responseVersion: CURRENT_VERSION,
|
|
2150
|
-
responseVersionedDataHandler: HTTP_ACTION_RESPONSE_VERSIONED,
|
|
2151
|
-
requestZodSchema: HttpActionRequestSchema,
|
|
2152
|
-
responseZodSchema: HttpActionResponseSchema,
|
|
2153
|
-
// JSON Request: args is the raw value
|
|
2154
|
-
requestToJson: (args) => ({
|
|
2155
|
-
args
|
|
2156
|
-
}),
|
|
2157
|
-
// BARE Request: args needs to be CBOR-encoded
|
|
2158
|
-
requestToBare: (args) => ({
|
|
2159
|
-
args: bufferToArrayBuffer(cbor5.encode(args))
|
|
2160
|
-
}),
|
|
2161
|
-
// JSON Response: output is the raw value
|
|
2162
|
-
responseFromJson: (json) => json.output,
|
|
2163
|
-
// BARE Response: output is ArrayBuffer that needs CBOR-decoding
|
|
2164
|
-
responseFromBare: (bare) => cbor5.decode(new Uint8Array(bare.output))
|
|
2325
|
+
state.targetWs.addEventListener("message", (event2) => {
|
|
2326
|
+
if (typeof event2.data === "string" || event2.data instanceof ArrayBuffer) {
|
|
2327
|
+
clientWs.send(event2.data);
|
|
2328
|
+
} else if (event2.data instanceof Blob) {
|
|
2329
|
+
event2.data.arrayBuffer().then((buffer) => {
|
|
2330
|
+
clientWs.send(buffer);
|
|
2331
|
+
});
|
|
2332
|
+
}
|
|
2165
2333
|
});
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
|
|
2334
|
+
state.targetWs.addEventListener("close", (event2) => {
|
|
2335
|
+
logger2().debug({
|
|
2336
|
+
msg: "target websocket closed",
|
|
2337
|
+
targetUrl,
|
|
2338
|
+
code: event2.code,
|
|
2339
|
+
reason: event2.reason
|
|
2340
|
+
});
|
|
2341
|
+
closeWebSocketIfOpen(clientWs, event2.code, event2.reason);
|
|
2342
|
+
});
|
|
2343
|
+
state.targetWs.addEventListener("error", (error) => {
|
|
2344
|
+
logger2().error({
|
|
2345
|
+
msg: "target websocket error",
|
|
2346
|
+
targetUrl,
|
|
2347
|
+
error: stringifyError(error)
|
|
2348
|
+
});
|
|
2349
|
+
closeWebSocketIfOpen(clientWs, 1011, "Target WebSocket error");
|
|
2350
|
+
});
|
|
2351
|
+
},
|
|
2352
|
+
onMessage: async (event, clientWs) => {
|
|
2353
|
+
if (!state.targetWs || !state.connectPromise) {
|
|
2354
|
+
logger2().error({
|
|
2355
|
+
msg: "websocket state not initialized",
|
|
2356
|
+
targetUrl
|
|
2357
|
+
});
|
|
2358
|
+
return;
|
|
2359
|
+
}
|
|
2360
|
+
try {
|
|
2361
|
+
await state.connectPromise;
|
|
2362
|
+
if (state.targetWs.readyState === WebSocket2.OPEN) {
|
|
2363
|
+
state.targetWs.send(event.data);
|
|
2364
|
+
} else {
|
|
2365
|
+
logger2().warn({
|
|
2366
|
+
msg: "target websocket not open",
|
|
2367
|
+
targetUrl,
|
|
2368
|
+
readyState: state.targetWs.readyState
|
|
2369
|
+
});
|
|
2370
|
+
}
|
|
2371
|
+
} catch (error) {
|
|
2372
|
+
logger2().error({
|
|
2373
|
+
msg: "failed to connect to target websocket",
|
|
2374
|
+
targetUrl,
|
|
2375
|
+
error
|
|
2376
|
+
});
|
|
2377
|
+
closeWebSocketIfOpen(
|
|
2378
|
+
clientWs,
|
|
2379
|
+
1011,
|
|
2380
|
+
"Failed to connect to target"
|
|
2181
2381
|
);
|
|
2182
|
-
|
|
2183
|
-
|
|
2382
|
+
}
|
|
2383
|
+
},
|
|
2384
|
+
onClose: (event, clientWs) => {
|
|
2385
|
+
logger2().debug({
|
|
2386
|
+
msg: "client websocket closed",
|
|
2387
|
+
targetUrl,
|
|
2388
|
+
code: event.code,
|
|
2389
|
+
reason: event.reason,
|
|
2390
|
+
wasClean: event.wasClean
|
|
2391
|
+
});
|
|
2392
|
+
if (state.targetWs) {
|
|
2393
|
+
if (state.targetWs.readyState === WebSocket2.OPEN || state.targetWs.readyState === WebSocket2.CONNECTING) {
|
|
2394
|
+
state.targetWs.close(
|
|
2395
|
+
1e3,
|
|
2396
|
+
event.reason || "Client disconnected"
|
|
2397
|
+
);
|
|
2398
|
+
}
|
|
2399
|
+
}
|
|
2400
|
+
},
|
|
2401
|
+
onError: (event, clientWs) => {
|
|
2402
|
+
logger2().error({ msg: "client websocket error", targetUrl, event });
|
|
2403
|
+
if (state.targetWs) {
|
|
2404
|
+
if (state.targetWs.readyState === WebSocket2.OPEN) {
|
|
2405
|
+
state.targetWs.close(1011, "Client WebSocket error");
|
|
2406
|
+
} else if (state.targetWs.readyState === WebSocket2.CONNECTING) {
|
|
2407
|
+
state.targetWs.close();
|
|
2184
2408
|
}
|
|
2185
2409
|
}
|
|
2186
|
-
throw new ActorError(group, code, message, metadata);
|
|
2187
2410
|
}
|
|
2411
|
+
};
|
|
2412
|
+
}
|
|
2413
|
+
function closeWebSocketIfOpen(ws, code, reason) {
|
|
2414
|
+
if (ws.readyState === 1) {
|
|
2415
|
+
ws.close(code, reason);
|
|
2416
|
+
} else if ("close" in ws && ws.readyState === WebSocket.OPEN) {
|
|
2417
|
+
ws.close(code, reason);
|
|
2188
2418
|
}
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
});
|
|
2200
|
-
const conn = new ActorConnRaw(
|
|
2201
|
-
this.#client,
|
|
2202
|
-
this.#driver,
|
|
2203
|
-
this.#params,
|
|
2204
|
-
this.#encoding,
|
|
2205
|
-
this.#actorQuery
|
|
2206
|
-
);
|
|
2207
|
-
return this.#client[CREATE_ACTOR_CONN_PROXY](
|
|
2208
|
-
conn
|
|
2209
|
-
);
|
|
2210
|
-
}
|
|
2211
|
-
/**
|
|
2212
|
-
* Fetches a resource from this actor via the /request endpoint. This is a
|
|
2213
|
-
* convenience wrapper around the raw HTTP API.
|
|
2214
|
-
*/
|
|
2215
|
-
fetch(input, init) {
|
|
2216
|
-
return rawHttpFetch(
|
|
2217
|
-
this.#driver,
|
|
2218
|
-
this.#actorQuery,
|
|
2219
|
-
this.#params,
|
|
2220
|
-
input,
|
|
2221
|
-
init
|
|
2222
|
-
);
|
|
2223
|
-
}
|
|
2224
|
-
/**
|
|
2225
|
-
* Opens a raw WebSocket connection to this actor.
|
|
2226
|
-
*/
|
|
2227
|
-
webSocket(path, protocols) {
|
|
2228
|
-
return rawWebSocket(
|
|
2229
|
-
this.#driver,
|
|
2230
|
-
this.#actorQuery,
|
|
2231
|
-
this.#params,
|
|
2232
|
-
path,
|
|
2233
|
-
protocols
|
|
2234
|
-
);
|
|
2235
|
-
}
|
|
2236
|
-
/**
|
|
2237
|
-
* Resolves the actor to get its unique actor ID.
|
|
2238
|
-
*/
|
|
2239
|
-
async resolve() {
|
|
2240
|
-
if ("getForKey" in this.#actorQuery) {
|
|
2241
|
-
const name = this.#actorQuery.getForKey.name;
|
|
2242
|
-
const { actorId } = await queryActor(
|
|
2243
|
-
void 0,
|
|
2244
|
-
this.#actorQuery,
|
|
2245
|
-
this.#driver
|
|
2419
|
+
}
|
|
2420
|
+
|
|
2421
|
+
// src/remote-manager-driver/mod.ts
|
|
2422
|
+
var RemoteManagerDriver = class {
|
|
2423
|
+
#config;
|
|
2424
|
+
#metadataPromise;
|
|
2425
|
+
constructor(runConfig) {
|
|
2426
|
+
if (getNextPhase() === "phase-production-build") {
|
|
2427
|
+
logger2().info(
|
|
2428
|
+
"detected next.js build phase, disabling health check"
|
|
2246
2429
|
);
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2430
|
+
runConfig.disableMetadataLookup = true;
|
|
2431
|
+
}
|
|
2432
|
+
this.#config = { ...runConfig };
|
|
2433
|
+
if (!runConfig.disableMetadataLookup) {
|
|
2434
|
+
this.#metadataPromise = lookupMetadataCached(this.#config).then(
|
|
2435
|
+
(metadataData) => {
|
|
2436
|
+
if (metadataData.clientEndpoint) {
|
|
2437
|
+
this.#config.endpoint = metadataData.clientEndpoint;
|
|
2438
|
+
if (metadataData.clientNamespace) {
|
|
2439
|
+
this.#config.namespace = metadataData.clientNamespace;
|
|
2440
|
+
}
|
|
2441
|
+
if (metadataData.clientToken) {
|
|
2442
|
+
this.#config.token = metadataData.clientToken;
|
|
2443
|
+
}
|
|
2444
|
+
logger2().info({
|
|
2445
|
+
msg: "overriding client endpoint",
|
|
2446
|
+
endpoint: metadataData.clientEndpoint,
|
|
2447
|
+
namespace: metadataData.clientNamespace,
|
|
2448
|
+
token: metadataData.clientToken
|
|
2449
|
+
});
|
|
2450
|
+
}
|
|
2451
|
+
logger2().info({
|
|
2452
|
+
msg: "connected to rivetkit manager",
|
|
2453
|
+
runtime: metadataData.runtime,
|
|
2454
|
+
version: metadataData.version,
|
|
2455
|
+
runner: metadataData.runner
|
|
2456
|
+
});
|
|
2457
|
+
}
|
|
2255
2458
|
);
|
|
2256
|
-
this.#actorQuery = { getForId: { actorId, name } };
|
|
2257
|
-
return actorId;
|
|
2258
|
-
} else if ("getForId" in this.#actorQuery) {
|
|
2259
|
-
return this.#actorQuery.getForId.actorId;
|
|
2260
|
-
} else if ("create" in this.#actorQuery) {
|
|
2261
|
-
invariant5(false, "actorQuery cannot be create");
|
|
2262
|
-
} else {
|
|
2263
|
-
assertUnreachable2(this.#actorQuery);
|
|
2264
2459
|
}
|
|
2265
2460
|
}
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
this.#
|
|
2273
|
-
|
|
2274
|
-
);
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
/**
|
|
2288
|
-
* Creates an instance of Client.
|
|
2289
|
-
*/
|
|
2290
|
-
constructor(driver, encoding) {
|
|
2291
|
-
this.#driver = driver;
|
|
2292
|
-
this.#encodingKind = encoding ?? "bare";
|
|
2461
|
+
async getForId({
|
|
2462
|
+
c,
|
|
2463
|
+
name,
|
|
2464
|
+
actorId
|
|
2465
|
+
}) {
|
|
2466
|
+
if (this.#metadataPromise) {
|
|
2467
|
+
await this.#metadataPromise;
|
|
2468
|
+
}
|
|
2469
|
+
const response = await getActor(this.#config, name, actorId);
|
|
2470
|
+
const actor = response.actors[0];
|
|
2471
|
+
if (!actor) return void 0;
|
|
2472
|
+
if (actor.name !== name) {
|
|
2473
|
+
logger2().debug({
|
|
2474
|
+
msg: "actor name mismatch from api",
|
|
2475
|
+
actorId,
|
|
2476
|
+
apiName: actor.name,
|
|
2477
|
+
requestedName: name
|
|
2478
|
+
});
|
|
2479
|
+
return void 0;
|
|
2480
|
+
}
|
|
2481
|
+
return apiActorToOutput(actor);
|
|
2293
2482
|
}
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
const actorQuery = {
|
|
2311
|
-
getForId: {
|
|
2483
|
+
async getWithKey({
|
|
2484
|
+
c,
|
|
2485
|
+
name,
|
|
2486
|
+
key
|
|
2487
|
+
}) {
|
|
2488
|
+
if (this.#metadataPromise) {
|
|
2489
|
+
await this.#metadataPromise;
|
|
2490
|
+
}
|
|
2491
|
+
logger2().debug({ msg: "getWithKey: searching for actor", name, key });
|
|
2492
|
+
try {
|
|
2493
|
+
const response = await getActorByKey(this.#config, name, key);
|
|
2494
|
+
const actor = response.actors[0];
|
|
2495
|
+
if (!actor) return void 0;
|
|
2496
|
+
logger2().debug({
|
|
2497
|
+
msg: "getWithKey: found actor via api",
|
|
2498
|
+
actorId: actor.actor_id,
|
|
2312
2499
|
name,
|
|
2313
|
-
|
|
2500
|
+
key
|
|
2501
|
+
});
|
|
2502
|
+
return apiActorToOutput(actor);
|
|
2503
|
+
} catch (error) {
|
|
2504
|
+
if (error instanceof EngineApiError && error.group === "actor" && error.code === "not_found") {
|
|
2505
|
+
return void 0;
|
|
2314
2506
|
}
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
return createActorProxy(handle);
|
|
2507
|
+
throw error;
|
|
2508
|
+
}
|
|
2318
2509
|
}
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
* @returns {ActorHandle<AD>} - A handle to the actor.
|
|
2327
|
-
*/
|
|
2328
|
-
get(name, key, opts) {
|
|
2329
|
-
const keyArray = typeof key === "string" ? [key] : key || [];
|
|
2330
|
-
logger().debug({
|
|
2331
|
-
msg: "get handle to actor",
|
|
2510
|
+
async getOrCreateWithKey(input) {
|
|
2511
|
+
if (this.#metadataPromise) {
|
|
2512
|
+
await this.#metadataPromise;
|
|
2513
|
+
}
|
|
2514
|
+
const { c, name, key, input: actorInput, region } = input;
|
|
2515
|
+
logger2().info({
|
|
2516
|
+
msg: "getOrCreateWithKey: getting or creating actor via engine api",
|
|
2332
2517
|
name,
|
|
2333
|
-
key
|
|
2334
|
-
parameters: opts == null ? void 0 : opts.params
|
|
2518
|
+
key
|
|
2335
2519
|
});
|
|
2336
|
-
const
|
|
2337
|
-
|
|
2338
|
-
name,
|
|
2339
|
-
key: keyArray
|
|
2340
|
-
}
|
|
2341
|
-
};
|
|
2342
|
-
const handle = this.#createHandle(opts == null ? void 0 : opts.params, actorQuery);
|
|
2343
|
-
return createActorProxy(handle);
|
|
2344
|
-
}
|
|
2345
|
-
/**
|
|
2346
|
-
* Gets a stateless handle to a actor by its key, creating it if necessary.
|
|
2347
|
-
*
|
|
2348
|
-
* @template AD The actor class that this handle is for.
|
|
2349
|
-
* @param {string} name - The name of the actor.
|
|
2350
|
-
* @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.
|
|
2351
|
-
* @param {GetOptions} [opts] - Options for getting the actor.
|
|
2352
|
-
* @returns {ActorHandle<AD>} - A handle to the actor.
|
|
2353
|
-
*/
|
|
2354
|
-
getOrCreate(name, key, opts) {
|
|
2355
|
-
const keyArray = typeof key === "string" ? [key] : key || [];
|
|
2356
|
-
logger().debug({
|
|
2357
|
-
msg: "get or create handle to actor",
|
|
2520
|
+
const { actor, created } = await getOrCreateActor(this.#config, {
|
|
2521
|
+
datacenter: region,
|
|
2358
2522
|
name,
|
|
2359
|
-
key:
|
|
2360
|
-
|
|
2361
|
-
|
|
2523
|
+
key: serializeActorKey(key),
|
|
2524
|
+
runner_name_selector: this.#config.runnerName,
|
|
2525
|
+
input: actorInput ? uint8ArrayToBase64(cbor5.encode(actorInput)) : void 0,
|
|
2526
|
+
crash_policy: "sleep"
|
|
2362
2527
|
});
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
|
|
2367
|
-
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
const handle = this.#createHandle(opts == null ? void 0 : opts.params, actorQuery);
|
|
2372
|
-
return createActorProxy(handle);
|
|
2528
|
+
logger2().info({
|
|
2529
|
+
msg: "getOrCreateWithKey: actor ready",
|
|
2530
|
+
actorId: actor.actor_id,
|
|
2531
|
+
name,
|
|
2532
|
+
key,
|
|
2533
|
+
created
|
|
2534
|
+
});
|
|
2535
|
+
return apiActorToOutput(actor);
|
|
2373
2536
|
}
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
const
|
|
2386
|
-
|
|
2387
|
-
create: {
|
|
2388
|
-
...opts,
|
|
2389
|
-
// Do these last to override `opts`
|
|
2390
|
-
name,
|
|
2391
|
-
key: keyArray
|
|
2392
|
-
}
|
|
2393
|
-
};
|
|
2394
|
-
logger().debug({
|
|
2395
|
-
msg: "create actor handle",
|
|
2537
|
+
async createActor({
|
|
2538
|
+
c,
|
|
2539
|
+
name,
|
|
2540
|
+
key,
|
|
2541
|
+
input,
|
|
2542
|
+
region
|
|
2543
|
+
}) {
|
|
2544
|
+
if (this.#metadataPromise) {
|
|
2545
|
+
await this.#metadataPromise;
|
|
2546
|
+
}
|
|
2547
|
+
logger2().info({ msg: "creating actor via engine api", name, key });
|
|
2548
|
+
const result = await createActor(this.#config, {
|
|
2549
|
+
datacenter: region,
|
|
2396
2550
|
name,
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2551
|
+
runner_name_selector: this.#config.runnerName,
|
|
2552
|
+
key: serializeActorKey(key),
|
|
2553
|
+
input: input ? uint8ArrayToBase64(cbor5.encode(input)) : void 0,
|
|
2554
|
+
crash_policy: "sleep"
|
|
2400
2555
|
});
|
|
2401
|
-
|
|
2402
|
-
|
|
2403
|
-
|
|
2404
|
-
this.#driver
|
|
2405
|
-
);
|
|
2406
|
-
logger().debug({
|
|
2407
|
-
msg: "created actor with ID",
|
|
2556
|
+
logger2().info({
|
|
2557
|
+
msg: "actor created",
|
|
2558
|
+
actorId: result.actor.actor_id,
|
|
2408
2559
|
name,
|
|
2409
|
-
key
|
|
2410
|
-
actorId
|
|
2560
|
+
key
|
|
2411
2561
|
});
|
|
2412
|
-
|
|
2413
|
-
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
}
|
|
2418
|
-
|
|
2419
|
-
const
|
|
2420
|
-
return
|
|
2562
|
+
return apiActorToOutput(result.actor);
|
|
2563
|
+
}
|
|
2564
|
+
async listActors({ c, name }) {
|
|
2565
|
+
if (this.#metadataPromise) {
|
|
2566
|
+
await this.#metadataPromise;
|
|
2567
|
+
}
|
|
2568
|
+
logger2().debug({ msg: "listing actors via engine api", name });
|
|
2569
|
+
const response = await listActorsByName(this.#config, name);
|
|
2570
|
+
return response.actors.map(apiActorToOutput);
|
|
2571
|
+
}
|
|
2572
|
+
async destroyActor(actorId) {
|
|
2573
|
+
if (this.#metadataPromise) {
|
|
2574
|
+
await this.#metadataPromise;
|
|
2575
|
+
}
|
|
2576
|
+
logger2().info({ msg: "destroying actor via engine api", actorId });
|
|
2577
|
+
await destroyActor(this.#config, actorId);
|
|
2578
|
+
logger2().info({ msg: "actor destroyed", actorId });
|
|
2421
2579
|
}
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
this
|
|
2425
|
-
|
|
2426
|
-
|
|
2427
|
-
this.#
|
|
2428
|
-
|
|
2580
|
+
async sendRequest(actorId, actorRequest) {
|
|
2581
|
+
if (this.#metadataPromise) {
|
|
2582
|
+
await this.#metadataPromise;
|
|
2583
|
+
}
|
|
2584
|
+
return await sendHttpRequestToActor(
|
|
2585
|
+
this.#config,
|
|
2586
|
+
actorId,
|
|
2587
|
+
actorRequest
|
|
2429
2588
|
);
|
|
2430
2589
|
}
|
|
2431
|
-
|
|
2432
|
-
this
|
|
2433
|
-
|
|
2434
|
-
return createActorProxy(conn);
|
|
2435
|
-
}
|
|
2436
|
-
/**
|
|
2437
|
-
* Disconnects from all actors.
|
|
2438
|
-
*
|
|
2439
|
-
* @returns {Promise<void>} A promise that resolves when all connections are closed.
|
|
2440
|
-
*/
|
|
2441
|
-
async dispose() {
|
|
2442
|
-
if (this.#disposed) {
|
|
2443
|
-
logger().warn({ msg: "client already disconnected" });
|
|
2444
|
-
return;
|
|
2590
|
+
async openWebSocket(path, actorId, encoding, params) {
|
|
2591
|
+
if (this.#metadataPromise) {
|
|
2592
|
+
await this.#metadataPromise;
|
|
2445
2593
|
}
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2594
|
+
return await openWebSocketToActor(
|
|
2595
|
+
this.#config,
|
|
2596
|
+
path,
|
|
2597
|
+
actorId,
|
|
2598
|
+
encoding,
|
|
2599
|
+
params
|
|
2600
|
+
);
|
|
2601
|
+
}
|
|
2602
|
+
async buildGatewayUrl(actorId) {
|
|
2603
|
+
if (this.#metadataPromise) {
|
|
2604
|
+
await this.#metadataPromise;
|
|
2451
2605
|
}
|
|
2452
|
-
|
|
2606
|
+
const endpoint = getEndpoint(this.#config);
|
|
2607
|
+
return buildActorGatewayUrl(endpoint, actorId, this.#config.token);
|
|
2453
2608
|
}
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
return new Proxy(client, {
|
|
2458
|
-
get: (target, prop, receiver) => {
|
|
2459
|
-
if (typeof prop === "symbol" || prop in target) {
|
|
2460
|
-
const value = Reflect.get(target, prop, receiver);
|
|
2461
|
-
if (typeof value === "function") {
|
|
2462
|
-
return value.bind(target);
|
|
2463
|
-
}
|
|
2464
|
-
return value;
|
|
2465
|
-
}
|
|
2466
|
-
if (typeof prop === "string") {
|
|
2467
|
-
return {
|
|
2468
|
-
// Handle methods (stateless action)
|
|
2469
|
-
get: (key, opts) => {
|
|
2470
|
-
return target.get(prop, key, opts);
|
|
2471
|
-
},
|
|
2472
|
-
getOrCreate: (key, opts) => {
|
|
2473
|
-
return target.getOrCreate(prop, key, opts);
|
|
2474
|
-
},
|
|
2475
|
-
getForId: (actorId, opts) => {
|
|
2476
|
-
return target.getForId(prop, actorId, opts);
|
|
2477
|
-
},
|
|
2478
|
-
create: async (key, opts = {}) => {
|
|
2479
|
-
return await target.create(prop, key, opts);
|
|
2480
|
-
}
|
|
2481
|
-
};
|
|
2482
|
-
}
|
|
2483
|
-
return void 0;
|
|
2609
|
+
async proxyRequest(_c, actorRequest, actorId) {
|
|
2610
|
+
if (this.#metadataPromise) {
|
|
2611
|
+
await this.#metadataPromise;
|
|
2484
2612
|
}
|
|
2485
|
-
|
|
2486
|
-
|
|
2487
|
-
|
|
2488
|
-
|
|
2489
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
const value = Reflect.get(target, prop, target);
|
|
2496
|
-
if (typeof value === "function") {
|
|
2497
|
-
return value.bind(target);
|
|
2498
|
-
}
|
|
2499
|
-
return value;
|
|
2500
|
-
}
|
|
2501
|
-
if (typeof prop === "string") {
|
|
2502
|
-
if (prop === "then") return void 0;
|
|
2503
|
-
let method = methodCache.get(prop);
|
|
2504
|
-
if (!method) {
|
|
2505
|
-
method = (...args) => target.action({ name: prop, args });
|
|
2506
|
-
methodCache.set(prop, method);
|
|
2507
|
-
}
|
|
2508
|
-
return method;
|
|
2509
|
-
}
|
|
2510
|
-
},
|
|
2511
|
-
// Support for 'in' operator
|
|
2512
|
-
has(target, prop) {
|
|
2513
|
-
if (typeof prop === "string") return true;
|
|
2514
|
-
return Reflect.has(target, prop);
|
|
2515
|
-
},
|
|
2516
|
-
// Support instanceof checks
|
|
2517
|
-
getPrototypeOf(target) {
|
|
2518
|
-
return Reflect.getPrototypeOf(target);
|
|
2519
|
-
},
|
|
2520
|
-
// Prevent property enumeration of non-existent action methods
|
|
2521
|
-
ownKeys(target) {
|
|
2522
|
-
return Reflect.ownKeys(target);
|
|
2523
|
-
},
|
|
2524
|
-
// Support proper property descriptors
|
|
2525
|
-
getOwnPropertyDescriptor(target, prop) {
|
|
2526
|
-
const targetDescriptor = Reflect.getOwnPropertyDescriptor(
|
|
2527
|
-
target,
|
|
2528
|
-
prop
|
|
2529
|
-
);
|
|
2530
|
-
if (targetDescriptor) {
|
|
2531
|
-
return targetDescriptor;
|
|
2532
|
-
}
|
|
2533
|
-
if (typeof prop === "string") {
|
|
2534
|
-
return {
|
|
2535
|
-
configurable: true,
|
|
2536
|
-
enumerable: false,
|
|
2537
|
-
writable: false,
|
|
2538
|
-
value: (...args) => target.action({ name: prop, args })
|
|
2539
|
-
};
|
|
2540
|
-
}
|
|
2541
|
-
return void 0;
|
|
2613
|
+
return await sendHttpRequestToActor(
|
|
2614
|
+
this.#config,
|
|
2615
|
+
actorId,
|
|
2616
|
+
actorRequest
|
|
2617
|
+
);
|
|
2618
|
+
}
|
|
2619
|
+
async proxyWebSocket(c, path, actorId, encoding, params) {
|
|
2620
|
+
var _a, _b;
|
|
2621
|
+
if (this.#metadataPromise) {
|
|
2622
|
+
await this.#metadataPromise;
|
|
2542
2623
|
}
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2624
|
+
const upgradeWebSocket = (_b = (_a = this.#config).getUpgradeWebSocket) == null ? void 0 : _b.call(_a);
|
|
2625
|
+
invariant5(upgradeWebSocket, "missing getUpgradeWebSocket");
|
|
2626
|
+
const endpoint = getEndpoint(this.#config);
|
|
2627
|
+
const guardUrl = combineUrlPath(endpoint, path);
|
|
2628
|
+
const wsGuardUrl = guardUrl.replace("http://", "ws://");
|
|
2629
|
+
logger2().debug({
|
|
2630
|
+
msg: "forwarding websocket to actor via guard",
|
|
2631
|
+
actorId,
|
|
2632
|
+
path,
|
|
2633
|
+
guardUrl
|
|
2634
|
+
});
|
|
2635
|
+
const protocols = buildWebSocketProtocols(
|
|
2636
|
+
this.#config,
|
|
2637
|
+
encoding,
|
|
2638
|
+
params
|
|
2639
|
+
);
|
|
2640
|
+
const args = await createWebSocketProxy(c, wsGuardUrl, protocols);
|
|
2641
|
+
return await upgradeWebSocket(() => args)(c, noopNext());
|
|
2552
2642
|
}
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
/**
|
|
2557
|
-
* Endpoint to connect to for Rivet Engine or RivetKit manager API.
|
|
2558
|
-
*
|
|
2559
|
-
* Supports URL auth syntax for namespace and token:
|
|
2560
|
-
* - `https://namespace:token@api.rivet.dev`
|
|
2561
|
-
* - `https://namespace@api.rivet.dev`
|
|
2562
|
-
*
|
|
2563
|
-
* Can also be set via RIVET_ENDPOINT environment variables.
|
|
2564
|
-
*
|
|
2565
|
-
* Defaults to current origin + /api/rivet in browser, or 127.0.0.1:6420 server-side.
|
|
2566
|
-
*/
|
|
2567
|
-
endpoint: z2.string().optional().transform(
|
|
2568
|
-
(val) => val ?? getRivetEngine() ?? getRivetEndpoint() ?? getDefaultEndpoint()
|
|
2569
|
-
),
|
|
2570
|
-
/** Token to use to authenticate with the API. */
|
|
2571
|
-
token: z2.string().optional().transform((val) => val ?? getRivetToken()),
|
|
2572
|
-
/** Namespace to connect to. */
|
|
2573
|
-
namespace: z2.string().optional().transform((val) => val ?? getRivetNamespace()),
|
|
2574
|
-
/** Name of the runner. This is used to group together runners in to different pools. */
|
|
2575
|
-
runnerName: z2.string().default(() => getRivetRunner() ?? "default"),
|
|
2576
|
-
encoding: EncodingSchema.default("bare"),
|
|
2577
|
-
headers: z2.record(z2.string(), z2.string()).optional().default(() => ({})),
|
|
2578
|
-
// See RunConfig.getUpgradeWebSocket
|
|
2579
|
-
//
|
|
2580
|
-
// This is required in the client config in order to support
|
|
2581
|
-
// `proxyWebSocket`
|
|
2582
|
-
getUpgradeWebSocket: z2.custom().optional(),
|
|
2583
|
-
/** Whether to automatically perform health checks when the client is created. */
|
|
2584
|
-
disableMetadataLookup: z2.boolean().optional().default(false),
|
|
2585
|
-
/** Whether to enable RivetKit Devtools integration. */
|
|
2586
|
-
devtools: z2.boolean().default(
|
|
2587
|
-
() => {
|
|
2588
|
-
var _a, _b;
|
|
2589
|
-
return typeof window !== "undefined" && (((_a = window == null ? void 0 : window.location) == null ? void 0 : _a.hostname) === "127.0.0.1" || ((_b = window.location) == null ? void 0 : _b.hostname) === "localhost");
|
|
2643
|
+
async kvGet(actorId, key) {
|
|
2644
|
+
if (this.#metadataPromise) {
|
|
2645
|
+
await this.#metadataPromise;
|
|
2590
2646
|
}
|
|
2591
|
-
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
)
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
token: (parsedEndpoint == null ? void 0 : parsedEndpoint.token) ?? config.token
|
|
2608
|
-
};
|
|
2609
|
-
}
|
|
2610
|
-
function convertRegistryConfigToClientConfig(config) {
|
|
2611
|
-
var _a, _b;
|
|
2647
|
+
logger2().debug({ msg: "getting kv value via engine api", key });
|
|
2648
|
+
const response = await kvGet(
|
|
2649
|
+
this.#config,
|
|
2650
|
+
actorId,
|
|
2651
|
+
new TextDecoder("utf8").decode(key)
|
|
2652
|
+
);
|
|
2653
|
+
return response.value;
|
|
2654
|
+
}
|
|
2655
|
+
displayInformation() {
|
|
2656
|
+
return { properties: {} };
|
|
2657
|
+
}
|
|
2658
|
+
setGetUpgradeWebSocket(getUpgradeWebSocket) {
|
|
2659
|
+
this.#config.getUpgradeWebSocket = getUpgradeWebSocket;
|
|
2660
|
+
}
|
|
2661
|
+
};
|
|
2662
|
+
function apiActorToOutput(actor) {
|
|
2612
2663
|
return {
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
devtools: typeof window !== "undefined" && (((_a = window == null ? void 0 : window.location) == null ? void 0 : _a.hostname) === "127.0.0.1" || ((_b = window == null ? void 0 : window.location) == null ? void 0 : _b.hostname) === "localhost")
|
|
2664
|
+
actorId: actor.actor_id,
|
|
2665
|
+
name: actor.name,
|
|
2666
|
+
key: deserializeActorKey(actor.key),
|
|
2667
|
+
createTs: actor.create_ts,
|
|
2668
|
+
startTs: actor.start_ts ?? null,
|
|
2669
|
+
connectableTs: actor.connectable_ts ?? null,
|
|
2670
|
+
sleepTs: actor.sleep_ts ?? null,
|
|
2671
|
+
destroyTs: actor.destroy_ts ?? null,
|
|
2672
|
+
error: actor.error ?? void 0
|
|
2623
2673
|
};
|
|
2624
2674
|
}
|
|
2625
2675
|
|
|
2626
|
-
// src/client/mod.ts
|
|
2627
|
-
function createClient(endpointOrConfig) {
|
|
2628
|
-
const configInput = endpointOrConfig === void 0 ? {} : typeof endpointOrConfig === "string" ? { endpoint: endpointOrConfig } : endpointOrConfig;
|
|
2629
|
-
const config = ClientConfigSchema.parse(configInput);
|
|
2630
|
-
const driver = new RemoteManagerDriver(config);
|
|
2631
|
-
if (config.devtools) {
|
|
2632
|
-
injectDevtools(config);
|
|
2633
|
-
}
|
|
2634
|
-
return createClientWithDriver(driver, config);
|
|
2635
|
-
}
|
|
2636
|
-
|
|
2637
2676
|
export {
|
|
2638
2677
|
ActorClientError,
|
|
2639
2678
|
InternalError,
|
|
@@ -2644,14 +2683,11 @@ export {
|
|
|
2644
2683
|
ActorConnRaw,
|
|
2645
2684
|
ActorHandleRaw,
|
|
2646
2685
|
createClientWithDriver,
|
|
2647
|
-
ClientConfigSchemaBase,
|
|
2648
2686
|
ClientConfigSchema,
|
|
2649
|
-
transformClientConfig,
|
|
2650
2687
|
convertRegistryConfigToClientConfig,
|
|
2651
2688
|
getEndpoint,
|
|
2652
2689
|
getDatacenters,
|
|
2653
2690
|
updateRunnerConfig,
|
|
2654
|
-
RemoteManagerDriver
|
|
2655
|
-
createClient
|
|
2691
|
+
RemoteManagerDriver
|
|
2656
2692
|
};
|
|
2657
|
-
//# sourceMappingURL=chunk-
|
|
2693
|
+
//# sourceMappingURL=chunk-WW27B6DM.js.map
|