mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 02:34:00 +00:00
102 lines
2.2 KiB
JavaScript
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();
|