@jessiehernandez/aws-synthetics-local
Version:
dev library for aws synthetics canary
211 lines (167 loc) • 5.09 kB
JavaScript
const puppeteer = require("puppeteer")
const https = require('https')
const log = require("SyntheticsLogger")
const path = require("path")
const fs = require('fs')
let browser
let page
let screenShotPath = ".screenshot"
let userAgent = "CloudWatchSynthetics-Local"
let index = 0
async function executeRequest(requestOptions, callback) {
return new Promise((resolve, reject) => {
setTimeout(() => reject('Timed out'), 30 * 1000)
req = https.request(requestOptions, res => {
let result = callback(res)
resolve(result)
})
req.on('error', (e) => {
log.error(e)
throw e
})
let body = requestOptions['body']
if (body !== undefined) {
req.write(body)
}
req.end()
})
}
exports.setLogLevel = log.setLogLevel
exports.getLogLevel = log.getLogLevel
exports.addUserAgent = async (page, userAgentString) => {
userAgent += " " + userAgentString
await page.setUserAgent(userAgent)
}
exports.getCanaryUserAgentString = () => {
return userAgent
}
exports.getPage = async () => {
const pages = await this.browser.pages()
console.log(pages.length)
if (pages.length <= 1) {
this.page = await this.browser.newPage()
}
return this.page
}
exports.executeHttpStep = async (stepName, requestOptions, callback = null, stepConfig = null) => {
index++;
let currIdx = index
let name = ""
if (stepName !== null) {
name = `-${stepName}`
}
log.info(`executeStep "${currIdx}${name}" start`)
if (callback === null) {
callback = async (res) => {
if (res.statusCode >= 400) {
e = `Request failed, statusCode: ${res.statusCode}`
log.error(e)
throw e
}
}
}
const start = Date.now()
try {
await executeRequest(requestOptions, callback)
log.info(`executeStep "${currIdx}${name}" succeeded`)
} catch (e) {
log.info(e)
log.info(`executeStep "${currIdx}${name}" failed`)
throw e
} finally {
const end = Date.now()
const d = end - start
log.info(`${name}: ${Math.floor(d / 1000)} seconds`)
}
}
exports.executeStep = async (stepName = null, func) => {
index++;
let currIdx = index
let name = ""
if (stepName !== null) {
name = `-${stepName}`
}
log.info(`executeStep "${currIdx}${name}" start`)
await this.page.screenshot({path: path.join(screenShotPath, `${currIdx}${name}-starting.png`)})
const start = Date.now()
try {
await func()
log.info(`executeStep "${currIdx}${name}" succeeded`)
await this.page.screenshot({path: path.join(screenShotPath, `${currIdx}${name}-succeeded.png`)})
} catch (e) {
log.info(e)
log.info(`executeStep "${currIdx}${name}" failed`)
await this.page.screenshot({path: path.join(screenShotPath, `${currIdx}${name}-failed.png`)})
throw e
} finally {
const end = Date.now()
const d = end - start
log.info(`${name}: ${Math.floor(d / 1000)} seconds`)
}
}
exports.takeScreenshot = async (stepName, suffix) => {
index++;
let currIdx = index
return await this.page.screenshot({path: path.join(screenShotPath, `${currIdx}-${stepName}-${suffix}.png`)})
}
exports.getRequestResponseLogHelper = () => {
return helper
}
exports.setRequestResponseLogHelper = (newHelper) => {
helper = newHelper
}
let helper = function () {
let RequestResponseLogHelper = () => {
this.request = {url: true, resourceType: false, method: false, headers: false, postData: false};
this.response = {status: true, statusText: true, url: true, remoteAddress: false, headers: false};
}
RequestResponseLogHelper.prototype.withLogRequestUrl = (b) => {
this.request.url = b
}
RequestResponseLogHelper.prototype.withLogRequestResourceType = (b) => {
this.request.resourceType = b
}
RequestResponseLogHelper.prototype.withLogRequestMethod = (b) => {
this.request.method = b
}
RequestResponseLogHelper.prototype.withLogRequestHeaders = (b) => {
this.request.headers = b
}
RequestResponseLogHelper.prototype.withLogRequestPostData = (b) => {
this.request.postData = b
}
RequestResponseLogHelper.prototype.withLogResponseStatus = (b) => {
this.response.status = b
}
RequestResponseLogHelper.prototype.withLogResponseStatusText = (b) => {
this.response.statusText = b
}
RequestResponseLogHelper.prototype.withLogResponseUrl = (b) => {
this.response.url = b
}
RequestResponseLogHelper.prototype.withLogResponseRemoteAddress = (b) => {
this.response.remoteAddress = b
}
RequestResponseLogHelper.prototype.withLogResponseHeaders = (b) => {
this.response.headers = b
}
return {
RequestResponseLogHelper: RequestResponseLogHelper
}
}
// ***********************************************************************
exports.start = async (headlessMode, screenshotDir) => {
if (!fs.existsSync(screenshotDir)) {
fs.mkdirSync(screenshotDir)
}
this.browser = await puppeteer.launch({
headless: headlessMode,
defaultViewport: {
width: 1024,
height: 768,
},
})
}
exports.close = async () => {
await this.browser.close()
}