فهرست منبع

restore: Check that a serviceWorker is an Uppy one before using it

Renée Kooi 7 سال پیش
والد
کامیت
30a74dfbeb
3فایلهای تغییر یافته به همراه41 افزوده شده و 0 حذف شده
  1. 9 0
      examples/bundled-example/sw.js
  2. 9 0
      src/plugins/RestoreFiles/ServiceWorker.js
  3. 23 0
      src/plugins/RestoreFiles/ServiceWorkerStore.js

+ 9 - 0
examples/bundled-example/sw.js

@@ -46,8 +46,17 @@ function getFiles (store) {
   })
 }
 
+function probe (event) {
+  sendMessageToAllClients({
+    type: 'uppy/HERE_I_AM'
+  })
+}
+
 self.addEventListener('message', (event) => {
   switch (event.data.type) {
+    case 'uppy/PROBE':
+      probe()
+      break
     case 'uppy/ADD_FILE':
       addFile(event.data.store, event.data.file)
       break

+ 9 - 0
src/plugins/RestoreFiles/ServiceWorker.js

@@ -46,8 +46,17 @@ function getFiles (store) {
   })
 }
 
+function probe (event) {
+  sendMessageToAllClients({
+    type: 'uppy/HERE_I_AM'
+  })
+}
+
 self.addEventListener('message', (event) => {
   switch (event.data.type) {
+    case 'uppy/PROBE':
+      probe()
+      break
     case 'uppy/ADD_FILE':
       addFile(event.data.store, event.data.file)
       break

+ 23 - 0
src/plugins/RestoreFiles/ServiceWorkerStore.js

@@ -1,5 +1,26 @@
 const isSupported = 'serviceWorker' in navigator
 
+function isUppyServiceWorker () {
+  navigator.serviceWorker.controller.postMessage({
+    type: 'uppy/PROBE'
+  })
+  return new Promise((resolve, reject) => {
+    const onNoResponse = () => {
+      reject(new Error('Not an Uppy Service Worker'))
+      navigator.serviceWorker.removeEventListener('message', onResponse)
+    }
+    const timer = setTimeout(onNoResponse, 1000)
+
+    const onResponse = (event) => {
+      if (event.data && event.data.type === 'uppy/HERE_I_AM') {
+        resolve()
+        clearTimeout(timer)
+      }
+    }
+    navigator.serviceWorker.addEventListener('message', onResponse)
+  })
+}
+
 function waitForServiceWorker () {
   return new Promise((resolve, reject) => {
     if (!('serviceWorker' in navigator)) {
@@ -12,6 +33,8 @@ function waitForServiceWorker () {
         resolve()
       })
     }
+  }).then(() => {
+    return isUppyServiceWorker()
   })
 }