From 63c1e8c29ba360af27fb4ba44f4557d98e876da1 Mon Sep 17 00:00:00 2001 From: MasterPtato Date: Tue, 16 Sep 2025 14:25:52 -0700 Subject: [PATCH] fix: get test runner working on vercel --- docker/universal/Dockerfile | 2 +- packages/core/api-peer/src/runner_configs.rs | 6 ++--- packages/core/pegboard-serverless/src/lib.rs | 6 +++++ packages/infra/engine/tests/common/runner.rs | 2 +- .../ops/bump_serverless_autoscaler_global.rs | 7 +++++- .../internal/src/ops/cache/purge_global.rs | 6 ++++- .../src/ops/runner_config/get_global.rs | 18 ++++++++++--- sdks/typescript/test-runner/Dockerfile | 2 +- sdks/typescript/test-runner/package.json | 6 ++--- .../test-runner/src/{main.ts => index.ts} | 25 ++++++++++++------- sdks/typescript/test-runner/tsconfig.json | 3 ++- 11 files changed, 58 insertions(+), 25 deletions(-) rename sdks/typescript/test-runner/src/{main.ts => index.ts} (89%) diff --git a/docker/universal/Dockerfile b/docker/universal/Dockerfile index e07ea87137..2f503584d7 100644 --- a/docker/universal/Dockerfile +++ b/docker/universal/Dockerfile @@ -115,7 +115,7 @@ CMD ["/usr/bin/rivet-engine", "start"] # MARK: Engine (Slim) FROM --platform=linux/amd64 debian:12.9-slim AS engine-slim -LABEL org.opencontainers.image.source https://github.com/rivet-gg/rivet +LABEL org.opencontainers.image.source=https://github.com/rivet-gg/rivet # Docker automatically provides TARGETARCH ARG TARGETARCH diff --git a/packages/core/api-peer/src/runner_configs.rs b/packages/core/api-peer/src/runner_configs.rs index d4e1dd5a0c..0a83b32bb8 100644 --- a/packages/core/api-peer/src/runner_configs.rs +++ b/packages/core/api-peer/src/runner_configs.rs @@ -21,9 +21,7 @@ pub struct ListQuery { #[derive(Deserialize)] #[serde(deny_unknown_fields)] -pub struct ListPath { - pub namespace_id: Id, -} +pub struct ListPath {} #[derive(Deserialize, Serialize, ToSchema)] #[serde(deny_unknown_fields)] @@ -33,7 +31,7 @@ pub struct ListResponse { pub pagination: Pagination, } -pub async fn list(ctx: ApiCtx, path: ListPath, query: ListQuery) -> Result { +pub async fn list(ctx: ApiCtx, _path: ListPath, query: ListQuery) -> Result { let namespace = ctx .op(namespace::ops::resolve_for_name_global::Input { name: query.namespace.clone(), diff --git a/packages/core/pegboard-serverless/src/lib.rs b/packages/core/pegboard-serverless/src/lib.rs index c069dc050e..5bbf64f303 100644 --- a/packages/core/pegboard-serverless/src/lib.rs +++ b/packages/core/pegboard-serverless/src/lib.rs @@ -92,6 +92,8 @@ async fn tick( }) .await?; + tracing::debug!(?serverless_data, ?runner_configs); + for (ns_id, runner_name, desired_slots) in &serverless_data { let runner_config = runner_configs .iter() @@ -161,6 +163,10 @@ async fn tick( .any(|(ns_id2, runner_name2, _)| ns_id == ns_id2 && runner_name == runner_name2) }); + tracing::debug!( + connection_counts=?outbound_connections.iter().map(|(k, v)| (k, v.len())).collect::>(), + ); + Ok(()) } diff --git a/packages/infra/engine/tests/common/runner.rs b/packages/infra/engine/tests/common/runner.rs index 8cde1acc3a..c25166c80c 100644 --- a/packages/infra/engine/tests/common/runner.rs +++ b/packages/infra/engine/tests/common/runner.rs @@ -25,7 +25,7 @@ impl TestRunner { let manifest_dir = env!("CARGO_MANIFEST_DIR"); let runner_script_path = - Path::new(manifest_dir).join("../../../sdks/typescript/test-runner/dist/main.js"); + Path::new(manifest_dir).join("../../../sdks/typescript/test-runner/dist/index.js"); if !runner_script_path.exists() { panic!( diff --git a/packages/services/internal/src/ops/bump_serverless_autoscaler_global.rs b/packages/services/internal/src/ops/bump_serverless_autoscaler_global.rs index bc2e698b22..95176a6d1a 100644 --- a/packages/services/internal/src/ops/bump_serverless_autoscaler_global.rs +++ b/packages/services/internal/src/ops/bump_serverless_autoscaler_global.rs @@ -22,7 +22,7 @@ pub async fn bump_serverless_autoscaler_global(ctx: &OperationCtx, input: &Input .await } else { // Remote datacenter - HTTP request - request_remote_datacenter( + request_remote_datacenter::( ctx.config(), dc.datacenter_label, "/bump-serverless-autoscaler", @@ -32,6 +32,7 @@ pub async fn bump_serverless_autoscaler_global(ctx: &OperationCtx, input: &Input Option::<&()>::None, ) .await + .map(|_| ()) } } })) @@ -58,3 +59,7 @@ pub async fn bump_serverless_autoscaler_global(ctx: &OperationCtx, input: &Input Ok(()) } + +// TODO: This is cloned from api-peer because of a cyclical dependency +#[derive(Deserialize)] +pub struct BumpServerlessAutoscalerResponse {} diff --git a/packages/services/internal/src/ops/cache/purge_global.rs b/packages/services/internal/src/ops/cache/purge_global.rs index ecd4c74684..9c8e24ac52 100644 --- a/packages/services/internal/src/ops/cache/purge_global.rs +++ b/packages/services/internal/src/ops/cache/purge_global.rs @@ -30,7 +30,7 @@ pub async fn cache_purge_global(ctx: &OperationCtx, input: &Input) -> Result<()> .await } else { // Remote datacenter - HTTP request - request_remote_datacenter( + request_remote_datacenter::( ctx.config(), dc.datacenter_label, "/cache/purge", @@ -43,6 +43,7 @@ pub async fn cache_purge_global(ctx: &OperationCtx, input: &Input) -> Result<()> }), ) .await + .map(|_| ()) } } })) @@ -76,3 +77,6 @@ pub struct CachePurgeRequest { pub base_key: String, pub keys: Vec, } + +#[derive(Deserialize)] +pub struct CachePurgeResponse {} diff --git a/packages/services/namespace/src/ops/runner_config/get_global.rs b/packages/services/namespace/src/ops/runner_config/get_global.rs index 64a2ade433..e7207fec43 100644 --- a/packages/services/namespace/src/ops/runner_config/get_global.rs +++ b/packages/services/namespace/src/ops/runner_config/get_global.rs @@ -38,6 +38,15 @@ pub async fn namespace_runner_config_get_global( let client = client.clone(); async move { + let namespaces = ctx + .op(crate::ops::get_global::Input { + namespace_ids: runners + .iter() + .map(|(ns_id, _)| *ns_id) + .collect(), + }) + .await?; + let mut runner_names_by_namespace_id = HashMap::with_capacity(runners.len()); @@ -50,11 +59,14 @@ pub async fn namespace_runner_config_get_global( // TODO: Parallelize for (namespace_id, runner_names) in runner_names_by_namespace_id { - let url = leader_dc - .api_peer_url - .join(&format!("/namespaces/{namespace_id}/runner-configs"))?; + let namespace = namespaces + .iter() + .find(|n| n.namespace_id == namespace_id) + .context("namespace not found")?; + let url = leader_dc.api_peer_url.join("/runner-configs")?; let res = client .get(url) + .query(&[("namespace", &namespace.name)]) .query( &runner_names .iter() diff --git a/sdks/typescript/test-runner/Dockerfile b/sdks/typescript/test-runner/Dockerfile index 53880fa640..a01e0be7da 100644 --- a/sdks/typescript/test-runner/Dockerfile +++ b/sdks/typescript/test-runner/Dockerfile @@ -24,4 +24,4 @@ RUN pnpm build -F @rivetkit/engine-test-runner EXPOSE 5050 # Run the application -CMD ["node", "sdks/typescript/test-runner/dist/main.js"] \ No newline at end of file +CMD ["node", "sdks/typescript/test-runner/dist/index.js"] diff --git a/sdks/typescript/test-runner/package.json b/sdks/typescript/test-runner/package.json index bcc6cf71cc..53dd84332e 100644 --- a/sdks/typescript/test-runner/package.json +++ b/sdks/typescript/test-runner/package.json @@ -3,8 +3,8 @@ "version": "25.7.0", "type": "module", "scripts": { - "start": "tsx src/main.ts", - "build": "tsup src/main.ts", + "start": "tsx src/index.ts", + "build": "tsup src/index.ts", "check-types": "tsc --noEmit" }, "dependencies": { @@ -24,4 +24,4 @@ "typescript": "^5.3.3", "vitest": "^1.6.0" } -} +} \ No newline at end of file diff --git a/sdks/typescript/test-runner/src/main.ts b/sdks/typescript/test-runner/src/index.ts similarity index 89% rename from sdks/typescript/test-runner/src/main.ts rename to sdks/typescript/test-runner/src/index.ts index 4c1bbd1e2a..c5060ad602 100644 --- a/sdks/typescript/test-runner/src/main.ts +++ b/sdks/typescript/test-runner/src/index.ts @@ -10,6 +10,8 @@ const INTERNAL_SERVER_PORT = process.env.INTERNAL_SERVER_PORT ? Number(process.env.INTERNAL_SERVER_PORT) : 5051; const RIVET_NAMESPACE = process.env.RIVET_NAMESPACE ?? "default"; +const RIVET_RUNNER_NAME = + process.env.RIVET_RUNNER_NAME ?? "test-runner"; const RIVET_RUNNER_KEY = process.env.RIVET_RUNNER_KEY ?? `key-${Math.floor(Math.random() * 10000)}`; const RIVET_RUNNER_VERSION = process.env.RIVET_RUNNER_VERSION @@ -19,7 +21,8 @@ const RIVET_RUNNER_TOTAL_SLOTS = process.env.RIVET_RUNNER_TOTAL_SLOTS ? Number(process.env.RIVET_RUNNER_TOTAL_SLOTS) : 100; const RIVET_ENDPOINT = process.env.RIVET_ENDPOINT ?? "http://localhost:6420"; -const AUTOSTART = process.env.NO_AUTOSTART == undefined; +const AUTOSTART_SERVER = process.env.NO_AUTOSTART_SERVER == undefined; +const AUTOSTART_RUNNER = process.env.NO_AUTOSTART_RUNNER == undefined; let runnerStarted = Promise.withResolvers(); let runnerStopped = Promise.withResolvers(); @@ -62,13 +65,15 @@ app.get("/start", async (c) => { }); }); -serve({ - fetch: app.fetch, - port: INTERNAL_SERVER_PORT, -}); -console.log(`Internal HTTP server listening on port ${INTERNAL_SERVER_PORT}`); +if (AUTOSTART_SERVER) { + serve({ + fetch: app.fetch, + port: INTERNAL_SERVER_PORT, + }); + console.log(`Internal HTTP server listening on port ${INTERNAL_SERVER_PORT}`); +} -if (AUTOSTART) runner = await startRunner(); +if (AUTOSTART_RUNNER) runner = await startRunner(); async function startRunner(): Promise { console.log("Starting runner"); @@ -78,14 +83,14 @@ async function startRunner(): Promise { version: RIVET_RUNNER_VERSION, endpoint: RIVET_ENDPOINT, namespace: RIVET_NAMESPACE, - runnerName: "test-runner", + runnerName: RIVET_RUNNER_NAME, runnerKey: RIVET_RUNNER_KEY, totalSlots: RIVET_RUNNER_TOTAL_SLOTS, prepopulateActorNames: {}, onConnected: () => { runnerStarted.resolve(undefined); }, - onDisconnected: () => {}, + onDisconnected: () => { }, onShutdown: () => { runnerStopped.resolve(undefined); }, @@ -164,3 +169,5 @@ async function startRunner(): Promise { return runner; } + +export default app; diff --git a/sdks/typescript/test-runner/tsconfig.json b/sdks/typescript/test-runner/tsconfig.json index 8bea2bd456..1d27e9e961 100644 --- a/sdks/typescript/test-runner/tsconfig.json +++ b/sdks/typescript/test-runner/tsconfig.json @@ -3,7 +3,8 @@ "compilerOptions": { "paths": { "@/*": ["./src/*"] - } + }, + "lib": ["ESNext", "DOM"], }, "include": ["src/**/*", "tests/**/*", "benches/**/*"], "exclude": [