The answer was much simpler than i thought.. use the right tool for the right job. IE factory. This allows me to have a single connection/hub collection, and allowed me to inject the required services
Code
(function () {
'use strict';
angular.module('app').factory('signalrSvc', ['$rootScope', 'common', 'permissionSvc', 'filterFilter', signalrSvc]);
function signalrSvc($scope, common, permissionSvc, filterFilter) {
// assign placeholders. will be converted to actual hubs
var hubs = ['globalHub', 'dashboardHub'];
var connection = $.hubConnection(common.serviceUrl);
// convert hubNames to actual hub proxies, and append default client communication functions
angular.forEach(hubs, function (hub, idx) {
var proxy = connection.createHubProxy(hub);
// a minimum of one client function needs to be registered to be able to complete the connection
proxy.on('pingBack', function (data) { console.log(proxy.hubName + ", connected: " + data); });
proxy.subscribe = function (subscription, callback) {
proxy.off(subscription);
proxy.on(subscription,
function () {
var args = arguments;
$scope.$apply(function () {
callback.apply(proxy, args);
});
});
};
proxy.publish = function (target) {
if ($.signalR.connectionState.connected) {
connection.start({ transport: 'longPolling' })
.done(function () {
proxy.invoke(target);
});
}
};
proxy.refresh = function (target) {
if (target == undefined) {
proxy.publish('requestClientRefresh');
} else {
proxy.publish(target);
}
};
hubs[idx] = proxy;
});
// add security token before attmpting connect
permissionSvc.createPrefilter();
// connects and run initialise for each hub
connection.start({ transport: 'longPolling' })
.done(function () {
angular.forEach(hubs, function (hub) {
hub.invoke('initialise');
});
});
var publicFunctions = {
hub: function (name) {
return filterFilter(hubs, { hubName: name }, true)[0];
}
};
return publicFunctions;
};
})();