Skip videos count on client if we don't use it
[oweals/peertube.git] / client / src / app / shared / misc / peertube-web-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: any) {
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: any, val: any) {
19     valuesMap.set(String(key), String(val))
20   }
21
22   removeItem (key: any) {
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 let peertubeSessionStorage: Storage
46 try {
47   peertubeLocalStorage = localStorage
48   peertubeSessionStorage = sessionStorage
49 } catch (err) {
50   const instance = new MemoryStorage()
51
52   peertubeLocalStorage = sessionStorage = new Proxy(instance, {
53     set: function (obj, prop: string | number, value) {
54       if (MemoryStorage.prototype.hasOwnProperty(prop)) {
55         instance[prop] = value
56       } else {
57         instance.setItem(prop, value)
58       }
59       return true
60     },
61     get: function (target, name: string | number) {
62       if (MemoryStorage.prototype.hasOwnProperty(name)) {
63         return instance[name]
64       }
65       if (valuesMap.has(name)) {
66         return instance.getItem(name)
67       }
68     }
69   })
70 }
71
72 export {
73   peertubeLocalStorage,
74   peertubeSessionStorage
75 }