@@ -9,7 +9,7 @@ use std::io::Cursor;
99
1010use c2pa:: Builder ;
1111use js_sys:: { Error as JsError , JsString } ;
12- use serde:: Serialize ;
12+ use serde:: { Deserialize , Serialize } ;
1313use serde_wasm_bindgen:: Serializer ;
1414use wasm_bindgen:: prelude:: * ;
1515use web_sys:: Blob ;
@@ -27,6 +27,15 @@ pub struct WasmBuilder {
2727 serializer : Serializer ,
2828}
2929
30+ /// Holds the bytes of an asset and manifest.
31+ #[ derive( Deserialize , Serialize ) ]
32+ struct AssetAndManifestBytes {
33+ #[ serde( with = "serde_bytes" ) ]
34+ pub asset : Vec < u8 > ,
35+ #[ serde( with = "serde_bytes" ) ]
36+ pub manifest : Vec < u8 > ,
37+ }
38+
3039#[ wasm_bindgen]
3140impl WasmBuilder {
3241 /// Attempts to create a new `WasmBuilder` from a JSON ManifestDefinition string.
@@ -119,18 +128,55 @@ impl WasmBuilder {
119128 signer_definition : & SignerDefinition ,
120129 format : & str ,
121130 source : & Blob ,
131+ ) -> Result < Vec < u8 > , JsError > {
132+ let mut asset: Vec < u8 > = Vec :: new ( ) ;
133+
134+ self . sign_internal ( signer_definition, format, source, & mut asset)
135+ . await ?;
136+
137+ Ok ( asset)
138+ }
139+
140+ /// Sign an asset using the provided SignerDefinition, format, and source Blob.
141+ /// Use this method to get both the manifest bytes and the bytes of the signed asset.
142+ #[ wasm_bindgen( js_name = signAndGetManifestBytes) ]
143+ pub async fn sign_and_get_manifest_bytes (
144+ & mut self ,
145+ signer_definition : & SignerDefinition ,
146+ format : & str ,
147+ source : & Blob ,
148+ ) -> Result < JsValue , JsError > {
149+ let mut asset: Vec < u8 > = Vec :: new ( ) ;
150+
151+ let manifest = self
152+ . sign_internal ( signer_definition, format, source, & mut asset)
153+ . await ?;
154+
155+ let result = AssetAndManifestBytes { manifest, asset }
156+ . serialize ( & self . serializer )
157+ . map_err ( WasmError :: from) ?;
158+
159+ Ok ( result)
160+ }
161+
162+ async fn sign_internal (
163+ & mut self ,
164+ signer_definition : & SignerDefinition ,
165+ format : & str ,
166+ source : & Blob ,
167+ dest : & mut Vec < u8 > ,
122168 ) -> Result < Vec < u8 > , JsError > {
123169 let signer = WasmSigner :: from_definition ( & signer_definition) ?;
124170 let mut stream = BlobStream :: new ( source) ;
125171
126- let mut bytes: Vec < u8 > = Vec :: new ( ) ;
127- let mut cursor = Cursor :: new ( & mut bytes) ;
172+ let mut cursor = Cursor :: new ( dest) ;
128173
129- self . builder
174+ let manifest = self
175+ . builder
130176 . sign_async ( & signer, format, & mut stream, & mut cursor)
131177 . await
132- . unwrap ( ) ;
178+ . map_err ( WasmError :: from ) ? ;
133179
134- Ok ( bytes )
180+ Ok ( manifest )
135181 }
136182}
0 commit comments