@webscale-networks/cloudedge-handlers
Version:
Webscale Networks CloudEDGE Handlers for cloud-agnostic edge function execution
88 lines (81 loc) • 3.23 kB
JavaScript
;
const fs = require('fs');
const path = require('path');
const _ = require('lodash');
const handlers = require('../../utils/src/handlers.js');
const utils = require('./utils.js');
// event is an Lambda@Edge event. Lambda@Edge supports 'viewer-request',
// 'viewer-response', 'origin-request' and 'origin-response'. The structure of
// this object is outlined here: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html.
exports.handler = async (event, _context) => {
const rawHandlers = fs.readFileSync(
path.resolve( __dirname, '../../../handlers.json'),
);
const config = JSON.parse(rawHandlers);
// Convert request into generic Webscale object.
const clonedEvent = _.cloneDeep(event);
const wReq = utils.originToWebscaleRequest(
clonedEvent.Records[0].cf.config,
clonedEvent.Records[0].cf.request,
);
// Determine the handler that is configured to handle each event and call it.
let result = null;
if (utils.eventType(clonedEvent) == 'origin-request') {
if (config['requestHandlers']) {
result = await handlers.run(
wReq, null, config['requestHandlers'], config,
);
} else {
console.log('Origin request handler not specified.');
return clonedEvent.Records[0].cf.request;
}
} else if (utils.eventType(clonedEvent) == 'origin-response') {
if (config['responseHandlers']) {
const wResp = utils.originToWebscaleResponse(
clonedEvent.Records[0].cf.config,
clonedEvent.Records[0].cf.response,
);
result = await handlers.run(
wReq, wResp, config['responseHandlers'], config,
);
} else {
console.log('Origin response handler not specified.');
return clonedEvent.Records[0].cf.response;
}
}
if (isSet(result)) {
if (result.error) {
if (result.response) {
return utils.webscaleToOriginResponse(result.response);
} else {
return utils.defaultErrorResponse(
_.get(clonedEvent, 'Records[0].cf.response.headers'),
);
}
} else if (result.response) {
return utils.webscaleToOriginResponse(result.response);
} else {
return utils.webscaleToOriginRequest(result.request);
}
} else {
if (utils.eventType(clonedEvent).endsWith('request')) {
console.log(
'The handler did not return a result, sending back original request: ',
clonedEvent.Records[0].cf.request,
);
return clonedEvent.Records[0].cf.request;
} else {
console.log(
'The handler did not return a result, sending back original response: ',
clonedEvent.Records[0].cf.response,
);
return clonedEvent.Records[0].cf.response;
}
}
};
const isSet = (result) => {
return result &&
(_.has(result, 'error') ||
_.has(result, 'response') ||
_.has(result, 'request'));
};