gamerpc 8.0.0 → 8.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gamerpc",
3
- "version": "8.0.0",
3
+ "version": "8.0.1",
4
4
  "author": "bookmansoft <ceo@920.cc>",
5
5
  "contributors": [
6
6
  "bookmansoft <ceo@920.cc>"
@@ -32,11 +32,10 @@
32
32
  },
33
33
  "homepage": "https://github.com/bookmansoft/gamegoldtoolkit#readme",
34
34
  "dependencies": {
35
- "socket.io-client": "^4.2.0"
35
+ "gamerpc": "^8.0.0",
36
+ "socket.io-client": "^4.7.2"
36
37
  },
37
38
  "devDependencies": {
38
- "node-fetch": "^2.6.1",
39
- "mocha": "^10.2.0",
40
39
  "babel": "^6.23.0",
41
40
  "babel-core": "^6.26.3",
42
41
  "babel-loader": "^7.1.5",
@@ -44,7 +43,11 @@
44
43
  "babel-preset-env": "^1.7.0",
45
44
  "babel-preset-es2015": "^6.24.1",
46
45
  "babel-preset-stage-2": "^6.24.1",
47
- "cross-env": "^5.2.0",
46
+ "cross-env": "^5.2.1",
47
+ "mocha": "^10.2.0",
48
+ "create-hmac": "1.1.7",
49
+ "elliptic": "^6.5.4",
50
+ "node-fetch": "^2.6.1",
48
51
  "webpack": "^4.46.0",
49
52
  "webpack-cli": "^3.3.2"
50
53
  }
@@ -0,0 +1,595 @@
1
+ /**
2
+ * 授权式连接器,完整封装了客户端通过通过授权模式访问远程全节点的方法,仅仅依赖 create-hmac
3
+ * 可以直接用于 node 环境下的服务端程序,来访问远程全节点丰富的API接口
4
+ * 通过合适的打包程序,也可以用于浏览器环境
5
+ */
6
+
7
+ const assert = require('./utils/assert')
8
+ const {io, signHMAC, Base64, now, CommStatus, createHmac, ReturnCode, CommMode, NotifyType, encrypt, decrypt, stringify} = require('./utils/util');
9
+ let {sha1, hash160, hash256, verifyData, generateKey, signObj, verifyObj, verifyAddress} = require('./utils/verifyData');
10
+ const Secret = require('./utils/secret')
11
+
12
+ /**
13
+ * 终端配置管理
14
+ */
15
+
16
+ class AuthConn
17
+ {
18
+ constructor() {
19
+ this.defaultNetworkType = 'testnet';
20
+ this.AuthConnConfig = {
21
+ 'main': {
22
+ type: 'main',
23
+ ip: '127.0.0.1', //远程服务器地址
24
+ port: 2002, //RPC端口
25
+ head: 'http', //远程服务器通讯协议,分为 http 和 https
26
+ id: 'primary', //默认访问的钱包编号
27
+ apiKey: '', //远程服务器基本校验密码
28
+ cid: '', //授权节点编号,用于访问远程钱包时的认证
29
+ token: '', //授权节点令牌固定量,用于访问远程钱包时的认证
30
+ },
31
+ 'testnet': {
32
+ type: 'testnet',
33
+ ip: '127.0.0.1', //远程服务器地址
34
+ port: 2102, //RPC端口
35
+ head: 'http', //远程服务器通讯协议,分为 http 和 https
36
+ id: 'primary', //默认访问的钱包编号
37
+ apiKey: '', //远程服务器基本校验密码
38
+ cid: '', //授权节点编号,用于访问远程钱包时的认证
39
+ token: '', //授权节点令牌固定量,用于访问远程钱包时的认证
40
+ },
41
+ }
42
+
43
+ this.socketEvents = {};
44
+ this.mode = CommMode.post;
45
+ this.socket = null;
46
+ this.$params = {
47
+ random: null,
48
+ randomTime: null,
49
+ };
50
+ }
51
+
52
+ /**
53
+ * 设置通讯模式
54
+ * @param {*} mode 通讯模式
55
+ * @param {*} cb 连接建立时的回调
56
+ */
57
+ setmode(mode, cb) {
58
+ this.mode = mode;
59
+ if(this.mode == CommMode.ws) {
60
+ this.socketEvents['connect'] = async () => {
61
+ await this.login();
62
+ await this.join();
63
+ if(typeof cb == 'function') {
64
+ await cb();
65
+ }
66
+ };
67
+ }
68
+ return this;
69
+ }
70
+
71
+ async retoken() {
72
+ let params = this.getTerminalConfig();
73
+ let msg = await this.setmode(CommMode.ws).execute('token.random', [params.cid]);
74
+ if(!!params.structured) {
75
+ msg = msg.result;
76
+ }
77
+ const hmac = this.createHmac('sha256', msg);
78
+ params.calc = hmac.update(params.token).digest('hex'); //计算并附加访问令牌
79
+
80
+ return params;
81
+ }
82
+
83
+ /**
84
+ * WS模式下的登录流程
85
+ * @param {*} params
86
+ * @param {*} callback
87
+ */
88
+ async login() {
89
+ let params = await this.retoken();
90
+
91
+ return await this.execute('wallet.auth', [
92
+ params.apiKey,
93
+ params.type,
94
+ params.id,
95
+ params.cid,
96
+ params.calc,
97
+ ]);
98
+ }
99
+
100
+ /**
101
+ * Listen for events on wallet id.
102
+ * @returns {Promise}
103
+ */
104
+
105
+ async join() {
106
+ let conf = this.getTerminalConfig();
107
+
108
+ let method = 'wallet.join';
109
+ let params = await this.retoken();
110
+ params = [params.id, params.cid, params.calc];
111
+ let sig = signObj({
112
+ method: method,
113
+ params: params,
114
+ cid: conf.cid,
115
+ wid: conf.id,
116
+ }, hash256(Buffer.from(conf.token)));
117
+
118
+ return new Promise((resolve, reject) => {
119
+ this.socket.emit('request', method, params, sig, (err) => {
120
+ if (!!err) {
121
+ console.log(err);
122
+ reject(new Error(err.message));
123
+ return;
124
+ }
125
+ resolve();
126
+ });
127
+ });
128
+ };
129
+
130
+ /**
131
+ * Unlisten for events on wallet id.
132
+ */
133
+
134
+ async leave() {
135
+ let conf = this.getTerminalConfig();
136
+
137
+ let method = 'wallet.leave';
138
+ let params = [conf.id];
139
+ let sig = signObj({
140
+ method: method,
141
+ params: params,
142
+ cid: conf.cid,
143
+ wid: conf.id,
144
+ }, hash256(Buffer.from(conf.token)));
145
+
146
+ return new Promise((resolve, reject) => {
147
+ this.socket.emit('request', method, params, sig, (err) => {
148
+ if (err) {
149
+ reject(new Error(err.message));
150
+ return;
151
+ }
152
+ resolve();
153
+ });
154
+ });
155
+ };
156
+
157
+ /**
158
+ * 以 GET 方式,访问开放式API
159
+ * @param {*} url
160
+ */
161
+ async get(url) {
162
+ const newOptions = { json: true };
163
+
164
+ let conf = this.getTerminalConfig();
165
+ let _head = !!conf.head ? conf.head : 'http';
166
+ url = `${_head}://${conf.ip}:${conf.port}/public/${url}`;
167
+
168
+ newOptions.headers = {
169
+ Accept: 'application/json',
170
+ 'Content-Type': 'application/json; charset=utf-8',
171
+ };
172
+
173
+ try {
174
+ let ret = null;
175
+ if(this.fetch) {
176
+ ret = await this.fetch(url, newOptions);
177
+ }
178
+ else {
179
+ ret = await fetch(url, newOptions);
180
+ }
181
+ let json = await ret.json();
182
+
183
+ if(!conf.structured) {
184
+ if(json.error) {
185
+ return json;
186
+ } else {
187
+ return json.result; //脱去外围数据结构
188
+ }
189
+ } else {
190
+ return json; //保留外围数据结构
191
+ }
192
+ }
193
+ catch(e) {
194
+ console.error(e);
195
+ }
196
+ }
197
+
198
+ async post(url, options) {
199
+ const newOptions = { json: true, method: 'POST', body: JSON.stringify(options) };
200
+
201
+ let conf = this.getTerminalConfig();
202
+ let _head = !!conf.head ? conf.head : 'http';
203
+ url = `${_head}://${conf.ip}:${conf.port}/public/${url}`;
204
+
205
+ newOptions.headers = {
206
+ Accept: 'application/json',
207
+ 'Content-Type': 'application/json; charset=utf-8',
208
+ };
209
+
210
+ try {
211
+ let ret = null;
212
+ if(this.fetch) {
213
+ ret = await this.fetch(url, newOptions);
214
+ }
215
+ else {
216
+ ret = await fetch(url, newOptions);
217
+ }
218
+ let json = await ret.json();
219
+
220
+ if(!conf.structured) {
221
+ if(json.error) {
222
+ return json;
223
+ } else {
224
+ return json.result; //脱去外围数据结构
225
+ }
226
+ } else {
227
+ return json; //保留外围数据结构
228
+ }
229
+ }
230
+ catch(e) {
231
+ console.error(e);
232
+ }
233
+ }
234
+
235
+ /**
236
+ * 执行RPC调用
237
+ * @param {*} method
238
+ * @param {*} params
239
+ */
240
+ async execute(method, params) {
241
+ params = params || [];
242
+
243
+ let conf = this.getTerminalConfig();
244
+ switch(this.mode) {
245
+ case CommMode.ws: {
246
+ if(!this.socket) {
247
+ await this.createSocket();
248
+ }
249
+
250
+ let key = generateKey(hash256(Buffer.from(conf.token)));
251
+ let obj = {
252
+ method: method,
253
+ params: params,
254
+ cid: conf.cid,
255
+ wid: conf.id,
256
+ };
257
+ let sig = signObj(obj, key.private);
258
+
259
+ return new Promise((resolve, reject) => {
260
+ this.socket.emit('request', method, params, sig, (err, msg) => {
261
+ if(!!err) {
262
+ reject(err);
263
+ }
264
+ if(!conf.structured) {
265
+ if(!!msg) {
266
+ if(msg.error) {
267
+ resolve(msg);
268
+ } else {
269
+ resolve(msg.result);
270
+ }
271
+ } else {
272
+ resolve(null);
273
+ }
274
+ } else {
275
+ resolve(msg);
276
+ }
277
+ });
278
+ });
279
+ }
280
+
281
+ default: {
282
+ await this.queryToken();
283
+
284
+ let opt = this.fillOptions({
285
+ method: 'POST',
286
+ body: {
287
+ method: method,
288
+ params: params,
289
+ },
290
+ });
291
+
292
+ let rt = await this.request(
293
+ opt,
294
+ this.getTerminalConfig(),
295
+ );
296
+
297
+ if(!rt) {
298
+ //console.error(`${method}通讯错误`);
299
+ return { error:-1, };
300
+ }
301
+
302
+ if(!!rt.error) {
303
+ //console.error(`${method}: ${rt.error.type} / ${rt.error.message}`);
304
+ }
305
+
306
+ if(!conf.structured) {
307
+ if(rt.error) {
308
+ return rt;
309
+ } else {
310
+ return rt.result;
311
+ }
312
+ } else {
313
+ return rt;
314
+ }
315
+ }
316
+ }
317
+ }
318
+
319
+ /**
320
+ * 计算并返回用于对称加密的密钥
321
+ */
322
+ getAes() {
323
+ let buf = hash256(Buffer.from(this.getTerminalConfig().token));
324
+ let aeskey = buf.toString('base64').slice(0, 32);
325
+ buf = hash256(buf);
326
+ let aesiv = buf.toString('base64').slice(0, 16);
327
+
328
+ return {aeskey, aesiv};
329
+ }
330
+
331
+ getRandom() {
332
+ let _t = (now() / 120) | 0;
333
+ this.$params.randomTime = this.$params.randomTime || _t;
334
+ if (_t > this.$params.randomTime) {
335
+ //有效期检测
336
+ this.$params.random = null;
337
+ }
338
+
339
+ return this.$params.random;
340
+ }
341
+
342
+ setRandom(val) {
343
+ this.$params.random = val;
344
+ if (!!val) {
345
+ this.$params.randomTime = (now() / 120) | 0; //设置有效期
346
+ }
347
+ }
348
+
349
+ fillOptions(options) {
350
+ if (!options) {
351
+ options = {};
352
+ }
353
+ if (!options.body) {
354
+ options.body = {};
355
+ }
356
+ if (!options.headers) {
357
+ options.headers = {};
358
+ }
359
+
360
+ let rnd = this.getRandom();
361
+ let _token = this.getTerminalConfig().token;
362
+ if (_token && rnd) {
363
+ options.body.token = signHMAC(_token, rnd);
364
+ }
365
+ options.body.wid = this.getTerminalConfig().id; //附加默认钱包编号
366
+ options.body.cid = this.getTerminalConfig().cid; //附加客户端编号
367
+
368
+ //对上行数据添加签名, 使用原始 token 作为私钥源
369
+ options.body.sig = signObj({
370
+ method: options.body.method,
371
+ params: options.body.params,
372
+ cid: options.body.cid,
373
+ wid: options.body.wid,
374
+ }, hash256(Buffer.from(_token)));
375
+
376
+ options.body = JSON.stringify(options.body);
377
+
378
+ let auth = {
379
+ username: 'gamerpc',
380
+ password: this.getTerminalConfig().apiKey || '',
381
+ };
382
+ var base = new Base64();
383
+ var result = base.encode(`${auth.username}:${auth.password}`);
384
+ options.headers.Authorization = `Basic ${result}`;
385
+ return options;
386
+ }
387
+
388
+ async queryToken() {
389
+ let ret = this.getRandom();
390
+ if (!ret) {
391
+ ret = await this.request(
392
+ this.fillOptions({
393
+ method: 'POST',
394
+ body: {
395
+ method: 'token.random',
396
+ params: [this.getTerminalConfig().cid],
397
+ },
398
+ }),
399
+ this.getTerminalConfig()
400
+ );
401
+ if(!ret || !!ret.error) {
402
+ console.error(`HMAC请求错误`);
403
+ } else {
404
+ this.setRandom(ret.result); //获取令牌随机量
405
+ }
406
+ }
407
+ }
408
+
409
+ /**
410
+ * 创建通讯连接组件
411
+ * @param {*} ip
412
+ * @param {*} port
413
+ */
414
+ async createSocket(){
415
+ this.close();
416
+
417
+ let uri = ``;
418
+ let conf = this.getTerminalConfig();
419
+ let _head = !!conf.head ? conf.head : 'http';
420
+ uri = `${_head}://${conf.ip}:${conf.port}/`;
421
+
422
+ this.socket = io(uri, {'force new connection': true})
423
+ .on('disconnect', ()=>{//断线重连
424
+ this.socket.needConnect = true;
425
+ setTimeout(()=>{
426
+ if(!!this.socket.needConnect) {
427
+ this.socket.needConnect = false;
428
+ this.socket.connect();
429
+ }
430
+ }, 1500);
431
+ })
432
+
433
+ Object.keys(this.socketEvents).map(key=>{
434
+ this.socket.on(key, this.socketEvents[key]);
435
+ });
436
+
437
+ await (async function(time){return new Promise(resolve =>{setTimeout(resolve, time);});})(2000);
438
+ }
439
+
440
+ /**
441
+ * 关闭长连接
442
+ */
443
+ close() {
444
+ if(!!this.socket) {
445
+ this.socket.removeAllListeners();
446
+ this.socket.disconnect();
447
+ this.socket = null;
448
+ }
449
+ }
450
+
451
+ /**
452
+ * Requests a URL, returning a promise.
453
+ *
454
+ * @param {object} [options] The options we want to pass to "fetch"
455
+ * @return {object} An object containing either "data" or "err"
456
+ */
457
+ async request(options, conf) {
458
+ const defaultOptions = {
459
+ //credentials: 'include',
460
+ };
461
+
462
+ const newOptions = { ...defaultOptions, ...options };
463
+ newOptions.json = true;
464
+
465
+ let _head = !!conf.head ? conf.head : 'http';
466
+
467
+ newOptions.uri = `${_head}://${conf.ip}:${conf.port}/`;
468
+
469
+ if (
470
+ newOptions.method === 'POST' ||
471
+ newOptions.method === 'PUT' ||
472
+ newOptions.method === 'DELETE'
473
+ ) {
474
+ newOptions.headers = {
475
+ Accept: 'application/json',
476
+ 'Content-Type': 'application/json; charset=utf-8',
477
+ ...newOptions.headers,
478
+ };
479
+ }
480
+
481
+ try {
482
+ if(this.fetch) {
483
+ let ret = await this.fetch(newOptions.uri, newOptions);
484
+ return await ret.json();
485
+ }
486
+ else {
487
+ let ret = await fetch(newOptions.uri, newOptions);
488
+ return await ret.json();
489
+ }
490
+ }
491
+ catch(e) {
492
+ console.error(e);
493
+ }
494
+ }
495
+
496
+
497
+ /**
498
+ * 设置服务端推送报文的监控句柄,支持链式调用
499
+ * @param cb 回调
500
+ * @param etype 事件类型
501
+ * @returns {Remote}
502
+ */
503
+ watch(cb, etype) {
504
+ if(this.socket) {
505
+ this.socket.on(etype, cb);
506
+ } else {
507
+ this.socketEvents[etype] = cb;
508
+ }
509
+ return this;
510
+ }
511
+
512
+ /**
513
+ * 获取终端配置
514
+ * @param {*} networkType
515
+ */
516
+ getTerminalConfig(networkType) {
517
+ networkType = networkType || this.defaultNetworkType;
518
+
519
+ if(!this.AuthConnConfig[networkType]) {
520
+ this.AuthConnConfig[info.type] = {};
521
+ }
522
+
523
+ return this.AuthConnConfig[networkType];
524
+ }
525
+
526
+ /**
527
+ * 等待指定时长
528
+ * @param {Number} time 等待时长(毫秒)
529
+ */
530
+ async wait (time) {
531
+ await (async (time) => {return new Promise(resolve => {setTimeout(resolve, time);});})(time);
532
+ }
533
+
534
+ /**
535
+ * 设置终端配置
536
+ * @param {*} networkType
537
+ * @param {*} info
538
+ */
539
+ setup(info) {
540
+ if(!!info && info.type) {
541
+ if(!this.AuthConnConfig[info.type]) {
542
+ this.AuthConnConfig[info.type] = {};
543
+ }
544
+
545
+ //设置默认网络类型
546
+ this.defaultNetworkType = info.type;
547
+
548
+ for(let k of Object.keys(info)) {
549
+ //设置默认网络类型的参数 - 逐项设置
550
+ this.AuthConnConfig[info.type][k] = info[k];
551
+ }
552
+
553
+ if(this.mode == CommMode.ws) {
554
+ //断开后自动重连,以便刷新接口参数如目标钱包编号等
555
+ this.close();
556
+ }
557
+ }
558
+
559
+ return this;
560
+ }
561
+
562
+ /**
563
+ * 为了提供node下的兼容性而添加的属性设定函数
564
+ * @param {*} fn
565
+ */
566
+ setFetch(fn) {
567
+ this.fetch = fn;
568
+ return this;
569
+ }
570
+ }
571
+
572
+ AuthConn.prototype.CommMode = CommMode;
573
+ AuthConn.prototype.createHmac = createHmac;
574
+ AuthConn.prototype.assert = assert;
575
+ AuthConn.prototype.stringify = stringify;
576
+ AuthConn.prototype.encrypt = encrypt;
577
+ AuthConn.prototype.decrypt = decrypt;
578
+ AuthConn.prototype.verifyData = verifyData;
579
+ AuthConn.prototype.generateKey = generateKey;
580
+ AuthConn.prototype.signObj = signObj;
581
+ AuthConn.prototype.verifyObj = verifyObj;
582
+ AuthConn.prototype.verifyAddress = verifyAddress;
583
+ AuthConn.prototype.CommMode = CommMode;
584
+ AuthConn.prototype.CommStatus = CommStatus;
585
+ AuthConn.prototype.ReturnCode = ReturnCode;
586
+ AuthConn.prototype.NotifyType = NotifyType;
587
+ AuthConn.prototype.Secret = Secret;
588
+ AuthConn.prototype.hash256 = hash256;
589
+ AuthConn.prototype.hash160 = hash160;
590
+ AuthConn.prototype.sha1 = sha1;
591
+
592
+ /**
593
+ * 访问全节点的远程调用函数
594
+ */
595
+ module.exports = AuthConn;
package/src/gameConn.js CHANGED
@@ -1,6 +1,10 @@
1
- const {stringify, NotifyType, extendObj, CommStatus, clone, ReturnCodeName, io, ReturnCode, CommMode} = require('./utils/util');
1
+ //const {encrypt, decrypt, createHmac} = require('./utils/util');
2
+ const {stringify, NotifyType, extendObj, CommStatus, clone, ReturnCodeName, ReturnCode, CommMode, io} = require('./utils/util');
2
3
  const EventEmitter = require('events').EventEmitter;
3
4
  const Indicator = require('./utils/Indicator');
5
+ // const assert = require('./utils/assert')
6
+ // let {sha1, hash160, hash256, verifyData, generateKey, signObj, verifyObj, verifyAddress} = require('./utils/verifyData');
7
+ // const Secret = require('./utils/secret')
4
8
 
5
9
  /**
6
10
  * RPC控件
@@ -680,9 +684,22 @@ class Remote {
680
684
  }
681
685
 
682
686
  Remote.prototype.CommMode = CommMode;
687
+ // Remote.prototype.createHmac = createHmac;
688
+ // Remote.prototype.assert = assert;
683
689
  Remote.prototype.stringify = stringify;
690
+ // Remote.prototype.encrypt = encrypt;
691
+ // Remote.prototype.decrypt = decrypt;
692
+ // Remote.prototype.verifyData = verifyData;
693
+ // Remote.prototype.generateKey = generateKey;
694
+ // Remote.prototype.signObj = signObj;
695
+ // Remote.prototype.verifyObj = verifyObj;
696
+ // Remote.prototype.verifyAddress = verifyAddress;
684
697
  Remote.prototype.CommStatus = CommStatus;
685
698
  Remote.prototype.ReturnCode = ReturnCode;
686
699
  Remote.prototype.NotifyType = NotifyType;
700
+ // Remote.prototype.Secret = Secret;
701
+ // Remote.prototype.hash256 = hash256;
702
+ // Remote.prototype.hash160 = hash160;
703
+ // Remote.prototype.sha1 = sha1;
687
704
 
688
705
  module.exports = Remote;
package/src/index.js CHANGED
@@ -13,7 +13,11 @@ Array.prototype.randObj = function() {
13
13
  }
14
14
  }
15
15
 
16
+ //const assert = require('./utils/assert')
16
17
  const {CommStatus, ReturnCode, CommMode, NotifyType, stringify} = require('./utils/util');
18
+ //const {createHmac, encrypt, decrypt} = require('./utils/util');
19
+ // let {sha1, hash160, hash256, verifyData, generateKey, signObj, verifyObj, verifyAddress} = require('./utils/verifyData');
20
+ // const Secret = require('./utils/secret')
17
21
 
18
22
  const toolkit = exports;
19
23
 
@@ -21,10 +25,23 @@ const toolkit = exports;
21
25
  toolkit.gameconn = require('./gameConn');
22
26
 
23
27
  //实用函数列表
28
+ //toolkit.assert = assert;
24
29
  toolkit.stringify = stringify;
30
+ // toolkit.encrypt = encrypt;
31
+ // toolkit.decrypt = decrypt;
32
+ // toolkit.verifyData = verifyData;
33
+ // toolkit.generateKey = generateKey;
34
+ // toolkit.signObj = signObj;
35
+ // toolkit.verifyObj = verifyObj;
36
+ // toolkit.verifyAddress = verifyAddress;
25
37
  toolkit.CommMode = CommMode;
26
38
  toolkit.CommStatus = CommStatus;
27
39
  toolkit.ReturnCode = ReturnCode;
28
40
  toolkit.NotifyType = NotifyType;
41
+ // toolkit.createHmac = createHmac;
42
+ // toolkit.Secret = Secret;
43
+ // toolkit.hash256 = hash256;
44
+ // toolkit.hash160 = hash160;
45
+ // toolkit.sha1 = sha1;
29
46
 
30
47
  global.toolkit = toolkit;
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * Socket.IO v4.6.1
3
+ * (c) 2014-2023 Guillermo Rauch
4
+ * Released under the MIT License.
5
+ */
6
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).io=e()}(this,(function(){"use strict";function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}function r(t,e,r){return e&&n(t.prototype,e),r&&n(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t}function i(){return i=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},i.apply(this,arguments)}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&a(t,e)}function s(t){return s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},s(t)}function a(t,e){return a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},a(t,e)}function c(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function u(t,e,n){return u=c()?Reflect.construct.bind():function(t,e,n){var r=[null];r.push.apply(r,e);var i=new(Function.bind.apply(t,r));return n&&a(i,n.prototype),i},u.apply(null,arguments)}function h(t){var e="function"==typeof Map?new Map:void 0;return h=function(t){if(null===t||(n=t,-1===Function.toString.call(n).indexOf("[native code]")))return t;var n;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,r)}function r(){return u(t,arguments,s(this).constructor)}return r.prototype=Object.create(t.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),a(r,t)},h(t)}function f(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function l(t,e){if(e&&("object"==typeof e||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return f(t)}function p(t){var e=c();return function(){var n,r=s(t);if(e){var i=s(this).constructor;n=Reflect.construct(r,arguments,i)}else n=r.apply(this,arguments);return l(this,n)}}function d(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=s(t)););return t}function y(){return y="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(t,e,n){var r=d(t,e);if(r){var i=Object.getOwnPropertyDescriptor(r,e);return i.get?i.get.call(arguments.length<3?t:n):i.value}},y.apply(this,arguments)}function v(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r}function g(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return v(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?v(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var r=0,i=function(){};return{s:i,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,a=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){a=!0,o=t},f:function(){try{s||null==n.return||n.return()}finally{if(a)throw o}}}}var m=Object.create(null);m.open="0",m.close="1",m.ping="2",m.pong="3",m.message="4",m.upgrade="5",m.noop="6";var k=Object.create(null);Object.keys(m).forEach((function(t){k[m[t]]=t}));for(var b={type:"error",data:"parser error"},w="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===Object.prototype.toString.call(Blob),_="function"==typeof ArrayBuffer,E=function(t,e,n){var r,i=t.type,o=t.data;return w&&o instanceof Blob?e?n(o):O(o,n):_&&(o instanceof ArrayBuffer||(r=o,"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(r):r&&r.buffer instanceof ArrayBuffer))?e?n(o):O(new Blob([o]),n):n(m[i]+(o||""))},O=function(t,e){var n=new FileReader;return n.onload=function(){var t=n.result.split(",")[1];e("b"+t)},n.readAsDataURL(t)},A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",R="undefined"==typeof Uint8Array?[]:new Uint8Array(256),T=0;T<A.length;T++)R[A.charCodeAt(T)]=T;var C="function"==typeof ArrayBuffer,B=function(t,e){if("string"!=typeof t)return{type:"message",data:N(t,e)};var n=t.charAt(0);return"b"===n?{type:"message",data:S(t.substring(1),e)}:k[n]?t.length>1?{type:k[n],data:t.substring(1)}:{type:k[n]}:b},S=function(t,e){if(C){var n=function(t){var e,n,r,i,o,s=.75*t.length,a=t.length,c=0;"="===t[t.length-1]&&(s--,"="===t[t.length-2]&&s--);var u=new ArrayBuffer(s),h=new Uint8Array(u);for(e=0;e<a;e+=4)n=R[t.charCodeAt(e)],r=R[t.charCodeAt(e+1)],i=R[t.charCodeAt(e+2)],o=R[t.charCodeAt(e+3)],h[c++]=n<<2|r>>4,h[c++]=(15&r)<<4|i>>2,h[c++]=(3&i)<<6|63&o;return u}(t);return N(n,e)}return{base64:!0,data:t}},N=function(t,e){return"blob"===e&&t instanceof ArrayBuffer?new Blob([t]):t},x=String.fromCharCode(30);function L(t){if(t)return function(t){for(var e in L.prototype)t[e]=L.prototype[e];return t}(t)}L.prototype.on=L.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},L.prototype.once=function(t,e){function n(){this.off(t,n),e.apply(this,arguments)}return n.fn=e,this.on(t,n),this},L.prototype.off=L.prototype.removeListener=L.prototype.removeAllListeners=L.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n,r=this._callbacks["$"+t];if(!r)return this;if(1==arguments.length)return delete this._callbacks["$"+t],this;for(var i=0;i<r.length;i++)if((n=r[i])===e||n.fn===e){r.splice(i,1);break}return 0===r.length&&delete this._callbacks["$"+t],this},L.prototype.emit=function(t){this._callbacks=this._callbacks||{};for(var e=new Array(arguments.length-1),n=this._callbacks["$"+t],r=1;r<arguments.length;r++)e[r-1]=arguments[r];if(n){r=0;for(var i=(n=n.slice(0)).length;r<i;++r)n[r].apply(this,e)}return this},L.prototype.emitReserved=L.prototype.emit,L.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks["$"+t]||[]},L.prototype.hasListeners=function(t){return!!this.listeners(t).length};var P="undefined"!=typeof self?self:"undefined"!=typeof window?window:Function("return this")();function j(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r<e;r++)n[r-1]=arguments[r];return n.reduce((function(e,n){return t.hasOwnProperty(n)&&(e[n]=t[n]),e}),{})}var q=P.setTimeout,I=P.clearTimeout;function D(t,e){e.useNativeTimers?(t.setTimeoutFn=q.bind(P),t.clearTimeoutFn=I.bind(P)):(t.setTimeoutFn=P.setTimeout.bind(P),t.clearTimeoutFn=P.clearTimeout.bind(P))}var F,M=function(t){o(i,t);var n=p(i);function i(t,r,o){var s;return e(this,i),(s=n.call(this,t)).description=r,s.context=o,s.type="TransportError",s}return r(i)}(h(Error)),U=function(t){o(i,t);var n=p(i);function i(t){var r;return e(this,i),(r=n.call(this)).writable=!1,D(f(r),t),r.opts=t,r.query=t.query,r.socket=t.socket,r}return r(i,[{key:"onError",value:function(t,e,n){return y(s(i.prototype),"emitReserved",this).call(this,"error",new M(t,e,n)),this}},{key:"open",value:function(){return this.readyState="opening",this.doOpen(),this}},{key:"close",value:function(){return"opening"!==this.readyState&&"open"!==this.readyState||(this.doClose(),this.onClose()),this}},{key:"send",value:function(t){"open"===this.readyState&&this.write(t)}},{key:"onOpen",value:function(){this.readyState="open",this.writable=!0,y(s(i.prototype),"emitReserved",this).call(this,"open")}},{key:"onData",value:function(t){var e=B(t,this.socket.binaryType);this.onPacket(e)}},{key:"onPacket",value:function(t){y(s(i.prototype),"emitReserved",this).call(this,"packet",t)}},{key:"onClose",value:function(t){this.readyState="closed",y(s(i.prototype),"emitReserved",this).call(this,"close",t)}},{key:"pause",value:function(t){}}]),i}(L),V="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".split(""),H={},K=0,Y=0;function z(t){var e="";do{e=V[t%64]+e,t=Math.floor(t/64)}while(t>0);return e}function W(){var t=z(+new Date);return t!==F?(K=0,F=t):t+"."+z(K++)}for(;Y<64;Y++)H[V[Y]]=Y;function $(t){var e="";for(var n in t)t.hasOwnProperty(n)&&(e.length&&(e+="&"),e+=encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return e}function J(t){for(var e={},n=t.split("&"),r=0,i=n.length;r<i;r++){var o=n[r].split("=");e[decodeURIComponent(o[0])]=decodeURIComponent(o[1])}return e}var Q=!1;try{Q="undefined"!=typeof XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}catch(t){}var X=Q;function G(t){var e=t.xdomain;try{if("undefined"!=typeof XMLHttpRequest&&(!e||X))return new XMLHttpRequest}catch(t){}if(!e)try{return new(P[["Active"].concat("Object").join("X")])("Microsoft.XMLHTTP")}catch(t){}}function Z(){}var tt=null!=new G({xdomain:!1}).responseType,et=function(t){o(s,t);var n=p(s);function s(t){var r;if(e(this,s),(r=n.call(this,t)).polling=!1,"undefined"!=typeof location){var i="https:"===location.protocol,o=location.port;o||(o=i?"443":"80"),r.xd="undefined"!=typeof location&&t.hostname!==location.hostname||o!==t.port,r.xs=t.secure!==i}var a=t&&t.forceBase64;return r.supportsBinary=tt&&!a,r}return r(s,[{key:"name",get:function(){return"polling"}},{key:"doOpen",value:function(){this.poll()}},{key:"pause",value:function(t){var e=this;this.readyState="pausing";var n=function(){e.readyState="paused",t()};if(this.polling||!this.writable){var r=0;this.polling&&(r++,this.once("pollComplete",(function(){--r||n()}))),this.writable||(r++,this.once("drain",(function(){--r||n()})))}else n()}},{key:"poll",value:function(){this.polling=!0,this.doPoll(),this.emitReserved("poll")}},{key:"onData",value:function(t){var e=this;(function(t,e){for(var n=t.split(x),r=[],i=0;i<n.length;i++){var o=B(n[i],e);if(r.push(o),"error"===o.type)break}return r})(t,this.socket.binaryType).forEach((function(t){if("opening"===e.readyState&&"open"===t.type&&e.onOpen(),"close"===t.type)return e.onClose({description:"transport closed by the server"}),!1;e.onPacket(t)})),"closed"!==this.readyState&&(this.polling=!1,this.emitReserved("pollComplete"),"open"===this.readyState&&this.poll())}},{key:"doClose",value:function(){var t=this,e=function(){t.write([{type:"close"}])};"open"===this.readyState?e():this.once("open",e)}},{key:"write",value:function(t){var e=this;this.writable=!1,function(t,e){var n=t.length,r=new Array(n),i=0;t.forEach((function(t,o){E(t,!1,(function(t){r[o]=t,++i===n&&e(r.join(x))}))}))}(t,(function(t){e.doWrite(t,(function(){e.writable=!0,e.emitReserved("drain")}))}))}},{key:"uri",value:function(){var t=this.query||{},e=this.opts.secure?"https":"http",n="";!1!==this.opts.timestampRequests&&(t[this.opts.timestampParam]=W()),this.supportsBinary||t.sid||(t.b64=1),this.opts.port&&("https"===e&&443!==Number(this.opts.port)||"http"===e&&80!==Number(this.opts.port))&&(n=":"+this.opts.port);var r=$(t);return e+"://"+(-1!==this.opts.hostname.indexOf(":")?"["+this.opts.hostname+"]":this.opts.hostname)+n+this.opts.path+(r.length?"?"+r:"")}},{key:"request",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return i(t,{xd:this.xd,xs:this.xs},this.opts),new nt(this.uri(),t)}},{key:"doWrite",value:function(t,e){var n=this,r=this.request({method:"POST",data:t});r.on("success",e),r.on("error",(function(t,e){n.onError("xhr post error",t,e)}))}},{key:"doPoll",value:function(){var t=this,e=this.request();e.on("data",this.onData.bind(this)),e.on("error",(function(e,n){t.onError("xhr poll error",e,n)})),this.pollXhr=e}}]),s}(U),nt=function(t){o(i,t);var n=p(i);function i(t,r){var o;return e(this,i),D(f(o=n.call(this)),r),o.opts=r,o.method=r.method||"GET",o.uri=t,o.async=!1!==r.async,o.data=void 0!==r.data?r.data:null,o.create(),o}return r(i,[{key:"create",value:function(){var t=this,e=j(this.opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");e.xdomain=!!this.opts.xd,e.xscheme=!!this.opts.xs;var n=this.xhr=new G(e);try{n.open(this.method,this.uri,this.async);try{if(this.opts.extraHeaders)for(var r in n.setDisableHeaderCheck&&n.setDisableHeaderCheck(!0),this.opts.extraHeaders)this.opts.extraHeaders.hasOwnProperty(r)&&n.setRequestHeader(r,this.opts.extraHeaders[r])}catch(t){}if("POST"===this.method)try{n.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(t){}try{n.setRequestHeader("Accept","*/*")}catch(t){}"withCredentials"in n&&(n.withCredentials=this.opts.withCredentials),this.opts.requestTimeout&&(n.timeout=this.opts.requestTimeout),n.onreadystatechange=function(){4===n.readyState&&(200===n.status||1223===n.status?t.onLoad():t.setTimeoutFn((function(){t.onError("number"==typeof n.status?n.status:0)}),0))},n.send(this.data)}catch(e){return void this.setTimeoutFn((function(){t.onError(e)}),0)}"undefined"!=typeof document&&(this.index=i.requestsCount++,i.requests[this.index]=this)}},{key:"onError",value:function(t){this.emitReserved("error",t,this.xhr),this.cleanup(!0)}},{key:"cleanup",value:function(t){if(void 0!==this.xhr&&null!==this.xhr){if(this.xhr.onreadystatechange=Z,t)try{this.xhr.abort()}catch(t){}"undefined"!=typeof document&&delete i.requests[this.index],this.xhr=null}}},{key:"onLoad",value:function(){var t=this.xhr.responseText;null!==t&&(this.emitReserved("data",t),this.emitReserved("success"),this.cleanup())}},{key:"abort",value:function(){this.cleanup()}}]),i}(L);if(nt.requestsCount=0,nt.requests={},"undefined"!=typeof document)if("function"==typeof attachEvent)attachEvent("onunload",rt);else if("function"==typeof addEventListener){addEventListener("onpagehide"in P?"pagehide":"unload",rt,!1)}function rt(){for(var t in nt.requests)nt.requests.hasOwnProperty(t)&&nt.requests[t].abort()}var it="function"==typeof Promise&&"function"==typeof Promise.resolve?function(t){return Promise.resolve().then(t)}:function(t,e){return e(t,0)},ot=P.WebSocket||P.MozWebSocket,st="undefined"!=typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase(),at=function(t){o(i,t);var n=p(i);function i(t){var r;return e(this,i),(r=n.call(this,t)).supportsBinary=!t.forceBase64,r}return r(i,[{key:"name",get:function(){return"websocket"}},{key:"doOpen",value:function(){if(this.check()){var t=this.uri(),e=this.opts.protocols,n=st?{}:j(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(n.headers=this.opts.extraHeaders);try{this.ws=st?new ot(t,e,n):e?new ot(t,e):new ot(t)}catch(t){return this.emitReserved("error",t)}this.ws.binaryType=this.socket.binaryType||"arraybuffer",this.addEventListeners()}}},{key:"addEventListeners",value:function(){var t=this;this.ws.onopen=function(){t.opts.autoUnref&&t.ws._socket.unref(),t.onOpen()},this.ws.onclose=function(e){return t.onClose({description:"websocket connection closed",context:e})},this.ws.onmessage=function(e){return t.onData(e.data)},this.ws.onerror=function(e){return t.onError("websocket error",e)}}},{key:"write",value:function(t){var e=this;this.writable=!1;for(var n=function(n){var r=t[n],i=n===t.length-1;E(r,e.supportsBinary,(function(t){try{e.ws.send(t)}catch(t){}i&&it((function(){e.writable=!0,e.emitReserved("drain")}),e.setTimeoutFn)}))},r=0;r<t.length;r++)n(r)}},{key:"doClose",value:function(){void 0!==this.ws&&(this.ws.close(),this.ws=null)}},{key:"uri",value:function(){var t=this.query||{},e=this.opts.secure?"wss":"ws",n="";this.opts.port&&("wss"===e&&443!==Number(this.opts.port)||"ws"===e&&80!==Number(this.opts.port))&&(n=":"+this.opts.port),this.opts.timestampRequests&&(t[this.opts.timestampParam]=W()),this.supportsBinary||(t.b64=1);var r=$(t);return e+"://"+(-1!==this.opts.hostname.indexOf(":")?"["+this.opts.hostname+"]":this.opts.hostname)+n+this.opts.path+(r.length?"?"+r:"")}},{key:"check",value:function(){return!!ot}}]),i}(U),ct={websocket:at,polling:et},ut=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,ht=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function ft(t){var e=t,n=t.indexOf("["),r=t.indexOf("]");-1!=n&&-1!=r&&(t=t.substring(0,n)+t.substring(n,r).replace(/:/g,";")+t.substring(r,t.length));for(var i,o,s=ut.exec(t||""),a={},c=14;c--;)a[ht[c]]=s[c]||"";return-1!=n&&-1!=r&&(a.source=e,a.host=a.host.substring(1,a.host.length-1).replace(/;/g,":"),a.authority=a.authority.replace("[","").replace("]","").replace(/;/g,":"),a.ipv6uri=!0),a.pathNames=function(t,e){var n=/\/{2,9}/g,r=e.replace(n,"/").split("/");"/"!=e.slice(0,1)&&0!==e.length||r.splice(0,1);"/"==e.slice(-1)&&r.splice(r.length-1,1);return r}(0,a.path),a.queryKey=(i=a.query,o={},i.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,(function(t,e,n){e&&(o[e]=n)})),o),a}var lt=function(n){o(a,n);var s=p(a);function a(n){var r,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e(this,a),(r=s.call(this)).writeBuffer=[],n&&"object"===t(n)&&(o=n,n=null),n?(n=ft(n),o.hostname=n.host,o.secure="https"===n.protocol||"wss"===n.protocol,o.port=n.port,n.query&&(o.query=n.query)):o.host&&(o.hostname=ft(o.host).host),D(f(r),o),r.secure=null!=o.secure?o.secure:"undefined"!=typeof location&&"https:"===location.protocol,o.hostname&&!o.port&&(o.port=r.secure?"443":"80"),r.hostname=o.hostname||("undefined"!=typeof location?location.hostname:"localhost"),r.port=o.port||("undefined"!=typeof location&&location.port?location.port:r.secure?"443":"80"),r.transports=o.transports||["polling","websocket"],r.writeBuffer=[],r.prevBufferLen=0,r.opts=i({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!0},o),r.opts.path=r.opts.path.replace(/\/$/,"")+(r.opts.addTrailingSlash?"/":""),"string"==typeof r.opts.query&&(r.opts.query=J(r.opts.query)),r.id=null,r.upgrades=null,r.pingInterval=null,r.pingTimeout=null,r.pingTimeoutTimer=null,"function"==typeof addEventListener&&(r.opts.closeOnBeforeunload&&(r.beforeunloadEventListener=function(){r.transport&&(r.transport.removeAllListeners(),r.transport.close())},addEventListener("beforeunload",r.beforeunloadEventListener,!1)),"localhost"!==r.hostname&&(r.offlineEventListener=function(){r.onClose("transport close",{description:"network connection lost"})},addEventListener("offline",r.offlineEventListener,!1))),r.open(),r}return r(a,[{key:"createTransport",value:function(t){var e=i({},this.opts.query);e.EIO=4,e.transport=t,this.id&&(e.sid=this.id);var n=i({},this.opts.transportOptions[t],this.opts,{query:e,socket:this,hostname:this.hostname,secure:this.secure,port:this.port});return new ct[t](n)}},{key:"open",value:function(){var t,e=this;if(this.opts.rememberUpgrade&&a.priorWebsocketSuccess&&-1!==this.transports.indexOf("websocket"))t="websocket";else{if(0===this.transports.length)return void this.setTimeoutFn((function(){e.emitReserved("error","No transports available")}),0);t=this.transports[0]}this.readyState="opening";try{t=this.createTransport(t)}catch(t){return this.transports.shift(),void this.open()}t.open(),this.setTransport(t)}},{key:"setTransport",value:function(t){var e=this;this.transport&&this.transport.removeAllListeners(),this.transport=t,t.on("drain",this.onDrain.bind(this)).on("packet",this.onPacket.bind(this)).on("error",this.onError.bind(this)).on("close",(function(t){return e.onClose("transport close",t)}))}},{key:"probe",value:function(t){var e=this,n=this.createTransport(t),r=!1;a.priorWebsocketSuccess=!1;var i=function(){r||(n.send([{type:"ping",data:"probe"}]),n.once("packet",(function(t){if(!r)if("pong"===t.type&&"probe"===t.data){if(e.upgrading=!0,e.emitReserved("upgrading",n),!n)return;a.priorWebsocketSuccess="websocket"===n.name,e.transport.pause((function(){r||"closed"!==e.readyState&&(f(),e.setTransport(n),n.send([{type:"upgrade"}]),e.emitReserved("upgrade",n),n=null,e.upgrading=!1,e.flush())}))}else{var i=new Error("probe error");i.transport=n.name,e.emitReserved("upgradeError",i)}})))};function o(){r||(r=!0,f(),n.close(),n=null)}var s=function(t){var r=new Error("probe error: "+t);r.transport=n.name,o(),e.emitReserved("upgradeError",r)};function c(){s("transport closed")}function u(){s("socket closed")}function h(t){n&&t.name!==n.name&&o()}var f=function(){n.removeListener("open",i),n.removeListener("error",s),n.removeListener("close",c),e.off("close",u),e.off("upgrading",h)};n.once("open",i),n.once("error",s),n.once("close",c),this.once("close",u),this.once("upgrading",h),n.open()}},{key:"onOpen",value:function(){if(this.readyState="open",a.priorWebsocketSuccess="websocket"===this.transport.name,this.emitReserved("open"),this.flush(),"open"===this.readyState&&this.opts.upgrade)for(var t=0,e=this.upgrades.length;t<e;t++)this.probe(this.upgrades[t])}},{key:"onPacket",value:function(t){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState)switch(this.emitReserved("packet",t),this.emitReserved("heartbeat"),t.type){case"open":this.onHandshake(JSON.parse(t.data));break;case"ping":this.resetPingTimeout(),this.sendPacket("pong"),this.emitReserved("ping"),this.emitReserved("pong");break;case"error":var e=new Error("server error");e.code=t.data,this.onError(e);break;case"message":this.emitReserved("data",t.data),this.emitReserved("message",t.data)}}},{key:"onHandshake",value:function(t){this.emitReserved("handshake",t),this.id=t.sid,this.transport.query.sid=t.sid,this.upgrades=this.filterUpgrades(t.upgrades),this.pingInterval=t.pingInterval,this.pingTimeout=t.pingTimeout,this.maxPayload=t.maxPayload,this.onOpen(),"closed"!==this.readyState&&this.resetPingTimeout()}},{key:"resetPingTimeout",value:function(){var t=this;this.clearTimeoutFn(this.pingTimeoutTimer),this.pingTimeoutTimer=this.setTimeoutFn((function(){t.onClose("ping timeout")}),this.pingInterval+this.pingTimeout),this.opts.autoUnref&&this.pingTimeoutTimer.unref()}},{key:"onDrain",value:function(){this.writeBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,0===this.writeBuffer.length?this.emitReserved("drain"):this.flush()}},{key:"flush",value:function(){if("closed"!==this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){var t=this.getWritablePackets();this.transport.send(t),this.prevBufferLen=t.length,this.emitReserved("flush")}}},{key:"getWritablePackets",value:function(){if(!(this.maxPayload&&"polling"===this.transport.name&&this.writeBuffer.length>1))return this.writeBuffer;for(var t,e=1,n=0;n<this.writeBuffer.length;n++){var r=this.writeBuffer[n].data;if(r&&(e+="string"==typeof(t=r)?function(t){for(var e=0,n=0,r=0,i=t.length;r<i;r++)(e=t.charCodeAt(r))<128?n+=1:e<2048?n+=2:e<55296||e>=57344?n+=3:(r++,n+=4);return n}(t):Math.ceil(1.33*(t.byteLength||t.size))),n>0&&e>this.maxPayload)return this.writeBuffer.slice(0,n);e+=2}return this.writeBuffer}},{key:"write",value:function(t,e,n){return this.sendPacket("message",t,e,n),this}},{key:"send",value:function(t,e,n){return this.sendPacket("message",t,e,n),this}},{key:"sendPacket",value:function(t,e,n,r){if("function"==typeof e&&(r=e,e=void 0),"function"==typeof n&&(r=n,n=null),"closing"!==this.readyState&&"closed"!==this.readyState){(n=n||{}).compress=!1!==n.compress;var i={type:t,data:e,options:n};this.emitReserved("packetCreate",i),this.writeBuffer.push(i),r&&this.once("flush",r),this.flush()}}},{key:"close",value:function(){var t=this,e=function(){t.onClose("forced close"),t.transport.close()},n=function n(){t.off("upgrade",n),t.off("upgradeError",n),e()},r=function(){t.once("upgrade",n),t.once("upgradeError",n)};return"opening"!==this.readyState&&"open"!==this.readyState||(this.readyState="closing",this.writeBuffer.length?this.once("drain",(function(){t.upgrading?r():e()})):this.upgrading?r():e()),this}},{key:"onError",value:function(t){a.priorWebsocketSuccess=!1,this.emitReserved("error",t),this.onClose("transport error",t)}},{key:"onClose",value:function(t,e){"opening"!==this.readyState&&"open"!==this.readyState&&"closing"!==this.readyState||(this.clearTimeoutFn(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),"function"==typeof removeEventListener&&(removeEventListener("beforeunload",this.beforeunloadEventListener,!1),removeEventListener("offline",this.offlineEventListener,!1)),this.readyState="closed",this.id=null,this.emitReserved("close",t,e),this.writeBuffer=[],this.prevBufferLen=0)}},{key:"filterUpgrades",value:function(t){for(var e=[],n=0,r=t.length;n<r;n++)~this.transports.indexOf(t[n])&&e.push(t[n]);return e}}]),a}(L);lt.protocol=4,lt.protocol;var pt="function"==typeof ArrayBuffer,dt=Object.prototype.toString,yt="function"==typeof Blob||"undefined"!=typeof Blob&&"[object BlobConstructor]"===dt.call(Blob),vt="function"==typeof File||"undefined"!=typeof File&&"[object FileConstructor]"===dt.call(File);function gt(t){return pt&&(t instanceof ArrayBuffer||function(t){return"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):t.buffer instanceof ArrayBuffer}(t))||yt&&t instanceof Blob||vt&&t instanceof File}function mt(e,n){if(!e||"object"!==t(e))return!1;if(Array.isArray(e)){for(var r=0,i=e.length;r<i;r++)if(mt(e[r]))return!0;return!1}if(gt(e))return!0;if(e.toJSON&&"function"==typeof e.toJSON&&1===arguments.length)return mt(e.toJSON(),!0);for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)&&mt(e[o]))return!0;return!1}function kt(t){var e=[],n=t.data,r=t;return r.data=bt(n,e),r.attachments=e.length,{packet:r,buffers:e}}function bt(e,n){if(!e)return e;if(gt(e)){var r={_placeholder:!0,num:n.length};return n.push(e),r}if(Array.isArray(e)){for(var i=new Array(e.length),o=0;o<e.length;o++)i[o]=bt(e[o],n);return i}if("object"===t(e)&&!(e instanceof Date)){var s={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&(s[a]=bt(e[a],n));return s}return e}function wt(t,e){return t.data=_t(t.data,e),delete t.attachments,t}function _t(e,n){if(!e)return e;if(e&&!0===e._placeholder){if("number"==typeof e.num&&e.num>=0&&e.num<n.length)return n[e.num];throw new Error("illegal attachments")}if(Array.isArray(e))for(var r=0;r<e.length;r++)e[r]=_t(e[r],n);else if("object"===t(e))for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=_t(e[i],n));return e}var Et;!function(t){t[t.CONNECT=0]="CONNECT",t[t.DISCONNECT=1]="DISCONNECT",t[t.EVENT=2]="EVENT",t[t.ACK=3]="ACK",t[t.CONNECT_ERROR=4]="CONNECT_ERROR",t[t.BINARY_EVENT=5]="BINARY_EVENT",t[t.BINARY_ACK=6]="BINARY_ACK"}(Et||(Et={}));var Ot=function(){function t(n){e(this,t),this.replacer=n}return r(t,[{key:"encode",value:function(t){return t.type!==Et.EVENT&&t.type!==Et.ACK||!mt(t)?[this.encodeAsString(t)]:this.encodeAsBinary({type:t.type===Et.EVENT?Et.BINARY_EVENT:Et.BINARY_ACK,nsp:t.nsp,data:t.data,id:t.id})}},{key:"encodeAsString",value:function(t){var e=""+t.type;return t.type!==Et.BINARY_EVENT&&t.type!==Et.BINARY_ACK||(e+=t.attachments+"-"),t.nsp&&"/"!==t.nsp&&(e+=t.nsp+","),null!=t.id&&(e+=t.id),null!=t.data&&(e+=JSON.stringify(t.data,this.replacer)),e}},{key:"encodeAsBinary",value:function(t){var e=kt(t),n=this.encodeAsString(e.packet),r=e.buffers;return r.unshift(n),r}}]),t}(),At=function(n){o(a,n);var i=p(a);function a(t){var n;return e(this,a),(n=i.call(this)).reviver=t,n}return r(a,[{key:"add",value:function(t){var e;if("string"==typeof t){if(this.reconstructor)throw new Error("got plaintext data when reconstructing a packet");var n=(e=this.decodeString(t)).type===Et.BINARY_EVENT;n||e.type===Et.BINARY_ACK?(e.type=n?Et.EVENT:Et.ACK,this.reconstructor=new Rt(e),0===e.attachments&&y(s(a.prototype),"emitReserved",this).call(this,"decoded",e)):y(s(a.prototype),"emitReserved",this).call(this,"decoded",e)}else{if(!gt(t)&&!t.base64)throw new Error("Unknown type: "+t);if(!this.reconstructor)throw new Error("got binary data when not reconstructing a packet");(e=this.reconstructor.takeBinaryData(t))&&(this.reconstructor=null,y(s(a.prototype),"emitReserved",this).call(this,"decoded",e))}}},{key:"decodeString",value:function(t){var e=0,n={type:Number(t.charAt(0))};if(void 0===Et[n.type])throw new Error("unknown packet type "+n.type);if(n.type===Et.BINARY_EVENT||n.type===Et.BINARY_ACK){for(var r=e+1;"-"!==t.charAt(++e)&&e!=t.length;);var i=t.substring(r,e);if(i!=Number(i)||"-"!==t.charAt(e))throw new Error("Illegal attachments");n.attachments=Number(i)}if("/"===t.charAt(e+1)){for(var o=e+1;++e;){if(","===t.charAt(e))break;if(e===t.length)break}n.nsp=t.substring(o,e)}else n.nsp="/";var s=t.charAt(e+1);if(""!==s&&Number(s)==s){for(var c=e+1;++e;){var u=t.charAt(e);if(null==u||Number(u)!=u){--e;break}if(e===t.length)break}n.id=Number(t.substring(c,e+1))}if(t.charAt(++e)){var h=this.tryParse(t.substr(e));if(!a.isPayloadValid(n.type,h))throw new Error("invalid payload");n.data=h}return n}},{key:"tryParse",value:function(t){try{return JSON.parse(t,this.reviver)}catch(t){return!1}}},{key:"destroy",value:function(){this.reconstructor&&(this.reconstructor.finishedReconstruction(),this.reconstructor=null)}}],[{key:"isPayloadValid",value:function(e,n){switch(e){case Et.CONNECT:return"object"===t(n);case Et.DISCONNECT:return void 0===n;case Et.CONNECT_ERROR:return"string"==typeof n||"object"===t(n);case Et.EVENT:case Et.BINARY_EVENT:return Array.isArray(n)&&n.length>0;case Et.ACK:case Et.BINARY_ACK:return Array.isArray(n)}}}]),a}(L),Rt=function(){function t(n){e(this,t),this.packet=n,this.buffers=[],this.reconPack=n}return r(t,[{key:"takeBinaryData",value:function(t){if(this.buffers.push(t),this.buffers.length===this.reconPack.attachments){var e=wt(this.reconPack,this.buffers);return this.finishedReconstruction(),e}return null}},{key:"finishedReconstruction",value:function(){this.reconPack=null,this.buffers=[]}}]),t}(),Tt=Object.freeze({__proto__:null,protocol:5,get PacketType(){return Et},Encoder:Ot,Decoder:At});function Ct(t,e,n){return t.on(e,n),function(){t.off(e,n)}}var Bt=Object.freeze({connect:1,connect_error:1,disconnect:1,disconnecting:1,newListener:1,removeListener:1}),St=function(t){o(a,t);var n=p(a);function a(t,r,o){var s;return e(this,a),(s=n.call(this)).connected=!1,s.recovered=!1,s.receiveBuffer=[],s.sendBuffer=[],s._queue=[],s._queueSeq=0,s.ids=0,s.acks={},s.flags={},s.io=t,s.nsp=r,o&&o.auth&&(s.auth=o.auth),s._opts=i({},o),s.io._autoConnect&&s.open(),s}return r(a,[{key:"disconnected",get:function(){return!this.connected}},{key:"subEvents",value:function(){if(!this.subs){var t=this.io;this.subs=[Ct(t,"open",this.onopen.bind(this)),Ct(t,"packet",this.onpacket.bind(this)),Ct(t,"error",this.onerror.bind(this)),Ct(t,"close",this.onclose.bind(this))]}}},{key:"active",get:function(){return!!this.subs}},{key:"connect",value:function(){return this.connected||(this.subEvents(),this.io._reconnecting||this.io.open(),"open"===this.io._readyState&&this.onopen()),this}},{key:"open",value:function(){return this.connect()}},{key:"send",value:function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];return e.unshift("message"),this.emit.apply(this,e),this}},{key:"emit",value:function(t){if(Bt.hasOwnProperty(t))throw new Error('"'+t.toString()+'" is a reserved event name');for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r<e;r++)n[r-1]=arguments[r];if(n.unshift(t),this._opts.retries&&!this.flags.fromQueue&&!this.flags.volatile)return this._addToQueue(n),this;var i={type:Et.EVENT,data:n,options:{}};if(i.options.compress=!1!==this.flags.compress,"function"==typeof n[n.length-1]){var o=this.ids++,s=n.pop();this._registerAckCallback(o,s),i.id=o}var a=this.io.engine&&this.io.engine.transport&&this.io.engine.transport.writable,c=this.flags.volatile&&(!a||!this.connected);return c||(this.connected?(this.notifyOutgoingListeners(i),this.packet(i)):this.sendBuffer.push(i)),this.flags={},this}},{key:"_registerAckCallback",value:function(t,e){var n,r=this,i=null!==(n=this.flags.timeout)&&void 0!==n?n:this._opts.ackTimeout;if(void 0!==i){var o=this.io.setTimeoutFn((function(){delete r.acks[t];for(var n=0;n<r.sendBuffer.length;n++)r.sendBuffer[n].id===t&&r.sendBuffer.splice(n,1);e.call(r,new Error("operation has timed out"))}),i);this.acks[t]=function(){r.io.clearTimeoutFn(o);for(var t=arguments.length,n=new Array(t),i=0;i<t;i++)n[i]=arguments[i];e.apply(r,[null].concat(n))}}else this.acks[t]=e}},{key:"emitWithAck",value:function(t){for(var e=this,n=arguments.length,r=new Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];var o=void 0!==this.flags.timeout||void 0!==this._opts.ackTimeout;return new Promise((function(n,i){r.push((function(t,e){return o?t?i(t):n(e):n(t)})),e.emit.apply(e,[t].concat(r))}))}},{key:"_addToQueue",value:function(t){var e,n=this;"function"==typeof t[t.length-1]&&(e=t.pop());var r={id:this._queueSeq++,tryCount:0,pending:!1,args:t,flags:i({fromQueue:!0},this.flags)};t.push((function(t){if(r===n._queue[0]){var i=null!==t;if(i)r.tryCount>n._opts.retries&&(n._queue.shift(),e&&e(t));else if(n._queue.shift(),e){for(var o=arguments.length,s=new Array(o>1?o-1:0),a=1;a<o;a++)s[a-1]=arguments[a];e.apply(void 0,[null].concat(s))}return r.pending=!1,n._drainQueue()}})),this._queue.push(r),this._drainQueue()}},{key:"_drainQueue",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.connected&&0!==this._queue.length){var e=this._queue[0];e.pending&&!t||(e.pending=!0,e.tryCount++,this.flags=e.flags,this.emit.apply(this,e.args))}}},{key:"packet",value:function(t){t.nsp=this.nsp,this.io._packet(t)}},{key:"onopen",value:function(){var t=this;"function"==typeof this.auth?this.auth((function(e){t._sendConnectPacket(e)})):this._sendConnectPacket(this.auth)}},{key:"_sendConnectPacket",value:function(t){this.packet({type:Et.CONNECT,data:this._pid?i({pid:this._pid,offset:this._lastOffset},t):t})}},{key:"onerror",value:function(t){this.connected||this.emitReserved("connect_error",t)}},{key:"onclose",value:function(t,e){this.connected=!1,delete this.id,this.emitReserved("disconnect",t,e)}},{key:"onpacket",value:function(t){if(t.nsp===this.nsp)switch(t.type){case Et.CONNECT:t.data&&t.data.sid?this.onconnect(t.data.sid,t.data.pid):this.emitReserved("connect_error",new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case Et.EVENT:case Et.BINARY_EVENT:this.onevent(t);break;case Et.ACK:case Et.BINARY_ACK:this.onack(t);break;case Et.DISCONNECT:this.ondisconnect();break;case Et.CONNECT_ERROR:this.destroy();var e=new Error(t.data.message);e.data=t.data.data,this.emitReserved("connect_error",e)}}},{key:"onevent",value:function(t){var e=t.data||[];null!=t.id&&e.push(this.ack(t.id)),this.connected?this.emitEvent(e):this.receiveBuffer.push(Object.freeze(e))}},{key:"emitEvent",value:function(t){if(this._anyListeners&&this._anyListeners.length){var e,n=g(this._anyListeners.slice());try{for(n.s();!(e=n.n()).done;){e.value.apply(this,t)}}catch(t){n.e(t)}finally{n.f()}}y(s(a.prototype),"emit",this).apply(this,t),this._pid&&t.length&&"string"==typeof t[t.length-1]&&(this._lastOffset=t[t.length-1])}},{key:"ack",value:function(t){var e=this,n=!1;return function(){if(!n){n=!0;for(var r=arguments.length,i=new Array(r),o=0;o<r;o++)i[o]=arguments[o];e.packet({type:Et.ACK,id:t,data:i})}}}},{key:"onack",value:function(t){var e=this.acks[t.id];"function"==typeof e&&(e.apply(this,t.data),delete this.acks[t.id])}},{key:"onconnect",value:function(t,e){this.id=t,this.recovered=e&&this._pid===e,this._pid=e,this.connected=!0,this.emitBuffered(),this.emitReserved("connect"),this._drainQueue(!0)}},{key:"emitBuffered",value:function(){var t=this;this.receiveBuffer.forEach((function(e){return t.emitEvent(e)})),this.receiveBuffer=[],this.sendBuffer.forEach((function(e){t.notifyOutgoingListeners(e),t.packet(e)})),this.sendBuffer=[]}},{key:"ondisconnect",value:function(){this.destroy(),this.onclose("io server disconnect")}},{key:"destroy",value:function(){this.subs&&(this.subs.forEach((function(t){return t()})),this.subs=void 0),this.io._destroy(this)}},{key:"disconnect",value:function(){return this.connected&&this.packet({type:Et.DISCONNECT}),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}},{key:"close",value:function(){return this.disconnect()}},{key:"compress",value:function(t){return this.flags.compress=t,this}},{key:"volatile",get:function(){return this.flags.volatile=!0,this}},{key:"timeout",value:function(t){return this.flags.timeout=t,this}},{key:"onAny",value:function(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(t),this}},{key:"prependAny",value:function(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(t),this}},{key:"offAny",value:function(t){if(!this._anyListeners)return this;if(t){for(var e=this._anyListeners,n=0;n<e.length;n++)if(t===e[n])return e.splice(n,1),this}else this._anyListeners=[];return this}},{key:"listenersAny",value:function(){return this._anyListeners||[]}},{key:"onAnyOutgoing",value:function(t){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.push(t),this}},{key:"prependAnyOutgoing",value:function(t){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.unshift(t),this}},{key:"offAnyOutgoing",value:function(t){if(!this._anyOutgoingListeners)return this;if(t){for(var e=this._anyOutgoingListeners,n=0;n<e.length;n++)if(t===e[n])return e.splice(n,1),this}else this._anyOutgoingListeners=[];return this}},{key:"listenersAnyOutgoing",value:function(){return this._anyOutgoingListeners||[]}},{key:"notifyOutgoingListeners",value:function(t){if(this._anyOutgoingListeners&&this._anyOutgoingListeners.length){var e,n=g(this._anyOutgoingListeners.slice());try{for(n.s();!(e=n.n()).done;){e.value.apply(this,t.data)}}catch(t){n.e(t)}finally{n.f()}}}}]),a}(L);function Nt(t){t=t||{},this.ms=t.min||100,this.max=t.max||1e4,this.factor=t.factor||2,this.jitter=t.jitter>0&&t.jitter<=1?t.jitter:0,this.attempts=0}Nt.prototype.duration=function(){var t=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var e=Math.random(),n=Math.floor(e*this.jitter*t);t=0==(1&Math.floor(10*e))?t-n:t+n}return 0|Math.min(t,this.max)},Nt.prototype.reset=function(){this.attempts=0},Nt.prototype.setMin=function(t){this.ms=t},Nt.prototype.setMax=function(t){this.max=t},Nt.prototype.setJitter=function(t){this.jitter=t};var xt=function(n){o(s,n);var i=p(s);function s(n,r){var o,a;e(this,s),(o=i.call(this)).nsps={},o.subs=[],n&&"object"===t(n)&&(r=n,n=void 0),(r=r||{}).path=r.path||"/socket.io",o.opts=r,D(f(o),r),o.reconnection(!1!==r.reconnection),o.reconnectionAttempts(r.reconnectionAttempts||1/0),o.reconnectionDelay(r.reconnectionDelay||1e3),o.reconnectionDelayMax(r.reconnectionDelayMax||5e3),o.randomizationFactor(null!==(a=r.randomizationFactor)&&void 0!==a?a:.5),o.backoff=new Nt({min:o.reconnectionDelay(),max:o.reconnectionDelayMax(),jitter:o.randomizationFactor()}),o.timeout(null==r.timeout?2e4:r.timeout),o._readyState="closed",o.uri=n;var c=r.parser||Tt;return o.encoder=new c.Encoder,o.decoder=new c.Decoder,o._autoConnect=!1!==r.autoConnect,o._autoConnect&&o.open(),o}return r(s,[{key:"reconnection",value:function(t){return arguments.length?(this._reconnection=!!t,this):this._reconnection}},{key:"reconnectionAttempts",value:function(t){return void 0===t?this._reconnectionAttempts:(this._reconnectionAttempts=t,this)}},{key:"reconnectionDelay",value:function(t){var e;return void 0===t?this._reconnectionDelay:(this._reconnectionDelay=t,null===(e=this.backoff)||void 0===e||e.setMin(t),this)}},{key:"randomizationFactor",value:function(t){var e;return void 0===t?this._randomizationFactor:(this._randomizationFactor=t,null===(e=this.backoff)||void 0===e||e.setJitter(t),this)}},{key:"reconnectionDelayMax",value:function(t){var e;return void 0===t?this._reconnectionDelayMax:(this._reconnectionDelayMax=t,null===(e=this.backoff)||void 0===e||e.setMax(t),this)}},{key:"timeout",value:function(t){return arguments.length?(this._timeout=t,this):this._timeout}},{key:"maybeReconnectOnOpen",value:function(){!this._reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()}},{key:"open",value:function(t){var e=this;if(~this._readyState.indexOf("open"))return this;this.engine=new lt(this.uri,this.opts);var n=this.engine,r=this;this._readyState="opening",this.skipReconnect=!1;var i=Ct(n,"open",(function(){r.onopen(),t&&t()})),o=Ct(n,"error",(function(n){r.cleanup(),r._readyState="closed",e.emitReserved("error",n),t?t(n):r.maybeReconnectOnOpen()}));if(!1!==this._timeout){var s=this._timeout;0===s&&i();var a=this.setTimeoutFn((function(){i(),n.close(),n.emit("error",new Error("timeout"))}),s);this.opts.autoUnref&&a.unref(),this.subs.push((function(){clearTimeout(a)}))}return this.subs.push(i),this.subs.push(o),this}},{key:"connect",value:function(t){return this.open(t)}},{key:"onopen",value:function(){this.cleanup(),this._readyState="open",this.emitReserved("open");var t=this.engine;this.subs.push(Ct(t,"ping",this.onping.bind(this)),Ct(t,"data",this.ondata.bind(this)),Ct(t,"error",this.onerror.bind(this)),Ct(t,"close",this.onclose.bind(this)),Ct(this.decoder,"decoded",this.ondecoded.bind(this)))}},{key:"onping",value:function(){this.emitReserved("ping")}},{key:"ondata",value:function(t){try{this.decoder.add(t)}catch(t){this.onclose("parse error",t)}}},{key:"ondecoded",value:function(t){var e=this;it((function(){e.emitReserved("packet",t)}),this.setTimeoutFn)}},{key:"onerror",value:function(t){this.emitReserved("error",t)}},{key:"socket",value:function(t,e){var n=this.nsps[t];return n?this._autoConnect&&!n.active&&n.connect():(n=new St(this,t,e),this.nsps[t]=n),n}},{key:"_destroy",value:function(t){for(var e=0,n=Object.keys(this.nsps);e<n.length;e++){var r=n[e];if(this.nsps[r].active)return}this._close()}},{key:"_packet",value:function(t){for(var e=this.encoder.encode(t),n=0;n<e.length;n++)this.engine.write(e[n],t.options)}},{key:"cleanup",value:function(){this.subs.forEach((function(t){return t()})),this.subs.length=0,this.decoder.destroy()}},{key:"_close",value:function(){this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close"),this.engine&&this.engine.close()}},{key:"disconnect",value:function(){return this._close()}},{key:"onclose",value:function(t,e){this.cleanup(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",t,e),this._reconnection&&!this.skipReconnect&&this.reconnect()}},{key:"reconnect",value:function(){var t=this;if(this._reconnecting||this.skipReconnect)return this;var e=this;if(this.backoff.attempts>=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{var n=this.backoff.duration();this._reconnecting=!0;var r=this.setTimeoutFn((function(){e.skipReconnect||(t.emitReserved("reconnect_attempt",e.backoff.attempts),e.skipReconnect||e.open((function(n){n?(e._reconnecting=!1,e.reconnect(),t.emitReserved("reconnect_error",n)):e.onreconnect()})))}),n);this.opts.autoUnref&&r.unref(),this.subs.push((function(){clearTimeout(r)}))}}},{key:"onreconnect",value:function(){var t=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",t)}}]),s}(L),Lt={};function Pt(e,n){"object"===t(e)&&(n=e,e=void 0);var r,i=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=t;n=n||"undefined"!=typeof location&&location,null==t&&(t=n.protocol+"//"+n.host),"string"==typeof t&&("/"===t.charAt(0)&&(t="/"===t.charAt(1)?n.protocol+t:n.host+t),/^(https?|wss?):\/\//.test(t)||(t=void 0!==n?n.protocol+"//"+t:"https://"+t),r=ft(t)),r.port||(/^(http|ws)$/.test(r.protocol)?r.port="80":/^(http|ws)s$/.test(r.protocol)&&(r.port="443")),r.path=r.path||"/";var i=-1!==r.host.indexOf(":")?"["+r.host+"]":r.host;return r.id=r.protocol+"://"+i+":"+r.port+e,r.href=r.protocol+"://"+i+(n&&n.port===r.port?"":":"+r.port),r}(e,(n=n||{}).path||"/socket.io"),o=i.source,s=i.id,a=i.path,c=Lt[s]&&a in Lt[s].nsps;return n.forceNew||n["force new connection"]||!1===n.multiplex||c?r=new xt(o,n):(Lt[s]||(Lt[s]=new xt(o,n)),r=Lt[s]),i.query&&!n.query&&(n.query=i.queryKey),r.socket(i.path,n)}return i(Pt,{Manager:xt,Socket:St,io:Pt,connect:Pt}),Pt}));
7
+ //# sourceMappingURL=socket.io.min.js.map
package/src/utils/util.js CHANGED
@@ -5,9 +5,12 @@
5
5
 
6
6
  'use strict';
7
7
 
8
+ //const assert = require('assert');
8
9
  const nodeUtil = require('util');
10
+ // const aes = require('./aes');
11
+ // const createHmac = require('create-hmac/browser');
9
12
  const io = require('socket.io-client');
10
- const Buffer = require('safe-buffer').Buffer
13
+ // const Buffer = require('safe-buffer').Buffer
11
14
 
12
15
  function assert(ok) {
13
16
  throw new Error('something wrong');
@@ -193,9 +196,10 @@ util.stringify = function(data, exclude) {
193
196
  }
194
197
  });
195
198
  return base;
196
- } else if(Buffer.isBuffer(data)) {
197
- return data.toString('base64');
198
199
  }
200
+ // else if(Buffer.isBuffer(data)) {
201
+ // return data.toString('base64');
202
+ // }
199
203
 
200
204
  return data;
201
205
  }
@@ -590,40 +594,40 @@ util.random = function random(min, max) {
590
594
  /**
591
595
  * Create a 32 or 64 bit nonce.
592
596
  * @param {Number} size
593
- * @returns {Buffer}
597
+ * @returns {*}
594
598
  */
595
599
 
596
- util.nonce = function nonce(size) {
597
- let n, data;
598
-
599
- if (!size)
600
- size = 8;
601
-
602
- switch (size) {
603
- case 8:
604
- data = Buffer.allocUnsafe(8);
605
- n = util.random(0, 0x100000000);
606
- data.writeUInt32LE(n, 0, true);
607
- n = util.random(0, 0x100000000);
608
- data.writeUInt32LE(n, 4, true);
609
- break;
610
- case 4:
611
- data = Buffer.allocUnsafe(4);
612
- n = util.random(0, 0x100000000);
613
- data.writeUInt32LE(n, 0, true);
614
- break;
615
- default:
616
- assert(false, 'Bad nonce size.');
617
- break;
618
- }
619
-
620
- return data;
621
- };
600
+ // util.nonce = function nonce(size) {
601
+ // let n, data;
602
+
603
+ // if (!size)
604
+ // size = 8;
605
+
606
+ // switch (size) {
607
+ // case 8:
608
+ // data = Buffer.allocUnsafe(8);
609
+ // n = util.random(0, 0x100000000);
610
+ // data.writeUInt32LE(n, 0, true);
611
+ // n = util.random(0, 0x100000000);
612
+ // data.writeUInt32LE(n, 4, true);
613
+ // break;
614
+ // case 4:
615
+ // data = Buffer.allocUnsafe(4);
616
+ // n = util.random(0, 0x100000000);
617
+ // data.writeUInt32LE(n, 0, true);
618
+ // break;
619
+ // default:
620
+ // assert(false, 'Bad nonce size.');
621
+ // break;
622
+ // }
623
+
624
+ // return data;
625
+ // };
622
626
 
623
627
  /**
624
628
  * String comparator (memcmp + length comparison).
625
- * @param {Buffer} a
626
- * @param {Buffer} b
629
+ * @param {*} a
630
+ * @param {*} b
627
631
  * @returns {Number} -1, 1, or 0.
628
632
  */
629
633
 
@@ -658,26 +662,26 @@ util.mb = function mb(size) {
658
662
 
659
663
  /**
660
664
  * Find index of a buffer in an array of buffers.
661
- * @param {Buffer[]} items
662
- * @param {Buffer} data - Target buffer to find.
665
+ * @param {buffer[]} items
666
+ * @param {buffer} data - Target buffer to find.
663
667
  * @returns {Number} Index (-1 if not found).
664
668
  */
665
669
 
666
- util.indexOf = function indexOf(items, data) {
667
- assert(Array.isArray(items));
668
- assert(Buffer.isBuffer(data));
670
+ // util.indexOf = function indexOf(items, data) {
671
+ // assert(Array.isArray(items));
672
+ // assert(Buffer.isBuffer(data));
669
673
 
670
- for (let i = 0; i < items.length; i++) {
671
- const item = items[i];
674
+ // for (let i = 0; i < items.length; i++) {
675
+ // const item = items[i];
672
676
 
673
- assert(Buffer.isBuffer(item));
677
+ // assert(Buffer.isBuffer(item));
674
678
 
675
- if (item.equals(data))
676
- return i;
677
- }
679
+ // if (item.equals(data))
680
+ // return i;
681
+ // }
678
682
 
679
- return -1;
680
- };
683
+ // return -1;
684
+ // };
681
685
 
682
686
  /**
683
687
  * Convert a number to a padded uint8
@@ -1446,6 +1450,7 @@ util.ReturnCode = ReturnCode;
1446
1450
  util.ReturnCodeName = ReturnCodeName;
1447
1451
  util.CommMode = CommMode;
1448
1452
  util.NotifyType = NotifyType;
1453
+ // util.createHmac = createHmac;
1449
1454
  util.extendObj = extendObj;
1450
1455
  util.clone = clone;
1451
1456
  util.CommStatus = CommStatus;
package/test/game/kow.js CHANGED
@@ -27,11 +27,17 @@ let {gameconn} = require('../../index');
27
27
  let connector = new gameconn(config)
28
28
  .setFetch(require('node-fetch')); //设置node服务端环境下兼容的fetch函数,**注意只在node服务端环境下需要,浏览器环境中系统自带 fetch 函数**
29
29
 
30
- connector.setmode(connector.CommMode.ws)
31
- .watch(msg => {
30
+ connector.setmode(connector.CommMode.ws).watch(msg => {
32
31
  console.log('收到下行消息', msg);
33
32
  }, NotifyType.action);
34
33
 
35
- connector.login(config.oemInfo).then(ret=>{
36
- console.log(config.oemInfo, ret);
37
- })
34
+ (async function() {
35
+ console.log('start login...');
36
+ try {
37
+ let ret = await connector.login(config.oemInfo);
38
+ console.log('end login...');
39
+ console.log(config.oemInfo, ret);
40
+ } catch(e) {
41
+ console.log(e);
42
+ }
43
+ })();