pub const DEFAULT_COMPRESSION_LEVEL: u8 = 6;
pub const MAX_COMPRESSION_LEVEL: u8 = 9;
pub const BUNDLE_COMPRESSION_LEVEL: u8 = 1;
pub const WEBSERVER_ROW_ID: &str = "webserver";
pub const COMPRESSION_LEVEL_KEY: &str = "compressionLevel";
pub const FEATURE_ID: &str = "web_gzip_level";
pub const ENV_LEVEL: &str = "RDSH_WEB_GZIP_LEVEL";
pub fn clamp_level(level: i64) -> u8 {
if level < 0 {
0
} else if level > i64::from(MAX_COMPRESSION_LEVEL) {
MAX_COMPRESSION_LEVEL
} else {
level as u8
}
}
pub fn parse_level(raw: Option<&str>, fallback: u8) -> u8 {
match raw.map(str::trim) {
Some(s) if !s.is_empty() => match s.parse::<i64>() {
Ok(n) => clamp_level(n),
Err(_) => fallback,
},
_ => fallback,
}
}
pub fn is_worth_applying(target: u8) -> bool {
target > BUNDLE_COMPRESSION_LEVEL
}
pub fn rewrite_level_line(block: &str, level: u8) -> Option<String> {
let mut out: Vec<String> = Vec::new();
let mut replaced = false;
for line in block.lines() {
let indent_len = line.len() - line.trim_start().len();
let indent = &line[..indent_len];
let body = line.trim_start();
if body.starts_with('#') {
out.push(line.to_string());
continue;
}
let Some(rest) = body.strip_prefix(COMPRESSION_LEVEL_KEY) else {
out.push(line.to_string());
continue;
};
let Some(rest) = rest.strip_prefix(':') else {
out.push(line.to_string());
continue;
};
let comment = match rest.find('#') {
Some(at) => format!(" {}", &rest[at..]),
None => String::new(),
};
out.push(format!("{indent}{COMPRESSION_LEVEL_KEY}: {level}{comment}"));
replaced = true;
}
if !replaced {
return None;
}
let mut text = out.join("\n");
if block.ends_with('\n') {
text.push('\n');
}
Some(text)
}
pub fn split_entries(composed: &str) -> Vec<String> {
let mut out: Vec<String> = Vec::new();
for line in composed.lines() {
if line.starts_with("# ==") {
out.push(String::new());
continue;
}
if line.starts_with("- id: ") {
out.push(String::new());
}
if let Some(last) = out.last_mut() {
last.push_str(line);
last.push('\n');
}
}
out.retain(|b| b.starts_with("- id: "));
out
}
pub fn extract_webserver_entry(composed: &str) -> Option<String> {
let marker = format!("- id: {WEBSERVER_ROW_ID}\n");
split_entries(composed)
.into_iter()
.find(|block| block.starts_with(&marker))
}
pub fn config_block(entry: &str) -> Option<(String, String)> {
let mut body = String::new();
let mut config_indent: Option<String> = None;
let mut in_config = false;
for line in entry.lines() {
if !in_config {
let trimmed = line.trim_start();
if trimmed == "config:" {
let indent_len = line.len() - trimmed.len();
config_indent = Some(line[..indent_len].to_string());
in_config = true;
}
continue;
}
if line.trim().is_empty() {
body.push_str(line);
body.push('\n');
continue;
}
let Some(config_len) = config_indent.as_ref().map(String::len) else {
break;
};
let indent_len = line.len() - line.trim_start().len();
if indent_len <= config_len {
break;
}
body.push_str(line);
body.push('\n');
}
config_indent.map(|indent| (indent, body))
}
pub fn overlay_for(composed: &str, level: u8) -> Option<String> {
let entry = extract_webserver_entry(composed)?;
let (config_indent, body) = config_block(&entry)?;
let rewritten = rewrite_level_line(&body, level)?;
let mut out = String::new();
out.push_str(&format!("- id: {WEBSERVER_ROW_ID}\n"));
out.push_str(&format!("{config_indent}config:\n"));
out.push_str(&rewritten);
Some(out)
}
pub fn resolve_level(env: Option<&str>, configured: u8) -> u8 {
parse_level(env, clamp_level(i64::from(configured)))
}
#[cfg(test)]
mod tests {
use super::*;
const COMPOSED: &str = r#"- id: web-startup
name: '@deepseek-ai/dsh-web-app/startup'
- id: webserver
name: '@deepseek-ai/dsh-host-webserver'
inject:
- webStartup
config:
host: !!js ctx.webStartup.host ?? '127.0.0.1'
port: !!js ctx.webStartup.port ?? 3080
tls: !!js ctx.webStartup.tls
compression: gzip
compressionLevel: 1
compressionThresholdBytes: 1024
- id: web-runtime
name: '@deepseek-ai/dsh-web-app'
config:
openBrowser: !!js ctx.webStartup.openBrowser
"#;
#[test]
fn overlay_preserves_host_port_tls_and_compression() {
let overlay = overlay_for(COMPOSED, 6).expect("webserver row is present");
for kept in [
"host: !!js ctx.webStartup.host ?? '127.0.0.1'",
"port: !!js ctx.webStartup.port ?? 3080",
"tls: !!js ctx.webStartup.tls",
"compression: gzip",
"compressionThresholdBytes: 1024",
] {
assert!(
overlay.contains(kept),
"overlay dropped {kept:?}:\n{overlay}"
);
}
assert!(overlay.contains("compressionLevel: 6"), "{overlay}");
assert!(!overlay.contains("compressionLevel: 1"), "{overlay}");
}
#[test]
fn overlay_is_scoped_to_the_webserver_row() {
let overlay = overlay_for(COMPOSED, 6).unwrap();
assert!(overlay.starts_with("- id: webserver\n"));
assert!(!overlay.contains("web-runtime"), "{overlay}");
assert!(!overlay.contains("web-startup"), "{overlay}");
assert!(!overlay.contains("openBrowser"), "{overlay}");
assert_eq!(overlay.matches("- id: ").count(), 1);
}
#[test]
fn overlay_keeps_indentation_and_trailing_comment() {
let composed = r#"- id: webserver
config:
host: h
compressionLevel: 1 # bundle value
"#;
let overlay = overlay_for(composed, 9).unwrap();
assert!(
overlay.contains(" compressionLevel: 9 # bundle value"),
"{overlay}"
);
assert!(overlay.contains(" host: h\n"), "{overlay}");
}
#[test]
fn missing_webserver_row_yields_no_overlay() {
let composed = "- id: other\n config:\n compressionLevel: 1\n";
assert_eq!(overlay_for(composed, 6), None);
}
#[test]
fn missing_compression_level_yields_no_overlay() {
let composed = "- id: webserver\n config:\n host: h\n port: 3080\n";
assert_eq!(overlay_for(composed, 6), None);
}
#[test]
fn config_block_stops_at_the_next_key() {
let entry = "- id: webserver\n config:\n a: 1\n inject:\n - webStartup\n";
let (indent, body) = config_block(entry).unwrap();
assert_eq!(indent, " ");
assert_eq!(body, " a: 1\n");
}
#[test]
fn commented_key_is_not_rewritten() {
let block = " # compressionLevel: 1\n host: h\n";
assert_eq!(rewrite_level_line(block, 6), None);
}
#[test]
fn similar_prefix_key_is_not_rewritten() {
let block = " compressionLevelOverride: 1\n";
assert_eq!(rewrite_level_line(block, 6), None);
}
#[test]
fn every_matching_key_in_the_block_is_rewritten() {
let block = " compressionLevel: 1\n x: 2\n compressionLevel: 3\n";
let out = rewrite_level_line(block, 6).unwrap();
assert_eq!(
out,
" compressionLevel: 6\n x: 2\n compressionLevel: 6\n"
);
}
#[test]
fn clamp_pulls_into_the_schema_range() {
assert_eq!(clamp_level(-5), 0);
assert_eq!(clamp_level(0), 0);
assert_eq!(clamp_level(6), 6);
assert_eq!(clamp_level(9), 9);
assert_eq!(clamp_level(10), 9);
assert_eq!(clamp_level(i64::MAX), 9);
}
#[test]
fn parse_level_falls_back_on_junk_and_blank() {
assert_eq!(parse_level(None, 6), 6);
assert_eq!(parse_level(Some(""), 6), 6);
assert_eq!(parse_level(Some(" "), 6), 6);
assert_eq!(parse_level(Some("abc"), 6), 6);
assert_eq!(parse_level(Some("6.5"), 6), 6);
assert_eq!(parse_level(Some(" 6 "), 6), 6);
assert_eq!(parse_level(Some("9"), 6), 9);
assert_eq!(parse_level(Some("99"), 6), 9);
assert_eq!(parse_level(Some("-1"), 6), 0);
}
#[test]
fn env_overrides_the_configured_level() {
assert_eq!(resolve_level(Some("9"), 6), 9);
assert_eq!(resolve_level(Some("2"), 6), 2);
assert_eq!(resolve_level(None, 6), 6);
assert_eq!(resolve_level(None, 200), 9);
}
#[test]
fn applying_is_pointless_at_or_below_the_bundle_level() {
assert!(!is_worth_applying(0));
assert!(!is_worth_applying(BUNDLE_COMPRESSION_LEVEL));
assert!(is_worth_applying(6));
assert!(is_worth_applying(9));
}
#[test]
fn overlay_of_a_real_dump_round_trips_through_the_parser() {
let overlay = overlay_for(COMPOSED, DEFAULT_COMPRESSION_LEVEL).unwrap();
let entries = split_entries(&overlay);
assert_eq!(entries.len(), 1);
assert!(entries[0].starts_with("- id: webserver\n"));
let (_, body) = config_block(&entries[0]).unwrap();
let keys: Vec<&str> = body
.lines()
.filter_map(|l| l.trim_start().split(':').next())
.collect();
assert_eq!(
keys,
vec![
"host",
"port",
"tls",
"compression",
"compressionLevel",
"compressionThresholdBytes"
]
);
}
}