UNPKG

@webscale-networks/cloudedge-handlers

Version:

Webscale Networks CloudEDGE Handlers for cloud-agnostic edge function execution

88 lines (81 loc) 3.23 kB
'use strict'; 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')); };