ngx-signalr
Version:
angular2 signalr library
790 lines (771 loc) • 24.7 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs/Subject'), require('@angular/core')) :
typeof define === 'function' && define.amd ? define(['exports', 'rxjs/Subject', '@angular/core'], factory) :
(factory((global.ng = global.ng || {}, global.ng['ngx-signalr'] = global.ng['ngx-signalr'] || {}),global.rxjs_Subject,global.ng.core));
}(this, (function (exports,rxjs_Subject,_angular_core) { 'use strict';
var __extends = (undefined && undefined.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var BroadcastEventListener = (function (_super) {
__extends(BroadcastEventListener, _super);
/**
* @param {?} event
*/
function BroadcastEventListener(event) {
_super.call(this);
this.event = event;
if (event == null || event === '') {
throw new Error('Failed to create BroadcastEventListener. Argument \'event\' can not be empty');
}
}
return BroadcastEventListener;
}(rxjs_Subject.Subject));
var SignalRConnectionMock = (function () {
/**
* @param {?} _mockErrors$
* @param {?} _mockStatus$
* @param {?} _listeners
*/
function SignalRConnectionMock(_mockErrors$, _mockStatus$, _listeners) {
this._mockErrors$ = _mockErrors$;
this._mockStatus$ = _mockStatus$;
this._listeners = _listeners;
}
Object.defineProperty(SignalRConnectionMock.prototype, "errors", {
/**
* @return {?}
*/
get: function () {
return this._mockErrors$;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SignalRConnectionMock.prototype, "status", {
/**
* @return {?}
*/
get: function () {
return this._mockStatus$;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SignalRConnectionMock.prototype, "id", {
/**
* @return {?}
*/
get: function () {
return 'xxxxxxxx-xxxx-xxxx-xxxxxxxxx';
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
SignalRConnectionMock.prototype.stop = function () {
};
/**
* @return {?}
*/
SignalRConnectionMock.prototype.start = function () {
return Promise.resolve(null); // TODO: implement
};
/**
* @param {?} method
* @param {...?} parameters
* @return {?}
*/
SignalRConnectionMock.prototype.invoke = function (method) {
var parameters = [];
for (var _i = 1; _i < arguments.length; _i++) {
parameters[_i - 1] = arguments[_i];
}
return Promise.resolve(null);
};
/**
* @param {?} listener
* @return {?}
*/
SignalRConnectionMock.prototype.listen = function (listener) {
this._listeners[listener.event] = listener;
};
/**
* @param {?} event
* @return {?}
*/
SignalRConnectionMock.prototype.listenFor = function (event) {
var /** @type {?} */ listener = new BroadcastEventListener(event);
this.listen(listener);
return listener;
};
return SignalRConnectionMock;
}());
var SignalRConnectionMockManager = (function () {
function SignalRConnectionMockManager() {
this._errors$ = new rxjs_Subject.Subject();
this._status$ = new rxjs_Subject.Subject();
this._listeners = {};
this._object = new SignalRConnectionMock(this._errors$, this._status$, this._listeners);
}
Object.defineProperty(SignalRConnectionMockManager.prototype, "mock", {
/**
* @return {?}
*/
get: function () {
return this._object;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SignalRConnectionMockManager.prototype, "errors$", {
/**
* @return {?}
*/
get: function () {
return this._errors$;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SignalRConnectionMockManager.prototype, "status$", {
/**
* @return {?}
*/
get: function () {
return this._status$;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SignalRConnectionMockManager.prototype, "listeners", {
/**
* @return {?}
*/
get: function () {
return this._listeners;
},
enumerable: true,
configurable: true
});
return SignalRConnectionMockManager;
}());
var ConnectionStatus = (function () {
/**
* @param {?} value
*/
function ConnectionStatus(value) {
if (value == null || value < 0) {
throw new Error("Failed to create ConnectionStatus. Argument 'name' can not be null or empty.");
}
this._value = value;
}
Object.defineProperty(ConnectionStatus.prototype, "value", {
/**
* @return {?}
*/
get: function () {
return this._value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConnectionStatus.prototype, "name", {
/**
* @return {?}
*/
get: function () {
return ConnectionStatus.names[Number.parseInt(this._value.toString())];
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
ConnectionStatus.prototype.toString = function () {
return this.name;
};
/**
* @param {?} other
* @return {?}
*/
ConnectionStatus.prototype.equals = function (other) {
if (other == null) {
return false;
}
return this._value === other.value;
};
ConnectionStatus.names = ['connecting', 'connected', 'reconnecting', '', 'disconnected'];
return ConnectionStatus;
}());
var ConnectionStatuses = (function () {
function ConnectionStatuses() {
}
Object.defineProperty(ConnectionStatuses, "connecting", {
/**
* @return {?}
*/
get: function () {
return ConnectionStatuses.statuses[0];
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConnectionStatuses, "connected", {
/**
* @return {?}
*/
get: function () {
return ConnectionStatuses.statuses[1];
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConnectionStatuses, "reconnecting", {
/**
* @return {?}
*/
get: function () {
return ConnectionStatuses.statuses[2];
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConnectionStatuses, "disconnected", {
/**
* @return {?}
*/
get: function () {
return ConnectionStatuses.statuses[3];
},
enumerable: true,
configurable: true
});
ConnectionStatuses.statuses = [
new ConnectionStatus(0),
new ConnectionStatus(1),
new ConnectionStatus(2),
new ConnectionStatus(4)
];
return ConnectionStatuses;
}());
var SignalRConnection = (function () {
/**
* @param {?} jConnection
* @param {?} jProxy
* @param {?} zone
* @param {?} configuration
*/
function SignalRConnection(jConnection, jProxy, zone, configuration) {
this._jProxy = jProxy;
this._jConnection = jConnection;
this._zone = zone;
this._errors = this.wireUpErrorsAsObservable();
this._status = this.wireUpStatusEventsAsObservable();
this._configuration = configuration;
}
Object.defineProperty(SignalRConnection.prototype, "errors", {
/**
* @return {?}
*/
get: function () {
return this._errors;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SignalRConnection.prototype, "status", {
/**
* @return {?}
*/
get: function () {
return this._status;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
SignalRConnection.prototype.start = function () {
var _this = this;
var /** @type {?} */ jTransports = this.convertTransports(this._configuration.transport);
var /** @type {?} */ $promise = new Promise(function (resolve, reject) {
_this._jConnection
.start({
jsonp: _this._configuration.jsonp,
transport: jTransports,
withCredentials: _this._configuration.withCredentials,
})
.done(function () {
console.log('Connection established, ID: ' + _this._jConnection.id);
console.log('Connection established, Transport: ' + _this._jConnection.transport.name);
resolve(_this);
})
.fail(function (error) {
console.log('Could not connect');
reject('Failed to connect. Error: ' + error.message); // ex: Error during negotiation request.
});
});
return $promise;
};
/**
* @return {?}
*/
SignalRConnection.prototype.stop = function () {
this._jConnection.stop();
};
Object.defineProperty(SignalRConnection.prototype, "id", {
/**
* @return {?}
*/
get: function () {
return this._jConnection.id;
},
enumerable: true,
configurable: true
});
/**
* @param {?} method
* @param {...?} parameters
* @return {?}
*/
SignalRConnection.prototype.invoke = function (method) {
var _this = this;
var parameters = [];
for (var _i = 1; _i < arguments.length; _i++) {
parameters[_i - 1] = arguments[_i];
}
if (method == null) {
throw new Error('SignalRConnection: Failed to invoke. Argument \'method\' can not be null');
}
this.log("SignalRConnection. Start invoking '" + method + "'...");
var /** @type {?} */ $promise = new Promise(function (resolve, reject) {
(_a = _this._jProxy).invoke.apply(_a, [method].concat(parameters))
.done(function (result) {
_this.log("'" + method + "' invoked succesfully. Resolving promise...");
resolve(result);
_this.log("Promise resolved.");
})
.fail(function (err) {
console.log("Invoking '" + method + "' failed. Rejecting promise...");
reject(err);
console.log("Promise rejected.");
});
var _a;
});
return $promise;
};
/**
* @param {?} listener
* @return {?}
*/
SignalRConnection.prototype.listen = function (listener) {
var _this = this;
if (listener == null) {
throw new Error('Failed to listen. Argument \'listener\' can not be null');
}
this.log("SignalRConnection: Starting to listen to server event with name " + listener.event);
this._jProxy.on(listener.event, function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i - 0] = arguments[_i];
}
_this._zone.run(function () {
var /** @type {?} */ casted = null;
if (args.length > 0) {
casted = (args[0]);
}
_this.log('SignalRConnection.proxy.on invoked. Calling listener next() ...');
listener.next(casted);
_this.log('listener next() called.');
});
});
};
/**
* @param {?} event
* @return {?}
*/
SignalRConnection.prototype.listenFor = function (event) {
if (event == null || event === '') {
throw new Error('Failed to listen. Argument \'event\' can not be empty');
}
var /** @type {?} */ listener = new BroadcastEventListener(event);
this.listen(listener);
return listener;
};
/**
* @param {?} transports
* @return {?}
*/
SignalRConnection.prototype.convertTransports = function (transports) {
if (transports instanceof Array) {
return transports.map(function (t) { return t.name; });
}
return transports.name;
};
/**
* @return {?}
*/
SignalRConnection.prototype.wireUpErrorsAsObservable = function () {
var /** @type {?} */ sError = new rxjs_Subject.Subject();
this._jConnection.error(function (error) {
//this._zone.run(() => { /*errors don't need to run in a zone*/
sError.next(error);
//});
});
return sError;
};
/**
* @return {?}
*/
SignalRConnection.prototype.wireUpStatusEventsAsObservable = function () {
var _this = this;
var /** @type {?} */ sStatus = new rxjs_Subject.Subject();
// aggregate all signalr connection status handlers into 1 observable.
// handler wire up, for signalr connection status callback.
this._jConnection.stateChanged(function (change) {
_this._zone.run(function () {
sStatus.next(new ConnectionStatus(change.newState));
});
});
return sStatus;
};
/**
* @param {?} listener
* @param {...?} args
* @return {?}
*/
SignalRConnection.prototype.onBroadcastEventReceived = function (listener) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
this.log('SignalRConnection.proxy.on invoked. Calling listener next() ...');
var /** @type {?} */ casted = null;
if (args.length > 0) {
casted = (args[0]);
}
this._zone.run(function () {
listener.next(casted);
});
this.log('listener next() called.');
};
/**
* @param {...?} args
* @return {?}
*/
SignalRConnection.prototype.log = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i - 0] = arguments[_i];
}
if (this._jConnection.logging === false) {
return;
}
console.log(args.join(', '));
};
return SignalRConnection;
}());
var ConnectionTransport = (function () {
/**
* @param {?} name
*/
function ConnectionTransport(name) {
if (name == null || name === "") {
throw new Error("Failed to create ConnectionTransport. Argument 'name' can not be null or empty.");
}
this._name = name;
}
Object.defineProperty(ConnectionTransport.prototype, "name", {
/**
* @return {?}
*/
get: function () {
return this._name;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
ConnectionTransport.prototype.toString = function () {
return this._name;
};
/**
* @param {?} other
* @return {?}
*/
ConnectionTransport.prototype.equals = function (other) {
if (other == null) {
return false;
}
return this._name === other.name;
};
return ConnectionTransport;
}());
var ConnectionTransports = (function () {
function ConnectionTransports() {
}
Object.defineProperty(ConnectionTransports, "foreverFrame", {
/**
* @return {?}
*/
get: function () {
return ConnectionTransports.transports[0];
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConnectionTransports, "longPolling", {
/**
* @return {?}
*/
get: function () {
return ConnectionTransports.transports[1];
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConnectionTransports, "serverSentEvents", {
/**
* @return {?}
*/
get: function () {
return ConnectionTransports.transports[2];
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConnectionTransports, "webSockets", {
/**
* @return {?}
*/
get: function () {
return ConnectionTransports.transports[3];
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConnectionTransports, "auto", {
/**
* @return {?}
*/
get: function () {
return ConnectionTransports.transports[4];
},
enumerable: true,
configurable: true
});
ConnectionTransports.transports = [
new ConnectionTransport("foreverFrame"),
new ConnectionTransport("longPolling"),
new ConnectionTransport("serverSentEvents"),
new ConnectionTransport("webSockets"),
new ConnectionTransport("auto"),
];
return ConnectionTransports;
}());
var SignalRConfiguration = (function () {
function SignalRConfiguration() {
this.hubName = null;
this.logging = false;
this.qs = null;
this.url = null;
this.jsonp = false;
this.withCredentials = false;
this.transport = ConnectionTransports.auto;
}
return SignalRConfiguration;
}());
var SIGNALR_CONFIGURATION = new _angular_core.OpaqueToken('SIGNALR_CONFIGURATION');
var SIGNALR_JCONNECTION_TOKEN = new _angular_core.OpaqueToken('SIGNALR_JCONNECTION_TOKEN');
/**
* @param {?} configuration
* @param {?} zone
* @return {?}
*/
/**
* @return {?}
*/
var SignalR = (function () {
/**
* @param {?} configuration
* @param {?} zone
* @param {?} jHubConnectionFn
*/
function SignalR(configuration, zone, jHubConnectionFn) {
this._configuration = configuration;
this._zone = zone;
this._jHubConnectionFn = jHubConnectionFn;
}
/**
* @param {?} conf
* @return {?}
*/
SignalR.prototype.setConfiguration = function (conf) {
this._configuration = conf;
};
/**
* @param {?=} options
* @return {?}
*/
SignalR.prototype.createConnection = function (options) {
var /** @type {?} */ status;
var /** @type {?} */ configuration = this.merge(options ? options : {});
try {
var /** @type {?} */ serializedQs = JSON.stringify(configuration.qs);
var /** @type {?} */ serializedTransport = JSON.stringify(configuration.transport);
if (configuration.logging) {
console.log("Creating connecting with...");
console.log("configuration:[url: '" + configuration.url + "'] ...");
console.log("configuration:[hubName: '" + configuration.hubName + "'] ...");
console.log("configuration:[qs: '" + serializedQs + "'] ...");
console.log("configuration:[transport: '" + serializedTransport + "'] ...");
}
}
catch (err) { }
// create connection object
var /** @type {?} */ jConnection = this._jHubConnectionFn(configuration.url);
jConnection.logging = configuration.logging;
jConnection.qs = configuration.qs;
// create a proxy
var /** @type {?} */ jProxy = jConnection.createHubProxy(configuration.hubName);
// !!! important. We need to register at least one function otherwise server callbacks will not work.
jProxy.on('noOp', function () { });
var /** @type {?} */ hubConnection = new SignalRConnection(jConnection, jProxy, this._zone, configuration);
return hubConnection;
};
/**
* @param {?=} options
* @return {?}
*/
SignalR.prototype.connect = function (options) {
return this.createConnection(options).start();
};
/**
* @param {?} overrides
* @return {?}
*/
SignalR.prototype.merge = function (overrides) {
var /** @type {?} */ merged = new SignalRConfiguration();
merged.hubName = overrides.hubName || this._configuration.hubName;
merged.url = overrides.url || this._configuration.url;
merged.qs = overrides.qs || this._configuration.qs;
merged.logging = this._configuration.logging;
merged.jsonp = overrides.jsonp || this._configuration.jsonp;
merged.withCredentials = overrides.withCredentials || this._configuration.withCredentials;
merged.transport = overrides.transport || this._configuration.transport;
return merged;
};
SignalR.decorators = [
{ type: _angular_core.Injectable },
];
/** @nocollapse */
SignalR.ctorParameters = function () { return [
{ type: SignalRConfiguration, },
{ type: _angular_core.NgZone, },
{ type: Function, decorators: [{ type: _angular_core.Inject, args: [SIGNALR_JCONNECTION_TOKEN,] },] },
]; };
return SignalR;
}());
var SIGNALR_CONFIGURATION$1 = new _angular_core.OpaqueToken('SIGNALR_CONFIGURATION');
/**
* @param {?} configuration
* @param {?} zone
* @return {?}
*/
function createSignalr$1(configuration, zone) {
var /** @type {?} */ jConnectionFn = getJConnectionFn$1();
return new SignalR(configuration, zone, jConnectionFn);
}
/**
* @return {?}
*/
function getJConnectionFn$1() {
var /** @type {?} */ jQuery = getJquery$1();
var /** @type {?} */ hubConnectionFn = ((window)).jQuery.hubConnection;
if (hubConnectionFn == null) {
throw new Error('Signalr failed to initialize. Script \'jquery.signalR.js\' is missing. Please make sure to include \'jquery.signalR.js\' script.');
}
return hubConnectionFn;
}
/**
* @return {?}
*/
function getJquery$1() {
var /** @type {?} */ jQuery = ((window)).jQuery;
if (jQuery == null) {
throw new Error('Signalr failed to initialize. Script \'jquery.js\' is missing. Please make sure to include jquery script.');
}
return jQuery;
}
var SignalRModule$1 = (function () {
function SignalRModule() {
}
/**
* @param {?} getSignalRConfiguration
* @return {?}
*/
SignalRModule.forRoot = function (getSignalRConfiguration) {
return {
ngModule: SignalRModule,
providers: [
{
provide: SIGNALR_CONFIGURATION$1,
useFactory: getSignalRConfiguration
},
{
deps: [SIGNALR_CONFIGURATION$1, _angular_core.NgZone],
provide: SignalR,
useFactory: (createSignalr$1)
}
],
};
};
/**
* @return {?}
*/
SignalRModule.forChild = function () {
throw new Error("forChild method not implemented");
};
SignalRModule.decorators = [
{ type: _angular_core.NgModule, args: [{
providers: [{
provide: SignalR,
useValue: SignalR
}]
},] },
];
/** @nocollapse */
SignalRModule.ctorParameters = function () { return []; };
return SignalRModule;
}());
/**
* Angular library starter.
* Build a library compatible with Angular, AoT compilation & Tree shaking.
* Written by Roberto Simonetti.
* MIT license.
* https://github.com/robisim74/ngx-signalr
*/
/**
* Entry point for all public APIs of the package.
*/
exports.SignalRConnectionMock = SignalRConnectionMock;
exports.SignalRConnectionMockManager = SignalRConnectionMockManager;
exports.ConnectionStatus = ConnectionStatus;
exports.ConnectionStatuses = ConnectionStatuses;
exports.BroadcastEventListener = BroadcastEventListener;
exports.SignalRConnection = SignalRConnection;
exports.ConnectionTransport = ConnectionTransport;
exports.ConnectionTransports = ConnectionTransports;
exports.SignalR = SignalR;
exports.SignalRConfiguration = SignalRConfiguration;
exports.SignalRModule = SignalRModule$1;
Object.defineProperty(exports, '__esModule', { value: true });
})));