2
2
3
3
use std:: sync:: Arc ;
4
4
5
- use avail_light_core:: data;
5
+ use avail_light_core:: api:: configuration:: SharedConfig ;
6
+ use avail_light_core:: api:: types:: { PublishMessage , Request , Topic } ;
7
+ use avail_light_core:: api:: v2:: transactions:: Submitter ;
6
8
use avail_light_core:: light_client:: OutputEvent as LcEvent ;
7
9
use avail_light_core:: network:: { self , p2p, rpc, Network } ;
8
10
use avail_light_core:: shutdown:: Controller ;
9
11
use avail_light_core:: types:: { Delay , PeerAddress } ;
10
12
use avail_light_core:: utils:: spawn_in_span;
13
+ use avail_light_core:: { api, data} ;
11
14
use avail_rust:: kate_recovery:: couscous;
12
15
use clap:: ValueEnum ;
13
16
use libp2p:: Multiaddr ;
14
17
use std:: str:: FromStr ;
15
- use tokio:: sync:: { broadcast, mpsc} ;
18
+ use tokio:: sync:: {
19
+ broadcast,
20
+ mpsc:: { self , UnboundedSender } ,
21
+ } ;
16
22
use tokio_with_wasm:: alias as tokio;
17
23
use tracing:: { error, info, warn} ;
18
24
use wasm_bindgen:: prelude:: * ;
25
+ use web_sys:: js_sys;
19
26
use web_time:: Duration ;
20
27
21
28
#[ tokio:: main( flavor = "current_thread" ) ]
22
29
#[ wasm_bindgen( start) ]
23
30
async fn main_js ( ) { }
24
31
32
+ static mut SENDER : Option < UnboundedSender < String > > = None ;
33
+
34
+ #[ wasm_bindgen]
35
+ pub fn post_message ( message : String ) {
36
+ unsafe {
37
+ if let Some ( sender) = & SENDER {
38
+ sender. send ( message) . expect ( "TODO" ) ;
39
+ }
40
+ }
41
+ }
42
+
43
+ fn send_message_to_browser ( message : & str ) {
44
+ let worker_scope = js_sys:: global ( ) ;
45
+ worker_scope
46
+ . dyn_ref :: < web_sys:: DedicatedWorkerGlobalScope > ( )
47
+ . expect ( "Should be running in a Web Worker" )
48
+ . post_message ( & JsValue :: from_str ( message) )
49
+ . expect ( "Failed to post message" ) ;
50
+ }
51
+
25
52
#[ wasm_bindgen]
26
53
pub async fn run ( network_param : Option < String > , bootstrap_param : Option < String > ) {
27
54
console_error_panic_hook:: set_once ( ) ;
@@ -62,6 +89,7 @@ pub async fn run(network_param: Option<String>, bootstrap_param: Option<String>)
62
89
63
90
let genesis_hash = & network. genesis_hash ( ) . to_string ( ) ;
64
91
let ( rpc_event_sender, rpc_event_receiver) = broadcast:: channel ( 1000 ) ;
92
+ let mut publish_rpc_event_receiver = rpc_event_sender. subscribe ( ) ;
65
93
66
94
let ( rpc_client, rpc_subscriptions) = rpc:: init (
67
95
db. clone ( ) ,
@@ -75,7 +103,7 @@ pub async fn run(network_param: Option<String>, bootstrap_param: Option<String>)
75
103
76
104
let ( id_keys, _peer_id) = p2p:: identity ( & cfg_libp2p, db. clone ( ) ) . unwrap ( ) ;
77
105
78
- let ( p2p_client, p2p_event_loop , _p2p_event_receiver) = p2p:: init (
106
+ let ( p2p_client, _p2p_event_loop , _p2p_event_receiver) = p2p:: init (
79
107
cfg_libp2p. clone ( ) ,
80
108
Default :: default ( ) ,
81
109
id_keys,
@@ -103,7 +131,7 @@ pub async fn run(network_param: Option<String>, bootstrap_param: Option<String>)
103
131
) ) ) ;
104
132
105
133
let ( lc_sender, mut lc_receiver) = mpsc:: unbounded_channel :: < LcEvent > ( ) ;
106
- let ( block_tx, _block_rx ) =
134
+ let ( block_tx, mut block_rx ) =
107
135
broadcast:: channel :: < avail_light_core:: types:: BlockVerified > ( 1 << 7 ) ;
108
136
109
137
let channels = avail_light_core:: types:: ClientChannels {
@@ -131,7 +159,55 @@ pub async fn run(network_param: Option<String>, bootstrap_param: Option<String>)
131
159
lc_sender,
132
160
) ) ;
133
161
134
- tokio:: task:: spawn ( p2p_event_loop. run ( ) ) ;
162
+ let topic = Topic :: HeaderVerified ;
163
+ spawn_in_span ( shutdown. with_cancel ( async move {
164
+ loop {
165
+ let message = match publish_rpc_event_receiver. recv ( ) . await {
166
+ Ok ( value) => value,
167
+ Err ( error) => {
168
+ error ! ( ?topic, "Cannot receive message: {error}" ) ;
169
+ return ;
170
+ } ,
171
+ } ;
172
+ let message: Option < PublishMessage > = match message. try_into ( ) {
173
+ Ok ( Some ( message) ) => Some ( message) ,
174
+ Ok ( None ) => continue , // Silently skip
175
+ Err ( error) => {
176
+ error ! ( ?topic, "Cannot create message: {error}" ) ;
177
+ continue ;
178
+ } ,
179
+ } ;
180
+
181
+ let message = serde_json:: to_string ( & message) . unwrap ( ) ;
182
+ send_message_to_browser ( & message)
183
+ }
184
+ } ) ) ;
185
+
186
+ let topic = Topic :: ConfidenceAchieved ;
187
+ spawn_in_span ( shutdown. with_cancel ( async move {
188
+ loop {
189
+ let message = match block_rx. recv ( ) . await {
190
+ Ok ( value) => value,
191
+ Err ( error) => {
192
+ error ! ( ?topic, "Cannot receive message: {error}" ) ;
193
+ return ;
194
+ } ,
195
+ } ;
196
+ let message: Option < PublishMessage > = match message. try_into ( ) {
197
+ Ok ( Some ( message) ) => Some ( message) ,
198
+ Ok ( None ) => continue , // Silently skip
199
+ Err ( error) => {
200
+ error ! ( ?topic, "Cannot create message: {error}" ) ;
201
+ continue ;
202
+ } ,
203
+ } ;
204
+
205
+ let message = serde_json:: to_string ( & message) . unwrap ( ) ;
206
+ send_message_to_browser ( & message)
207
+ }
208
+ } ) ) ;
209
+
210
+ // tokio::task::spawn(_p2p_event_loop.run());
135
211
136
212
let bootstraps = cfg_libp2p. bootstraps . clone ( ) ;
137
213
let bootstrap_p2p_client = p2p_client. clone ( ) ;
@@ -151,6 +227,41 @@ pub async fn run(network_param: Option<String>, bootstrap_param: Option<String>)
151
227
}
152
228
} ) ) ;
153
229
230
+ let ( sender, mut receiver) = mpsc:: unbounded_channel :: < String > ( ) ;
231
+ unsafe {
232
+ SENDER = Some ( sender) ;
233
+ }
234
+
235
+ let config = SharedConfig :: default ( ) ;
236
+
237
+ spawn_in_span ( async move {
238
+ loop {
239
+ if let Some ( message) = receiver. recv ( ) . await {
240
+ info ! ( "Received message: {message}" ) ;
241
+ let request: Request = match serde_json:: from_str ( & message) {
242
+ Ok ( request) => request,
243
+ Err ( error) => {
244
+ error ! ( "Failed to parse request: {error}" ) ;
245
+ continue ;
246
+ } ,
247
+ } ;
248
+
249
+ let Ok ( response) = api:: v2:: messages:: handle_request (
250
+ request,
251
+ version,
252
+ & config,
253
+ None :: < Arc < Submitter < data:: DB > > > ,
254
+ db. clone ( ) ,
255
+ )
256
+ . await
257
+ else {
258
+ continue ;
259
+ } ;
260
+ send_message_to_browser ( & serde_json:: to_string ( & response) . unwrap ( ) ) ;
261
+ }
262
+ }
263
+ } ) ;
264
+
154
265
if let Err ( error) = light_client_handle. await {
155
266
error ! ( "Error running light client: {error}" )
156
267
} ;
0 commit comments