123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- console.log("sw printing before chrome58StopHere");
- var stop = true;
- (function() {
- try {
- Function("var a = {...{}};");
- stop = false;
- } catch (error) {
- console.log(error);
- }
- })();
- console.log("sw printing after chrome58StopHere");
- // chrome 58 这个会报错,所以不执行
- if (!stop) {
- self.addEventListener("fetch", event => {
- // Prevent the default, and handle the request ourselves.
- event.respondWith(
- (async function() {
- // console.log("fetch intercepted");
- // Try to get the response from a cache.
- const cachedResponse = await caches.match(event.request);
- // Return it if we found one.
- if (cachedResponse) {
- console.log("cache res", event.request.url);
- return cachedResponse;
- }
- if (
- event.request.url.startsWith(
- "https://ecs-test-static.qmth.com.cn/comm-ques-bank/dev/audio"
- ) ||
- event.request.url.startsWith(
- "https://ecs-static.qmth.com.cn/comm-ques-bank/prod/audio/"
- )
- ) {
- console.log("fetch audio intercept, try to load all");
- const res = await fetch(event.request.url);
- const reader = res.body.getReader();
- // Step 2: get total length
- const contentLength = +res.headers.get("Content-Length");
- // console.log("content-length", contentLength);
- // self.sessionStorage.setItem("test-sw", "1");
- // self.postMessage({
- // url: event.request.url,
- // progress: 1,
- // });
- // self.addEventListener('message', function(event){
- // console.log("SW Received Message: " + event.data);
- // console.log(event);
- // event.ports[0].postMessage("SW Says 'Hello back!'");
- // });
- // Step 3: read the data
- let receivedLength = 0; // received that many bytes at the moment
- let chunks = []; // array of received binary chunks (comprises the body)
- while (true) {
- const { done, value } = await reader.read();
- if (done) {
- break;
- }
- chunks.push(value);
- receivedLength += value.length;
- console.log(`Received ${receivedLength} of ${contentLength}`);
- self.clients.matchAll().then(function(clients) {
- if (clients && clients.length) {
- clients.forEach(function(client) {
- client.postMessage("got " + receivedLength / contentLength);
- });
- }
- });
- }
- // Step 4: concatenate chunks into single Uint8Array
- // let chunksAll = new Uint8Array(receivedLength); // (4.1)
- // let position = 0;
- // for (let chunk of chunks) {
- // chunksAll.set(chunk, position); // (4.2)
- // position += chunk.length;
- // }
- // const blob = await res.clone().blob();
- // const blob = new Blob([chunksAll.buffer]);
- const blob = new Blob(chunks);
- caches.open("audios").then(function(cache) {
- cache.put(
- event.request,
- new Response(blob, {
- headers: {
- "Content-Type": "audio/mp3",
- "Content-Length": contentLength,
- },
- })
- );
- });
- return new Response(blob, {
- headers: { "Content-Type": "audio/mp3" },
- });
- }
- // If we didn't find a match in the cache, use the network.
- return fetch(event.request);
- })()
- );
- });
- // .catch(function(error) {
- // // Handles exceptions that arise from match() or fetch().
- // console.error("no cache:", error);
- // });
- }
- console.log("sw printing end");
|