gamerpc 7.1.2 → 8.0.0
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 +5 -7
- package/src/gameConn.js +2 -19
- package/src/index.js +1 -20
- package/src/utils/util.js +7 -84
- package/test/game/auth.js +1 -1
- package/test/game/crm.js +1 -1
- package/test/game/kow.js +37 -0
- package/test/game/mgr.js +80 -0
- package/src/authConn.js +0 -595
- package/src/utils/socket.io.min.js +0 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gamerpc",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.0",
|
|
4
4
|
"author": "bookmansoft <ceo@920.cc>",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"bookmansoft <ceo@920.cc>"
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"cloud"
|
|
19
19
|
],
|
|
20
20
|
"description": "connector for gamecloud & gamegold",
|
|
21
|
-
"main": "
|
|
21
|
+
"main": "index.js",
|
|
22
22
|
"scripts": {
|
|
23
23
|
"test": "mocha",
|
|
24
24
|
"build": "set NODE_OPTIONS=--openssl-legacy-provider & cross-env NODE_ENV=production webpack ./src/index.js --mode=production"
|
|
@@ -32,12 +32,10 @@
|
|
|
32
32
|
},
|
|
33
33
|
"homepage": "https://github.com/bookmansoft/gamegoldtoolkit#readme",
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"
|
|
36
|
-
"elliptic": "^6.5.4",
|
|
37
|
-
"node-fetch": "^2.6.1",
|
|
38
|
-
"socket.io-client": "^4.7.2"
|
|
35
|
+
"socket.io-client": "^4.2.0"
|
|
39
36
|
},
|
|
40
37
|
"devDependencies": {
|
|
38
|
+
"node-fetch": "^2.6.1",
|
|
41
39
|
"mocha": "^10.2.0",
|
|
42
40
|
"babel": "^6.23.0",
|
|
43
41
|
"babel-core": "^6.26.3",
|
|
@@ -46,7 +44,7 @@
|
|
|
46
44
|
"babel-preset-env": "^1.7.0",
|
|
47
45
|
"babel-preset-es2015": "^6.24.1",
|
|
48
46
|
"babel-preset-stage-2": "^6.24.1",
|
|
49
|
-
"cross-env": "^5.2.
|
|
47
|
+
"cross-env": "^5.2.0",
|
|
50
48
|
"webpack": "^4.46.0",
|
|
51
49
|
"webpack-cli": "^3.3.2"
|
|
52
50
|
}
|
package/src/gameConn.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
const {stringify, NotifyType,
|
|
1
|
+
const {stringify, NotifyType, extendObj, CommStatus, clone, ReturnCodeName, io, ReturnCode, CommMode} = require('./utils/util');
|
|
2
2
|
const EventEmitter = require('events').EventEmitter;
|
|
3
3
|
const Indicator = require('./utils/Indicator');
|
|
4
|
-
const assert = require('./utils/assert')
|
|
5
|
-
let {sha1, hash160, hash256, verifyData, generateKey, signObj, verifyObj, verifyAddress} = require('./utils/verifyData');
|
|
6
|
-
const Secret = require('./utils/secret')
|
|
7
|
-
const ioclient = require('./utils/socket.io.min.js');
|
|
8
4
|
|
|
9
5
|
/**
|
|
10
6
|
* RPC控件
|
|
@@ -58,7 +54,7 @@ class Remote {
|
|
|
58
54
|
|
|
59
55
|
this.close();
|
|
60
56
|
|
|
61
|
-
this.socket =
|
|
57
|
+
this.socket = io(`${this.config.UrlHead}://${ip}:${port}`, {'force new connection': true});
|
|
62
58
|
this.socket.on('notify', ret => {//监听推送消息
|
|
63
59
|
if(this.notifyHandles[ret.type]) {
|
|
64
60
|
this.notifyHandles[ret.type](ret.info);
|
|
@@ -684,22 +680,9 @@ class Remote {
|
|
|
684
680
|
}
|
|
685
681
|
|
|
686
682
|
Remote.prototype.CommMode = CommMode;
|
|
687
|
-
Remote.prototype.createHmac = createHmac;
|
|
688
|
-
Remote.prototype.assert = assert;
|
|
689
683
|
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;
|
|
697
684
|
Remote.prototype.CommStatus = CommStatus;
|
|
698
685
|
Remote.prototype.ReturnCode = ReturnCode;
|
|
699
686
|
Remote.prototype.NotifyType = NotifyType;
|
|
700
|
-
Remote.prototype.Secret = Secret;
|
|
701
|
-
Remote.prototype.hash256 = hash256;
|
|
702
|
-
Remote.prototype.hash160 = hash160;
|
|
703
|
-
Remote.prototype.sha1 = sha1;
|
|
704
687
|
|
|
705
688
|
module.exports = Remote;
|
package/src/index.js
CHANGED
|
@@ -13,37 +13,18 @@ Array.prototype.randObj = function() {
|
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
const
|
|
17
|
-
const {CommStatus, createHmac, ReturnCode, CommMode, NotifyType, encrypt, decrypt, stringify} = require('./utils/util');
|
|
18
|
-
let {sha1, hash160, hash256, verifyData, generateKey, signObj, verifyObj, verifyAddress} = require('./utils/verifyData');
|
|
19
|
-
const Secret = require('./utils/secret')
|
|
16
|
+
const {CommStatus, ReturnCode, CommMode, NotifyType, stringify} = require('./utils/util');
|
|
20
17
|
|
|
21
18
|
const toolkit = exports;
|
|
22
19
|
|
|
23
|
-
//主网连接器
|
|
24
|
-
toolkit.conn = require('./authConn');
|
|
25
|
-
|
|
26
20
|
//游戏云连接器
|
|
27
21
|
toolkit.gameconn = require('./gameConn');
|
|
28
22
|
|
|
29
23
|
//实用函数列表
|
|
30
|
-
toolkit.assert = assert;
|
|
31
24
|
toolkit.stringify = stringify;
|
|
32
|
-
toolkit.encrypt = encrypt;
|
|
33
|
-
toolkit.decrypt = decrypt;
|
|
34
|
-
toolkit.verifyData = verifyData;
|
|
35
|
-
toolkit.generateKey = generateKey;
|
|
36
|
-
toolkit.signObj = signObj;
|
|
37
|
-
toolkit.verifyObj = verifyObj;
|
|
38
|
-
toolkit.verifyAddress = verifyAddress;
|
|
39
25
|
toolkit.CommMode = CommMode;
|
|
40
26
|
toolkit.CommStatus = CommStatus;
|
|
41
27
|
toolkit.ReturnCode = ReturnCode;
|
|
42
28
|
toolkit.NotifyType = NotifyType;
|
|
43
|
-
toolkit.createHmac = createHmac;
|
|
44
|
-
toolkit.Secret = Secret;
|
|
45
|
-
toolkit.hash256 = hash256;
|
|
46
|
-
toolkit.hash160 = hash160;
|
|
47
|
-
toolkit.sha1 = sha1;
|
|
48
29
|
|
|
49
30
|
global.toolkit = toolkit;
|
package/src/utils/util.js
CHANGED
|
@@ -5,12 +5,14 @@
|
|
|
5
5
|
|
|
6
6
|
'use strict';
|
|
7
7
|
|
|
8
|
-
const assert = require('assert');
|
|
9
8
|
const nodeUtil = require('util');
|
|
10
|
-
const
|
|
11
|
-
const createHmac = require('create-hmac/browser');
|
|
9
|
+
const io = require('socket.io-client');
|
|
12
10
|
const Buffer = require('safe-buffer').Buffer
|
|
13
11
|
|
|
12
|
+
function assert(ok) {
|
|
13
|
+
throw new Error('something wrong');
|
|
14
|
+
}
|
|
15
|
+
|
|
14
16
|
/**
|
|
15
17
|
* @exports utils/util
|
|
16
18
|
*/
|
|
@@ -81,73 +83,6 @@ util.sprintf = function sprintf() {
|
|
|
81
83
|
return o.join('');
|
|
82
84
|
}
|
|
83
85
|
|
|
84
|
-
/**
|
|
85
|
-
* 加密方法
|
|
86
|
-
* @param key 加密key
|
|
87
|
-
* @param iv 向量
|
|
88
|
-
* @param data 需要加密的数据
|
|
89
|
-
* @returns string
|
|
90
|
-
*/
|
|
91
|
-
util.encrypt = function encrypt(key, iv, data) {
|
|
92
|
-
if(!Buffer.isBuffer(key)) {
|
|
93
|
-
assert(typeof key === 'string');
|
|
94
|
-
key = Buffer.from(key, 'binary')
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if(!Buffer.isBuffer(iv)) {
|
|
98
|
-
assert(typeof iv === 'string');
|
|
99
|
-
iv = Buffer.from(iv, 'binary')
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if(!Buffer.isBuffer(data)) {
|
|
103
|
-
assert(typeof data === 'string');
|
|
104
|
-
data = Buffer.from(data, 'binary')
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
var crypted = aes.encipher(data, key, iv);
|
|
108
|
-
|
|
109
|
-
crypted = Buffer.from(crypted, 'binary');
|
|
110
|
-
|
|
111
|
-
let ret = Buffer.alloc(crypted.length*2);
|
|
112
|
-
for(let i = 0; i < crypted.length; i++){
|
|
113
|
-
ret[2*i] = (crypted[i] >> 4) + 97;
|
|
114
|
-
ret[2*i+1] = (crypted[i] & 0x0F) + 97;
|
|
115
|
-
}
|
|
116
|
-
return ret.toString('binary');
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* 解密方法
|
|
121
|
-
* @param key 解密的key
|
|
122
|
-
* @param iv 向量
|
|
123
|
-
* @param data 密文
|
|
124
|
-
* @returns string
|
|
125
|
-
*/
|
|
126
|
-
util.decrypt = function decrypt(key, iv, data) {
|
|
127
|
-
if(!Buffer.isBuffer(key)) {
|
|
128
|
-
assert(typeof key === 'string');
|
|
129
|
-
key = Buffer.from(key, 'binary')
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if(!Buffer.isBuffer(iv)) {
|
|
133
|
-
assert(typeof iv === 'string');
|
|
134
|
-
iv = Buffer.from(iv, 'binary')
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if(!Buffer.isBuffer(data)) {
|
|
138
|
-
assert(typeof data === 'string');
|
|
139
|
-
data = Buffer.from(data, 'binary')
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
let ret = Buffer.alloc(data.length/2);
|
|
143
|
-
for(let i = 0; i < ret.length; i++){
|
|
144
|
-
ret[i] = ((data[i*2]-97)<<4) | (data[i*2+1]-97);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
var decoded = aes.decipher(ret, key, iv);
|
|
148
|
-
return decoded.toString('binary');
|
|
149
|
-
};
|
|
150
|
-
|
|
151
86
|
/**
|
|
152
87
|
* Test whether a number is Number,
|
|
153
88
|
* finite, and below MAX_SAFE_INTEGER.
|
|
@@ -1284,7 +1219,7 @@ const CommMode = {
|
|
|
1284
1219
|
*/
|
|
1285
1220
|
const NotifyType = {
|
|
1286
1221
|
none: 0, //测试消息
|
|
1287
|
-
test: 9999,
|
|
1222
|
+
test: 9999, //测试消息
|
|
1288
1223
|
};
|
|
1289
1224
|
|
|
1290
1225
|
function Base64() {
|
|
@@ -1390,17 +1325,6 @@ function Base64() {
|
|
|
1390
1325
|
}
|
|
1391
1326
|
}
|
|
1392
1327
|
|
|
1393
|
-
/**
|
|
1394
|
-
* 利用HMAC算法,以及令牌固定量和令牌随机量,计算访问令牌
|
|
1395
|
-
* @param {*} token
|
|
1396
|
-
* @param {*} random
|
|
1397
|
-
*/
|
|
1398
|
-
function signHMAC(token, random) {
|
|
1399
|
-
var hmac = createHmac('sha256', random);
|
|
1400
|
-
let sig = hmac.update(token).digest('hex');
|
|
1401
|
-
return sig;
|
|
1402
|
-
}
|
|
1403
|
-
|
|
1404
1328
|
/**
|
|
1405
1329
|
* 扩展对象,用于多个对象之间的属性注入
|
|
1406
1330
|
* @note 对属性(get set)复制不会成功
|
|
@@ -1516,13 +1440,12 @@ function clone(obj) {
|
|
|
1516
1440
|
throw new Error("Unable to copy obj! Its type isn't supported.");
|
|
1517
1441
|
}
|
|
1518
1442
|
|
|
1443
|
+
util.io = io;
|
|
1519
1444
|
util.Base64 = Base64;
|
|
1520
|
-
util.signHMAC = signHMAC;
|
|
1521
1445
|
util.ReturnCode = ReturnCode;
|
|
1522
1446
|
util.ReturnCodeName = ReturnCodeName;
|
|
1523
1447
|
util.CommMode = CommMode;
|
|
1524
1448
|
util.NotifyType = NotifyType;
|
|
1525
|
-
util.createHmac = createHmac;
|
|
1526
1449
|
util.extendObj = extendObj;
|
|
1527
1450
|
util.clone = clone;
|
|
1528
1451
|
util.CommStatus = CommStatus;
|
package/test/game/auth.js
CHANGED
|
@@ -32,7 +32,7 @@ let phone_wx = ((Math.random() * 100000000) | 0).toString();
|
|
|
32
32
|
//用于验证后期绑定成功的用户证书缓存变量
|
|
33
33
|
let authUser = '';
|
|
34
34
|
|
|
35
|
-
describe
|
|
35
|
+
describe('钱包注册登录测试', () => {
|
|
36
36
|
it('用户注册并登录 - 使用两阶段认证模式', async () => {
|
|
37
37
|
//执行登录操作,通过配置对象传入用户信息,并指定签证方式为两阶段认证
|
|
38
38
|
let ret = await remote.init(/*初始化连接器,只保留原始配置信息*/).login({
|
package/test/game/crm.js
CHANGED
|
@@ -22,7 +22,7 @@ let username = `${(Math.random()*1000000)|0}@vallnet.cn`;
|
|
|
22
22
|
let password = crypto.createHash("sha1").update(((Math.random()*1000000)|0).toString() + salt).digest("hex");
|
|
23
23
|
let mobilephone = `139${((Math.random()*100000000)|0).toString()}`;
|
|
24
24
|
|
|
25
|
-
describe
|
|
25
|
+
describe('CRM注册登录', () => {
|
|
26
26
|
it('用户注册 - 通过两阶段认证模式实现', async () => {
|
|
27
27
|
//当用户点击'获取验证码'时执行如下流程:
|
|
28
28
|
let ret = await remote.init(/*初始化连接器,只保留原始配置信息*/).login({
|
package/test/game/kow.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 联机单元测试:游戏登录测试流程
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
//连接配置信息
|
|
6
|
+
const config = {
|
|
7
|
+
UrlHead: "http", //协议选择: http/https
|
|
8
|
+
webserver: {
|
|
9
|
+
"host": "127.0.0.1", //远程主机地址
|
|
10
|
+
"port": 9901 //远程主机端口
|
|
11
|
+
},
|
|
12
|
+
logicserver: {},
|
|
13
|
+
oemInfo: { //模拟用户信息
|
|
14
|
+
domain: 'CoreOfKow', //指定访问的逻辑服务器类型
|
|
15
|
+
openid: `bxs.15699999936`, //用户标识
|
|
16
|
+
token: '', //用户令牌,由920客户端向920服务端索取并填充于此
|
|
17
|
+
},
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//长连接中,下行通告的类型定义
|
|
21
|
+
const NotifyType = {
|
|
22
|
+
action: 1, //体力数值推送
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
//引入长连接组件
|
|
26
|
+
let {gameconn} = require('../../index');
|
|
27
|
+
let connector = new gameconn(config)
|
|
28
|
+
.setFetch(require('node-fetch')); //设置node服务端环境下兼容的fetch函数,**注意只在node服务端环境下需要,浏览器环境中系统自带 fetch 函数**
|
|
29
|
+
|
|
30
|
+
connector.setmode(connector.CommMode.ws)
|
|
31
|
+
.watch(msg => {
|
|
32
|
+
console.log('收到下行消息', msg);
|
|
33
|
+
}, NotifyType.action);
|
|
34
|
+
|
|
35
|
+
connector.login(config.oemInfo).then(ret=>{
|
|
36
|
+
console.log(config.oemInfo, ret);
|
|
37
|
+
})
|
package/test/game/mgr.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
d:\workshop\gitee\vallnetserver\test\kow.socket.js/**
|
|
2
|
+
* 联机单元测试:远程管理
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const assert = require('assert')
|
|
6
|
+
|
|
7
|
+
//引入游戏云连接器,创建连接器对象
|
|
8
|
+
const {gameconn} = require('../../src/')
|
|
9
|
+
const remote = new gameconn({
|
|
10
|
+
"UrlHead": "http", //协议选择: http/https
|
|
11
|
+
"webserver": {
|
|
12
|
+
//注意:如果需要负载均衡,这里一般指定负载均衡服务器地址,否则直接填写业务主机地址
|
|
13
|
+
"host": "127.0.0.1", //远程主机地址
|
|
14
|
+
"authPort": 9601, //签证主机端口
|
|
15
|
+
"port": 9901 //远程主机端口
|
|
16
|
+
},
|
|
17
|
+
}).setFetch(require('node-fetch')); //设置node环境下兼容的fetch函数
|
|
18
|
+
|
|
19
|
+
//切换为长连模式
|
|
20
|
+
//remote.setmode(remote.CommMode.ws);
|
|
21
|
+
|
|
22
|
+
//这里需要填充管理员登录信息
|
|
23
|
+
let admin = {
|
|
24
|
+
openid: '',
|
|
25
|
+
openkey: '',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
describe('远程管理', () => {
|
|
29
|
+
it.skip('执行索引服远程指令 remote.printInfo', async () => {
|
|
30
|
+
await remote.init(/*初始化连接器,只保留原始配置信息*/).login({
|
|
31
|
+
domain: 'CoreOfIndex',
|
|
32
|
+
openid: admin.openid,
|
|
33
|
+
openkey: admin.openkey,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
let msg = await remote.fetching({func: "remote.printInfo"});
|
|
37
|
+
console.log(msg);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it.skip('透过索引服执行业务服远程指令 remote.command printInfo', async () => {
|
|
41
|
+
await remote.init(/*初始化连接器,只保留原始配置信息*/).login({
|
|
42
|
+
domain: 'CoreOfIndex',
|
|
43
|
+
openid: admin.openid,
|
|
44
|
+
openkey: admin.openkey,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
let msg = await remote.fetching({func: "remote.command", data: ['printInfo', 'CoreOfChickIOS', '1']});
|
|
48
|
+
console.log(msg);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('模拟用户注册并登录', async () => {
|
|
52
|
+
//执行登录操作,通过配置对象传入用户信息,并指定签证方式为两阶段认证
|
|
53
|
+
let auth = {
|
|
54
|
+
cpId: 'c376af60-cab5-11ed-90e8-25399b14218a',
|
|
55
|
+
addr: '10000000',
|
|
56
|
+
name: 'bookman',
|
|
57
|
+
bonus: '',
|
|
58
|
+
time: Date.now(),
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
//需要正确填充 auth.sign, 此处采用模拟命令填充, 注意命令 testSign 只在测试模式下开启
|
|
62
|
+
await remote.init().login({
|
|
63
|
+
domain: 'CoreOfIndex',
|
|
64
|
+
openid: admin.openid,
|
|
65
|
+
openkey: admin.openkey,
|
|
66
|
+
});
|
|
67
|
+
let msg = await remote.fetching({func: "remote.command", data: ['testSign', 'CoreOfChickIOS', '1', auth]});
|
|
68
|
+
auth.sign = msg['CoreOfChickIOS.1'].sign;
|
|
69
|
+
|
|
70
|
+
let ret = await remote.init().login({
|
|
71
|
+
domain: 'CoreOfChickIOS', //登录域
|
|
72
|
+
openid: `bxs.${auth.addr}`, //用户登录标识,含验证方式
|
|
73
|
+
auth,
|
|
74
|
+
});
|
|
75
|
+
if(!!ret) {
|
|
76
|
+
ret = await remote.fetching({func: "test.echo"});
|
|
77
|
+
assert(ret.code == 0);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
package/src/authConn.js
DELETED
|
@@ -1,595 +0,0 @@
|
|
|
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;
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|