@@ -9,19 +9,24 @@ pub mod error;
99pub mod metrics;
1010
1111#[ cfg( not( target_arch = "wasm32" ) ) ]
12- pub use server:: { handle_file, retrieve, retrieve_metadata, server_retrieve, server_store, store} ;
12+ pub use server:: {
13+ auctions_retrieve, auctions_store, handle_file, marketplace_retrieve, marketplace_store,
14+ retrieve, retrieve_metadata, store,
15+ } ;
1316
1417#[ cfg( not( target_arch = "wasm32" ) ) ]
1518mod server {
16- use crate :: constants:: get_marketplace_nostr_key;
19+ use crate :: constants:: { get_coordinator_nostr_key , get_marketplace_nostr_key} ;
1720
1821 use super :: * ;
1922
2023 use std:: {
2124 io:: { Error , ErrorKind } ,
2225 path:: PathBuf ,
26+ str:: FromStr ,
2327 } ;
2428
29+ use bitcoin_30:: secp256k1:: ecdh:: SharedSecret ;
2530 use tokio:: fs;
2631
2732 pub async fn store (
@@ -51,7 +56,7 @@ mod server {
5156 Ok ( ( ) )
5257 }
5358
54- pub async fn server_store (
59+ pub async fn marketplace_store (
5560 name : & str ,
5661 input : & [ u8 ] ,
5762 metadata : Option < Vec < u8 > > ,
@@ -78,6 +83,37 @@ mod server {
7883 Ok ( ( filepath, body) )
7984 }
8085
86+ pub async fn auctions_store (
87+ bundle_id : & str ,
88+ name : & str ,
89+ input : & [ u8 ] ,
90+ metadata : Option < Vec < u8 > > ,
91+ ) -> Result < ( PathBuf , Vec < u8 > ) , CarbonadoError > {
92+ let coordinator_key: String = get_coordinator_nostr_key ( ) . await ;
93+
94+ let level = 15 ;
95+ let sk = hex:: decode ( coordinator_key) ?;
96+ let secret_key = SecretKey :: from_slice ( & sk) ?;
97+ let public_key =
98+ PublicKey :: from_str ( bundle_id) . map_err ( |_| CarbonadoError :: WrongNostrPublicKey ) ?;
99+
100+ let share_sk = SharedSecret :: new ( & public_key, & secret_key) ;
101+ let pk = share_sk. secret_bytes ( ) ;
102+ let pk_hex = hex:: encode ( pk) ;
103+
104+ let mut meta: Option < [ u8 ; 8 ] > = default ! ( ) ;
105+ if let Some ( metadata) = metadata {
106+ let mut inner: [ u8 ; 8 ] = default ! ( ) ;
107+ inner[ ..metadata. len ( ) ] . copy_from_slice ( & metadata) ;
108+ meta = Some ( inner) ;
109+ }
110+
111+ let ( body, _encode_info) = carbonado:: file:: encode ( & sk, Some ( & pk) , input, level, meta) ?;
112+ let filepath = handle_file ( & pk_hex, name, body. len ( ) ) . await ?;
113+ fs:: write ( filepath. clone ( ) , body. clone ( ) ) . await ?;
114+ Ok ( ( filepath, body) )
115+ }
116+
81117 pub async fn retrieve (
82118 sk : & str ,
83119 name : & str ,
@@ -120,7 +156,9 @@ mod server {
120156 Ok ( ( Vec :: new ( ) , None ) )
121157 }
122158
123- pub async fn server_retrieve ( name : & str ) -> Result < ( Vec < u8 > , Option < Vec < u8 > > ) , CarbonadoError > {
159+ pub async fn marketplace_retrieve (
160+ name : & str ,
161+ ) -> Result < ( Vec < u8 > , Option < Vec < u8 > > ) , CarbonadoError > {
124162 let marketplace_key: String = get_marketplace_nostr_key ( ) . await ;
125163
126164 let sk = hex:: decode ( marketplace_key) ?;
@@ -144,6 +182,37 @@ mod server {
144182 Ok ( ( Vec :: new ( ) , None ) )
145183 }
146184
185+ pub async fn auctions_retrieve (
186+ bundle_id : & str ,
187+ name : & str ,
188+ ) -> Result < ( Vec < u8 > , Option < Vec < u8 > > ) , CarbonadoError > {
189+ let coordinator_key: String = get_coordinator_nostr_key ( ) . await ;
190+
191+ let sk = hex:: decode ( coordinator_key) ?;
192+ let secret_key = SecretKey :: from_slice ( & sk) ?;
193+ let public_key =
194+ PublicKey :: from_str ( bundle_id) . map_err ( |_| CarbonadoError :: WrongNostrPublicKey ) ?;
195+
196+ let share_sk = SharedSecret :: new ( & public_key, & secret_key) ;
197+ let pk = share_sk. secret_bytes ( ) ;
198+ let pk = hex:: encode ( pk) ;
199+
200+ let mut final_name = name. to_string ( ) ;
201+ let network = NETWORK . read ( ) . await . to_string ( ) ;
202+ let networks = [ "bitcoin" , "testnet" , "signet" , "regtest" ] ;
203+ if !networks. into_iter ( ) . any ( |x| name. contains ( x) ) {
204+ final_name = format ! ( "{network}-{name}" ) ;
205+ }
206+
207+ let filepath = handle_file ( & pk, & final_name, 0 ) . await ?;
208+ if let Ok ( bytes) = fs:: read ( filepath) . await {
209+ let ( header, decoded) = carbonado:: file:: decode ( & sk, & bytes) ?;
210+ return Ok ( ( decoded, header. metadata . map ( |m| m. to_vec ( ) ) ) ) ;
211+ }
212+
213+ Ok ( ( Vec :: new ( ) , None ) )
214+ }
215+
147216 pub async fn handle_file (
148217 pk : & str ,
149218 name : & str ,
@@ -210,7 +279,10 @@ mod server {
210279}
211280
212281#[ cfg( target_arch = "wasm32" ) ]
213- pub use client:: { retrieve, retrieve_metadata, server_retrieve, server_store, store} ;
282+ pub use client:: {
283+ auctions_retrieve, auctions_store, marketplace_retrieve, marketplace_store, retrieve,
284+ retrieve_metadata, store,
285+ } ;
214286
215287#[ cfg( target_arch = "wasm32" ) ]
216288mod client {
@@ -296,7 +368,7 @@ mod client {
296368 }
297369 }
298370
299- pub async fn server_store (
371+ pub async fn marketplace_store (
300372 name : & str ,
301373 input : & [ u8 ] ,
302374 _metadata : Option < Vec < u8 > > ,
@@ -328,6 +400,15 @@ mod client {
328400 }
329401 }
330402
403+ pub async fn auctions_store (
404+ _bundle_id : & str ,
405+ _name : & str ,
406+ _input : & [ u8 ] ,
407+ _metadata : Option < Vec < u8 > > ,
408+ ) -> Result < ( ) , CarbonadoError > {
409+ todo ! ( )
410+ }
411+
331412 pub async fn retrieve_metadata ( sk : & str , name : & str ) -> Result < FileMetadata , CarbonadoError > {
332413 let sk = hex:: decode ( sk) ?;
333414 let secret_key = SecretKey :: from_slice ( & sk) ?;
@@ -416,7 +497,9 @@ mod client {
416497 Ok ( ( Vec :: new ( ) , None ) )
417498 }
418499
419- pub async fn server_retrieve ( name : & str ) -> Result < ( Vec < u8 > , Option < Vec < u8 > > ) , CarbonadoError > {
500+ pub async fn marketplace_retrieve (
501+ name : & str ,
502+ ) -> Result < ( Vec < u8 > , Option < Vec < u8 > > ) , CarbonadoError > {
420503 let network = NETWORK . read ( ) . await . to_string ( ) ;
421504 let endpoints = CARBONADO_ENDPOINT . read ( ) . await . to_string ( ) ;
422505 let endpoints: Vec < & str > = endpoints. split ( ',' ) . collect ( ) ;
@@ -438,6 +521,13 @@ mod client {
438521 Ok ( ( encoded. to_vec ( ) , None ) )
439522 }
440523
524+ pub async fn auctions_retrieve (
525+ _bundle_id : & str ,
526+ _name : & str ,
527+ ) -> Result < ( Vec < u8 > , Option < Vec < u8 > > ) , CarbonadoError > {
528+ todo ! ( )
529+ }
530+
441531 async fn fetch_post ( url : String , body : Arc < Vec < u8 > > ) -> Result < JsValue , JsValue > {
442532 let array = Uint8Array :: new_with_length ( body. len ( ) as u32 ) ;
443533 array. copy_from ( & body) ;
0 commit comments