///|
let whitelist : Array[String] = ["PATH", "HOME", "TMPDIR"]
///|
/// Minimal instance environment: whitelisted vars from the daemon's own
/// environment plus the reserved app vars, encoded as a NUL-separated
/// "KEY=VALUE" blob with a trailing extra NUL for spawn. Reserved vars
/// are written last, so nothing can override them.
pub fn instance_env_blob(
app_name : String,
instance_id : Int,
port : Int,
) -> Bytes {
let reserved = [
("BM2_APP_NAME", app_name),
("BM2_INSTANCE_ID", instance_id.to_string()),
("BM2_APP_INSTANCE", instance_id.to_string()),
("BM2_APP_PORT", port.to_string()),
("NODE_ENV", "production"),
]
build_blob(reserved)
}
///|
/// Whitelisted environment only; used to launch helper processes.
pub fn base_env_blob() -> Bytes {
build_blob([])
}
///|
fn build_blob(reserved : Array[(String, String)]) -> Bytes {
let buf = StringBuilder()
let vars = @env.get_env_vars()
for name in whitelist {
match vars.get(name) {
Some(value) => write_entry(buf, name, value)
None => ()
}
}
for entry in reserved {
let (name, value) = entry
write_entry(buf, name, value)
}
buf.write_char('\u{0}')
@utf8.encode(buf.to_string())
}
///|
fn write_entry(buf : StringBuilder, name : String, value : String) -> Unit {
buf.write_string(name)
buf.write_char('=')
buf.write_string(value)
buf.write_char('\u{0}')
}