1const CHATGPT_NEXT_WEB_CACHE = "chatgpt-next-web-cache"; 2const CHATGPT_NEXT_WEB_FILE_CACHE = "chatgpt-next-web-file"; 3let a="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";let nanoid=(e=21)=>{let t="",r=crypto.getRandomValues(new Uint8Array(e));for(let n=0;n<e;n++)t+=a[63&r[n]];return t}; 4 5self.addEventListener("activate", function (event) { 6 console.log("ServiceWorker activated."); 7}); 8 9self.addEventListener("install", function (event) { 10 self.skipWaiting(); // enable new version 11 event.waitUntil( 12 caches.open(CHATGPT_NEXT_WEB_CACHE).then(function (cache) { 13 return cache.addAll([]); 14 }), 15 ); 16}); 17 18function jsonify(data) { 19 return new Response(JSON.stringify(data), { headers: { 'content-type': 'application/json' } }) 20} 21 22async function upload(request, url) { 23 const formData = await request.formData() 24 const file = formData.getAll('file')[0] 25 let ext = file.name.split('.').pop() 26 if (ext === 'blob') { 27 ext = file.type.split('/').pop() 28 } 29 const fileUrl = `${url.origin}/api/cache/${nanoid()}.${ext}` 30 // console.debug('file', file, fileUrl, request) 31 const cache = await caches.open(CHATGPT_NEXT_WEB_FILE_CACHE) 32 await cache.put(new Request(fileUrl), new Response(file, { 33 headers: { 34 'content-type': file.type, 35 'content-length': file.size, 36 'cache-control': 'no-cache', // file already store in disk 37 'server': 'ServiceWorker', 38 } 39 })) 40 return jsonify({ code: 0, data: fileUrl }) 41} 42 43async function remove(request, url) { 44 const cache = await caches.open(CHATGPT_NEXT_WEB_FILE_CACHE) 45 const res = await cache.delete(request.url) 46 return jsonify({ code: 0 }) 47} 48 49self.addEventListener("fetch", (e) => { 50 const url = new URL(e.request.url); 51 if (/^\/api\/cache/.test(url.pathname)) { 52 if ('GET' == e.request.method) { 53 e.respondWith(caches.match(e.request)) 54 } 55 if ('POST' == e.request.method) { 56 e.respondWith(upload(e.request, url)) 57 } 58 if ('DELETE' == e.request.method) { 59 e.respondWith(remove(e.request, url)) 60 } 61 } 62});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.