@dfinity/auth-client
Version:
JavaScript and TypeScript library to provide a simple integration with an IC Internet Identity
83 lines • 2.98 kB
JavaScript
import { openDB } from 'idb';
import { DB_VERSION, isBrowser, KEY_STORAGE_DELEGATION, KEY_STORAGE_KEY } from "./storage.js";
const AUTH_DB_NAME = 'auth-client-db';
const OBJECT_STORE_NAME = 'ic-keyval';
const _openDbStore = async (dbName = AUTH_DB_NAME, storeName = OBJECT_STORE_NAME, version) => {
// Clear legacy stored delegations
if (isBrowser && localStorage?.getItem(KEY_STORAGE_DELEGATION)) {
localStorage.removeItem(KEY_STORAGE_DELEGATION);
localStorage.removeItem(KEY_STORAGE_KEY);
}
return await openDB(dbName, version, {
upgrade: database => {
if (database.objectStoreNames.contains(storeName)) {
database.clear(storeName);
}
database.createObjectStore(storeName);
},
});
};
async function _getValue(db, storeName, key) {
return await db.get(storeName, key);
}
async function _setValue(db, storeName, key, value) {
return await db.put(storeName, value, key);
}
async function _removeValue(db, storeName, key) {
return await db.delete(storeName, key);
}
/**
* Simple Key Value store
* Defaults to `'auth-client-db'` with an object store of `'ic-keyval'`
*/
export class IdbKeyVal {
_db;
_storeName;
/**
* @param {DBCreateOptions} options - DBCreateOptions
* @param {DBCreateOptions['dbName']} options.dbName name for the indexeddb database
* @default
* @param {DBCreateOptions['storeName']} options.storeName name for the indexeddb Data Store
* @default
* @param {DBCreateOptions['version']} options.version version of the database. Increment to safely upgrade
*/
static async create(options) {
const { dbName = AUTH_DB_NAME, storeName = OBJECT_STORE_NAME, version = DB_VERSION, } = options ?? {};
const db = await _openDbStore(dbName, storeName, version);
return new IdbKeyVal(db, storeName);
}
// Do not use - instead prefer create
constructor(_db, _storeName) {
this._db = _db;
this._storeName = _storeName;
}
/**
* Basic setter
* @param {IDBValidKey} key string | number | Date | BufferSource | IDBValidKey[]
* @param value value to set
* @returns void
*/
async set(key, value) {
return await _setValue(this._db, this._storeName, key, value);
}
/**
* Basic getter
* Pass in a type T for type safety if you know the type the value will have if it is found
* @param {IDBValidKey} key string | number | Date | BufferSource | IDBValidKey[]
* @returns `Promise<T | null>`
* @example
* await get<string>('exampleKey') -> 'exampleValue'
*/
async get(key) {
return (await _getValue(this._db, this._storeName, key)) ?? null;
}
/**
* Remove a key
* @param key {@link IDBValidKey}
* @returns void
*/
async remove(key) {
return await _removeValue(this._db, this._storeName, key);
}
}
//# sourceMappingURL=db.js.map