rivetkit 2.0.42 → 2.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{tsup/config-CLnylLYY.d.ts → browser/client.d.ts} +2127 -1910
- 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/schemas/actor-inspector/v2.ts +796 -0
- package/dist/schemas/actor-inspector/v3.ts +899 -0
- package/dist/schemas/actor-persist/v4.ts +406 -0
- package/dist/schemas/client-protocol/v3.ts +554 -0
- package/dist/schemas/persist/v1.ts +781 -0
- package/dist/schemas/transport/v1.ts +697 -0
- package/dist/tsup/actor/errors.cjs +27 -3
- package/dist/tsup/actor/errors.cjs.map +1 -1
- package/dist/tsup/actor/errors.d.cts +37 -1
- package/dist/tsup/actor/errors.d.ts +37 -1
- package/dist/tsup/actor/errors.js +26 -1
- package/dist/tsup/{actor-router-consts-DzI2szci.d.cts → actor-router-consts-D29T1Z-K.d.cts} +1 -1
- package/dist/tsup/{actor-router-consts-DzI2szci.d.ts → actor-router-consts-D29T1Z-K.d.ts} +1 -1
- package/dist/tsup/chunk-424PT5DM.js +23 -0
- package/dist/tsup/chunk-424PT5DM.js.map +1 -0
- package/dist/tsup/{chunk-JDAD2YFA.js → chunk-5ESWDTHJ.js} +148 -273
- package/dist/tsup/chunk-5ESWDTHJ.js.map +1 -0
- package/dist/tsup/{chunk-FJ3KTN4V.js → chunk-6LIBPELE.js} +119 -11
- package/dist/tsup/chunk-6LIBPELE.js.map +1 -0
- package/dist/tsup/chunk-6LJAZ5R4.cjs +96 -0
- package/dist/tsup/chunk-6LJAZ5R4.cjs.map +1 -0
- package/dist/tsup/{chunk-LFVF5SCU.js → chunk-7HTNH26M.js} +126 -1
- package/dist/tsup/chunk-7HTNH26M.js.map +1 -0
- package/dist/tsup/chunk-7K4CYDGD.js +630 -0
- package/dist/tsup/chunk-7K4CYDGD.js.map +1 -0
- package/dist/tsup/{chunk-XXGJCOL6.js → chunk-A6YIZWTK.js} +2 -2
- package/dist/tsup/chunk-AIYEYMX5.cjs +630 -0
- package/dist/tsup/chunk-AIYEYMX5.cjs.map +1 -0
- package/dist/tsup/{chunk-Q6W7RJJP.js → chunk-DIGBC2VI.js} +211 -2316
- package/dist/tsup/chunk-DIGBC2VI.js.map +1 -0
- package/dist/tsup/{chunk-RZW2DNND.cjs → chunk-F6JYU5IK.cjs} +1957 -1039
- package/dist/tsup/chunk-F6JYU5IK.cjs.map +1 -0
- package/dist/tsup/chunk-HAZL2EPK.cjs +534 -0
- package/dist/tsup/chunk-HAZL2EPK.cjs.map +1 -0
- package/dist/tsup/chunk-HDQ2JUQT.cjs +23 -0
- package/dist/tsup/chunk-HDQ2JUQT.cjs.map +1 -0
- package/dist/tsup/chunk-HIDX4C5Y.cjs +1036 -0
- package/dist/tsup/chunk-HIDX4C5Y.cjs.map +1 -0
- package/dist/tsup/chunk-IVG73YCW.js +534 -0
- package/dist/tsup/chunk-IVG73YCW.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-2XQS746M.cjs → chunk-L47L3ZWJ.cjs} +127 -2
- package/dist/tsup/chunk-L47L3ZWJ.cjs.map +1 -0
- package/dist/tsup/{chunk-H4TB4X25.cjs → chunk-LW6KLR7A.cjs} +126 -18
- package/dist/tsup/chunk-LW6KLR7A.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-GMAVRZSF.js → chunk-M2T62AZQ.js} +1790 -872
- package/dist/tsup/chunk-M2T62AZQ.js.map +1 -0
- package/dist/tsup/chunk-MZ37VV3P.js +5974 -0
- package/dist/tsup/chunk-MZ37VV3P.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-OMEPCQK2.js +649 -0
- package/dist/tsup/chunk-OMEPCQK2.js.map +1 -0
- package/dist/tsup/chunk-SR3KQE7Q.cjs +72 -0
- package/dist/tsup/chunk-SR3KQE7Q.cjs.map +1 -0
- package/dist/tsup/chunk-SSEP6DHP.cjs +2657 -0
- package/dist/tsup/chunk-SSEP6DHP.cjs.map +1 -0
- package/dist/tsup/chunk-T5YCUGVS.js +1036 -0
- package/dist/tsup/chunk-T5YCUGVS.js.map +1 -0
- package/dist/tsup/{chunk-EJVBH5VF.cjs → chunk-TPGXWFQT.cjs} +3 -3
- package/dist/tsup/{chunk-EJVBH5VF.cjs.map → chunk-TPGXWFQT.cjs.map} +1 -1
- package/dist/tsup/{chunk-X35U3YNX.cjs → chunk-TYLXNCA5.cjs} +214 -339
- package/dist/tsup/chunk-TYLXNCA5.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-XWBAQO5H.cjs +649 -0
- package/dist/tsup/chunk-XWBAQO5H.cjs.map +1 -0
- package/dist/tsup/chunk-YQ4LDVD6.cjs +5974 -0
- package/dist/tsup/chunk-YQ4LDVD6.cjs.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 +9 -10
- package/dist/tsup/client/mod.cjs.map +1 -1
- package/dist/tsup/client/mod.d.cts +11 -5
- package/dist/tsup/client/mod.d.ts +11 -5
- package/dist/tsup/client/mod.js +8 -8
- package/dist/tsup/common/log.cjs +4 -4
- package/dist/tsup/common/log.d.cts +2 -2
- package/dist/tsup/common/log.d.ts +2 -2
- package/dist/tsup/common/log.js +3 -2
- package/dist/tsup/common/websocket.cjs +5 -5
- package/dist/tsup/common/websocket.js +4 -3
- package/dist/tsup/config-BFqid9Gr.d.ts +2574 -0
- package/dist/tsup/config-BiNoIHRs.d.cts +80 -0
- package/dist/tsup/config-BiNoIHRs.d.ts +80 -0
- package/dist/tsup/{config-CZB2-W8x.d.cts → config-CAZphOS1.d.cts} +681 -355
- 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-D0QX9M11.d.ts → driver-Bxv62E2p.d.ts} +2 -2
- package/dist/tsup/{driver-q-zqG7fc.d.cts → driver-DYXwJR5D.d.cts} +2 -2
- package/dist/tsup/driver-helpers/mod.cjs +12 -6
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
- package/dist/tsup/driver-helpers/mod.d.cts +12 -5
- package/dist/tsup/driver-helpers/mod.d.ts +12 -5
- package/dist/tsup/driver-helpers/mod.js +12 -5
- package/dist/tsup/driver-test-suite/mod.cjs +1370 -116
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +10 -4
- package/dist/tsup/driver-test-suite/mod.d.ts +10 -4
- package/dist/tsup/driver-test-suite/mod.js +2093 -838
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +29 -3
- package/dist/tsup/inspector/mod.cjs.map +1 -1
- package/dist/tsup/inspector/mod.d.cts +124 -3
- package/dist/tsup/inspector/mod.d.ts +124 -3
- package/dist/tsup/inspector/mod.js +72 -45
- package/dist/tsup/keys-CydblqMh.d.cts +13 -0
- package/dist/tsup/keys-CydblqMh.d.ts +13 -0
- package/dist/tsup/mod.cjs +16 -10
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +26 -14
- package/dist/tsup/mod.d.ts +26 -14
- package/dist/tsup/mod.js +20 -13
- package/dist/tsup/serve-test-suite/mod.cjs +1165 -83
- package/dist/tsup/serve-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/serve-test-suite/mod.js +1114 -29
- package/dist/tsup/serve-test-suite/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +84 -11
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +10 -5
- package/dist/tsup/test/mod.d.ts +10 -5
- package/dist/tsup/test/mod.js +85 -11
- package/dist/tsup/test/mod.js.map +1 -1
- package/dist/tsup/utils.cjs +10 -4
- package/dist/tsup/utils.cjs.map +1 -1
- package/dist/tsup/utils.d.cts +72 -2
- package/dist/tsup/utils.d.ts +72 -2
- package/dist/tsup/utils.js +9 -2
- 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 +83 -0
- package/dist/tsup/workflow/mod.d.ts +83 -0
- package/dist/tsup/workflow/mod.js +16 -0
- package/dist/tsup/workflow/mod.js.map +1 -0
- package/package.json +62 -5
- package/src/actor/config.ts +478 -68
- package/src/actor/conn/mod.ts +68 -16
- package/src/actor/conn/state-manager.ts +2 -2
- package/src/actor/contexts/action.ts +20 -12
- package/src/actor/contexts/base/actor.ts +137 -7
- package/src/actor/contexts/base/conn-init.ts +27 -7
- package/src/actor/contexts/base/conn.ts +27 -18
- package/src/actor/contexts/before-action-response.ts +9 -2
- package/src/actor/contexts/before-connect.ts +7 -2
- package/src/actor/contexts/connect.ts +9 -2
- package/src/actor/contexts/create-conn-state.ts +7 -2
- package/src/actor/contexts/create-vars.ts +16 -3
- package/src/actor/contexts/create.ts +16 -3
- package/src/actor/contexts/destroy.ts +9 -3
- package/src/actor/contexts/disconnect.ts +10 -4
- package/src/actor/contexts/index.ts +4 -3
- package/src/actor/contexts/request.ts +23 -6
- package/src/actor/contexts/run.ts +47 -0
- package/src/actor/contexts/sleep.ts +9 -3
- package/src/actor/contexts/state-change.ts +9 -3
- package/src/actor/contexts/wake.ts +9 -3
- package/src/actor/contexts/websocket.ts +23 -6
- package/src/actor/database.ts +8 -18
- package/src/actor/definition.ts +20 -6
- package/src/actor/driver.ts +32 -3
- package/src/actor/errors.ts +127 -0
- package/src/actor/instance/connection-manager.ts +183 -80
- package/src/actor/instance/event-manager.ts +26 -15
- package/src/actor/instance/keys.ts +117 -0
- package/src/actor/instance/mod.ts +784 -174
- package/src/actor/instance/queue-manager.ts +603 -0
- package/src/actor/instance/queue.ts +287 -0
- package/src/actor/instance/schedule-manager.ts +49 -7
- package/src/actor/instance/state-manager.ts +35 -11
- package/src/actor/instance/traces-driver.ts +128 -0
- package/src/actor/mod.ts +26 -2
- package/src/actor/protocol/old.ts +28 -13
- package/src/actor/protocol/serde.ts +1 -1
- package/src/actor/router-endpoints.ts +177 -21
- package/src/actor/router-websocket-endpoints.ts +18 -29
- package/src/actor/router.ts +177 -0
- package/src/actor/schema.ts +291 -0
- package/src/actor/utils.ts +40 -0
- package/src/client/actor-common.ts +1 -1
- package/src/client/actor-conn.ts +100 -33
- package/src/client/actor-handle.ts +61 -33
- package/src/client/client.ts +2 -4
- package/src/client/config.ts +1 -1
- package/src/client/mod.browser.ts +2 -0
- package/src/client/mod.ts +1 -4
- package/src/client/queue.ts +146 -0
- package/src/client/utils.ts +1 -1
- package/src/common/log.ts +1 -1
- package/src/common/utils.ts +3 -3
- 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/driver-helpers/mod.ts +1 -0
- package/src/driver-test-suite/mod.ts +69 -43
- package/src/driver-test-suite/tests/access-control.ts +218 -0
- package/src/driver-test-suite/tests/actor-db-raw.ts +73 -0
- package/src/driver-test-suite/tests/actor-db.ts +394 -0
- package/src/driver-test-suite/tests/actor-inspector.ts +259 -358
- package/src/driver-test-suite/tests/actor-kv.ts +41 -20
- package/src/driver-test-suite/tests/actor-queue.ts +324 -0
- package/src/driver-test-suite/tests/actor-run.ts +181 -0
- package/src/driver-test-suite/tests/actor-schedule.ts +5 -2
- package/src/driver-test-suite/tests/actor-sleep.ts +3 -3
- package/src/driver-test-suite/tests/actor-stateless.ts +70 -0
- package/src/driver-test-suite/tests/actor-workflow.ts +108 -0
- package/src/driver-test-suite/tests/manager-driver.ts +11 -0
- package/src/driver-test-suite/tests/raw-http-request-properties.ts +1 -1
- package/src/driver-test-suite/tests/raw-websocket.ts +12 -12
- package/src/drivers/default.ts +7 -2
- package/src/drivers/engine/actor-driver.ts +45 -37
- package/src/drivers/engine/config.ts +1 -1
- package/src/drivers/file-system/actor.ts +20 -2
- package/src/drivers/file-system/global-state.ts +569 -258
- package/src/drivers/file-system/kv-limits.ts +70 -0
- package/src/drivers/file-system/manager.ts +22 -6
- package/src/drivers/file-system/mod.ts +39 -16
- package/src/drivers/file-system/sqlite-runtime.ts +210 -0
- package/src/inspector/actor-inspector.ts +224 -102
- package/src/inspector/config.ts +1 -1
- package/src/inspector/handler.ts +102 -20
- package/src/inspector/mod.browser.ts +8 -0
- package/src/inspector/mod.ts +2 -0
- package/src/inspector/serve-ui.ts +40 -0
- package/src/inspector/transport.ts +18 -0
- package/src/inspector/utils.ts +5 -39
- package/src/manager/gateway.ts +1 -1
- package/src/manager/protocol/mod.ts +1 -1
- package/src/manager/protocol/query.ts +1 -1
- package/src/manager/router-schema.ts +1 -1
- package/src/manager/router.ts +38 -12
- package/src/manager-api/actors.ts +1 -1
- package/src/manager-api/common.ts +1 -1
- package/src/registry/config/driver.ts +1 -1
- package/src/registry/config/index.ts +212 -43
- package/src/registry/config/legacy-runner.ts +1 -1
- package/src/registry/config/runner.ts +1 -1
- package/src/registry/config/serverless.ts +1 -1
- package/src/registry/index.ts +7 -5
- package/src/remote-manager-driver/api-utils.ts +1 -1
- package/src/schemas/actor-inspector/mod.ts +1 -1
- package/src/schemas/actor-inspector/versioned.ts +195 -8
- package/src/schemas/actor-persist/versioned.ts +87 -7
- package/src/schemas/client-protocol/mod.ts +1 -1
- package/src/schemas/client-protocol/versioned.ts +127 -11
- package/src/schemas/client-protocol-zod/mod.ts +16 -1
- package/src/schemas/persist/mod.ts +1 -0
- package/src/schemas/transport/mod.ts +1 -0
- package/src/serde.ts +1 -1
- package/src/serve-test-suite/mod.ts +10 -9
- package/src/test/mod.ts +15 -56
- package/src/utils/endpoint-parser.test.ts +1 -1
- package/src/utils/endpoint-parser.ts +1 -1
- package/src/utils/env-vars.ts +12 -1
- package/src/utils/node.ts +15 -2
- package/src/utils.test.ts +34 -0
- package/src/utils.ts +140 -6
- package/src/workflow/constants.ts +2 -0
- package/src/workflow/context.ts +532 -0
- package/src/workflow/driver.ts +191 -0
- package/src/workflow/inspector.ts +268 -0
- package/src/workflow/mod.ts +122 -0
- package/dist/tsup/chunk-2IJTYN6K.cjs +0 -278
- package/dist/tsup/chunk-2IJTYN6K.cjs.map +0 -1
- package/dist/tsup/chunk-2XQS746M.cjs.map +0 -1
- package/dist/tsup/chunk-3VP5CSHV.cjs +0 -114
- package/dist/tsup/chunk-3VP5CSHV.cjs.map +0 -1
- package/dist/tsup/chunk-AQFSQMBG.js +0 -114
- package/dist/tsup/chunk-AQFSQMBG.js.map +0 -1
- package/dist/tsup/chunk-E6ZE2YEA.js +0 -664
- package/dist/tsup/chunk-E6ZE2YEA.js.map +0 -1
- package/dist/tsup/chunk-FJ3KTN4V.js.map +0 -1
- package/dist/tsup/chunk-GBENOENJ.cjs +0 -8
- package/dist/tsup/chunk-GBENOENJ.cjs.map +0 -1
- package/dist/tsup/chunk-GD7UXGOE.cjs +0 -4762
- package/dist/tsup/chunk-GD7UXGOE.cjs.map +0 -1
- package/dist/tsup/chunk-GMAVRZSF.js.map +0 -1
- package/dist/tsup/chunk-H4TB4X25.cjs.map +0 -1
- package/dist/tsup/chunk-JDAD2YFA.js.map +0 -1
- package/dist/tsup/chunk-KCOVZOPS.js +0 -1946
- package/dist/tsup/chunk-KCOVZOPS.js.map +0 -1
- package/dist/tsup/chunk-KDFWJKMJ.cjs +0 -664
- package/dist/tsup/chunk-KDFWJKMJ.cjs.map +0 -1
- package/dist/tsup/chunk-LFVF5SCU.js.map +0 -1
- package/dist/tsup/chunk-Q6W7RJJP.js.map +0 -1
- package/dist/tsup/chunk-RUW5CZ5Z.cjs +0 -1949
- package/dist/tsup/chunk-RUW5CZ5Z.cjs.map +0 -1
- package/dist/tsup/chunk-RZW2DNND.cjs.map +0 -1
- package/dist/tsup/chunk-TCOEBUUE.js +0 -278
- package/dist/tsup/chunk-TCOEBUUE.js.map +0 -1
- package/dist/tsup/chunk-X35U3YNX.cjs.map +0 -1
- package/dist/tsup/keys-Chhy4ylv.d.cts +0 -8
- package/dist/tsup/keys-Chhy4ylv.d.ts +0 -8
- package/dist/tsup/v1-Gq4avTK3.d.cts +0 -240
- package/dist/tsup/v1-Gq4avTK3.d.ts +0 -240
- /package/dist/tsup/{chunk-XXGJCOL6.js.map → chunk-A6YIZWTK.js.map} +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { serve as honoServe } from "@hono/node-server";
|
|
2
|
-
import { createNodeWebSocket } from "@hono/node-ws";
|
|
3
1
|
import { createServer } from "node:net";
|
|
4
2
|
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { serve as honoServe } from "@hono/node-server";
|
|
4
|
+
import { createNodeWebSocket } from "@hono/node-ws";
|
|
5
5
|
import invariant from "invariant";
|
|
6
|
-
import { buildManagerRouter } from "@/manager/router";
|
|
7
|
-
import { createFileSystemOrMemoryDriver } from "@/drivers/file-system/mod";
|
|
8
6
|
import { logger } from "@/driver-test-suite/log";
|
|
7
|
+
import { createFileSystemOrMemoryDriver } from "@/drivers/file-system/mod";
|
|
8
|
+
import { buildManagerRouter } from "@/manager/router";
|
|
9
9
|
import { registry } from "../../fixtures/driver-test-suite/registry";
|
|
10
10
|
|
|
11
11
|
export interface ServeTestSuiteResult {
|
|
@@ -74,10 +74,9 @@ export async function serveTestSuite(): Promise<ServeTestSuiteResult> {
|
|
|
74
74
|
publicEndpoint: `http://127.0.0.1:${port}`,
|
|
75
75
|
};
|
|
76
76
|
|
|
77
|
-
const driver = await createFileSystemOrMemoryDriver(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
);
|
|
77
|
+
const driver = await createFileSystemOrMemoryDriver(true, {
|
|
78
|
+
path: `/tmp/rivetkit-test-suite-${crypto.randomUUID()}`,
|
|
79
|
+
});
|
|
81
80
|
registry.config.driver = driver;
|
|
82
81
|
|
|
83
82
|
let upgradeWebSocket: any;
|
|
@@ -114,7 +113,9 @@ export async function serveTestSuite(): Promise<ServeTestSuiteResult> {
|
|
|
114
113
|
namespace: "default",
|
|
115
114
|
runnerName: "default",
|
|
116
115
|
close: async () => {
|
|
117
|
-
await new Promise((resolve) =>
|
|
116
|
+
await new Promise((resolve) =>
|
|
117
|
+
server.close(() => resolve(undefined)),
|
|
118
|
+
);
|
|
118
119
|
},
|
|
119
120
|
};
|
|
120
121
|
}
|
package/src/test/mod.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { createServer } from "node:net";
|
|
2
1
|
import { serve as honoServe } from "@hono/node-server";
|
|
3
2
|
import { createNodeWebSocket } from "@hono/node-ws";
|
|
4
3
|
import invariant from "invariant";
|
|
@@ -24,9 +23,9 @@ export async function setupTest<A extends Registry<any>>(
|
|
|
24
23
|
registry.config.test = { ...registry.config.test, enabled: true };
|
|
25
24
|
|
|
26
25
|
// Create driver
|
|
27
|
-
const driver =
|
|
26
|
+
const driver = createFileSystemOrMemoryDriver(
|
|
28
27
|
true,
|
|
29
|
-
`/tmp/rivetkit-test-${crypto.randomUUID()}
|
|
28
|
+
{ path: `/tmp/rivetkit-test-${crypto.randomUUID()}` },
|
|
30
29
|
);
|
|
31
30
|
|
|
32
31
|
// Build driver config
|
|
@@ -42,6 +41,8 @@ export async function setupTest<A extends Registry<any>>(
|
|
|
42
41
|
const parsedConfig = registry.parseConfig();
|
|
43
42
|
const managerDriver = driver.manager?.(parsedConfig);
|
|
44
43
|
invariant(managerDriver, "missing manager driver");
|
|
44
|
+
const getUpgradeWebSocket = () => upgradeWebSocket;
|
|
45
|
+
managerDriver.setGetUpgradeWebSocket(getUpgradeWebSocket);
|
|
45
46
|
// const internalClient = createClientWithDriver(
|
|
46
47
|
// managerDriver,
|
|
47
48
|
// ClientConfigSchema.parse({}),
|
|
@@ -49,7 +50,7 @@ export async function setupTest<A extends Registry<any>>(
|
|
|
49
50
|
const { router } = buildManagerRouter(
|
|
50
51
|
parsedConfig,
|
|
51
52
|
managerDriver,
|
|
52
|
-
|
|
53
|
+
getUpgradeWebSocket,
|
|
53
54
|
);
|
|
54
55
|
|
|
55
56
|
// Inject WebSocket
|
|
@@ -58,17 +59,24 @@ export async function setupTest<A extends Registry<any>>(
|
|
|
58
59
|
|
|
59
60
|
// TODO: I think this whole function is fucked, we should probably switch to calling registry.serve() directly
|
|
60
61
|
// Start server
|
|
61
|
-
const port = await getPort();
|
|
62
62
|
const server = honoServe({
|
|
63
63
|
fetch: router.fetch,
|
|
64
64
|
hostname: "127.0.0.1",
|
|
65
|
-
port,
|
|
65
|
+
port: 0,
|
|
66
66
|
});
|
|
67
|
+
if (!server.listening) {
|
|
68
|
+
await new Promise<void>((resolve) => {
|
|
69
|
+
server.once("listening", () => resolve());
|
|
70
|
+
});
|
|
71
|
+
}
|
|
67
72
|
invariant(
|
|
68
73
|
nodeWebSocket.injectWebSocket !== undefined,
|
|
69
74
|
"should have injectWebSocket",
|
|
70
75
|
);
|
|
71
76
|
nodeWebSocket.injectWebSocket(server);
|
|
77
|
+
const address = server.address();
|
|
78
|
+
invariant(address && typeof address !== "string", "missing server address");
|
|
79
|
+
const port = address.port;
|
|
72
80
|
const endpoint = `http://127.0.0.1:${port}`;
|
|
73
81
|
|
|
74
82
|
logger().info({ msg: "test server listening", port });
|
|
@@ -83,58 +91,9 @@ export async function setupTest<A extends Registry<any>>(
|
|
|
83
91
|
endpoint,
|
|
84
92
|
namespace: "default",
|
|
85
93
|
runnerName: "default",
|
|
94
|
+
disableMetadataLookup: true,
|
|
86
95
|
});
|
|
87
96
|
c.onTestFinished(async () => await client.dispose());
|
|
88
97
|
|
|
89
98
|
return { client };
|
|
90
99
|
}
|
|
91
|
-
|
|
92
|
-
export async function getPort(): Promise<number> {
|
|
93
|
-
// Pick random port between 10000 and 65535 (avoiding well-known and registered ports)
|
|
94
|
-
const MIN_PORT = 10000;
|
|
95
|
-
const MAX_PORT = 65535;
|
|
96
|
-
const getRandomPort = () =>
|
|
97
|
-
Math.floor(Math.random() * (MAX_PORT - MIN_PORT + 1)) + MIN_PORT;
|
|
98
|
-
|
|
99
|
-
let port = getRandomPort();
|
|
100
|
-
let maxAttempts = 10;
|
|
101
|
-
|
|
102
|
-
while (maxAttempts > 0) {
|
|
103
|
-
try {
|
|
104
|
-
// Try to create a server on the port to check if it's available
|
|
105
|
-
const server = await new Promise<any>((resolve, reject) => {
|
|
106
|
-
const server = createServer();
|
|
107
|
-
|
|
108
|
-
server.once("error", (err: Error & { code?: string }) => {
|
|
109
|
-
if (err.code === "EADDRINUSE") {
|
|
110
|
-
reject(new Error(`Port ${port} is in use`));
|
|
111
|
-
} else {
|
|
112
|
-
reject(err);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
server.once("listening", () => {
|
|
117
|
-
resolve(server);
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
server.listen(port);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
// Close the server since we're just checking availability
|
|
124
|
-
await new Promise<void>((resolve) => {
|
|
125
|
-
server.close(() => resolve());
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
return port;
|
|
129
|
-
} catch (err) {
|
|
130
|
-
// If port is in use, try a different one
|
|
131
|
-
maxAttempts--;
|
|
132
|
-
if (maxAttempts <= 0) {
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
port = getRandomPort();
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
throw new Error("Could not find an available port after multiple attempts");
|
|
140
|
-
}
|
package/src/utils/env-vars.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// This file consolidates all environment variables that affect RivetKit's behavior.
|
|
2
2
|
//
|
|
3
3
|
// IMPORTANT: When adding or modifying environment variables here, also update the
|
|
4
|
-
// documentation at: docs/general/
|
|
4
|
+
// documentation at: website/src/content/docs/general/environment-variables.mdx
|
|
5
5
|
|
|
6
6
|
import { getEnvUniversal } from "@/utils";
|
|
7
7
|
|
|
@@ -44,6 +44,8 @@ export const getRivetkitInspectorToken = (): string | undefined =>
|
|
|
44
44
|
getEnvUniversal("RIVET_INSPECTOR_TOKEN");
|
|
45
45
|
export const getRivetkitInspectorDisable = (): boolean =>
|
|
46
46
|
getEnvUniversal("RIVET_INSPECTOR_DISABLE") === "1";
|
|
47
|
+
export const getRivetkitStoragePath = (): string | undefined =>
|
|
48
|
+
getEnvUniversal("RIVETKIT_STORAGE_PATH");
|
|
47
49
|
|
|
48
50
|
// Logging configuration
|
|
49
51
|
// DEPRECATED: LOG_LEVEL will be removed in a future version
|
|
@@ -65,3 +67,12 @@ export const getNodeEnv = (): string | undefined => getEnvUniversal("NODE_ENV");
|
|
|
65
67
|
export const getNextPhase = (): string | undefined =>
|
|
66
68
|
getEnvUniversal("NEXT_PHASE");
|
|
67
69
|
export const isDev = (): boolean => getNodeEnv() !== "production";
|
|
70
|
+
|
|
71
|
+
// Experimental
|
|
72
|
+
/**
|
|
73
|
+
* Enables experimental OTel tracing for Rivet Actors.
|
|
74
|
+
*
|
|
75
|
+
* When disabled, actors use an in-memory no-op traces implementation.
|
|
76
|
+
*/
|
|
77
|
+
export const getRivetExperimentalOtel = (): boolean =>
|
|
78
|
+
getEnvUniversal("RIVET_EXPERIMENTAL_OTEL") === "1";
|
package/src/utils/node.ts
CHANGED
|
@@ -16,13 +16,14 @@ let nodePath: typeof import("node:path") | undefined;
|
|
|
16
16
|
let nodeOs: typeof import("node:os") | undefined;
|
|
17
17
|
let nodeChildProcess: typeof import("node:child_process") | undefined;
|
|
18
18
|
let nodeStream: typeof import("node:stream/promises") | undefined;
|
|
19
|
+
let nodeUrl: typeof import("node:url") | undefined;
|
|
19
20
|
|
|
20
21
|
let hasImportedDependencies = false;
|
|
21
22
|
|
|
22
23
|
// Helper to get a require function that works in both CommonJS and ESM.
|
|
23
24
|
// We use require() instead of await import() because registry.start() cannot
|
|
24
25
|
// be async and needs immediate access to Node.js modules during setup.
|
|
25
|
-
function getRequireFn() {
|
|
26
|
+
export function getRequireFn() {
|
|
26
27
|
// TODO: This causes issues in tsup
|
|
27
28
|
// CommonJS context - use global require
|
|
28
29
|
// if (typeof require !== "undefined") {
|
|
@@ -62,7 +63,7 @@ export function importNodeDependencies(): void {
|
|
|
62
63
|
nodeStream = requireFn(
|
|
63
64
|
/* webpackIgnore: true */ "node:stream/promises",
|
|
64
65
|
);
|
|
65
|
-
|
|
66
|
+
nodeUrl = requireFn(/* webpackIgnore: true */ "node:url");
|
|
66
67
|
hasImportedDependencies = true;
|
|
67
68
|
} catch (err) {
|
|
68
69
|
console.warn(
|
|
@@ -163,3 +164,15 @@ export function getNodeStream(): typeof import("node:stream/promises") {
|
|
|
163
164
|
}
|
|
164
165
|
return nodeStream;
|
|
165
166
|
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Gets the Node.js url module lazily.
|
|
170
|
+
*/
|
|
171
|
+
export function getNodeUrl(): typeof import("node:url") {
|
|
172
|
+
if (!nodeUrl) {
|
|
173
|
+
throw new Error(
|
|
174
|
+
"Node url module not loaded. Ensure importNodeDependencies() has been called.",
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
return nodeUrl;
|
|
178
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { joinSignals } from "./utils";
|
|
3
|
+
|
|
4
|
+
describe("joinSignals", () => {
|
|
5
|
+
test("returns a non-aborted signal when no inputs are provided", () => {
|
|
6
|
+
const signal = joinSignals();
|
|
7
|
+
expect(signal.aborted).toBe(false);
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
test("returns the same signal when only one input is provided", () => {
|
|
11
|
+
const controller = new AbortController();
|
|
12
|
+
const signal = joinSignals(controller.signal);
|
|
13
|
+
expect(signal).toBe(controller.signal);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test("aborts immediately when any input signal is already aborted", () => {
|
|
17
|
+
const controllerA = new AbortController();
|
|
18
|
+
const controllerB = new AbortController();
|
|
19
|
+
controllerA.abort("already-aborted");
|
|
20
|
+
|
|
21
|
+
const signal = joinSignals(controllerA.signal, controllerB.signal);
|
|
22
|
+
expect(signal.aborted).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test("aborts when one of the joined signals aborts", () => {
|
|
26
|
+
const controllerA = new AbortController();
|
|
27
|
+
const controllerB = new AbortController();
|
|
28
|
+
const signal = joinSignals(controllerA.signal, controllerB.signal);
|
|
29
|
+
|
|
30
|
+
expect(signal.aborted).toBe(false);
|
|
31
|
+
controllerB.abort("stopped");
|
|
32
|
+
expect(signal.aborted).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
});
|
package/src/utils.ts
CHANGED
|
@@ -1,11 +1,103 @@
|
|
|
1
|
-
|
|
2
|
-
export { assertUnreachable } from "./common/utils";
|
|
3
|
-
|
|
1
|
+
import { stringifyError } from "@/common/utils";
|
|
4
2
|
import type { Context as HonoContext, Handler as HonoHandler } from "hono";
|
|
5
3
|
import { stringify as uuidstringify } from "uuid";
|
|
6
|
-
import { stringifyError } from "@/common/utils";
|
|
7
4
|
import pkgJson from "../package.json" with { type: "json" };
|
|
8
5
|
import { getLogger } from "./common/log";
|
|
6
|
+
import { assertUnreachable } from "./common/utils";
|
|
7
|
+
|
|
8
|
+
/** @experimental */
|
|
9
|
+
export { stringifyError };
|
|
10
|
+
|
|
11
|
+
/** @experimental */
|
|
12
|
+
export { assertUnreachable };
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Joins multiple abort signals into one.
|
|
16
|
+
*
|
|
17
|
+
* The returned signal aborts when the first input signal aborts.
|
|
18
|
+
* Uses `AbortSignal.any(...)` when available, with a runtime fallback.
|
|
19
|
+
*
|
|
20
|
+
* @experimental
|
|
21
|
+
*/
|
|
22
|
+
export function joinSignals(
|
|
23
|
+
...signals: Array<AbortSignal | undefined | null>
|
|
24
|
+
): AbortSignal {
|
|
25
|
+
const validSignals = signals.filter(
|
|
26
|
+
(signal): signal is AbortSignal => signal != null,
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
if (validSignals.length === 0) {
|
|
30
|
+
return new AbortController().signal;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (validSignals.length === 1) {
|
|
34
|
+
return validSignals[0];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const signalAny = (
|
|
38
|
+
AbortSignal as typeof AbortSignal & {
|
|
39
|
+
any?: (signals: AbortSignal[]) => AbortSignal;
|
|
40
|
+
}
|
|
41
|
+
).any;
|
|
42
|
+
if (typeof signalAny === "function") {
|
|
43
|
+
return signalAny(validSignals);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const controller = new AbortController();
|
|
47
|
+
const cleanups: Array<() => void> = [];
|
|
48
|
+
|
|
49
|
+
const abortWithSignal = (signal: AbortSignal) => {
|
|
50
|
+
if (controller.signal.aborted) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
for (const cleanup of cleanups) {
|
|
55
|
+
cleanup();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const reason = (signal as AbortSignal & { reason?: unknown }).reason;
|
|
59
|
+
controller.abort(reason);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
for (const signal of validSignals) {
|
|
63
|
+
if (signal.aborted) {
|
|
64
|
+
abortWithSignal(signal);
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const onAbort = () => abortWithSignal(signal);
|
|
69
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
70
|
+
cleanups.push(() => signal.removeEventListener("abort", onAbort));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return controller.signal;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Returns a promise that resolves after the given number of milliseconds.
|
|
78
|
+
*
|
|
79
|
+
* @experimental
|
|
80
|
+
*/
|
|
81
|
+
export function sleep(ms: number): Promise<void> {
|
|
82
|
+
return new Promise<void>((resolve) => setTimeout(resolve, ms));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Creates a fixed-rate interval tick function that can be awaited in a loop.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* const tick = interval(100);
|
|
90
|
+
* while (!c.aborted) {
|
|
91
|
+
* await tick();
|
|
92
|
+
* if (c.aborted) break;
|
|
93
|
+
* // ... game logic
|
|
94
|
+
* }
|
|
95
|
+
*
|
|
96
|
+
* @experimental
|
|
97
|
+
*/
|
|
98
|
+
export function interval(ms: number): () => Promise<void> {
|
|
99
|
+
return () => sleep(ms);
|
|
100
|
+
}
|
|
9
101
|
|
|
10
102
|
export const VERSION = pkgJson.version;
|
|
11
103
|
|
|
@@ -15,6 +107,11 @@ function logger() {
|
|
|
15
107
|
return getLogger("utils");
|
|
16
108
|
}
|
|
17
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Builds the HTTP user agent used by this library.
|
|
112
|
+
*
|
|
113
|
+
* @experimental
|
|
114
|
+
*/
|
|
18
115
|
export function httpUserAgent(): string {
|
|
19
116
|
// Return cached value if already initialized
|
|
20
117
|
if (_userAgent !== undefined) {
|
|
@@ -40,6 +137,11 @@ export type UpgradeWebSocket = (
|
|
|
40
137
|
|
|
41
138
|
export type GetUpgradeWebSocket = () => UpgradeWebSocket;
|
|
42
139
|
|
|
140
|
+
/**
|
|
141
|
+
* Reads an environment variable from Deno or Node runtimes.
|
|
142
|
+
*
|
|
143
|
+
* @experimental
|
|
144
|
+
*/
|
|
43
145
|
export function getEnvUniversal(key: string): string | undefined {
|
|
44
146
|
if (typeof Deno !== "undefined") {
|
|
45
147
|
return Deno.env.get(key);
|
|
@@ -49,6 +151,11 @@ export function getEnvUniversal(key: string): string | undefined {
|
|
|
49
151
|
}
|
|
50
152
|
}
|
|
51
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Traces a debug value and returns it.
|
|
156
|
+
*
|
|
157
|
+
* @experimental
|
|
158
|
+
*/
|
|
52
159
|
export function dbg<T>(x: T): T {
|
|
53
160
|
console.trace(`=== DEBUG ===\n${x}`);
|
|
54
161
|
return x;
|
|
@@ -60,6 +167,8 @@ export function dbg<T>(x: T): T {
|
|
|
60
167
|
*
|
|
61
168
|
* @param data - The ArrayBuffer or ArrayBufferView to convert
|
|
62
169
|
* @returns A Uint8Array view of the data
|
|
170
|
+
*
|
|
171
|
+
* @experimental
|
|
63
172
|
*/
|
|
64
173
|
export function toUint8Array(data: ArrayBuffer | ArrayBufferView): Uint8Array {
|
|
65
174
|
if (data instanceof Uint8Array) {
|
|
@@ -93,8 +202,10 @@ export type LongTimeoutHandle = { abort: () => void };
|
|
|
93
202
|
* Polyfill for Promise.withResolvers().
|
|
94
203
|
*
|
|
95
204
|
* This is specifically for Cloudflare Workers. Their implementation of Promise.withResolvers does not work correctly.
|
|
205
|
+
*
|
|
206
|
+
* @experimental
|
|
96
207
|
*/
|
|
97
|
-
export function promiseWithResolvers<T>(): {
|
|
208
|
+
export function promiseWithResolvers<T>(onReject: (reason?: any) => void): {
|
|
98
209
|
promise: Promise<T>;
|
|
99
210
|
resolve: (value: T | PromiseLike<T>) => void;
|
|
100
211
|
reject: (reason?: any) => void;
|
|
@@ -105,9 +216,15 @@ export function promiseWithResolvers<T>(): {
|
|
|
105
216
|
resolve = res;
|
|
106
217
|
reject = rej;
|
|
107
218
|
});
|
|
219
|
+
promise.catch(onReject);
|
|
108
220
|
return { promise, resolve, reject };
|
|
109
221
|
}
|
|
110
222
|
|
|
223
|
+
/**
|
|
224
|
+
* Sets a timeout that supports delays larger than the JavaScript timer limit.
|
|
225
|
+
*
|
|
226
|
+
* @experimental
|
|
227
|
+
*/
|
|
111
228
|
export function setLongTimeout(
|
|
112
229
|
listener: () => void,
|
|
113
230
|
after: number,
|
|
@@ -155,7 +272,7 @@ export class SinglePromiseQueue {
|
|
|
155
272
|
|
|
156
273
|
// Ensure a shared resolver exists for all callers in this cycle
|
|
157
274
|
if (!this.#pending) {
|
|
158
|
-
this.#pending = promiseWithResolvers<void>();
|
|
275
|
+
this.#pending = promiseWithResolvers<void>((reason) => logger().warn({ msg: "unhandled single promise queue rejection", reason }));
|
|
159
276
|
}
|
|
160
277
|
|
|
161
278
|
const waitForThisCycle = this.#pending.promise;
|
|
@@ -199,6 +316,11 @@ export class SinglePromiseQueue {
|
|
|
199
316
|
}
|
|
200
317
|
}
|
|
201
318
|
|
|
319
|
+
/**
|
|
320
|
+
* Converts a Buffer or Uint8Array into an ArrayBuffer view.
|
|
321
|
+
*
|
|
322
|
+
* @experimental
|
|
323
|
+
*/
|
|
202
324
|
export function bufferToArrayBuffer(buf: Buffer | Uint8Array): ArrayBuffer {
|
|
203
325
|
return buf.buffer.slice(
|
|
204
326
|
buf.byteOffset,
|
|
@@ -221,6 +343,8 @@ export function bufferToArrayBuffer(buf: Buffer | Uint8Array): ArrayBuffer {
|
|
|
221
343
|
* @param path The path to append to the endpoint (may include query parameters)
|
|
222
344
|
* @param queryParams Optional additional query parameters to append
|
|
223
345
|
* @returns The properly combined URL string
|
|
346
|
+
*
|
|
347
|
+
* @experimental
|
|
224
348
|
*/
|
|
225
349
|
export function combineUrlPath(
|
|
226
350
|
endpoint: string,
|
|
@@ -259,6 +383,11 @@ export function combineUrlPath(
|
|
|
259
383
|
return `${baseUrl.protocol}//${baseUrl.host}${fullPath}${fullQuery}`;
|
|
260
384
|
}
|
|
261
385
|
|
|
386
|
+
/**
|
|
387
|
+
* Compares two ArrayBuffer values by byte content.
|
|
388
|
+
*
|
|
389
|
+
* @experimental
|
|
390
|
+
*/
|
|
262
391
|
export function arrayBuffersEqual(
|
|
263
392
|
buf1: ArrayBuffer,
|
|
264
393
|
buf2: ArrayBuffer,
|
|
@@ -282,6 +411,11 @@ export const EXTRA_ERROR_LOG = {
|
|
|
282
411
|
|
|
283
412
|
export type Runtime = "deno" | "bun" | "node";
|
|
284
413
|
|
|
414
|
+
/**
|
|
415
|
+
* Detects the current JavaScript runtime from the user agent.
|
|
416
|
+
*
|
|
417
|
+
* @experimental
|
|
418
|
+
*/
|
|
285
419
|
export function detectRuntime(): Runtime {
|
|
286
420
|
const userAgent =
|
|
287
421
|
typeof navigator !== "undefined" ? navigator.userAgent : "";
|