Skip to content

Commit c29c106

Browse files
committed
chore: minimize alloc for wasm crate
1 parent 3a1b7af commit c29c106

File tree

7 files changed

+67
-55
lines changed

7 files changed

+67
-55
lines changed

Cargo.lock

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

crates/dwn-rs-core/src/events/emitter.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,34 @@ impl EventStreamer {
3939
}
4040

4141
#[instrument]
42-
pub async fn emit(&self, ns: String, evt: MessageEvent, indexes: MapValue) {
42+
pub async fn emit(&self, ns: &str, evt: MessageEvent, indexes: MapValue) {
4343
if let Some(addr) = &self.0 {
44-
let _ = addr.send(Emit { ns, evt, indexes }).await;
44+
let _ = addr
45+
.send(Emit {
46+
ns: ns.to_string(),
47+
evt,
48+
indexes,
49+
})
50+
.await;
4551
}
4652
}
4753

4854
#[instrument]
4955
pub async fn subscribe(
5056
&self,
51-
ns: String,
52-
id: String,
57+
ns: &str,
58+
id: &str,
5359
listener: EventChannel,
5460
) -> Result<Subscription, EventStreamError> {
5561
if let Some(addr) = &self.0 {
5662
trace!("subscribing to event stream");
57-
let sub = addr.send(Subscribe { ns, id, listener }).await?;
63+
let sub = addr
64+
.send(Subscribe {
65+
ns: ns.to_string(),
66+
id: id.to_string(),
67+
listener,
68+
})
69+
.await?;
5870
return Ok(sub);
5971
}
6072

crates/dwn-rs-core/src/events/subscription.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,13 @@ impl Handler<Event> for SubscriptionFn {
3838

3939
impl SubscriptionFn {
4040
pub fn new(
41-
id: String,
41+
id: &str,
4242
f: Box<dyn Fn(String, MessageEvent, MapValue) + Send + Sync + 'static>,
4343
) -> Self {
44-
Self { id, f }
44+
Self {
45+
id: id.to_string(),
46+
f,
47+
}
4548
}
4649

4750
#[cfg(target_arch = "wasm32")]

crates/dwn-rs-wasm/src/event_stream.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use alloc::{boxed::Box, string::String};
2+
13
use async_std::channel::unbounded;
24
use dwn_rs_core::{
35
emitter::EventStreamer, subscription::SubscriptionFn, MapValue,
@@ -44,21 +46,21 @@ impl EventStream {
4446
pub async fn emit(&self, tenant: &str, evt: &MessageEvent, indexes: IndexMap) {
4547
trace!("emitting event from wasm");
4648
let indextags = indexes.into();
47-
self.events.emit(tenant.into(), evt.into(), indextags).await;
49+
self.events.emit(tenant, evt.into(), indextags).await;
4850
}
4951

5052
#[wasm_bindgen]
5153
pub async fn subscribe(
5254
&self,
5355
tenant: &str,
54-
id: String,
56+
id: &str,
5557
listener: js_sys::Function,
5658
) -> Result<EventSubscription, JsError> {
5759
trace!("subscribing js function to event stream");
58-
let sub = subscription_for_func(id.clone(), listener).await?.run();
60+
let sub = subscription_for_func(id, listener).await?.run();
5961

6062
self.events
61-
.subscribe(tenant.into(), id, SubscriptionFn::channel(sub))
63+
.subscribe(tenant, id, SubscriptionFn::channel(sub))
6264
.await
6365
.map_err(JsError::from)
6466
.map(|s| s.try_into().expect_throw("unable to convert subscription"))
@@ -67,7 +69,7 @@ impl EventStream {
6769

6870
#[instrument]
6971
async fn subscription_for_func(
70-
id: String,
72+
id: &str,
7173
listener: js_sys::Function,
7274
) -> Result<SubscriptionFn, JsError> {
7375
trace!("creating subscription for js function");

crates/dwn-rs-wasm/src/events.rs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use alloc::boxed::Box;
2+
13
use dwn_rs_core::{MessageEvent as CoreMessageEvent, Subscription};
24
use futures_util::FutureExt;
35
use js_sys::{Object, Promise, Reflect};
@@ -19,19 +21,20 @@ extern "C" {
1921

2022
impl From<&MessageEvent> for CoreMessageEvent {
2123
fn from(value: &MessageEvent) -> Self {
22-
match serde_wasm_bindgen::from_value(value.into()) {
23-
Ok(m) => m,
24-
Err(e) => throw_str(&format!("unable to deserialize event: {:?}", e)),
24+
if value.is_undefined() {
25+
throw_str("MessageEvent is undefined");
2526
}
27+
28+
serde_wasm_bindgen::from_value(value.into()).expect_throw("unable to deserialize event")
2629
}
2730
}
2831

2932
impl From<CoreMessageEvent> for MessageEvent {
3033
fn from(value: CoreMessageEvent) -> Self {
31-
match value.serialize(&crate::ser::serializer()) {
32-
Ok(m) => m.into(),
33-
Err(e) => throw_str(&format!("unable to serialize event: {:?}", e)),
34-
}
34+
value
35+
.serialize(&crate::ser::serializer())
36+
.expect_throw("unable to serialize event")
37+
.into()
3538
}
3639
}
3740

@@ -47,10 +50,8 @@ impl TryFrom<Subscription> for EventSubscription {
4750
&Closure::once(Box::new(move || {
4851
wasm_bindgen_futures::future_to_promise((value.close)().map(
4952
|r| -> Result<JsValue, JsValue> {
50-
match r {
51-
Ok(_) => Ok(JsValue::UNDEFINED),
52-
Err(e) => throw_str(&format!("{:?}", e)),
53-
}
53+
r.expect_throw("unable to close subscription");
54+
Ok(JsValue::UNDEFINED)
5455
},
5556
))
5657
}) as Box<dyn Fn() -> Promise>)
@@ -61,8 +62,8 @@ impl TryFrom<Subscription> for EventSubscription {
6162
}
6263
}
6364

64-
impl std::fmt::Debug for MessageEvent {
65-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
65+
impl core::fmt::Debug for MessageEvent {
66+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
6667
f.debug_struct("MessageEvent").finish()
6768
}
6869
}

crates/dwn-rs-wasm/src/filter.rs

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use alloc::string::{String, ToString};
2-
use wasm_bindgen::{prelude::*, throw_str};
2+
use wasm_bindgen::prelude::*;
33

44
use dwn_rs_core::{
55
filters::{FilterKey, FilterSet, Filters, ValueFilter},
@@ -50,44 +50,42 @@ impl From<Filter> for Filters {
5050

5151
impl From<IndexMap> for (MapValue, MapValue) {
5252
fn from(value: IndexMap) -> Self {
53-
match serde_wasm_bindgen::from_value::<MapValue>(value.into()) {
54-
Ok(m) => m.into_iter().fold(
55-
(MapValue::new(), MapValue::new()),
56-
|(mut indexes, mut tags), (k, v)| {
57-
if let Some(tag) = k.strip_prefix("tag.") {
58-
tags.insert(tag.to_string(), v);
59-
} else {
60-
indexes.insert(k, v);
61-
}
53+
let m = serde_wasm_bindgen::from_value::<MapValue>(value.into())
54+
.expect_throw("unable to deserialize indexes");
6255

63-
(indexes, tags)
64-
},
65-
),
66-
Err(e) => throw_str(&format!("unable to deserialize indexes: {:?}", e)),
67-
}
56+
m.into_iter().fold(
57+
(MapValue::new(), MapValue::new()),
58+
|(mut indexes, mut tags), (k, v)| {
59+
if let Some(tag) = k.strip_prefix("tag.") {
60+
tags.insert(tag.to_string(), v);
61+
} else {
62+
indexes.insert(k, v);
63+
}
64+
65+
(indexes, tags)
66+
},
67+
)
6868
}
6969
}
7070

7171
impl From<IndexMap> for MapValue {
7272
fn from(value: IndexMap) -> Self {
73-
match serde_wasm_bindgen::from_value::<MapValue>(value.into()) {
74-
Ok(m) => m,
75-
Err(e) => throw_str(&format!("unable to deserialize indexes: {:?}", e)),
76-
}
73+
serde_wasm_bindgen::from_value::<MapValue>(value.into())
74+
.expect_throw("unable to deserialize indexes")
7775
}
7876
}
7977

8078
impl From<MapValue> for IndexMap {
8179
fn from(value: MapValue) -> Self {
82-
match value.serialize(&crate::ser::serializer()) {
83-
Ok(m) => m.into(),
84-
Err(e) => throw_str(&format!("unable to serialize indexes: {:?}", e)),
85-
}
80+
value
81+
.serialize(&crate::ser::serializer())
82+
.expect_throw("unable to serialize indexes")
83+
.into()
8684
}
8785
}
8886

89-
impl std::fmt::Debug for IndexMap {
90-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
87+
impl core::fmt::Debug for IndexMap {
88+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
9189
f.debug_struct("IndexMap").finish()
9290
}
9391
}

crates/dwn-rs-wasm/src/query.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,7 @@ impl From<JSMessageSort> for MessageSort {
8585
return MessageSort::default();
8686
}
8787

88-
match serde_wasm_bindgen::from_value(value.into()) {
89-
Ok(m) => m,
90-
Err(_) => MessageSort::default(),
91-
}
88+
serde_wasm_bindgen::from_value(value.into()).unwrap_or_default()
9289
}
9390
}
9491

0 commit comments

Comments
 (0)