bitburner-src/src/db.tsx

74 lines
2.2 KiB
TypeScript
Raw Normal View History

2021-09-21 22:49:38 +02:00
function getDB(): Promise<IDBObjectStore> {
return new Promise((resolve, reject) => {
if (!window.indexedDB) {
reject("Indexed DB does not exists");
}
/**
* DB is called bitburnerSave
* Object store is called savestring
* key for the Object store is called save
* Version `1` is important
*/
const indexedDbRequest: IDBOpenDBRequest = window.indexedDB.open("bitburnerSave", 1);
// This is called when there's no db to begin with. It's important, don't remove it.
indexedDbRequest.onupgradeneeded = function (this: IDBRequest<IDBDatabase>) {
const db = this.result;
db.createObjectStore("savestring");
};
indexedDbRequest.onerror = function (this: IDBRequest<IDBDatabase>, ev: Event) {
reject(`Failed to get IDB ${ev}`);
};
2021-09-25 07:26:03 +02:00
indexedDbRequest.onsuccess = function (this: IDBRequest<IDBDatabase>) {
2021-09-21 22:49:38 +02:00
const db = this.result;
if (!db) {
reject("database loading result was undefined");
2021-09-21 22:49:38 +02:00
return;
}
resolve(db.transaction(["savestring"], "readwrite").objectStore("savestring"));
};
});
}
export function load(): Promise<string> {
2021-11-12 05:28:08 +01:00
return new Promise((resolve, reject) => {
getDB()
2021-09-21 22:49:38 +02:00
.then((db) => {
return new Promise<string>((resolve, reject) => {
const request: IDBRequest<string> = db.get("save");
request.onerror = function (this: IDBRequest<string>, ev: Event) {
reject("Error in Database request to get savestring: " + ev);
};
request.onsuccess = function (this: IDBRequest<string>) {
resolve(this.result);
};
}).then((saveString) => resolve(saveString));
})
.catch((r) => reject(r));
});
}
export function save(saveString: string): Promise<void> {
return getDB().then((db) => {
return new Promise<void>((resolve, reject) => {
// We'll save to both localstorage and indexedDb
const request = db.put(saveString, "save");
request.onerror = function (e) {
reject("Error saving game to IndexedDB: " + e);
};
request.onsuccess = () => resolve();
});
});
}
export function deleteGame(): Promise<void> {
return getDB().then((db) => {
db.delete("save");
});
}