UNPKG

@corpecca/qp-web-resources

Version:
132 lines (112 loc) 5.07 kB
var qp = qp || {}; (function () { // Check if SignalR is defined if (!signalR) { return; } // Create namespaces qp.signalr = qp.signalr || {}; qp.signalr.hubs = qp.signalr.hubs || {}; qp.signalr.reconnectTime = qp.signalr.reconnectTime || 5000; qp.signalr.maxTries = qp.signalr.maxTries || 8; qp.signalr.increaseReconnectTime = qp.signalr.increaseReconnectTime || function (time) { return time * 2; }; // Configure the connection for qp.signalr.hubs.common function configureConnection(connection) { // Set the common hub qp.signalr.hubs.common = connection; let tries = 1; let reconnectTime = qp.signalr.reconnectTime; // Reconnect loop function tryReconnect() { if (tries > qp.signalr.maxTries) { return; } else { connection.start() .then(() => { reconnectTime = qp.signalr.reconnectTime; tries = 1; console.log('Reconnected to SignalR server!'); }).catch(() => { tries += 1; reconnectTime = qp.signalr.increaseReconnectTime(reconnectTime); setTimeout(() => tryReconnect(), reconnectTime); }); } } // Reconnect if hub disconnects connection.onclose(function (e) { if (e) { qp.log.debug('Connection closed with error: ' + e); } else { qp.log.debug('Disconnected'); } if (!qp.signalr.autoReconnect) { return; } tryReconnect(); }); // Register to get notifications connection.on('getNotification', function (notification) { qp.event.trigger('qp.notifications.received', notification); }); } // Connect to the server for qp.signalr.hubs.common function connect() { var url = qp.signalr.url || (qp.appPath + 'signalr'); // Start the connection startConnection(url, configureConnection) .then(function (connection) { qp.log.debug('Connected to SignalR server!'); //TODO: Remove log qp.event.trigger('qp.signalr.connected'); // Call the Register method on the hub connection.invoke('register').then(function () { qp.log.debug('Registered to the SignalR server!'); //TODO: Remove log }); }) .catch(function (error) { qp.log.debug(error.message); }); } // Starts a connection with transport fallback - if the connection cannot be started using // the webSockets transport the function will fallback to the serverSentEvents transport and // if this does not work it will try longPolling. If the connection cannot be started using // any of the available transports the function will return a rejected Promise. function startConnection(url, configureConnection) { if (qp.signalr.remoteServiceBaseUrl) { url = qp.signalr.remoteServiceBaseUrl + url; } // Add query string: https://github.com/aspnet/SignalR/issues/680 if (qp.signalr.qs) { url += (url.indexOf('?') == -1 ? '?' : '&') + qp.signalr.qs; } return function start(transport) { qp.log.debug('Starting connection using ' + signalR.HttpTransportType[transport] + ' transport'); var connection = new signalR.HubConnectionBuilder() .withUrl(url, transport) .build(); if (configureConnection && typeof configureConnection === 'function') { configureConnection(connection); } return connection.start() .then(function () { return connection; }) .catch(function (error) { qp.log.debug('Cannot start the connection using ' + signalR.HttpTransportType[transport] + ' transport. ' + error.message); if (transport !== signalR.HttpTransportType.LongPolling) { return start(transport + 1); } return Promise.reject(error); }); }(signalR.HttpTransportType.WebSockets); } qp.signalr.autoConnect = qp.signalr.autoConnect === undefined ? true : qp.signalr.autoConnect; qp.signalr.autoReconnect = qp.signalr.autoReconnect === undefined ? true : qp.signalr.autoReconnect; qp.signalr.connect = qp.signalr.connect || connect; qp.signalr.startConnection = qp.signalr.startConnection || startConnection; if (qp.signalr.autoConnect && !qp.signalr.hubs.common) { qp.signalr.connect(); } })();