rivetkit 2.0.2 → 2.0.4-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/README.md +3 -5
- package/dist/browser/client.d.ts +2485 -0
- package/dist/browser/client.js +5182 -0
- package/dist/browser/client.js.map +1 -0
- package/dist/browser/inspector/client.d.ts +130 -0
- package/dist/browser/inspector/client.js +2854 -0
- package/dist/browser/inspector/client.js.map +1 -0
- package/dist/browser/v3-DnYObHH3.d.ts +279 -0
- package/dist/inspector.tar.gz +0 -0
- package/dist/schemas/actor-inspector/v1.ts +784 -0
- package/dist/schemas/actor-inspector/v2.ts +796 -0
- package/dist/schemas/actor-inspector/v3.ts +899 -0
- package/dist/schemas/actor-persist/v1.ts +225 -0
- package/dist/schemas/actor-persist/v2.ts +268 -0
- package/dist/schemas/actor-persist/v3.ts +280 -0
- package/dist/schemas/actor-persist/v4.ts +406 -0
- package/dist/schemas/client-protocol/v1.ts +441 -0
- package/dist/schemas/client-protocol/v2.ts +438 -0
- package/dist/schemas/client-protocol/v3.ts +554 -0
- package/dist/schemas/file-system-driver/v1.ts +108 -0
- package/dist/schemas/file-system-driver/v2.ts +142 -0
- package/dist/schemas/file-system-driver/v3.ts +167 -0
- package/dist/schemas/persist/v1.ts +781 -0
- package/dist/schemas/transport/v1.ts +697 -0
- package/dist/tsup/actor/errors.cjs +106 -0
- package/dist/tsup/actor/errors.cjs.map +1 -0
- package/dist/tsup/actor/errors.d.cts +188 -0
- package/dist/tsup/actor/errors.d.ts +188 -0
- package/dist/tsup/actor/errors.js +106 -0
- package/dist/tsup/actor/errors.js.map +1 -0
- package/dist/tsup/actor-router-consts-D29T1Z-K.d.cts +24 -0
- package/dist/tsup/actor-router-consts-D29T1Z-K.d.ts +24 -0
- package/dist/tsup/chunk-325TLXJT.js +1060 -0
- package/dist/tsup/chunk-325TLXJT.js.map +1 -0
- package/dist/tsup/chunk-424PT5DM.js +23 -0
- package/dist/tsup/chunk-424PT5DM.js.map +1 -0
- package/dist/tsup/chunk-4JVIG3SS.cjs +6289 -0
- package/dist/tsup/chunk-4JVIG3SS.cjs.map +1 -0
- package/dist/tsup/chunk-6LJAZ5R4.cjs +96 -0
- package/dist/tsup/chunk-6LJAZ5R4.cjs.map +1 -0
- package/dist/tsup/chunk-6XU3FMCB.cjs +534 -0
- package/dist/tsup/chunk-6XU3FMCB.cjs.map +1 -0
- package/dist/tsup/chunk-7HTNH26M.js +509 -0
- package/dist/tsup/chunk-7HTNH26M.js.map +1 -0
- package/dist/tsup/chunk-AUVH72RE.cjs +5977 -0
- package/dist/tsup/chunk-AUVH72RE.cjs.map +1 -0
- package/dist/tsup/chunk-D4BYUPNQ.js +645 -0
- package/dist/tsup/chunk-D4BYUPNQ.js.map +1 -0
- package/dist/tsup/chunk-HDQ2JUQT.cjs +23 -0
- package/dist/tsup/chunk-HDQ2JUQT.cjs.map +1 -0
- package/dist/tsup/chunk-HHXX2VRM.js +6289 -0
- package/dist/tsup/chunk-HHXX2VRM.js.map +1 -0
- package/dist/tsup/chunk-JEAEA2PB.js +49 -0
- package/dist/tsup/chunk-JEAEA2PB.js.map +1 -0
- package/dist/tsup/chunk-JYSEG3VF.cjs +642 -0
- package/dist/tsup/chunk-JYSEG3VF.cjs.map +1 -0
- package/dist/tsup/chunk-K6DGYILQ.js +2657 -0
- package/dist/tsup/chunk-K6DGYILQ.js.map +1 -0
- package/dist/tsup/chunk-KJSYAUOM.js +96 -0
- package/dist/tsup/chunk-KJSYAUOM.js.map +1 -0
- package/dist/tsup/chunk-L47L3ZWJ.cjs +509 -0
- package/dist/tsup/chunk-L47L3ZWJ.cjs.map +1 -0
- package/dist/tsup/chunk-LXUQ667X.js +2006 -0
- package/dist/tsup/chunk-LXUQ667X.js.map +1 -0
- package/dist/tsup/chunk-MXNPAB5W.js +5977 -0
- package/dist/tsup/chunk-MXNPAB5W.js.map +1 -0
- package/dist/tsup/chunk-N4KRDJ56.js +72 -0
- package/dist/tsup/chunk-N4KRDJ56.js.map +1 -0
- package/dist/tsup/chunk-NIYZDWMW.cjs +2006 -0
- package/dist/tsup/chunk-NIYZDWMW.cjs.map +1 -0
- package/dist/tsup/chunk-PQZHDKRW.cjs +1060 -0
- package/dist/tsup/chunk-PQZHDKRW.cjs.map +1 -0
- package/dist/tsup/chunk-PVOE6BU7.cjs +1050 -0
- package/dist/tsup/chunk-PVOE6BU7.cjs.map +1 -0
- package/dist/tsup/chunk-Q4UD2GA4.cjs +1810 -0
- package/dist/tsup/chunk-Q4UD2GA4.cjs.map +1 -0
- package/dist/tsup/chunk-QUD664YZ.js +1810 -0
- package/dist/tsup/chunk-QUD664YZ.js.map +1 -0
- package/dist/tsup/chunk-RTOCTWME.js +1050 -0
- package/dist/tsup/chunk-RTOCTWME.js.map +1 -0
- package/dist/tsup/chunk-SAZZ4SB2.cjs +2657 -0
- package/dist/tsup/chunk-SAZZ4SB2.cjs.map +1 -0
- package/dist/tsup/chunk-SR3KQE7Q.cjs +72 -0
- package/dist/tsup/chunk-SR3KQE7Q.cjs.map +1 -0
- package/dist/tsup/chunk-V2GHLYC6.cjs +49 -0
- package/dist/tsup/chunk-V2GHLYC6.cjs.map +1 -0
- package/dist/tsup/chunk-V3WG7XTW.cjs +645 -0
- package/dist/tsup/chunk-V3WG7XTW.cjs.map +1 -0
- package/dist/tsup/chunk-VKVNIQRQ.js +257 -0
- package/dist/tsup/chunk-VKVNIQRQ.js.map +1 -0
- package/dist/tsup/chunk-WMPW7JYC.js +642 -0
- package/dist/tsup/chunk-WMPW7JYC.js.map +1 -0
- package/dist/tsup/chunk-Z7HNQ2WF.js +534 -0
- package/dist/tsup/chunk-Z7HNQ2WF.js.map +1 -0
- package/dist/tsup/chunk-ZFY5J2EP.cjs +257 -0
- package/dist/tsup/chunk-ZFY5J2EP.cjs.map +1 -0
- package/dist/tsup/client/mod.cjs +33 -0
- package/dist/tsup/client/mod.cjs.map +1 -0
- package/dist/tsup/client/mod.d.cts +64 -0
- package/dist/tsup/client/mod.d.ts +64 -0
- package/dist/tsup/client/mod.js +33 -0
- package/dist/tsup/client/mod.js.map +1 -0
- package/dist/tsup/common/log.cjs +21 -0
- package/dist/tsup/common/log.cjs.map +1 -0
- package/dist/tsup/common/log.d.cts +34 -0
- package/dist/tsup/common/log.d.ts +34 -0
- package/dist/tsup/common/log.js +21 -0
- package/dist/tsup/common/log.js.map +1 -0
- package/dist/tsup/common/websocket.cjs +10 -0
- package/dist/tsup/common/websocket.cjs.map +1 -0
- package/dist/tsup/common/websocket.d.cts +3 -0
- package/dist/tsup/common/websocket.d.ts +3 -0
- package/dist/tsup/common/websocket.js +10 -0
- package/dist/tsup/common/websocket.js.map +1 -0
- package/dist/tsup/config-BiNoIHRs.d.cts +80 -0
- package/dist/tsup/config-BiNoIHRs.d.ts +80 -0
- package/dist/tsup/config-P3XujgRr.d.ts +2594 -0
- package/dist/tsup/config-_gfywqqI.d.cts +2594 -0
- package/dist/tsup/context-Bxd8Cx4H.d.cts +75 -0
- package/dist/tsup/context-uNA4TRn3.d.ts +75 -0
- package/dist/tsup/db/drizzle/mod.cjs +49 -0
- package/dist/tsup/db/drizzle/mod.cjs.map +1 -0
- package/dist/tsup/db/drizzle/mod.d.cts +17 -0
- package/dist/tsup/db/drizzle/mod.d.ts +17 -0
- package/dist/tsup/db/drizzle/mod.js +49 -0
- package/dist/tsup/db/drizzle/mod.js.map +1 -0
- package/dist/tsup/db/mod.cjs +9 -0
- package/dist/tsup/db/mod.cjs.map +1 -0
- package/dist/tsup/db/mod.d.cts +9 -0
- package/dist/tsup/db/mod.d.ts +9 -0
- package/dist/tsup/db/mod.js +9 -0
- package/dist/tsup/db/mod.js.map +1 -0
- package/dist/tsup/driver-BcLvZcKl.d.cts +13 -0
- package/dist/tsup/driver-CPGHKXyh.d.ts +13 -0
- package/dist/tsup/driver-helpers/mod.cjs +53 -0
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -0
- package/dist/tsup/driver-helpers/mod.d.cts +47 -0
- package/dist/tsup/driver-helpers/mod.d.ts +47 -0
- package/dist/tsup/driver-helpers/mod.js +53 -0
- package/dist/tsup/driver-helpers/mod.js.map +1 -0
- package/dist/tsup/driver-test-suite/mod.cjs +4974 -0
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -0
- package/dist/tsup/driver-test-suite/mod.d.cts +73 -0
- package/dist/tsup/driver-test-suite/mod.d.ts +73 -0
- package/dist/tsup/driver-test-suite/mod.js +4974 -0
- package/dist/tsup/driver-test-suite/mod.js.map +1 -0
- package/dist/tsup/inspector/mod.cjs +164 -0
- package/dist/tsup/inspector/mod.cjs.map +1 -0
- package/dist/tsup/inspector/mod.d.cts +130 -0
- package/dist/tsup/inspector/mod.d.ts +130 -0
- package/dist/tsup/inspector/mod.js +164 -0
- package/dist/tsup/inspector/mod.js.map +1 -0
- package/dist/tsup/keys-CydblqMh.d.cts +13 -0
- package/dist/tsup/keys-CydblqMh.d.ts +13 -0
- package/dist/tsup/mod.cjs +82 -0
- package/dist/tsup/mod.cjs.map +1 -0
- package/dist/tsup/mod.d.cts +126 -0
- package/dist/tsup/mod.d.ts +126 -0
- package/dist/tsup/mod.js +82 -0
- package/dist/tsup/mod.js.map +1 -0
- package/dist/tsup/serve-test-suite/mod.cjs +2601 -0
- package/dist/tsup/serve-test-suite/mod.cjs.map +1 -0
- package/dist/tsup/serve-test-suite/mod.d.cts +9 -0
- package/dist/tsup/serve-test-suite/mod.d.ts +9 -0
- package/dist/tsup/serve-test-suite/mod.js +2601 -0
- package/dist/tsup/serve-test-suite/mod.js.map +1 -0
- package/dist/tsup/test/mod.cjs +90 -0
- package/dist/tsup/test/mod.cjs.map +1 -0
- package/dist/tsup/test/mod.d.cts +26 -0
- package/dist/tsup/test/mod.d.ts +26 -0
- package/dist/tsup/test/mod.js +90 -0
- package/dist/tsup/test/mod.js.map +1 -0
- package/dist/tsup/utils-fwx3o3K9.d.cts +18 -0
- package/dist/tsup/utils-fwx3o3K9.d.ts +18 -0
- package/dist/tsup/utils.cjs +43 -0
- package/dist/tsup/utils.cjs.map +1 -0
- package/dist/tsup/utils.d.cts +148 -0
- package/dist/tsup/utils.d.ts +148 -0
- package/dist/tsup/utils.js +43 -0
- package/dist/tsup/utils.js.map +1 -0
- package/dist/tsup/v3-DnYObHH3.d.cts +279 -0
- package/dist/tsup/v3-DnYObHH3.d.ts +279 -0
- package/dist/tsup/workflow/mod.cjs +16 -0
- package/dist/tsup/workflow/mod.cjs.map +1 -0
- package/dist/tsup/workflow/mod.d.cts +25 -0
- package/dist/tsup/workflow/mod.d.ts +25 -0
- package/dist/tsup/workflow/mod.js +16 -0
- package/dist/tsup/workflow/mod.js.map +1 -0
- package/package.json +293 -5
- package/src/actor/config.ts +1221 -0
- package/src/actor/conn/driver.ts +61 -0
- package/src/actor/conn/drivers/http.ts +17 -0
- package/src/actor/conn/drivers/raw-request.ts +24 -0
- package/src/actor/conn/drivers/raw-websocket.ts +65 -0
- package/src/actor/conn/drivers/websocket.ts +144 -0
- package/src/actor/conn/mod.ts +288 -0
- package/src/actor/conn/persisted.ts +81 -0
- package/src/actor/conn/state-manager.ts +196 -0
- package/src/actor/contexts/action.ts +47 -0
- package/src/actor/contexts/base/actor.ts +347 -0
- package/src/actor/contexts/base/conn-init.ts +68 -0
- package/src/actor/contexts/base/conn.ts +73 -0
- package/src/actor/contexts/before-action-response.ts +42 -0
- package/src/actor/contexts/before-connect.ts +31 -0
- package/src/actor/contexts/connect.ts +42 -0
- package/src/actor/contexts/create-conn-state.ts +32 -0
- package/src/actor/contexts/create-vars.ts +39 -0
- package/src/actor/contexts/create.ts +39 -0
- package/src/actor/contexts/destroy.ts +42 -0
- package/src/actor/contexts/disconnect.ts +43 -0
- package/src/actor/contexts/index.ts +33 -0
- package/src/actor/contexts/request.ts +80 -0
- package/src/actor/contexts/run.ts +47 -0
- package/src/actor/contexts/sleep.ts +42 -0
- package/src/actor/contexts/state-change.ts +42 -0
- package/src/actor/contexts/wake.ts +42 -0
- package/src/actor/contexts/websocket.ts +80 -0
- package/src/actor/database.ts +13 -0
- package/src/actor/definition.ts +64 -0
- package/src/actor/driver.ts +114 -0
- package/src/actor/errors.ts +556 -0
- package/src/actor/instance/connection-manager.ts +574 -0
- package/src/actor/instance/event-manager.ts +314 -0
- package/src/actor/instance/keys.ts +146 -0
- package/src/actor/instance/kv.ts +241 -0
- package/src/actor/instance/mod.ts +1658 -0
- package/src/actor/instance/persisted.ts +67 -0
- package/src/actor/instance/queue-manager.ts +603 -0
- package/src/actor/instance/queue.ts +345 -0
- package/src/actor/instance/schedule-manager.ts +392 -0
- package/src/actor/instance/state-manager.ts +542 -0
- package/src/actor/instance/traces-driver.ts +128 -0
- package/src/actor/keys.test.ts +275 -0
- package/src/actor/keys.ts +89 -0
- package/src/actor/log.ts +6 -0
- package/src/actor/mod.ts +110 -0
- package/src/actor/protocol/old.ts +416 -0
- package/src/actor/protocol/serde.ts +222 -0
- package/src/actor/router-endpoints.ts +400 -0
- package/src/actor/router-websocket-endpoints.test.ts +54 -0
- package/src/actor/router-websocket-endpoints.ts +405 -0
- package/src/actor/router.ts +380 -0
- package/src/actor/schedule.ts +17 -0
- package/src/actor/schema.ts +291 -0
- package/src/actor/utils.test.ts +48 -0
- package/src/actor/utils.ts +158 -0
- package/src/client/actor-common.ts +32 -0
- package/src/client/actor-conn.ts +1262 -0
- package/src/client/actor-handle.ts +344 -0
- package/src/client/actor-query.ts +112 -0
- package/src/client/client.ts +558 -0
- package/src/client/config.ts +151 -0
- package/src/client/errors.ts +76 -0
- package/src/client/log.ts +5 -0
- package/src/client/mod.browser.ts +2 -0
- package/src/client/mod.ts +70 -0
- package/src/client/queue.ts +146 -0
- package/src/client/raw-utils.ts +149 -0
- package/src/client/test.ts +44 -0
- package/src/client/utils.ts +252 -0
- package/src/common/actor-router-consts.ts +59 -0
- package/src/common/cors.ts +57 -0
- package/src/common/eventsource-interface.ts +47 -0
- package/src/common/eventsource.ts +44 -0
- package/src/common/inline-websocket-adapter.ts +154 -0
- package/src/common/log-levels.ts +27 -0
- package/src/common/log.ts +229 -0
- package/src/common/logfmt.ts +221 -0
- package/src/common/network.ts +2 -0
- package/src/common/router.ts +174 -0
- package/src/common/utils.ts +339 -0
- package/src/common/websocket-interface.ts +7 -0
- package/src/common/websocket.ts +43 -0
- package/src/db/config.ts +100 -0
- package/src/db/drizzle/mod.ts +226 -0
- package/src/db/drizzle/sqlite-core.ts +22 -0
- package/src/db/mod.ts +125 -0
- package/src/db/shared.ts +92 -0
- package/src/db/sqlite-vfs.ts +12 -0
- package/src/devtools-loader/index.ts +33 -0
- package/src/devtools-loader/log.ts +5 -0
- package/src/driver-helpers/mod.ts +33 -0
- package/src/driver-helpers/utils.ts +54 -0
- package/src/driver-test-suite/log.ts +5 -0
- package/src/driver-test-suite/mod.ts +293 -0
- package/src/driver-test-suite/test-inline-client-driver.ts +307 -0
- package/src/driver-test-suite/tests/access-control.ts +218 -0
- package/src/driver-test-suite/tests/action-features.ts +203 -0
- package/src/driver-test-suite/tests/actor-conn-hibernation.ts +152 -0
- package/src/driver-test-suite/tests/actor-conn-state.ts +300 -0
- package/src/driver-test-suite/tests/actor-conn.ts +596 -0
- package/src/driver-test-suite/tests/actor-db-raw.ts +73 -0
- package/src/driver-test-suite/tests/actor-db.ts +477 -0
- package/src/driver-test-suite/tests/actor-destroy.ts +294 -0
- package/src/driver-test-suite/tests/actor-driver.ts +18 -0
- package/src/driver-test-suite/tests/actor-error-handling.ts +150 -0
- package/src/driver-test-suite/tests/actor-handle.ts +312 -0
- package/src/driver-test-suite/tests/actor-inline-client.ts +163 -0
- package/src/driver-test-suite/tests/actor-inspector.ts +264 -0
- package/src/driver-test-suite/tests/actor-kv.ts +65 -0
- package/src/driver-test-suite/tests/actor-metadata.ts +116 -0
- package/src/driver-test-suite/tests/actor-onstatechange.ts +95 -0
- package/src/driver-test-suite/tests/actor-queue.ts +325 -0
- package/src/driver-test-suite/tests/actor-run.ts +181 -0
- package/src/driver-test-suite/tests/actor-schedule.ts +97 -0
- package/src/driver-test-suite/tests/actor-sleep.ts +415 -0
- package/src/driver-test-suite/tests/actor-state.ts +54 -0
- package/src/driver-test-suite/tests/actor-stateless.ts +70 -0
- package/src/driver-test-suite/tests/actor-vars.ts +97 -0
- package/src/driver-test-suite/tests/actor-workflow.ts +118 -0
- package/src/driver-test-suite/tests/manager-driver.ts +388 -0
- package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -0
- package/src/driver-test-suite/tests/raw-http-request-properties.ts +454 -0
- package/src/driver-test-suite/tests/raw-http.ts +359 -0
- package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -0
- package/src/driver-test-suite/tests/raw-websocket.ts +513 -0
- package/src/driver-test-suite/tests/request-access.ts +240 -0
- package/src/driver-test-suite/utils.ts +80 -0
- package/src/drivers/default.ts +38 -0
- package/src/drivers/engine/actor-driver.ts +1027 -0
- package/src/drivers/engine/config.ts +43 -0
- package/src/drivers/engine/log.ts +5 -0
- package/src/drivers/engine/mod.ts +36 -0
- package/src/drivers/file-system/actor.ts +102 -0
- package/src/drivers/file-system/global-state.ts +1445 -0
- package/src/drivers/file-system/kv-limits.ts +70 -0
- package/src/drivers/file-system/log.ts +5 -0
- package/src/drivers/file-system/manager.ts +300 -0
- package/src/drivers/file-system/mod.ts +78 -0
- package/src/drivers/file-system/sqlite-runtime.ts +210 -0
- package/src/drivers/file-system/utils.ts +125 -0
- package/src/engine-process/constants.ts +2 -0
- package/src/engine-process/log.ts +5 -0
- package/src/engine-process/mod.ts +464 -0
- package/src/globals.d.ts +35 -0
- package/src/inspector/actor-inspector.ts +352 -0
- package/src/inspector/config.ts +49 -0
- package/src/inspector/handler.ts +273 -0
- package/src/inspector/log.ts +5 -0
- package/src/inspector/mod.browser.ts +8 -0
- package/src/inspector/mod.ts +4 -0
- package/src/inspector/serve-ui.ts +40 -0
- package/src/inspector/transport.ts +18 -0
- package/src/inspector/utils.ts +32 -0
- package/src/manager/driver.ts +106 -0
- package/src/manager/gateway.ts +668 -0
- package/src/manager/log.ts +5 -0
- package/src/manager/mod.ts +2 -0
- package/src/manager/protocol/mod.ts +22 -0
- package/src/manager/protocol/query.ts +85 -0
- package/src/manager/router-schema.ts +22 -0
- package/src/manager/router.ts +660 -0
- package/src/manager-api/actors.ts +83 -0
- package/src/manager-api/common.ts +4 -0
- package/src/mod.ts +24 -0
- package/src/registry/config/driver.ts +21 -0
- package/src/registry/config/index.ts +510 -0
- package/src/registry/config/legacy-runner.ts +157 -0
- package/src/registry/config/runner.ts +21 -0
- package/src/registry/config/serverless.ts +94 -0
- package/src/registry/index.ts +194 -0
- package/src/registry/log.ts +5 -0
- package/src/remote-manager-driver/actor-http-client.ts +84 -0
- package/src/remote-manager-driver/actor-websocket-client.ts +81 -0
- package/src/remote-manager-driver/api-endpoints.ts +159 -0
- package/src/remote-manager-driver/api-utils.ts +69 -0
- package/src/remote-manager-driver/log.ts +5 -0
- package/src/remote-manager-driver/metadata.ts +64 -0
- package/src/remote-manager-driver/mod.ts +414 -0
- package/src/remote-manager-driver/ws-proxy.ts +189 -0
- package/src/schemas/actor-inspector/mod.ts +1 -0
- package/src/schemas/actor-inspector/versioned.ts +233 -0
- package/src/schemas/actor-persist/mod.ts +1 -0
- package/src/schemas/actor-persist/versioned.ts +217 -0
- package/src/schemas/client-protocol/mod.ts +1 -0
- package/src/schemas/client-protocol/versioned.ts +330 -0
- package/src/schemas/client-protocol-zod/mod.ts +118 -0
- package/src/schemas/file-system-driver/mod.ts +1 -0
- package/src/schemas/file-system-driver/versioned.ts +135 -0
- package/src/schemas/persist/mod.ts +1 -0
- package/src/schemas/transport/mod.ts +1 -0
- package/src/serde.ts +138 -0
- package/src/serve-test-suite/mod.ts +148 -0
- package/src/serverless/configure.ts +82 -0
- package/src/serverless/log.ts +5 -0
- package/src/serverless/router.test.ts +299 -0
- package/src/serverless/router.ts +215 -0
- package/src/test/log.ts +5 -0
- package/src/test/mod.ts +99 -0
- package/src/utils/crypto.ts +24 -0
- package/src/utils/endpoint-parser.test.ts +202 -0
- package/src/utils/endpoint-parser.ts +124 -0
- package/src/utils/env-vars.ts +78 -0
- package/src/utils/node.ts +178 -0
- package/src/utils/router.ts +83 -0
- package/src/utils/serve.ts +212 -0
- package/src/utils.test.ts +34 -0
- package/src/utils.ts +437 -0
- package/src/workflow/constants.ts +2 -0
- package/src/workflow/context.ts +597 -0
- package/src/workflow/driver.ts +194 -0
- package/src/workflow/inspector.ts +268 -0
- package/src/workflow/mod.ts +128 -0
|
@@ -0,0 +1,1810 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunkAUVH72REcjs = require('./chunk-AUVH72RE.cjs');
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
var _chunkSAZZ4SB2cjs = require('./chunk-SAZZ4SB2.cjs');
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
var _chunk4JVIG3SScjs = require('./chunk-4JVIG3SS.cjs');
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
var _chunkPVOE6BU7cjs = require('./chunk-PVOE6BU7.cjs');
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
var _chunkPQZHDKRWcjs = require('./chunk-PQZHDKRW.cjs');
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
var _chunkL47L3ZWJcjs = require('./chunk-L47L3ZWJ.cjs');
|
|
84
|
+
|
|
85
|
+
// src/actor/mod.ts
|
|
86
|
+
function actor(input) {
|
|
87
|
+
const config = _chunkPVOE6BU7cjs.ActorConfigSchema.parse(input);
|
|
88
|
+
return new (0, _chunkAUVH72REcjs.ActorDefinition)(config);
|
|
89
|
+
}
|
|
90
|
+
var event2 = _chunkPVOE6BU7cjs.event;
|
|
91
|
+
var queue2 = _chunkPVOE6BU7cjs.queue;
|
|
92
|
+
|
|
93
|
+
// src/drivers/engine/actor-driver.ts
|
|
94
|
+
var _enginerunner = require('@rivetkit/engine-runner');
|
|
95
|
+
var _cborx = require('cbor-x'); var cbor = _interopRequireWildcard(_cborx);
|
|
96
|
+
var _streaming = require('hono/streaming');
|
|
97
|
+
var _ws = require('hono/ws');
|
|
98
|
+
var _invariant = require('invariant'); var _invariant2 = _interopRequireDefault(_invariant);
|
|
99
|
+
|
|
100
|
+
// src/drivers/engine/log.ts
|
|
101
|
+
function logger2() {
|
|
102
|
+
return _chunkPQZHDKRWcjs.getLogger.call(void 0, "driver-engine");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// src/drivers/engine/actor-driver.ts
|
|
106
|
+
var RUNNER_SSE_PING_INTERVAL = 1e3;
|
|
107
|
+
var RUNNER_STOP_WAIT_MS = 15e3;
|
|
108
|
+
var CONN_MESSAGE_ACK_DEADLINE = 5e3;
|
|
109
|
+
var CONN_BUFFERED_MESSAGE_SIZE_THRESHOLD = 5e5;
|
|
110
|
+
var EngineActorDriver = class {
|
|
111
|
+
#config;
|
|
112
|
+
#managerDriver;
|
|
113
|
+
#inlineClient;
|
|
114
|
+
#runner;
|
|
115
|
+
#actors = /* @__PURE__ */ new Map();
|
|
116
|
+
#actorRouter;
|
|
117
|
+
#runnerStarted = _chunkPQZHDKRWcjs.promiseWithResolvers.call(void 0, (reason) => logger2().warn({ msg: "unhandled runner started promise rejection", reason }));
|
|
118
|
+
#runnerStopped = _chunkPQZHDKRWcjs.promiseWithResolvers.call(void 0, (reason) => logger2().warn({ msg: "unhandled runner stopped promise rejection", reason }));
|
|
119
|
+
#isRunnerStopped = false;
|
|
120
|
+
// HACK: Track actor stop intent locally since the runner protocol doesn't
|
|
121
|
+
// pass the stop reason to onActorStop. This will be fixed when the runner
|
|
122
|
+
// protocol is updated to send the intent directly (see RVT-5284)
|
|
123
|
+
#actorStopIntent = /* @__PURE__ */ new Map();
|
|
124
|
+
// Map of conn IDs to message index waiting to be persisted before sending
|
|
125
|
+
// an ack
|
|
126
|
+
//
|
|
127
|
+
// serverMessageIndex is updated and pendingAck is flagged in needed in
|
|
128
|
+
// onBeforePersistConnect, then the HWS ack message is sent in
|
|
129
|
+
// onAfterPersistConn. This allows us to track what's about to be written
|
|
130
|
+
// to storage to prevent race conditions with the serverMessageIndex being
|
|
131
|
+
// updated while writing the existing state.
|
|
132
|
+
//
|
|
133
|
+
// bufferedMessageSize tracks the total bytes received since last persist
|
|
134
|
+
// to force a saveState when threshold is reached. This is the amount of
|
|
135
|
+
// data currently buffered on the gateway.
|
|
136
|
+
#hwsMessageIndex = /* @__PURE__ */ new Map();
|
|
137
|
+
constructor(config, managerDriver, inlineClient) {
|
|
138
|
+
this.#config = config;
|
|
139
|
+
this.#managerDriver = managerDriver;
|
|
140
|
+
this.#inlineClient = inlineClient;
|
|
141
|
+
const token = config.token;
|
|
142
|
+
this.#actorRouter = _chunkAUVH72REcjs.createActorRouter.call(void 0,
|
|
143
|
+
config,
|
|
144
|
+
this,
|
|
145
|
+
void 0,
|
|
146
|
+
config.test.enabled
|
|
147
|
+
);
|
|
148
|
+
const engineRunnerConfig = {
|
|
149
|
+
version: config.runner.version,
|
|
150
|
+
endpoint: _chunkSAZZ4SB2cjs.getEndpoint.call(void 0, config),
|
|
151
|
+
token,
|
|
152
|
+
namespace: config.namespace,
|
|
153
|
+
totalSlots: config.runner.totalSlots,
|
|
154
|
+
runnerName: config.runner.runnerName,
|
|
155
|
+
runnerKey: _nullishCoalesce(config.runner.runnerKey, () => ( crypto.randomUUID())),
|
|
156
|
+
metadata: {
|
|
157
|
+
rivetkit: { version: _chunkPQZHDKRWcjs.VERSION }
|
|
158
|
+
},
|
|
159
|
+
prepopulateActorNames: _chunk4JVIG3SScjs.buildActorNames.call(void 0, config),
|
|
160
|
+
onConnected: () => {
|
|
161
|
+
this.#runnerStarted.resolve(void 0);
|
|
162
|
+
},
|
|
163
|
+
onDisconnected: (_code, _reason) => {
|
|
164
|
+
},
|
|
165
|
+
onShutdown: () => {
|
|
166
|
+
this.#runnerStopped.resolve(void 0);
|
|
167
|
+
this.#isRunnerStopped = true;
|
|
168
|
+
},
|
|
169
|
+
fetch: this.#runnerFetch.bind(this),
|
|
170
|
+
websocket: this.#runnerWebSocket.bind(this),
|
|
171
|
+
hibernatableWebSocket: {
|
|
172
|
+
canHibernate: this.#hwsCanHibernate.bind(this)
|
|
173
|
+
},
|
|
174
|
+
onActorStart: this.#runnerOnActorStart.bind(this),
|
|
175
|
+
onActorStop: this.#runnerOnActorStop.bind(this),
|
|
176
|
+
logger: _chunkPQZHDKRWcjs.getLogger.call(void 0, "engine-runner")
|
|
177
|
+
};
|
|
178
|
+
this.#runner = new (0, _enginerunner.Runner)(engineRunnerConfig);
|
|
179
|
+
this.#runner.start();
|
|
180
|
+
logger2().debug({
|
|
181
|
+
msg: "engine runner started",
|
|
182
|
+
endpoint: config.endpoint,
|
|
183
|
+
namespace: config.namespace,
|
|
184
|
+
runnerName: config.runner.runnerName
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
getExtraActorLogParams() {
|
|
188
|
+
return { runnerId: _nullishCoalesce(this.#runner.runnerId, () => ( "-")) };
|
|
189
|
+
}
|
|
190
|
+
async #loadActorHandler(actorId) {
|
|
191
|
+
const handler = this.#actors.get(actorId);
|
|
192
|
+
if (!handler)
|
|
193
|
+
throw new Error(`Actor handler does not exist ${actorId}`);
|
|
194
|
+
if (handler.actorStartPromise) await handler.actorStartPromise.promise;
|
|
195
|
+
if (handler.actorStartError) throw handler.actorStartError;
|
|
196
|
+
if (!handler.actor) throw new Error("Actor should be loaded");
|
|
197
|
+
return handler;
|
|
198
|
+
}
|
|
199
|
+
getContext(actorId) {
|
|
200
|
+
return {};
|
|
201
|
+
}
|
|
202
|
+
async setAlarm(actor2, timestamp) {
|
|
203
|
+
const handler = this.#actors.get(actor2.id);
|
|
204
|
+
if (!handler) {
|
|
205
|
+
logger2().warn({
|
|
206
|
+
msg: "no handler for actor to set alarm"
|
|
207
|
+
});
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
if (handler.alarmTimeout) {
|
|
211
|
+
handler.alarmTimeout.abort();
|
|
212
|
+
handler.alarmTimeout = void 0;
|
|
213
|
+
}
|
|
214
|
+
const delay = Math.max(0, timestamp - Date.now());
|
|
215
|
+
handler.alarmTimeout = _chunkPQZHDKRWcjs.setLongTimeout.call(void 0, () => {
|
|
216
|
+
actor2.onAlarm();
|
|
217
|
+
handler.alarmTimeout = void 0;
|
|
218
|
+
}, delay);
|
|
219
|
+
this.#runner.setAlarm(actor2.id, timestamp);
|
|
220
|
+
}
|
|
221
|
+
// No database overrides - will use KV-backed implementation from rivetkit/db
|
|
222
|
+
// MARK: - Batch KV operations
|
|
223
|
+
async kvBatchPut(actorId, entries) {
|
|
224
|
+
await this.#runner.kvPut(actorId, entries);
|
|
225
|
+
}
|
|
226
|
+
async kvBatchGet(actorId, keys) {
|
|
227
|
+
return await this.#runner.kvGet(actorId, keys);
|
|
228
|
+
}
|
|
229
|
+
async kvBatchDelete(actorId, keys) {
|
|
230
|
+
await this.#runner.kvDelete(actorId, keys);
|
|
231
|
+
}
|
|
232
|
+
async kvList(actorId) {
|
|
233
|
+
const entries = await this.#runner.kvListPrefix(
|
|
234
|
+
actorId,
|
|
235
|
+
new Uint8Array()
|
|
236
|
+
);
|
|
237
|
+
const keys = entries.map(([key]) => key);
|
|
238
|
+
logger2().info({
|
|
239
|
+
msg: "kvList called",
|
|
240
|
+
actorId,
|
|
241
|
+
keysCount: keys.length,
|
|
242
|
+
keys: keys.map((k) => new TextDecoder().decode(k))
|
|
243
|
+
});
|
|
244
|
+
return keys;
|
|
245
|
+
}
|
|
246
|
+
async kvListPrefix(actorId, prefix) {
|
|
247
|
+
const result = await this.#runner.kvListPrefix(actorId, prefix);
|
|
248
|
+
logger2().info({
|
|
249
|
+
msg: "kvListPrefix called",
|
|
250
|
+
actorId,
|
|
251
|
+
prefixStr: new TextDecoder().decode(prefix),
|
|
252
|
+
entriesCount: result.length,
|
|
253
|
+
keys: result.map(([key]) => new TextDecoder().decode(key))
|
|
254
|
+
});
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
/** Creates a SQLite VFS instance for creating KV-backed databases */
|
|
258
|
+
async createSqliteVfs() {
|
|
259
|
+
const specifier = "@rivetkit/sqlite-vfs";
|
|
260
|
+
const { SqliteVfs } = await Promise.resolve().then(() => _interopRequireWildcard(require(specifier)));
|
|
261
|
+
return new SqliteVfs();
|
|
262
|
+
}
|
|
263
|
+
// MARK: - Actor Lifecycle
|
|
264
|
+
async loadActor(actorId) {
|
|
265
|
+
const handler = await this.#loadActorHandler(actorId);
|
|
266
|
+
if (!handler.actor) throw new Error(`Actor ${actorId} failed to load`);
|
|
267
|
+
return handler.actor;
|
|
268
|
+
}
|
|
269
|
+
startSleep(actorId) {
|
|
270
|
+
this.#actorStopIntent.set(actorId, "sleep");
|
|
271
|
+
this.#runner.sleepActor(actorId);
|
|
272
|
+
}
|
|
273
|
+
startDestroy(actorId) {
|
|
274
|
+
this.#actorStopIntent.set(actorId, "destroy");
|
|
275
|
+
this.#runner.stopActor(actorId);
|
|
276
|
+
}
|
|
277
|
+
async shutdownRunner(immediate) {
|
|
278
|
+
logger2().info({ msg: "stopping engine actor driver", immediate });
|
|
279
|
+
logger2().debug({
|
|
280
|
+
msg: "stopping all actors before shutdown",
|
|
281
|
+
actorCount: this.#actors.size
|
|
282
|
+
});
|
|
283
|
+
const stopPromises = [];
|
|
284
|
+
for (const [_actorId, handler] of this.#actors.entries()) {
|
|
285
|
+
if (handler.actor) {
|
|
286
|
+
stopPromises.push(
|
|
287
|
+
handler.actor.onStop("sleep").catch((err) => {
|
|
288
|
+
var _a;
|
|
289
|
+
(_a = handler.actor) == null ? void 0 : _a.rLog.error({
|
|
290
|
+
msg: "onStop errored",
|
|
291
|
+
error: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
|
|
292
|
+
});
|
|
293
|
+
})
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
await Promise.all(stopPromises);
|
|
298
|
+
logger2().debug({ msg: "all actors stopped" });
|
|
299
|
+
try {
|
|
300
|
+
await this.#runner.shutdown(immediate);
|
|
301
|
+
} catch (error) {
|
|
302
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
303
|
+
if (message.includes("WebSocket connection closed during shutdown")) {
|
|
304
|
+
logger2().debug({
|
|
305
|
+
msg: "ignoring shutdown websocket close race",
|
|
306
|
+
error: message
|
|
307
|
+
});
|
|
308
|
+
} else {
|
|
309
|
+
throw error;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
const stopped = await Promise.race([
|
|
313
|
+
this.#runnerStopped.promise.then(() => true),
|
|
314
|
+
new Promise(
|
|
315
|
+
(resolve) => setTimeout(() => resolve(false), RUNNER_STOP_WAIT_MS)
|
|
316
|
+
)
|
|
317
|
+
]);
|
|
318
|
+
if (!stopped) {
|
|
319
|
+
logger2().warn({
|
|
320
|
+
msg: "timed out waiting for runner shutdown",
|
|
321
|
+
waitMs: RUNNER_STOP_WAIT_MS
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
async serverlessHandleStart(c) {
|
|
326
|
+
return _streaming.streamSSE.call(void 0, c, async (stream) => {
|
|
327
|
+
stream.onAbort(() => {
|
|
328
|
+
});
|
|
329
|
+
c.req.raw.signal.addEventListener("abort", () => {
|
|
330
|
+
logger2().debug("SSE aborted, shutting down runner");
|
|
331
|
+
this.shutdownRunner(false);
|
|
332
|
+
});
|
|
333
|
+
await this.#runnerStarted.promise;
|
|
334
|
+
const payload = this.#runner.getServerlessInitPacket();
|
|
335
|
+
_invariant2.default.call(void 0, payload, "runnerId not set");
|
|
336
|
+
await stream.writeSSE({ data: payload });
|
|
337
|
+
while (true) {
|
|
338
|
+
if (this.#isRunnerStopped) {
|
|
339
|
+
logger2().debug({
|
|
340
|
+
msg: "runner is stopped"
|
|
341
|
+
});
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
if (stream.closed || stream.aborted) {
|
|
345
|
+
logger2().debug({
|
|
346
|
+
msg: "runner sse stream closed",
|
|
347
|
+
closed: stream.closed,
|
|
348
|
+
aborted: stream.aborted
|
|
349
|
+
});
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
await stream.writeSSE({ event: "ping", data: "" });
|
|
353
|
+
await stream.sleep(RUNNER_SSE_PING_INTERVAL);
|
|
354
|
+
}
|
|
355
|
+
await this.#runnerStopped.promise;
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
async #runnerOnActorStart(actorId, generation, actorConfig) {
|
|
359
|
+
var _a;
|
|
360
|
+
logger2().debug({
|
|
361
|
+
msg: "runner actor starting",
|
|
362
|
+
actorId,
|
|
363
|
+
name: actorConfig.name,
|
|
364
|
+
key: actorConfig.key,
|
|
365
|
+
generation
|
|
366
|
+
});
|
|
367
|
+
let input;
|
|
368
|
+
if (actorConfig.input) {
|
|
369
|
+
input = cbor.decode(actorConfig.input);
|
|
370
|
+
}
|
|
371
|
+
let handler = this.#actors.get(actorId);
|
|
372
|
+
if (!handler) {
|
|
373
|
+
handler = {
|
|
374
|
+
actorStartPromise: _chunkPQZHDKRWcjs.promiseWithResolvers.call(void 0, (reason) => logger2().warn({ msg: "unhandled actor start promise rejection", reason }))
|
|
375
|
+
};
|
|
376
|
+
this.#actors.set(actorId, handler);
|
|
377
|
+
}
|
|
378
|
+
handler.actorStartError = void 0;
|
|
379
|
+
const name = actorConfig.name;
|
|
380
|
+
_invariant2.default.call(void 0, actorConfig.key, "actor should have a key");
|
|
381
|
+
const key = _chunk4JVIG3SScjs.deserializeActorKey.call(void 0, actorConfig.key);
|
|
382
|
+
try {
|
|
383
|
+
const [persistDataBuffer] = await this.#runner.kvGet(actorId, [
|
|
384
|
+
_chunkPVOE6BU7cjs.KEYS.PERSIST_DATA
|
|
385
|
+
]);
|
|
386
|
+
if (persistDataBuffer === null) {
|
|
387
|
+
const initialKvState = _chunk4JVIG3SScjs.getInitialActorKvState.call(void 0, input);
|
|
388
|
+
await this.#runner.kvPut(actorId, initialKvState);
|
|
389
|
+
logger2().debug({
|
|
390
|
+
msg: "initialized persist data for new actor",
|
|
391
|
+
actorId
|
|
392
|
+
});
|
|
393
|
+
} else {
|
|
394
|
+
logger2().debug({
|
|
395
|
+
msg: "found existing persist data for actor",
|
|
396
|
+
actorId,
|
|
397
|
+
dataSize: persistDataBuffer.byteLength
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
const definition = _chunkAUVH72REcjs.lookupInRegistry.call(void 0, this.#config, actorConfig.name);
|
|
401
|
+
handler.actor = await definition.instantiate();
|
|
402
|
+
await handler.actor.start(
|
|
403
|
+
this,
|
|
404
|
+
this.#inlineClient,
|
|
405
|
+
actorId,
|
|
406
|
+
name,
|
|
407
|
+
key,
|
|
408
|
+
"unknown"
|
|
409
|
+
// TODO: Add regions
|
|
410
|
+
);
|
|
411
|
+
logger2().debug({ msg: "runner actor started", actorId, name, key });
|
|
412
|
+
} catch (innerError) {
|
|
413
|
+
const error = innerError instanceof Error ? new Error(
|
|
414
|
+
`Failed to start actor ${actorId}: ${innerError.message}`,
|
|
415
|
+
{ cause: innerError }
|
|
416
|
+
) : new Error(`Failed to start actor ${actorId}: ${String(innerError)}`);
|
|
417
|
+
handler.actor = void 0;
|
|
418
|
+
handler.actorStartError = error;
|
|
419
|
+
(_a = handler.actorStartPromise) == null ? void 0 : _a.reject(error);
|
|
420
|
+
handler.actorStartPromise = void 0;
|
|
421
|
+
logger2().error({
|
|
422
|
+
msg: "runner actor failed to start",
|
|
423
|
+
actorId,
|
|
424
|
+
name,
|
|
425
|
+
key,
|
|
426
|
+
err: _chunkPQZHDKRWcjs.stringifyError.call(void 0, error)
|
|
427
|
+
});
|
|
428
|
+
try {
|
|
429
|
+
this.#runner.stopActor(actorId);
|
|
430
|
+
} catch (stopError) {
|
|
431
|
+
logger2().debug({
|
|
432
|
+
msg: "failed to stop actor after start failure",
|
|
433
|
+
actorId,
|
|
434
|
+
err: _chunkPQZHDKRWcjs.stringifyError.call(void 0, stopError)
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
async #runnerOnActorStop(actorId, generation) {
|
|
440
|
+
logger2().debug({ msg: "runner actor stopping", actorId, generation });
|
|
441
|
+
const reason = _nullishCoalesce(this.#actorStopIntent.get(actorId), () => ( "sleep"));
|
|
442
|
+
this.#actorStopIntent.delete(actorId);
|
|
443
|
+
const handler = this.#actors.get(actorId);
|
|
444
|
+
if (handler == null ? void 0 : handler.actorStartPromise) {
|
|
445
|
+
const startError = _nullishCoalesce(handler.actorStartError, () => ( new Error(`Actor ${actorId} stopped before start completed`)));
|
|
446
|
+
handler.actorStartError = startError;
|
|
447
|
+
handler.actorStartPromise.reject(startError);
|
|
448
|
+
handler.actorStartPromise = void 0;
|
|
449
|
+
}
|
|
450
|
+
if (handler == null ? void 0 : handler.actor) {
|
|
451
|
+
try {
|
|
452
|
+
await handler.actor.onStop(reason);
|
|
453
|
+
} catch (err) {
|
|
454
|
+
logger2().error({
|
|
455
|
+
msg: "error in onStop, proceeding with removing actor",
|
|
456
|
+
err: _chunkPQZHDKRWcjs.stringifyError.call(void 0, err)
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
if (handler) this.#actors.delete(actorId);
|
|
461
|
+
logger2().debug({ msg: "runner actor stopped", actorId, reason });
|
|
462
|
+
}
|
|
463
|
+
// MARK: - Runner Networking
|
|
464
|
+
async #runnerFetch(_runner, actorId, _gatewayIdBuf, _requestIdBuf, request) {
|
|
465
|
+
logger2().debug({
|
|
466
|
+
msg: "runner fetch",
|
|
467
|
+
actorId,
|
|
468
|
+
url: request.url,
|
|
469
|
+
method: request.method
|
|
470
|
+
});
|
|
471
|
+
return await this.#actorRouter.fetch(request, { actorId });
|
|
472
|
+
}
|
|
473
|
+
async #runnerWebSocket(_runner, actorId, websocketRaw, gatewayIdBuf, requestIdBuf, request, requestPath, requestHeaders, isHibernatable, isRestoringHibernatable) {
|
|
474
|
+
var _a, _b, _c, _d;
|
|
475
|
+
const websocket = websocketRaw;
|
|
476
|
+
const wsUniqueId = `ws_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
477
|
+
websocket.__rivet_ws_id = wsUniqueId;
|
|
478
|
+
logger2().debug({
|
|
479
|
+
msg: "runner websocket",
|
|
480
|
+
actorId,
|
|
481
|
+
url: request.url,
|
|
482
|
+
isRestoringHibernatable,
|
|
483
|
+
websocketObjectId: websocketRaw ? Object.prototype.toString.call(websocketRaw) : "null",
|
|
484
|
+
websocketType: (_a = websocketRaw == null ? void 0 : websocketRaw.constructor) == null ? void 0 : _a.name,
|
|
485
|
+
wsUniqueId,
|
|
486
|
+
websocketProps: websocketRaw ? Object.keys(websocketRaw).join(", ") : "null"
|
|
487
|
+
});
|
|
488
|
+
const protocols = request.headers.get("sec-websocket-protocol");
|
|
489
|
+
const { encoding, connParams } = _chunk4JVIG3SScjs.parseWebSocketProtocols.call(void 0, protocols);
|
|
490
|
+
let wsHandler;
|
|
491
|
+
try {
|
|
492
|
+
wsHandler = await _chunk4JVIG3SScjs.routeWebSocket.call(void 0,
|
|
493
|
+
request,
|
|
494
|
+
requestPath,
|
|
495
|
+
requestHeaders,
|
|
496
|
+
this.#config,
|
|
497
|
+
this,
|
|
498
|
+
actorId,
|
|
499
|
+
encoding,
|
|
500
|
+
connParams,
|
|
501
|
+
gatewayIdBuf,
|
|
502
|
+
requestIdBuf,
|
|
503
|
+
isHibernatable,
|
|
504
|
+
isRestoringHibernatable
|
|
505
|
+
);
|
|
506
|
+
} catch (err) {
|
|
507
|
+
logger2().error({ msg: "building websocket handlers errored", err });
|
|
508
|
+
websocketRaw.close(1011, "ws.route_error");
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
websocket.raw = websocket;
|
|
512
|
+
const wsContext = new (0, _ws.WSContext)(websocket);
|
|
513
|
+
const conn = wsHandler.conn;
|
|
514
|
+
const actor2 = wsHandler.actor;
|
|
515
|
+
const connStateManager = conn == null ? void 0 : conn[_chunk4JVIG3SScjs.CONN_STATE_MANAGER_SYMBOL];
|
|
516
|
+
logger2().debug({
|
|
517
|
+
msg: "attaching websocket event listeners",
|
|
518
|
+
actorId,
|
|
519
|
+
connId: conn == null ? void 0 : conn.id,
|
|
520
|
+
wsUniqueId: websocket.__rivet_ws_id,
|
|
521
|
+
isRestoringHibernatable,
|
|
522
|
+
websocketType: (_b = websocket == null ? void 0 : websocket.constructor) == null ? void 0 : _b.name
|
|
523
|
+
});
|
|
524
|
+
if (isRestoringHibernatable) {
|
|
525
|
+
(_c = wsHandler.onRestore) == null ? void 0 : _c.call(wsHandler, wsContext);
|
|
526
|
+
}
|
|
527
|
+
websocket.addEventListener("open", (event3) => {
|
|
528
|
+
wsHandler.onOpen(event3, wsContext);
|
|
529
|
+
});
|
|
530
|
+
websocket.addEventListener("message", (event3) => {
|
|
531
|
+
var _a2, _b2;
|
|
532
|
+
logger2().debug({
|
|
533
|
+
msg: "websocket message event listener triggered",
|
|
534
|
+
connId: conn == null ? void 0 : conn.id,
|
|
535
|
+
actorId: actor2 == null ? void 0 : actor2.id,
|
|
536
|
+
messageIndex: event3.rivetMessageIndex,
|
|
537
|
+
hasWsHandler: !!wsHandler,
|
|
538
|
+
hasOnMessage: !!(wsHandler == null ? void 0 : wsHandler.onMessage),
|
|
539
|
+
actorIsStopping: actor2 == null ? void 0 : actor2.isStopping,
|
|
540
|
+
websocketType: (_a2 = websocket == null ? void 0 : websocket.constructor) == null ? void 0 : _a2.name,
|
|
541
|
+
wsUniqueId: websocket.__rivet_ws_id,
|
|
542
|
+
eventTargetWsId: (_b2 = event3.target) == null ? void 0 : _b2.__rivet_ws_id
|
|
543
|
+
});
|
|
544
|
+
if (actor2 == null ? void 0 : actor2.isStopping) {
|
|
545
|
+
logger2().debug({
|
|
546
|
+
msg: "ignoring ws message, actor is stopping",
|
|
547
|
+
connId: conn == null ? void 0 : conn.id,
|
|
548
|
+
actorId: actor2 == null ? void 0 : actor2.id,
|
|
549
|
+
messageIndex: event3.rivetMessageIndex
|
|
550
|
+
});
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
logger2().debug({
|
|
554
|
+
msg: "calling wsHandler.onMessage",
|
|
555
|
+
connId: conn == null ? void 0 : conn.id,
|
|
556
|
+
messageIndex: event3.rivetMessageIndex
|
|
557
|
+
});
|
|
558
|
+
wsHandler.onMessage(event3, wsContext);
|
|
559
|
+
const hibernate = connStateManager == null ? void 0 : connStateManager.hibernatableData;
|
|
560
|
+
if (hibernate && conn && actor2) {
|
|
561
|
+
_invariant2.default.call(void 0,
|
|
562
|
+
typeof event3.rivetMessageIndex === "number",
|
|
563
|
+
"missing event.rivetMessageIndex"
|
|
564
|
+
);
|
|
565
|
+
const previousMsgIndex = hibernate.serverMessageIndex;
|
|
566
|
+
hibernate.serverMessageIndex = event3.rivetMessageIndex;
|
|
567
|
+
logger2().info({
|
|
568
|
+
msg: "persisting message index",
|
|
569
|
+
connId: conn.id,
|
|
570
|
+
previousMsgIndex,
|
|
571
|
+
newMsgIndex: event3.rivetMessageIndex
|
|
572
|
+
});
|
|
573
|
+
const entry = this.#hwsMessageIndex.get(conn.id);
|
|
574
|
+
if (entry) {
|
|
575
|
+
const messageLength = _chunk4JVIG3SScjs.getValueLength.call(void 0, event3.data);
|
|
576
|
+
entry.bufferedMessageSize += messageLength;
|
|
577
|
+
if (entry.bufferedMessageSize >= CONN_BUFFERED_MESSAGE_SIZE_THRESHOLD) {
|
|
578
|
+
entry.bufferedMessageSize = 0;
|
|
579
|
+
entry.pendingAckFromBufferSize = true;
|
|
580
|
+
actor2.stateManager.saveState({
|
|
581
|
+
immediate: true
|
|
582
|
+
});
|
|
583
|
+
} else {
|
|
584
|
+
actor2.stateManager.saveState({
|
|
585
|
+
maxWait: CONN_MESSAGE_ACK_DEADLINE
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
} else {
|
|
589
|
+
actor2.stateManager.saveState({
|
|
590
|
+
maxWait: CONN_MESSAGE_ACK_DEADLINE
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
});
|
|
595
|
+
websocket.addEventListener("close", (event3) => {
|
|
596
|
+
wsHandler.onClose(event3, wsContext);
|
|
597
|
+
});
|
|
598
|
+
websocket.addEventListener("error", (event3) => {
|
|
599
|
+
wsHandler.onError(event3, wsContext);
|
|
600
|
+
});
|
|
601
|
+
if (isRestoringHibernatable) {
|
|
602
|
+
logger2().info({
|
|
603
|
+
msg: "event listeners attached to restored websocket",
|
|
604
|
+
actorId,
|
|
605
|
+
connId: conn == null ? void 0 : conn.id,
|
|
606
|
+
gatewayId: _enginerunner.idToStr.call(void 0, gatewayIdBuf),
|
|
607
|
+
requestId: _enginerunner.idToStr.call(void 0, requestIdBuf),
|
|
608
|
+
websocketType: (_d = websocket == null ? void 0 : websocket.constructor) == null ? void 0 : _d.name,
|
|
609
|
+
hasMessageListener: !!websocket.addEventListener
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
// MARK: - Hibernating WebSockets
|
|
614
|
+
#hwsCanHibernate(actorId, gatewayId, requestId, request) {
|
|
615
|
+
var _a;
|
|
616
|
+
const url = new URL(request.url);
|
|
617
|
+
const path = url.pathname;
|
|
618
|
+
const actorInstance = this.#runner.getActor(actorId);
|
|
619
|
+
if (!actorInstance) {
|
|
620
|
+
logger2().warn({
|
|
621
|
+
msg: "actor not found in #hwsCanHibernate",
|
|
622
|
+
actorId
|
|
623
|
+
});
|
|
624
|
+
return false;
|
|
625
|
+
}
|
|
626
|
+
const handler = this.#actors.get(actorId);
|
|
627
|
+
if (!handler) {
|
|
628
|
+
logger2().warn({
|
|
629
|
+
msg: "actor handler not found in #hwsCanHibernate",
|
|
630
|
+
actorId
|
|
631
|
+
});
|
|
632
|
+
return false;
|
|
633
|
+
}
|
|
634
|
+
if (!handler.actor) {
|
|
635
|
+
logger2().warn({
|
|
636
|
+
msg: "actor not found in #hwsCanHibernate",
|
|
637
|
+
actorId
|
|
638
|
+
});
|
|
639
|
+
return false;
|
|
640
|
+
}
|
|
641
|
+
logger2().debug({
|
|
642
|
+
msg: "no existing hibernatable websocket found",
|
|
643
|
+
gatewayId: _enginerunner.idToStr.call(void 0, gatewayId),
|
|
644
|
+
requestId: _enginerunner.idToStr.call(void 0, requestId)
|
|
645
|
+
});
|
|
646
|
+
if (path === _chunk4JVIG3SScjs.PATH_CONNECT) {
|
|
647
|
+
return true;
|
|
648
|
+
} else if (path === _chunk4JVIG3SScjs.PATH_WEBSOCKET_BASE || path.startsWith(_chunk4JVIG3SScjs.PATH_WEBSOCKET_PREFIX)) {
|
|
649
|
+
const definition = _chunkAUVH72REcjs.lookupInRegistry.call(void 0,
|
|
650
|
+
this.#config,
|
|
651
|
+
actorInstance.config.name
|
|
652
|
+
);
|
|
653
|
+
const canHibernateWebSocket = (_a = definition.config.options) == null ? void 0 : _a.canHibernateWebSocket;
|
|
654
|
+
if (canHibernateWebSocket === true) {
|
|
655
|
+
return true;
|
|
656
|
+
} else if (typeof canHibernateWebSocket === "function") {
|
|
657
|
+
try {
|
|
658
|
+
const newPath = _chunk4JVIG3SScjs.truncateRawWebSocketPathPrefix.call(void 0,
|
|
659
|
+
url.pathname
|
|
660
|
+
);
|
|
661
|
+
const truncatedRequest = new Request(
|
|
662
|
+
`http://actor${newPath}`,
|
|
663
|
+
request
|
|
664
|
+
);
|
|
665
|
+
const canHibernate = canHibernateWebSocket(truncatedRequest);
|
|
666
|
+
return canHibernate;
|
|
667
|
+
} catch (error) {
|
|
668
|
+
logger2().error({
|
|
669
|
+
msg: "error calling canHibernateWebSocket",
|
|
670
|
+
error
|
|
671
|
+
});
|
|
672
|
+
return false;
|
|
673
|
+
}
|
|
674
|
+
} else {
|
|
675
|
+
return false;
|
|
676
|
+
}
|
|
677
|
+
} else if (path === _chunk4JVIG3SScjs.PATH_INSPECTOR_CONNECT) {
|
|
678
|
+
return false;
|
|
679
|
+
} else {
|
|
680
|
+
logger2().warn({
|
|
681
|
+
msg: "unexpected path for getActorHibernationConfig",
|
|
682
|
+
path
|
|
683
|
+
});
|
|
684
|
+
return false;
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
async #hwsLoadAll(actorId) {
|
|
688
|
+
const actor2 = await this.loadActor(actorId);
|
|
689
|
+
return actor2.conns.values().map((conn) => {
|
|
690
|
+
const connStateManager = conn[_chunk4JVIG3SScjs.CONN_STATE_MANAGER_SYMBOL];
|
|
691
|
+
const hibernatable = connStateManager.hibernatableData;
|
|
692
|
+
if (!hibernatable) return void 0;
|
|
693
|
+
return {
|
|
694
|
+
gatewayId: hibernatable.gatewayId,
|
|
695
|
+
requestId: hibernatable.requestId,
|
|
696
|
+
serverMessageIndex: hibernatable.serverMessageIndex,
|
|
697
|
+
clientMessageIndex: hibernatable.clientMessageIndex,
|
|
698
|
+
path: hibernatable.requestPath,
|
|
699
|
+
headers: hibernatable.requestHeaders
|
|
700
|
+
};
|
|
701
|
+
}).filter((x) => x !== void 0).toArray();
|
|
702
|
+
}
|
|
703
|
+
async onBeforeActorStart(actor2) {
|
|
704
|
+
var _a;
|
|
705
|
+
const handler = this.#actors.get(actor2.id);
|
|
706
|
+
_invariant2.default.call(void 0, handler, "missing actor handler in onBeforeActorReady");
|
|
707
|
+
handler.actorStartError = void 0;
|
|
708
|
+
(_a = handler.actorStartPromise) == null ? void 0 : _a.resolve();
|
|
709
|
+
handler.actorStartPromise = void 0;
|
|
710
|
+
const metaEntries = await this.#hwsLoadAll(actor2.id);
|
|
711
|
+
await this.#runner.restoreHibernatingRequests(actor2.id, metaEntries);
|
|
712
|
+
}
|
|
713
|
+
onCreateConn(conn) {
|
|
714
|
+
const hibernatable = conn[_chunk4JVIG3SScjs.CONN_STATE_MANAGER_SYMBOL].hibernatableData;
|
|
715
|
+
if (!hibernatable) return;
|
|
716
|
+
this.#hwsMessageIndex.set(conn.id, {
|
|
717
|
+
serverMessageIndex: hibernatable.serverMessageIndex,
|
|
718
|
+
bufferedMessageSize: 0,
|
|
719
|
+
pendingAckFromMessageIndex: false,
|
|
720
|
+
pendingAckFromBufferSize: false
|
|
721
|
+
});
|
|
722
|
+
logger2().debug({
|
|
723
|
+
msg: "created #hwsMessageIndex entry",
|
|
724
|
+
connId: conn.id,
|
|
725
|
+
serverMessageIndex: hibernatable.serverMessageIndex
|
|
726
|
+
});
|
|
727
|
+
}
|
|
728
|
+
onDestroyConn(conn) {
|
|
729
|
+
this.#hwsMessageIndex.delete(conn.id);
|
|
730
|
+
logger2().debug({
|
|
731
|
+
msg: "removed #hwsMessageIndex entry",
|
|
732
|
+
connId: conn.id
|
|
733
|
+
});
|
|
734
|
+
}
|
|
735
|
+
onBeforePersistConn(conn) {
|
|
736
|
+
const stateManager = conn[_chunk4JVIG3SScjs.CONN_STATE_MANAGER_SYMBOL];
|
|
737
|
+
const hibernatable = stateManager.hibernatableDataOrError();
|
|
738
|
+
const entry = this.#hwsMessageIndex.get(conn.id);
|
|
739
|
+
if (!entry) {
|
|
740
|
+
logger2().warn({
|
|
741
|
+
msg: "missing EngineActorDriver.#hwsMessageIndex entry for conn",
|
|
742
|
+
connId: conn.id
|
|
743
|
+
});
|
|
744
|
+
return;
|
|
745
|
+
}
|
|
746
|
+
entry.pendingAckFromMessageIndex = hibernatable.serverMessageIndex > entry.serverMessageIndex;
|
|
747
|
+
entry.serverMessageIndex = hibernatable.serverMessageIndex;
|
|
748
|
+
}
|
|
749
|
+
onAfterPersistConn(conn) {
|
|
750
|
+
const stateManager = conn[_chunk4JVIG3SScjs.CONN_STATE_MANAGER_SYMBOL];
|
|
751
|
+
const hibernatable = stateManager.hibernatableDataOrError();
|
|
752
|
+
const entry = this.#hwsMessageIndex.get(conn.id);
|
|
753
|
+
if (!entry) {
|
|
754
|
+
logger2().warn({
|
|
755
|
+
msg: "missing EngineActorDriver.#hwsMessageIndex entry for conn",
|
|
756
|
+
connId: conn.id
|
|
757
|
+
});
|
|
758
|
+
return;
|
|
759
|
+
}
|
|
760
|
+
if (entry.pendingAckFromMessageIndex || entry.pendingAckFromBufferSize) {
|
|
761
|
+
this.#runner.sendHibernatableWebSocketMessageAck(
|
|
762
|
+
hibernatable.gatewayId,
|
|
763
|
+
hibernatable.requestId,
|
|
764
|
+
entry.serverMessageIndex
|
|
765
|
+
);
|
|
766
|
+
entry.pendingAckFromMessageIndex = false;
|
|
767
|
+
entry.pendingAckFromBufferSize = false;
|
|
768
|
+
entry.bufferedMessageSize = 0;
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
};
|
|
772
|
+
|
|
773
|
+
// src/drivers/engine/config.ts
|
|
774
|
+
var _v4 = require('zod/v4');
|
|
775
|
+
var EngineConfigSchemaBase = _chunkSAZZ4SB2cjs.ClientConfigSchemaBase.extend({
|
|
776
|
+
/** Unique key for this runner. Runners connecting a given key will replace any other runner connected with the same key. */
|
|
777
|
+
runnerKey: _v4.z.string().optional().transform((val) => _nullishCoalesce(val, () => ( _chunkPQZHDKRWcjs.getRivetRunnerKey.call(void 0, )))),
|
|
778
|
+
/** How many actors this runner can run. */
|
|
779
|
+
totalSlots: _v4.z.number().default(1e5)
|
|
780
|
+
});
|
|
781
|
+
var EngineConfigSchemaTransformed = EngineConfigSchemaBase.transform(
|
|
782
|
+
(config, ctx) => transformEngineConfig(config, ctx)
|
|
783
|
+
);
|
|
784
|
+
var EngineConfigSchema = EngineConfigSchemaTransformed.default(
|
|
785
|
+
() => EngineConfigSchemaTransformed.parse({})
|
|
786
|
+
);
|
|
787
|
+
function transformEngineConfig(config, ctx) {
|
|
788
|
+
return {
|
|
789
|
+
..._chunkSAZZ4SB2cjs.transformClientConfig.call(void 0, config, ctx),
|
|
790
|
+
runnerKey: config.runnerKey
|
|
791
|
+
};
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
// src/drivers/engine/mod.ts
|
|
795
|
+
function createEngineDriver() {
|
|
796
|
+
return {
|
|
797
|
+
name: "engine",
|
|
798
|
+
displayName: "Engine",
|
|
799
|
+
manager: (config) => {
|
|
800
|
+
const clientConfig = _chunkSAZZ4SB2cjs.convertRegistryConfigToClientConfig.call(void 0, config);
|
|
801
|
+
return new (0, _chunkSAZZ4SB2cjs.RemoteManagerDriver)(clientConfig);
|
|
802
|
+
},
|
|
803
|
+
actor: (config, managerDriver, inlineClient) => {
|
|
804
|
+
return new EngineActorDriver(
|
|
805
|
+
config,
|
|
806
|
+
managerDriver,
|
|
807
|
+
inlineClient
|
|
808
|
+
);
|
|
809
|
+
},
|
|
810
|
+
autoStartActorDriver: true
|
|
811
|
+
};
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
// src/registry/config/legacy-runner.ts
|
|
815
|
+
|
|
816
|
+
var LegacyDriverConfigSchema = _v4.z.object({
|
|
817
|
+
/** Machine-readable name to identify this driver by. */
|
|
818
|
+
name: _v4.z.string(),
|
|
819
|
+
manager: _v4.z.custom(),
|
|
820
|
+
actor: _v4.z.custom()
|
|
821
|
+
});
|
|
822
|
+
var LegacyRunnerConfigSchemaUnmerged = _v4.z.object({
|
|
823
|
+
driver: LegacyDriverConfigSchema.optional(),
|
|
824
|
+
/** @experimental */
|
|
825
|
+
maxIncomingMessageSize: _v4.z.number().optional().default(65536),
|
|
826
|
+
/** @experimental */
|
|
827
|
+
maxOutgoingMessageSize: _v4.z.number().optional().default(1048576),
|
|
828
|
+
/** @experimental */
|
|
829
|
+
inspector: _chunk4JVIG3SScjs.InspectorConfigSchema,
|
|
830
|
+
/** @experimental */
|
|
831
|
+
disableDefaultServer: _v4.z.boolean().optional().default(false),
|
|
832
|
+
/** @experimental */
|
|
833
|
+
defaultServerPort: _v4.z.number().default(6420),
|
|
834
|
+
/** @experimental */
|
|
835
|
+
runEngine: _v4.z.boolean().optional().default(() => _chunkPQZHDKRWcjs.getRivetRunEngine.call(void 0, )),
|
|
836
|
+
/** @experimental */
|
|
837
|
+
runEngineVersion: _v4.z.string().optional().default(() => _nullishCoalesce(_chunkPQZHDKRWcjs.getRivetRunEngineVersion.call(void 0, ), () => ( _chunkPQZHDKRWcjs.VERSION))),
|
|
838
|
+
/** @experimental */
|
|
839
|
+
overrideServerAddress: _v4.z.string().optional(),
|
|
840
|
+
/** @experimental */
|
|
841
|
+
disableActorDriver: _v4.z.boolean().optional().default(false),
|
|
842
|
+
/**
|
|
843
|
+
* @experimental
|
|
844
|
+
*
|
|
845
|
+
* Whether to run runners normally or have them managed
|
|
846
|
+
* serverlessly (by the Rivet Engine for example).
|
|
847
|
+
*/
|
|
848
|
+
runnerKind: _v4.z.enum(["serverless", "normal"]).optional().default(
|
|
849
|
+
() => _chunkPQZHDKRWcjs.getRivetRunnerKind.call(void 0, ) === "serverless" ? "serverless" : "normal"
|
|
850
|
+
),
|
|
851
|
+
totalSlots: _v4.z.number().optional(),
|
|
852
|
+
/**
|
|
853
|
+
* @experimental
|
|
854
|
+
*
|
|
855
|
+
* Base path for the router. This is used to prefix all routes.
|
|
856
|
+
* For example, if the base path is `/api`, then the route `/actors` will be
|
|
857
|
+
* available at `/api/actors`.
|
|
858
|
+
*/
|
|
859
|
+
basePath: _v4.z.string().optional().default("/"),
|
|
860
|
+
/**
|
|
861
|
+
* @experimental
|
|
862
|
+
*
|
|
863
|
+
* Disable welcome message.
|
|
864
|
+
* */
|
|
865
|
+
noWelcome: _v4.z.boolean().optional().default(false),
|
|
866
|
+
/**
|
|
867
|
+
* @experimental
|
|
868
|
+
* */
|
|
869
|
+
logging: _v4.z.object({
|
|
870
|
+
baseLogger: _v4.z.custom().optional(),
|
|
871
|
+
level: _chunkPQZHDKRWcjs.LogLevelSchema.optional()
|
|
872
|
+
}).optional().default(() => ({})),
|
|
873
|
+
/**
|
|
874
|
+
* @experimental
|
|
875
|
+
*
|
|
876
|
+
* Automatically configure serverless runners in the engine.
|
|
877
|
+
* Can only be used when runnerKind is "serverless".
|
|
878
|
+
* If true, uses default configuration. Can also provide custom configuration.
|
|
879
|
+
*/
|
|
880
|
+
autoConfigureServerless: _v4.z.union([
|
|
881
|
+
_v4.z.boolean(),
|
|
882
|
+
_v4.z.object({
|
|
883
|
+
url: _v4.z.string().optional(),
|
|
884
|
+
headers: _v4.z.record(_v4.z.string(), _v4.z.string()).optional(),
|
|
885
|
+
maxRunners: _v4.z.number().optional(),
|
|
886
|
+
minRunners: _v4.z.number().optional(),
|
|
887
|
+
requestLifespan: _v4.z.number().optional(),
|
|
888
|
+
runnersMargin: _v4.z.number().optional(),
|
|
889
|
+
slotsPerRunner: _v4.z.number().optional(),
|
|
890
|
+
metadata: _v4.z.record(_v4.z.string(), _v4.z.unknown()).optional()
|
|
891
|
+
})
|
|
892
|
+
]).optional(),
|
|
893
|
+
// This is a function to allow for lazy configuration of upgradeWebSocket on the
|
|
894
|
+
// fly. This is required since the dependencies that upgradeWebSocket
|
|
895
|
+
// (specifically Node.js) can sometimes only be specified after the router is
|
|
896
|
+
// created or must be imported async using `await import(...)`
|
|
897
|
+
getUpgradeWebSocket: _v4.z.custom().optional(),
|
|
898
|
+
/** @experimental */
|
|
899
|
+
token: _v4.z.string().optional().transform((v) => v || _chunkPQZHDKRWcjs.getRivetToken.call(void 0, ))
|
|
900
|
+
}).merge(EngineConfigSchemaBase);
|
|
901
|
+
var LegacyRunnerConfigSchemaTransformed = LegacyRunnerConfigSchemaUnmerged.transform((config, ctx) => ({
|
|
902
|
+
...config,
|
|
903
|
+
...transformEngineConfig(config, ctx)
|
|
904
|
+
}));
|
|
905
|
+
var LegacyRunnerConfigSchema = LegacyRunnerConfigSchemaTransformed.default(
|
|
906
|
+
() => LegacyRunnerConfigSchemaTransformed.parse({})
|
|
907
|
+
);
|
|
908
|
+
|
|
909
|
+
// runtime/index.ts
|
|
910
|
+
|
|
911
|
+
|
|
912
|
+
// src/drivers/default.ts
|
|
913
|
+
function chooseDefaultDriver(config) {
|
|
914
|
+
if (config.endpoint && config.driver) {
|
|
915
|
+
throw new (0, _chunkL47L3ZWJcjs.UserError)(
|
|
916
|
+
"Cannot specify both 'endpoint' and 'driver' in configuration"
|
|
917
|
+
);
|
|
918
|
+
}
|
|
919
|
+
if (config.driver) {
|
|
920
|
+
return config.driver;
|
|
921
|
+
}
|
|
922
|
+
if (config.endpoint || config.token) {
|
|
923
|
+
_chunkPVOE6BU7cjs.loggerWithoutContext.call(void 0, ).debug({
|
|
924
|
+
msg: "using rivet engine driver",
|
|
925
|
+
endpoint: config.endpoint
|
|
926
|
+
});
|
|
927
|
+
return createEngineDriver();
|
|
928
|
+
}
|
|
929
|
+
_chunkPVOE6BU7cjs.loggerWithoutContext.call(void 0, ).debug({
|
|
930
|
+
msg: "using default file system driver",
|
|
931
|
+
storagePath: config.storagePath
|
|
932
|
+
});
|
|
933
|
+
return _chunkAUVH72REcjs.createFileSystemOrMemoryDriver.call(void 0, true, {
|
|
934
|
+
path: config.storagePath
|
|
935
|
+
});
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
// src/engine-process/log.ts
|
|
939
|
+
function logger3() {
|
|
940
|
+
return _chunkPQZHDKRWcjs.getLogger.call(void 0, "engine-process");
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
// src/engine-process/mod.ts
|
|
944
|
+
var ENGINE_BASE_URL = "https://releases.rivet.dev/rivet";
|
|
945
|
+
var ENGINE_BINARY_NAME = "rivet-engine";
|
|
946
|
+
async function ensureEngineProcess(options) {
|
|
947
|
+
_chunk4JVIG3SScjs.importNodeDependencies.call(void 0, );
|
|
948
|
+
logger3().debug({
|
|
949
|
+
msg: "ensuring engine process",
|
|
950
|
+
version: options.version
|
|
951
|
+
});
|
|
952
|
+
const path = _chunk4JVIG3SScjs.getNodePath.call(void 0, );
|
|
953
|
+
const storageRoot = _chunkAUVH72REcjs.getStoragePath.call(void 0, );
|
|
954
|
+
const binDir = path.join(storageRoot, "bin");
|
|
955
|
+
const varDir = path.join(storageRoot, "var");
|
|
956
|
+
const logsDir = path.join(varDir, "logs", "rivet-engine");
|
|
957
|
+
await _chunkAUVH72REcjs.ensureDirectoryExists.call(void 0, binDir);
|
|
958
|
+
await _chunkAUVH72REcjs.ensureDirectoryExists.call(void 0, varDir);
|
|
959
|
+
await _chunkAUVH72REcjs.ensureDirectoryExists.call(void 0, logsDir);
|
|
960
|
+
if (await isEngineRunning()) {
|
|
961
|
+
try {
|
|
962
|
+
const health = await waitForEngineHealth();
|
|
963
|
+
logger3().debug({
|
|
964
|
+
msg: "engine already running and healthy",
|
|
965
|
+
version: health.version
|
|
966
|
+
});
|
|
967
|
+
return;
|
|
968
|
+
} catch (error) {
|
|
969
|
+
logger3().warn({
|
|
970
|
+
msg: "existing engine process not healthy, cannot restart automatically",
|
|
971
|
+
error
|
|
972
|
+
});
|
|
973
|
+
throw new Error(
|
|
974
|
+
"Engine process exists but is not healthy. Please manually stop the process on port 6420 and retry."
|
|
975
|
+
);
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
const executableName = process.platform === "win32" ? `${ENGINE_BINARY_NAME}-${options.version}.exe` : `${ENGINE_BINARY_NAME}-${options.version}`;
|
|
979
|
+
const binaryPath = path.join(binDir, executableName);
|
|
980
|
+
await downloadEngineBinaryIfNeeded(binaryPath, options.version, varDir);
|
|
981
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/:/g, "-").replace(/\./g, "-");
|
|
982
|
+
const stdoutLogPath = path.join(logsDir, `engine-${timestamp}-stdout.log`);
|
|
983
|
+
const stderrLogPath = path.join(logsDir, `engine-${timestamp}-stderr.log`);
|
|
984
|
+
const fsSync = _chunk4JVIG3SScjs.getNodeFsSync.call(void 0, );
|
|
985
|
+
const stdoutStream = fsSync.createWriteStream(stdoutLogPath, {
|
|
986
|
+
flags: "a"
|
|
987
|
+
});
|
|
988
|
+
const stderrStream = fsSync.createWriteStream(stderrLogPath, {
|
|
989
|
+
flags: "a"
|
|
990
|
+
});
|
|
991
|
+
logger3().debug({
|
|
992
|
+
msg: "creating engine log files",
|
|
993
|
+
stdout: stdoutLogPath,
|
|
994
|
+
stderr: stderrLogPath
|
|
995
|
+
});
|
|
996
|
+
const childProcess = _chunk4JVIG3SScjs.getNodeChildProcess.call(void 0, );
|
|
997
|
+
const child = childProcess.spawn(binaryPath, ["start"], {
|
|
998
|
+
cwd: path.dirname(binaryPath),
|
|
999
|
+
stdio: ["inherit", "pipe", "pipe"],
|
|
1000
|
+
env: {
|
|
1001
|
+
...process.env,
|
|
1002
|
+
// Development environment overrides for Rivet Engine.
|
|
1003
|
+
//
|
|
1004
|
+
// NOTE: When modifying these env vars, also update scripts/run/dev-env.sh
|
|
1005
|
+
// to keep them in sync for manual engine runs.
|
|
1006
|
+
//
|
|
1007
|
+
// In development, runners can be terminated without a graceful
|
|
1008
|
+
// shutdown (i.e. SIGKILL instead of SIGTERM). This is treated as a
|
|
1009
|
+
// crash by Rivet Engine in production and implements a backoff for
|
|
1010
|
+
// rescheduling actors in case of a crash loop.
|
|
1011
|
+
//
|
|
1012
|
+
// This is problematic in development since this will cause actors
|
|
1013
|
+
// to become unresponsive if frequently killing your dev server.
|
|
1014
|
+
//
|
|
1015
|
+
// We reduce the timeouts for resetting a runner as healthy in
|
|
1016
|
+
// order to account for this.
|
|
1017
|
+
RIVET__PEGBOARD__RETRY_RESET_DURATION: "100",
|
|
1018
|
+
RIVET__PEGBOARD__BASE_RETRY_TIMEOUT: "100",
|
|
1019
|
+
// Set max exponent to 1 to have a maximum of base_retry_timeout
|
|
1020
|
+
RIVET__PEGBOARD__RESCHEDULE_BACKOFF_MAX_EXPONENT: "1",
|
|
1021
|
+
// Reduce thresholds for faster development iteration
|
|
1022
|
+
//
|
|
1023
|
+
// Default ping interval is 3s, this gives a 2s & 4s grace
|
|
1024
|
+
RIVET__PEGBOARD__RUNNER_ELIGIBLE_THRESHOLD: "5000",
|
|
1025
|
+
RIVET__PEGBOARD__RUNNER_LOST_THRESHOLD: "7000",
|
|
1026
|
+
// Allow faster metadata polling for hot-reload in development (in milliseconds)
|
|
1027
|
+
RIVET__PEGBOARD__MIN_METADATA_POLL_INTERVAL: "1000",
|
|
1028
|
+
// Reduce shutdown durations for faster development iteration (in seconds)
|
|
1029
|
+
RIVET__RUNTIME__WORKER__SHUTDOWN_DURATION: "1",
|
|
1030
|
+
RIVET__RUNTIME__GUARD_SHUTDOWN_DURATION: "1",
|
|
1031
|
+
// Force exit after this duration (must be > worker and guard shutdown durations)
|
|
1032
|
+
RIVET__RUNTIME__FORCE_SHUTDOWN_DURATION: "2"
|
|
1033
|
+
}
|
|
1034
|
+
});
|
|
1035
|
+
if (!child.pid) {
|
|
1036
|
+
throw new Error("failed to spawn rivet engine process");
|
|
1037
|
+
}
|
|
1038
|
+
if (child.stdout) {
|
|
1039
|
+
child.stdout.pipe(stdoutStream);
|
|
1040
|
+
}
|
|
1041
|
+
const stderrChunks = [];
|
|
1042
|
+
if (child.stderr) {
|
|
1043
|
+
child.stderr.on("data", (chunk) => {
|
|
1044
|
+
stderrChunks.push(chunk);
|
|
1045
|
+
});
|
|
1046
|
+
child.stderr.pipe(stderrStream);
|
|
1047
|
+
}
|
|
1048
|
+
logger3().debug({
|
|
1049
|
+
msg: "spawned engine process",
|
|
1050
|
+
pid: child.pid,
|
|
1051
|
+
cwd: path.dirname(binaryPath)
|
|
1052
|
+
});
|
|
1053
|
+
child.once("exit", (code, signal) => {
|
|
1054
|
+
const stderrOutput = Buffer.concat(stderrChunks).toString("utf-8");
|
|
1055
|
+
if (stderrOutput.includes("LOCK: Resource temporarily unavailable")) {
|
|
1056
|
+
logger3().error({
|
|
1057
|
+
msg: "another instance of rivet engine is unexpectedly running, this is an internal error",
|
|
1058
|
+
code,
|
|
1059
|
+
signal,
|
|
1060
|
+
stdoutLog: stdoutLogPath,
|
|
1061
|
+
stderrLog: stderrLogPath,
|
|
1062
|
+
issues: "https://github.com/rivet-dev/rivetkit/issues",
|
|
1063
|
+
support: "https://rivet.dev/discord"
|
|
1064
|
+
});
|
|
1065
|
+
} else if (stderrOutput.includes("Rivet Engine has been rolled back to a previous version")) {
|
|
1066
|
+
logger3().error({
|
|
1067
|
+
msg: "rivet engine version downgrade detected",
|
|
1068
|
+
hint: `You attempted to downgrade the RivetKit version in development. To fix this, nuke the database by running: '${binaryPath}' database nuke --yes`,
|
|
1069
|
+
code,
|
|
1070
|
+
signal,
|
|
1071
|
+
stdoutLog: stdoutLogPath,
|
|
1072
|
+
stderrLog: stderrLogPath
|
|
1073
|
+
});
|
|
1074
|
+
} else {
|
|
1075
|
+
logger3().warn({
|
|
1076
|
+
msg: "engine process exited, please report this error",
|
|
1077
|
+
code,
|
|
1078
|
+
signal,
|
|
1079
|
+
stdoutLog: stdoutLogPath,
|
|
1080
|
+
stderrLog: stderrLogPath,
|
|
1081
|
+
issues: "https://github.com/rivet-dev/rivetkit/issues",
|
|
1082
|
+
support: "https://rivet.dev/discord"
|
|
1083
|
+
});
|
|
1084
|
+
}
|
|
1085
|
+
stdoutStream.end();
|
|
1086
|
+
stderrStream.end();
|
|
1087
|
+
});
|
|
1088
|
+
child.once("error", (error) => {
|
|
1089
|
+
logger3().error({
|
|
1090
|
+
msg: "engine process failed",
|
|
1091
|
+
error
|
|
1092
|
+
});
|
|
1093
|
+
stdoutStream.end();
|
|
1094
|
+
stderrStream.end();
|
|
1095
|
+
});
|
|
1096
|
+
await waitForEngineHealth();
|
|
1097
|
+
logger3().info({
|
|
1098
|
+
msg: "engine process started",
|
|
1099
|
+
pid: child.pid,
|
|
1100
|
+
version: options.version,
|
|
1101
|
+
logs: {
|
|
1102
|
+
stdout: stdoutLogPath,
|
|
1103
|
+
stderr: stderrLogPath
|
|
1104
|
+
}
|
|
1105
|
+
});
|
|
1106
|
+
}
|
|
1107
|
+
async function downloadEngineBinaryIfNeeded(binaryPath, version, varDir) {
|
|
1108
|
+
const binaryExists = await fileExists(binaryPath);
|
|
1109
|
+
if (binaryExists) {
|
|
1110
|
+
logger3().debug({
|
|
1111
|
+
msg: "engine binary already cached",
|
|
1112
|
+
version,
|
|
1113
|
+
path: binaryPath
|
|
1114
|
+
});
|
|
1115
|
+
return;
|
|
1116
|
+
}
|
|
1117
|
+
const { targetTriplet, extension } = resolveTargetTriplet();
|
|
1118
|
+
const remoteFile = `${ENGINE_BINARY_NAME}-${targetTriplet}${extension}`;
|
|
1119
|
+
const downloadUrl = `${ENGINE_BASE_URL}/${version}/engine/${remoteFile}`;
|
|
1120
|
+
logger3().info({
|
|
1121
|
+
msg: "downloading engine binary",
|
|
1122
|
+
url: downloadUrl,
|
|
1123
|
+
path: binaryPath,
|
|
1124
|
+
version
|
|
1125
|
+
});
|
|
1126
|
+
const response = await fetch(downloadUrl);
|
|
1127
|
+
if (!response.ok || !response.body) {
|
|
1128
|
+
throw new Error(
|
|
1129
|
+
`failed to download rivet engine binary from ${downloadUrl}: ${response.status} ${response.statusText}`
|
|
1130
|
+
);
|
|
1131
|
+
}
|
|
1132
|
+
const crypto2 = _chunk4JVIG3SScjs.getNodeCrypto.call(void 0, );
|
|
1133
|
+
const tempPath = `${binaryPath}.${crypto2.randomUUID()}.tmp`;
|
|
1134
|
+
const startTime = Date.now();
|
|
1135
|
+
logger3().debug({
|
|
1136
|
+
msg: "starting binary download",
|
|
1137
|
+
tempPath,
|
|
1138
|
+
contentLength: response.headers.get("content-length")
|
|
1139
|
+
});
|
|
1140
|
+
const slowDownloadWarning = setTimeout(() => {
|
|
1141
|
+
logger3().warn({
|
|
1142
|
+
msg: "engine binary download is taking longer than expected, please be patient",
|
|
1143
|
+
version
|
|
1144
|
+
});
|
|
1145
|
+
}, 5e3);
|
|
1146
|
+
try {
|
|
1147
|
+
const stream = _chunk4JVIG3SScjs.getNodeStream.call(void 0, );
|
|
1148
|
+
const fsSync = _chunk4JVIG3SScjs.getNodeFsSync.call(void 0, );
|
|
1149
|
+
await stream.pipeline(
|
|
1150
|
+
response.body,
|
|
1151
|
+
fsSync.createWriteStream(tempPath)
|
|
1152
|
+
);
|
|
1153
|
+
clearTimeout(slowDownloadWarning);
|
|
1154
|
+
const fs = _chunk4JVIG3SScjs.getNodeFs.call(void 0, );
|
|
1155
|
+
const stats = await fs.stat(tempPath);
|
|
1156
|
+
const downloadDuration = Date.now() - startTime;
|
|
1157
|
+
if (process.platform !== "win32") {
|
|
1158
|
+
await fs.chmod(tempPath, 493);
|
|
1159
|
+
}
|
|
1160
|
+
await fs.rename(tempPath, binaryPath);
|
|
1161
|
+
logger3().debug({
|
|
1162
|
+
msg: "engine binary download complete",
|
|
1163
|
+
version,
|
|
1164
|
+
path: binaryPath,
|
|
1165
|
+
size: stats.size,
|
|
1166
|
+
durationMs: downloadDuration
|
|
1167
|
+
});
|
|
1168
|
+
logger3().info({
|
|
1169
|
+
msg: "engine binary downloaded",
|
|
1170
|
+
version,
|
|
1171
|
+
path: binaryPath
|
|
1172
|
+
});
|
|
1173
|
+
} catch (error) {
|
|
1174
|
+
clearTimeout(slowDownloadWarning);
|
|
1175
|
+
logger3().warn({
|
|
1176
|
+
msg: "engine download failed, please report this error",
|
|
1177
|
+
tempPath,
|
|
1178
|
+
error,
|
|
1179
|
+
issues: "https://github.com/rivet-dev/rivetkit/issues",
|
|
1180
|
+
support: "https://rivet.dev/discord"
|
|
1181
|
+
});
|
|
1182
|
+
try {
|
|
1183
|
+
const fs = _chunk4JVIG3SScjs.getNodeFs.call(void 0, );
|
|
1184
|
+
await fs.unlink(tempPath);
|
|
1185
|
+
} catch (unlinkError) {
|
|
1186
|
+
}
|
|
1187
|
+
throw error;
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
function resolveTargetTriplet() {
|
|
1191
|
+
return resolveTargetTripletFor(process.platform, process.arch);
|
|
1192
|
+
}
|
|
1193
|
+
function resolveTargetTripletFor(platform, arch) {
|
|
1194
|
+
switch (platform) {
|
|
1195
|
+
case "darwin":
|
|
1196
|
+
if (arch === "arm64") {
|
|
1197
|
+
return { targetTriplet: "aarch64-apple-darwin", extension: "" };
|
|
1198
|
+
}
|
|
1199
|
+
if (arch === "x64") {
|
|
1200
|
+
return { targetTriplet: "x86_64-apple-darwin", extension: "" };
|
|
1201
|
+
}
|
|
1202
|
+
break;
|
|
1203
|
+
case "linux":
|
|
1204
|
+
if (arch === "x64") {
|
|
1205
|
+
return {
|
|
1206
|
+
targetTriplet: "x86_64-unknown-linux-musl",
|
|
1207
|
+
extension: ""
|
|
1208
|
+
};
|
|
1209
|
+
}
|
|
1210
|
+
break;
|
|
1211
|
+
case "win32":
|
|
1212
|
+
if (arch === "x64") {
|
|
1213
|
+
return {
|
|
1214
|
+
targetTriplet: "x86_64-pc-windows-gnu",
|
|
1215
|
+
extension: ".exe"
|
|
1216
|
+
};
|
|
1217
|
+
}
|
|
1218
|
+
break;
|
|
1219
|
+
}
|
|
1220
|
+
throw new Error(
|
|
1221
|
+
`unsupported platform for rivet engine binary: ${platform}/${arch}`
|
|
1222
|
+
);
|
|
1223
|
+
}
|
|
1224
|
+
async function isEngineRunning() {
|
|
1225
|
+
return await checkIfEngineAlreadyRunningOnPort(_chunk4JVIG3SScjs.ENGINE_PORT);
|
|
1226
|
+
}
|
|
1227
|
+
async function checkIfEngineAlreadyRunningOnPort(port) {
|
|
1228
|
+
let response;
|
|
1229
|
+
try {
|
|
1230
|
+
response = await fetch(`http://127.0.0.1:${port}/health`);
|
|
1231
|
+
} catch (err) {
|
|
1232
|
+
return false;
|
|
1233
|
+
}
|
|
1234
|
+
if (response.ok) {
|
|
1235
|
+
const health = await response.json();
|
|
1236
|
+
if (health.runtime === "engine") {
|
|
1237
|
+
logger3().debug({
|
|
1238
|
+
msg: "rivet engine already running on port",
|
|
1239
|
+
port
|
|
1240
|
+
});
|
|
1241
|
+
return true;
|
|
1242
|
+
} else if (health.runtime === "rivetkit") {
|
|
1243
|
+
logger3().error({
|
|
1244
|
+
msg: "another rivetkit process is already running on port",
|
|
1245
|
+
port
|
|
1246
|
+
});
|
|
1247
|
+
throw new Error(
|
|
1248
|
+
"RivetKit process already running on port 6420, stop that process and restart this."
|
|
1249
|
+
);
|
|
1250
|
+
} else {
|
|
1251
|
+
throw new Error(
|
|
1252
|
+
"Unknown process running on port 6420, cannot identify what it is."
|
|
1253
|
+
);
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
return false;
|
|
1257
|
+
}
|
|
1258
|
+
async function fileExists(filePath) {
|
|
1259
|
+
try {
|
|
1260
|
+
const fs = _chunk4JVIG3SScjs.getNodeFs.call(void 0, );
|
|
1261
|
+
await fs.access(filePath);
|
|
1262
|
+
return true;
|
|
1263
|
+
} catch (e) {
|
|
1264
|
+
return false;
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
var HEALTH_MAX_WAIT = 1e4;
|
|
1268
|
+
var HEALTH_INTERVAL = 100;
|
|
1269
|
+
async function waitForEngineHealth() {
|
|
1270
|
+
const maxRetries = Math.ceil(HEALTH_MAX_WAIT / HEALTH_INTERVAL);
|
|
1271
|
+
logger3().debug({ msg: "waiting for engine health check" });
|
|
1272
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
1273
|
+
try {
|
|
1274
|
+
const response = await fetch(`${_chunk4JVIG3SScjs.ENGINE_ENDPOINT}/health`, {
|
|
1275
|
+
signal: AbortSignal.timeout(1e3)
|
|
1276
|
+
});
|
|
1277
|
+
if (response.ok) {
|
|
1278
|
+
const health = await response.json();
|
|
1279
|
+
logger3().debug({ msg: "engine health check passed" });
|
|
1280
|
+
return health;
|
|
1281
|
+
}
|
|
1282
|
+
} catch (error) {
|
|
1283
|
+
logger3().debug({ msg: "engine health check failed", error });
|
|
1284
|
+
if (i === maxRetries - 1) {
|
|
1285
|
+
throw new Error(
|
|
1286
|
+
`engine health check failed after ${maxRetries} retries: ${error}`
|
|
1287
|
+
);
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
if (i < maxRetries - 1) {
|
|
1291
|
+
logger3().trace({
|
|
1292
|
+
msg: "engine not ready, retrying",
|
|
1293
|
+
attempt: i + 1,
|
|
1294
|
+
maxRetries
|
|
1295
|
+
});
|
|
1296
|
+
await new Promise(
|
|
1297
|
+
(resolve) => setTimeout(resolve, HEALTH_INTERVAL)
|
|
1298
|
+
);
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
throw new Error(`engine health check failed after ${maxRetries} retries`);
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
// src/inspector/utils.ts
|
|
1305
|
+
var _factory = require('hono/factory');
|
|
1306
|
+
function getInspectorUrl(config, managerPort) {
|
|
1307
|
+
if (!config.inspector.enabled) return void 0;
|
|
1308
|
+
const base = _nullishCoalesce(config.inspector.defaultEndpoint, () => ( `http://127.0.0.1:${managerPort}`));
|
|
1309
|
+
return new URL("/ui/", base).href;
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
// src/serverless/log.ts
|
|
1313
|
+
function logger4() {
|
|
1314
|
+
return _chunkPQZHDKRWcjs.getLogger.call(void 0, "serverless");
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
// src/serverless/configure.ts
|
|
1318
|
+
|
|
1319
|
+
async function configureServerlessRunner(config) {
|
|
1320
|
+
logger4().debug("configuring serverless runner");
|
|
1321
|
+
try {
|
|
1322
|
+
if (!config.namespace) {
|
|
1323
|
+
throw new Error(
|
|
1324
|
+
"namespace is required for serverless configuration"
|
|
1325
|
+
);
|
|
1326
|
+
}
|
|
1327
|
+
if (!config.endpoint) {
|
|
1328
|
+
throw new Error(
|
|
1329
|
+
"endpoint is required for serverless configuration"
|
|
1330
|
+
);
|
|
1331
|
+
}
|
|
1332
|
+
const customConfig = config.serverless.configureRunnerPool;
|
|
1333
|
+
_invariant2.default.call(void 0, customConfig, "configureRunnerPool should exist");
|
|
1334
|
+
const clientConfig = _chunkSAZZ4SB2cjs.convertRegistryConfigToClientConfig.call(void 0, config);
|
|
1335
|
+
logger4().debug({
|
|
1336
|
+
msg: "fetching datacenters",
|
|
1337
|
+
endpoint: config.endpoint
|
|
1338
|
+
});
|
|
1339
|
+
const dcsRes = await _chunkSAZZ4SB2cjs.getDatacenters.call(void 0, clientConfig);
|
|
1340
|
+
const runnerName = _nullishCoalesce(customConfig.name, () => ( "default"));
|
|
1341
|
+
logger4().debug({
|
|
1342
|
+
msg: "configuring serverless runner",
|
|
1343
|
+
runnerName,
|
|
1344
|
+
namespace: config.namespace
|
|
1345
|
+
});
|
|
1346
|
+
const serverlessConfig = {
|
|
1347
|
+
serverless: {
|
|
1348
|
+
url: customConfig.url,
|
|
1349
|
+
headers: _nullishCoalesce(customConfig.headers, () => ( {})),
|
|
1350
|
+
max_runners: _nullishCoalesce(customConfig.maxRunners, () => ( 1e3)),
|
|
1351
|
+
min_runners: _nullishCoalesce(customConfig.minRunners, () => ( 0)),
|
|
1352
|
+
request_lifespan: _nullishCoalesce(customConfig.requestLifespan, () => ( 15 * 60)),
|
|
1353
|
+
runners_margin: _nullishCoalesce(customConfig.runnersMargin, () => ( 0)),
|
|
1354
|
+
slots_per_runner: _nullishCoalesce(customConfig.slotsPerRunner, () => ( 1)),
|
|
1355
|
+
metadata_poll_interval: _nullishCoalesce(customConfig.metadataPollInterval, () => ( 1e3))
|
|
1356
|
+
},
|
|
1357
|
+
metadata: _nullishCoalesce(customConfig.metadata, () => ( {})),
|
|
1358
|
+
drain_on_version_upgrade: _nullishCoalesce(customConfig.drainOnVersionUpgrade, () => ( true)),
|
|
1359
|
+
metadataPollInterval: _nullishCoalesce(customConfig.metadataPollInterval, () => ( 1e3))
|
|
1360
|
+
};
|
|
1361
|
+
await _chunkSAZZ4SB2cjs.updateRunnerConfig.call(void 0, clientConfig, runnerName, {
|
|
1362
|
+
datacenters: Object.fromEntries(
|
|
1363
|
+
dcsRes.datacenters.map((dc) => [dc.name, serverlessConfig])
|
|
1364
|
+
)
|
|
1365
|
+
});
|
|
1366
|
+
logger4().info({
|
|
1367
|
+
msg: "serverless runner configured successfully",
|
|
1368
|
+
runnerName,
|
|
1369
|
+
namespace: config.namespace
|
|
1370
|
+
});
|
|
1371
|
+
} catch (error) {
|
|
1372
|
+
logger4().error({
|
|
1373
|
+
msg: "failed to configure serverless runner, validate endpoint is configured correctly then restart this process",
|
|
1374
|
+
error
|
|
1375
|
+
});
|
|
1376
|
+
}
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1379
|
+
// src/serverless/router.ts
|
|
1380
|
+
|
|
1381
|
+
|
|
1382
|
+
// src/manager/router-schema.ts
|
|
1383
|
+
|
|
1384
|
+
var ServerlessStartHeadersSchema = _v4.z.object({
|
|
1385
|
+
endpoint: _v4.z.string({
|
|
1386
|
+
error: "x-rivet-endpoint header is required"
|
|
1387
|
+
}),
|
|
1388
|
+
token: _v4.z.string({ error: "x-rivet-token header must be a string" }).optional(),
|
|
1389
|
+
totalSlots: _v4.z.coerce.number({
|
|
1390
|
+
error: "x-rivet-total-slots header must be a number"
|
|
1391
|
+
}).int({ error: "x-rivet-total-slots header must be an integer" }).gte(1, { error: "x-rivet-total-slots header must be positive" }),
|
|
1392
|
+
runnerName: _v4.z.string({
|
|
1393
|
+
error: "x-rivet-runner-name header is required"
|
|
1394
|
+
}),
|
|
1395
|
+
namespace: _v4.z.string({
|
|
1396
|
+
error: "x-rivet-namespace-name header is required"
|
|
1397
|
+
})
|
|
1398
|
+
});
|
|
1399
|
+
|
|
1400
|
+
// src/serverless/router.ts
|
|
1401
|
+
function buildServerlessRouter(driverConfig, config) {
|
|
1402
|
+
return _chunk4JVIG3SScjs.createRouter.call(void 0, config.serverless.basePath, (router) => {
|
|
1403
|
+
router.get("/", (c) => {
|
|
1404
|
+
return c.text(
|
|
1405
|
+
"This is a RivetKit server.\n\nLearn more at https://rivetkit.org"
|
|
1406
|
+
);
|
|
1407
|
+
});
|
|
1408
|
+
router.get("/start", async (c) => {
|
|
1409
|
+
var _a;
|
|
1410
|
+
const parseResult = ServerlessStartHeadersSchema.safeParse({
|
|
1411
|
+
endpoint: c.req.header("x-rivet-endpoint"),
|
|
1412
|
+
token: _nullishCoalesce(c.req.header("x-rivet-token"), () => ( void 0)),
|
|
1413
|
+
totalSlots: c.req.header("x-rivet-total-slots"),
|
|
1414
|
+
runnerName: c.req.header("x-rivet-runner-name"),
|
|
1415
|
+
namespace: c.req.header("x-rivet-namespace-name")
|
|
1416
|
+
});
|
|
1417
|
+
if (!parseResult.success) {
|
|
1418
|
+
throw new (0, _chunkL47L3ZWJcjs.InvalidRequest)(
|
|
1419
|
+
_nullishCoalesce(((_a = parseResult.error.issues[0]) == null ? void 0 : _a.message), () => ( "invalid serverless start headers"))
|
|
1420
|
+
);
|
|
1421
|
+
}
|
|
1422
|
+
const { endpoint, token, totalSlots, runnerName, namespace } = parseResult.data;
|
|
1423
|
+
logger4().debug({
|
|
1424
|
+
msg: "received serverless runner start request",
|
|
1425
|
+
endpoint,
|
|
1426
|
+
totalSlots,
|
|
1427
|
+
runnerName,
|
|
1428
|
+
namespace
|
|
1429
|
+
});
|
|
1430
|
+
if (config.endpoint) {
|
|
1431
|
+
if (!endpointsMatch(endpoint, config.endpoint)) {
|
|
1432
|
+
throw new (0, _chunkL47L3ZWJcjs.EndpointMismatch)(config.endpoint, endpoint);
|
|
1433
|
+
}
|
|
1434
|
+
if (namespace !== config.namespace) {
|
|
1435
|
+
throw new (0, _chunkL47L3ZWJcjs.NamespaceMismatch)(config.namespace, namespace);
|
|
1436
|
+
}
|
|
1437
|
+
}
|
|
1438
|
+
const newConfig = {
|
|
1439
|
+
...config,
|
|
1440
|
+
endpoint,
|
|
1441
|
+
namespace,
|
|
1442
|
+
token,
|
|
1443
|
+
runner: {
|
|
1444
|
+
...config.runner,
|
|
1445
|
+
totalSlots,
|
|
1446
|
+
runnerName,
|
|
1447
|
+
// Not supported on serverless
|
|
1448
|
+
runnerKey: void 0
|
|
1449
|
+
}
|
|
1450
|
+
};
|
|
1451
|
+
const managerDriver = new (0, _chunkSAZZ4SB2cjs.RemoteManagerDriver)(
|
|
1452
|
+
_chunkSAZZ4SB2cjs.convertRegistryConfigToClientConfig.call(void 0, newConfig)
|
|
1453
|
+
);
|
|
1454
|
+
const client = _chunkSAZZ4SB2cjs.createClientWithDriver.call(void 0, managerDriver);
|
|
1455
|
+
const actorDriver = driverConfig.actor(
|
|
1456
|
+
newConfig,
|
|
1457
|
+
managerDriver,
|
|
1458
|
+
client
|
|
1459
|
+
);
|
|
1460
|
+
_invariant2.default.call(void 0,
|
|
1461
|
+
actorDriver.serverlessHandleStart,
|
|
1462
|
+
"missing serverlessHandleStart on ActorDriver"
|
|
1463
|
+
);
|
|
1464
|
+
return await actorDriver.serverlessHandleStart(c);
|
|
1465
|
+
});
|
|
1466
|
+
router.get("/health", (c) => _chunk4JVIG3SScjs.handleHealthRequest.call(void 0, c));
|
|
1467
|
+
router.get(
|
|
1468
|
+
"/metadata",
|
|
1469
|
+
(c) => _chunk4JVIG3SScjs.handleMetadataRequest.call(void 0,
|
|
1470
|
+
c,
|
|
1471
|
+
config,
|
|
1472
|
+
{ serverless: {} },
|
|
1473
|
+
config.publicEndpoint,
|
|
1474
|
+
config.publicNamespace,
|
|
1475
|
+
config.publicToken
|
|
1476
|
+
)
|
|
1477
|
+
);
|
|
1478
|
+
});
|
|
1479
|
+
}
|
|
1480
|
+
function normalizeEndpointUrl(url) {
|
|
1481
|
+
try {
|
|
1482
|
+
const parsed = new URL(url);
|
|
1483
|
+
const pathname = parsed.pathname === "/" ? "/" : parsed.pathname.replace(/\/+$/, "");
|
|
1484
|
+
let hostname = isLoopbackAddress(parsed.hostname) ? "localhost" : parsed.hostname;
|
|
1485
|
+
hostname = normalizeRegionalHostname(hostname);
|
|
1486
|
+
const host = parsed.port ? `${hostname}:${parsed.port}` : hostname;
|
|
1487
|
+
return `${parsed.protocol}//${host}${pathname}`;
|
|
1488
|
+
} catch (e2) {
|
|
1489
|
+
return null;
|
|
1490
|
+
}
|
|
1491
|
+
}
|
|
1492
|
+
function normalizeRegionalHostname(hostname) {
|
|
1493
|
+
if (!hostname.endsWith(".rivet.dev")) {
|
|
1494
|
+
return hostname;
|
|
1495
|
+
}
|
|
1496
|
+
if (!hostname.startsWith("api-")) {
|
|
1497
|
+
return hostname;
|
|
1498
|
+
}
|
|
1499
|
+
const withoutPrefix = hostname.slice(4);
|
|
1500
|
+
const firstDotIndex = withoutPrefix.indexOf(".");
|
|
1501
|
+
if (firstDotIndex === -1) {
|
|
1502
|
+
return hostname;
|
|
1503
|
+
}
|
|
1504
|
+
const domain = withoutPrefix.slice(firstDotIndex + 1);
|
|
1505
|
+
return `api.${domain}`;
|
|
1506
|
+
}
|
|
1507
|
+
function endpointsMatch(a, b) {
|
|
1508
|
+
const normalizedA = normalizeEndpointUrl(a);
|
|
1509
|
+
const normalizedB = normalizeEndpointUrl(b);
|
|
1510
|
+
if (normalizedA === null || normalizedB === null) {
|
|
1511
|
+
return a === b;
|
|
1512
|
+
}
|
|
1513
|
+
return normalizedA === normalizedB;
|
|
1514
|
+
}
|
|
1515
|
+
function isLoopbackAddress(hostname) {
|
|
1516
|
+
return hostname === "127.0.0.1" || hostname === "0.0.0.0" || hostname === "::1" || hostname === "[::1]";
|
|
1517
|
+
}
|
|
1518
|
+
|
|
1519
|
+
// runtime/index.ts
|
|
1520
|
+
function logLine(label, value) {
|
|
1521
|
+
const padding = " ".repeat(Math.max(0, 13 - label.length));
|
|
1522
|
+
console.log(` - ${label}:${padding}${value}`);
|
|
1523
|
+
}
|
|
1524
|
+
var Runtime = class _Runtime {
|
|
1525
|
+
#registry;
|
|
1526
|
+
#config;
|
|
1527
|
+
#driver;
|
|
1528
|
+
#managerDriver;
|
|
1529
|
+
#startKind;
|
|
1530
|
+
|
|
1531
|
+
#serverlessRouter;
|
|
1532
|
+
get config() {
|
|
1533
|
+
return this.#config;
|
|
1534
|
+
}
|
|
1535
|
+
get driver() {
|
|
1536
|
+
return this.#driver;
|
|
1537
|
+
}
|
|
1538
|
+
get managerDriver() {
|
|
1539
|
+
return this.#managerDriver;
|
|
1540
|
+
}
|
|
1541
|
+
/** Use Runtime.create() instead */
|
|
1542
|
+
constructor(registry, config, driver, managerDriver, managerPort) {
|
|
1543
|
+
this.#registry = registry;
|
|
1544
|
+
this.#config = config;
|
|
1545
|
+
this.#driver = driver;
|
|
1546
|
+
this.#managerDriver = managerDriver;
|
|
1547
|
+
this.managerPort = managerPort;
|
|
1548
|
+
}
|
|
1549
|
+
static async create(registry) {
|
|
1550
|
+
var _a, _b, _c;
|
|
1551
|
+
_chunk4JVIG3SScjs.logger.call(void 0, ).info("rivetkit starting");
|
|
1552
|
+
const config = registry.parseConfig();
|
|
1553
|
+
if ((_a = config.logging) == null ? void 0 : _a.baseLogger) {
|
|
1554
|
+
_chunkPQZHDKRWcjs.configureBaseLogger.call(void 0, config.logging.baseLogger);
|
|
1555
|
+
} else {
|
|
1556
|
+
_chunkPQZHDKRWcjs.configureDefaultLogger.call(void 0, (_b = config.logging) == null ? void 0 : _b.level);
|
|
1557
|
+
}
|
|
1558
|
+
_invariant2.default.call(void 0,
|
|
1559
|
+
!(config.serverless.spawnEngine && config.serveManager),
|
|
1560
|
+
"cannot specify both spawnEngine and serveManager"
|
|
1561
|
+
);
|
|
1562
|
+
const driver = chooseDefaultDriver(config);
|
|
1563
|
+
const managerDriver = driver.manager(config);
|
|
1564
|
+
let managerPort;
|
|
1565
|
+
if (config.serverless.spawnEngine) {
|
|
1566
|
+
managerPort = _chunk4JVIG3SScjs.ENGINE_PORT;
|
|
1567
|
+
_chunk4JVIG3SScjs.logger.call(void 0, ).debug({
|
|
1568
|
+
msg: "spawning engine",
|
|
1569
|
+
version: config.serverless.engineVersion
|
|
1570
|
+
});
|
|
1571
|
+
await ensureEngineProcess({
|
|
1572
|
+
version: config.serverless.engineVersion
|
|
1573
|
+
});
|
|
1574
|
+
} else if (config.serveManager) {
|
|
1575
|
+
const configuredManagerPort = config.managerPort;
|
|
1576
|
+
const serveRuntime = _chunkPQZHDKRWcjs.detectRuntime.call(void 0, );
|
|
1577
|
+
let upgradeWebSocket;
|
|
1578
|
+
const getUpgradeWebSocket = () => upgradeWebSocket;
|
|
1579
|
+
managerDriver.setGetUpgradeWebSocket(getUpgradeWebSocket);
|
|
1580
|
+
const { router: managerRouter } = _chunk4JVIG3SScjs.buildManagerRouter.call(void 0,
|
|
1581
|
+
config,
|
|
1582
|
+
managerDriver,
|
|
1583
|
+
getUpgradeWebSocket,
|
|
1584
|
+
serveRuntime
|
|
1585
|
+
);
|
|
1586
|
+
managerPort = await _chunk4JVIG3SScjs.findFreePort.call(void 0, config.managerPort);
|
|
1587
|
+
_chunk4JVIG3SScjs.logger.call(void 0, ).debug({
|
|
1588
|
+
msg: "serving manager",
|
|
1589
|
+
port: managerPort
|
|
1590
|
+
});
|
|
1591
|
+
if (config.publicEndpoint === `http://127.0.0.1:${configuredManagerPort}`) {
|
|
1592
|
+
config.publicEndpoint = `http://127.0.0.1:${managerPort}`;
|
|
1593
|
+
config.serverless.publicEndpoint = config.publicEndpoint;
|
|
1594
|
+
}
|
|
1595
|
+
config.managerPort = managerPort;
|
|
1596
|
+
const out = await _chunk4JVIG3SScjs.crossPlatformServe.call(void 0,
|
|
1597
|
+
config,
|
|
1598
|
+
managerPort,
|
|
1599
|
+
managerRouter,
|
|
1600
|
+
serveRuntime
|
|
1601
|
+
);
|
|
1602
|
+
upgradeWebSocket = out.upgradeWebSocket;
|
|
1603
|
+
}
|
|
1604
|
+
const runtime = new _Runtime(
|
|
1605
|
+
registry,
|
|
1606
|
+
config,
|
|
1607
|
+
driver,
|
|
1608
|
+
managerDriver,
|
|
1609
|
+
managerPort
|
|
1610
|
+
);
|
|
1611
|
+
const driverLog = _nullishCoalesce(((_c = managerDriver.extraStartupLog) == null ? void 0 : _c.call(managerDriver)), () => ( {}));
|
|
1612
|
+
_chunk4JVIG3SScjs.logger.call(void 0, ).info({
|
|
1613
|
+
msg: "rivetkit ready",
|
|
1614
|
+
driver: driver.name,
|
|
1615
|
+
definitions: Object.keys(config.use).length,
|
|
1616
|
+
...driverLog
|
|
1617
|
+
});
|
|
1618
|
+
return runtime;
|
|
1619
|
+
}
|
|
1620
|
+
startServerless() {
|
|
1621
|
+
if (this.#startKind === "serverless") return;
|
|
1622
|
+
_invariant2.default.call(void 0, !this.#startKind, "Runtime already started as runner");
|
|
1623
|
+
this.#startKind = "serverless";
|
|
1624
|
+
this.#serverlessRouter = buildServerlessRouter(
|
|
1625
|
+
this.#driver,
|
|
1626
|
+
this.#config
|
|
1627
|
+
).router;
|
|
1628
|
+
this.#printWelcome();
|
|
1629
|
+
if (this.#config.serverless.configureRunnerPool) {
|
|
1630
|
+
configureServerlessRunner(this.#config);
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
startRunner() {
|
|
1634
|
+
if (this.#startKind === "runner") return;
|
|
1635
|
+
_invariant2.default.call(void 0, !this.#startKind, "Runtime already started as serverless");
|
|
1636
|
+
this.#startKind = "runner";
|
|
1637
|
+
if (this.#config.runner && this.#driver.autoStartActorDriver) {
|
|
1638
|
+
_chunk4JVIG3SScjs.logger.call(void 0, ).debug("starting actor driver");
|
|
1639
|
+
const inlineClient = _chunkSAZZ4SB2cjs.createClientWithDriver.call(void 0,
|
|
1640
|
+
this.#managerDriver
|
|
1641
|
+
);
|
|
1642
|
+
this.#driver.actor(this.#config, this.#managerDriver, inlineClient);
|
|
1643
|
+
}
|
|
1644
|
+
this.#printWelcome();
|
|
1645
|
+
}
|
|
1646
|
+
#printWelcome() {
|
|
1647
|
+
if (this.#config.noWelcome) return;
|
|
1648
|
+
const inspectorUrl = this.managerPort ? getInspectorUrl(this.#config, this.managerPort) : void 0;
|
|
1649
|
+
console.log();
|
|
1650
|
+
console.log(
|
|
1651
|
+
` RivetKit ${_chunkPQZHDKRWcjs.package_default.version} (${this.#driver.displayName} - ${this.#startKind === "serverless" ? "Serverless" : "Runner"})`
|
|
1652
|
+
);
|
|
1653
|
+
if (this.#config.namespace !== "default") {
|
|
1654
|
+
logLine("Namespace", this.#config.namespace);
|
|
1655
|
+
}
|
|
1656
|
+
if (this.#config.endpoint) {
|
|
1657
|
+
const endpointType = this.#config.serverless.spawnEngine ? "local native" : this.#config.serveManager ? "local manager" : "remote";
|
|
1658
|
+
logLine("Endpoint", `${this.#config.endpoint} (${endpointType})`);
|
|
1659
|
+
}
|
|
1660
|
+
if (this.#startKind === "serverless" && this.#config.publicEndpoint) {
|
|
1661
|
+
logLine("Client", this.#config.publicEndpoint);
|
|
1662
|
+
}
|
|
1663
|
+
if (inspectorUrl && this.#config.inspector.enabled) {
|
|
1664
|
+
logLine("Inspector", inspectorUrl);
|
|
1665
|
+
}
|
|
1666
|
+
const actorCount = Object.keys(this.#config.use).length;
|
|
1667
|
+
logLine("Actors", actorCount.toString());
|
|
1668
|
+
const displayInfo = this.#managerDriver.displayInformation();
|
|
1669
|
+
for (const [k, v] of Object.entries(displayInfo.properties)) {
|
|
1670
|
+
logLine(k, v);
|
|
1671
|
+
}
|
|
1672
|
+
console.log();
|
|
1673
|
+
}
|
|
1674
|
+
/** Handle serverless request */
|
|
1675
|
+
handleServerlessRequest(request) {
|
|
1676
|
+
_invariant2.default.call(void 0,
|
|
1677
|
+
this.#startKind === "serverless",
|
|
1678
|
+
"not started as serverless"
|
|
1679
|
+
);
|
|
1680
|
+
_invariant2.default.call(void 0, this.#serverlessRouter, "serverless router not initialized");
|
|
1681
|
+
return this.#serverlessRouter.fetch(request);
|
|
1682
|
+
}
|
|
1683
|
+
};
|
|
1684
|
+
|
|
1685
|
+
// src/registry/index.ts
|
|
1686
|
+
var Registry = class {
|
|
1687
|
+
#config;
|
|
1688
|
+
get config() {
|
|
1689
|
+
return this.#config;
|
|
1690
|
+
}
|
|
1691
|
+
parseConfig() {
|
|
1692
|
+
return _chunk4JVIG3SScjs.RegistryConfigSchema.parse(this.#config);
|
|
1693
|
+
}
|
|
1694
|
+
// Shared runtime instance
|
|
1695
|
+
#runtime;
|
|
1696
|
+
#runtimePromise;
|
|
1697
|
+
constructor(config) {
|
|
1698
|
+
this.#config = config;
|
|
1699
|
+
if (_chunkPQZHDKRWcjs.getNodeEnv.call(void 0, ) !== "test") {
|
|
1700
|
+
setTimeout(() => {
|
|
1701
|
+
this.#ensureRuntime();
|
|
1702
|
+
}, 0);
|
|
1703
|
+
}
|
|
1704
|
+
}
|
|
1705
|
+
/** Creates runtime if not already created. Idempotent. */
|
|
1706
|
+
#ensureRuntime() {
|
|
1707
|
+
if (!this.#runtimePromise) {
|
|
1708
|
+
this.#runtimePromise = Runtime.create(this);
|
|
1709
|
+
this.#runtimePromise.then((rt) => {
|
|
1710
|
+
this.#runtime = rt;
|
|
1711
|
+
});
|
|
1712
|
+
}
|
|
1713
|
+
return this.#runtimePromise;
|
|
1714
|
+
}
|
|
1715
|
+
/**
|
|
1716
|
+
* Handle an incoming HTTP request for serverless deployments.
|
|
1717
|
+
*
|
|
1718
|
+
* @example
|
|
1719
|
+
* ```ts
|
|
1720
|
+
* const app = new Hono();
|
|
1721
|
+
* app.all("/api/rivet/*", (c) => registry.handler(c.req.raw));
|
|
1722
|
+
* export default app;
|
|
1723
|
+
* ```
|
|
1724
|
+
*/
|
|
1725
|
+
async handler(request) {
|
|
1726
|
+
const runtime = await this.#ensureRuntime();
|
|
1727
|
+
runtime.startServerless();
|
|
1728
|
+
return await runtime.handleServerlessRequest(request);
|
|
1729
|
+
}
|
|
1730
|
+
/**
|
|
1731
|
+
* Returns a fetch handler for serverless deployments.
|
|
1732
|
+
*
|
|
1733
|
+
* @example
|
|
1734
|
+
* ```ts
|
|
1735
|
+
* export default registry.serve();
|
|
1736
|
+
* ```
|
|
1737
|
+
*/
|
|
1738
|
+
serve() {
|
|
1739
|
+
return { fetch: this.handler.bind(this) };
|
|
1740
|
+
}
|
|
1741
|
+
/**
|
|
1742
|
+
* Starts an actor runner for standalone server deployments.
|
|
1743
|
+
*/
|
|
1744
|
+
startRunner() {
|
|
1745
|
+
this.#ensureRuntime().then((runtime) => runtime.startRunner());
|
|
1746
|
+
}
|
|
1747
|
+
// MARK: Legacy
|
|
1748
|
+
/**
|
|
1749
|
+
* Runs the registry for a server.
|
|
1750
|
+
*
|
|
1751
|
+
* @deprecated Use {@link Registry.startRunner} for long-running servers or {@link Registry.handler} for serverless deployments.
|
|
1752
|
+
*/
|
|
1753
|
+
start(inputConfig) {
|
|
1754
|
+
const config = LegacyRunnerConfigSchema.parse(inputConfig);
|
|
1755
|
+
if (config.autoConfigureServerless && config.runnerKind !== "serverless") {
|
|
1756
|
+
throw new Error(
|
|
1757
|
+
"autoConfigureServerless can only be configured when runnerKind is 'serverless'"
|
|
1758
|
+
);
|
|
1759
|
+
}
|
|
1760
|
+
const isDevEnv = _chunkPQZHDKRWcjs.isDev.call(void 0, );
|
|
1761
|
+
if (isDevEnv && config.runnerKind === "serverless") {
|
|
1762
|
+
if ((inputConfig == null ? void 0 : inputConfig.runEngine) === void 0) config.runEngine = true;
|
|
1763
|
+
if ((inputConfig == null ? void 0 : inputConfig.autoConfigureServerless) === void 0)
|
|
1764
|
+
config.autoConfigureServerless = true;
|
|
1765
|
+
}
|
|
1766
|
+
if (config.runnerKind === "serverless") {
|
|
1767
|
+
return this.#legacyStartServerless(config, inputConfig);
|
|
1768
|
+
} else {
|
|
1769
|
+
return this.#legacyStartNormal(config);
|
|
1770
|
+
}
|
|
1771
|
+
}
|
|
1772
|
+
#legacyStartServerless(config, _inputConfig) {
|
|
1773
|
+
const client = _chunkSAZZ4SB2cjs.createClient.call(void 0, {
|
|
1774
|
+
endpoint: config.endpoint,
|
|
1775
|
+
token: config.token,
|
|
1776
|
+
namespace: config.namespace,
|
|
1777
|
+
headers: config.headers
|
|
1778
|
+
});
|
|
1779
|
+
return {
|
|
1780
|
+
client,
|
|
1781
|
+
fetch: this.handler.bind(this)
|
|
1782
|
+
};
|
|
1783
|
+
}
|
|
1784
|
+
#legacyStartNormal(config) {
|
|
1785
|
+
this.#ensureRuntime().then((runtime) => runtime.startRunner());
|
|
1786
|
+
const client = _chunkSAZZ4SB2cjs.createClient.call(void 0, {
|
|
1787
|
+
endpoint: config.endpoint,
|
|
1788
|
+
token: config.token,
|
|
1789
|
+
namespace: config.namespace,
|
|
1790
|
+
headers: config.headers
|
|
1791
|
+
});
|
|
1792
|
+
return {
|
|
1793
|
+
client,
|
|
1794
|
+
fetch: this.handler.bind(this)
|
|
1795
|
+
};
|
|
1796
|
+
}
|
|
1797
|
+
};
|
|
1798
|
+
function setup(input) {
|
|
1799
|
+
return new Registry(input);
|
|
1800
|
+
}
|
|
1801
|
+
|
|
1802
|
+
|
|
1803
|
+
|
|
1804
|
+
|
|
1805
|
+
|
|
1806
|
+
|
|
1807
|
+
|
|
1808
|
+
|
|
1809
|
+
exports.actor = actor; exports.event = event2; exports.queue = queue2; exports.createEngineDriver = createEngineDriver; exports.Registry = Registry; exports.setup = setup;
|
|
1810
|
+
//# sourceMappingURL=chunk-Q4UD2GA4.cjs.map
|