@autocodingsystems/gateway-client
Version:
Library and commandline utility to control the acs gateway - device drivers for the most common industrial production line devices
119 lines (99 loc) • 3.72 kB
JavaScript
var signalR = require('signalr-client');
var http = require('http');
module.exports = function wrap(gateway) { return function makeSignalRConnection(subscriptions, onconnection, onevent, onerror) {
var active = true;
var client = new signalR.client(
gateway + "/signalR", //signalR service URL
['deviceNotificationHub'], // array of hubs to be supported in the connection
10, //optional: retry timeout in seconds (default: 10)
true //optional: doNotStart default false
);
client.on(
'deviceNotificationHub', // Hub Name (case insensitive)
'eventOccured', // Method Name (case insensitive)
function(deviceId, timestamp, eventClass, event, subKey, message) { // Callback function with parameters matching call from hub
if (!active) {
client.end();
return;
}
var payloadMsg = message;
try {
payloadMsg = JSON.parse(message);
} catch(e) {
}
var tag = subscriptions.filter(s => s.subscription == subKey)[0].tag;
onevent({
gateway,
deviceId,
timestamp,
eventClass,
event,
subKey,
tag,
message: payloadMsg
})
}
);
client.serviceHandlers = { //Yep, I even added the merge syntax here.
bound: function() { },
connectFailed: function(error) { onError('Connect Failed', error); },
connected: onConnected,
disconnected: onDisconnected,
reconnected: onConnected,
onerror: function (error) { onError('Error', error); },
messageReceived: function (message) { return false; },
bindingError: function (error) { onError('Binding Error', error); },
connectionLost: onDisconnected,
reconnecting: function (retry /* { inital: true/false, count: 0} */) {
return !active;
},
};
client.serviceHandlers.onUnauthorized = function (res) {
//Do your Login Request
var location = res.headers.location;
var result = http.get(location, function (loginResult) {
//Copy "set-cookie" to "client.header.cookie" for future requests
client.headers.cookie = loginResult.headers['set-cookie'];
});
}
function onConnected() {
if (!active) {
client.end();
}
var tags = subscriptions.map(s => s.tag);
onconnection({
status: true,
tags: tags
});
subscriptions.forEach(subscription => {
client.invoke(
'deviceNotificationHub', // Hub Name (case insensitive)
'Subscribe', // Method Name (case insensitive)
subscription.subscription //additional parameters to match called signature
);
});
}
function onDisconnected() {
var tags = subscriptions.map(s => s.tag);
onconnection({
status: false,
tags: tags
});
}
function onError(errorType, error) {
var tags = subscriptions.map(s => s.tag);
onerror({
type: errorType,
error: error,
tags: tags
});
}
client.start();
function stop() {
active = false;
client.end();
}
return {
stop
};
}}