MetaDataStore.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /**
  2. * Get uppy instance IDs for which state is stored.
  3. */
  4. function findUppyInstances () {
  5. const instances = []
  6. for (let i = 0; i < localStorage.length; i++) {
  7. const key = localStorage.key(i)
  8. if (key.startsWith('uppyState:')) {
  9. instances.push(key.slice('uppyState:'.length))
  10. }
  11. }
  12. return instances
  13. }
  14. /**
  15. * Try to JSON-parse a string, return null on failure.
  16. */
  17. function maybeParse (str) {
  18. try {
  19. return JSON.parse(str)
  20. } catch {
  21. return null
  22. }
  23. }
  24. let cleanedUp = false
  25. export default class MetaDataStore {
  26. constructor (opts) {
  27. this.opts = {
  28. expires: 24 * 60 * 60 * 1000, // 24 hours
  29. ...opts,
  30. }
  31. this.name = `uppyState:${opts.storeName}`
  32. if (!cleanedUp) {
  33. cleanedUp = true
  34. MetaDataStore.cleanup()
  35. }
  36. }
  37. /**
  38. *
  39. */
  40. load () {
  41. const savedState = localStorage.getItem(this.name)
  42. if (!savedState) return null
  43. const data = maybeParse(savedState)
  44. if (!data) return null
  45. // Upgrade pre-0.20.0 uppyState: it used to be just a flat object,
  46. // without `expires`.
  47. if (!data.metadata) {
  48. this.save(data)
  49. return data
  50. }
  51. return data.metadata
  52. }
  53. save (metadata) {
  54. const expires = Date.now() + this.opts.expires
  55. const state = JSON.stringify({
  56. metadata,
  57. expires,
  58. })
  59. localStorage.setItem(this.name, state)
  60. }
  61. /**
  62. * Remove all expired state.
  63. */
  64. static cleanup (instanceID) {
  65. if (instanceID) {
  66. localStorage.removeItem(`uppyState:${instanceID}`)
  67. return
  68. }
  69. const instanceIDs = findUppyInstances()
  70. const now = Date.now()
  71. instanceIDs.forEach((id) => {
  72. const data = localStorage.getItem(`uppyState:${id}`)
  73. if (!data) return
  74. const obj = maybeParse(data)
  75. if (!obj) return
  76. if (obj.expires && obj.expires < now) {
  77. localStorage.removeItem(`uppyState:${id}`)
  78. }
  79. })
  80. }
  81. }