peertube-web-storage.ts 1.7 KB

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