Skip to content

Commit a9b69cd

Browse files
committed
feat: Add remaining node types for wasm
1 parent 7705ece commit a9b69cd

File tree

13 files changed

+199
-169
lines changed

13 files changed

+199
-169
lines changed

Cargo.lock

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ prost-types = "0.13.3"
2727
#libp2p = { path = "../../rust-libp2p/libp2p" }
2828
#libp2p-core = { path = "../../rust-libp2p/core" }
2929
#libp2p-swarm = { path = "../../rust-libp2p/swarm" }
30+
#wasm-bindgen = { path = "../wasm-bindgen" }
3031

3132
# Uncomment this if you need debug symbols in release.
3233
# Also check node-wasm's `Cargo.toml`.

node-wasm/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ crate-type = ["cdylib", "rlib"]
2424

2525
[target.'cfg(target_arch = "wasm32")'.dependencies]
2626
blockstore.workspace = true
27-
celestia-types.workspace = true
27+
celestia-types = { workspace = true, features = ["wasm-bindgen"] }
2828
libp2p = { workspace = true, features = ["serde"] }
29-
lumina-node.workspace = true
29+
lumina-node = { workspace = true, features = ["wasm-bindgen"] }
3030
tendermint.workspace = true
3131

3232
anyhow = "1.0.86"
@@ -46,7 +46,7 @@ tokio = { version = "1.38.0", features = ["sync"] }
4646
tracing = "0.1.40"
4747
tracing-subscriber = { version = "0.3.18", features = ["time"] }
4848
tracing-web = "0.1.3"
49-
wasm-bindgen = "0.2.93"
49+
wasm-bindgen = "0.2.99"
5050
wasm-bindgen-futures = "0.4.43"
5151
web-sys = { version = "0.3.70", features = [
5252
"BroadcastChannel",

node-wasm/src/client.rs

Lines changed: 25 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ use std::time::Duration;
44

55
use js_sys::Array;
66
use serde::{Deserialize, Serialize};
7-
use serde_wasm_bindgen::to_value;
87
use tracing::{debug, error};
98
use wasm_bindgen::prelude::*;
109
use web_sys::BroadcastChannel;
1110

11+
use celestia_types::ExtendedHeader;
1212
use lumina_node::blockstore::IndexedDbBlockstore;
1313
use lumina_node::network;
1414
use lumina_node::node::NodeBuilder;
15-
use lumina_node::store::IndexedDbStore;
15+
use lumina_node::store::{IndexedDbStore, SamplingMetadata};
1616

1717
use crate::commands::{CheckableResponseExt, NodeCommand, SingleHeaderQuery};
1818
use crate::error::{Context, Result};
@@ -200,38 +200,32 @@ impl NodeClient {
200200
/// Returns a javascript object with given structure:
201201
/// https://docs.rs/celestia-types/latest/celestia_types/struct.ExtendedHeader.html
202202
#[wasm_bindgen(js_name = requestHeadHeader)]
203-
pub async fn request_head_header(&self) -> Result<JsValue> {
203+
pub async fn request_head_header(&self) -> Result<ExtendedHeader> {
204204
let command = NodeCommand::RequestHeader(SingleHeaderQuery::Head);
205205
let response = self.worker.exec(command).await?;
206-
let header = response.into_header().check_variant()?;
207-
208-
header.into()
206+
response.into_header().check_variant()?
209207
}
210208

211209
/// Request a header for the block with a given hash from the network.
212210
///
213211
/// Returns a javascript object with given structure:
214212
/// https://docs.rs/celestia-types/latest/celestia_types/struct.ExtendedHeader.html
215213
#[wasm_bindgen(js_name = requestHeaderByHash)]
216-
pub async fn request_header_by_hash(&self, hash: &str) -> Result<JsValue> {
214+
pub async fn request_header_by_hash(&self, hash: &str) -> Result<ExtendedHeader> {
217215
let command = NodeCommand::RequestHeader(SingleHeaderQuery::ByHash(hash.parse()?));
218216
let response = self.worker.exec(command).await?;
219-
let header = response.into_header().check_variant()?;
220-
221-
header.into()
217+
response.into_header().check_variant()?
222218
}
223219

224220
/// Request a header for the block with a given height from the network.
225221
///
226222
/// Returns a javascript object with given structure:
227223
/// https://docs.rs/celestia-types/latest/celestia_types/struct.ExtendedHeader.html
228224
#[wasm_bindgen(js_name = requestHeaderByHeight)]
229-
pub async fn request_header_by_height(&self, height: u64) -> Result<JsValue> {
225+
pub async fn request_header_by_height(&self, height: u64) -> Result<ExtendedHeader> {
230226
let command = NodeCommand::RequestHeader(SingleHeaderQuery::ByHeight(height));
231227
let response = self.worker.exec(command).await?;
232-
let header = response.into_header().check_variant()?;
233-
234-
header.into()
228+
response.into_header().check_variant()?
235229
}
236230

237231
/// Request headers in range (from, from + amount] from the network.
@@ -243,17 +237,12 @@ impl NodeClient {
243237
#[wasm_bindgen(js_name = requestVerifiedHeaders)]
244238
pub async fn request_verified_headers(
245239
&self,
246-
from_header: JsValue,
240+
from: ExtendedHeader,
247241
amount: u64,
248-
) -> Result<Array> {
249-
let command = NodeCommand::GetVerifiedHeaders {
250-
from: from_header,
251-
amount,
252-
};
242+
) -> Result<Vec<ExtendedHeader>> {
243+
let command = NodeCommand::GetVerifiedHeaders { from, amount };
253244
let response = self.worker.exec(command).await?;
254-
let headers = response.into_headers().check_variant()?;
255-
256-
headers.into()
245+
response.into_headers().check_variant()?
257246
}
258247

259248
/// Get current header syncing info.
@@ -271,51 +260,43 @@ impl NodeClient {
271260
/// Returns a javascript object with given structure:
272261
/// https://docs.rs/celestia-types/latest/celestia_types/struct.ExtendedHeader.html
273262
#[wasm_bindgen(js_name = getNetworkHeadHeader)]
274-
pub async fn get_network_head_header(&self) -> Result<JsValue> {
263+
pub async fn get_network_head_header(&self) -> Result<Option<ExtendedHeader>> {
275264
let command = NodeCommand::LastSeenNetworkHead;
276265
let response = self.worker.exec(command).await?;
277-
let header = response.into_last_seen_network_head().check_variant()?;
278-
279-
header.into()
266+
response.into_last_seen_network_head().check_variant()?
280267
}
281268

282269
/// Get the latest locally synced header.
283270
///
284271
/// Returns a javascript object with given structure:
285272
/// https://docs.rs/celestia-types/latest/celestia_types/struct.ExtendedHeader.html
286273
#[wasm_bindgen(js_name = getLocalHeadHeader)]
287-
pub async fn get_local_head_header(&self) -> Result<JsValue> {
274+
pub async fn get_local_head_header(&self) -> Result<ExtendedHeader> {
288275
let command = NodeCommand::GetHeader(SingleHeaderQuery::Head);
289276
let response = self.worker.exec(command).await?;
290-
let header = response.into_header().check_variant()?;
291-
292-
header.into()
277+
response.into_header().check_variant()?
293278
}
294279

295280
/// Get a synced header for the block with a given hash.
296281
///
297282
/// Returns a javascript object with given structure:
298283
/// https://docs.rs/celestia-types/latest/celestia_types/struct.ExtendedHeader.html
299284
#[wasm_bindgen(js_name = getHeaderByHash)]
300-
pub async fn get_header_by_hash(&self, hash: &str) -> Result<JsValue> {
285+
pub async fn get_header_by_hash(&self, hash: &str) -> Result<ExtendedHeader> {
301286
let command = NodeCommand::GetHeader(SingleHeaderQuery::ByHash(hash.parse()?));
302287
let response = self.worker.exec(command).await?;
303-
let header = response.into_header().check_variant()?;
304-
305-
header.into()
288+
response.into_header().check_variant()?
306289
}
307290

308291
/// Get a synced header for the block with a given height.
309292
///
310293
/// Returns a javascript object with given structure:
311294
/// https://docs.rs/celestia-types/latest/celestia_types/struct.ExtendedHeader.html
312295
#[wasm_bindgen(js_name = getHeaderByHeight)]
313-
pub async fn get_header_by_height(&self, height: u64) -> Result<JsValue> {
296+
pub async fn get_header_by_height(&self, height: u64) -> Result<ExtendedHeader> {
314297
let command = NodeCommand::GetHeader(SingleHeaderQuery::ByHeight(height));
315298
let response = self.worker.exec(command).await?;
316-
let header = response.into_header().check_variant()?;
317-
318-
header.into()
299+
response.into_header().check_variant()?
319300
}
320301

321302
/// Get synced headers from the given heights range.
@@ -335,28 +316,24 @@ impl NodeClient {
335316
&self,
336317
start_height: Option<u64>,
337318
end_height: Option<u64>,
338-
) -> Result<Array> {
319+
) -> Result<Vec<ExtendedHeader>> {
339320
let command = NodeCommand::GetHeadersRange {
340321
start_height,
341322
end_height,
342323
};
343324
let response = self.worker.exec(command).await?;
344-
let headers = response.into_headers().check_variant()?;
345-
346-
headers.into()
325+
response.into_headers().check_variant()?
347326
}
348327

349328
/// Get data sampling metadata of an already sampled height.
350329
///
351330
/// Returns a javascript object with given structure:
352331
/// https://docs.rs/lumina-node/latest/lumina_node/store/struct.SamplingMetadata.html
353332
#[wasm_bindgen(js_name = getSamplingMetadata)]
354-
pub async fn get_sampling_metadata(&self, height: u64) -> Result<JsValue> {
333+
pub async fn get_sampling_metadata(&self, height: u64) -> Result<Option<SamplingMetadata>> {
355334
let command = NodeCommand::GetSamplingMetadata { height };
356335
let response = self.worker.exec(command).await?;
357-
let metadata = response.into_sampling_metadata().check_variant()?;
358-
359-
Ok(to_value(&metadata?)?)
336+
response.into_sampling_metadata().check_variant()?
360337
}
361338

362339
/// Returns a [`BroadcastChannel`] for events generated by [`Node`].
@@ -438,7 +415,6 @@ mod tests {
438415
use gloo_timers::future::sleep;
439416
use libp2p::{multiaddr::Protocol, Multiaddr};
440417
use rexie::Rexie;
441-
use serde_wasm_bindgen::from_value;
442418
use wasm_bindgen_futures::spawn_local;
443419
use wasm_bindgen_test::wasm_bindgen_test;
444420
use web_sys::MessageChannel;
@@ -460,8 +436,7 @@ mod tests {
460436
assert_eq!(info.num_peers, 1);
461437

462438
let bridge_head_header = rpc_client.header_network_head().await.unwrap();
463-
let head_header: ExtendedHeader =
464-
from_value(client.request_head_header().await.unwrap()).unwrap();
439+
let head_header: ExtendedHeader = client.request_head_header().await.unwrap();
465440
assert_eq!(head_header, bridge_head_header);
466441
rpc_client
467442
.p2p_close_peer(&PeerId(

node-wasm/src/commands.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
use std::fmt::Debug;
22

33
use enum_as_inner::EnumAsInner;
4-
use js_sys::Array;
54
use libp2p::Multiaddr;
65
use libp2p::PeerId;
76
use serde::{Deserialize, Serialize};
87
use tracing::error;
9-
use wasm_bindgen::{JsError, JsValue};
8+
use wasm_bindgen::JsError;
109

11-
use celestia_types::hash::Hash;
10+
use celestia_types::{hash::Hash, ExtendedHeader};
1211
use lumina_node::node::{PeerTrackerInfo, SyncingInfo};
1312
use lumina_node::store::SamplingMetadata;
1413

1514
use crate::client::WasmNodeConfig;
1615
use crate::error::Error;
1716
use crate::error::Result;
18-
use crate::utils::JsResult;
1917
use crate::wrapper::libp2p::NetworkInfoSnapshot;
2018

19+
#[allow(clippy::large_enum_variant)]
2120
#[derive(Debug, Serialize, Deserialize)]
2221
pub(crate) enum NodeCommand {
2322
InternalPing,
@@ -40,8 +39,7 @@ pub(crate) enum NodeCommand {
4039
GetListeners,
4140
RequestHeader(SingleHeaderQuery),
4241
GetVerifiedHeaders {
43-
#[serde(with = "serde_wasm_bindgen::preserve")]
44-
from: JsValue,
42+
from: ExtendedHeader,
4543
amount: u64,
4644
},
4745
GetHeadersRange {
@@ -78,9 +76,9 @@ pub(crate) enum WorkerResponse {
7876
SetPeerTrust(Result<()>),
7977
Connected(Result<()>),
8078
Listeners(Result<Vec<Multiaddr>>),
81-
Header(JsResult<JsValue, Error>),
82-
Headers(JsResult<Array, Error>),
83-
LastSeenNetworkHead(JsResult<JsValue, Error>),
79+
Header(Result<ExtendedHeader, Error>),
80+
Headers(Result<Vec<ExtendedHeader>, Error>),
81+
LastSeenNetworkHead(Result<Option<ExtendedHeader>, Error>),
8482
SamplingMetadata(Result<Option<SamplingMetadata>>),
8583
}
8684

node-wasm/src/ports.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ impl From<MessagePort> for MessagePortLike {
3838
#[derive(Debug, Clone, Copy)]
3939
pub struct ClientId(usize);
4040

41+
#[allow(clippy::large_enum_variant)]
4142
pub(crate) enum ClientMessage {
4243
Command { id: ClientId, command: NodeCommand },
4344
AddConnection(JsValue),

0 commit comments

Comments
 (0)