49 lines
1.2 KiB
JavaScript
49 lines
1.2 KiB
JavaScript
|
let loadQueue = []
|
||
|
let pendingRequests = new Map()
|
||
|
|
||
|
function onload(event) {
|
||
|
let url = event.target.responseURL
|
||
|
pendingRequests.delete(url)
|
||
|
postMessage({ success: true, url: url })
|
||
|
}
|
||
|
|
||
|
function onerror(event) {
|
||
|
let url = event.target.responseURL
|
||
|
pendingRequests.delete(url)
|
||
|
postMessage({ success: false, url: url })
|
||
|
}
|
||
|
|
||
|
function load() {
|
||
|
loadQueue.forEach(url => {
|
||
|
let xhr = new XMLHttpRequest()
|
||
|
xhr.responseType = 'blob'
|
||
|
xhr.onload = onload
|
||
|
xhr.onerror = onerror
|
||
|
xhr.open('GET', url, true)
|
||
|
xhr.send()
|
||
|
pendingRequests.set(url, xhr)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
self.onmessage = event => {
|
||
|
let msg = event.data
|
||
|
switch (msg.command) {
|
||
|
case 'load':
|
||
|
for (let url of msg.urls) {
|
||
|
console.log('Load', url)
|
||
|
loadQueue.push(url)
|
||
|
}
|
||
|
load()
|
||
|
break
|
||
|
case 'abort':
|
||
|
loadQueue = []
|
||
|
for (let xhr of pendingRequests.values()) {
|
||
|
console.log('Abort')
|
||
|
xhr.abort()
|
||
|
}
|
||
|
break
|
||
|
default:
|
||
|
console.warn('Unknown worker command: ' + msg.command)
|
||
|
}
|
||
|
}
|