UNPKG

@chatie/angular

Version:

Wechaty Component NgModule

209 lines 25.5 kB
import { __awaiter } from "tslib"; import { VERSION } from '../config'; import { Component, EventEmitter, Input, NgZone, Output, } from '@angular/core'; import { Subject, interval, } from 'rxjs'; import { share, tap, takeUntil, } from 'rxjs/operators'; import { Brolog } from 'brolog'; import { IoService, } from './io'; export class WechatyComponent { constructor(log, ngZone) { this.log = log; this.ngZone = ngZone; this.message = new EventEmitter(); this.scan = new EventEmitter(); this.login = new EventEmitter(); this.logout = new EventEmitter(); this.error = new EventEmitter(); this.heartbeat = new EventEmitter(); this.timerSub = null; this.counter = 0; this.timestamp = new Date(); this.log.verbose('WechatyComponent', 'constructor() v%s', VERSION); } get token() { return this._token; } set token(_newToken) { this.log.verbose('WechatyComponent', 'set token(%s)', _newToken); const newToken = (_newToken || '').trim(); if (this._token === newToken) { this.log.silly('WechatyComponent', 'set token(%s) not new', newToken); return; } this._token = newToken; if (!this.ioService) { this.log.silly('WechatyComponent', 'set token() skip token init value'); this.log.silly('WechatyComponent', 'set token() because ioService will do it inside ngOnInit()'); return; } this.log.silly('WechatyComponent', 'set token(%s) reloading ioService now...', newToken); this.ioService.token(this.token); this.ioService.restart(); // async } ngOnInit() { return __awaiter(this, void 0, void 0, function* () { this.log.verbose('WechatyComponent', 'ngOnInit() with token: ' + this.token); this.ioService = new IoService(); yield this.ioService.init(); this.ioService.event.subscribe(this.onIo.bind(this)); this.log.silly('WechatyComponent', 'ngOnInit() ioService.event.subscribe()-ed'); /** * @Input(token) might not initialized in constructor() */ if (this.token) { this.ioService.token(this.token); yield this.ioService.start(); } // this.startTimer() }); } ngOnDestroy() { this.log.verbose('WechatyComponent', 'ngOnDestroy()'); this.endTimer(); if (this.ioService) { this.ioService.stop(); // this.ioService = null } } onIo(e) { this.log.silly('WechatyComponent', 'onIo#%d(%s)', this.counter++, e.name); this.timestamp = new Date(); switch (e.name) { case 'scan': this.scan.emit(e.payload); break; case 'login': this.login.emit(e.payload); break; case 'logout': this.logout.emit(e.payload); break; case 'message': this.message.emit(e.payload); break; case 'error': this.error.emit(e.payload); break; case 'ding': case 'dong': case 'raw': this.heartbeat.emit(e.name + '[' + e.payload + ']'); break; case 'heartbeat': this.heartbeat.emit(e.payload); break; case 'sys': this.log.silly('WechatyComponent', 'onIo(%s): %s', e.name, e.payload); break; default: this.log.warn('WechatyComponent', 'onIo() unknown event name: %s[%s]', e.name, e.payload); break; } } reset(reason) { this.log.verbose('WechatyComponent', 'reset(%s)', reason); const resetEvent = { name: 'reset', payload: reason, }; if (!this.ioService) { throw new Error('no ioService'); } this.ioService.event.next(resetEvent); } shutdown(reason) { this.log.verbose('WechatyComponent', 'shutdown(%s)', reason); const shutdownEvent = { name: 'shutdown', payload: reason, }; if (!this.ioService) { throw new Error('no ioService'); } this.ioService.event.next(shutdownEvent); } startSyncMessage() { this.log.verbose('WechatyComponent', 'startSyncMessage()'); const botieEvent = { name: 'botie', payload: { args: ['message'], source: 'return this.syncMessage(message)', }, }; if (!this.ioService) { throw new Error('no ioService'); } this.ioService.event.next(botieEvent); } startTimer() { this.log.verbose('WechatyComponent', 'startTimer()'); this.ender = new Subject(); // https://github.com/angular/protractor/issues/3349#issuecomment-232253059 // https://github.com/juliemr/ngconf-2016-zones/blob/master/src/app/main.ts#L38 this.ngZone.runOutsideAngular(() => { this.timer = interval(3000).pipe(tap(i => { this.log.verbose('do', ' %d', i); }), takeUntil(this.ender), share()); // .publish() }); this.timerSub = this.timer.subscribe(t => { this.counter = t; if (!this.ioService) { throw new Error('no ioService'); } this.ioService.rpcDing(this.counter); // this.message.emit('#' + this.token + ':' + dong) }); } endTimer() { this.log.verbose('WechatyComponent', 'endTimer()'); if (this.timerSub) { this.timerSub.unsubscribe(); this.timerSub = null; } // this.timer = null if (this.ender) { this.ender.next(null); // this.ender = null } } logoff(reason) { this.log.silly('WechatyComponent', 'logoff(%s)', reason); const quitEvent = { name: 'logout', payload: reason, }; this.ioService.event.next(quitEvent); } get readyState() { return this.ioService.readyState; } } WechatyComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'wechaty', /** * http://localhost:4200/app.component.html 404 (Not Found) * zone.js:344 Unhandled Promise rejection: Failed to load app.component.html * https://github.com/angular/angular-cli/issues/2592#issuecomment-266635266 * https://github.com/angular/angular-cli/issues/2293 * * console.log from angular: * If you're using Webpack you should inline the template and the styles, * see https://goo.gl/X2J8zc. */ template: '<ng-content></ng-content>' },] } ]; WechatyComponent.ctorParameters = () => [ { type: Brolog }, { type: NgZone } ]; WechatyComponent.propDecorators = { message: [{ type: Output }], scan: [{ type: Output }], login: [{ type: Output }], logout: [{ type: Output }], error: [{ type: Output }], heartbeat: [{ type: Output }], token: [{ type: Input }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VjaGF0eS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd2VjaGF0eS93ZWNoYXR5LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVuQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FHUCxNQUF3QixlQUFlLENBQUE7QUFFeEMsT0FBTyxFQUVMLE9BQU8sRUFFUCxRQUFRLEdBQ1QsTUFBd0IsTUFBTSxDQUFBO0FBQy9CLE9BQU8sRUFDTCxLQUFLLEVBQ0wsR0FBRyxFQUNILFNBQVMsR0FDVixNQUF3QixnQkFBZ0IsQ0FBQTtBQUV6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQVEsUUFBUSxDQUFBO0FBRWpDLE9BQU8sRUFFTCxTQUFTLEdBR1YsTUFBd0IsTUFBTSxDQUFBO0FBa0MvQixNQUFNLE9BQU8sZ0JBQWdCO0lBMEMzQixZQUNVLEdBQWMsRUFDZCxNQUFjO1FBRGQsUUFBRyxHQUFILEdBQUcsQ0FBVztRQUNkLFdBQU0sR0FBTixNQUFNLENBQVE7UUEzQ2QsWUFBTyxHQUFLLElBQUksWUFBWSxFQUFVLENBQUE7UUFDdEMsU0FBSSxHQUFRLElBQUksWUFBWSxFQUFZLENBQUE7UUFDeEMsVUFBSyxHQUFPLElBQUksWUFBWSxFQUFZLENBQUE7UUFDeEMsV0FBTSxHQUFNLElBQUksWUFBWSxFQUFZLENBQUE7UUFDeEMsVUFBSyxHQUFPLElBQUksWUFBWSxFQUFTLENBQUE7UUFDckMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUE7UUE0QnJDLGFBQVEsR0FBd0IsSUFBSSxDQUFBO1FBSzVDLFlBQU8sR0FBRyxDQUFDLENBQUE7UUFDWCxjQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQU1wQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8s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LEdBQUcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFFbEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7WUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7U0FDckI7UUFDRCxvQkFBb0I7UUFFcEIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDckIsb0JBQW9CO1NBQ3JCO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFlO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUV4RCxNQUFNLFNBQVMsR0FBWTtZQUN6QixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxNQUFNO1NBQ2hCLENBQUE7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFBO0lBQ2xDLENBQUM7OztZQTNPRixTQUFTLFNBQUM7Z0JBQ1QsOENBQThDO2dCQUM5QyxRQUFRLEVBQUUsU0FBUztnQkFDbkI7Ozs7Ozs7OzttQkFTRztnQkFDSCxRQUFRLEVBQUUsMkJBQTJCO2FBSXRDOzs7WUF4Q1EsTUFBTTtZQWxCYixNQUFNOzs7c0JBNERMLE1BQU07bUJBQ04sTUFBTTtvQkFDTixNQUFNO3FCQUNOLE1BQU07b0JBQ04sTUFBTTt3QkFDTixNQUFNO29CQUlOLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSAnLi4vY29uZmlnJ1xuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT3V0cHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbn0gICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29yZSdcblxuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxuICBpbnRlcnZhbCxcbn0gICAgICAgICAgICAgICAgICAgZnJvbSAncnhqcydcbmltcG9ydCB7XG4gIHNoYXJlLFxuICB0YXAsXG4gIHRha2VVbnRpbCxcbn0gICAgICAgICAgICAgICAgICAgZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7IEJyb2xvZyB9ICAgZnJvbSAnYnJvbG9nJ1xuXG5pbXBvcnQge1xuICBJb0V2ZW50LFxuICBJb1NlcnZpY2UsXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtdmFyaWFibGVcbiAgUmVhZHlTdGF0ZSxcbn0gICAgICAgICAgICAgICAgICAgZnJvbSAnLi9pbydcblxuLyoqXG4gKiBmb3IgcGF5bG9hZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjYW5JbmZvIHtcbiAgcXJjb2RlOiBzdHJpbmdcbiAgc3RhdHVzOiBudW1iZXJcbiAgZGF0YT86ICBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VySW5mbyB7XG4gIGlkOiBudW1iZXJcbiAgbmFtZTogc3RyaW5nXG59XG5cbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnd2VjaGF0eScsXG4gIC8qKlxuICAgKiBodHRwOi8vbG9jYWxob3N0OjQyMDAvYXBwLmNvbXBvbmVudC5odG1sIDQwNCAoTm90IEZvdW5kKVxuICAgKiB6b25lLmpzOjM0NCBVbmhhbmRsZWQgUHJvbWlzZSByZWplY3Rpb246IEZhaWxlZCB0byBsb2FkIGFwcC5jb21wb25lbnQuaHRtbFxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLWNsaS9pc3N1ZXMvMjU5MiNpc3N1ZWNvbW1lbnQtMjY2NjM1MjY2XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXItY2xpL2lzc3Vlcy8yMjkzXG4gICAqXG4gICAqIGNvbnNvbGUubG9nIGZyb20gYW5ndWxhcjpcbiAgICogICBJZiB5b3UncmUgdXNpbmcgV2VicGFjayB5b3Ugc2hvdWxkIGlubGluZSB0aGUgdGVtcGxhdGUgYW5kIHRoZSBzdHlsZXMsXG4gICAqICAgc2VlIGh0dHBzOi8vZ29vLmdsL1gySjh6Yy5cbiAgICovXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXG4gIC8vIHN0eWxlVXJsczogWycuL3dlY2hhdHkuY29tcG9uZW50LmNzcyddLFxuICAvLyB0ZW1wbGF0ZVVybDogJ3dlY2hhdHkuY29tcG9uZW50Lmh0bWwnLFxuICAvLyBtb2R1bGVJZDogbW9kdWxlLmlkLFxufSlcbmV4cG9ydCBjbGFzcyBXZWNoYXR5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAT3V0cHV0KCkgbWVzc2FnZSAgID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KClcbiAgQE91dHB1dCgpIHNjYW4gICAgICA9IG5ldyBFdmVudEVtaXR0ZXI8U2NhbkluZm8+KClcbiAgQE91dHB1dCgpIGxvZ2luICAgICA9IG5ldyBFdmVudEVtaXR0ZXI8VXNlckluZm8+KClcbiAgQE91dHB1dCgpIGxvZ291dCAgICA9IG5ldyBFdmVudEVtaXR0ZXI8VXNlckluZm8+KClcbiAgQE91dHB1dCgpIGVycm9yICAgICA9IG5ldyBFdmVudEVtaXR0ZXI8RXJyb3I+KClcbiAgQE91dHB1dCgpIGhlYXJ0YmVhdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG5cbiAgcHJpdmF0ZSBfdG9rZW46IHN0cmluZ1xuICBnZXQgdG9rZW4oKSB7IHJldHVybiB0aGlzLl90b2tlbiB9XG4gIEBJbnB1dCgpIHNldCB0b2tlbihfbmV3VG9rZW46IHN0cmluZykge1xuICAgIHRoaXMubG9nLnZlcmJvc2UoJ1dlY2hhdHlDb21wb25lbnQnLCAnc2V0IHRva2VuKCVzKScsIF9uZXdUb2tlbilcblxuICAgIGNvbnN0IG5ld1Rva2VuID0gKF9uZXdUb2tlbiB8fCAnJykudHJpbSgpXG5cbiAgICBpZiAodGhpcy5fdG9rZW4gPT09IG5ld1Rva2VuKSB7XG4gICAgICB0aGlzLmxvZy5zaWxseSgnV2VjaGF0eUNvbXBvbmVudCcsICdzZXQgdG9rZW4oJXMpIG5vdCBuZXcnLCBuZXdUb2tlbilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX3Rva2VuID0gbmV3VG9rZW5cblxuICAgIGlmICghdGhpcy5pb1NlcnZpY2UpIHtcbiAgICAgIHRoaXMubG9nLnNpbGx5KCdXZWNoYXR5Q29tcG9uZW50JywgJ3NldCB0b2tlbigpIHNraXAgdG9rZW4gaW5pdCB2YWx1ZScpXG4gICAgICB0aGlzLmxvZy5zaWxseSgnV2VjaGF0eUNvbXBvbmVudCcsICdzZXQgdG9rZW4oKSBiZWNhdXNlIGlvU2VydmljZSB3aWxsIGRvIGl0IGluc2lkZSBuZ09uSW5pdCgpJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMubG9nLnNpbGx5KCdXZWNoYXR5Q29tcG9uZW50JywgJ3NldCB0b2tlbiglcykgcmVsb2FkaW5nIGlvU2VydmljZSBub3cuLi4nLCBuZXdUb2tlbilcbiAgICB0aGlzLmlvU2VydmljZS50b2tlbih0aGlzLnRva2VuKVxuICAgIHRoaXMuaW9TZXJ2aWNlLnJlc3RhcnQoKSAvLyBhc3luY1xuICB9XG5cbiAgcHJpdmF0ZSB0aW1lcjogT2JzZXJ2YWJsZTxhbnk+XG4gIHByaXZhdGUgdGltZXJTdWI6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgZW5kZXI6IFN1YmplY3Q8YW55PlxuXG4gIHByaXZhdGUgaW9TZXJ2aWNlOiBJb1NlcnZpY2VcblxuICBjb3VudGVyID0gMFxuICB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBsb2c6ICAgIEJyb2xvZyxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICApIHtcbiAgICB0aGlzLmxvZy52ZXJib3NlKCdXZWNoYXR5Q29tcG9uZW50JywgJ2NvbnN0cnVjdG9yKCkgdiVzJywgVkVSU0lPTilcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMubG9nLnZlcmJvc2UoJ1dlY2hhdHlDb21wb25lbnQnLCAnbmdPbkluaXQoKSB3aXRoIHRva2VuOiAnICsgdGhpcy50b2tlbilcblxuICAgIHRoaXMuaW9TZXJ2aWNlID0gbmV3IElvU2VydmljZSgpXG4gICAgYXdhaXQgdGhpcy5pb1NlcnZpY2UuaW5pdCgpXG5cbiAgICB0aGlzLmlvU2VydmljZS5ldmVudC5zdWJzY3JpYmUodGhpcy5vbklvLmJpbmQodGhpcykpXG4gICAgdGhpcy5sb2cuc2lsbHkoJ1dlY2hhdHlDb21wb25lbnQnLCAnbmdPbkluaXQoKSBpb1NlcnZpY2UuZXZlbnQuc3Vic2NyaWJlKCktZWQnKVxuXG4gICAgLyoqXG4gICAgICogQElucHV0KHRva2VuKSBtaWdodCBub3QgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IoKVxuICAgICAqL1xuICAgIGlmICh0aGlzLnRva2VuKSB7XG4gICAgICB0aGlzLmlvU2VydmljZS50b2tlbih0aGlzLnRva2VuKVxuICAgICAgYXdhaXQgdGhpcy5pb1NlcnZpY2Uuc3RhcnQoKVxuICAgIH1cblxuICAgIC8vIHRoaXMuc3RhcnRUaW1lcigpXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmxvZy52ZXJib3NlKCdXZWNoYXR5Q29tcG9uZW50JywgJ25nT25EZXN0cm95KCknKVxuXG4gICAgdGhpcy5lbmRUaW1lcigpXG5cbiAgICBpZiAodGhpcy5pb1NlcnZpY2UpIHtcbiAgICAgIHRoaXMuaW9TZXJ2aWNlLnN0b3AoKVxuICAgICAgLy8gdGhpcy5pb1NlcnZpY2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgb25JbyhlOiBJb0V2ZW50KSB7XG4gICAgdGhpcy5sb2cuc2lsbHkoJ1dlY2hhdHlDb21wb25lbnQnLCAnb25JbyMlZCglcyknLCB0aGlzLmNvdW50ZXIrKywgZS5uYW1lKVxuICAgIHRoaXMudGltZXN0YW1wID0gbmV3IERhdGUoKVxuXG4gICAgc3dpdGNoIChlLm5hbWUpIHtcbiAgICAgIGNhc2UgJ3NjYW4nOlxuICAgICAgICB0aGlzLnNjYW4uZW1pdChlLnBheWxvYWQgYXMgU2NhbkluZm8pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdsb2dpbic6XG4gICAgICAgIHRoaXMubG9naW4uZW1pdChlLnBheWxvYWQgYXMgVXNlckluZm8pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdsb2dvdXQnOlxuICAgICAgICB0aGlzLmxvZ291dC5lbWl0KGUucGF5bG9hZCBhcyBVc2VySW5mbylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgICAgICB0aGlzLm1lc3NhZ2UuZW1pdChlLnBheWxvYWQpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIHRoaXMuZXJyb3IuZW1pdChlLnBheWxvYWQpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgJ2RpbmcnOlxuICAgICAgY2FzZSAnZG9uZyc6XG4gICAgICBjYXNlICdyYXcnOlxuICAgICAgICB0aGlzLmhlYXJ0YmVhdC5lbWl0KGUubmFtZSArICdbJyArIGUucGF5bG9hZCArICddJylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2hlYXJ0YmVhdCc6XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0LmVtaXQoZS5wYXlsb2FkKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdzeXMnOlxuICAgICAgICB0aGlzLmxvZy5zaWxseSgnV2VjaGF0eUNvbXBvbmVudCcsICdvbklvKCVzKTogJXMnLCBlLm5hbWUsIGUucGF5bG9hZClcbiAgICAgICAgYnJlYWtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5sb2cud2FybignV2VjaGF0eUNvbXBvbmVudCcsICdvbklvKCkgdW5rbm93biBldmVudCBuYW1lOiAlc1slc10nLCBlLm5hbWUsIGUucGF5bG9hZClcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXQocmVhc29uOiBzdHJpbmcpIHtcbiAgICB0aGlzLmxvZy52ZXJib3NlKCdXZWNoYXR5Q29tcG9uZW50JywgJ3Jlc2V0KCVzKScsIHJlYXNvbilcblxuICAgIGNvbnN0IHJlc2V0RXZlbnQ6IElvRXZlbnQgPSB7XG4gICAgICBuYW1lOiAncmVzZXQnLFxuICAgICAgcGF5bG9hZDogcmVhc29uLFxuICAgIH1cbiAgICBpZiAoIXRoaXMuaW9TZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGlvU2VydmljZScpXG4gICAgfVxuICAgIHRoaXMuaW9TZXJ2aWNlLmV2ZW50Lm5leHQocmVzZXRFdmVudClcbiAgfVxuXG4gIHB1YmxpYyBzaHV0ZG93bihyZWFzb246IHN0cmluZykge1xuICAgIHRoaXMubG9nLnZlcmJvc2UoJ1dlY2hhdHlDb21wb25lbnQnLCAnc2h1dGRvd24oJXMpJywgcmVhc29uKVxuXG4gICAgY29uc3Qgc2h1dGRvd25FdmVudDogSW9FdmVudCA9IHtcbiAgICAgIG5hbWU6ICdzaHV0ZG93bicsXG4gICAgICBwYXlsb2FkOiByZWFzb24sXG4gICAgfVxuICAgIGlmICghdGhpcy5pb1NlcnZpY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gaW9TZXJ2aWNlJylcbiAgICB9XG4gICAgdGhpcy5pb1NlcnZpY2UuZXZlbnQubmV4dChzaHV0ZG93bkV2ZW50KVxuICB9XG5cbiAgcHVibGljIHN0YXJ0U3luY01lc3NhZ2UoKSB7XG4gICAgdGhpcy5sb2cudmVyYm9zZSgnV2VjaGF0eUNvbXBvbmVudCcsICdzdGFydFN5bmNNZXNzYWdlKCknKVxuXG4gICAgY29uc3QgYm90aWVFdmVudDogSW9FdmVudCA9IHtcbiAgICAgIG5hbWU6ICdib3RpZScsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGFyZ3M6IFsnbWVzc2FnZSddLFxuICAgICAgICBzb3VyY2U6ICdyZXR1cm4gdGhpcy5zeW5jTWVzc2FnZShtZXNzYWdlKScsXG4gICAgICB9LFxuICAgIH1cbiAgICBpZiAoIXRoaXMuaW9TZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGlvU2VydmljZScpXG4gICAgfVxuICAgIHRoaXMuaW9TZXJ2aWNlLmV2ZW50Lm5leHQoYm90aWVFdmVudClcbiAgfVxuXG4gIHN0YXJ0VGltZXIoKSB7XG4gICAgdGhpcy5sb2cudmVyYm9zZSgnV2VjaGF0eUNvbXBvbmVudCcsICdzdGFydFRpbWVyKCknKVxuICAgIHRoaXMuZW5kZXIgPSBuZXcgU3ViamVjdCgpXG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9wcm90cmFjdG9yL2lzc3Vlcy8zMzQ5I2lzc3VlY29tbWVudC0yMzIyNTMwNTlcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vanVsaWVtci9uZ2NvbmYtMjAxNi16b25lcy9ibG9iL21hc3Rlci9zcmMvYXBwL21haW4udHMjTDM4XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy50aW1lciA9IGludGVydmFsKDMwMDApLnBpcGUoXG4gICAgICAgIHRhcChpID0+IHsgdGhpcy5sb2cudmVyYm9zZSgnZG8nLCAnICVkJywgaSkgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmVuZGVyKSxcbiAgICAgICAgc2hhcmUoKSxcbiAgICAgIClcbiAgICAgIC8vIC5wdWJsaXNoKClcblxuICAgIH0pXG5cbiAgICB0aGlzLnRpbWVyU3ViID0gdGhpcy50aW1lci5zdWJzY3JpYmUodCA9PiB7XG4gICAgICB0aGlzLmNvdW50ZXIgPSB0XG5cbiAgICAgIGlmICghdGhpcy5pb1NlcnZpY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBpb1NlcnZpY2UnKVxuICAgICAgfVxuICAgICAgdGhpcy5pb1NlcnZpY2UucnBjRGluZyh0aGlzLmNvdW50ZXIpXG4gICAgICAvLyB0aGlzLm1lc3NhZ2UuZW1pdCgnIycgKyB0aGlzLnRva2VuICsgJzonICsgZG9uZylcbiAgICB9KVxuXG4gIH1cblxuICBlbmRUaW1lcigpIHtcbiAgICB0aGlzLmxvZy52ZXJib3NlKCdXZWNoYXR5Q29tcG9uZW50JywgJ2VuZFRpbWVyKCknKVxuXG4gICAgaWYgKHRoaXMudGltZXJTdWIpIHtcbiAgICAgIHRoaXMudGltZXJTdWIudW5zdWJzY3JpYmUoKVxuICAgICAgdGhpcy50aW1lclN1YiA9IG51bGxcbiAgICB9XG4gICAgLy8gdGhpcy50aW1lciA9IG51bGxcblxuICAgIGlmICh0aGlzLmVuZGVyKSB7XG4gICAgICB0aGlzLmVuZGVyLm5leHQobnVsbClcbiAgICAgIC8vIHRoaXMuZW5kZXIgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgbG9nb2ZmKHJlYXNvbj86IHN0cmluZykgeyAvLyB1c2UgdGhlIG5hbWUgYGxvZ29mZmAgaGVyZSB0byBwcmV2ZW50IGNvbmZsaWN0IHdpdGggQE91dHB1dChsb2dvdXQpXG4gICAgdGhpcy5sb2cuc2lsbHkoJ1dlY2hhdHlDb21wb25lbnQnLCAnbG9nb2ZmKCVzKScsIHJlYXNvbilcblxuICAgIGNvbnN0IHF1aXRFdmVudDogSW9FdmVudCA9IHtcbiAgICAgIG5hbWU6ICdsb2dvdXQnLFxuICAgICAgcGF5bG9hZDogcmVhc29uLFxuICAgIH1cbiAgICB0aGlzLmlvU2VydmljZS5ldmVudC5uZXh0KHF1aXRFdmVudClcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVhZHlTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pb1NlcnZpY2UucmVhZHlTdGF0ZVxuICB9XG5cbn1cbiJdfQ==