Skip to content

Instantly share code, notes, and snippets.

@marianopaulin02
Created May 3, 2019 18:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marianopaulin02/269b063d000f5fcd1971120fc0788821 to your computer and use it in GitHub Desktop.
Save marianopaulin02/269b063d000f5fcd1971120fc0788821 to your computer and use it in GitHub Desktop.
IndexedDB handler for CRUD operations
/*
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