|
|
|
var abp = abp || {};
|
|
|
|
(function () {
|
|
|
|
|
|
|
|
// Check if SignalR is defined
|
|
|
|
if (!signalR) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create namespaces
|
|
|
|
abp.signalr = abp.signalr || {};
|
|
|
|
abp.signalr.hubs = abp.signalr.hubs || {};
|
|
|
|
abp.signalr.reconnectTime = abp.signalr.reconnectTime || 5000;
|
|
|
|
abp.signalr.maxTries = abp.signalr.maxTries || 8;
|
|
|
|
abp.signalr.increaseReconnectTime = abp.signalr.increaseReconnectTime || function (time) {
|
|
|
|
return time * 2;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Configure the connection for abp.signalr.hubs.common
|
|
|
|
function configureConnection(connection) {
|
|
|
|
// Set the common hub
|
|
|
|
abp.signalr.hubs.common = connection;
|
|
|
|
|
|
|
|
let tries = 1;
|
|
|
|
let reconnectTime = abp.signalr.reconnectTime;
|
|
|
|
|
|
|
|
// Reconnect loop
|
|
|
|
function tryReconnect() {
|
|
|
|
if (tries <= abp.signalr.maxTries) {
|
|
|
|
connection.start()
|
|
|
|
.then(function () {
|
|
|
|
reconnectTime = abp.signalr.reconnectTime;
|
|
|
|
tries = 1;
|
|
|
|
console.log('Reconnected to SignalR server!');
|
|
|
|
abp.event.trigger('abp.signalr.reconnected');
|
|
|
|
}).catch(function () {
|
|
|
|
tries += 1;
|
|
|
|
reconnectTime = abp.signalr.increaseReconnectTime(reconnectTime);
|
|
|
|
setTimeout(function () {
|
|
|
|
tryReconnect()
|
|
|
|
},
|
|
|
|
reconnectTime
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Reconnect if hub disconnects
|
|
|
|
connection.onclose(function (e) {
|
|
|
|
if (e) {
|
|
|
|
abp.log.debug('Connection closed with error: ' + e);
|
|
|
|
} else {
|
|
|
|
abp.log.debug('Disconnected');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!abp.signalr.autoReconnect) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
abp.event.trigger('abp.signalr.disconnected');
|
|
|
|
tryReconnect();
|
|
|
|
});
|
|
|
|
|
|
|
|
// Register to get notifications
|
|
|
|
connection.on('getNotification', function (notification) {
|
|
|
|
abp.event.trigger('abp.notifications.received', notification);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// Connect to the server for abp.signalr.hubs.common
|
|
|
|
function connect() {
|
|
|
|
var url = abp.signalr.url || (abp.appPath + 'signalr');
|
|
|
|
|
|
|
|
// Start the connection
|
|
|
|
startConnection(url, configureConnection)
|
|
|
|
.then(function (connection) {
|
|
|
|
abp.log.debug('Connected to SignalR server!'); //TODO: Remove log
|
|
|
|
abp.event.trigger('abp.signalr.connected');
|
|
|
|
// Call the Register method on the hub
|
|
|
|
connection.invoke('register').then(function () {
|
|
|
|
abp.log.debug('Registered to the SignalR server!'); //TODO: Remove log
|
|
|
|
});
|
|
|
|
})
|
|
|
|
.catch(function (error) {
|
|
|
|
abp.log.debug(error.message);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
abp.signalr.disconnect = function() {
|
|
|
|
abp.signalr.autoReconnect = false
|
|
|
|
abp.signalr.hubs.common.stop()
|
|
|
|
};
|
|
|
|
// 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 (abp.signalr.remoteServiceBaseUrl) {
|
|
|
|
url = abp.signalr.remoteServiceBaseUrl + url;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add query string: https://github.com/aspnet/SignalR/issues/680
|
|
|
|
if (abp.signalr.qs) {
|
|
|
|
url += (url.indexOf('?') == -1 ? '?' : '&') + abp.signalr.qs;
|
|
|
|
}
|
|
|
|
|
|
|
|
return function start(transport) {
|
|
|
|
abp.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) {
|
|
|
|
abp.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);
|
|
|
|
}
|
|
|
|
|
|
|
|
abp.signalr.autoConnect = abp.signalr.autoConnect === undefined ? true : abp.signalr.autoConnect;
|
|
|
|
abp.signalr.autoReconnect = abp.signalr.autoReconnect === undefined ? true : abp.signalr.autoReconnect;
|
|
|
|
abp.signalr.connect = abp.signalr.connect || connect;
|
|
|
|
abp.signalr.startConnection = abp.signalr.startConnection || startConnection;
|
|
|
|
|
|
|
|
if (abp.signalr.autoConnect && !abp.signalr.hubs.common) {
|
|
|
|
abp.signalr.connect();
|
|
|
|
}
|
|
|
|
})();
|