ayakashi
Version:
The next generation web scraping framework
101 lines (100 loc) • 4.19 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.renderlessPrelude = void 0;
const meta_1 = require("./actions/meta");
const join_1 = require("./actions/join");
const select_1 = require("./actions/select");
const extract_1 = require("./actions/extract");
const domQL_1 = require("../domQL/domQL");
const extractors_1 = require("../coreExtractors/extractors");
const retry_1 = require("./actions/retry");
//tslint:enable
function renderlessPrelude() {
return __awaiter(this, void 0, void 0, function* () {
const ayakashiInstance = {
propRefs: {},
extractors: {}
};
//@ts-ignore
const connection = {};
meta_1.attachMetaActions(ayakashiInstance, connection);
join_1.attachJoinActions(ayakashiInstance);
extract_1.attachExtract(ayakashiInstance);
extractors_1.attachCoreExtractors(ayakashiInstance);
retry_1.attachRetry(ayakashiInstance);
ayakashiInstance.__connection = {
release: function () {
return new Promise(resolve => {
process.nextTick(() => {
if (ayakashiInstance.page && ayakashiInstance.page.window) {
ayakashiInstance.page.window.close();
}
if (global.gc) {
global.gc();
}
resolve();
});
});
}
};
const propTable = {};
ayakashiInstance.__attachDOM = function (dom) {
return __awaiter(this, void 0, void 0, function* () {
if (this.page) {
yield this.__connection.release();
}
this.page = dom;
this.page.window.ayakashi = {
//@ts-ignore
preloaders: {
domQL: {
domQuery: domQL_1.domQuery
},
getNodeSelector: () => ""
},
extractors: {},
propTable: propTable,
paused: false,
resume: () => undefined,
document: dom.window.document,
window: dom.window
};
select_1.attachQuery(ayakashiInstance, this.page.window);
});
};
ayakashiInstance.evaluate = function (fn, ...args) {
return __awaiter(this, void 0, void 0, function* () {
//@ts-ignore
return fn.call(ayakashiInstance.page.window.ayakashi, ...args);
});
};
ayakashiInstance.evaluateAsync = function (fn, ...args) {
return __awaiter(this, void 0, void 0, function* () {
//@ts-ignore
return fn.call(ayakashiInstance.page.window.ayakashi, ...args);
});
};
//define head and body props for convenience
ayakashiInstance.defineProp(function () {
return this.document.body;
}, "body");
ayakashiInstance.defineProp(function () {
return this.document.head;
}, "head");
//@ts-ignore
delete ayakashiInstance.pause;
//@ts-ignore
delete ayakashiInstance.registerAction;
return ayakashiInstance;
});
}
exports.renderlessPrelude = renderlessPrelude;