node-red-contrib-motechat
Version:
ultranet topic and payload communication
159 lines (140 loc) • 4.15 kB
JavaScript
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)
}