chromeless
Version:
🖥 Chrome automation made simple. Runs locally or headless on AWS Lambda.
904 lines • 36.9 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [0, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var fs = require("fs");
var os = require("os");
var path = require("path");
var cuid = require("cuid");
var CDP = require("chrome-remote-interface");
var AWS = require("aws-sdk");
exports.version = (function () {
if (fs.existsSync(path.join(__dirname, '../package.json'))) {
// development (look in /src)
return require('../package.json').version;
}
else {
// production (look in /dist/src)
return require('../../package.json').version;
}
})();
function setViewport(client, viewport) {
if (viewport === void 0) { viewport = { width: 1, height: 1, scale: 1 }; }
return __awaiter(this, void 0, void 0, function () {
var config, host, port, versionResult, isHeadless, _a, _b;
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
config = {
deviceScaleFactor: 1,
mobile: false,
scale: viewport.scale || 1,
fitWindow: false,
};
host = client.host, port = client.port;
return [4 /*yield*/, CDP.Version({ host: host, port: port })];
case 1:
versionResult = _c.sent();
isHeadless = versionResult['User-Agent'].includes('Headless');
if (!(viewport.height && viewport.width)) return [3 /*break*/, 2];
config.height = viewport.height;
config.width = viewport.width;
return [3 /*break*/, 6];
case 2:
if (!isHeadless) return [3 /*break*/, 3];
// just apply default value in headless mode to maintain original browser viewport
config.height = 900;
config.width = 1440;
return [3 /*break*/, 6];
case 3:
_a = config;
return [4 /*yield*/, evaluate(client, (function () { return window.innerHeight; }).toString())];
case 4:
_a.height = _c.sent();
_b = config;
return [4 /*yield*/, evaluate(client, (function () { return window.innerWidth; }).toString())];
case 5:
_b.width = _c.sent();
_c.label = 6;
case 6: return [4 /*yield*/, client.Emulation.setDeviceMetricsOverride(config)];
case 7:
_c.sent();
return [4 /*yield*/, client.Emulation.setVisibleSize({
width: config.width,
height: config.height,
})];
case 8:
_c.sent();
return [2 /*return*/];
}
});
});
}
exports.setViewport = setViewport;
function waitForNode(client, selector, waitTimeout) {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
var Runtime, getNode, result, start_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Runtime = client.Runtime;
getNode = "selector => {\n return document.querySelector(selector)\n }";
return [4 /*yield*/, Runtime.evaluate({
expression: "(" + getNode + ")(`" + selector + "`)",
})];
case 1:
result = _a.sent();
if (result.result.value === null) {
start_1 = new Date().getTime();
return [2 /*return*/, new Promise(function (resolve, reject) {
var interval = setInterval(function () { return __awaiter(_this, void 0, void 0, function () {
var result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (new Date().getTime() - start_1 > waitTimeout) {
clearInterval(interval);
reject(new Error("wait(\"" + selector + "\") timed out after " + waitTimeout + "ms"));
}
return [4 /*yield*/, Runtime.evaluate({
expression: "(" + getNode + ")(`" + selector + "`)",
})];
case 1:
result = _a.sent();
if (result.result.value !== null) {
clearInterval(interval);
resolve();
}
return [2 /*return*/];
}
});
}); }, 500);
})];
}
else {
return [2 /*return*/];
}
return [2 /*return*/];
}
});
});
}
exports.waitForNode = waitForNode;
function wait(timeout) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) { return setTimeout(resolve, timeout); })];
});
});
}
exports.wait = wait;
function waitForPromise(promise, waitTimeout, label) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) {
var fullfilled = false;
setTimeout(function () {
fullfilled = true;
reject(new Error("wait(" + (label || 'Promise') + ") timed out after " + waitTimeout + "ms"));
}, waitTimeout);
return promise
.then(function (res) { return (fullfilled ? void 0 : resolve(res)); })
.catch(function (err) { return (fullfilled ? void 0 : reject(err)); });
})];
});
});
}
exports.waitForPromise = waitForPromise;
function eventToPromise() {
var resolve;
var promise = new Promise(function (res) {
resolve = res;
});
return {
onEvent: function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
resolve(args.length > 1 ? args : args[0]);
},
fired: function () {
return promise;
},
};
}
exports.eventToPromise = eventToPromise;
function nodeExists(client, selector) {
return __awaiter(this, void 0, void 0, function () {
var Runtime, exists, expression, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Runtime = client.Runtime;
exists = "selector => {\n return !!document.querySelector(selector)\n }";
expression = "(" + exists + ")(`" + selector + "`)";
return [4 /*yield*/, Runtime.evaluate({
expression: expression,
})];
case 1:
result = _a.sent();
return [2 /*return*/, result.result.value];
}
});
});
}
exports.nodeExists = nodeExists;
function getClientRect(client, selector) {
return __awaiter(this, void 0, void 0, function () {
var Runtime, code, expression, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Runtime = client.Runtime;
code = "selector => {\n const element = document.querySelector(selector)\n if (!element) {\n return undefined\n }\n\n const rect = element.getBoundingClientRect()\n return JSON.stringify({\n left: rect.left,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n height: rect.height,\n width: rect.width,\n })\n }";
expression = "(" + code + ")(`" + selector + "`)";
return [4 /*yield*/, Runtime.evaluate({ expression: expression })];
case 1:
result = _a.sent();
if (!result.result.value) {
throw new Error("No element found for selector: " + selector);
}
return [2 /*return*/, JSON.parse(result.result.value)];
}
});
});
}
exports.getClientRect = getClientRect;
function click(client, selector, scale) {
return __awaiter(this, void 0, void 0, function () {
var clientRect, Input, options;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, getClientRect(client, selector)];
case 1:
clientRect = _a.sent();
Input = client.Input;
options = {
x: Math.round((clientRect.left + clientRect.width / 2) * scale),
y: Math.round((clientRect.top + clientRect.height / 2) * scale),
button: 'left',
clickCount: 1,
};
return [4 /*yield*/, Input.dispatchMouseEvent(__assign({}, options, { type: 'mousePressed' }))];
case 2:
_a.sent();
return [4 /*yield*/, Input.dispatchMouseEvent(__assign({}, options, { type: 'mouseReleased' }))];
case 3:
_a.sent();
return [2 /*return*/];
}
});
});
}
exports.click = click;
function focus(client, selector) {
return __awaiter(this, void 0, void 0, function () {
var DOM, dom, node;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
DOM = client.DOM;
return [4 /*yield*/, DOM.getDocument()];
case 1:
dom = _a.sent();
return [4 /*yield*/, DOM.querySelector({
nodeId: dom.root.nodeId,
selector: selector,
})];
case 2:
node = _a.sent();
return [4 /*yield*/, DOM.focus(node)];
case 3:
_a.sent();
return [2 /*return*/];
}
});
});
}
exports.focus = focus;
function evaluate(client, fn) {
var args = [];
for (var _i = 2; _i < arguments.length; _i++) {
args[_i - 2] = arguments[_i];
}
return __awaiter(this, void 0, void 0, function () {
var Runtime, jsonArgs, argStr, expression, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Runtime = client.Runtime;
jsonArgs = JSON.stringify(args);
argStr = jsonArgs.substr(1, jsonArgs.length - 2);
expression = "\n (() => {\n const expressionResult = (" + fn + ")(" + argStr + ");\n if (expressionResult && expressionResult.then) {\n expressionResult.catch((error) => { throw new Error(error); });\n return expressionResult;\n }\n return Promise.resolve(expressionResult);\n })();\n ";
return [4 /*yield*/, Runtime.evaluate({
expression: expression,
returnByValue: true,
awaitPromise: true,
})];
case 1:
result = _a.sent();
if (result && result.exceptionDetails) {
throw new Error(result.exceptionDetails.exception.value ||
result.exceptionDetails.exception.description);
}
if (result && result.result) {
return [2 /*return*/, result.result.value];
}
return [2 /*return*/, null];
}
});
});
}
exports.evaluate = evaluate;
function type(client, text, selector) {
return __awaiter(this, void 0, void 0, function () {
var Input, i, char, options;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!selector) return [3 /*break*/, 3];
return [4 /*yield*/, focus(client, selector)];
case 1:
_a.sent();
return [4 /*yield*/, wait(500)];
case 2:
_a.sent();
_a.label = 3;
case 3:
Input = client.Input;
i = 0;
_a.label = 4;
case 4:
if (!(i < text.length)) return [3 /*break*/, 7];
char = text[i];
options = {
type: 'char',
text: char,
unmodifiedText: char,
};
return [4 /*yield*/, Input.dispatchKeyEvent(options)];
case 5:
_a.sent();
_a.label = 6;
case 6:
i++;
return [3 /*break*/, 4];
case 7: return [2 /*return*/];
}
});
});
}
exports.type = type;
function press(client, keyCode, count, modifiers) {
return __awaiter(this, void 0, void 0, function () {
var Input, options, i;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Input = client.Input;
if (count === undefined) {
count = 1;
}
options = {
nativeVirtualKeyCode: keyCode,
windowsVirtualKeyCode: keyCode,
};
if (modifiers) {
options['modifiers'] = modifiers;
}
i = 0;
_a.label = 1;
case 1:
if (!(i < count)) return [3 /*break*/, 5];
return [4 /*yield*/, Input.dispatchKeyEvent(__assign({}, options, { type: 'rawKeyDown' }))];
case 2:
_a.sent();
return [4 /*yield*/, Input.dispatchKeyEvent(__assign({}, options, { type: 'keyUp' }))];
case 3:
_a.sent();
_a.label = 4;
case 4:
i++;
return [3 /*break*/, 1];
case 5: return [2 /*return*/];
}
});
});
}
exports.press = press;
function getValue(client, selector) {
return __awaiter(this, void 0, void 0, function () {
var Runtime, browserCode, expression, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Runtime = client.Runtime;
browserCode = "selector => {\n return document.querySelector(selector).value\n }";
expression = "(" + browserCode + ")(`" + selector + "`)";
return [4 /*yield*/, Runtime.evaluate({
expression: expression,
})];
case 1:
result = _a.sent();
return [2 /*return*/, result.result.value];
}
});
});
}
exports.getValue = getValue;
function scrollTo(client, x, y) {
return __awaiter(this, void 0, void 0, function () {
var Runtime, browserCode, expression;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Runtime = client.Runtime;
browserCode = "(x, y) => {\n return window.scrollTo(x, y)\n }";
expression = "(" + browserCode + ")(" + x + ", " + y + ")";
return [4 /*yield*/, Runtime.evaluate({
expression: expression,
})];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
}
exports.scrollTo = scrollTo;
function scrollToElement(client, selector) {
return __awaiter(this, void 0, void 0, function () {
var clientRect;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, getClientRect(client, selector)];
case 1:
clientRect = _a.sent();
return [2 /*return*/, scrollTo(client, clientRect.left, clientRect.top)];
}
});
});
}
exports.scrollToElement = scrollToElement;
function setHtml(client, html) {
return __awaiter(this, void 0, void 0, function () {
var Page, frameId;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Page = client.Page;
return [4 /*yield*/, Page.getResourceTree()];
case 1:
frameId = (_a.sent()).frameTree.frame.id;
return [4 /*yield*/, Page.setDocumentContent({ frameId: frameId, html: html })];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
}
exports.setHtml = setHtml;
function getCookies(client, nameOrQuery) {
return __awaiter(this, void 0, void 0, function () {
var Network, fn, url, result, cookies, filteredCookies;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Network = client.Network;
fn = function () { return location.href; };
return [4 /*yield*/, evaluate(client, "" + fn)];
case 1:
url = (_a.sent());
return [4 /*yield*/, Network.getCookies([url])];
case 2:
result = _a.sent();
cookies = result.cookies;
if (typeof nameOrQuery !== 'undefined' && typeof nameOrQuery === 'string') {
filteredCookies = cookies.filter(function (cookie) { return cookie.name === nameOrQuery; });
return [2 /*return*/, filteredCookies];
}
return [2 /*return*/, cookies];
}
});
});
}
exports.getCookies = getCookies;
function getAllCookies(client) {
return __awaiter(this, void 0, void 0, function () {
var Network, result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Network = client.Network;
return [4 /*yield*/, Network.getAllCookies()];
case 1:
result = _a.sent();
return [2 /*return*/, result.cookies];
}
});
});
}
exports.getAllCookies = getAllCookies;
function setCookies(client, cookies) {
return __awaiter(this, void 0, void 0, function () {
var Network, _i, cookies_1, cookie;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Network = client.Network;
_i = 0, cookies_1 = cookies;
_a.label = 1;
case 1:
if (!(_i < cookies_1.length)) return [3 /*break*/, 4];
cookie = cookies_1[_i];
return [4 /*yield*/, Network.setCookie(__assign({}, cookie, { url: cookie.url ? cookie.url : getUrlFromCookie(cookie) }))];
case 2:
_a.sent();
_a.label = 3;
case 3:
_i++;
return [3 /*break*/, 1];
case 4: return [2 /*return*/];
}
});
});
}
exports.setCookies = setCookies;
function setExtraHTTPHeaders(client, headers) {
return __awaiter(this, void 0, void 0, function () {
var Network;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Network = client.Network;
return [4 /*yield*/, Network.setExtraHTTPHeaders({ headers: headers })];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
}
exports.setExtraHTTPHeaders = setExtraHTTPHeaders;
function mousedown(client, selector, scale) {
return __awaiter(this, void 0, void 0, function () {
var clientRect, Input, options;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, getClientRect(client, selector)];
case 1:
clientRect = _a.sent();
Input = client.Input;
options = {
x: Math.round((clientRect.left + clientRect.width / 2) * scale),
y: Math.round((clientRect.top + clientRect.height / 2) * scale),
button: 'left',
clickCount: 1,
};
return [4 /*yield*/, Input.dispatchMouseEvent(__assign({}, options, { type: 'mousePressed' }))];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
}
exports.mousedown = mousedown;
function mouseup(client, selector, scale) {
return __awaiter(this, void 0, void 0, function () {
var clientRect, Input, options;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, getClientRect(client, selector)];
case 1:
clientRect = _a.sent();
Input = client.Input;
options = {
x: Math.round((clientRect.left + clientRect.width / 2) * scale),
y: Math.round((clientRect.top + clientRect.height / 2) * scale),
button: 'left',
clickCount: 1,
};
return [4 /*yield*/, Input.dispatchMouseEvent(__assign({}, options, { type: 'mouseReleased' }))];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
}
exports.mouseup = mouseup;
function getUrlFromCookie(cookie) {
var domain = cookie.domain.slice(1, cookie.domain.length);
return "https://" + domain;
}
function deleteCookie(client, name, url) {
return __awaiter(this, void 0, void 0, function () {
var Network;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Network = client.Network;
return [4 /*yield*/, Network.deleteCookie({ cookieName: name, url: url })];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
}
exports.deleteCookie = deleteCookie;
function clearCookies(client) {
return __awaiter(this, void 0, void 0, function () {
var Network;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Network = client.Network;
return [4 /*yield*/, Network.clearBrowserCookies()];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
}
exports.clearCookies = clearCookies;
function getBoxModel(client, selector) {
return __awaiter(this, void 0, void 0, function () {
var DOM, documentNodeId, nodeId, model;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
DOM = client.DOM;
return [4 /*yield*/, DOM.getDocument()];
case 1:
documentNodeId = (_a.sent()).root.nodeId;
return [4 /*yield*/, DOM.querySelector({
selector: selector,
nodeId: documentNodeId,
})];
case 2:
nodeId = (_a.sent()).nodeId;
return [4 /*yield*/, DOM.getBoxModel({ nodeId: nodeId })];
case 3:
model = (_a.sent()).model;
return [2 /*return*/, model];
}
});
});
}
exports.getBoxModel = getBoxModel;
function boxModelToViewPort(model, scale) {
return {
x: model.content[0],
y: model.content[1],
width: model.width,
height: model.height,
scale: scale,
};
}
exports.boxModelToViewPort = boxModelToViewPort;
function screenshot(client, selector) {
return __awaiter(this, void 0, void 0, function () {
var Page, captureScreenshotOptions, model, screenshot;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Page = client.Page;
captureScreenshotOptions = {
format: 'png',
fromSurface: true,
clip: undefined,
};
if (!selector) return [3 /*break*/, 2];
return [4 /*yield*/, getBoxModel(client, selector)];
case 1:
model = _a.sent();
captureScreenshotOptions.clip = boxModelToViewPort(model, 1);
_a.label = 2;
case 2: return [4 /*yield*/, Page.captureScreenshot(captureScreenshotOptions)];
case 3:
screenshot = _a.sent();
return [2 /*return*/, screenshot.data];
}
});
});
}
exports.screenshot = screenshot;
function html(client) {
return __awaiter(this, void 0, void 0, function () {
var DOM, nodeId, outerHTML;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
DOM = client.DOM;
return [4 /*yield*/, DOM.getDocument()];
case 1:
nodeId = (_a.sent()).root.nodeId;
return [4 /*yield*/, DOM.getOuterHTML({ nodeId: nodeId })];
case 2:
outerHTML = (_a.sent()).outerHTML;
return [2 /*return*/, outerHTML];
}
});
});
}
exports.html = html;
function htmlUrl(client) {
return __awaiter(this, void 0, void 0, function () {
var DOM, nodeId, outerHTML;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
DOM = client.DOM;
return [4 /*yield*/, DOM.getDocument()];
case 1:
nodeId = (_a.sent()).root.nodeId;
return [4 /*yield*/, DOM.getOuterHTML({ nodeId: nodeId })];
case 2:
outerHTML = (_a.sent()).outerHTML;
return [2 /*return*/, outerHTML];
}
});
});
}
exports.htmlUrl = htmlUrl;
function pdf(client, options) {
return __awaiter(this, void 0, void 0, function () {
var Page, pdf;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
Page = client.Page;
return [4 /*yield*/, Page.printToPDF(options)];
case 1:
pdf = _a.sent();
return [2 /*return*/, pdf.data];
}
});
});
}
exports.pdf = pdf;
function clearInput(client, selector) {
return __awaiter(this, void 0, void 0, function () {
var Input, text, optionsDelete, optionsBackspace, i;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, wait(500)];
case 1:
_a.sent();
return [4 /*yield*/, focus(client, selector)];
case 2:
_a.sent();
Input = client.Input;
return [4 /*yield*/, getValue(client, selector)];
case 3:
text = _a.sent();
optionsDelete = {
nativeVirtualKeyCode: 46,
windowsVirtualKeyCode: 46,
};
optionsBackspace = {
nativeVirtualKeyCode: 8,
windowsVirtualKeyCode: 8,
};
i = 0;
_a.label = 4;
case 4:
if (!(i < text.length)) return [3 /*break*/, 8];
return [4 /*yield*/, Input.dispatchKeyEvent(__assign({}, optionsDelete, { type: 'rawKeyDown' }))];
case 5:
_a.sent();
Input.dispatchKeyEvent(__assign({}, optionsDelete, { type: 'keyUp' }));
return [4 /*yield*/, Input.dispatchKeyEvent(__assign({}, optionsBackspace, { type: 'rawKeyDown' }))];
case 6:
_a.sent();
Input.dispatchKeyEvent(__assign({}, optionsBackspace, { type: 'keyUp' }));
_a.label = 7;
case 7:
i++;
return [3 /*break*/, 4];
case 8: return [2 /*return*/];
}
});
});
}
exports.clearInput = clearInput;
function setFileInput(client, selector, files) {
return __awaiter(this, void 0, void 0, function () {
var DOM, dom, node;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
DOM = client.DOM;
return [4 /*yield*/, DOM.getDocument()];
case 1:
dom = _a.sent();
return [4 /*yield*/, DOM.querySelector({
nodeId: dom.root.nodeId,
selector: selector,
})];
case 2:
node = _a.sent();
return [4 /*yield*/, DOM.setFileInputFiles({ files: files, nodeId: node.nodeId })];
case 3: return [2 /*return*/, _a.sent()];
}
});
});
}
exports.setFileInput = setFileInput;
function getDebugOption() {
if (process &&
process.env &&
process.env['DEBUG'] &&
process.env['DEBUG'].includes('chromeless')) {
return true;
}
return false;
}
exports.getDebugOption = getDebugOption;
function writeToFile(data, extension, filePathOverride) {
var filePath = filePathOverride || path.join(os.tmpdir(), cuid() + "." + extension);
fs.writeFileSync(filePath, Buffer.from(data, 'base64'));
return filePath;
}
exports.writeToFile = writeToFile;
function getS3BucketName() {
return process.env['CHROMELESS_S3_BUCKET_NAME'];
}
function getS3BucketUrl() {
return process.env['CHROMELESS_S3_BUCKET_URL'];
}
function getS3ObjectKeyPrefix() {
return process.env['CHROMELESS_S3_OBJECT_KEY_PREFIX'] || '';
}
function getS3FilesPermissions() {
return process.env['CHROMELESS_S3_OBJECT_ACL'] || 'public-read';
}
function isS3Configured() {
return getS3BucketName() && getS3BucketUrl();
}
exports.isS3Configured = isS3Configured;
var s3ContentTypes = {
'image/png': {
extension: 'png',
},
'application/pdf': {
extension: 'pdf',
},
};
function uploadToS3(data, contentType) {
return __awaiter(this, void 0, void 0, function () {
var s3ContentType, s3Path, s3;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
s3ContentType = s3ContentTypes[contentType];
if (!s3ContentType) {
throw new Error("Unknown S3 Content type " + contentType);
}
s3Path = "" + getS3ObjectKeyPrefix() + cuid() + "." + s3ContentType.extension;
s3 = new AWS.S3();
return [4 /*yield*/, s3
.putObject({
Bucket: getS3BucketName(),
Key: s3Path,
ContentType: contentType,
ACL: getS3FilesPermissions(),
Body: Buffer.from(data, 'base64'),
})
.promise()];
case 1:
_a.sent();
return [2 /*return*/, "https://" + getS3BucketUrl() + "/" + s3Path];
}
});
});
}
exports.uploadToS3 = uploadToS3;
//# sourceMappingURL=util.js.map