From 99e74a36bff212a9921053f3c178d289dfeee97b Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 4 May 2026 08:56:33 -0700 Subject: [PATCH] fix(rivetkit): preserve bridge error messages --- .../packages/rivetkit-napi/src/actor_context.rs | 2 ++ .../packages/rivetkit-napi/src/actor_factory.rs | 14 ++++++++------ .../rivetkit-napi/tests/actor_factory.rs | 1 + .../packages/rivetkit-wasm/src/lib.rs | 16 ++++++++++------ 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/rivetkit-typescript/packages/rivetkit-napi/src/actor_context.rs b/rivetkit-typescript/packages/rivetkit-napi/src/actor_context.rs index f994b08ce0..432bb0e50b 100644 --- a/rivetkit-typescript/packages/rivetkit-napi/src/actor_context.rs +++ b/rivetkit-typescript/packages/rivetkit-napi/src/actor_context.rs @@ -341,7 +341,9 @@ impl ActorContext { .verify(&self.inner, bearer_token.as_deref()) .await .map_err(|error| { + let message = error.to_string(); napi_anyhow_error(error.context(BridgeRivetErrorContext { + message: Some(message), public_: Some(true), status_code: Some(401), })) diff --git a/rivetkit-typescript/packages/rivetkit-napi/src/actor_factory.rs b/rivetkit-typescript/packages/rivetkit-napi/src/actor_factory.rs index 6738642062..df67d6044b 100644 --- a/rivetkit-typescript/packages/rivetkit-napi/src/actor_factory.rs +++ b/rivetkit-typescript/packages/rivetkit-napi/src/actor_factory.rs @@ -257,6 +257,7 @@ struct BridgeRivetErrorPayload { #[derive(Debug)] pub(crate) struct BridgeRivetErrorContext { + pub message: Option, pub public_: Option, pub status_code: Option, } @@ -267,11 +268,10 @@ static BRIDGE_RIVET_ERROR_SCHEMAS: LazyLock< impl std::fmt::Display for BridgeRivetErrorContext { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "bridge rivet error context public={:?} status_code={:?}", - self.public_, self.status_code - ) + match &self.message { + Some(message) => f.write_str(message), + None => f.write_str("bridged RivetError"), + } } } @@ -994,12 +994,14 @@ fn parse_bridge_rivet_error(reason: &str) -> Option { .metadata .as_ref() .and_then(|metadata| serde_json::value::to_raw_value(metadata).ok()); + let message = payload.message; let error = anyhow::Error::new(rivet_error::RivetError { schema, meta, - message: Some(payload.message), + message: Some(message.clone()), }); Some(error.context(BridgeRivetErrorContext { + message: Some(message), public_: payload.public_, status_code: payload.status_code, })) diff --git a/rivetkit-typescript/packages/rivetkit-napi/tests/actor_factory.rs b/rivetkit-typescript/packages/rivetkit-napi/tests/actor_factory.rs index 34ae3c37f2..013105a1e6 100644 --- a/rivetkit-typescript/packages/rivetkit-napi/tests/actor_factory.rs +++ b/rivetkit-typescript/packages/rivetkit-napi/tests/actor_factory.rs @@ -73,6 +73,7 @@ mod moved_tests { let first = parse_bridge_rivet_error(&reason).expect("first parse should succeed"); let second = parse_bridge_rivet_error(&reason).expect("second parse should succeed"); + assert_eq!(first.to_string(), "same message"); assert_eq!(schema_ptr(&first), schema_ptr(&second)); } diff --git a/rivetkit-typescript/packages/rivetkit-wasm/src/lib.rs b/rivetkit-typescript/packages/rivetkit-wasm/src/lib.rs index 68867fb2aa..0c845c17cb 100644 --- a/rivetkit-typescript/packages/rivetkit-wasm/src/lib.rs +++ b/rivetkit-typescript/packages/rivetkit-wasm/src/lib.rs @@ -71,17 +71,17 @@ struct BridgeRivetErrorPayload { #[derive(Debug)] struct BridgeRivetErrorContext { + message: Option, public_: Option, status_code: Option, } impl std::fmt::Display for BridgeRivetErrorContext { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "bridge rivet error context public={:?} status_code={:?}", - self.public_, self.status_code - ) + match &self.message { + Some(message) => f.write_str(message), + None => f.write_str("bridged RivetError"), + } } } @@ -2700,12 +2700,14 @@ fn parse_bridge_rivet_error(reason: &str) -> Option { .metadata .as_ref() .and_then(|metadata| serde_json::value::to_raw_value(metadata).ok()); + let message = payload.message; let error = anyhow::Error::new(RivetTransportError { schema, meta, - message: Some(payload.message), + message: Some(message.clone()), }); Some(error.context(BridgeRivetErrorContext { + message: Some(message), public_: payload.public_, status_code: payload.status_code, })) @@ -2872,6 +2874,8 @@ mod tests { let first = parse_bridge_rivet_error(&reason).expect("bridge error should decode"); let first_schema = transport_schema(&first) as *const RivetErrorSchema; + assert_eq!(first.to_string(), "same payload message"); + for _ in 0..100 { let error = parse_bridge_rivet_error(&reason).expect("bridge error should decode"); let schema = transport_schema(&error) as *const RivetErrorSchema;