cloud-red
Version:
Harnessing Serverless for your cloud integration needs
107 lines (100 loc) • 3.43 kB
JavaScript
module.exports = function(RED) {
'use strict';
var bodyParser = require('body-parser');
var aws = require('./lib/aws');
var multer = require('multer');
var cookieParser = require('cookie-parser');
var getBody = require('raw-body');
var cors = require('cors');
var onHeaders = require('on-headers');
var isUtf8 = require('is-utf8');
var hashSum = require('hash-sum');
/**
* Creates a Lambda Response Node
* @class LambdaResponse
* @extends {Node}
*/
class EventResponse {
constructor(props) {
RED.nodes.createNode(this, props);
this.headers = props.headers || {};
this.statusCode = props.statusCode;
}
receive(msg) {
//console.log(`msg received:${msg}`);
if (msg.res) {
var headers = RED.util.cloneMessage(this.headers);
if (msg.headers) {
if (msg.headers.hasOwnProperty('x-node-red-request-node')) {
var headerHash = msg.headers['x-node-red-request-node'];
delete msg.headers['x-node-red-request-node'];
var hash = hashSum(msg.headers);
if (hash === headerHash) {
delete msg.headers;
}
}
if (msg.headers) {
for (var h in msg.headers) {
if (msg.headers.hasOwnProperty(h) && !headers.hasOwnProperty(h)) {
headers[h] = msg.headers[h];
}
}
}
}
if (Object.keys(headers).length > 0) {
msg.res._res.set(headers);
}
if (msg.cookies) {
for (var name in msg.cookies) {
if (msg.cookies.hasOwnProperty(name)) {
if (
msg.cookies[name] === null ||
msg.cookies[name].value === null
) {
if (msg.cookies[name] !== null) {
msg.res._res.clearCookie(name, msg.cookies[name]);
} else {
msg.res._res.clearCookie(name);
}
} else if (typeof msg.cookies[name] === 'object') {
msg.res._res.cookie(
name,
msg.cookies[name].value,
msg.cookies[name]
);
} else {
msg.res._res.cookie(name, msg.cookies[name]);
}
}
}
}
var statusCode = this.statusCode || msg.statusCode || 200;
if (typeof msg.payload == 'object' && !Buffer.isBuffer(msg.payload)) {
msg.res._res.status(statusCode).jsonp(msg.payload);
} else {
if (msg.res._res.get('content-length') == null) {
var len;
if (msg.payload == null) {
len = 0;
} else if (Buffer.isBuffer(msg.payload)) {
len = msg.payload.length;
} else if (typeof msg.payload == 'number') {
len = Buffer.byteLength('' + msg.payload);
} else {
len = Buffer.byteLength(msg.payload);
}
msg.res._res.set('content-length', len);
}
if (typeof msg.payload === 'number') {
msg.payload = '' + msg.payload;
}
msg.res._res.status(statusCode).send(msg.payload);
}
} else {
// @ts-ignore
this.warn(RED._('httpin.errors.no-response'));
}
}
}
RED.nodes.registerType('event-response', EventResponse);
};