@webscale-networks/cloudedge-handlers
Version:
Webscale Networks CloudEDGE Handlers for cloud-agnostic edge function execution
78 lines (70 loc) • 2.34 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 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'));
};