UNPKG

@percy/agent

Version:

An agent process for integrating with Percy.

59 lines (58 loc) 2.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._setResponseCache = exports.getResponseCache = exports.cacheResponse = void 0; const logger_1 = require("./logger"); let responseCache = {}; /** * Keep an in-memory cache of asset responses. * * When enabled, asset responses will be kept in memory. When the asset is * re-requested, it will be responsed with what the cached response. This makes * it so servers aren't being hounded for the same asset over and over again. */ async function cacheResponse(response, logger) { const request = response.request(); const responseUrl = response.url(); const statusCode = response.status(); if (!!responseCache[responseUrl]) { logger.debug(logger_1.addLogDate(`Asset already in cache ${responseUrl}`)); return; } if (![200, 201].includes(statusCode)) { return; } if (request.resourceType() === 'other' && (await response.text()).length === 0) { // Skip empty other resource types (browser resource hints) logger.debug(`Skipping caching [is_empty_other]: ${request.url()}`); return; } try { const buffer = await response.buffer(); responseCache[responseUrl] = { status: response.status(), // CDP returns multiple headers joined by newlines, however // `request.respond` (used for cached responses) will hang if there are // newlines in headers. The following reduction normalizes header values // as arrays split on newlines headers: Object.entries(response.headers()) .reduce((norm, [key, value]) => ( // tslint:disable-next-line Object.assign(norm, { [key]: value.split('\n') })), {}), body: buffer, }; logger.debug(logger_1.addLogDate(`Added ${responseUrl} to asset discovery cache`)); } catch (error) { logger.debug(logger_1.addLogDate(`Could not cache response ${responseUrl}: ${error}`)); } } exports.cacheResponse = cacheResponse; function getResponseCache(url) { return responseCache[url]; } exports.getResponseCache = getResponseCache; function _setResponseCache(newResponseCache) { responseCache = newResponseCache; return responseCache; } exports._setResponseCache = _setResponseCache;