window.browser = window.browser || window.chrome; import utils from './utils.js' const targets = [ // /(?:.*\.)*(? { redirects.scribe = val; scribeNormalRedirectsChecks = [...redirects.scribe.normal]; for (const instance of r.cloudflareList) { const a = scribeNormalRedirectsChecks.indexOf(instance); if (a > -1) scribeNormalRedirectsChecks.splice(a, 1); } browser.storage.local.set({ mediumRedirects: redirects, scribeNormalRedirectsChecks }) }) } let disableMedium, mediumRedirects, scribeNormalRedirectsChecks, scribeNormalCustomRedirects, scribeTorRedirectsChecks, scribeTorCustomRedirects, mediumProtocol; function init() { return new Promise(resolve => { browser.storage.local.get( [ "disableMedium", "mediumRedirects", "scribeNormalRedirectsChecks", "scribeNormalCustomRedirects", "scribeTorRedirectsChecks", "scribeTorCustomRedirects", "mediumProtocol" ], r => { disableMedium = r.disableMedium; mediumRedirects = r.mediumRedirects; scribeNormalRedirectsChecks = r.scribeNormalRedirectsChecks; scribeNormalCustomRedirects = r.scribeNormalCustomRedirects; scribeTorRedirectsChecks = r.scribeTorRedirectsChecks; scribeTorCustomRedirects = r.scribeTorCustomRedirects; mediumProtocol = r.mediumProtocol; resolve(); } ) }) } init(); browser.storage.onChanged.addListener(init) function redirect(url, type, initiator) { if (disableMedium) return; if (type != "main_frame" && "sub_frame" && "xmlhttprequest" && "other") return; if (initiator && ( [ ...mediumRedirects.scribe.normal, ...mediumRedirects.scribe.tor, ...scribeNormalCustomRedirects, ...scribeTorCustomRedirects, ].includes(initiator.origin))) return; if (!targets.some(rx => rx.test(url.host))) return; if (/^\/($|@[a-zA-Z.]{0,}(\/|)$)/.test(url.pathname)) return; let instancesList; if (mediumProtocol == 'normal') instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects]; else if (mediumProtocol == 'tor') instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects]; if (instancesList.length === 0) return; const randomInstance = utils.getRandomInstance(instancesList) return `${randomInstance}${url.pathname}${url.search}`; } function switchInstance(url) { return new Promise(async resolve => { await init(); let protocolHost = utils.protocolHost(url); const all = [ ...mediumRedirects.scribe.tor, ...mediumRedirects.scribe.normal, ...scribeNormalCustomRedirects, ...scribeTorCustomRedirects, ]; if (!all.includes(protocolHost)) { resolve(); return; } let instancesList; if (mediumProtocol == 'normal') instancesList = [...scribeNormalCustomRedirects, ...scribeNormalRedirectsChecks]; else if (mediumProtocol == 'tor') instancesList = [...scribeTorCustomRedirects, ...scribeTorRedirectsChecks]; const i = instancesList.indexOf(protocolHost); if (i > -1) instancesList.splice(i, 1); if (instancesList.length === 0) { resolve(); return; } const randomInstance = utils.getRandomInstance(instancesList); resolve(`${randomInstance}${url.pathname}${url.search}`); }) } function initDefaults() { return new Promise(resolve => { fetch('/instances/data.json').then(response => response.text()).then(data => { let dataJson = JSON.parse(data); redirects.scribe = dataJson.scribe; browser.storage.local.get('cloudflareList', async r => { scribeNormalRedirectsChecks = [...redirects.scribe.normal]; for (const instance of r.cloudflareList) { let i = scribeNormalRedirectsChecks.indexOf(instance); if (i > -1) scribeNormalRedirectsChecks.splice(i, 1); } await browser.storage.local.set({ disableMedium: false, mediumRedirects: redirects, scribeNormalRedirectsChecks: scribeNormalRedirectsChecks, scribeNormalCustomRedirects: [], scribeTorRedirectsChecks: [...redirects.scribe.tor], scribeTorCustomRedirects: [], mediumProtocol: "normal", }) resolve(); }) }) }) } export default { setRedirects, redirect, switchInstance, initDefaults, };