@nlabs/arkhamjs-storage-browser
Version:
Browser storage for ArkhamJS
208 lines (207 loc) • 16.6 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var BrowserStorage_exports = {};
__export(BrowserStorage_exports, {
BrowserStorage: () => BrowserStorage
});
module.exports = __toCommonJS(BrowserStorage_exports);
class BrowserStorage {
constructor(options = {}) {
this.options = {
type: "session"
};
this.getStorageData = this.getStorageData.bind(this);
this.setStorageData = this.setStorageData.bind(this);
this.options = { ...this.options, ...options };
}
static {
this.window = window || {};
}
/**
* Removes a key from localStorage.
*
* @param {string} key Key associated with the data to remove.
* @returns {boolean} Whether data was successfully removed.
*/
static delLocalData(key) {
const localStorage = BrowserStorage.getLocalStorage();
if (localStorage) {
try {
localStorage.removeItem(key);
return true;
} catch (error) {
return false;
}
} else {
return false;
}
}
/**
* Removes a key from sessionStorage.
*
* @param {string} key Key associated with the data to remove.
* @returns {boolean} Whether data was successfully removed.
*/
static delSessionData(key) {
const sessionStorage = BrowserStorage.getSessionStorage();
if (sessionStorage) {
try {
sessionStorage.removeItem(key);
return true;
} catch (error) {
return false;
}
} else {
return false;
}
}
/**
* Get a key value from localStorage.
*
* @param {string} key The key for data.
* @returns {any} the data object associated with the key.
*/
static getLocalData(key) {
const localStorage = BrowserStorage.getLocalStorage();
if (localStorage) {
try {
const item = localStorage.getItem(key);
if (item) {
return JSON.parse(item);
}
return null;
} catch (error) {
return null;
}
} else {
return null;
}
}
/**
* Get localStorage from global window object.
*
* @param {string} key Key to store data.
* @param {any} value Data to store.
* @returns {any} window.localStorage.
*/
static getLocalStorage() {
const { localStorage } = BrowserStorage.window;
return localStorage;
}
/**
* Get a key value from sessionStorage.
*
* @param {string} key The key for data.
* @returns {any} the data object associated with the key.
*/
static getSessionData(key) {
const sessionStorage = BrowserStorage.getSessionStorage();
if (sessionStorage) {
try {
const item = sessionStorage.getItem(key);
if (item) {
return item ? JSON.parse(item) : null;
}
return null;
} catch (error) {
return null;
}
} else {
return null;
}
}
/**
* Get sessionStorage from global window object.
*
* @param {string} key Key to store data.
* @param {any} value Data to store.
* @returns {any} window.sessionStorage.
*/
static getSessionStorage() {
const { sessionStorage } = BrowserStorage.window;
return sessionStorage;
}
/**
* Saves data to localStorage.
*
* @param {string} key Key to store data.
* @param {any} value Data to store.
* @returns {boolean} Whether data was successfully saved.
*/
static setLocalData(key, value) {
const localStorage = BrowserStorage.getLocalStorage();
if (localStorage) {
try {
localStorage.setItem(key, JSON.stringify(value));
return true;
} catch (error) {
return false;
}
} else {
return false;
}
}
/**
* Saves data to sessionStorage.
*
* @param {string} key Key to store data.
* @param {any} value Data to store.
* @returns {boolean} Whether data was successfully saved.
*/
static setSessionData(key, value) {
const sessionStorage = BrowserStorage.getSessionStorage();
if (sessionStorage) {
try {
sessionStorage.setItem(key, JSON.stringify(value));
return true;
} catch (error) {
return false;
}
} else {
return false;
}
}
/**
* Get a key value from storage.
*
* @param {string} key The key for data.
* @returns {Promise<any>} the data object associated with the key.
*/
getStorageData(key) {
const { type } = this.options;
const results = type === "local" ? BrowserStorage.getLocalData(key) : BrowserStorage.getSessionData(key);
return Promise.resolve(results);
}
/**
* Saves data to storage.
*
* @param {string} key Key to store data.
* @param {any} value Data to store.
* @returns {Promise<boolean>} Whether data was successfully saved.
*/
setStorageData(key, value) {
const { type } = this.options;
const results = type === "local" ? BrowserStorage.setLocalData(key, value) : BrowserStorage.setSessionData(key, value);
return Promise.resolve(results);
}
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
BrowserStorage
});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0Jyb3dzZXJTdG9yYWdlL0Jyb3dzZXJTdG9yYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtCcm93c2VyU3RvcmFnZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzL21haW4nO1xuXG5leHBvcnQgY2xhc3MgQnJvd3NlclN0b3JhZ2Uge1xuICBzdGF0aWMgd2luZG93OiBhbnkgPSB3aW5kb3cgfHwge307XG4gIHByaXZhdGUgb3B0aW9uczogQnJvd3NlclN0b3JhZ2VPcHRpb25zID0ge1xuICAgIHR5cGU6ICdzZXNzaW9uJ1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEJyb3dzZXJTdG9yYWdlT3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gTWV0aG9kc1xuICAgIHRoaXMuZ2V0U3RvcmFnZURhdGEgPSB0aGlzLmdldFN0b3JhZ2VEYXRhLmJpbmQodGhpcyk7XG4gICAgdGhpcy5zZXRTdG9yYWdlRGF0YSA9IHRoaXMuc2V0U3RvcmFnZURhdGEuYmluZCh0aGlzKTtcblxuICAgIC8vIENvbmZpZ3VyYXRpb25cbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5vcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEga2V5IGZyb20gbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IEtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIHN0YXRpYyBkZWxMb2NhbERhdGEoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb2NhbFN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS5nZXRMb2NhbFN0b3JhZ2UoKTtcblxuICAgIGlmKGxvY2FsU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEga2V5IGZyb20gc2Vzc2lvblN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgKi9cbiAgc3RhdGljIGRlbFNlc3Npb25EYXRhKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Vzc2lvblN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS5nZXRTZXNzaW9uU3RvcmFnZSgpO1xuXG4gICAgaWYoc2Vzc2lvblN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBrZXkgdmFsdWUgZnJvbSBsb2NhbFN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBmb3IgZGF0YS5cbiAgICogQHJldHVybnMge2FueX0gdGhlIGRhdGEgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICAgKi9cbiAgc3RhdGljIGdldExvY2FsRGF0YShrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgbG9jYWxTdG9yYWdlID0gQnJvd3NlclN0b3JhZ2UuZ2V0TG9jYWxTdG9yYWdlKCk7XG5cbiAgICBpZihsb2NhbFN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgICAgIGlmKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsb2NhbFN0b3JhZ2UgZnJvbSBnbG9iYWwgd2luZG93IG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBLZXkgdG8gc3RvcmUgZGF0YS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIERhdGEgdG8gc3RvcmUuXG4gICAqIEByZXR1cm5zIHthbnl9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0TG9jYWxTdG9yYWdlKCk6IGFueSB7XG4gICAgY29uc3Qge2xvY2FsU3RvcmFnZX0gPSBCcm93c2VyU3RvcmFnZS53aW5kb3c7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBrZXkgdmFsdWUgZnJvbSBzZXNzaW9uU3RvcmFnZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IGZvciBkYXRhLlxuICAgKiBAcmV0dXJucyB7YW55fSB0aGUgZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2Vzc2lvbkRhdGEoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IHNlc3Npb25TdG9yYWdlID0gQnJvd3NlclN0b3JhZ2UuZ2V0U2Vzc2lvblN0b3JhZ2UoKTtcblxuICAgIGlmKHNlc3Npb25TdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpdGVtID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgICAgIGlmKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gaXRlbSA/IEpTT04ucGFyc2UoaXRlbSkgOiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlc3Npb25TdG9yYWdlIGZyb20gZ2xvYmFsIHdpbmRvdyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IHRvIHN0b3JlIGRhdGEuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBEYXRhIHRvIHN0b3JlLlxuICAgKiBAcmV0dXJucyB7YW55fSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2Vzc2lvblN0b3JhZ2UoKTogYW55IHtcbiAgICBjb25zdCB7c2Vzc2lvblN0b3JhZ2V9ID0gQnJvd3NlclN0b3JhZ2Uud2luZG93O1xuXG4gICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGRhdGEgdG8gbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IEtleSB0byBzdG9yZSBkYXRhLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgRGF0YSB0byBzdG9yZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVkLlxuICAgKi9cbiAgc3RhdGljIHNldExvY2FsRGF0YShrZXk6IHN0cmluZywgdmFsdWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb2NhbFN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS5nZXRMb2NhbFN0b3JhZ2UoKTtcblxuICAgIGlmKGxvY2FsU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGRhdGEgdG8gc2Vzc2lvblN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IHRvIHN0b3JlIGRhdGEuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBEYXRhIHRvIHN0b3JlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgc2F2ZWQuXG4gICAqL1xuICBzdGF0aWMgc2V0U2Vzc2lvbkRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Vzc2lvblN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS5nZXRTZXNzaW9uU3RvcmFnZSgpO1xuXG4gICAgaWYoc2Vzc2lvblN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGtleSB2YWx1ZSBmcm9tIHN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBmb3IgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gdGhlIGRhdGEgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICAgKi9cbiAgZ2V0U3RvcmFnZURhdGEoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHt0eXBlfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCByZXN1bHRzID0gdHlwZSA9PT0gJ2xvY2FsJyA/IEJyb3dzZXJTdG9yYWdlLmdldExvY2FsRGF0YShrZXkpIDogQnJvd3NlclN0b3JhZ2UuZ2V0U2Vzc2lvbkRhdGEoa2V5KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGRhdGEgdG8gc3RvcmFnZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBLZXkgdG8gc3RvcmUgZGF0YS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIERhdGEgdG8gc3RvcmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBzYXZlZC5cbiAgICovXG4gIHNldFN0b3JhZ2VEYXRhKGtleTogc3RyaW5nLCB2YWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHt0eXBlfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCByZXN1bHRzOiBib29sZWFuID0gdHlwZSA9PT0gJ2xvY2FsJyA/XG4gICAgICBCcm93c2VyU3RvcmFnZS5zZXRMb2NhbERhdGEoa2V5LCB2YWx1ZSkgOlxuICAgICAgQnJvd3NlclN0b3JhZ2Uuc2V0U2Vzc2lvbkRhdGEoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHRzKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTU8sTUFBTSxlQUFlO0FBQUEsRUFNMUIsWUFBWSxVQUFpQyxDQUFDLEdBQUc7QUFKakQsU0FBUSxVQUFpQztBQUFBLE1BQ3ZDLE1BQU07QUFBQSxJQUNSO0FBSUUsU0FBSyxpQkFBaUIsS0FBSyxlQUFlLEtBQUssSUFBSTtBQUNuRCxTQUFLLGlCQUFpQixLQUFLLGVBQWUsS0FBSyxJQUFJO0FBR25ELFNBQUssVUFBVSxFQUFDLEdBQUcsS0FBSyxTQUFTLEdBQUcsUUFBTztBQUFBLEVBQzdDO0FBQUEsRUFaQTtBQUFBLFNBQU8sU0FBYyxVQUFVLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBb0JoQyxPQUFPLGFBQWEsS0FBc0I7QUFDeEMsVUFBTSxlQUFlLGVBQWUsZ0JBQWdCO0FBRXBELFFBQUcsY0FBYztBQUNmLFVBQUk7QUFDRixxQkFBYSxXQUFXLEdBQUc7QUFDM0IsZUFBTztBQUFBLE1BQ1QsU0FBUSxPQUFPO0FBQ2IsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGLE9BQU87QUFDTCxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE9BQU8sZUFBZSxLQUFzQjtBQUMxQyxVQUFNLGlCQUFpQixlQUFlLGtCQUFrQjtBQUV4RCxRQUFHLGdCQUFnQjtBQUNqQixVQUFJO0FBQ0YsdUJBQWUsV0FBVyxHQUFHO0FBQzdCLGVBQU87QUFBQSxNQUNULFNBQVEsT0FBTztBQUNiLGVBQU87QUFBQSxNQUNUO0FBQUEsSUFDRixPQUFPO0FBQ0wsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQUE7QUFB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