]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - client/src/app/shared/misc/peertube-local-storage.ts
ad761c82ff674e57e15fcd58053a206d7cf7c121
[github/Chocobozzz/PeerTube.git] / client / src / app / shared / misc / peertube-local-storage.ts
1 // Thanks: https://github.com/capaj/localstorage-polyfill
2
3 const valuesMap = new Map()
4
5 class MemoryStorage {
6 [key: string]: any
7 [index: number]: string
8
9 getItem (key) {
10 const stringKey = String(key)
11 if (valuesMap.has(key)) {
12 return String(valuesMap.get(stringKey))
13 }
14
15 return null
16 }
17
18 setItem (key, val) {
19 valuesMap.set(String(key), String(val))
20 }
21
22 removeItem (key) {
23 valuesMap.delete(key)
24 }
25
26 clear () {
27 valuesMap.clear()
28 }
29
30 key (i: any) {
31 if (arguments.length === 0) {
32 throw new TypeError('Failed to execute "key" on "Storage": 1 argument required, but only 0 present.')
33 }
34
35 const arr = Array.from(valuesMap.keys())
36 return arr[i]
37 }
38
39 get length () {
40 return valuesMap.size
41 }
42 }
43
44 let peertubeLocalStorage: Storage
45 try {
46 peertubeLocalStorage = localStorage
47 } catch (err) {
48 const instance = new MemoryStorage()
49
50 peertubeLocalStorage = new Proxy(instance, {
51 set: function (obj, prop, value) {
52 if (MemoryStorage.prototype.hasOwnProperty(prop)) {
53 instance[prop] = value
54 } else {
55 instance.setItem(prop, value)
56 }
57 return true
58 },
59 get: function (target, name) {
60 if (MemoryStorage.prototype.hasOwnProperty(name)) {
61 return instance[name]
62 }
63 if (valuesMap.has(name)) {
64 return instance.getItem(name)
65 }
66 }
67 })
68 }
69
70 export { peertubeLocalStorage }