wrap all native calls with Aff in try catch (they can throw out of the onerror callback :|)

This commit is contained in:
KtorZ 2017-06-30 22:43:02 +02:00
parent a2bf21df62
commit 9c145f91c5
No known key found for this signature in database
GPG Key ID: 3F72E8BC2894C015
6 changed files with 106 additions and 54 deletions

View File

@ -44,9 +44,13 @@ exports._continuePrimaryKey = function _continuePrimaryKey(cursor, key, primaryK
exports._delete = function _delete(cursor) {
return function aff(success, error) {
const request = cursor.delete();
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
try {
const request = cursor.delete();
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};
@ -71,9 +75,13 @@ exports._source = function _source(IDBObjectStore, IDBIndex, cursor) {
exports._update = function _update(cursor, value) {
return function aff(success, error) {
const request = cursor.update(value);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
try {
const request = cursor.update(value);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};

View File

@ -99,10 +99,10 @@ exports._onVersionChange = function _onVersionChange(db, f) {
};
};
exports._transaction = function _transaction(show, db, stores, mode) {
exports._transaction = function _transaction(db, stores, mode) {
return function aff(success, error) {
try {
const transaction = db.transaction(stores, show(mode));
const transaction = db.transaction(stores, mode);
success(transaction);
} catch (e) {
error(new Error(e.name));

View File

@ -29,7 +29,7 @@ class IDBDatabase db where
close :: forall e. db -> Aff (idb :: IDB | e) Unit
createObjectStore :: forall e. db -> StoreName -> IDBObjectStoreParameters -> Aff (idb :: IDB | e) ObjectStore
deleteObjectStore :: forall e. db -> StoreName -> Aff (idb :: IDB | e) ObjectStore
transaction :: forall e. db -> KeyPath -> TransactionMode -> Aff (idb :: IDB | e) Transaction
transaction :: forall e. db -> Array StoreName -> TransactionMode -> Aff (idb :: IDB | e) Transaction
type StoreName = String
@ -91,7 +91,7 @@ instance idbDatabaseDatabase :: IDBDatabase Database where
Fn.runFn2 _deleteObjectStore db name'
transaction db stores mode' =
Fn.runFn4 _transaction show db stores mode'
Fn.runFn3 _transaction db stores (show mode')
--------------------
@ -124,7 +124,7 @@ foreign import _onError :: forall db e e'. Fn2 db (Error -> Eff ( | e') Unit) (A
foreign import _onVersionChange :: forall db e e'. Fn2 db ({ oldVersion :: Int, newVersion :: Int } -> Eff ( | e') Unit) (Aff (idb :: IDB | e) Unit)
foreign import _transaction :: forall db e. Fn4 (db -> String) db (Array String) TransactionMode (Aff (idb :: IDB | e) Transaction)
foreign import _transaction :: forall db e. Fn3 db (Array String) String (Aff (idb :: IDB | e) Transaction)
foreign import _version :: Database -> Int

View File

@ -17,13 +17,17 @@ const noOp2 = function noOp2() {
exports._deleteDatabase = function _deleteDatabase(name) {
return function aff(success, error) {
const request = indexedDB.deleteDatabase(name);
try {
const request = indexedDB.deleteDatabase(name);
request.onsuccess = function onSuccess(e) {
success(e.oldVersion);
};
request.onsuccess = function onSuccess(e) {
success(e.oldVersion);
};
request.onerror = errorHandler(error);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};
@ -31,19 +35,23 @@ exports._open = function _open(fromMaybe, name, mver, req) {
const ver = fromMaybe(undefined)(mver);
return function aff(success, error) {
const request = indexedDB.open(name, ver);
request.onsuccess = function onSuccess(e) {
success(e.target.result);
};
try {
const request = indexedDB.open(name, ver);
request.onsuccess = function onSuccess(e) {
success(e.target.result);
};
request.onblocked = function onBlocked() {
fromMaybe(noOp)(req.onBlocked)();
};
request.onblocked = function onBlocked() {
fromMaybe(noOp)(req.onBlocked)();
};
request.onupgradeneeded = function onUpgradeNeeded(e) {
fromMaybe(noOp2)(req.onUpgradeNeeded)(e.target.result)(e.target.transaction)();
};
request.onupgradeneeded = function onUpgradeNeeded(e) {
fromMaybe(noOp2)(req.onUpgradeNeeded)(e.target.result)(e.target.transaction)();
};
request.onerror = errorHandler(error);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};

View File

@ -55,9 +55,13 @@ exports._count = function _count(index, query) {
exports._get = function _get(index, range) {
return function aff(success, error) {
const request = index.get(range);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
try {
const request = index.get(range);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};
@ -78,32 +82,48 @@ exports._getAll = function _getAll(index, query, count) {
exports._getAllKeys = function _getAllKeys(index, range, count) {
return function aff(success, error) {
const request = index.getAllKeys(range, count || undefined);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
try {
const request = index.getAllKeys(range, count || undefined);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};
exports._getKey = function _getKey(index, range) {
return function aff(success, error) {
const request = index.getKey(range);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
try {
const request = index.getKey(range);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};
exports._openCursor = function _openCursor(index, query, dir) {
return function aff(success, error) {
const request = index.openCursor(query, dir);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
try {
const request = index.openCursor(query, dir);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};
exports._openKeyCursor = function _openKeyCursor(index, query, dir) {
return function aff(success, error) {
const request = index.openKeyCursor(query, dir);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
try {
const request = index.openKeyCursor(query, dir);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};

View File

@ -17,9 +17,13 @@ const toArray = function toArray(xs) {
exports._add = function _add(store, value, key) {
return function aff(success, error) {
const request = store.add(value, key || undefined);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
try {
const request = store.add(value, key || undefined);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};
@ -29,9 +33,13 @@ exports._autoIncrement = function _autoIncrement(store) {
exports._clear = function _clear(store) {
return function aff(success, error) {
const request = store.clear();
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
try {
const request = store.clear();
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};
@ -74,9 +82,13 @@ exports._deleteIndex = function _deleteIndex(store, name) {
exports._delete = function _delete(store, query) {
return function aff(success, error) {
const request = store.delete(query);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
try {
const request = store.delete(query);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};
@ -115,9 +127,13 @@ exports._name = function _name(store) {
exports._put = function _put(store, value, key) {
return function aff(success, error) {
const request = store.put(value, key || undefined);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
try {
const request = store.put(value, key || undefined);
request.onsuccess = successHandler(success);
request.onerror = errorHandler(error);
} catch (e) {
error(new Error(e.name));
}
};
};