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 +8 -5
- package/src/authConn.js +595 -0
- package/src/gameConn.js +18 -1
- package/src/index.js +17 -0
- package/src/utils/socket.io.min.js +7 -0
- package/src/utils/util.js +50 -45
- package/test/game/kow.js +11 -5
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gamerpc",
|
|
3
|
-
"version": "8.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
|
-
"
|
|
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.
|
|
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
|
}
|
package/src/authConn.js
ADDED
|
@@ -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 {
|
|
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 {
|
|
597
|
+
* @returns {*}
|
|
594
598
|
*/
|
|
595
599
|
|
|
596
|
-
util.nonce = function nonce(size) {
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
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 {
|
|
626
|
-
* @param {
|
|
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 {
|
|
662
|
-
* @param {
|
|
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
|
-
|
|
668
|
-
|
|
670
|
+
// util.indexOf = function indexOf(items, data) {
|
|
671
|
+
// assert(Array.isArray(items));
|
|
672
|
+
// assert(Buffer.isBuffer(data));
|
|
669
673
|
|
|
670
|
-
|
|
671
|
-
|
|
674
|
+
// for (let i = 0; i < items.length; i++) {
|
|
675
|
+
// const item = items[i];
|
|
672
676
|
|
|
673
|
-
|
|
677
|
+
// assert(Buffer.isBuffer(item));
|
|
674
678
|
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
679
|
+
// if (item.equals(data))
|
|
680
|
+
// return i;
|
|
681
|
+
// }
|
|
678
682
|
|
|
679
|
-
|
|
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
|
-
|
|
36
|
-
console.log(
|
|
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
|
+
})();
|