Skip to content

Instantly share code, notes, and snippets.

@alshdavid
Created February 24, 2023 11:02
Show Gist options
  • Save alshdavid/aac825242308706c786f9243aee6f35b to your computer and use it in GitHub Desktop.
Save alshdavid/aac825242308706c786f9243aee6f35b to your computer and use it in GitHub Desktop.
LocalStorage API powered by Indexeddb
class LocalStorageAsync {
static DatabaseKey = 'LocalStorageAsync.DatabaseKey'
static DatabaseStoreKey = 'LocalStorageAsync.DatabaseStoreKey'
#hasLoaded
constructor() {
this.#hasLoaded = new Promise((resolve, reject) => {
let dRequest = indexedDB.deleteDatabase(LocalStorageAsync.DatabaseKey)
dRequest.onerror = function() {
reject(dRequest.error)
}
let request = indexedDB.open(LocalStorageAsync.DatabaseKey)
request.onupgradeneeded = function() {
request.result.createObjectStore(LocalStorageAsync.DatabaseStoreKey)
resolve()
}
request.onerror = function() {
reject(request.error)
}
})
}
async getItem(key) {
await this.#hasLoaded
return new Promise((resolve, reject) => {
let oRequest = indexedDB.open(LocalStorageAsync.DatabaseKey)
oRequest.onsuccess = function() {
let db = oRequest.result
let tx = db.transaction(LocalStorageAsync.DatabaseStoreKey, 'readonly')
let st = tx.objectStore(LocalStorageAsync.DatabaseStoreKey)
let gRequest = st.get(key)
gRequest.onsuccess = function() {
resolve(gRequest.result)
}
gRequest.onerror = function() {
reject(gRequest.error)
}
}
oRequest.onerror = function() {
reject(oRequest.error)
}
})
}
async setItem(key, value) {
await this.#hasLoaded
return new Promise((resolve, reject) => {
let oRequest = indexedDB.open(LocalStorageAsync.DatabaseKey)
oRequest.onsuccess = function() {
let db = oRequest.result
let tx = db.transaction(LocalStorageAsync.DatabaseStoreKey, 'readwrite')
let st = tx.objectStore(LocalStorageAsync.DatabaseStoreKey)
let sRequest = st.put(value, key)
sRequest.onsuccess = function() {
resolve()
}
sRequest.onerror = function() {
reject(sRequest.error)
}
}
oRequest.onerror = function() {
reject(oRequest.error)
}
})
}
async removeItem(key) {
await this.#hasLoaded
return new Promise((resolve, reject) => {
let oRequest = indexedDB.open(LocalStorageAsync.DatabaseKey)
oRequest.onsuccess = function() {
let db = oRequest.result
let tx = db.transaction(LocalStorageAsync.DatabaseStoreKey, 'readwrite')
let st = tx.objectStore(LocalStorageAsync.DatabaseStoreKey)
let rRequest = st.delete(key)
rRequest.onsuccess = function() {
resolve()
}
rRequest.onerror = function() {
reject(rRequest.error)
}
}
oRequest.onerror = function() {
reject(oRequest.error)
}
})
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment