Files
CHOMPStation2/tgui/packages/common/storage.js
2025-02-15 05:32:35 +01:00

102 lines
2.2 KiB
JavaScript

/**
* Browser-agnostic abstraction of key-value web storage.
*
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
*/
export const IMPL_MEMORY = 0;
export const IMPL_HUB_STORAGE = 1;
export const IMPL_INDEXED_DB = 2;
const INDEXED_DB_VERSION = 1;
const INDEXED_DB_NAME = 'chomp'; // CHOMPEdit - CHOMPStation Localstore
const INDEXED_DB_STORE_NAME = 'storage-v1';
const READ_ONLY = 'readonly';
const READ_WRITE = 'readwrite';
const testGeneric = (testFn) => () => {
try {
return Boolean(testFn());
} catch {
return false;
}
};
const testHubStorage = testGeneric(
() => window.hubStorage && window.hubStorage.getItem,
);
class HubStorageBackend {
constructor() {
this.impl = IMPL_HUB_STORAGE;
}
async get(key) {
const value = await window.hubStorage.getItem('chomp-' + key); // CHOMPEdit
if (typeof value === 'string') {
return JSON.parse(value);
}
}
set(key, value) {
window.hubStorage.setItem('chomp-' + key, JSON.stringify(value)); // CHOMPEdit
}
remove(key) {
window.hubStorage.removeItem('chomp-' + key); // CHOMPEdit
}
clear() {
window.hubStorage.clear();
}
}
/**
* Web Storage Proxy object, which selects the best backend available
* depending on the environment.
*/
class StorageProxy {
constructor() {
this.backendPromise = (async () => {
if (!Byond.TRIDENT) {
if (!testHubStorage()) {
return new Promise((resolve) => {
const listener = () => {
document.removeEventListener('byondstorageupdated', listener);
resolve(new HubStorageBackend());
};
document.addEventListener('byondstorageupdated', listener);
});
}
return new HubStorageBackend();
}
})();
}
async get(key) {
const backend = await this.backendPromise;
return backend.get(key);
}
async set(key, value) {
const backend = await this.backendPromise;
return backend.set(key, value);
}
async remove(key) {
const backend = await this.backendPromise;
return backend.remove(key);
}
async clear() {
const backend = await this.backendPromise;
return backend.clear();
}
}
export const storage = new StorageProxy();