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.cloudflareBlackList) { 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, scribeI2pCustomRedirects, scribeLokiCustomRedirects, protocol, protocolFallback function init() { return new Promise(resolve => { browser.storage.local.get( [ "disableMedium", "mediumRedirects", "scribeNormalRedirectsChecks", "scribeNormalCustomRedirects", "scribeTorRedirectsChecks", "scribeTorCustomRedirects", "scribeI2pCustomRedirects", "scribeLokiCustomRedirects", "protocol", "protocolFallback", ], r => { disableMedium = r.disableMedium mediumRedirects = r.mediumRedirects scribeNormalRedirectsChecks = r.scribeNormalRedirectsChecks scribeNormalCustomRedirects = r.scribeNormalCustomRedirects scribeTorRedirectsChecks = r.scribeTorRedirectsChecks scribeTorCustomRedirects = r.scribeTorCustomRedirects scribeI2pCustomRedirects = r.scribeI2pCustomRedirects scribeLokiCustomRedirects = r.scribeLokiCustomRedirects protocol = r.protocol protocolFallback = r.protocolFallback resolve() } ) }) } init() browser.storage.onChanged.addListener(init) function redirect(url, type, initiator, disableOverride) { if (disableMedium && !disableOverride) return if (url.pathname == "/" && !disableOverride) return if (type != "main_frame" && "sub_frame" && "xmlhttprequest" && "other") return if ( initiator && [...mediumRedirects.scribe.normal, ...mediumRedirects.scribe.tor, ...scribeNormalCustomRedirects, ...scribeTorCustomRedirects, ...scribeI2pCustomRedirects, ...scribeLokiCustomRedirects].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 (protocol == "loki") instancesList = [...scribeLokiCustomRedirects] else if (protocol == "i2p") instancesList = [...scribeI2pCustomRedirects] else if (protocol == "tor") instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects] if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") { instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects] } if (instancesList.length === 0) { return } const randomInstance = utils.getRandomInstance(instancesList) return `${randomInstance}${url.pathname}${url.search}` } function switchInstance(url, disableOverride) { return new Promise(async resolve => { await init() if (disableMedium && !disableOverride) { resolve() return } let protocolHost = utils.protocolHost(url) const all = [ ...mediumRedirects.scribe.tor, ...mediumRedirects.scribe.normal, ...scribeNormalCustomRedirects, ...scribeTorCustomRedirects, ...scribeI2pCustomRedirects, ...scribeLokiCustomRedirects, ] if (!all.includes(protocolHost)) { resolve() return } let instancesList = [] if (protocol == "loki") instancesList = [...scribeLokiCustomRedirects] else if (protocol == "i2p") instancesList = [...scribeI2pCustomRedirects] else if (protocol == "tor") instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects] if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") { instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects] } 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) for (let i = 0; i < frontends.length; i++) { redirects[frontends[i]] = dataJson[frontends[i]] } browser.storage.local.get("cloudflareBlackList", async r => { scribeNormalRedirectsChecks = [...redirects.scribe.normal] for (const instance of r.cloudflareBlackList) { let i = scribeNormalRedirectsChecks.indexOf(instance) if (i > -1) scribeNormalRedirectsChecks.splice(i, 1) } browser.storage.local.set( { disableMedium: false, mediumRedirects: redirects, scribeNormalRedirectsChecks: scribeNormalRedirectsChecks, scribeNormalCustomRedirects: [], scribeTorRedirectsChecks: [...redirects.scribe.tor], scribeTorCustomRedirects: [], scribeI2pRedirectsChecks: [...redirects.scribe.i2p], scribeI2pCustomRedirects: [], scribeLokiRedirectsChecks: [...redirects.scribe.loki], scribeLokiCustomRedirects: [], }, () => resolve() ) }) }) }) } export default { setRedirects, redirect, switchInstance, initDefaults, }