UNPKG

45.6 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../src/wechaty/io.ts","../../src/version.ts","../../src/wechaty/wechaty.component.ts","../../src/wechaty/wechaty.module.ts"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","this","n","v","op","TypeError","call","pop","length","push","Object","create","ReadyState","VERSION","WebSocket","CLOSED","CLOSING","CONNECTING","OPEN","IoService","autoReconnect","log","Brolog","instance","CONNECT_TIMEOUT","ENDPOINT","PROTOCOL","sendBuffer","verbose","defineProperty","prototype","_readyState","asObservable","init","state","Error","snapshot","readyState","event","BehaviorSubject","StateSwitch","setLog","initStateDealer","_b","initRxSocket","silly","e_1","message","subscribe","s","_this","name","token","newToken","_token","start","on","pending","connectRxSocket","warn","e_2","off","stop","_websocket","socketClose","restart","error","e_3","pipe","filter","open","stateOnOpen","moObserver","socketSend","bind","complete","observable","Observable","observer","mtObserver","Subject","share","endPoint","socketUpdateState","onOpenPromise","id","setTimeout","Math","round","onopen","clearTimeout","onmessage","socketOnMessage","onerror","socketOnError","onclose","socketOnClose","url","socketSendBuffer","rpcUpdate","rpcDing","payload","code","reason","close","ioEvent","strEvt","JSON","stringify","buf","shift","send","_a","data","obj","parse","closeEvent","returnValue","e_4","wasClean","WechatyComponent","ngZone","EventEmitter","scan","login","logout","heartbeat","timerSub","counter","timestamp","Date","_newToken","trim","ioService","ngOnInit","onIo","ngOnDestroy","endTimer","emit","reset","resetEvent","shutdown","shutdownEvent","startSyncMessage","args","source","startTimer","ender","runOutsideAngular","timer","interval","tap","i","takeUntil","unsubscribe","logoff","quitEvent","Component","selector","template","NgZone","Output","Input","NgModule","declarations","exports"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\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","/**\n * This file was auto generated from scripts/generate-version.sh\n */\nexport const VERSION: string = '0.7.4'\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 source: '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"]}
\No newline at end of file