From 3a170321b729325af93281486d1c56a5aca3ecab Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 13 Apr 2026 01:22:27 -0700 Subject: [PATCH] fix(rivetkit): isolate engine envoys and propagate startup failures --- engine/sdks/rust/envoy-client/src/envoy.rs | 5 ++++- engine/sdks/rust/envoy-client/src/handle.rs | 11 ++++++++--- .../packages/rivetkit-native/src/envoy_handle.rs | 1 + .../rivetkit/src/drivers/engine/actor-driver.ts | 12 +++++++++--- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/engine/sdks/rust/envoy-client/src/envoy.rs b/engine/sdks/rust/envoy-client/src/envoy.rs index 1add31f76e..95659b6ea7 100644 --- a/engine/sdks/rust/envoy-client/src/envoy.rs +++ b/engine/sdks/rust/envoy-client/src/envoy.rs @@ -135,7 +135,10 @@ impl EnvoyContext { pub async fn start_envoy(config: EnvoyConfig) -> EnvoyHandle { let handle = start_envoy_sync(config); - handle.started().await; + handle + .started() + .await + .expect("envoy failed to start before returning handle"); handle } diff --git a/engine/sdks/rust/envoy-client/src/handle.rs b/engine/sdks/rust/envoy-client/src/handle.rs index 873fd4da90..1df6c37acc 100644 --- a/engine/sdks/rust/envoy-client/src/handle.rs +++ b/engine/sdks/rust/envoy-client/src/handle.rs @@ -33,8 +33,13 @@ impl EnvoyHandle { &self.shared.envoy_key } - pub async fn started(&self) { - let _ = self.started_rx.clone().changed().await; + pub async fn started(&self) -> anyhow::Result<()> { + self.started_rx + .clone() + .changed() + .await + .map_err(|_| anyhow::anyhow!("envoy stopped before startup completed"))?; + Ok(()) } pub fn sleep_actor(&self, actor_id: String, generation: Option) { @@ -310,7 +315,7 @@ impl EnvoyHandle { } // Wait for envoy to be started before injecting - self.started().await; + self.started().await?; tracing::debug!( data = crate::stringify::stringify_to_envoy(&message), diff --git a/rivetkit-typescript/packages/rivetkit-native/src/envoy_handle.rs b/rivetkit-typescript/packages/rivetkit-native/src/envoy_handle.rs index f296b4d0b1..c5159ab285 100644 --- a/rivetkit-typescript/packages/rivetkit-native/src/envoy_handle.rs +++ b/rivetkit-typescript/packages/rivetkit-native/src/envoy_handle.rs @@ -55,6 +55,7 @@ impl JsEnvoyHandle { self.runtime .spawn(async move { handle.started().await }) .await + .map_err(|e| napi::Error::from_reason(e.to_string()))? .map_err(|e| napi::Error::from_reason(e.to_string())) } diff --git a/rivetkit-typescript/packages/rivetkit/src/drivers/engine/actor-driver.ts b/rivetkit-typescript/packages/rivetkit/src/drivers/engine/actor-driver.ts index c093f4fdc9..b0170d2b29 100644 --- a/rivetkit-typescript/packages/rivetkit/src/drivers/engine/actor-driver.ts +++ b/rivetkit-typescript/packages/rivetkit/src/drivers/engine/actor-driver.ts @@ -186,6 +186,7 @@ export class EngineActorDriver implements ActorDriver { token: config.token, namespace: config.namespace, poolName: config.envoy.poolName, + notGlobal: true, metadata: { rivetkit: { version: VERSION }, }, @@ -212,9 +213,14 @@ export class EngineActorDriver implements ActorDriver { this.#envoy = envoy; - envoy.started().then(() => { - this.#envoyStarted.resolve(); - }); + envoy.started().then( + () => { + this.#envoyStarted.resolve(); + }, + (error) => { + this.#envoyStarted.reject(error); + }, + ); logger().debug({ msg: "envoy client started",