Path: blob/main/plugins/default-browser-emulator/lib/DomOverridesBuilder.ts
1029 views
import * as fs from 'fs';1import INewDocumentInjectedScript from '@secret-agent/interfaces/INewDocumentInjectedScript';2import injectedSourceUrl from '@secret-agent/interfaces/injectedSourceUrl';34const cache: { [name: string]: string } = {};5const shouldCache = process.env.NODE_ENV === 'production';67const utilsScript = [8fs.readFileSync(`${__dirname}/../injected-scripts/_proxyUtils.js`, 'utf8'),9fs.readFileSync(`${__dirname}/../injected-scripts/_descriptorBuilder.js`, 'utf8'),10].join('\n');1112export default class DomOverridesBuilder {13private readonly scriptsByName = new Map<string, string>();1415public build(scriptNames?: string[]): INewDocumentInjectedScript[] {16const scripts = [];17for (const [name, script] of this.scriptsByName) {18const shouldIncludeScript = scriptNames ? scriptNames.includes(name) : true;19if (shouldIncludeScript) {20scripts.push(script);21}22}23return [24{25// NOTE: don't make this async. It can cause issues if you read a frame right after creation, for instance26script: `(function newDocumentScript() {27// Worklet has no scope to override, but we can't detect until it loads28if (typeof self === 'undefined' && typeof window === 'undefined') return;2930const sourceUrl = '${injectedSourceUrl}';3132${utilsScript}3334${scripts.join('\n\n')}35})();36//# sourceURL=${injectedSourceUrl}`.replace(/\/\/# sourceMap.+/g, ''),37},38];39}4041public add(name: string, args: any = {}) {42let script = cache[name];43if (!script) {44if (!fs.existsSync(`${__dirname}/../injected-scripts/${name}.js`)) {45throw new Error(`Browser-Emulator injected script doesn\`t exist: ${name}`);46}47script = fs.readFileSync(`${__dirname}/../injected-scripts/${name}.js`, 'utf8');48}49if (shouldCache) cache[name] = script;5051if (name === 'errors') args.sourceUrl = injectedSourceUrl;5253let wrapper = `(function newDocumentScript_${name.replace(/\./g, '__')}(args) {54try {55${script};56} catch(err) {57console.log('Failed to initialize "${name}"', err);58}59})(${JSON.stringify(args)});`;6061if (name.startsWith('polyfill.')) {62wrapper = `// if main frame and HTML element not loaded yet, give it a sec63if (!document.documentElement) {64new MutationObserver((list, observer) => {65observer.disconnect();66${wrapper}67}).observe(document, {childList: true, subtree: true});68} else {69${wrapper}70}71`;72}73this.scriptsByName.set(name, wrapper);74}75}7677export function getOverrideScript(name: string, args?: any) {78const injected = new DomOverridesBuilder();79injected.add(name, args);80return injected.build()[0];81}828384