UNPKG

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