-
Notifications
You must be signed in to change notification settings - Fork 1
/
redlink.js
98 lines (82 loc) · 4.95 KB
/
redlink.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
module.exports = function (RED) {
"use strict";
const alasql = require('alasql');
const os = require('os');
const redlinkConsumer = require('./redlinkConsumer.js');
const redlinkProducer = require('./redlinkProducer.js');
const redlinkStore = require('./redlinkStore.js');
alasql.options.cache = false;
alasql.MAXSQLCACHESIZE = 0;
initTables();
registerNodeRedTypes();
initNodeRedRoutes();
function initTables() {
alasql('DROP TABLE IF EXISTS notify');
alasql('DROP TABLE IF EXISTS inMessages');
alasql('DROP TABLE IF EXISTS localStoreConsumers');
alasql('DROP TABLE IF EXISTS globalStoreConsumers');
alasql('DROP TABLE IF EXISTS stores');
alasql('DROP TABLE IF EXISTS replyMessages');
alasql('CREATE TABLE notify (storeName STRING, serviceName STRING, srcStoreName STRING, srcStoreAddress STRING, srcStorePort INT , redlinkMsgId STRING, notifySent STRING, read BOOLEAN, '+
'redlinkProducerId STRING, notifyPath STRING, notifyTime BIGINT, consumerId STRING, confirmed BOOLEAN, sendOnly BOOLEAN)');
alasql('CREATE TABLE inMessages (redlinkMsgId STRING, storeName STRING, serviceName STRING, message STRING, ' +
'read BOOLEAN, sendOnly BOOLEAN, redlinkProducerId STRING,preserved STRING, timestamp BIGINT, priority INT, ' +
'isLargeMessage BOOLEAN, lifetime INT, timeSinceNotify INT, enforceReversePath BOOLEAN, consumerId STRING)');
alasql('CREATE TABLE localStoreConsumers (storeName STRING, serviceName STRING, consumerId STRING, inTransitLimit INT)'); //can have multiple consumers with same name registered to the same store
alasql('CREATE TABLE globalStoreConsumers (localStoreName STRING, serviceName STRING, consumerId STRING, storeName STRING, direction STRING, storeAddress STRING, storePort INT, '+
'transitAddress STRING, transitPort INT, hopCount INT, ttl INT, ecm BIGINT, erm BIGINT, enm BIGINT)');
alasql('CREATE TABLE stores (storeName STRING, storeAddress STRING, storePort INT)');
alasql('CREATE TABLE replyMessages (storeName STRING, redlinkMsgId STRING, redlinkProducerId STRING, replyMessage STRING, read BOOLEAN, isLargeMessage BOOLEAN, cerror STRING)');
//log('created tables...');
}
function registerNodeRedTypes() {
//Store
redlinkStore.initRED(RED);
RED.nodes.registerType("redlink store", redlinkStore.RedLinkStore);
//Consumer
redlinkConsumer.initRED(RED);
RED.nodes.registerType("redlink consumer", redlinkConsumer.RedLinkConsumer);
//Producer
redlinkProducer.initRED(RED);
RED.nodes.registerType("redlink producer", redlinkProducer.RedLinkProducer);
}
function getMeshNames() {
const storesSql = 'SELECT storeName FROM stores';
const meshStores = alasql(storesSql); //will get a list of mesh:store
let meshNames = new Set();
meshStores.forEach(function (meshStore) {
const meshStorename = meshStore.storeName;
const meshName = meshStorename.indexOf(':') !== -1 ? meshStorename.substring(0, meshStorename.indexOf(':')) : '';//todo this shouldnt happen
if (meshName) { meshNames.add(meshName); }
});
//log('returning mesh names:', meshNames);
return Array.from(meshNames);
}
function initNodeRedRoutes() {
//express routes
RED.httpAdmin.get("/north-peers", (req, res) => { res.json(RED.settings.northPeers || []); });
RED.httpAdmin.get("/hostname", (req, res) => { res.json(os.hostname()); });
RED.httpAdmin.get("/mesh-names", (req, res) => { res.json(getMeshNames()); });
RED.httpAdmin.get("/all-store-names", (req, res) => {
const storesSql = 'SELECT DISTINCT storeName FROM stores';
res.json(alasql(storesSql).map(meshStore => meshStore.storeName));
});
RED.httpAdmin.get("/consumers", (req, res) => {
const store = req.query.store;
let responseJson = getLocalGlobalConsumers(store);
if (!store) { //shouldnt happen- nothing we can do
//log('no store selected for producer- not populating consumers ');
}
res.json(responseJson);
});
}
function getLocalGlobalConsumers(storeName) {
if (!storeName) { return {}; }
const globalConsumers = alasql(`SELECT distinct serviceName from ( select * from globalStoreConsumers WHERE localStoreName = "${storeName}") order by serviceName ASC`);
const allConsumers = [...new Set([...globalConsumers])];
let consumersArray = [];
consumersArray.push('msg.topic'); //for dynamically specifying destination consumer- specify in msg.topic
allConsumers.forEach(consumer => { consumersArray.push(consumer.serviceName); });
return consumersArray;
}
};