fp-ts-indexeddb
Version:
Simple FP-TS based wrapper around indexedDB
93 lines • 5.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var E = require("fp-ts/lib/Either");
var O = require("fp-ts/lib/Option");
var R = require("fp-ts/lib/Record");
var TE = require("fp-ts/lib/TaskEither");
var t = require("io-ts");
var function_1 = require("fp-ts/lib/function");
var isError = function (u) { return typeof u === 'object' && u !== null && 'name' in u && 'message' in u; };
var isDOMException = function (u) { return typeof u === 'object' && u != null && 'code' in u && 'message' in u && 'name' in u; };
var handlePromiseError = function (u) { return isError(u) || isDOMException(u) ? u : new Error("Unhandled error: " + u); };
var getObjectStore = function (db, mode) { return function (storeName) {
return db.database.transaction(storeName, mode).objectStore(storeName);
}; };
var findStore = function (db, storeName) { return function_1.pipe(db.schema.stores, R.lookup(storeName)); };
var handleRequestError = function (req, fn) {
req.addEventListener('error', function () {
fn(this.error);
});
};
exports.open = function (dbName, schema) {
var initDb = function () { return new Promise(function (resolve, reject) {
// eslint-disable-next-line no-undef
var req = window.indexedDB.open(dbName, schema.version);
req.onupgradeneeded = function () { return function_1.pipe(schema.stores, R.mapWithIndex(function (storeName, v) {
req.result.objectStoreNames.contains(storeName) && req.result.deleteObjectStore(storeName);
req.result.createObjectStore(storeName, { keyPath: v.key });
})); };
req.onsuccess = function () { return resolve({ database: req.result, schema: schema }); };
handleRequestError(req, reject);
}); };
return TE.tryCatch(initDb, handlePromiseError);
};
exports.insert = function (db, storeName) { return function (v) {
return TE.tryCatch(function () { return new Promise(function (resolve, reject) {
function_1.pipe(findStore(db, storeName), O.fold(function () { return reject(new Error('Store not found')); }, function (store) {
var addRequest = getObjectStore(db, 'readwrite')(storeName).add(store.codec.encode(v));
addRequest.addEventListener('success', function () { return resolve(v); });
handleRequestError(addRequest, reject);
}));
}); }, handlePromiseError);
}; };
exports.put = function (db, storeName) { return function (v) {
return TE.tryCatch(function () { return new Promise(function (resolve, reject) {
function_1.pipe(findStore(db, storeName), O.fold(function () { return reject(new Error('Store not found')); }, function (store) {
var updateRequest = getObjectStore(db, 'readwrite')(storeName).put(store.codec.encode(v));
updateRequest.addEventListener('success', function () { return resolve(v); });
handleRequestError(updateRequest, reject);
}));
}); }, handlePromiseError);
}; };
exports.getAll = function (db, storeName) {
return TE.tryCatch(function () { return new Promise(function (resolve, reject) {
var objectStore = function_1.pipe(storeName, getObjectStore(db, 'readonly'));
var req = objectStore.getAll();
req.addEventListener('success', function () {
var _this = this;
function_1.pipe(findStore(db, storeName), O.fold(function () { return reject(new Error('Store not found')); }, function (s) {
function_1.pipe(t.array(s.codec).decode(_this.result), E.fold(reject, resolve));
}));
});
handleRequestError(req, reject);
}); }, handlePromiseError);
};
exports.get = function (db, storeName) { return function (v) {
return TE.tryCatch(function () { return new Promise(function (resolve, reject) {
var objectStore = function_1.pipe(storeName, getObjectStore(db, 'readonly'));
var getRequest = objectStore.get(v);
getRequest.addEventListener('success', function () {
var _this = this;
function_1.pipe(findStore(db, storeName), O.fold(function () { return reject(new Error('Store not found')); }, function (s) {
function_1.pipe(s.codec.decode(_this.result), E.fold(reject, resolve));
}));
});
handleRequestError(getRequest, reject);
}); }, handlePromiseError);
}; };
exports.remove = function (db, storeName) { return function (v) {
return TE.tryCatch(function () { return new Promise(function (resolve, reject) {
var removeRequest = getObjectStore(db, 'readwrite')(storeName).delete(v);
removeRequest.addEventListener('success', function () { return resolve(true); });
handleRequestError(removeRequest, reject);
}); }, handlePromiseError);
}; };
exports.clearStore = function (db, storeName) {
return TE.tryCatch(function () { return new Promise(function (resolve, reject) {
var clearRequest = getObjectStore(db, 'readwrite')(storeName).clear();
clearRequest.addEventListener('success', function () { return resolve(true); });
handleRequestError(clearRequest, reject);
}); }, handlePromiseError);
};
exports.close = function (db) { return db.database.close(); };
//# sourceMappingURL=database.js.map