UNPKG

@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
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 }; }}