-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmelview-connection.js
113 lines (93 loc) · 3.55 KB
/
melview-connection.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
const Mutex = require('async-mutex').Mutex;
const NodeCache = require("node-cache");
const fetchingUnitsLock = new Mutex();
const nodeCache = new NodeCache();
module.exports = function (RED) {
const request = require('request');
function MelviewConnectionNode(config) {
RED.nodes.createNode(this, config);
this.melviewEndpoint = config.melviewEndpoint;
this.appVersion = config.appVersion;
this.username = config.username;
const nodeContext = this.context();
const credentials = this.credentials;
const node = this;
this.getAuthCookie = function (callback) {
let authCookie = nodeContext.get('authCookie');
if (typeof authCookie != 'undefined') {
callback(authCookie);
return;
}
const postData = JSON.stringify({
'user': config.username,
'pass': credentials.password,
'appversion': config.appVersion
});
const options = {
'method': 'POST',
'url': 'https://' + config.melviewEndpoint + '/api/login.aspx',
'headers': {
'Content-Type': 'application/json; charset=utf-8',
'User-Agent': 'request',
'Content-Length': postData.length
},
body: postData
};
request(options, function (error, response) {
if (error) throw new Error(error);
nodeContext.set('authCookie', response.headers['set-cookie']);
callback(response.headers['set-cookie']);
});
};
this.GetUnits = async function (callback) {
let buildings = nodeCache.get("buildings");
if (buildings !== undefined) {
callback(buildings);
return;
}
const release = await fetchingUnitsLock.acquire();
buildings = nodeCache.get("buildings");
if (buildings !== undefined) {
release();
callback(buildings);
return;
}
node.getAuthCookie(function (authCookie) {
const options = {
'method': 'POST',
'url': `https://${config.melviewEndpoint}/api/rooms.aspx`,
'headers': {
'Content-Type': 'application/json; charset=utf-8',
'User-Agent': 'request',
'Cookie': authCookie
}
};
request(options, function (error, response) {
let buildings;
try {
buildings = JSON.parse(response.body);
nodeCache.set("buildings", buildings, 10);
release();
callback(buildings);
} catch (e) {
release();
node.error(`error: ${e.message}`);
}
});
});
};
this.log(`starting endpoint: /melview/${node.id}/rooms`);
RED.httpAdmin.get(`/melview/${node.id}/rooms`, function (req, res) {
node.GetUnits(function (response) {
res.send(response);
});
});
}
RED.nodes.registerType('melview-connection',
MelviewConnectionNode,
{
credentials: {
password: {type: 'password'}
}
});
};