@chatie/angular
Version:
Wechaty Component NgModule
209 lines • 25.5 kB
JavaScript
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==