Implement base64 URI encoding/decoding for Pijul URIs

finchie
Jan 2, 2026, 3:50 AM
NEAR63OCPUGLXZ46YRBBY5DI5LCVH27XNGGZD7LCMUESHON54JFQC

Dependencies

  • [2] WFWTKCJN Create initial Visual Studio Code extension
  • [3] 72K45XKD Refactor inline credit to improve hover messages
  • [4] POA32CUW Add `uri` module
  • [5] 3RNQI5RX Refactor `provide_file_decoration` to return a `Promise` resolved by `event_loop`
  • [6] TWPZLEGD Return correct file contents for quick diff
  • [7] 6AUGQLIK Add basic panic handling

Change contents

  • edit in editors/vscode/src/vscode_sys/mod.rs at line 159
    [2.62114]
    [2.62114]
    ) -> Uri<'env>;
    "parse":
    parse(
    value: &str,
    strict: bool,
  • replacement in editors/vscode/src/uri.rs at line 1
    [4.152][4.153:195]()
    use iri_string::types::UriAbsoluteString;
    [4.152]
    [4.195]
    use base64::{Engine, engine::general_purpose::URL_SAFE};
    use iri_string::types::{UriAbsoluteStr, UriAbsoluteString};
  • edit in editors/vscode/src/uri.rs at line 11
    [4.514]
    [4.514]
    }
    pub fn to_vscode<'env>(
    env: &'env napi::Env,
    uri: &UriAbsoluteStr,
    ) -> Result<vscode_sys::Uri<'env>, napi::Error> {
    vscode_sys::Uri::parse(env, uri.as_str(), true)
    }
    pub fn encode(vscode_uri: &vscode_sys::Uri) -> Result<UriAbsoluteString, napi::Error> {
    let uri_to_encode = vscode_uri.to_string_skip_encoding(true)?;
    let encoded_path = format!("/{}", URL_SAFE.encode(uri_to_encode));
    let mut builder = iri_string::build::Builder::new();
    builder.scheme(crate::PIJUL_SCHEME);
    // TODO: support different hosts with different actions
    builder.host("tracked");
    builder.path(&encoded_path);
    builder.normalize();
    let built_uri = builder
    .build()
    .map_err(|error| napi::Error::from_reason(format!("Failed to build URI: {error}")))?;
    Ok(UriAbsoluteString::from(built_uri))
    }
    pub fn decode(vscode_uri: &vscode_sys::Uri) -> Result<UriAbsoluteString, napi::Error> {
    // Example: pijul:tracked/dnNjb2RlOmV4YW1wbGUvdXJp
    let pijul_uri = from_vscode(vscode_uri)?;
    // Example: dnNjb2RlOmV4YW1wbGUvdXJp
    let uri_to_decode = pijul_uri.path_str().strip_prefix('/').ok_or_else(|| {
    napi::Error::from_reason(format!("URI path did not contain `/`: {pijul_uri}"))
    })?;
    let decoded_bytes = URL_SAFE.decode(uri_to_decode).map_err(|error| {
    napi::Error::from_reason(format!("Failed to decode base64 bytes: {error}"))
    })?;
    // Example: vscode:example/uri
    let decoded_text = String::from_utf8(decoded_bytes).map_err(|error| {
    napi::Error::from_reason(format!("Failed to parse UTF-8 bytes: {error}"))
    })?;
    UriAbsoluteString::try_from(decoded_text)
    .map_err(|error| napi::Error::from_reason(format!("Failed to parse decoded URI: {error}")))
  • edit in editors/vscode/src/lib.rs at line 70
    [2.112031]
    [2.112031]
    #[tracing::instrument(skip_all)]
  • replacement in editors/vscode/src/lib.rs at line 73
    [2.112086][2.112086:112118]()
    pijul_uri: vscode_sys::Uri,
    [2.112086]
    [2.112118]
    encoded_uri: vscode_sys::Uri,
  • replacement in editors/vscode/src/lib.rs at line 78
    [2.112260][2.112260:112378]()
    let uri_change = vscode_sys::UriWithChange::new(env)?.scheme("file")?;
    let uri = pijul_uri.with(uri_change)?;
    [2.112260]
    [2.112378]
    // Example: pijul:tracked/dnNjb2RlOmV4YW1wbGUvdXJp -> vscode:example/uri
    let decoded_uri = uri::decode(&encoded_uri)?;
    let uri = uri::to_vscode(env, &decoded_uri)?;
  • replacement in editors/vscode/src/lib.rs at line 114
    [2.113410][2.113410:113442]()
    uri: vscode_sys::Uri<'env>,
    [2.113410]
    [2.113442]
    uri_to_encode: vscode_sys::Uri<'env>,
  • replacement in editors/vscode/src/lib.rs at line 117
    [2.113550][2.113550:113764]()
    // TODO: create a proper uri that preserves everything, including the original scheme
    let uri_change = vscode_sys::UriWithChange::new(env)?.scheme(PIJUL_SCHEME)?;
    let pijul_uri = uri.with(uri_change)?;
    [2.113550]
    [2.113764]
    // Encode the original URI as part of a Pijul URI
    // Example: vscode:example/uri -> pijul:tracked/dnNjb2RlOmV4YW1wbGUvdXJp
    let encoded_uri = uri::encode(&uri_to_encode)?;
    let vscode_uri = uri::to_vscode(env, &encoded_uri)?;
  • replacement in editors/vscode/src/lib.rs at line 122
    [2.113765][2.113765:113789]()
    Ok(Some(pijul_uri))
    [2.113765]
    [2.113789]
    // TODO: only return `Some()` when the uri exists in the repository
    Ok(Some(vscode_uri))
  • edit in editors/vscode/Cargo.toml at line 22
    [3.12127]
    [2.175821]
    base64.workspace = true
  • edit in Cargo.toml at line 26
    [3.12374]
    [2.176747]
    base64 = "0.22"
  • edit in Cargo.lock at line 2591
    [3.16586]
    [2.235734]
    "base64",