|  | @@ -8,6 +8,7 @@ const MAX_PAYLOAD = 1024 * 1024;
 | 
	
		
			
			| 8 | 8 |   * Client ws client, 单例模式, 负责维护连接
 | 
	
		
			
			| 9 | 9 |   */
 | 
	
		
			
			| 10 | 10 |  class Client {
 | 
	
		
			
			|  | 11 | +  private listeners: Map<number, (data: string) => void>;
 | 
	
		
			
			| 11 | 12 |    private requestCallback: RequestCallback;
 | 
	
		
			
			| 12 | 13 |    private requestHeader: string;
 | 
	
		
			
			| 13 | 14 |    private responseHeader: string;
 | 
	
	
		
			
			|  | @@ -19,6 +20,7 @@ class Client {
 | 
	
		
			
			| 19 | 20 |    private readyStateCallback: ReadyStateCallback;
 | 
	
		
			
			| 20 | 21 |  
 | 
	
		
			
			| 21 | 22 |    constructor(url: string, readyStateCallback: ReadyStateCallback) {
 | 
	
		
			
			|  | 23 | +    this.listeners = new Map<number, (data: string) => void>();
 | 
	
		
			
			| 22 | 24 |      this.maxPayload = MAX_PAYLOAD;
 | 
	
		
			
			| 23 | 25 |      this.url = url;
 | 
	
		
			
			| 24 | 26 |      this.readyStateCallback = readyStateCallback;
 | 
	
	
		
			
			|  | @@ -32,19 +34,20 @@ class Client {
 | 
	
		
			
			| 32 | 34 |        throw new Error('asyncSend: connection refuse');
 | 
	
		
			
			| 33 | 35 |      }
 | 
	
		
			
			| 34 | 36 |  
 | 
	
		
			
			| 35 |  | -    this.addMessageListener(0, (data) => {
 | 
	
		
			
			| 36 |  | -      let code = this.getResponseProperty('code');
 | 
	
		
			
			| 37 |  | -      if (typeof code !== 'undefined') {
 | 
	
		
			
			| 38 |  | -        let message = this.getResponseProperty('message');
 | 
	
		
			
			| 39 |  | -        if (requestCallback.onError !== null) {
 | 
	
		
			
			|  | 37 | +    this.listeners.set(
 | 
	
		
			
			|  | 38 | +      0,
 | 
	
		
			
			|  | 39 | +      (data: string): void => {
 | 
	
		
			
			|  | 40 | +        const code = this.getResponseProperty('code');
 | 
	
		
			
			|  | 41 | +        if (code !== '') {
 | 
	
		
			
			|  | 42 | +          const message = this.getResponseProperty('message');
 | 
	
		
			
			| 40 | 43 |            requestCallback.onError(Number(code), message);
 | 
	
		
			
			|  | 44 | +        } else {
 | 
	
		
			
			|  | 45 | +          requestCallback.onSuccess(data);
 | 
	
		
			
			| 41 | 46 |          }
 | 
	
		
			
			| 42 |  | -      } else {
 | 
	
		
			
			| 43 |  | -        requestCallback.onSuccess(data);
 | 
	
		
			
			| 44 |  | -      }
 | 
	
		
			
			| 45 | 47 |  
 | 
	
		
			
			| 46 |  | -      requestCallback.onEnd();
 | 
	
		
			
			| 47 |  | -    });
 | 
	
		
			
			|  | 48 | +        requestCallback.onEnd();
 | 
	
		
			
			|  | 49 | +      },
 | 
	
		
			
			|  | 50 | +    );
 | 
	
		
			
			| 48 | 51 |  
 | 
	
		
			
			| 49 | 52 |      const p = new Packet();
 | 
	
		
			
			| 50 | 53 |      this.send(p.pack(0, 0, this.requestHeader, JSON.stringify(param)));
 | 
	
	
		
			
			|  | @@ -134,13 +137,13 @@ class Client {
 | 
	
		
			
			| 134 | 137 |    }
 | 
	
		
			
			| 135 | 138 |  
 | 
	
		
			
			| 136 | 139 |    // 添加消息监听
 | 
	
		
			
			| 137 |  | -  addMessageListener(operator, listener) {
 | 
	
		
			
			| 138 |  | -    this.requestCallback[Utils.crc32(operator)] = listener;
 | 
	
		
			
			|  | 140 | +  addMessageListener(operator: string, listener: (data: string) => void) {
 | 
	
		
			
			|  | 141 | +    this.listeners[Utils.crc32(operator)] = listener;
 | 
	
		
			
			| 139 | 142 |    }
 | 
	
		
			
			| 140 | 143 |  
 | 
	
		
			
			| 141 | 144 |    // 移除消息监听
 | 
	
		
			
			| 142 |  | -  removeMessageListener(operator) {
 | 
	
		
			
			| 143 |  | -    delete this.requestCallback[Utils.crc32(operator)];
 | 
	
		
			
			|  | 145 | +  removeMessageListener(operator: string) {
 | 
	
		
			
			|  | 146 | +    delete this.listeners[Utils.crc32(operator)];
 | 
	
		
			
			| 144 | 147 |    }
 | 
	
		
			
			| 145 | 148 |  
 | 
	
		
			
			| 146 | 149 |    // 获取socket的链接状态
 | 
	
	
		
			
			|  | @@ -202,32 +205,20 @@ class Client {
 | 
	
		
			
			| 202 | 205 |  
 | 
	
		
			
			| 203 | 206 |      ws.onopen = (ev) => {
 | 
	
		
			
			| 204 | 207 |        this.reconnectTimes = 0;
 | 
	
		
			
			| 205 |  | -      if (
 | 
	
		
			
			| 206 |  | -        readyStateCallback.hasOwnProperty('onOpen') &&
 | 
	
		
			
			| 207 |  | -        typeof readyStateCallback.onOpen === 'function'
 | 
	
		
			
			| 208 |  | -      ) {
 | 
	
		
			
			| 209 |  | -        readyStateCallback.onOpen(ev);
 | 
	
		
			
			| 210 |  | -      }
 | 
	
		
			
			|  | 208 | +
 | 
	
		
			
			|  | 209 | +      readyStateCallback.onOpen(ev);
 | 
	
		
			
			| 211 | 210 |      };
 | 
	
		
			
			| 212 | 211 |  
 | 
	
		
			
			| 213 | 212 |      ws.onclose = (ev) => {
 | 
	
		
			
			| 214 | 213 |        this.reconnect();
 | 
	
		
			
			| 215 |  | -      if (
 | 
	
		
			
			| 216 |  | -        readyStateCallback.hasOwnProperty('onClose') &&
 | 
	
		
			
			| 217 |  | -        typeof readyStateCallback.onClose === 'function'
 | 
	
		
			
			| 218 |  | -      ) {
 | 
	
		
			
			| 219 |  | -        readyStateCallback.onClose(ev);
 | 
	
		
			
			| 220 |  | -      }
 | 
	
		
			
			|  | 214 | +
 | 
	
		
			
			|  | 215 | +      readyStateCallback.onClose(ev);
 | 
	
		
			
			| 221 | 216 |      };
 | 
	
		
			
			| 222 | 217 |  
 | 
	
		
			
			| 223 | 218 |      ws.onerror = (ev) => {
 | 
	
		
			
			| 224 | 219 |        this.reconnect();
 | 
	
		
			
			| 225 |  | -      if (
 | 
	
		
			
			| 226 |  | -        readyStateCallback.hasOwnProperty('onError') &&
 | 
	
		
			
			| 227 |  | -        typeof readyStateCallback.onError === 'function'
 | 
	
		
			
			| 228 |  | -      ) {
 | 
	
		
			
			| 229 |  | -        readyStateCallback.onError(ev);
 | 
	
		
			
			| 230 |  | -      }
 | 
	
		
			
			|  | 220 | +
 | 
	
		
			
			|  | 221 | +      readyStateCallback.onError(ev);
 | 
	
		
			
			| 231 | 222 |      };
 | 
	
		
			
			| 232 | 223 |  
 | 
	
		
			
			| 233 | 224 |      ws.onmessage = (ev) => {
 | 
	
	
		
			
			|  | @@ -238,28 +229,30 @@ class Client {
 | 
	
		
			
			| 238 | 229 |            try {
 | 
	
		
			
			| 239 | 230 |              let packet = new Packet().unPack(reader.result);
 | 
	
		
			
			| 240 | 231 |              let packetLength = packet.headerLength + packet.bodyLength + 20;
 | 
	
		
			
			| 241 |  | -            if (packetLength > MAX_PAYLOAD) {
 | 
	
		
			
			| 242 |  | -              throw new Error('the packet is big than ' + MAX_PAYLOAD);
 | 
	
		
			
			|  | 232 | +            if (packetLength > this.maxPayload) {
 | 
	
		
			
			|  | 233 | +              throw new Error('the packet is big than ' + this.maxPayload);
 | 
	
		
			
			| 243 | 234 |              }
 | 
	
		
			
			| 244 | 235 |  
 | 
	
		
			
			| 245 | 236 |              let operator = Number(packet.operator) + Number(packet.sequence);
 | 
	
		
			
			| 246 |  | -            if (this.requestCallback.hasOwnProperty(operator)) {
 | 
	
		
			
			|  | 237 | +            if (this.listeners.has(operator)) {
 | 
	
		
			
			| 247 | 238 |                if (packet.body === '') {
 | 
	
		
			
			| 248 | 239 |                  packet.body = '{}';
 | 
	
		
			
			| 249 | 240 |                }
 | 
	
		
			
			| 250 |  | -              this.responseHeader = packet.header;
 | 
	
		
			
			| 251 |  | -              this.requestCallback[operator](JSON.parse(packet.body));
 | 
	
		
			
			|  | 241 | +
 | 
	
		
			
			|  | 242 | +              (<(data: string) => void>this.listeners.get(operator))(
 | 
	
		
			
			|  | 243 | +                packet.body,
 | 
	
		
			
			|  | 244 | +              );
 | 
	
		
			
			| 252 | 245 |              }
 | 
	
		
			
			|  | 246 | +
 | 
	
		
			
			| 253 | 247 |              if (operator !== 0 && packet.body !== 'null') {
 | 
	
		
			
			| 254 | 248 |                console.info('receive data', packet.body);
 | 
	
		
			
			| 255 | 249 |              }
 | 
	
		
			
			| 256 | 250 |            } catch (e) {
 | 
	
		
			
			| 257 |  | -            console.info(e);
 | 
	
		
			
			| 258 | 251 |              throw new Error(e);
 | 
	
		
			
			| 259 | 252 |            }
 | 
	
		
			
			| 260 | 253 |          };
 | 
	
		
			
			| 261 | 254 |        } else {
 | 
	
		
			
			| 262 |  | -        throw new Error('websocket unsupported data format');
 | 
	
		
			
			|  | 255 | +        throw new Error('unsupported data format');
 | 
	
		
			
			| 263 | 256 |        }
 | 
	
		
			
			| 264 | 257 |      };
 | 
	
		
			
			| 265 | 258 |  
 |