1
0

single-file-background.js 2.6 KB

1
  1. !function(){"use strict";const e=new Map,t="x-single-file-request-id",r=8388608;async function s(e,t,s){for(let a=0;a*r<=s.array.length;a++){const n={method:"singlefile.fetchResponse",requestId:t,headers:s.headers,status:s.status,error:s.error};n.truncated=s.array.length>r,n.truncated?(n.finished=(a+1)*r>s.array.length,n.array=s.array.slice(a*r,(a+1)*r)):n.array=s.array,await browser.tabs.sendMessage(e,n)}return{}}function a(r,s={},n){return new Promise(((i,o)=>{const d=new XMLHttpRequest;if(d.withCredentials=!0,d.responseType="arraybuffer",d.onerror=e=>o(new Error(e.detail)),d.onreadystatechange=()=>{d.readyState==XMLHttpRequest.DONE&&(d.status||d.response.byteLength?401!=d.status&&403!=d.status&&404!=d.status||n?i({arrayBuffer:d.response,array:Array.from(new Uint8Array(d.response)),headers:{"content-type":d.getResponseHeader("Content-Type")},status:d.status}):a(r,s,!0).then(i).catch(o):o(new Error("Empty response")))},d.open("GET",r,!0),s.headers)for(const e of Object.entries(s.headers))d.setRequestHeader(e[0],e[1]);if(n){const r=String(Math.random()).substring(2);f=r,u=s.referrer,e.set(f,u),d.setRequestHeader(t,r)}var f,u;d.send()}))}browser.runtime.onMessage.addListener(((e,t)=>{if(e.method&&e.method.startsWith("singlefile.fetch"))return new Promise((r=>{(async function(e,t){if("singlefile.fetch"==e.method)try{const r=await a(e.url,{referrer:e.referrer,headers:e.headers});return s(t.tab.id,e.requestId,r)}catch(r){return s(t.tab.id,e.requestId,{error:r.message,array:[]})}else if("singlefile.fetchFrame"==e.method)return browser.tabs.sendMessage(t.tab.id,e)})(e,t).then(r).catch((e=>r({error:e&&e.toString()})))}))})),browser.runtime.onMessage.addListener(((e,t)=>{if("singlefile.frameTree.initResponse"==e.method||"singlefile.frameTree.ackInitRequest"==e.method)return browser.tabs.sendMessage(t.tab.id,e,{frameId:0}),Promise.resolve({})}));const n=new Map;function i(e,t){e.delete(t)}browser.runtime.onMessage.addListener(((e,t)=>{if("singlefile.lazyTimeout.setTimeout"==e.method){let r,s=n.get(t.tab.id);if(s)if(r=s.get(t.frameId),r){const t=r.get(e.type);t&&clearTimeout(t)}else r=new Map;const a=setTimeout((async()=>{try{const r=n.get(t.tab.id),s=r.get(t.frameId);r&&s&&i(s,e.type),await browser.tabs.sendMessage(t.tab.id,{method:"singlefile.lazyTimeout.onTimeout",type:e.type})}catch(e){}}),e.delay);return s||(s=new Map,r=new Map,s.set(t.frameId,r),n.set(t.tab.id,s)),r.set(e.type,a),Promise.resolve({})}if("singlefile.lazyTimeout.clearTimeout"==e.method){let r=n.get(t.tab.id);if(r){const s=r.get(t.frameId);if(s){const t=s.get(e.type);t&&clearTimeout(t),i(s,e.type)}}return Promise.resolve({})}})),browser.tabs.onRemoved.addListener((e=>n.delete(e)))}();