@stormking/emere
Version:
a nightmarejs replacement for scraping websites using electron.
122 lines (121 loc) • 3.51 kB
JavaScript
;
/* eslint-disable no-console */
Object.defineProperty(exports, "__esModule", { value: true });
const electron_1 = require("electron");
const { ipcRenderer: ipc, contextBridge: bridge } = require('electron');
function sleep(ms) {
return new Promise(res => {
setTimeout(res, ms);
});
}
function waitUntilTrue(test, repeat, max) {
const start = Date.now();
return new Promise((res, rej) => {
let check = () => {
let success = test();
if (success)
res(true);
else {
if (Date.now() - start > max) {
rej(new Error('timeout'));
}
else {
setTimeout(check, repeat);
}
}
};
check();
});
}
window.addEventListener('load', async () => {
let runScript = await electron_1.ipcRenderer.invoke('getCommands');
if (runScript.waitAfterLoad) {
await sleep(runScript.waitAfterLoad);
}
if (runScript.waitForSelector) {
await waitUntilTrue(() => !!document.querySelector(runScript.waitForSelector), 400, 10000);
}
let returnData;
if (runScript.get === 'pdf') {
returnData = '';
}
else {
returnData = document.getElementsByTagName('html')[0].innerHTML;
}
electron_1.ipcRenderer.send('returnData', returnData);
});
Object.defineProperties(window, {
resolve: {
value: function (value) {
ipc.send('response', value);
},
},
reject: {
value: function (err) {
ipc.send('error', error(err));
}
}
});
// Listen for error events
window.addEventListener('error', function (err) {
ipc.send('page', 'error', error(err));
}, true);
// prevent 'unload' and 'beforeunload' from being bound
var defaultAddEventListener = window.addEventListener;
window.addEventListener = function (type) {
if (type === 'unload' || type === 'beforeunload') {
return;
}
defaultAddEventListener.apply(window, arguments);
};
// prevent 'onunload' and 'onbeforeunload' from being set
Object.defineProperties(window, {
onunload: {
enumerable: true,
writable: false,
value: null
},
onbeforeunload: {
enumerable: true,
writable: false,
value: null
}
});
// listen for console.log
var defaultLog = console.log;
console.log = function (...p) {
ipc.send('console', 'log', ...p);
return defaultLog.apply(this, p);
};
// listen for console.warn
var defaultWarn = console.warn;
console.warn = function (...p) {
ipc.send('console', 'warn', ...p);
return defaultWarn.apply(this, p);
};
// listen for console.error
var defaultError = console.error;
console.error = function (...p) {
ipc.send('console', 'error', ...p);
return defaultError.apply(this, p);
};
// overwrite the default alert
window.alert = function (message) {
ipc.send('page', 'alert', message);
};
// overwrite the default prompt
window.prompt = function (message, defaultResponse) {
ipc.send('page', 'prompt', message, defaultResponse);
return '';
};
// overwrite the default confirm
window.confirm = function (message, defaultResponse) {
ipc.send('page', 'confirm', message, defaultResponse);
return defaultResponse;
};
/**
* Make errors serializeable
*/
function error(err) {
return Object.fromEntries(Object.entries(Object.getOwnPropertyDescriptors(err)).map(([k, v]) => [k, v.value]));
}