mirror of https://github.com/hashicorp/consul
58 lines
1.4 KiB
JavaScript
58 lines
1.4 KiB
JavaScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: MPL-2.0
|
|
*/
|
|
|
|
export default function (
|
|
scheme = '',
|
|
storage = window.localStorage,
|
|
encode = JSON.stringify,
|
|
decode = JSON.parse,
|
|
dispatch = function (key) {
|
|
window.dispatchEvent(new StorageEvent('storage', { key: key }));
|
|
}
|
|
) {
|
|
const prefix = `${scheme}:`;
|
|
return {
|
|
getValue: function (path) {
|
|
let value = storage.getItem(`${prefix}${path}`);
|
|
if (typeof value !== 'string') {
|
|
value = '""';
|
|
}
|
|
try {
|
|
value = decode(value);
|
|
} catch (e) {
|
|
value = '';
|
|
}
|
|
return value;
|
|
},
|
|
setValue: function (path, value) {
|
|
if (value === null) {
|
|
return this.removeValue(path);
|
|
}
|
|
try {
|
|
value = encode(value);
|
|
} catch (e) {
|
|
value = '""';
|
|
}
|
|
const res = storage.setItem(`${prefix}${path}`, value);
|
|
dispatch(`${prefix}${path}`);
|
|
return res;
|
|
},
|
|
removeValue: function (path) {
|
|
const res = storage.removeItem(`${prefix}${path}`);
|
|
dispatch(`${prefix}${path}`);
|
|
return res;
|
|
},
|
|
all: function () {
|
|
return Object.keys(storage).reduce((prev, item, i, arr) => {
|
|
if (item.indexOf(`${prefix}`) === 0) {
|
|
const key = item.substr(prefix.length);
|
|
prev[key] = this.getValue(key);
|
|
}
|
|
return prev;
|
|
}, {});
|
|
},
|
|
};
|
|
}
|