|  | @@ -5,13 +5,17 @@ import { WebsocketError } from './error';
 | 
	
		
			
			| 5 | 5 |  
 | 
	
		
			
			| 6 | 6 |  const clientError = 400;
 | 
	
		
			
			| 7 | 7 |  
 | 
	
		
			
			|  | 8 | +export interface WebSocketResp {
 | 
	
		
			
			|  | 9 | +  value: object | string;
 | 
	
		
			
			|  | 10 | +}
 | 
	
		
			
			|  | 11 | +
 | 
	
		
			
			| 8 | 12 |  /**
 | 
	
		
			
			| 9 | 13 |   * 初始化链接以及收发数据
 | 
	
		
			
			| 10 | 14 |   */
 | 
	
		
			
			| 11 | 15 |  class Client {
 | 
	
		
			
			| 12 | 16 |    private _maxPayload: number;
 | 
	
		
			
			| 13 | 17 |    private _enableLogger: boolean;
 | 
	
		
			
			| 14 |  | -  private listeners: Map<number, (data: string) => void>;
 | 
	
		
			
			|  | 18 | +  private listeners: Map<number, (data: WebSocketResp) => void>;
 | 
	
		
			
			| 15 | 19 |    private requestHeader: string;
 | 
	
		
			
			| 16 | 20 |    private responseHeader: string;
 | 
	
		
			
			| 17 | 21 |    private url: string;
 | 
	
	
		
			
			|  | @@ -26,7 +30,7 @@ class Client {
 | 
	
		
			
			| 26 | 30 |     * @param readyStateCallback 链接状态回调,可以处理onOpen、onClose、onError
 | 
	
		
			
			| 27 | 31 |     */
 | 
	
		
			
			| 28 | 32 |    public constructor(url: string, readyStateCallback: ReadyStateCallback) {
 | 
	
		
			
			| 29 |  | -    this.listeners = new Map<number, (data: string) => void>();
 | 
	
		
			
			|  | 33 | +    this.listeners = new Map<number, (data: WebSocketResp) => void>();
 | 
	
		
			
			| 30 | 34 |      this.requestHeader = '';
 | 
	
		
			
			| 31 | 35 |      this.requestHeader = '';
 | 
	
		
			
			| 32 | 36 |      this._maxPayload = 1024 * 1024;
 | 
	
	
		
			
			|  | @@ -70,10 +74,10 @@ class Client {
 | 
	
		
			
			| 70 | 74 |     * 发送ping请求,来保持长连接
 | 
	
		
			
			| 71 | 75 |     * @param param 请求参数,比如{"hello":"world"}
 | 
	
		
			
			| 72 | 76 |     */
 | 
	
		
			
			| 73 |  | -  public async ping(param: object): Promise<string> {
 | 
	
		
			
			|  | 77 | +  public async ping(param: object): Promise<WebSocketResp> {
 | 
	
		
			
			| 74 | 78 |      return new Promise(
 | 
	
		
			
			| 75 | 79 |        (
 | 
	
		
			
			| 76 |  | -        resolve: (data: string) => void,
 | 
	
		
			
			|  | 80 | +        resolve: (data: WebSocketResp) => void,
 | 
	
		
			
			| 77 | 81 |          reject: (err: WebsocketError) => void,
 | 
	
		
			
			| 78 | 82 |        ): void => {
 | 
	
		
			
			| 79 | 83 |          if (this.socket.readyState !== this.socket.OPEN) {
 | 
	
	
		
			
			|  | @@ -88,7 +92,7 @@ class Client {
 | 
	
		
			
			| 88 | 92 |  
 | 
	
		
			
			| 89 | 93 |          this.listeners.set(
 | 
	
		
			
			| 90 | 94 |            heartbeatOperator,
 | 
	
		
			
			| 91 |  | -          (data: string): void => {
 | 
	
		
			
			|  | 95 | +          (data: WebSocketResp): void => {
 | 
	
		
			
			| 92 | 96 |              const code = this.getResponseProperty('code');
 | 
	
		
			
			| 93 | 97 |              if (code !== '') {
 | 
	
		
			
			| 94 | 98 |                const message = this.getResponseProperty('message');
 | 
	
	
		
			
			|  | @@ -128,7 +132,10 @@ class Client {
 | 
	
		
			
			| 128 | 132 |     * @param param 请求参数,比如{"hello":"world"}
 | 
	
		
			
			| 129 | 133 |     * @param callback 请求状态回调处理
 | 
	
		
			
			| 130 | 134 |     */
 | 
	
		
			
			| 131 |  | -  public async request(operator: string, param: object): Promise<string> {
 | 
	
		
			
			|  | 135 | +  public async request(
 | 
	
		
			
			|  | 136 | +    operator: string,
 | 
	
		
			
			|  | 137 | +    param: object,
 | 
	
		
			
			|  | 138 | +  ): Promise<WebSocketResp> {
 | 
	
		
			
			| 132 | 139 |      return await this.asyncSend(operator, param);
 | 
	
		
			
			| 133 | 140 |    }
 | 
	
		
			
			| 134 | 141 |  
 | 
	
	
		
			
			|  | @@ -140,7 +147,7 @@ class Client {
 | 
	
		
			
			| 140 | 147 |     */
 | 
	
		
			
			| 141 | 148 |    public addMessageListener(
 | 
	
		
			
			| 142 | 149 |      operator: string,
 | 
	
		
			
			| 143 |  | -    listener: (data: string) => void,
 | 
	
		
			
			|  | 150 | +    listener: (data: WebSocketResp) => void,
 | 
	
		
			
			| 144 | 151 |    ): void {
 | 
	
		
			
			| 145 | 152 |      this.listeners.set(Utils.crc32(operator), listener);
 | 
	
		
			
			| 146 | 153 |    }
 | 
	
	
		
			
			|  | @@ -220,14 +227,12 @@ class Client {
 | 
	
		
			
			| 220 | 227 |  
 | 
	
		
			
			| 221 | 228 |      return '';
 | 
	
		
			
			| 222 | 229 |    }
 | 
	
		
			
			| 223 |  | -
 | 
	
		
			
			| 224 | 230 |    /**
 | 
	
		
			
			| 225 | 231 |     * 关闭客户端链接
 | 
	
		
			
			| 226 | 232 |     */
 | 
	
		
			
			| 227 | 233 |    public close(code?: number, reason?: string): void {
 | 
	
		
			
			| 228 | 234 |      this.socket.close(code, reason);
 | 
	
		
			
			| 229 | 235 |    }
 | 
	
		
			
			| 230 |  | -
 | 
	
		
			
			| 231 | 236 |    /**
 | 
	
		
			
			| 232 | 237 |     * 创建websocket链接
 | 
	
		
			
			| 233 | 238 |     */
 | 
	
	
		
			
			|  | @@ -287,7 +292,7 @@ class Client {
 | 
	
		
			
			| 287 | 292 |  
 | 
	
		
			
			| 288 | 293 |                this.responseHeader = packet.header;
 | 
	
		
			
			| 289 | 294 |  
 | 
	
		
			
			| 290 |  | -              (this.listeners.get(operator) as (data: string) => void)(
 | 
	
		
			
			|  | 295 | +              (this.listeners.get(operator) as (data: WebSocketResp) => void)(
 | 
	
		
			
			| 291 | 296 |                  JSON.parse(packet.body),
 | 
	
		
			
			| 292 | 297 |                );
 | 
	
		
			
			| 293 | 298 |              }
 | 
	
	
		
			
			|  | @@ -312,7 +317,7 @@ class Client {
 | 
	
		
			
			| 312 | 317 |    /**
 | 
	
		
			
			| 313 | 318 |     * 断线重连
 | 
	
		
			
			| 314 | 319 |     */
 | 
	
		
			
			| 315 |  | -  private reconnect(): void {
 | 
	
		
			
			|  | 320 | +  reconnect(): void {
 | 
	
		
			
			| 316 | 321 |      if (!this.reconnectLock) {
 | 
	
		
			
			| 317 | 322 |        this.reconnectLock = true;
 | 
	
		
			
			| 318 | 323 |        if (this._enableLogger) {
 | 
	
	
		
			
			|  | @@ -356,10 +361,10 @@ class Client {
 | 
	
		
			
			| 356 | 361 |     * @param param 请求参数,比如{"hello":"world"}
 | 
	
		
			
			| 357 | 362 |     * @param callback 请求状态回调处理
 | 
	
		
			
			| 358 | 363 |     */
 | 
	
		
			
			| 359 |  | -  private asyncSend(operator: string, param: object): Promise<string> {
 | 
	
		
			
			|  | 364 | +  asyncSend(operator: string, param: object): Promise<WebSocketResp> {
 | 
	
		
			
			| 360 | 365 |      return new Promise(
 | 
	
		
			
			| 361 | 366 |        (
 | 
	
		
			
			| 362 |  | -        resolve: (data: string) => void,
 | 
	
		
			
			|  | 367 | +        resolve: (data: WebSocketResp) => void,
 | 
	
		
			
			| 363 | 368 |          reject: (err: WebsocketError) => void,
 | 
	
		
			
			| 364 | 369 |        ): void => {
 | 
	
		
			
			| 365 | 370 |          if (this.socket.readyState !== this.socket.OPEN) {
 | 
	
	
		
			
			|  | @@ -376,7 +381,7 @@ class Client {
 | 
	
		
			
			| 376 | 381 |          const listener = Utils.crc32(operator) + sequence;
 | 
	
		
			
			| 377 | 382 |          this.listeners.set(
 | 
	
		
			
			| 378 | 383 |            listener,
 | 
	
		
			
			| 379 |  | -          (data: string): void => {
 | 
	
		
			
			|  | 384 | +          (data: WebSocketResp): void => {
 | 
	
		
			
			| 380 | 385 |              const code = this.getResponseProperty('code');
 | 
	
		
			
			| 381 | 386 |              if (code !== '') {
 | 
	
		
			
			| 382 | 387 |                const message = this.getResponseProperty('message');
 | 
	
	
		
			
			|  | @@ -413,4 +418,14 @@ class Client {
 | 
	
		
			
			| 413 | 418 |    }
 | 
	
		
			
			| 414 | 419 |  }
 | 
	
		
			
			| 415 | 420 |  
 | 
	
		
			
			| 416 |  | -export { Client };
 | 
	
		
			
			|  | 421 | +let client: Client;
 | 
	
		
			
			|  | 422 | +
 | 
	
		
			
			|  | 423 | +function getClient(url: string, callback: ReadyStateCallback) {
 | 
	
		
			
			|  | 424 | +  if (!client) {
 | 
	
		
			
			|  | 425 | +    client = new Client(url, callback);
 | 
	
		
			
			|  | 426 | +  }
 | 
	
		
			
			|  | 427 | +
 | 
	
		
			
			|  | 428 | +  return client;
 | 
	
		
			
			|  | 429 | +}
 | 
	
		
			
			|  | 430 | +
 | 
	
		
			
			|  | 431 | +export { Client, getClient };
 |