@@ -9,6 +9,8 @@ use std::io::{Cursor, Read, Seek};
9
9
10
10
use c2pa:: { identity:: validator:: CawgValidator , Reader } ;
11
11
use js_sys:: { ArrayBuffer , Error as JsError , Uint8Array } ;
12
+ use serde:: Serialize ;
13
+ use serde_wasm_bindgen:: Serializer ;
12
14
use wasm_bindgen:: prelude:: * ;
13
15
use web_sys:: Blob ;
14
16
@@ -18,6 +20,7 @@ use crate::{error::WasmError, stream::BlobStream};
18
20
#[ wasm_bindgen]
19
21
pub struct WasmReader {
20
22
reader : Reader ,
23
+ serializer : Serializer ,
21
24
}
22
25
23
26
#[ wasm_bindgen]
@@ -33,17 +36,11 @@ impl WasmReader {
33
36
format : & str ,
34
37
stream : impl Read + Seek + Send ,
35
38
) -> Result < WasmReader , JsError > {
36
- let mut reader = Reader :: from_stream_async ( format, stream)
39
+ let reader = Reader :: from_stream_async ( format, stream)
37
40
. await
38
41
. map_err ( WasmError :: from) ?;
39
42
40
- // This will be removed once CawgValidation is rolled into the reader
41
- reader
42
- . post_validate_async ( & CawgValidator { } )
43
- . await
44
- . map_err ( WasmError :: other) ?;
45
-
46
- Ok ( WasmReader { reader } )
43
+ Ok ( WasmReader :: from_reader ( reader) . await ?)
47
44
}
48
45
49
46
/// Attempts to create a new `WasmReader` from an asset format, a `Blob` of the bytes of the initial segment, and a fragment `Blob`.
@@ -64,23 +61,23 @@ impl WasmReader {
64
61
init : impl Read + Seek + Send ,
65
62
fragment : impl Read + Seek + Send ,
66
63
) -> Result < WasmReader , JsError > {
67
- let mut reader = Reader :: from_fragment_async ( format, init, fragment)
64
+ let reader = Reader :: from_fragment_async ( format, init, fragment)
68
65
. await
69
66
. map_err ( WasmError :: other) ?;
70
67
68
+ Ok ( WasmReader :: from_reader ( reader) . await ?)
69
+ }
70
+
71
+ async fn from_reader ( mut reader : Reader ) -> Result < WasmReader , JsError > {
72
+ let serializer = Serializer :: new ( ) . serialize_maps_as_objects ( true ) ;
73
+
71
74
// This will be removed once CawgValidation is rolled into the reader
72
75
reader
73
76
. post_validate_async ( & CawgValidator { } )
74
77
. await
75
78
. map_err ( WasmError :: other) ?;
76
79
77
- Ok ( WasmReader { reader } )
78
- }
79
-
80
- /// Returns a JSON representation of the asset's manifest store.
81
- #[ wasm_bindgen]
82
- pub fn json ( & self ) -> String {
83
- self . reader . json ( )
80
+ Ok ( WasmReader { reader, serializer } )
84
81
}
85
82
86
83
/// Returns the label of the asset's active manifest.
@@ -89,6 +86,37 @@ impl WasmReader {
89
86
self . reader . active_label ( ) . map ( |val| val. to_owned ( ) )
90
87
}
91
88
89
+ /// Returns the asset's manifest store.
90
+ /// NOTE: at the moment, CAWG data is not decoded via this function. Use WasmReader::json() if CAWG is a requirement.
91
+ #[ wasm_bindgen( js_name = manifestStore) ]
92
+ pub fn manifest_store ( & self ) -> Result < JsValue , JsError > {
93
+ let manifest_store = self
94
+ . reader
95
+ . serialize ( & self . serializer )
96
+ . map_err ( WasmError :: from) ?;
97
+
98
+ Ok ( manifest_store)
99
+ }
100
+
101
+ /// Returns the asset's active manifest.
102
+ /// NOTE: at the moment, CAWG data is not decoded via this function. Use WasmReader::json() if CAWG is a requirement.
103
+ #[ wasm_bindgen( js_name = activeManifest) ]
104
+ pub fn active_manifest ( & self ) -> Result < JsValue , JsError > {
105
+ let active_manifest = self
106
+ . reader
107
+ . active_manifest ( )
108
+ . serialize ( & self . serializer )
109
+ . map_err ( WasmError :: from) ?;
110
+
111
+ Ok ( active_manifest)
112
+ }
113
+
114
+ /// Returns a JSON representation of the asset's manifest store.
115
+ #[ wasm_bindgen]
116
+ pub fn json ( & self ) -> String {
117
+ self . reader . json ( )
118
+ }
119
+
92
120
/// Accepts a URI reference to a binary object in the resource store and returns a `js_sys::ArrayBuffer` containing the resource's bytes.
93
121
#[ wasm_bindgen( js_name = resourceToBuffer) ]
94
122
pub fn resource_to_buffer ( & self , uri : & str ) -> Result < ArrayBuffer , JsError > {
0 commit comments