| 
				
			 | 
			
			
				@@ -3,6 +3,8 @@ import { Utils } from './utils'; 
			 | 
		
	
		
			
			| 
				3
			 | 
			
				3
			 | 
			
			
				 import { ReadyStateCallback } from './types/callback'; 
			 | 
		
	
		
			
			| 
				4
			 | 
			
				4
			 | 
			
			
				 import { WebsocketError } from './error'; 
			 | 
		
	
		
			
			| 
				5
			 | 
			
				5
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				6
			 | 
			
			
				+const clientError = 400; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				7
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				6
			 | 
			
				8
			 | 
			
			
				 /** 
			 | 
		
	
		
			
			| 
				7
			 | 
			
				9
			 | 
			
			
				  * 初始化链接以及收发数据 
			 | 
		
	
		
			
			| 
				8
			 | 
			
				10
			 | 
			
			
				  */ 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -16,6 +18,7 @@ class Client { 
			 | 
		
	
		
			
			| 
				16
			 | 
			
				18
			 | 
			
			
				   private reconnectLock: boolean; 
			 | 
		
	
		
			
			| 
				17
			 | 
			
				19
			 | 
			
			
				   private socket: WebSocket; 
			 | 
		
	
		
			
			| 
				18
			 | 
			
				20
			 | 
			
			
				   private readyStateCallback: ReadyStateCallback; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				21
			 | 
			
			
				+  private _enableLogger: boolean; 
			 | 
		
	
		
			
			| 
				19
			 | 
			
				22
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				20
			 | 
			
				23
			 | 
			
			
				   /** 
			 | 
		
	
		
			
			| 
				21
			 | 
			
				24
			 | 
			
			
				    * 构造函数,初始化客户端链接 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -30,9 +33,24 @@ class Client { 
			 | 
		
	
		
			
			| 
				30
			 | 
			
				33
			 | 
			
			
				     this.url = url; 
			 | 
		
	
		
			
			| 
				31
			 | 
			
				34
			 | 
			
			
				     this.reconnectTimes = 0; 
			 | 
		
	
		
			
			| 
				32
			 | 
			
				35
			 | 
			
			
				     this.readyStateCallback = readyStateCallback; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				36
			 | 
			
			
				+    this._enableLogger = false; 
			 | 
		
	
		
			
			| 
				33
			 | 
			
				37
			 | 
			
			
				     this.socket = this.connect(); 
			 | 
		
	
		
			
			| 
				34
			 | 
			
				38
			 | 
			
			
				   } 
			 | 
		
	
		
			
			| 
				35
			 | 
			
				39
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				40
			 | 
			
			
				+  /** 
			 | 
		
	
		
			
			| 
				
			 | 
			
				41
			 | 
			
			
				+   * 设置是否允许显示运行日志 
			 | 
		
	
		
			
			| 
				
			 | 
			
				42
			 | 
			
			
				+   */ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				43
			 | 
			
			
				+  public set enableLogger(enableLogger: boolean) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				44
			 | 
			
			
				+    this._enableLogger = enableLogger; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				45
			 | 
			
			
				+  } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				46
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				47
			 | 
			
			
				+  /** 
			 | 
		
	
		
			
			| 
				
			 | 
			
				48
			 | 
			
			
				+   * 获取是否显示日志的配置信息 
			 | 
		
	
		
			
			| 
				
			 | 
			
				49
			 | 
			
			
				+   */ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				50
			 | 
			
			
				+  public get enableLogger(): boolean { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				51
			 | 
			
			
				+    return this._enableLogger; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				52
			 | 
			
			
				+  } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				53
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				36
			 | 
			
				54
			 | 
			
			
				   /** 
			 | 
		
	
		
			
			| 
				37
			 | 
			
				55
			 | 
			
			
				    * 发送ping请求,来保持长连接 
			 | 
		
	
		
			
			| 
				38
			 | 
			
				56
			 | 
			
			
				    * @param param 请求参数,比如{"hello":"world"} 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -44,7 +62,11 @@ class Client { 
			 | 
		
	
		
			
			| 
				44
			 | 
			
				62
			 | 
			
			
				         reject: (err: WebsocketError) => void, 
			 | 
		
	
		
			
			| 
				45
			 | 
			
				63
			 | 
			
			
				       ): void => { 
			 | 
		
	
		
			
			| 
				46
			 | 
			
				64
			 | 
			
			
				         if (this.socket.readyState !== this.socket.OPEN) { 
			 | 
		
	
		
			
			| 
				47
			 | 
			
				
			 | 
			
			
				-          reject(new WebsocketError(400, 'asyncSend: connection refuse')); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				65
			 | 
			
			
				+          if (this._enableLogger) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				66
			 | 
			
			
				+            console.log('[ping]: connection refuse'); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				67
			 | 
			
			
				+          } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				68
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				69
			 | 
			
			
				+          reject(new WebsocketError(clientError, 'connection refuse')); 
			 | 
		
	
		
			
			| 
				48
			 | 
			
				70
			 | 
			
			
				         } 
			 | 
		
	
		
			
			| 
				49
			 | 
			
				71
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				50
			 | 
			
				72
			 | 
			
			
				         const heartbeatOperator = 0; 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -71,6 +93,16 @@ class Client { 
			 | 
		
	
		
			
			| 
				71
			 | 
			
				93
			 | 
			
			
				             JSON.stringify(param), 
			 | 
		
	
		
			
			| 
				72
			 | 
			
				94
			 | 
			
			
				           ), 
			 | 
		
	
		
			
			| 
				73
			 | 
			
				95
			 | 
			
			
				         ); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				96
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				97
			 | 
			
			
				+        if (this._enableLogger) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				98
			 | 
			
			
				+          console.info( 
			 | 
		
	
		
			
			| 
				
			 | 
			
				99
			 | 
			
			
				+            '[send data packet]', 
			 | 
		
	
		
			
			| 
				
			 | 
			
				100
			 | 
			
			
				+            heartbeatOperator, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				101
			 | 
			
			
				+            0, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				102
			 | 
			
			
				+            this.requestHeader, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				103
			 | 
			
			
				+            param, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				104
			 | 
			
			
				+          ); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				105
			 | 
			
			
				+        } 
			 | 
		
	
		
			
			| 
				74
			 | 
			
				106
			 | 
			
			
				       }, 
			 | 
		
	
		
			
			| 
				75
			 | 
			
				107
			 | 
			
			
				     ); 
			 | 
		
	
		
			
			| 
				76
			 | 
			
				108
			 | 
			
			
				   } 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -88,7 +120,13 @@ class Client { 
			 | 
		
	
		
			
			| 
				88
			 | 
			
				120
			 | 
			
			
				         reject: (err: WebsocketError) => void, 
			 | 
		
	
		
			
			| 
				89
			 | 
			
				121
			 | 
			
			
				       ): void => { 
			 | 
		
	
		
			
			| 
				90
			 | 
			
				122
			 | 
			
			
				         if (this.socket.readyState !== this.socket.OPEN) { 
			 | 
		
	
		
			
			| 
				91
			 | 
			
				
			 | 
			
			
				-          reject(new WebsocketError(400, 'asyncSend: connection refuse')); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				123
			 | 
			
			
				+          if (this._enableLogger) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				124
			 | 
			
			
				+            console.log('[ping]: connection refuse'); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				125
			 | 
			
			
				+          } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				126
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				127
			 | 
			
			
				+          reject( 
			 | 
		
	
		
			
			| 
				
			 | 
			
				128
			 | 
			
			
				+            new WebsocketError(clientError, 'asyncSend: connection refuse'), 
			 | 
		
	
		
			
			| 
				
			 | 
			
				129
			 | 
			
			
				+          ); 
			 | 
		
	
		
			
			| 
				92
			 | 
			
				130
			 | 
			
			
				         } 
			 | 
		
	
		
			
			| 
				93
			 | 
			
				131
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				94
			 | 
			
				132
			 | 
			
			
				         const sequence = new Date().getTime(); 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -117,6 +155,16 @@ class Client { 
			 | 
		
	
		
			
			| 
				117
			 | 
			
				155
			 | 
			
			
				             JSON.stringify(param), 
			 | 
		
	
		
			
			| 
				118
			 | 
			
				156
			 | 
			
			
				           ), 
			 | 
		
	
		
			
			| 
				119
			 | 
			
				157
			 | 
			
			
				         ); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				158
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				159
			 | 
			
			
				+        if (this._enableLogger) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				160
			 | 
			
			
				+          console.info( 
			 | 
		
	
		
			
			| 
				
			 | 
			
				161
			 | 
			
			
				+            '[send data packet]', 
			 | 
		
	
		
			
			| 
				
			 | 
			
				162
			 | 
			
			
				+            operator, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				163
			 | 
			
			
				+            sequence, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				164
			 | 
			
			
				+            this.requestHeader, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				165
			 | 
			
			
				+            param, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				166
			 | 
			
			
				+          ); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				167
			 | 
			
			
				+        } 
			 | 
		
	
		
			
			| 
				120
			 | 
			
				168
			 | 
			
			
				       }, 
			 | 
		
	
		
			
			| 
				121
			 | 
			
				169
			 | 
			
			
				     ); 
			 | 
		
	
		
			
			| 
				122
			 | 
			
				170
			 | 
			
			
				   } 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -245,18 +293,30 @@ class Client { 
			 | 
		
	
		
			
			| 
				245
			 | 
			
				293
			 | 
			
			
				     ws.binaryType = 'blob'; 
			 | 
		
	
		
			
			| 
				246
			 | 
			
				294
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				247
			 | 
			
				295
			 | 
			
			
				     ws.onopen = (ev): void => { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				296
			 | 
			
			
				+      if (this._enableLogger) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				297
			 | 
			
			
				+        console.info('[websocket] open connection'); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				298
			 | 
			
			
				+      } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				299
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				248
			 | 
			
				300
			 | 
			
			
				       this.reconnectTimes = 0; 
			 | 
		
	
		
			
			| 
				249
			 | 
			
				301
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				250
			 | 
			
				302
			 | 
			
			
				       readyStateCallback.onOpen(ev); 
			 | 
		
	
		
			
			| 
				251
			 | 
			
				303
			 | 
			
			
				     }; 
			 | 
		
	
		
			
			| 
				252
			 | 
			
				304
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				253
			 | 
			
				305
			 | 
			
			
				     ws.onclose = (ev): void => { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				306
			 | 
			
			
				+      if (this._enableLogger) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				307
			 | 
			
			
				+        console.info('[websocket] close connection'); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				308
			 | 
			
			
				+      } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				309
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				254
			 | 
			
				310
			 | 
			
			
				       this.reconnect(); 
			 | 
		
	
		
			
			| 
				255
			 | 
			
				311
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				256
			 | 
			
				312
			 | 
			
			
				       readyStateCallback.onClose(ev); 
			 | 
		
	
		
			
			| 
				257
			 | 
			
				313
			 | 
			
			
				     }; 
			 | 
		
	
		
			
			| 
				258
			 | 
			
				314
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				259
			 | 
			
				315
			 | 
			
			
				     ws.onerror = (ev): void => { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				316
			 | 
			
			
				+      if (this._enableLogger) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				317
			 | 
			
			
				+        console.info('[websocket] error'); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				318
			 | 
			
			
				+      } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				319
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				260
			 | 
			
				320
			 | 
			
			
				       this.reconnect(); 
			 | 
		
	
		
			
			| 
				261
			 | 
			
				321
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				262
			 | 
			
				322
			 | 
			
			
				       readyStateCallback.onError(ev); 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -287,8 +347,10 @@ class Client { 
			 | 
		
	
		
			
			| 
				287
			 | 
			
				347
			 | 
			
			
				               ); 
			 | 
		
	
		
			
			| 
				288
			 | 
			
				348
			 | 
			
			
				             } 
			 | 
		
	
		
			
			| 
				289
			 | 
			
				349
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				290
			 | 
			
				
			 | 
			
			
				-            if (operator !== 0 && packet.body !== 'null') { 
			 | 
		
	
		
			
			| 
				291
			 | 
			
				
			 | 
			
			
				-              console.info('receive data', packet.body); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				350
			 | 
			
			
				+            if (this._enableLogger) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				351
			 | 
			
			
				+              if (operator !== 0 && packet.body !== 'null') { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				352
			 | 
			
			
				+                console.info('receive data packet', packet.body); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				353
			 | 
			
			
				+              } 
			 | 
		
	
		
			
			| 
				292
			 | 
			
				354
			 | 
			
			
				             } 
			 | 
		
	
		
			
			| 
				293
			 | 
			
				355
			 | 
			
			
				           } catch (e) { 
			 | 
		
	
		
			
			| 
				294
			 | 
			
				356
			 | 
			
			
				             throw new Error(e); 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -308,7 +370,10 @@ class Client { 
			 | 
		
	
		
			
			| 
				308
			 | 
			
				370
			 | 
			
			
				   private reconnect(): void { 
			 | 
		
	
		
			
			| 
				309
			 | 
			
				371
			 | 
			
			
				     if (!this.reconnectLock) { 
			 | 
		
	
		
			
			| 
				310
			 | 
			
				372
			 | 
			
			
				       this.reconnectLock = true; 
			 | 
		
	
		
			
			| 
				311
			 | 
			
				
			 | 
			
			
				-      console.info('websocket reconnect in ' + this.reconnectTimes + 's'); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				373
			 | 
			
			
				+      if (this._enableLogger) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				374
			 | 
			
			
				+        console.info('websocket reconnect in ' + this.reconnectTimes + 's'); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				375
			 | 
			
			
				+      } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				376
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				312
			 | 
			
				377
			 | 
			
			
				       // 尝试重连 
			 | 
		
	
		
			
			| 
				313
			 | 
			
				378
			 | 
			
			
				       setTimeout((): void => { 
			 | 
		
	
		
			
			| 
				314
			 | 
			
				379
			 | 
			
			
				         this.reconnectTimes++; 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -324,13 +389,19 @@ class Client { 
			 | 
		
	
		
			
			| 
				324
			 | 
			
				389
			 | 
			
			
				    */ 
			 | 
		
	
		
			
			| 
				325
			 | 
			
				390
			 | 
			
			
				   private send(data: ArrayBuffer): void { 
			 | 
		
	
		
			
			| 
				326
			 | 
			
				391
			 | 
			
			
				     if (this.socket.readyState !== this.socket.OPEN) { 
			 | 
		
	
		
			
			| 
				327
			 | 
			
				
			 | 
			
			
				-      console.error('WebSocket is already in CLOSING or CLOSED state.'); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				392
			 | 
			
			
				+      if (this._enableLogger) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				393
			 | 
			
			
				+        console.error( 
			 | 
		
	
		
			
			| 
				
			 | 
			
				394
			 | 
			
			
				+          '[send] WebSocket is already in CLOSING or CLOSED state.', 
			 | 
		
	
		
			
			| 
				
			 | 
			
				395
			 | 
			
			
				+        ); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				396
			 | 
			
			
				+      } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				397
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				328
			 | 
			
				398
			 | 
			
			
				       return; 
			 | 
		
	
		
			
			| 
				329
			 | 
			
				399
			 | 
			
			
				     } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				400
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				330
			 | 
			
				401
			 | 
			
			
				     try { 
			 | 
		
	
		
			
			| 
				331
			 | 
			
				402
			 | 
			
			
				       this.socket.send(data); 
			 | 
		
	
		
			
			| 
				332
			 | 
			
				403
			 | 
			
			
				     } catch (e) { 
			 | 
		
	
		
			
			| 
				333
			 | 
			
				
			 | 
			
			
				-      console.log('send data error', e); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				404
			 | 
			
			
				+      throw new Error('send data error' + e); 
			 | 
		
	
		
			
			| 
				334
			 | 
			
				405
			 | 
			
			
				     } 
			 | 
		
	
		
			
			| 
				335
			 | 
			
				406
			 | 
			
			
				   } 
			 | 
		
	
		
			
			| 
				336
			 | 
			
				407
			 | 
			
			
				 } 
			 |