ng4-signalr
Version:
angular4 signalr library
155 lines (152 loc) • 21.8 kB
JavaScript
import { Subject } from 'rxjs';
import { BroadcastEventListener } from '../eventing/broadcast.event.listener';
import { ConnectionStatus } from './connection.status';
export class SignalRConnection {
constructor(jConnection, jProxies, zone, configuration) {
this._jProxies = jProxies;
this._defaultProxy = jProxies.values().next().value;
this._jConnection = jConnection;
this._zone = zone;
this._errors = this.wireUpErrorsAsObservable();
this._status = this.wireUpStatusEventsAsObservable();
this._configuration = configuration;
}
get errors() {
return this._errors;
}
get status() {
return this._status;
}
setQs(qs) {
this._jConnection.qs = qs;
}
getQs() {
return this._jConnection.qs;
}
start() {
console.log('Starting connection', this._jConnection);
const jTransports = this.convertTransports(this._configuration.transport);
const $promise = new Promise((resolve, reject) => {
this._jConnection
.start({
jsonp: this._configuration.jsonp,
transport: jTransports,
withCredentials: this._configuration.withCredentials,
})
.done(() => {
console.log('Connection established, ID: ' + this._jConnection.id);
console.log('Connection established, Transport: ' + this._jConnection.transport.name);
resolve(this);
})
.fail((error) => {
console.log('Could not connect');
reject('Failed to connect. Error: ' + error.message); // ex: Error during negotiation request.
});
});
return $promise;
}
stop() {
console.log('Stopping connection', this._jConnection);
this._jConnection.stop();
}
get id() {
return this._jConnection.id;
}
invoke(method, sproxy, ...parameters) {
if (method == null) {
throw new Error('SignalRConnection: Failed to invoke. Argument \'method\' can not be null');
}
this.log(`SignalRConnection. Start invoking \'${method}\'...`);
const $promise = new Promise((resolve, reject) => {
this.getCurrentProxy(sproxy).invoke(method, ...parameters)
.done((result) => {
this.log(`\'${method}\' invoked succesfully. Resolving promise...`);
resolve(result);
this.log(`Promise resolved.`);
})
.fail((err) => {
console.log(`Invoking \'${method}\' failed. Rejecting promise...`);
reject(err);
console.log(`Promise rejected.`);
});
});
return $promise;
}
listen(listener, sproxy) {
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.getCurrentProxy(sproxy).on(listener.event, (...args) => {
this._zone.run(() => {
let 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.');
}
});
});
}
listenFor(event, sproxy) {
if (event == null || event === '') {
throw new Error('Failed to listen. Argument \'event\' can not be empty');
}
const listener = new BroadcastEventListener(event);
this.listen(listener, sproxy);
return listener;
}
getCurrentProxy(sproxy) {
if (!sproxy) {
return this._defaultProxy;
}
else {
return this._jProxies.get(sproxy);
}
}
convertTransports(transports) {
if (transports instanceof Array) {
return transports.map((t) => t.name);
}
return transports.name;
}
wireUpErrorsAsObservable() {
const sError = new Subject();
this._jConnection.error((error) => {
// this._zone.run(() => { /*errors don't need to run in a zone*/
sError.next(error);
// });
});
return sError;
}
wireUpStatusEventsAsObservable() {
const sStatus = new Subject();
// aggregate all signalr connection status handlers into 1 observable.
// handler wire up, for signalr connection status callback.
this._jConnection.stateChanged((change) => {
this._zone.run(() => {
sStatus.next(new ConnectionStatus(change.newState));
});
});
return sStatus.asObservable();
}
/*private onBroadcastEventReceived<T>(listener: BroadcastEventListener<T>, ...args: any[]) {
this.log('SignalRConnection.proxy.on invoked. Calling listener next() ...');
let casted: T = null;
if (args.length > 0) {
casted = (args[0] as T);
}
this._zone.run(() => {
listener.next(casted);
});
this.log('listener next() called.');
}*/
log(...args) {
if (this._jConnection.logging === false) {
return;
}
console.log(args.join(', '));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsci5jb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2Nvbm5lY3Rpb24vc2lnbmFsci5jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFLdkQsTUFBTSxPQUFPLGlCQUFpQjtJQVUxQixZQUFZLFdBQWdCLEVBQUUsUUFBMEIsRUFBRSxJQUFZLEVBQUUsYUFBbUM7UUFDdkcsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxFQUFPO1FBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ00sS0FBSztRQUNSLE9B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O09BYUc7SUFFSyxHQUFHLENBQUMsR0FBRyxJQUFXO1FBQ3RCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFO1lBQ3JDLE9BQU87U0FDVjtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElTaWduYWxSQ29ubmVjdGlvbiB9IGZyb20gJy4vaS5zaWduYWxyLmNvbm5lY3Rpb24nO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEJyb2FkY2FzdEV2ZW50TGlzdGVuZXIgfSBmcm9tICcuLi9ldmVudGluZy9icm9hZGNhc3QuZXZlbnQubGlzdGVuZXInO1xyXG5pbXBvcnQgeyBDb25uZWN0aW9uU3RhdHVzIH0gZnJvbSAnLi9jb25uZWN0aW9uLnN0YXR1cyc7XHJcbmltcG9ydCB7IE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTaWduYWxSQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL3NpZ25hbHIuY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IENvbm5lY3Rpb25UcmFuc3BvcnQgfSBmcm9tICcuL2Nvbm5lY3Rpb24udHJhbnNwb3J0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBTaWduYWxSQ29ubmVjdGlvbiBpbXBsZW1lbnRzIElTaWduYWxSQ29ubmVjdGlvbiB7XHJcblxyXG4gICAgcHJpdmF0ZSBfc3RhdHVzOiBPYnNlcnZhYmxlPENvbm5lY3Rpb25TdGF0dXM+O1xyXG4gICAgcHJpdmF0ZSBfZXJyb3JzOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgICBwcml2YXRlIF9qQ29ubmVjdGlvbjogYW55O1xyXG4gICAgcHJpdmF0ZSBfZGVmYXVsdFByb3h5OiBhbnk7XHJcbiAgICBwcml2YXRlIF9qUHJveGllczogTWFwPHN0cmluZywgYW55PjtcclxuICAgIHByaXZhdGUgX3pvbmU6IE5nWm9uZTtcclxuICAgIHByaXZhdGUgX2NvbmZpZ3VyYXRpb246IFNpZ25hbFJDb25maWd1cmF0aW9uO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGpDb25uZWN0aW9uOiBhbnksIGpQcm94aWVzOiBNYXA8c3RyaW5nLCBhbnk+LCB6b25lOiBOZ1pvbmUsIGNvbmZpZ3VyYXRpb246IFNpZ25hbFJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5falByb3hpZXMgPSBqUHJveGllcztcclxuICAgICAgICB0aGlzLl9kZWZhdWx0UHJveHkgPSBqUHJveGllcy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XHJcbiAgICAgICAgdGhpcy5fakNvbm5lY3Rpb24gPSBqQ29ubmVjdGlvbjtcclxuICAgICAgICB0aGlzLl96b25lID0gem9uZTtcclxuICAgICAgICB0aGlzLl9lcnJvcnMgPSB0aGlzLndpcmVVcEVycm9yc0FzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IHRoaXMud2lyZVVwU3RhdHVzRXZlbnRzQXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBlcnJvcnMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3JzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc3RhdHVzKCk6IE9ic2VydmFibGU8Q29ubmVjdGlvblN0YXR1cz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFFzKHFzOiBhbnkpIHtcclxuICAgICAgICB0aGlzLl9qQ29ubmVjdGlvbi5xcyA9IHFzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFFzKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2pDb25uZWN0aW9uLnFzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGFydCgpOiBQcm9taXNlPElTaWduYWxSQ29ubmVjdGlvbj4ge1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZygnU3RhcnRpbmcgY29ubmVjdGlvbicsIHRoaXMuX2pDb25uZWN0aW9uKTtcclxuXHJcbiAgICAgICAgY29uc3QgalRyYW5zcG9ydHMgPSB0aGlzLmNvbnZlcnRUcmFuc3BvcnRzKHRoaXMuX2NvbmZpZ3VyYXRpb24udHJhbnNwb3J0KTtcclxuXHJcbiAgICAgICAgY29uc3QgJHByb21pc2UgPSBuZXcgUHJvbWlzZTxJU2lnbmFsUkNvbm5lY3Rpb24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fakNvbm5lY3Rpb25cclxuICAgICAgICAgICAgICAgIC5zdGFydCh7XHJcbiAgICAgICAgICAgICAgICAgICAganNvbnA6IHRoaXMuX2NvbmZpZ3VyYXRpb24uanNvbnAsXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0OiBqVHJhbnNwb3J0cyxcclxuICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuX2NvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5kb25lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ29ubmVjdGlvbiBlc3RhYmxpc2hlZCwgSUQ6ICcgKyB0aGlzLl9qQ29ubmVjdGlvbi5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Nvbm5lY3Rpb24gZXN0YWJsaXNoZWQsIFRyYW5zcG9ydDogJyArIHRoaXMuX2pDb25uZWN0aW9uLnRyYW5zcG9ydC5uYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5mYWlsKChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBjb25uZWN0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdGYWlsZWQgdG8gY29ubmVjdC4gRXJyb3I6ICcgKyBlcnJvci5tZXNzYWdlKTsgLy8gZXg6IEVycm9yIGR1cmluZyBuZWdvdGlhdGlvbiByZXF1ZXN0LlxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuICRwcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdTdG9wcGluZyBjb25uZWN0aW9uJywgdGhpcy5fakNvbm5lY3Rpb24pO1xyXG4gICAgICAgIHRoaXMuX2pDb25uZWN0aW9uLnN0b3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2pDb25uZWN0aW9uLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbnZva2UobWV0aG9kOiBzdHJpbmcsIHNwcm94eT86IHN0cmluZywgLi4ucGFyYW1ldGVyczogYW55W10pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpZ25hbFJDb25uZWN0aW9uOiBGYWlsZWQgdG8gaW52b2tlLiBBcmd1bWVudCBcXCdtZXRob2RcXCcgY2FuIG5vdCBiZSBudWxsJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9nKGBTaWduYWxSQ29ubmVjdGlvbi4gU3RhcnQgaW52b2tpbmcgXFwnJHttZXRob2R9XFwnLi4uYCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICRwcm9taXNlID0gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q3VycmVudFByb3h5KHNwcm94eSkuaW52b2tlKG1ldGhvZCwgLi4ucGFyYW1ldGVycylcclxuICAgICAgICAgICAgICAgIC5kb25lKChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKGBcXCcke21ldGhvZH1cXCcgaW52b2tlZCBzdWNjZXNmdWxseS4gUmVzb2x2aW5nIHByb21pc2UuLi5gKTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2coYFByb21pc2UgcmVzb2x2ZWQuYCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmZhaWwoKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEludm9raW5nIFxcJyR7bWV0aG9kfVxcJyBmYWlsZWQuIFJlamVjdGluZyBwcm9taXNlLi4uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFByb21pc2UgcmVqZWN0ZWQuYCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gJHByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGxpc3RlbjxUPihsaXN0ZW5lcjogQnJvYWRjYXN0RXZlbnRMaXN0ZW5lcjxUPiwgc3Byb3h5Pzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbGlzdGVuLiBBcmd1bWVudCBcXCdsaXN0ZW5lclxcJyBjYW4gbm90IGJlIG51bGwnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9nKGBTaWduYWxSQ29ubmVjdGlvbjogU3RhcnRpbmcgdG8gbGlzdGVuIHRvIHNlcnZlciBldmVudCB3aXRoIG5hbWUgJHtsaXN0ZW5lci5ldmVudH1gKTtcclxuICAgICAgICB0aGlzLmdldEN1cnJlbnRQcm94eShzcHJveHkpLm9uKGxpc3RlbmVyLmV2ZW50LCAoLi4uYXJnczogYW55W10pID0+IHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBjYXN0ZWQ6IFQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc3RlZCA9IGFyZ3NbMF0gYXMgVDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZygnU2lnbmFsUkNvbm5lY3Rpb24ucHJveHkub24gaW52b2tlZC4gQ2FsbGluZyBsaXN0ZW5lciBuZXh0KCkgLi4uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubmV4dChjYXN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nKCdsaXN0ZW5lciBuZXh0KCkgY2FsbGVkLicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbGlzdGVuRm9yPFQ+KGV2ZW50OiBzdHJpbmcsIHNwcm94eT86IHN0cmluZyk6IEJyb2FkY2FzdEV2ZW50TGlzdGVuZXI8VD4ge1xyXG4gICAgICAgIGlmIChldmVudCA9PSBudWxsIHx8IGV2ZW50ID09PSAnJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsaXN0ZW4uIEFyZ3VtZW50IFxcJ2V2ZW50XFwnIGNhbiBub3QgYmUgZW1wdHknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gbmV3IEJyb2FkY2FzdEV2ZW50TGlzdGVuZXI8VD4oZXZlbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmxpc3RlbihsaXN0ZW5lciwgc3Byb3h5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFByb3h5KHNwcm94eT86IHN0cmluZykge1xyXG4gICAgICAgIGlmICghc3Byb3h5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0UHJveHk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2pQcm94aWVzLmdldChzcHJveHkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbnZlcnRUcmFuc3BvcnRzKHRyYW5zcG9ydHM6IENvbm5lY3Rpb25UcmFuc3BvcnQgfCBDb25uZWN0aW9uVHJhbnNwb3J0W10pOiBhbnkge1xyXG4gICAgICAgIGlmICh0cmFuc3BvcnRzIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydHMubWFwKCh0OiBDb25uZWN0aW9uVHJhbnNwb3J0KSA9PiB0Lm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJhbnNwb3J0cy5uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd2lyZVVwRXJyb3JzQXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgY29uc3Qgc0Vycm9yID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICAgICAgICB0aGlzLl9qQ29ubmVjdGlvbi5lcnJvcigoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAvLyB0aGlzLl96b25lLnJ1bigoKSA9PiB7ICAvKmVycm9ycyBkb24ndCBuZWVkIHRvIHJ1biBpbiBhICB6b25lKi9cclxuICAgICAgICAgICAgc0Vycm9yLm5leHQoZXJyb3IpO1xyXG4gICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gc0Vycm9yO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd2lyZVVwU3RhdHVzRXZlbnRzQXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8Q29ubmVjdGlvblN0YXR1cz4ge1xyXG4gICAgICAgIGNvbnN0IHNTdGF0dXMgPSBuZXcgU3ViamVjdDxDb25uZWN0aW9uU3RhdHVzPigpO1xyXG4gICAgICAgIC8vIGFnZ3JlZ2F0ZSBhbGwgc2lnbmFsciBjb25uZWN0aW9uIHN0YXR1cyBoYW5kbGVycyBpbnRvIDEgb2JzZXJ2YWJsZS5cclxuICAgICAgICAvLyBoYW5kbGVyIHdpcmUgdXAsIGZvciBzaWduYWxyIGNvbm5lY3Rpb24gc3RhdHVzIGNhbGxiYWNrLlxyXG4gICAgICAgIHRoaXMuX2pDb25uZWN0aW9uLnN0YXRlQ2hhbmdlZCgoY2hhbmdlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc1N0YXR1cy5uZXh0KG5ldyBDb25uZWN0aW9uU3RhdHVzKGNoYW5nZS5uZXdTdGF0ZSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gc1N0YXR1cy5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKnByaXZhdGUgb25Ccm9hZGNhc3RFdmVudFJlY2VpdmVkPFQ+KGxpc3RlbmVyOiBCcm9hZGNhc3RFdmVudExpc3RlbmVyPFQ+LCAuLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgICAgIHRoaXMubG9nKCdTaWduYWxSQ29ubmVjdGlvbi5wcm94eS5vbiBpbnZva2VkLiBDYWxsaW5nIGxpc3RlbmVyIG5leHQoKSAuLi4nKTtcclxuXHJcbiAgICAgICAgbGV0IGNhc3RlZDogVCA9IG51bGw7XHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjYXN0ZWQgPSAoYXJnc1swXSBhcyBUKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgbGlzdGVuZXIubmV4dChjYXN0ZWQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmxvZygnbGlzdGVuZXIgbmV4dCgpIGNhbGxlZC4nKTtcclxuICAgIH0qL1xyXG5cclxuICAgIHByaXZhdGUgbG9nKC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2pDb25uZWN0aW9uLmxvZ2dpbmcgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2coYXJncy5qb2luKCcsICcpKTtcclxuICAgIH1cclxufVxyXG4iXX0=