@corpecca/qp-web-resources
Version:
Qp web resources
132 lines (112 loc) • 5.07 kB
JavaScript
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();
}
})();