Comparing version 0.7.2 to 0.7.3
145
db64.js
const { isArray } = Array | ||
const connections = [] | ||
const connections = [] | ||
const openDB = (name = 'default', storeNames) => new Promise((resolve, reject) => { | ||
let db | ||
/* | ||
Creates a new database with given stores if the database and stores don't exist. | ||
- name string The databse name | ||
- storeNames array An array of store names | ||
- Return object The given database | ||
*/ | ||
const openDatabase = (name = 'default', storeNames) => new Promise((resolve, reject) => { | ||
let database | ||
try { | ||
db = window.indexedDB.open(name, 1) | ||
database = window.indexedDB.open(name, 1) | ||
} catch (e) { | ||
@@ -12,4 +19,10 @@ reject(e) | ||
db.onupgradeneeded = e => { | ||
const { result } = e.target | ||
/* | ||
db64 does not revolve around versioning. Therefore, this function will only run once | ||
for every new set of databases created. Each set of databases and stores can only be | ||
created once and cannot be modified. Therefore, all databases have a version of 1. | ||
*/ | ||
database.onupgradeneeded = ({ target }) => { | ||
const { result } = target | ||
storeNames.forEach(storeName => { | ||
@@ -23,15 +36,28 @@ if (!result.objectStoreNames.contains(storeName)) { | ||
db.onsuccess = e => { | ||
hasDBandStores = true | ||
connections.push(db) | ||
resolve(e.target.result) | ||
/* | ||
Connected databases are stored to be disconnected before deletion. | ||
*/ | ||
database.onsuccess = ({ target }) => { | ||
connections.push(database) | ||
resolve(target.result) | ||
} | ||
db.onerror = e => reject(e.target.result) | ||
return db | ||
database.onerror = ({ target }) => reject(target.result) | ||
return database | ||
}) | ||
const setData = async (db, storeName, key, dataValue, entries) => { | ||
/* | ||
Sets an entry by a given key/value pair or a dataset of entries. | ||
- database object Database object | ||
- storeName string Store name | ||
- key structured Key of entry | ||
- dataValue structured Value of entry | ||
- entries array | object Entries to set | ||
- Return object db64 object | ||
*/ | ||
const setData = async (database, storeName, key, dataValue, entries) => { | ||
try { | ||
const obStore = (db.transaction([storeName], 'readwrite')).objectStore(storeName) | ||
const obStore = (database.transaction([storeName], 'readwrite')).objectStore(storeName) | ||
@@ -52,5 +78,14 @@ if (entries) { | ||
const getData = async (db, storeName, key, entries) => { | ||
/* | ||
Gets an entry by a given key/value pair or a dataset of entries. | ||
- database object Database object | ||
- storeName string Store name | ||
- key structured Key of entry | ||
- entries array | object Entries to get | ||
- Return object A promise fulfilled with the queried data | ||
*/ | ||
const getData = async (database, storeName, key, entries) => { | ||
return new Promise((resolve) => { | ||
const objectStore = (db.transaction([storeName])).objectStore(storeName) | ||
const objectStore = (database.transaction([storeName])).objectStore(storeName) | ||
let dataRequest | ||
@@ -78,5 +113,13 @@ if (entries) { | ||
const deleteData = async (db, storeName, key) => { | ||
/* | ||
Deletes an entry for a given store by key. | ||
- database object Database object | ||
- storeName string Store name | ||
- key structured Key of entry | ||
- Return object db64 | ||
*/ | ||
const deleteData = async (database, storeName, key) => { | ||
try { | ||
const objectStore = (db.transaction([storeName], 'readwrite')).objectStore(storeName) | ||
const objectStore = (database.transaction([storeName], 'readwrite')).objectStore(storeName) | ||
const cursorRequest = objectStore.openCursor() | ||
@@ -98,5 +141,12 @@ | ||
const clearStore = (db, storeName) => { | ||
/* | ||
Empties a store. | ||
- database object Database object | ||
- storeName string Store name | ||
- Return object A promise fulfilled with the queried data | ||
*/ | ||
const clearStore = (database, storeName) => { | ||
return new Promise((resolve, reject) => { | ||
const objectStore = (db.transaction([storeName], 'readwrite')).objectStore(storeName) | ||
const objectStore = (database.transaction([storeName], 'readwrite')).objectStore(storeName) | ||
const objectStoreRequest = objectStore.clear() | ||
@@ -109,2 +159,8 @@ | ||
/* | ||
Deletes a given databse. | ||
- name string Database to delete | ||
- Return object A promise fulfilled with the queried data | ||
*/ | ||
const deleteDB = name => { | ||
@@ -116,8 +172,8 @@ return new Promise((resolve, reject) => { | ||
deleteRequest.onerror = e => reject(new Error(`Error deleting database: ${e.target.error}`)) | ||
deleteRequest.onerror = ({ target }) => reject(new Error(`Error deleting database: ${target.error}`)) | ||
deleteRequest.onblocked = e => { | ||
for (const db of connections) { | ||
if (db.result.name === name) { | ||
db.result.close() | ||
deleteRequest.onblocked = () => { | ||
for (const database of connections) { | ||
if (database.result.name === name) { | ||
database.result.close() | ||
} | ||
@@ -130,3 +186,5 @@ } | ||
let hasDBandStores = false | ||
/* | ||
The db64 object */ | ||
const db64 = { | ||
@@ -136,28 +194,35 @@ create: async (name, storeNames) => { | ||
await openDB(name, storeNames, hasDBandStores) | ||
await openDatabase(name, storeNames) | ||
return db64 | ||
}, | ||
use: (name, storeName) => { | ||
if (!hasDBandStores) return console.error('A database and store needs to be created first') | ||
const request = indexedDB.open(name, 1) | ||
request.onsuccess = (event) => { | ||
const db = event.target.result | ||
if (!db.objectStoreNames.contains(storeName)) { | ||
console.error(`Store ${storeName} does not exist`) | ||
} | ||
} | ||
return { | ||
set: async (key, value) => openDB(name, storeName) | ||
.then(db => setData(db, storeName, key, value)) | ||
set: async (key, value) => openDatabase(name, storeName) | ||
.then(database => setData(database, storeName, key, value)) | ||
.catch(console.error), | ||
setEntries: async (value) => openDB(name, storeName) | ||
.then(db => setData(db, storeName, null, value, 'entries')) | ||
setEntries: async (value) => openDatabase(name, storeName) | ||
.then(database => setData(database, storeName, null, value, 'entries')) | ||
.catch(console.error), | ||
get: async key => openDB(name, storeName) | ||
.then(db => getData(db, storeName, key)) | ||
get: async key => openDatabase(name, storeName) | ||
.then(database => getData(database, storeName, key)) | ||
.catch(console.error), | ||
getEntries: async (keys) => openDB(name, storeName) | ||
.then(db => getData(db, storeName, keys, 'entries')) | ||
getEntries: async (keys) => openDatabase(name, storeName) | ||
.then(database => getData(database, storeName, keys, 'entries')) | ||
.catch(console.error), | ||
delete: async (keys) => openDB(name, storeName) | ||
.then(db => deleteData(db, storeName, keys)) | ||
delete: async (keys) => openDatabase(name, storeName) | ||
.then(database => deleteData(database, storeName, keys)) | ||
.catch(console.error) | ||
} | ||
}, | ||
clear: async (name, storeName) => openDB(name, storeName) | ||
.then(db => clearStore(db, storeName)) | ||
clear: async (name, storeName) => openDatabase(name, storeName) | ||
.then(database => clearStore(database, storeName)) | ||
.catch(console.error), | ||
@@ -164,0 +229,0 @@ delete: async name => deleteDB(name) |
{ | ||
"name": "db64", | ||
"version": "0.7.2", | ||
"version": "0.7.3", | ||
"description": "A Practical IndexedDB API", | ||
@@ -5,0 +5,0 @@ "main": "db64.js", |
@@ -16,2 +16,3 @@ # db64 | ||
E.g. | ||
```javascript | ||
@@ -38,3 +39,2 @@ import db64 from './db64.js' | ||
### Why IndexedDB, why not localStorage? | ||
@@ -54,6 +54,14 @@ - Better performance | ||
Install db64 | ||
**Install** | ||
``` | ||
npm i db64 | ||
``` | ||
**Import** | ||
```javascript | ||
import db64 from 'db64.js' // ES (native) | ||
// or | ||
import db64 from 'db64' // ES | ||
// or | ||
const db64 = require('db64') // CommonJS | ||
``` | ||
@@ -60,0 +68,0 @@ **Create a database with stores** _(string, array)_ |
Sorry, the diff of this file is not supported yet
20504
401
147