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
| const cdn_regex = /.*\/cdn\/(.+?)\//; const cdn_list = { "anchor-js": [ "https://cdn1/npm/anchor-js@4.3.1/", "https://cdn2/npm/anchor-js@4.3.1/", "https://lib.baomitu.com/anchor-js/5.0.0/", ], "github-markdown-css": [ "https://cdn1/npm/github-markdown-css@4.0.0/", "https://cdn2/npm/github-markdown-css@4.0.0/", "https://lib.baomitu.com/github-markdown-css/4.0.0/", ], "jquery": [ "https://cdn1/npm/jquery@3.6.4/dist/", "https://cdn2/npm/jquery@3.6.4/dist/", "https://lib.baomitu.com/jquery/3.6.4/", ], "bootstrap": [ "https://cdn1/npm/bootstrap@4.6.1/dist/", "https://cdn2/npm/bootstrap@4.6.1/dist/", "https://lib.baomitu.com/twitter-bootstrap/4.6.1/", ], "tocbot": [ "https://cdn1/npm/tocbot@4.20.1/dist/", "https://cdn2/npm/tocbot@4.20.1/dist/", "https://lib.baomitu.com/tocbot/4.20.1/", ], "nprogress": [ "https://cdn1/npm/nprogress@0.2.0/", "https://cdn2/npm/nprogress@0.2.0/", "https://lib.baomitu.com/nprogress/0.2.0/", ], "katex": [ "https://cdn1/npm/katex@0.16.21/dist/", "https://cdn2/npm/katex@0.16.21/dist/", "https://lib.baomitu.com/KaTeX/0.16.2/", ], "clipboard-js": [ "https://cdn1/npm/clipboard-js@0.3.6/", "https://cdn2/npm/clipboard-js@0.3.6/", "https://lib.baomitu.com/clipboard.js/2.0.11/", ], "hint.css": [ "https://cdn1/npm/hint.css@2.7.0/", "https://cdn2/npm/hint.css@2.7.0/", "https://lib.baomitu.com/hint.css/2.7.0/", ] }; const cdn_index = new Promise((resolve) => { async function getFastestUrl(urls) { const testUrl = (one) => { const url = one[0]; const id = one[1]; const startTime = performance.now(); return fetch(url, {method: 'GET', cache: 'no-cache'}) .then(() => { return {url, id, time: performance.now() - startTime}; }) .catch(() => new Promise(() => {})); } const promises = urls.map(testUrl); const fastest = await Promise.race(promises); return fastest; } const urls = [ ['https://cdn2/npm/anchor-js@4.3.1/anchor.min.js', 1], ['https://cdn1/npm/anchor-js@4.3.1/anchor.min.js', 0], ['https://lib.baomitu.com/anchor-js/5.0.0/anchor.min.js', 2] ]; getFastestUrl(urls).then( (fastest) => { caches.open('freecdn.limour').then( (cache) => { resolve(fastest.id); console.log('最快的 URL:', fastest); }); }); });
oninstall = (e) => {self.skipWaiting();};
onactivate = (e) => { e.waitUntil(clients.claim()); console.log(cdn_list); };
async function cdn_redirect(url, resolve) { const key = url.pathname.match(cdn_regex)[1]; const newUrl = url.href.replace(cdn_regex, cdn_list[key][await cdn_index]); console.log(newUrl); resolve(Response.redirect(newUrl, 301)); }
onfetch = (e) => { const url = new URL(e.request.url); if (cdn_regex.test(url.pathname)) { e.respondWith(new Promise( (resolve) => { cdn_redirect(url, resolve) } )) } }
|