UNPKG

cloud-red

Version:

Harnessing Serverless for your cloud integration needs

107 lines (100 loc) 3.43 kB
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); };