ServiceWorkerStore.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*eslint-disable */
  2. const isSupported = typeof navigator !== 'undefined' && 'serviceWorker' in navigator
  3. function waitForServiceWorker () {
  4. return new Promise((resolve, reject) => {
  5. if (!isSupported) {
  6. reject(new Error('Unsupported'))
  7. } else if (navigator.serviceWorker.controller) {
  8. // A serviceWorker is already registered and active.
  9. resolve()
  10. } else {
  11. navigator.serviceWorker.addEventListener('controllerchange', () => {
  12. resolve()
  13. })
  14. }
  15. })
  16. }
  17. class ServiceWorkerStore {
  18. constructor (opts) {
  19. this.ready = waitForServiceWorker()
  20. this.name = opts.storeName
  21. }
  22. list () {
  23. const defer = {}
  24. const promise = new Promise((resolve, reject) => {
  25. defer.resolve = resolve
  26. defer.reject = reject
  27. })
  28. console.log('Loading stored blobs from Service Worker')
  29. const onMessage = (event) => {
  30. if (event.data.store !== this.name) {
  31. return
  32. }
  33. switch (event.data.type) {
  34. case 'uppy/ALL_FILES':
  35. defer.resolve(event.data.files)
  36. navigator.serviceWorker.removeEventListener('message', onMessage)
  37. break
  38. default:
  39. defer.reject()
  40. }
  41. }
  42. this.ready.then(() => {
  43. navigator.serviceWorker.addEventListener('message', onMessage)
  44. navigator.serviceWorker.controller.postMessage({
  45. type: 'uppy/GET_FILES',
  46. store: this.name
  47. })
  48. })
  49. return promise
  50. }
  51. put (file) {
  52. return this.ready.then(() => {
  53. navigator.serviceWorker.controller.postMessage({
  54. type: 'uppy/ADD_FILE',
  55. store: this.name,
  56. file: file
  57. })
  58. })
  59. }
  60. delete (fileID) {
  61. return this.ready.then(() => {
  62. navigator.serviceWorker.controller.postMessage({
  63. type: 'uppy/REMOVE_FILE',
  64. store: this.name,
  65. fileID: fileID
  66. })
  67. })
  68. }
  69. }
  70. ServiceWorkerStore.isSupported = isSupported
  71. module.exports = ServiceWorkerStore