Skip to main content

fn0_deploy/
bundle.rs

1use anyhow::{Result, anyhow};
2use std::path::Path;
3
4pub fn read_env_yaml(project_dir: &Path) -> Result<Option<Vec<u8>>> {
5    let p = project_dir.join("env.yaml");
6    match std::fs::read(&p) {
7        Ok(content) => Ok(Some(content)),
8        Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(None),
9        Err(e) => Err(anyhow!("Failed to read {}: {}", p.display(), e)),
10    }
11}
12
13pub fn create_raw_bundle_wasm(
14    wasm_path: &Path,
15    env_yaml: Option<&[u8]>,
16    output_path: &Path,
17) -> Result<()> {
18    let file = std::fs::File::create(output_path)
19        .map_err(|e| anyhow!("Failed to create {}: {}", output_path.display(), e))?;
20    let mut builder = tar::Builder::new(file);
21    append_bytes(&mut builder, "manifest.json", br#"{"kind":"wasm"}"#)?;
22    let wasm_bytes = std::fs::read(wasm_path)
23        .map_err(|e| anyhow!("Failed to read {}: {}", wasm_path.display(), e))?;
24    append_bytes(&mut builder, "backend.wasm", &wasm_bytes)?;
25    if let Some(env) = env_yaml {
26        append_bytes(&mut builder, "env.yaml", env)?;
27    }
28    builder.finish()?;
29    Ok(())
30}
31
32pub fn create_raw_bundle_forte(
33    dist_dir: &Path,
34    env_yaml: Option<&[u8]>,
35    output_path: &Path,
36) -> Result<()> {
37    let file = std::fs::File::create(output_path)
38        .map_err(|e| anyhow!("Failed to create {}: {}", output_path.display(), e))?;
39    let mut builder = tar::Builder::new(file);
40    append_bytes(&mut builder, "manifest.json", br#"{"kind":"wasmjs"}"#)?;
41
42    let backend_wasm = dist_dir.join("backend.wasm");
43    let wasm_bytes = std::fs::read(&backend_wasm)
44        .map_err(|e| anyhow!("Failed to read {}: {}", backend_wasm.display(), e))?;
45    append_bytes(&mut builder, "backend.wasm", &wasm_bytes)?;
46
47    let server_js = dist_dir.join("server.js");
48    let server_bytes = std::fs::read(&server_js)
49        .map_err(|e| anyhow!("Failed to read {}: {}", server_js.display(), e))?;
50    append_bytes(&mut builder, "entry.js", &server_bytes)?;
51
52    if let Some(env) = env_yaml {
53        append_bytes(&mut builder, "env.yaml", env)?;
54    }
55
56    builder.finish()?;
57    Ok(())
58}
59
60fn append_bytes<W: std::io::Write>(
61    builder: &mut tar::Builder<W>,
62    path: &str,
63    data: &[u8],
64) -> Result<()> {
65    let mut header = tar::Header::new_gnu();
66    header.set_size(data.len() as u64);
67    header.set_mode(0o644);
68    header.set_cksum();
69    builder
70        .append_data(&mut header, path, data)
71        .map_err(|e| anyhow!("tar append failed for {}: {}", path, e))?;
72    Ok(())
73}