UNPKG

fp-ts-indexeddb

Version:

Simple FP-TS based wrapper around indexedDB

93 lines 5.27 kB
"use strict"; 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