UNPKG

node-red-contrib-motechat

Version:

ultranet topic and payload communication

159 lines (140 loc) 4.15 kB
module.exports = function(RED){ "use strict" let caller = { SetConfig: require('../lib/mcClient.js').set, GetConfig: require('../lib/mcClient.js').get, call: require('../lib/mcClient.js').call } let getDDN = require('../lib/mcClient.js').getDDN function loadObjMMS(payload){ return new Promise((resolve, reject) => { caller.call('', '>svc/objc', 'obj://get', {}, payload).then(reply => { if (reply) { let result; if (typeof reply == 'object') result = reply; else result = reply[0]; if (Array.isArray(result)) result = result[0]; if(!result.Reply || result.Reply == ''){ reject(result); }else{ result = result.Reply; } if (result.ErrMsg != 'OK') { reject(result); } else if (result.ErrMsg == 'OK') { resolve(result); } } else { reject("Call objmms not response") } }).catch(err => { reject(err); }); }) } function loadFromXstore(config, msg, send, done){ let name = config.name; let type = config.types; let payload = { catalog: type, idname: name }; caller.GetConfig(payload).then((reply) => { let newMsg = Object.assign(msg, { hostDDN: getDDN(), name: name, payload: reply }) send([newMsg, null]) }).catch(err => send([null, err])) .finally(() => { if (done) done() }) } function objSaveXStorage(type, idname, blob) { //need to check let payload = { catalog: type, idname: idname, data: blob }; caller.SetConfig(payload).then((reply) => { if (reply) { let result; if (typeof reply == 'object') result = reply; else result = reply[0]; if (Array.isArray(result)) result = result[0]; if (result.ErrMsg != 'OK') { //reject(result.ErrMsg); } else if (result.ErrMsg == 'OK') { //resolve('OK') } } else { //reject('Call xstorage not response'); } }); } function ObjectStorage(config){ RED.nodes.createNode(this, config) var node = this node.on('input', (msg, send, done) => { try{ send = send || function() { node.send.apply(node, arguments) } let DDN = ">svc/objc"; let func = config.func let name = config.name; let type = config.types; let timeout = {"t1":6,"t2":15} if (!name) { throw 'name should not be empty !!!' } if (!func) { throw 'func should not be empty !!!' } if(func == 'xobj://get'){ //msg.payload loadObjMMS(msg.payload).then((reply)=>{ objSaveXStorage(type, name, msg.payload); let newMsg = Object.assign(msg, { hostDDN: getDDN(), name: name, payload: reply }) send([newMsg, null]) done() }).catch((err) => { console.log(err); loadFromXstore(config, msg, send, done); }); } else { let params = { type: type } let payload = {...params, ...msg.payload} caller.call('', DDN, 'obj://set', timeout, payload).then(reply => { let newMsg = Object.assign(msg, { hostDDN: getDDN(), name: name, payload: reply }) objSaveXStorage(type, name, payload); send([newMsg, null]) }).catch(err => { objSaveXStorage(type, name, payload); send([null, err]) }) .finally(() => { if (done) done() }) } }catch(err){ send([null, err]) } }) } RED.nodes.registerType("xobj", ObjectStorage) }