From 67ed6552b831df66713bac9e672738796128d33f Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 23 Jun 2020 14:10:17 +0200 Subject: Reorganize client shared modules --- client/src/app/helpers/peertube-web-storage.ts | 81 ++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 client/src/app/helpers/peertube-web-storage.ts (limited to 'client/src/app/helpers/peertube-web-storage.ts') diff --git a/client/src/app/helpers/peertube-web-storage.ts b/client/src/app/helpers/peertube-web-storage.ts new file mode 100644 index 000000000..0db1301bd --- /dev/null +++ b/client/src/app/helpers/peertube-web-storage.ts @@ -0,0 +1,81 @@ +// Thanks: https://github.com/capaj/localstorage-polyfill + +const valuesMap = new Map() + +function proxify (instance: MemoryStorage) { + return new Proxy(instance, { + set: function (obj, prop: string | number, value) { + if (MemoryStorage.prototype.hasOwnProperty(prop)) { + instance[prop] = value + } else { + instance.setItem(prop, value) + } + return true + }, + get: function (target, name: string | number) { + if (MemoryStorage.prototype.hasOwnProperty(name)) { + return instance[name] + } + if (valuesMap.has(name)) { + return instance.getItem(name) + } + } + }) +} + +class MemoryStorage { + [key: string]: any + [index: number]: string + + getItem (key: any) { + const stringKey = String(key) + if (valuesMap.has(key)) { + return String(valuesMap.get(stringKey)) + } + + return null + } + + setItem (key: any, val: any) { + valuesMap.set(String(key), String(val)) + } + + removeItem (key: any) { + valuesMap.delete(key) + } + + clear () { + valuesMap.clear() + } + + key (i: any) { + if (arguments.length === 0) { + throw new TypeError('Failed to execute "key" on "Storage": 1 argument required, but only 0 present.') + } + + const arr = Array.from(valuesMap.keys()) + return arr[i] + } + + get length () { + return valuesMap.size + } +} + +let peertubeLocalStorage: Storage +let peertubeSessionStorage: Storage +try { + peertubeLocalStorage = localStorage + peertubeSessionStorage = sessionStorage +} catch (err) { + const instanceLocalStorage = new MemoryStorage() + const instanceSessionStorage = new MemoryStorage() + + peertubeLocalStorage = proxify(instanceLocalStorage) + peertubeSessionStorage = proxify(instanceSessionStorage) +} + +export { + peertubeLocalStorage, + peertubeSessionStorage +} -- cgit v1.2.3