UNPKG

36.2 kBSource Map (JSON)View Raw
1{"version":3,"file":"chatie-angular.js","sources":["../../src/version.ts","../../src/wechaty/io.ts","../../src/wechaty/wechaty.component.ts","../../src/wechaty/wechaty.module.ts","../../chatie-angular.ts"],"sourcesContent":["/**\n * This file was auto generated from scripts/generate-version.sh\n */\nexport const VERSION: string = '0.7.2'\n","import { VERSION } from '../config'\n\nimport {\n BehaviorSubject,\n Observable,\n Observer,\n Subject,\n} from 'rxjs'\nimport {\n filter,\n share,\n} from 'rxjs/operators'\n\nimport { Brolog } from 'brolog'\nimport { StateSwitch } from 'state-switch'\n\nexport type WechatyEventName =\n 'scan'\n | 'login' | 'logout'\n | 'reset' | 'shutdown'\n | 'ding' | 'dong'\n | 'message'\n | 'heartbeat'\n | 'update'\n | 'error'\n\nexport type ServerEventName = 'sys'\n | 'botie'\n\nexport type IoEventName = 'raw' | WechatyEventName | ServerEventName\n\nexport interface IoEvent {\n name: IoEventName,\n payload: any,\n}\n\nexport enum ReadyState {\n CLOSED = WebSocket.CLOSED,\n CLOSING = WebSocket.CLOSING,\n CONNECTING = WebSocket.CONNECTING,\n OPEN = WebSocket.OPEN,\n}\n\nexport interface IoServiceSnapshot {\n readyState: ReadyState\n event: IoEvent\n}\n\nexport class IoService {\n // https://github.com/ReactiveX/rxjs/blob/master/src/observable/dom/WebSocketSubject.ts\n public event: Subject<IoEvent>\n\n private _readyState: BehaviorSubject<ReadyState>\n public get readyState() {\n return this._readyState.asObservable()\n }\n\n public snapshot: IoServiceSnapshot\n\n private autoReconnect = true\n private log = Brolog.instance()\n\n private readonly CONNECT_TIMEOUT = 10 * 1000 // 10 seconds\n private readonly ENDPOINT = 'wss://api.chatie.io/v0/websocket/token/'\n private readonly PROTOCOL = 'web|0.0.1'\n\n private _token: string // FIXME possible be `undefined`\n private _websocket: WebSocket | null\n private moObserver: Observer<IoEvent> // Mobile Originated. moObserver.next() means mobile is sending\n private mtObserver: Observer<IoEvent> // Mobile Terminated. mtObserver.next() means mobile is receiving\n private sendBuffer: string[] = []\n\n private state: StateSwitch\n\n constructor() {\n this.log.verbose('IoService', 'constructor()')\n }\n\n public async init(): Promise<void> {\n this.log.verbose('IoService', 'init()')\n\n if (this.state) {\n throw new Error('re-init')\n }\n\n this.snapshot = {\n readyState: ReadyState.CLOSED,\n event: null,\n }\n\n this._readyState = new BehaviorSubject<ReadyState>(ReadyState.CLOSED)\n this.state = new StateSwitch('IoService', this.log)\n this.state.setLog(this.log)\n\n try {\n await this.initStateDealer()\n await this.initRxSocket()\n } catch (e) {\n this.log.silly('IoService', 'init() exception: %s', e.message)\n throw e\n }\n\n this.readyState.subscribe(s => {\n this.log.silly('IoService', 'init() readyState.subscribe(%s)', ReadyState[s])\n this.snapshot.readyState = s\n })\n // IMPORTANT: subscribe to event and make it HOT!\n this.event.subscribe(s => {\n this.log.silly('IoService', 'init() event.subscribe({name:%s})', s.name)\n this.snapshot.event = s\n })\n\n return\n }\n\n public token(): string\n public token(newToken: string): void\n\n public token(newToken?: string): string | void {\n this.log.silly('IoService', 'token(%s)', newToken)\n if (newToken) {\n this._token = newToken\n return\n }\n return this._token\n }\n\n async start(): Promise<void> {\n this.log.verbose('IoService', 'start() with token:%s', this._token)\n\n if (!this._token) {\n throw new Error('start() without token')\n }\n\n if (this.state.on()) {\n throw new Error('state is already ON')\n }\n if (this.state.pending()) {\n throw new Error('state is pending')\n }\n\n this.state.on('pending')\n\n this.autoReconnect = true\n\n try {\n await this.connectRxSocket()\n this.state.on(true)\n } catch (e) {\n this.log.warn('IoService', 'start() failed:%s', e.message)\n\n this.state.off(true)\n }\n }\n\n async stop(): Promise<void> {\n this.log.verbose('IoService', 'stop()')\n\n if (this.state.off()) {\n this.log.warn('IoService', 'stop() state is already off')\n if (this.state.pending()) {\n throw new Error('state pending() is true')\n }\n return\n }\n\n this.state.off('pending')\n\n this.autoReconnect = false\n\n if (!this._websocket) {\n throw new Error('no websocket')\n }\n\n await this.socketClose(1000, 'IoService.stop()')\n this.state.off(true)\n\n return\n }\n\n public async restart(): Promise<void> {\n this.log.verbose('IoService', 'restart()')\n try {\n await this.stop()\n await this.start()\n } catch (e) {\n this.log.error('IoService', 'restart() error:%s', e.message)\n throw e\n }\n return\n }\n\n private initStateDealer() {\n this.log.verbose('IoService', 'initStateDealer()')\n\n const isReadyStateOpen = (s: ReadyState) => s === ReadyState.OPEN\n\n this.readyState.pipe(\n filter(isReadyStateOpen),\n )\n .subscribe(open => this.stateOnOpen())\n }\n\n /**\n * Creates a subject from the specified observer and observable.\n * - https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/subject.md\n * Create an Rx.Subject using Subject.create that allows onNext without subscription\n * A socket implementation (example, don't use)\n * - http://stackoverflow.com/a/34862286/1123955\n */\n private async initRxSocket(): Promise<void> {\n this.log.verbose('IoService', 'initRxSocket()')\n\n if (this.event) {\n throw new Error('re-init is not permitted')\n }\n\n // 1. Mobile Originated. moObserver.next() means mobile is sending\n this.moObserver = {\n next: this.socketSend.bind(this),\n error: this.socketClose.bind(this),\n complete: this.socketClose.bind(this),\n }\n\n // 2. Mobile Terminated. mtObserver.next() means mobile is receiving\n const observable = new Observable((observer: Observer<IoEvent>) => {\n this.log.verbose('IoService', 'initRxSocket() Observable.create()')\n this.mtObserver = observer\n\n return this.socketClose.bind(this)\n })\n\n // 3. Subject for MO & MT Observers\n this.event = Subject.create(this.moObserver, observable.pipe(share()))\n\n }\n\n private async connectRxSocket(): Promise<void> {\n this.log.verbose('IoService', 'connectRxSocket()')\n\n // FIXME: check & close the old one\n if (this._websocket) {\n throw new Error('already has a websocket')\n }\n\n // if (this.state.target() !== 'open'\n // || this.state.current() !== 'open'\n // || this.state.stable()\n if (this.state.off()) {\n throw new Error('switch state is off')\n } else if (!this.state.pending()) {\n throw new Error('switch state is already ON')\n }\n\n this._websocket = new WebSocket(this.endPoint(), this.PROTOCOL)\n this.socketUpdateState()\n\n const onOpenPromise = new Promise<void>((resolve, reject) => {\n this.log.verbose('IoService', 'connectRxSocket() Promise()')\n\n const id = setTimeout(() => {\n this._websocket = null\n const e = new Error('rxSocket connect timeout after '\n + Math.round(this.CONNECT_TIMEOUT / 1000),\n )\n reject(e)\n }, this.CONNECT_TIMEOUT) // timeout for connect websocket\n\n this._websocket.onopen = (e) => {\n this.log.verbose('IoService', 'connectRxSocket() Promise() WebSocket.onOpen() resolve()')\n this.socketUpdateState()\n clearTimeout(id)\n resolve()\n }\n })\n\n // Handle the payload\n this._websocket.onmessage = this.socketOnMessage.bind(this)\n // Deal the event\n this._websocket.onerror = this.socketOnError.bind(this)\n this._websocket.onclose = this.socketOnClose.bind(this)\n\n return onOpenPromise\n }\n\n private endPoint(): string {\n const url = this.ENDPOINT + this._token\n this.log.verbose('IoService', 'endPoint() => %s', url)\n return url\n }\n\n /******************************************************************\n *\n * State Event Listeners\n *\n */\n private stateOnOpen() {\n this.log.verbose('IoService', 'stateOnOpen()')\n\n this.socketSendBuffer()\n this.rpcUpdate('from stateOnOpen()')\n }\n\n /******************************************************************\n *\n * Io RPC Methods\n *\n */\n async rpcDing(payload: any): Promise<any> {\n this.log.verbose('IoService', 'ding(%s)', payload)\n\n const e: IoEvent = {\n name: 'ding',\n payload,\n }\n this.event.next(e)\n // TODO: get the return value\n }\n\n async rpcUpdate(payload: any): Promise<void> {\n this.event.next({\n name: 'update',\n payload,\n })\n }\n\n /******************************************************************\n *\n * Socket Actions\n *\n */\n private async socketClose(code?: number, reason?: string): Promise<void> {\n this.log.verbose('IoService', 'socketClose()')\n\n if (!this._websocket) {\n throw new Error('no websocket')\n }\n\n this._websocket.close(code, reason)\n this.socketUpdateState()\n\n const future = new Promise(resolve => {\n this.readyState.pipe(\n filter(s => s === ReadyState.CLOSED),\n )\n .subscribe(resolve)\n })\n await future\n\n return\n }\n\n private socketSend(ioEvent: IoEvent) {\n this.log.silly('IoService', 'socketSend({name:%s, payload:%s})', ioEvent.name, ioEvent.payload)\n\n if (!this._websocket) {\n this.log.silly('IoService', 'socketSend() no _websocket')\n }\n\n const strEvt = JSON.stringify(ioEvent)\n this.sendBuffer.push(strEvt)\n\n // XXX can move this to onOpen?\n this.socketSendBuffer()\n }\n\n private socketSendBuffer(): void {\n this.log.silly('IoService', 'socketSendBuffer() length:%s', this.sendBuffer.length)\n\n if (!this._websocket) {\n throw new Error('socketSendBuffer(): no _websocket')\n }\n\n if (this._websocket.readyState !== WebSocket.OPEN) {\n this.log.warn('IoService', 'socketSendBuffer() readyState is not OPEN, send job delayed.')\n return\n }\n\n while (this.sendBuffer.length) {\n const buf = this.sendBuffer.shift()\n this.log.silly('IoService', 'socketSendBuffer() sending(%s)', buf)\n this._websocket.send(buf)\n }\n }\n\n private socketUpdateState() {\n this.log.verbose('IoService', 'socketUpdateState() is %s',\n ReadyState[this._websocket.readyState],\n )\n\n if (!this._websocket) {\n this.log.error('IoService', 'socketUpdateState() no _websocket')\n return\n }\n\n this._readyState.next(this._websocket.readyState)\n }\n\n /******************************************************************\n *\n * Socket Events Listener\n *\n */\n private socketOnMessage(message: MessageEvent) {\n this.log.verbose('IoService', 'onMessage({data: %s})', message.data)\n\n const data = message.data // WebSocket data\n\n const ioEvent: IoEvent = {\n name: 'raw',\n payload: data,\n } // this is default io event for unknown format message\n\n try {\n const obj = JSON.parse(data)\n ioEvent.name = obj.name\n ioEvent.payload = obj.payload\n } catch (e) {\n this.log.warn('IoService', 'onMessage parse message fail. save as RAW')\n }\n\n this.mtObserver.next(ioEvent)\n }\n\n private socketOnError(event: Event) {\n this.log.silly('IoService', 'socketOnError(%s)', event)\n // this._websocket = null\n }\n\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent\n * code: 1006\tCLOSE_ABNORMAL\n * - Reserved. Used to indicate that a connection was closed abnormally\n * (that is, with no close frame being sent) when a status code is expected.\n */\n private socketOnClose(closeEvent: CloseEvent) {\n this.log.verbose('IoService', 'socketOnClose({code:%s, reason:%s, returnValue:%s})',\n closeEvent.code,\n closeEvent.reason,\n closeEvent.returnValue,\n )\n this.socketUpdateState()\n /**\n * reconnect inside onClose\n */\n if (this.autoReconnect) {\n this.state.on('pending')\n setTimeout(async () => {\n try {\n await this.connectRxSocket()\n this.state.on(true)\n } catch (e) {\n this.log.warn('IoService', 'socketOnClose() autoReconnect() exception: %s', e)\n this.state.off(true)\n }\n }, 1000)\n } else {\n this.state.off(true)\n }\n this._websocket = null\n\n if (!closeEvent.wasClean) {\n this.log.warn('IoService', 'socketOnClose() event.wasClean FALSE')\n // TODO emit error\n }\n }\n}\n","import { VERSION } from '../config'\n\nimport {\n Component,\n EventEmitter,\n Input,\n NgZone,\n Output,\n OnDestroy,\n OnInit,\n} from '@angular/core'\n\nimport {\n Observable,\n Subject,\n Subscription,\n interval,\n} from 'rxjs'\nimport {\n share,\n tap,\n takeUntil,\n} from 'rxjs/operators'\n\nimport { Brolog } from 'brolog'\n\nimport {\n IoEvent,\n IoService,\n // tslint:disable-next-line:no-unused-variable\n ReadyState,\n} from './io'\n\n/**\n * for payload\n */\nexport interface ScanInfo {\n qrcode: string\n status: number\n data?: string\n}\n\nexport interface UserInfo {\n id: number\n name: string\n}\n\n@Component({\n // tslint:disable-next-line:component-selector\n selector: 'wechaty',\n /**\n * http://localhost:4200/app.component.html 404 (Not Found)\n * zone.js:344 Unhandled Promise rejection: Failed to load app.component.html\n * https://github.com/angular/angular-cli/issues/2592#issuecomment-266635266\n * https://github.com/angular/angular-cli/issues/2293\n *\n * console.log from angular:\n * If you're using Webpack you should inline the template and the styles,\n * see https://goo.gl/X2J8zc.\n */\n template: '<ng-content></ng-content>',\n // styleUrls: ['./wechaty.component.css'],\n // templateUrl: 'wechaty.component.html',\n // moduleId: module.id,\n})\nexport class WechatyComponent implements OnInit, OnDestroy {\n @Output() message = new EventEmitter<string>()\n @Output() scan = new EventEmitter<ScanInfo>()\n @Output() login = new EventEmitter<UserInfo>()\n @Output() logout = new EventEmitter<UserInfo>()\n @Output() error = new EventEmitter<Error>()\n @Output() heartbeat = new EventEmitter<any>()\n\n private _token: string\n get token() { return this._token }\n @Input() set token(_newToken: string) {\n this.log.verbose('WechatyComponent', 'set token(%s)', _newToken)\n\n const newToken = (_newToken || '').trim()\n\n if (this._token === newToken) {\n this.log.silly('WechatyComponent', 'set token(%s) not new', newToken)\n return\n }\n\n this._token = newToken\n\n if (!this.ioService) {\n this.log.silly('WechatyComponent', 'set token() skip token init value')\n this.log.silly('WechatyComponent', 'set token() because ioService will do it inside ngOnInit()')\n return\n }\n\n this.log.silly('WechatyComponent', 'set token(%s) reloading ioService now...', newToken)\n this.ioService.token(this.token)\n this.ioService.restart() // async\n }\n\n private timer: Observable<any>\n private timerSub: Subscription | null = null\n private ender: Subject<any>\n\n private ioService: IoService\n\n counter = 0\n timestamp = new Date()\n\n constructor(\n private log: Brolog,\n private ngZone: NgZone,\n ) {\n this.log.verbose('WechatyComponent', 'constructor() v%s', VERSION)\n }\n\n async ngOnInit() {\n this.log.verbose('WechatyComponent', 'ngOnInit() with token: ' + this.token)\n\n this.ioService = new IoService()\n await this.ioService.init()\n\n this.ioService.event.subscribe(this.onIo.bind(this))\n this.log.silly('WechatyComponent', 'ngOnInit() ioService.event.subscribe()-ed')\n\n /**\n * @Input(token) might not initialized in constructor()\n */\n if (this.token) {\n this.ioService.token(this.token)\n await this.ioService.start()\n }\n\n // this.startTimer()\n }\n\n ngOnDestroy() {\n this.log.verbose('WechatyComponent', 'ngOnDestroy()')\n\n this.endTimer()\n\n if (this.ioService) {\n this.ioService.stop()\n // this.ioService = null\n }\n }\n\n onIo(e: IoEvent) {\n this.log.silly('WechatyComponent', 'onIo#%d(%s)', this.counter++, e.name)\n this.timestamp = new Date()\n\n switch (e.name) {\n case 'scan':\n this.scan.emit(e.payload as ScanInfo)\n break\n case 'login':\n this.login.emit(e.payload as UserInfo)\n break\n case 'logout':\n this.logout.emit(e.payload as UserInfo)\n break\n case 'message':\n this.message.emit(e.payload)\n break\n case 'error':\n this.error.emit(e.payload)\n break\n\n case 'ding':\n case 'dong':\n case 'raw':\n this.heartbeat.emit(e.name + '[' + e.payload + ']')\n break\n case 'heartbeat':\n this.heartbeat.emit(e.payload)\n break\n\n case 'sys':\n this.log.silly('WechatyComponent', 'onIo(%s): %s', e.name, e.payload)\n break\n\n default:\n this.log.warn('WechatyComponent', 'onIo() unknown event name: %s[%s]', e.name, e.payload)\n break\n }\n }\n\n public reset(reason: string) {\n this.log.verbose('WechatyComponent', 'reset(%s)', reason)\n\n const resetEvent: IoEvent = {\n name: 'reset',\n payload: reason,\n }\n if (!this.ioService) {\n throw new Error('no ioService')\n }\n this.ioService.event.next(resetEvent)\n }\n\n public shutdown(reason: string) {\n this.log.verbose('WechatyComponent', 'shutdown(%s)', reason)\n\n const shutdownEvent: IoEvent = {\n name: 'shutdown',\n payload: reason,\n }\n if (!this.ioService) {\n throw new Error('no ioService')\n }\n this.ioService.event.next(shutdownEvent)\n }\n\n public startSyncMessage() {\n this.log.verbose('WechatyComponent', 'startSyncMessage()')\n\n const botieEvent: IoEvent = {\n name: 'botie',\n payload: {\n args: ['message'],\n script: 'return this.syncMessage(message)',\n },\n }\n if (!this.ioService) {\n throw new Error('no ioService')\n }\n this.ioService.event.next(botieEvent)\n }\n\n startTimer() {\n this.log.verbose('WechatyComponent', 'startTimer()')\n this.ender = new Subject()\n\n // https://github.com/angular/protractor/issues/3349#issuecomment-232253059\n // https://github.com/juliemr/ngconf-2016-zones/blob/master/src/app/main.ts#L38\n this.ngZone.runOutsideAngular(() => {\n this.timer = interval(3000).pipe(\n tap(i => { this.log.verbose('do', ' %d', i) }),\n takeUntil(this.ender),\n share(),\n )\n // .publish()\n\n })\n\n this.timerSub = this.timer.subscribe(t => {\n this.counter = t\n\n if (!this.ioService) {\n throw new Error('no ioService')\n }\n this.ioService.rpcDing(this.counter)\n // this.message.emit('#' + this.token + ':' + dong)\n })\n\n }\n\n endTimer() {\n this.log.verbose('WechatyComponent', 'endTimer()')\n\n if (this.timerSub) {\n this.timerSub.unsubscribe()\n this.timerSub = null\n }\n // this.timer = null\n\n if (this.ender) {\n this.ender.next(null)\n // this.ender = null\n }\n }\n\n logoff(reason?: string) { // use the name `logoff` here to prevent conflict with @Output(logout)\n this.log.silly('WechatyComponent', 'logoff(%s)', reason)\n\n const quitEvent: IoEvent = {\n name: 'logout',\n payload: reason,\n }\n this.ioService.event.next(quitEvent)\n }\n\n public get readyState() {\n return this.ioService.readyState\n }\n\n}\n","import { NgModule } from '@angular/core'\n\nimport { WechatyComponent } from './wechaty.component'\n\n@NgModule({\n id: 'wechaty',\n declarations: [\n WechatyComponent,\n ],\n exports: [\n WechatyComponent,\n ],\n})\nexport class WechatyModule {}\n\nexport * from './wechaty.component'\nexport { ReadyState } from './io'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n\nexport {WechatyComponent as ɵa} from './src/wechaty/wechaty.component';"],"names":[],"mappings":"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"}
\No newline at end of file