uppy
Version:
Extensible JavaScript file upload widget with support for drag&drop, resumable uploads, previews, restrictions, file processing/encoding, remote providers like Instagram, Dropbox, Google Drive, S3 and more :dog:
80 lines (68 loc) • 1.89 kB
JavaScript
const isSupported = typeof navigator !== 'undefined' && 'serviceWorker' in navigator
function waitForServiceWorker () {
return new Promise((resolve, reject) => {
if (!isSupported) {
reject(new Error('Unsupported'))
} else if (navigator.serviceWorker.controller) {
// A serviceWorker is already registered and active.
resolve()
} else {
navigator.serviceWorker.addEventListener('controllerchange', () => {
resolve()
})
}
})
}
class ServiceWorkerStore {
constructor (opts) {
this.ready = waitForServiceWorker()
this.name = opts.storeName
}
list () {
const defer = {}
const promise = new Promise((resolve, reject) => {
defer.resolve = resolve
defer.reject = reject
})
console.log('Loading stored blobs from Service Worker')
const onMessage = (event) => {
if (event.data.store !== this.name) {
return
}
switch (event.data.type) {
case 'uppy/ALL_FILES':
defer.resolve(event.data.files)
navigator.serviceWorker.removeEventListener('message', onMessage)
break
}
}
this.ready.then(() => {
navigator.serviceWorker.addEventListener('message', onMessage)
navigator.serviceWorker.controller.postMessage({
type: 'uppy/GET_FILES',
store: this.name
})
})
return promise
}
put (file) {
return this.ready.then(() => {
navigator.serviceWorker.controller.postMessage({
type: 'uppy/ADD_FILE',
store: this.name,
file: file
})
})
}
delete (fileID) {
return this.ready.then(() => {
navigator.serviceWorker.controller.postMessage({
type: 'uppy/REMOVE_FILE',
store: this.name,
fileID: fileID
})
})
}
}
ServiceWorkerStore.isSupported = isSupported
module.exports = ServiceWorkerStore