UNPKG

ng4-signalr

Version:
155 lines (152 loc) 21.8 kB
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=