Skip to content

Commit 6961406

Browse files
committed
handle errors being returned from IndexedDB properly
1 parent 2e280bd commit 6961406

File tree

7 files changed

+213
-103
lines changed

7 files changed

+213
-103
lines changed

src/cursor.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,9 @@ pub struct Cursor<Err> {
133133

134134
impl<Err> Cursor<Err> {
135135
pub(crate) async fn from(req: IdbRequest) -> crate::Result<Cursor<Err>, Err> {
136-
let res = transaction_request(req.clone()).await?;
136+
let res = transaction_request(req.clone())
137+
.await
138+
.map_err(map_open_cursor_err)?;
137139
let is_already_over = res.is_null();
138140
let sys = (!is_already_over).then(|| {
139141
res.dyn_into::<IdbCursor>()
@@ -178,7 +180,11 @@ impl<Err> Cursor<Err> {
178180
return Err(crate::Error::CursorCompleted);
179181
};
180182
sys.advance(count).map_err(map_cursor_advance_err)?;
181-
if transaction_request(self.req.clone()).await?.is_null() {
183+
if transaction_request(self.req.clone())
184+
.await
185+
.map_err(map_cursor_advance_err)?
186+
.is_null()
187+
{
182188
self.sys = None;
183189
}
184190
Ok(())
@@ -193,7 +199,11 @@ impl<Err> Cursor<Err> {
193199
};
194200
sys.continue_with_key(key)
195201
.map_err(map_cursor_advance_until_err)?;
196-
if transaction_request(self.req.clone()).await?.is_null() {
202+
if transaction_request(self.req.clone())
203+
.await
204+
.map_err(map_cursor_advance_until_err)?
205+
.is_null()
206+
{
197207
self.sys = None;
198208
}
199209
Ok(())
@@ -219,7 +229,11 @@ impl<Err> Cursor<Err> {
219229
};
220230
sys.continue_primary_key(&index_key, primary_key)
221231
.map_err(map_cursor_advance_until_primary_key_err)?;
222-
if transaction_request(self.req.clone()).await?.is_null() {
232+
if transaction_request(self.req.clone())
233+
.await
234+
.map_err(map_cursor_advance_until_primary_key_err)?
235+
.is_null()
236+
{
223237
self.sys = None;
224238
}
225239
Ok(())
@@ -235,7 +249,9 @@ impl<Err> Cursor<Err> {
235249
return Err(crate::Error::CursorCompleted);
236250
};
237251
let req = sys.delete().map_err(map_cursor_delete_err)?;
238-
transaction_request(req).await?;
252+
transaction_request(req)
253+
.await
254+
.map_err(map_cursor_delete_err)?;
239255
Ok(())
240256
}
241257

@@ -249,7 +265,9 @@ impl<Err> Cursor<Err> {
249265
return Err(crate::Error::CursorCompleted);
250266
};
251267
let req = sys.update(value).map_err(map_cursor_update_err)?;
252-
transaction_request(req).await?;
268+
transaction_request(req)
269+
.await
270+
.map_err(map_cursor_update_err)?;
253271
Ok(())
254272
}
255273
}

src/error.rs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::utils::err_from_event;
12
use web_sys::{
23
wasm_bindgen::{JsCast, JsValue},
34
DomException,
@@ -104,19 +105,7 @@ impl<Err> Error<Err> {
104105
}
105106

106107
pub(crate) fn from_js_event(evt: web_sys::Event) -> Error<Err> {
107-
let idb_request = evt
108-
.target()
109-
.expect("Trying to parse indexed_db::Error from an event that has no target")
110-
.dyn_into::<web_sys::IdbRequest>()
111-
.expect(
112-
"Trying to parse indexed_db::Error from an event that is not from an IDBRequest",
113-
);
114-
Error::from_dom_exception(
115-
idb_request
116-
.error()
117-
.expect("Failed to retrieve the error from the IDBRequest that called on_error")
118-
.expect("IDBRequest::error did not return a DOMException"),
119-
)
108+
Error::from_dom_exception(err_from_event(evt))
120109
}
121110
}
122111

src/index.rs

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ impl<Err> Index<Err> {
3737
pub fn contains(&self, key: &JsValue) -> impl Future<Output = crate::Result<bool, Err>> {
3838
match self.sys.count_with_key(key) {
3939
Ok(count_req) => Either::Right(
40-
transaction_request(count_req).map(|res| res.map(map_count_res).map(|n| n != 0)),
40+
transaction_request(count_req)
41+
.map(|res| res.map_err(map_count_err).map(|n| map_count_res(n) != 0)),
4142
),
4243
Err(e) => Either::Left(std::future::ready(Err(map_count_err(e)))),
4344
}
@@ -55,9 +56,10 @@ impl<Err> Index<Err> {
5556
Err(e) => return Either::Left(std::future::ready(Err(e))),
5657
};
5758
match self.sys.count_with_key(&range) {
58-
Ok(count_req) => {
59-
Either::Right(transaction_request(count_req).map(|res| res.map(map_count_res)))
60-
}
59+
Ok(count_req) => Either::Right(
60+
transaction_request(count_req)
61+
.map(|res| res.map_err(map_count_err).map(map_count_res)),
62+
),
6163
Err(e) => Either::Left(std::future::ready(Err(map_count_err(e)))),
6264
}
6365
}
@@ -67,9 +69,10 @@ impl<Err> Index<Err> {
6769
/// Internally, this uses [`IDBIndex::get`](https://developer.mozilla.org/en-US/docs/Web/API/IDBIndex/get).
6870
pub fn get(&self, key: &JsValue) -> impl Future<Output = crate::Result<Option<JsValue>, Err>> {
6971
match self.sys.get(key) {
70-
Ok(get_req) => {
71-
Either::Right(transaction_request(get_req).map(|res| res.map(none_if_undefined)))
72-
}
72+
Ok(get_req) => Either::Right(
73+
transaction_request(get_req)
74+
.map(|res| res.map_err(map_get_err).map(none_if_undefined)),
75+
),
7376
Err(err) => Either::Left(std::future::ready(Err(map_get_err(err)))),
7477
}
7578
}
@@ -88,9 +91,10 @@ impl<Err> Index<Err> {
8891
Err(e) => return Either::Left(std::future::ready(Err(e))),
8992
};
9093
match self.sys.get(&range) {
91-
Ok(get_req) => {
92-
Either::Right(transaction_request(get_req).map(|res| res.map(none_if_undefined)))
93-
}
94+
Ok(get_req) => Either::Right(
95+
transaction_request(get_req)
96+
.map(|res| res.map_err(map_get_err).map(none_if_undefined)),
97+
),
9498
Err(e) => Either::Left(std::future::ready(Err(map_get_err(e)))),
9599
}
96100
}
@@ -109,9 +113,9 @@ impl<Err> Index<Err> {
109113
.get_all_with_key_and_limit(&JsValue::UNDEFINED, limit),
110114
};
111115
match get_req {
112-
Ok(get_req) => {
113-
Either::Right(transaction_request(get_req).map(|res| res.map(array_to_vec)))
114-
}
116+
Ok(get_req) => Either::Right(
117+
transaction_request(get_req).map(|res| res.map_err(map_get_err).map(array_to_vec)),
118+
),
115119
Err(err) => Either::Left(std::future::ready(Err(map_get_err(err)))),
116120
}
117121
}
@@ -134,9 +138,9 @@ impl<Err> Index<Err> {
134138
Some(limit) => self.sys.get_all_with_key_and_limit(&range, limit),
135139
};
136140
match get_req {
137-
Ok(get_req) => {
138-
Either::Right(transaction_request(get_req).map(|res| res.map(array_to_vec)))
139-
}
141+
Ok(get_req) => Either::Right(
142+
transaction_request(get_req).map(|res| res.map_err(map_get_err).map(array_to_vec)),
143+
),
140144
Err(err) => Either::Left(std::future::ready(Err(map_get_err(err)))),
141145
}
142146
}
@@ -153,9 +157,10 @@ impl<Err> Index<Err> {
153157
Err(e) => return Either::Left(std::future::ready(Err(e))),
154158
};
155159
match self.sys.get_key(&range) {
156-
Ok(get_req) => {
157-
Either::Right(transaction_request(get_req).map(|res| res.map(none_if_undefined)))
158-
}
160+
Ok(get_req) => Either::Right(
161+
transaction_request(get_req)
162+
.map(|res| res.map_err(map_get_err).map(none_if_undefined)),
163+
),
159164
Err(err) => Either::Left(std::future::ready(Err(map_get_err(err)))),
160165
}
161166
}
@@ -174,9 +179,9 @@ impl<Err> Index<Err> {
174179
.get_all_keys_with_key_and_limit(&JsValue::UNDEFINED, limit),
175180
};
176181
match get_req {
177-
Ok(get_req) => {
178-
Either::Right(transaction_request(get_req).map(|res| res.map(array_to_vec)))
179-
}
182+
Ok(get_req) => Either::Right(
183+
transaction_request(get_req).map(|res| res.map_err(map_get_err).map(array_to_vec)),
184+
),
180185
Err(err) => Either::Left(std::future::ready(Err(map_get_err(err)))),
181186
}
182187
}
@@ -199,9 +204,9 @@ impl<Err> Index<Err> {
199204
Some(limit) => self.sys.get_all_keys_with_key_and_limit(&range, limit),
200205
};
201206
match get_req {
202-
Ok(get_req) => {
203-
Either::Right(transaction_request(get_req).map(|res| res.map(array_to_vec)))
204-
}
207+
Ok(get_req) => Either::Right(
208+
transaction_request(get_req).map(|res| res.map_err(map_get_err).map(array_to_vec)),
209+
),
205210
Err(err) => Either::Left(std::future::ready(Err(map_get_err(err)))),
206211
}
207212
}

0 commit comments

Comments
 (0)