UNPKG

@webscale-networks/cloudedge-handlers

Version:

Webscale Networks CloudEDGE Handlers for cloud-agnostic edge function execution

78 lines (70 loc) 2.34 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 will contain the payload sent by the proxy with the following // structure - // { // method: string, // Ex: GET, POST // peerAddress: string, // Client ip address // query: string, // path: string, // host: string, // protocol: string, // HTTP or HTTPS // wsapp: string, // Application api id // body: string, // Always Base64 encoded // headers: { // key: [value1, value2] // } // } exports.handler = async (event) => { const rawHandlers = fs.readFileSync( path.resolve( __dirname, '../../../handlers.json'), ); const config = JSON.parse(rawHandlers); // Convert request into generic Webscale object. const wReq = _.cloneDeep(event); let result = null; if (config['serverlessHandlers']) { result = await handlers.run( wReq, null, config['serverlessHandlers'], config, ); } else { console.log('Serverless handler not specified.'); } if (isSet(result)) { if (result.error) { if (result.response) { return this._webscaleToProxyResponse(result.response); } else { console.log('Received error without response. Error - ', result.error); return utils.defaultServerlessErrorResponse(); } } else { return this._webscaleToProxyResponse(result.response); } } else { console.log('The handler did not return a result, sending default error response'); return utils.defaultServerlessErrorResponse(); } }; // Converts a Webscale response into a response that can be // returned to proxy. exports._webscaleToProxyResponse = (wResponse) => { let response = { status: wResponse.statusCode.toString(), headers: wResponse.headers || {}, }; if (wResponse.body && wResponse.body.data) { response['body'] = Buffer.from(wResponse.body.data).toString('base64'); response['bodyEncoding'] = wResponse.body.encoding; } return response; }; const isSet = (result) => { return result && (_.has(result, 'error') || _.has(result, 'response')); };