Created
May 3, 2019 18:51
-
-
Save marianopaulin02/269b063d000f5fcd1971120fc0788821 to your computer and use it in GitHub Desktop.
IndexedDB handler for CRUD operations
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Minified: ~1Kb | |
Author: Mariano Paulin - marianopaulin.com | |
Description: IndexedDB(idb) javascript promise-based handler to perform simple CRUD operations with key-value data | |
Tested: Most recent versions of popular browsers, compatible with service workers | |
Reference: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB | |
Test, examples and docs: (at the bottom) | |
*/ | |
//SCRIPT | |
function idbAPI(dbname,version,upgradeFn){// IndexedDB API for CRUD operations: Create(put), Read(get), Update(update), and Delete(delete) | |
var idb = indexedDB || mozIndexedDB || webkitIndexedDB || msIndexedDB, | |
dbPromise = new Promise((resolve,reject)=>{ | |
var dbp = idb.open(dbname,version); | |
dbp.onupgradeneeded=(event)=>upgradeFn(dbp.result) | |
dbp.onsuccess = (event)=>resolve(dbp.result); | |
dbp.onerror = (event)=>reject(event.target); | |
}), | |
handleRequest = (request)=>{ | |
return new Promise((resolve,reject)=>{ | |
request.onerror = (event)=>{reject(event)}; | |
request.onsuccess = (event)=>{resolve(event.target.result)} | |
}) | |
}, | |
check=(data)=>{ | |
return new Promise((resolve,reject)=>{ | |
if(data instanceof Object && data.key!==undefined)return resolve(); | |
reject('<data> must be or contain an object like {key:string,..}') | |
}) | |
}, | |
validateInputData = (data)=>{ | |
if(data instanceof Array){ | |
return Promise.all(data.map((dt)=>{return check(dt)})) | |
} | |
return check(data) | |
}, | |
getDBPromise=()=>{ | |
return dbPromise | |
}, | |
isArray=(data)=>{ | |
return data instanceof Array; | |
}, | |
getObjectStore=(db,storeName,readwrite)=>{ | |
return db.transaction([storeName],(readwrite)?"readwrite":undefined).objectStore(storeName) | |
}, | |
/* METHODS */ | |
get = (storeName,key)=>{//get key or [keys] | |
return dbPromise.then(db=>{ | |
var objectStore = getObjectStore(db,storeName) | |
if(isArray(key)){//multiple get operations | |
return Promise.all(key.map((key)=>{return handleRequest(objectStore.get(key))})) | |
} | |
return handleRequest(objectStore.get(key)) | |
}) | |
}, | |
put = (storeName,data)=>{//write or replace the current value for a single or multiple keys | |
//if <data> is {key:string,..} | |
//if <data> is [{key:string,..},{key:string,..}] | |
return validateInputData(data) | |
.then(getDBPromise) | |
.then(db=>{ | |
var objectStore = getObjectStore(db,storeName,1) | |
if(isArray(data))return Promise.all(data.map((data)=>{return handleRequest(objectStore.put(data))})) | |
return handleRequest(objectStore.put(data)); | |
}) | |
}, | |
update = (storeName,data)=>{//update the current value for the key or add it | |
//<data> is {key:string,..} | |
return validateInputData(data) | |
.then(getDBPromise) | |
.then(db=>{ | |
var objectStore = getObjectStore(db,storeName,1); | |
handleRequest(objectStore.get(data.key)).then(dbdata=>{ | |
if(dbdata){//if already exists, merge properties | |
Object.assign(dbdata,data) | |
} | |
return handleRequest(objectStore.put(dbdata)); | |
}) | |
}) | |
}, | |
deletefn = (storeName,key)=>{//deletes the value of a given key or [keys] | |
//<key> is string | |
//<key> is [string,..] | |
return getDBPromise() | |
.then(db=>{ | |
var objectStore = getObjectStore(db,storeName,1) | |
if(key instanceof Array){//multiple get operations | |
return Promise.all(key.map((key)=>{return handleRequest(objectStore.delete(key))})) | |
} | |
return handleRequest(objectStore.delete(key)); | |
}) | |
}; | |
return { | |
promise:dbPromise, | |
get:get, | |
put:put, | |
update:update, | |
delete:deletefn | |
} | |
} | |
//USAGE AND TEST/////////////////// | |
function upgradeFn(db){// | |
if (!db.objectStoreNames.contains('myStore')) { | |
db.createObjectStore('myStore',{keyPath:"key"}) | |
} | |
} | |
var midb = new idbAPI('dataBaseName',1,upgradeFn) | |
midb.put('myStore',[{key:'key1',a:8},{key:'key2',a:9}])//put multiple | |
.then(()=>{ | |
console.log('multiple keys added (key1, key2)') | |
return midb.put('myStore',{key:'key3',a:10})//put simple | |
}) | |
.then((d)=>{ | |
console.log('single key added (key3)') | |
return midb.update('myStore',{key:'key3',a:11,b:true}) | |
}) | |
.then((d)=>{ | |
console.log('key3 updated') | |
return midb.get('myStore','key2')//get single key | |
}) | |
.then(res=>{ | |
console.log('key2 value:',res) | |
return midb.delete('myStore','key2')//delete single key | |
}) | |
.then(()=>{ | |
console.log('key2 was deleted') | |
return midb.get('myStore',['key1','key3'])//get multiple keys | |
}) | |
.then(res=>{ | |
console.log('multiget values (key1, key3)',res) | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment