You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
5.2 KiB
138 lines
5.2 KiB
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(); |
|
} |
|
})(); |