mirror of
				https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
				synced 2025-11-04 16:23:41 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			63 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const CHATGPT_NEXT_WEB_CACHE = "chatgpt-next-web-cache";
 | 
						|
const CHATGPT_NEXT_WEB_FILE_CACHE = "chatgpt-next-web-file";
 | 
						|
let 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};
 | 
						|
 | 
						|
self.addEventListener("activate", function (event) {
 | 
						|
  console.log("ServiceWorker activated.");
 | 
						|
});
 | 
						|
 | 
						|
self.addEventListener("install", function (event) {
 | 
						|
  self.skipWaiting();  // enable new version
 | 
						|
  event.waitUntil(
 | 
						|
    caches.open(CHATGPT_NEXT_WEB_CACHE).then(function (cache) {
 | 
						|
      return cache.addAll([]);
 | 
						|
    }),
 | 
						|
  );
 | 
						|
});
 | 
						|
 | 
						|
function jsonify(data) {
 | 
						|
  return new Response(JSON.stringify(data), { headers: { 'content-type': 'application/json' } })
 | 
						|
}
 | 
						|
 | 
						|
async function upload(request, url) {
 | 
						|
  const formData = await request.formData()
 | 
						|
  const file = formData.getAll('file')[0]
 | 
						|
  let ext = file.name.split('.').pop()
 | 
						|
  if (ext === 'blob') {
 | 
						|
    ext = file.type.split('/').pop()
 | 
						|
  }
 | 
						|
  const fileUrl = `${url.origin}/api/cache/${nanoid()}.${ext}`
 | 
						|
  // console.debug('file', file, fileUrl, request)
 | 
						|
  const cache = await caches.open(CHATGPT_NEXT_WEB_FILE_CACHE)
 | 
						|
  await cache.put(new Request(fileUrl), new Response(file, {
 | 
						|
    headers: {
 | 
						|
      'content-type': file.type,
 | 
						|
      'content-length': file.size,
 | 
						|
      'cache-control': 'no-cache', // file already store in disk
 | 
						|
      'server': 'ServiceWorker',
 | 
						|
    }
 | 
						|
  }))
 | 
						|
  return jsonify({ code: 0, data: fileUrl })
 | 
						|
}
 | 
						|
 | 
						|
async function remove(request, url) {
 | 
						|
  const cache = await caches.open(CHATGPT_NEXT_WEB_FILE_CACHE)
 | 
						|
  const res = await cache.delete(request.url)
 | 
						|
  return jsonify({ code: 0 })
 | 
						|
}
 | 
						|
 | 
						|
self.addEventListener("fetch", (e) => {
 | 
						|
  const url = new URL(e.request.url);
 | 
						|
  if (/^\/api\/cache/.test(url.pathname)) {
 | 
						|
    if ('GET' == e.request.method) {
 | 
						|
      e.respondWith(caches.match(e.request))
 | 
						|
    }
 | 
						|
    if ('POST' == e.request.method) {
 | 
						|
      e.respondWith(upload(e.request, url))
 | 
						|
    }
 | 
						|
    if ('DELETE' == e.request.method) {
 | 
						|
      e.respondWith(remove(e.request, url))
 | 
						|
    }
 | 
						|
  }
 | 
						|
});
 |