Skip to content

Commit a4dd922

Browse files
committed
chore: fix serverless in rivetkit-core
1 parent a19835c commit a4dd922

13 files changed

Lines changed: 122 additions & 104 deletions

File tree

Cargo.lock

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ members = [
6464
"rivetkit-rust/packages/inspector-protocol",
6565
"rivetkit-rust/packages/rivetkit",
6666
"rivetkit-rust/packages/rivetkit-core",
67+
"rivetkit-rust/packages/shared-types",
6768
"rivetkit-rust/packages/rivetkit-sqlite",
6869
"rivetkit-typescript/packages/rivetkit-napi"
6970
]
@@ -544,6 +545,9 @@ members = [
544545
[workspace.dependencies.rivetkit-core]
545546
path = "rivetkit-rust/packages/rivetkit-core"
546547

548+
[workspace.dependencies.rivetkit-shared-types]
549+
path = "rivetkit-rust/packages/shared-types"
550+
547551
[workspace.dependencies.epoxy-protocol]
548552
path = "engine/sdks/rust/epoxy-protocol"
549553

engine/packages/pegboard/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ rivet-runner-protocol.workspace = true
3333
rivet-runtime.workspace = true
3434
rivet-types.workspace = true
3535
rivet-util.workspace = true
36+
rivetkit-shared-types.workspace = true
3637
serde_bare.workspace = true
3738
serde_json.workspace = true
3839
serde.workspace = true

engine/packages/pegboard/src/ops/serverless_metadata/fetch.rs

Lines changed: 7 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use anyhow::Result;
55
use gas::prelude::*;
66
use reqwest::header::{HeaderMap as ReqwestHeaderMap, HeaderName, HeaderValue};
77
use rivet_envoy_protocol::PROTOCOL_VERSION;
8+
use rivetkit_shared_types::serverless_metadata::{ActorName, ServerlessMetadataPayload};
89
use serde::{Deserialize, Serialize};
910
use utoipa::ToSchema;
1011

@@ -25,8 +26,9 @@ pub enum ServerlessMetadataError {
2526
RequestFailed {},
2627
RequestTimedOut {},
2728
NonSuccessStatus { status_code: u16, body: String },
28-
InvalidResponseJson { body: String },
29+
InvalidResponseJson { body: String, parse_error: String },
2930
InvalidResponseSchema { runtime: String, version: String },
31+
InvalidEnvoyProtocolVersion { version: u16 },
3032
}
3133

3234
#[derive(Debug, Clone)]
@@ -45,33 +47,6 @@ pub struct ActorNameMetadata {
4547
pub metadata: serde_json::Map<String, serde_json::Value>,
4648
}
4749

48-
#[derive(Deserialize)]
49-
struct ServerlessMetadataEnvoy {
50-
version: Option<u32>,
51-
}
52-
53-
#[derive(Deserialize)]
54-
struct ServerlessMetadataRunner {
55-
version: Option<u32>,
56-
}
57-
58-
#[derive(Deserialize)]
59-
struct ServerlessMetadataPayload {
60-
runtime: String,
61-
version: String,
62-
#[serde(rename = "envoyProtocolVersion")]
63-
envoy_protocol_version: Option<u16>,
64-
#[serde(rename = "actorNames", default)]
65-
actor_names: HashMap<String, ActorName>,
66-
envoy: Option<ServerlessMetadataEnvoy>,
67-
runner: Option<ServerlessMetadataRunner>,
68-
}
69-
70-
#[derive(Deserialize)]
71-
struct ActorName {
72-
metadata: Option<serde_json::Value>,
73-
}
74-
7550
fn truncate_response_body(body: &str) -> String {
7651
let mut chars = body.chars();
7752
let mut truncated: String = chars.by_ref().take(RESPONSE_BODY_MAX_LEN).collect();
@@ -160,9 +135,10 @@ pub async fn pegboard_serverless_metadata_fetch(
160135

161136
let payload = match serde_json::from_str::<ServerlessMetadataPayload>(&body_raw) {
162137
Ok(p) => p,
163-
Err(_) => {
138+
Err(err) => {
164139
return Ok(Err(ServerlessMetadataError::InvalidResponseJson {
165140
body: body_for_user,
141+
parse_error: err.to_string(),
166142
}));
167143
}
168144
};
@@ -197,8 +173,8 @@ pub async fn pegboard_serverless_metadata_fetch(
197173

198174
if let Some(envoy_protocol_version) = envoy_protocol_version {
199175
if envoy_protocol_version < 1 || envoy_protocol_version > PROTOCOL_VERSION {
200-
return Ok(Err(ServerlessMetadataError::InvalidResponseJson {
201-
body: body_for_user,
176+
return Ok(Err(ServerlessMetadataError::InvalidEnvoyProtocolVersion {
177+
version: envoy_protocol_version,
202178
}));
203179
}
204180
}

examples/kitchen-sink/package.json

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/kitchen-sink/turbo.json

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rivetkit-rust/packages/rivetkit-core/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ rivet-pools.workspace = true
2323
rivet-util.workspace = true
2424
rivet-error.workspace = true
2525
rivet-envoy-client.workspace = true
26+
rivetkit-shared-types.workspace = true
2627
rivetkit-client-protocol.workspace = true
2728
rivetkit-inspector-protocol.workspace = true
2829
rivetkit-sqlite = { workspace = true, optional = true }

rivetkit-rust/packages/rivetkit-core/src/serverless.rs

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ use rivet_envoy_client::config::EnvoyConfig;
99
use rivet_envoy_client::envoy::start_envoy;
1010
use rivet_envoy_client::handle::EnvoyHandle;
1111
use rivet_envoy_client::protocol;
12+
use rivetkit_shared_types::serverless_metadata::{
13+
ActorName, ServerlessMetadataEnvoy, ServerlessMetadataPayload,
14+
};
1215
use serde::Serialize;
1316
use serde_json::json;
1417
use subtle::ConstantTimeEq;
@@ -308,22 +311,38 @@ impl CoreServerlessRuntime {
308311
],
309312
}),
310313
);
311-
(actor_name.clone(), json!({ "metadata": metadata }))
314+
(
315+
actor_name.clone(),
316+
ActorName {
317+
metadata: Some(serde_json::Value::Object(metadata)),
318+
},
319+
)
312320
})
313-
.collect::<serde_json::Map<_, _>>();
314-
315-
let mut response = json!({
316-
"runtime": "rivetkit",
317-
"version": self.settings.package_version,
318-
"envoy": {
319-
"kind": { "serverless": {} },
320-
"version": self.settings.version,
321-
},
322-
"envoyProtocolVersion": protocol::PROTOCOL_VERSION,
323-
"actorNames": actor_names,
324-
});
321+
.collect::<HashMap<_, _>>();
322+
323+
let payload = ServerlessMetadataPayload {
324+
runtime: "rivetkit".to_owned(),
325+
version: self.settings.package_version.clone(),
326+
envoy_protocol_version: Some(protocol::PROTOCOL_VERSION),
327+
actor_names,
328+
envoy: Some(ServerlessMetadataEnvoy {
329+
version: Some(self.settings.version),
330+
}),
331+
runner: None,
332+
};
333+
334+
let mut response = serde_json::to_value(payload).unwrap_or_else(|_| json!({}));
325335

326336
if let serde_json::Value::Object(object) = &mut response {
337+
if object.get("runner").is_some_and(serde_json::Value::is_null) {
338+
object.remove("runner");
339+
}
340+
if let Some(envoy) = object
341+
.get_mut("envoy")
342+
.and_then(|value| value.as_object_mut())
343+
{
344+
envoy.insert("kind".to_owned(), json!({ "serverless": {} }));
345+
}
327346
if let Some(client_endpoint) = &self.settings.client_endpoint {
328347
object.insert("clientEndpoint".to_owned(), json!(client_endpoint));
329348
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[package]
2+
name = "rivetkit-shared-types"
3+
version.workspace = true
4+
authors.workspace = true
5+
license.workspace = true
6+
edition.workspace = true
7+
workspace = "../../../"
8+
9+
[dependencies]
10+
serde.workspace = true
11+
serde_json.workspace = true
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub mod serverless_metadata;

0 commit comments

Comments
 (0)