Skip to content

indexedDB instead of localStorage for plugins #174

@modukon

Description

@modukon

I did some research and found out that there is another way to store data on the client side.
We don't want to use localStorage because it contains the private key, but what about indexedDB?

It takes much more code to use it but I tried to make a small code example for people to use:
The 2 functions can be used to load and save one object to the database, inside the object you can put whatever you want (i think). But there is of course a size limit on how much you can store in the DB. The indexedDBName should be different for each plugin.

var indexedDBName = "pluginNameDB";

function loadDataFromIndexedDB() {
	let resolve, reject; let promise = new Promise((res, rej) => { resolve=res; reject=rej; });
	const dbOpen = window.indexedDB.open(indexedDBName, 1);
	dbOpen.onupgradeneeded = (ev) => {
		const db = ev.target.result;
		const store = db.createObjectStore("ObjStore", { keyPath: "id", autoIncrement: true, });
		store.createIndex("Idx", "Idx", { unique: false });
	};
	dbOpen.onsuccess = (ev) => {
		const db = ev.target.result;
		const store = db.transaction("ObjStore", "readonly").objectStore("ObjStore");
		const query = store.get(1);
		query.onerror = (ev) => {
			console.error(indexedDBName+" indexedDB query error", ev.target.error.message);
			reject(ev.target.error.message);
		};
		query.onsuccess = (ev) => {
			db.close();
			if (query.result) {
				resolve(query.result.Idx);
			} else {
				resolve(null);
			}
		};
	};
	return promise;
}

function writeDataToIndexedDB(data) {
	let resolve, reject; let promise = new Promise((res, rej) => { resolve=res; reject=rej; });
	const dbOpen = window.indexedDB.open(indexedDBName, 1);
	dbOpen.onupgradeneeded = (ev) => {
		const db = ev.target.result;
		const store = db.createObjectStore("ObjStore", { keyPath: "id", autoIncrement: true, });
		store.createIndex("Idx", "Idx", { unique: false });
	};
	dbOpen.onsuccess = (ev) => {
		const db = ev.target.result;
		const transaction = db.transaction("ObjStore", "readwrite");
		const store = transaction.objectStore("ObjStore");
		store.put({ id: 1, Idx: data });
		transaction.onerror = (ev) => {
			console.error(indexedDBName+" indexedDB transaction error", ev.target.error.message);
			reject(ev.target.error.message);
		};
		transaction.oncomplete = (ev) => {
			db.close();
			resolve();
		};
	};
	return promise;
}

What do you think? Can this be used?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions