-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathservice-worker.js
113 lines (108 loc) · 2.94 KB
/
service-worker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
var version = "v23.02.07"
var wasmVersion = "wasm2"
var shareTargetVersion = "share-target"
var urls = [
"./",
"css/custom-audio.css",
"css/player-dark.css",
"css/player.css",
"img/apple-touch-icon.png",
"img/favicon.png",
"index.html",
"js/cli-worker.js",
"js/custom-audio.js",
"js/dark-toggle.js",
"js/player.js",
"js/soundbuffer.js"
]
var wasmDir = "https://vgmstream.org/web/"
var wasmVer = wasmDir + "version"
var wasmUrls = [
wasmVer,
wasmDir + "vgmstream-cli.js",
wasmDir + "vgmstream-cli.wasm"
]
async function workerInstall(){
var cache = await caches.open(version)
var wasmCache = await caches.open(wasmVersion)
var promises = [
cache.addAll(urls),
wasmCache.addAll(wasmUrls)
]
await Promise.all(promises)
await self.skipWaiting()
}
self.addEventListener("install", event => {
event.waitUntil(workerInstall())
})
async function workerActivate(){
await deleteOldCaches()
await self.clients.claim()
}
async function deleteOldCaches(){
var currentCaches = [version, wasmVersion, shareTargetVersion]
var promises = []
var cacheKeys = await caches.keys()
cacheKeys.forEach(cache => {
if(currentCaches.indexOf(cache) === -1){
promises.push(caches.delete(cache))
}
})
await Promise.all(promises)
}
self.addEventListener("activate", event => {
event.waitUntil(workerActivate())
})
async function workerFetch(event){
var request = event.request
var isWasmDir = request.url.startsWith(wasmDir)
var isWasmVer = request.url === wasmVer
var cachedResponse = await caches.match(request)
var recent = true
if(cachedResponse && (!isWasmVer || !self.navigator.onLine)){
return cachedResponse
}
var opt = {}
if(isWasmDir){
opt.cache = "reload"
}
var response = await fetch(request, opt)
var copy = response.clone()
var cache = await caches.open(isWasmDir ? wasmVersion : version)
if(isWasmVer){
var priorCopy = await cache.match(request.url)
if(priorCopy){
var currentCopy = copy.clone()
if(await priorCopy.text() !== await currentCopy.text()){
await caches.delete(wasmVersion)
cache = await caches.open(wasmVersion)
}
}
}
cache.put(request, copy)
return response
}
async function shareTarget(event){
var request = event.request
var formData = await request.formData()
var file = formData.get("file")
var shareCache = await caches.open(shareTargetVersion)
var headers = new Headers()
headers.append("name", file.name)
var response = new Response(file, {
headers: headers
})
await shareCache.put("shared-file", response)
var url = new URL(request.url)
url.searchParams.delete("share-target")
url.hash = "#share-target"
return Response.redirect(url.toString(), 303)
}
self.addEventListener("fetch", event => {
var request = event.request
if(request.method === "POST" && request.url.endsWith("?share-target")){
return event.respondWith(shareTarget(event))
}else if(request.url.startsWith(self.location.origin + "/") || request.url.startsWith(wasmDir)){
return event.respondWith(workerFetch(event))
}
})