UNPKG

node-red-contrib-viseo-aws

Version:

VISEO Bot Maker - AWS Lex and Rekognition

127 lines (100 loc) 4.69 kB
'use strict'; const helper = require('node-red-viseo-helper'); const AWS = require('aws-sdk'); // -------------------------------------------------------------------------- // NODE-RED // -------------------------------------------------------------------------- module.exports = function (RED) { const register = function (config) { RED.nodes.createNode(this, config); let node = this; node.status({fill:"red", shape:"ring", text: 'Missing credentials'}) if (config.token) { config.creds = RED.nodes.getCredentials(config.token); node.status({}); } start(config); this.on('input', (data) => { input(RED, node, config, data); }); this.on('close', (done) => { stop(node, config, done) }); } RED.nodes.registerType('aws-lex', register, {}); }; let _AWS = {}; function start(config) { if (!config.token || _AWS[config.token]) return; if (!config.creds || !config.creds.accessKeyId || !config.creds.secretAccessKey) return; _AWS[config.token] = new AWS.LexRuntime(config.creds); } function input (RED, node, config, data) { // Log activity try { setTimeout(function() { helper.trackActivities(node)},0); } catch(err) { console.log(err); } let lexruntime = _AWS[config.token]; if (!config.botname || !config.botalias || !lexruntime ) { let err = (!config.botname || !config.botalias) ? "Missing bot information" : "Missing credentials"; helper.setByString(data, config.output || "payload" , { error: err }); node.warn("AWS Lex: Error - " + err); return node.send(data); } config.creds.region = config.creds.region || "us-east-1"; let action = config.action || "postText"; let input = helper.getContextValue(RED, node, data, config.input || "payload", config.inputType); let userid = helper.getContextValue(RED, node, data, config.userid || "user.id", config.useridType); let parameters = { botName: config.botname, botAlias: config.botalias, userId: userid } if (config.requestA) parameters.requestAttributes = helper.getContextValue(RED, node, data, config.requestA, config.requestAType); if (config.sessionA) parameters.sessionAttributes = helper.getContextValue(RED, node, data, config.sessionA, config.requestAType); if (action === "postText") { parameters.inputText = input; lexruntime.postText(parameters, function (err, res) { if (err) { helper.setByString(data, config.output || "payload" , { error: err }); node.warn("AWS Lex: Error - postText - " + err); return node.send(data); } let formattedResponse = { query: input , intent: (res.dialogState === "ElicitIntent") ? "ElicitIntent" : res.intentName, score: null, entities: res.slots, source: "lex", completeResponse: res } helper.setByString(data, config.output || "payload" , formattedResponse); return node.send(data); }); } else { parameters.inputStream = input; parameters.contentType = (config.contentType) ? helper.getContextValue(RED, node, data, config.content, config.contentType) : parameters.contentType = config.contentType;y lexruntime.postContent(parameters, function (err, res) { if (err) { helper.setByString(data, config.output || "payload" , { error: err }); node.warn("AWS Lex: Error - postContent - " + err); return node.send(data); } let query = res.inputTranscript; if (!query) { if (config.contentType === 'str' || config.contentType === "text/plain; charset=utf-8") query = input; if (res.dialogState !== "ElicitIntent" && res.dialogState !== "Failed") query = input; } let formattedResponse = { query: query, intent: res.intentName || res.dialogState, score: null, entities: res.slots, source: "lex", completeResponse: res } helper.setByString(data, config.output || "payload" , formattedResponse); return node.send(data); }); } }; function stop(node, config, done) { if (_AWS[config.token]) delete _AWS[config.token]; done(); }