From 11a221eb96d80e532e67ee2446ae375de6049e0a Mon Sep 17 00:00:00 2001 From: SilyNoMeta Date: Mon, 6 Jul 2026 13:05:28 +0200 Subject: [PATCH] feat: add WasmReader.fromBytes for non-browser C2PA verification Wrap the asset bytes in an in-memory Cursor and reuse the existing from_stream helper, so verification works without Blob/FileReaderSync on Node.js, Deno, Bun, and Cloudflare Workers (workerd). --- .changeset/add-wasm-reader-frombytes.md | 5 +++ packages/c2pa-wasm/src/wasm_reader.rs | 54 ++++++++++++++++++++++++ packages/c2pa-wasm/tests/fixtures/C.jpg | Bin 0 -> 132518 bytes 3 files changed, 59 insertions(+) create mode 100644 .changeset/add-wasm-reader-frombytes.md create mode 100644 packages/c2pa-wasm/tests/fixtures/C.jpg diff --git a/.changeset/add-wasm-reader-frombytes.md b/.changeset/add-wasm-reader-frombytes.md new file mode 100644 index 00000000..669baf8b --- /dev/null +++ b/.changeset/add-wasm-reader-frombytes.md @@ -0,0 +1,5 @@ +--- +"@contentauth/c2pa-wasm": minor +--- + +Add `WasmReader.fromBytes(format, bytes, settings?)`. Unlike `fromBlob`, this entry point reads the asset from an in-memory buffer and does not use any browser-only Web APIs (`Blob`, `FileReaderSync`), so C2PA verification can run in non-browser JavaScript runtimes such as Node.js, Deno, Bun, and Cloudflare Workers (workerd). diff --git a/packages/c2pa-wasm/src/wasm_reader.rs b/packages/c2pa-wasm/src/wasm_reader.rs index 8b22d95d..a51c49bc 100644 --- a/packages/c2pa-wasm/src/wasm_reader.rs +++ b/packages/c2pa-wasm/src/wasm_reader.rs @@ -66,6 +66,24 @@ impl WasmReader { Ok(WasmReader::from_reader(reader).await) } + /// Attempts to create a new `WasmReader` from an asset format and the asset's raw bytes. + /// + /// Unlike [`WasmReader::from_blob`], this entry point does not use any browser-only Web + /// APIs (`Blob`, `FileReaderSync`). The bytes are read from an in-memory [`Cursor`], which + /// implements [`Read`] + [`Seek`], so this can be called from non-browser JavaScript + /// runtimes such as Node.js, Deno, Bun, and Cloudflare Workers (workerd). + /// + /// Optionally accepts a context JSON string to configure the reader. + #[wasm_bindgen(js_name = fromBytes)] + pub async fn from_bytes( + format: &str, + bytes: Vec, + context_json: Option, + ) -> Result { + let stream = Cursor::new(bytes); + WasmReader::from_stream(format, stream, context_json).await + } + /// Attempts to create a new `WasmReader` from an asset format, a `Blob` of the bytes of the initial segment, and a fragment `Blob`. /// Optionally accepts a context JSON string to configure the reader. #[wasm_bindgen(js_name = fromBlobFragment)] @@ -164,3 +182,39 @@ impl WasmReader { Ok(cursor_to_u8array(stream)?) } } + +#[cfg(test)] +mod tests { + use wasm_bindgen_test::wasm_bindgen_test; + + use super::*; + + // A JPEG with a real embedded C2PA manifest (Adobe/CAI test asset). + const SIGNED_JPEG: &[u8] = include_bytes!("../tests/fixtures/C.jpg"); + + // `fromBytes` reads the asset from an in-memory buffer with no `Blob` / `FileReaderSync`, so + // verification works in non-browser runtimes (Node.js, Deno, Bun, Cloudflare Workers). The + // crate-wide `run_in_dedicated_worker` config (from the BlobStream tests) still governs the test + // harness itself; the runtime portability is exercised outside wasm-bindgen-test. + + #[wasm_bindgen_test] + async fn from_bytes_reads_active_manifest() { + let reader = WasmReader::from_bytes("image/jpeg", SIGNED_JPEG.to_vec(), None) + .await + .expect("fromBytes should read the embedded manifest"); + + assert!( + reader.active_label().is_some(), + "a signed asset should expose an active manifest" + ); + } + + #[wasm_bindgen_test] + async fn from_bytes_without_manifest_errors() { + // A minimal JPEG (SOI + EOI) with no C2PA data must be rejected, not silently accepted. + let empty_jpeg = vec![0xff, 0xd8, 0xff, 0xd9]; + let result = WasmReader::from_bytes("image/jpeg", empty_jpeg, None).await; + + assert!(result.is_err(), "an asset without C2PA data must error"); + } +} diff --git a/packages/c2pa-wasm/tests/fixtures/C.jpg b/packages/c2pa-wasm/tests/fixtures/C.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6579b3281fbd448163f77fe46bf8d24f3e5a018 GIT binary patch literal 132518 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