@yuants/vendor-huobi 0.9.8 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/api.js +313 -0
  2. package/dist/api.js.map +1 -0
  3. package/dist/cli.js +3 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/cluster.js +72 -0
  6. package/dist/cluster.js.map +1 -0
  7. package/dist/extension.js +87 -0
  8. package/dist/extension.js.map +1 -0
  9. package/dist/index.js +582 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/interest_rate.js +59 -0
  12. package/dist/interest_rate.js.map +1 -0
  13. package/dist/logger.js +91 -0
  14. package/dist/logger.js.map +1 -0
  15. package/dist/product.js +85 -0
  16. package/dist/product.js.map +1 -0
  17. package/dist/quote.js +93 -0
  18. package/dist/quote.js.map +1 -0
  19. package/dist/vendor-huobi.d.ts +1 -0
  20. package/lib/api.d.ts +634 -0
  21. package/lib/api.d.ts.map +1 -0
  22. package/lib/api.js +320 -0
  23. package/lib/api.js.map +1 -0
  24. package/lib/cli.d.ts +3 -0
  25. package/lib/cli.d.ts.map +1 -0
  26. package/lib/cli.js +5 -0
  27. package/lib/cli.js.map +1 -0
  28. package/lib/cluster.d.ts +2 -0
  29. package/lib/cluster.d.ts.map +1 -0
  30. package/lib/cluster.js +100 -0
  31. package/lib/cluster.js.map +1 -0
  32. package/lib/extension.d.ts +4 -0
  33. package/lib/extension.d.ts.map +1 -0
  34. package/lib/extension.js +89 -0
  35. package/lib/extension.js.map +1 -0
  36. package/lib/index.d.ts +3 -0
  37. package/lib/index.d.ts.map +1 -0
  38. package/lib/index.js +584 -0
  39. package/lib/index.js.map +1 -0
  40. package/lib/interest_rate.d.ts +2 -0
  41. package/lib/interest_rate.d.ts.map +1 -0
  42. package/lib/interest_rate.js +61 -0
  43. package/lib/interest_rate.js.map +1 -0
  44. package/lib/logger.d.ts +21 -0
  45. package/lib/logger.d.ts.map +1 -0
  46. package/lib/logger.js +98 -0
  47. package/lib/logger.js.map +1 -0
  48. package/lib/product.d.ts +4 -0
  49. package/lib/product.d.ts.map +1 -0
  50. package/lib/product.js +88 -0
  51. package/lib/product.js.map +1 -0
  52. package/lib/quote.d.ts +2 -0
  53. package/lib/quote.d.ts.map +1 -0
  54. package/lib/quote.js +95 -0
  55. package/lib/quote.js.map +1 -0
  56. package/package.json +5 -2
  57. package/temp/image-tag +1 -0
  58. package/temp/package-deps.json +37 -0
  59. package/temp/vendor-huobi.api.json +177 -0
  60. package/temp/vendor-huobi.api.md +9 -0
package/lib/api.js ADDED
@@ -0,0 +1,320 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.client = exports.HuobiClient = void 0;
7
+ const protocol_1 = require("@yuants/protocol");
8
+ const utils_1 = require("@yuants/utils");
9
+ const rxjs_1 = require("rxjs");
10
+ const zlib_1 = __importDefault(require("zlib"));
11
+ // @ts-ignore
12
+ const crypto_js_1 = __importDefault(require("crypto-js"));
13
+ const createConnectionGzipWS = (URL) => {
14
+ const conn = (0, protocol_1.createConnectionWs)(URL);
15
+ const input$ = (0, rxjs_1.from)(conn.input$).pipe((0, rxjs_1.map)((msg) => zlib_1.default.gunzipSync(msg)), (0, rxjs_1.map)((msg) => msg.toString()), (0, rxjs_1.map)((msg) => JSON.parse(msg)), (0, rxjs_1.share)());
16
+ const output$ = new rxjs_1.Subject();
17
+ output$.pipe((0, rxjs_1.map)((msg) => JSON.stringify(msg))).subscribe(conn.output$);
18
+ return Object.assign(Object.assign({}, conn), { input$: input$, output$: output$ });
19
+ };
20
+ class HuobiClient {
21
+ constructor(params) {
22
+ this.params = params;
23
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=510
24
+ this.swap_api_root = 'api.hbdm.com';
25
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=404
26
+ this.spot_api_root = 'api.huobi.pro';
27
+ /**
28
+ * 【全仓】获取平台阶梯保证金
29
+ *
30
+ * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb72290-77b5-11ed-9966-0242ac110003
31
+ */
32
+ this.getSwapCrossLadderMargin = (params) => this.request('GET', '/linear-swap-api/v1/swap_cross_ladder_margin', this.swap_api_root, params);
33
+ /**
34
+ * 【通用】批量获取合约资金费率
35
+ *
36
+ * 接口权限: 读取
37
+ *
38
+ * 限频: 其他非行情类的公开接口,比如获取指数信息,限价信息,交割结算、平台持仓信息等,所有用户都是每个IP3秒最多240次请求(所有该IP的非行情类的公开接口请求共享3秒240次的额度)
39
+ *
40
+ * 接口描述: 该接口支持全仓模式和逐仓模式
41
+ *
42
+ * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71b45-77b5-11ed-9966-0242ac110003
43
+ */
44
+ this.getSwapBatchFundingRate = (params) => {
45
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb7a7b5-77b5-11ed-9966-0242ac110003
46
+ return this.request('GET', `/linear-swap-api/v1/swap_batch_funding_rate`, this.swap_api_root, params);
47
+ };
48
+ /**
49
+ * 【通用】获取市场最近成交记录
50
+ *
51
+ * 接口权限: 读取
52
+ *
53
+ * 限频: 行情类的公开接口,比如:获取K线数据、获取聚合行情、市场行情、获取行情深度数据、获取溢价指数K线、获取实时预测资金费率k线,获取基差数据、获取市场最近成交记录:
54
+ *
55
+ * (1) restful接口:同一个IP, 所有业务(交割合约、币本位永续合约和U本位合约)总共1秒最多800个请求
56
+ *
57
+ * 接口描述: 该接口支持全仓模式和逐仓模式
58
+ *
59
+ * 请求参数contract_code支持交割合约代码,格式为BTC-USDT-210625;同时支持合约标识,格式为 BTC-USDT(永续)、BTC-USDT-CW(当周)、BTC-USDT-NW(次周)、BTC-USDT-CQ(当季)、BTC-USDT-NQ(次季)。
60
+ *
61
+ * business_type 在查询交割合约数据时为必填参数。且参数值要传:futures 或 all 。
62
+ *
63
+ * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb73c34-77b5-11ed-9966-0242ac110003
64
+ */
65
+ this.getSwapMarketTrade = (params) => this.request('GET', `/linear-swap-ex/market/trade`, this.swap_api_root, params);
66
+ /**
67
+ * 获得当前合约的总持仓量
68
+ *
69
+ * https://huobiapi.github.io/docs/usdt_swap/v1/cn/#3218e7531a
70
+ */
71
+ this.getSwapOpenInterest = (params) => this.request('GET', '/linear-swap-api/v1/swap_open_interest', this.swap_api_root, params);
72
+ /**
73
+ * 【通用】获取市场最优挂单
74
+ *
75
+ * 接口权限: 读取
76
+ *
77
+ * 限频: 行情类的公开接口,比如:获取K线数据、获取聚合行情、市场行情、获取行情深度数据、获取溢价指数K线、获取实时预测资金费率k线,获取基差数据、获取市场最近成交记录:
78
+ *
79
+ * (1) restful接口:同一个IP, 所有业务(交割合约、币本位永续合约和U本位合约)总共1秒最多800个请求
80
+ *
81
+ * 接口描述: 该接口支持全仓模式和逐仓模式
82
+ *
83
+ * 请求参数contract_code支持交割合约代码,格式为BTC-USDT-210625;同时支持合约标识,格式为 BTC-USDT(永续)、BTC-USDT-CW(当周)、BTC-USDT-NW(次周)、BTC-USDT-CQ(当季)、BTC-USDT-NQ(次季)。
84
+ *
85
+ * business_type 在查询交割合约数据时为必填参数。且参数值要传:futures 或 all 。
86
+ *
87
+ * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb735e0-77b5-11ed-9966-0242ac110003
88
+ */
89
+ this.getSwapMarketBbo = (params) => this.request('GET', `/linear-swap-ex/market/bbo`, this.swap_api_root, params);
90
+ /**
91
+ * APIv2币链参考信息
92
+ *
93
+ * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003
94
+ */
95
+ this.getV2ReferenceCurrencies = (params) => this.request('GET', '/v2/reference/currencies', this.spot_api_root, params);
96
+ /**
97
+ * APIv2币链参考信息
98
+ *
99
+ * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41049-7773-11ed-9966-0242ac110003
100
+ */
101
+ this.getAccountHistory = (params) => this.request('GET', '/v1/account/history', this.spot_api_root, params);
102
+ this.spot_ws = createConnectionGzipWS(`wss://${this.spot_api_root}/ws`);
103
+ (0, rxjs_1.from)(this.spot_ws.input$)
104
+ .pipe(
105
+ //
106
+ (0, rxjs_1.filter)((v) => v.ping), (0, rxjs_1.tap)((v) => {
107
+ this.spot_ws.output$.next({ pong: v.ping });
108
+ }))
109
+ .subscribe();
110
+ }
111
+ async request(method, path, api_root, params) {
112
+ const noAuth = !(this.params.auth.access_key && this.params.auth.secret_key);
113
+ if (noAuth) {
114
+ const requestParams = `${method === 'GET' && params !== undefined
115
+ ? `&${Object.entries(params)
116
+ .sort(([a], [b]) => a.localeCompare(b))
117
+ .map(([k, v]) => `${k}=${v}`)
118
+ .join('&')}`
119
+ : ''}`;
120
+ const body = method === 'GET' ? '' : JSON.stringify(params);
121
+ const url = new URL(`https://${api_root}${path}?${requestParams}`);
122
+ // url.searchParams.sort();
123
+ console.info((0, utils_1.formatTime)(Date.now()), method, url.href, body);
124
+ const res = await fetch(url.href, {
125
+ method,
126
+ headers: { 'Content-Type': 'application/json' },
127
+ body: body || undefined,
128
+ });
129
+ const retStr = await res.text();
130
+ // console.info(formatTime(Date.now()), 'response', url.href, retStr);
131
+ try {
132
+ return JSON.parse(retStr);
133
+ }
134
+ catch (e) {
135
+ console.error((0, utils_1.formatTime)(Date.now()), 'huobiRequestFailed', path, JSON.stringify(params), retStr);
136
+ throw e;
137
+ }
138
+ }
139
+ const requestParams = `AccessKeyId=${this.params.auth.access_key}&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=${encodeURIComponent(new Date().toISOString().split('.')[0])}${method === 'GET' && params !== undefined
140
+ ? `&${Object.entries(params)
141
+ .sort(([a], [b]) => a.localeCompare(b))
142
+ .map(([k, v]) => `${k}=${v}`)
143
+ .join('&')}`
144
+ : ''}`;
145
+ const body = method === 'GET' ? '' : JSON.stringify(params);
146
+ const requestString = `${method}\n${api_root}\n${path}\n${requestParams}`;
147
+ const str = crypto_js_1.default.enc.Base64.stringify(crypto_js_1.default.HmacSHA256(requestString, this.params.auth.secret_key));
148
+ const url = new URL(`https://${api_root}${path}?${requestParams}&Signature=${encodeURIComponent(str)}`);
149
+ // url.searchParams.sort();
150
+ console.info((0, utils_1.formatTime)(Date.now()), method, url.href, body);
151
+ const res = await fetch(url.href, {
152
+ method,
153
+ headers: { 'Content-Type': 'application/json' },
154
+ body: body || undefined,
155
+ });
156
+ const retStr = await res.text();
157
+ // console.info(formatTime(Date.now()), 'response', url.href, retStr);
158
+ try {
159
+ return JSON.parse(retStr);
160
+ }
161
+ catch (e) {
162
+ console.error((0, utils_1.formatTime)(Date.now()), 'huobiRequestFailed', path, JSON.stringify(params), retStr);
163
+ throw e;
164
+ }
165
+ }
166
+ // swap_ws = new WebSocket(new URL(`wss://${this.swap_api_root}/linear-swap-ws`));
167
+ getAccount() {
168
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40743-7773-11ed-9966-0242ac110003
169
+ return this.request('GET', '/v1/account/accounts', this.spot_api_root);
170
+ }
171
+ getPerpetualContractSymbols(params) {
172
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb72f34-77b5-11ed-9966-0242ac110003
173
+ return this.request('GET', '/linear-swap-api/v1/swap_contract_info', this.swap_api_root, params);
174
+ }
175
+ getSpotSymbols() {
176
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec47f16-7773-11ed-9966-0242ac110003
177
+ return this.request('GET', '/v2/settings/common/symbols', this.spot_api_root);
178
+ }
179
+ getUid() {
180
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec491c9-7773-11ed-9966-0242ac110003
181
+ return this.request('GET', '/v2/user/uid', this.spot_api_root);
182
+ }
183
+ getUnifiedAccountInfo() {
184
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=10000073-77b7-11ed-9966-0242ac110003
185
+ return this.request('GET', '/linear-swap-api/v3/unified_account_info', this.swap_api_root);
186
+ }
187
+ getSwapCrossPositionInfo(params) {
188
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb74963-77b5-11ed-9966-0242ac110003
189
+ return this.request('POST', '/linear-swap-api/v1/swap_cross_position_info', this.swap_api_root, params);
190
+ }
191
+ getSwapOpenOrders(params) {
192
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb784d4-77b5-11ed-9966-0242ac110003
193
+ return this.request('POST', '/linear-swap-api/v1/swap_cross_openorders', this.swap_api_root, params);
194
+ }
195
+ getSpotAccountBalance(account_uid) {
196
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40922-7773-11ed-9966-0242ac110003
197
+ return this.request('GET', `/v1/account/accounts/${account_uid}/balance`, this.spot_api_root);
198
+ }
199
+ getCrossMarginLoanInfo() {
200
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41863-7773-11ed-9966-0242ac110003
201
+ return this.request('GET', '/v1/cross-margin/loan-info', this.spot_api_root);
202
+ }
203
+ getSpotTick(params) {
204
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec3fc25-7773-11ed-9966-0242ac110003
205
+ return this.request('GET', `/market/detail/merged`, this.spot_api_root, params);
206
+ }
207
+ postSpotOrder(params) {
208
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=10000065-77b7-11ed-9966-0242ac110003
209
+ return this.request('POST', `/v1/order/auto/place`, this.spot_api_root, params);
210
+ }
211
+ postSwapOrder(params) {
212
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb77159-77b5-11ed-9966-0242ac110003
213
+ return this.request('POST', '/linear-swap-api/v1/swap_cross_order', this.swap_api_root, params);
214
+ }
215
+ getSpotAccountDepositAddresses(params) {
216
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45fb7-7773-11ed-9966-0242ac110003
217
+ return this.request('GET', `/v2/account/deposit/address`, this.spot_api_root, params);
218
+ }
219
+ getAccountLedger(params) {
220
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec4610b-7773-11ed-9966-0242ac110003
221
+ return this.request('GET', `/v2/account/ledger`, this.spot_api_root, params);
222
+ }
223
+ postSuperMarginAccountTransferOut(params) {
224
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41ff0-7773-11ed-9966-0242ac110003
225
+ return this.request('POST', `/v1/cross-margin/transfer-out`, this.spot_api_root, params);
226
+ }
227
+ postSuperMarginAccountTransferIn(params) {
228
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41f0e-7773-11ed-9966-0242ac110003
229
+ return this.request('POST', `/v1/cross-margin/transfer-in`, this.spot_api_root, params);
230
+ }
231
+ postSpotAccountTransfer(params) {
232
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=10000095-77b7-11ed-9966-0242ac110003
233
+ return this.request('POST', `/v2/account/transfer`, this.spot_api_root, params);
234
+ }
235
+ postBorrow(params) {
236
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41b5d-7773-11ed-9966-0242ac110003
237
+ return this.request('POST', `/v1/cross-margin/orders`, this.spot_api_root, params);
238
+ }
239
+ postWithdraw(params) {
240
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec42cfd-7773-11ed-9966-0242ac110003
241
+ return this.request('POST', `/v1/dw/withdraw/api/create`, this.spot_api_root, params);
242
+ }
243
+ getDepositWithdrawHistory(params) {
244
+ // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec44f99-7773-11ed-9966-0242ac110003
245
+ return this.request(`GET`, `/v1/query/deposit-withdraw`, this.spot_api_root, params);
246
+ }
247
+ /**
248
+ * 获取合约的历史资金费率
249
+ *
250
+ * 接口权限: 读取
251
+ *
252
+ * https://www.htx.com/zh-cn/opend/newApiPages/?id=5d51f1f9-77b6-11ed-9966-0242ac110003
253
+ */
254
+ getSwapHistoricalFundingRate(params) {
255
+ return this.request('GET', `/linear-swap-api/v1/swap_historical_funding_rate`, this.swap_api_root, params);
256
+ }
257
+ /**
258
+ * 资产划转(母子用户之间)
259
+ *
260
+ * 接口权限: 交易
261
+ *
262
+ * 限频: 2次/2s
263
+ *
264
+ * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45d8e-7773-11ed-9966-0242ac110003
265
+ */
266
+ postSubUserTransfer(params) {
267
+ return this.request('POST', '/v1/subuser/transfer', this.spot_api_root, params);
268
+ }
269
+ /**
270
+ * 获取子用户列表
271
+ *
272
+ * 接口权限: 读取
273
+ *
274
+ * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec48f09-7773-11ed-9966-0242ac110003
275
+ */
276
+ getSubUserList(params) {
277
+ return this.request('GET', `/v2/sub-user/user-list`, this.spot_api_root, params);
278
+ }
279
+ /**
280
+ * 账户类型查询
281
+ *
282
+ * 是否验签: 是
283
+ *
284
+ * 接口权限: 读取
285
+ *
286
+ * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。
287
+ *
288
+ * 接口描述: 此接口用于客户查询的账号类型,当前U本位合约有统一账户和非统一账户(全仓逐仓账户)类型。统一账户类型资产放在USDT一个账户上,全仓逐仓账户类型资产放在不同的币对。
289
+ * 统一账户类型为最新升级的,当前不支持API下单。若需要用用API下单请切换账户类型为非统一账户。
290
+ *
291
+ * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71825-77b5-11ed-9966-0242ac110003
292
+ */
293
+ getSwapUnifiedAccountType() {
294
+ return this.request('GET', '/linear-swap-api/v3/swap_unified_account_type', this.swap_api_root);
295
+ }
296
+ /**
297
+ * 账户类型更改接口
298
+ *
299
+ * 是否验签: 是
300
+ *
301
+ * 接口权限: 交易
302
+ *
303
+ * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。
304
+ *
305
+ * 接口描述: 调用该接口前需要保证U本位合约无持仓和挂单,当由非统一账户(全仓逐仓账户)变为统一账户还需将资产从逐仓账户划转到全仓账户。
306
+ *
307
+ * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb7196b-77b5-11ed-9966-0242ac110003
308
+ */
309
+ postSwapSwitchAccountType(params) {
310
+ return this.request('POST', '/linear-swap-api/v3/swap_switch_account_type', this.swap_api_root, params);
311
+ }
312
+ }
313
+ exports.HuobiClient = HuobiClient;
314
+ exports.client = new HuobiClient({
315
+ auth: {
316
+ access_key: process.env.ACCESS_KEY,
317
+ secret_key: process.env.SECRET_KEY,
318
+ },
319
+ });
320
+ //# sourceMappingURL=api.js.map
package/lib/api.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { IConnection, createConnectionWs } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\nimport { Subject, filter, from, map, share, tap } from 'rxjs';\nimport zlib from 'zlib';\n\n// @ts-ignore\nimport CryptoJS from 'crypto-js';\ninterface IHuobiParams {\n auth: { access_key: string; secret_key: string };\n}\n\nconst createConnectionGzipWS = <T = any>(URL: string): IConnection<T> => {\n const conn = createConnectionWs(URL);\n const input$ = from(conn.input$).pipe(\n map((msg) => zlib.gunzipSync(msg)),\n map((msg) => msg.toString()),\n map((msg) => JSON.parse(msg)),\n share(),\n );\n\n const output$ = new Subject<any>();\n output$.pipe(map((msg) => JSON.stringify(msg))).subscribe(conn.output$);\n return {\n ...conn,\n input$: input$,\n output$: output$,\n };\n};\n\nexport class HuobiClient {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=510\n swap_api_root = 'api.hbdm.com';\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=404\n spot_api_root = 'api.huobi.pro';\n\n spot_ws: IConnection<any>;\n\n constructor(public params: IHuobiParams) {\n this.spot_ws = createConnectionGzipWS(`wss://${this.spot_api_root}/ws`);\n from(this.spot_ws.input$)\n .pipe(\n //\n filter((v) => v.ping),\n tap((v) => {\n this.spot_ws.output$.next({ pong: v.ping });\n }),\n )\n .subscribe();\n }\n\n async request(method: string, path: string, api_root: string, params?: any) {\n const noAuth = !(this.params.auth.access_key && this.params.auth.secret_key);\n\n if (noAuth) {\n const requestParams = `${\n method === 'GET' && params !== undefined\n ? `&${Object.entries(params)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join('&')}`\n : ''\n }`;\n\n const body = method === 'GET' ? '' : JSON.stringify(params);\n\n const url = new URL(`https://${api_root}${path}?${requestParams}`);\n // url.searchParams.sort();\n console.info(formatTime(Date.now()), method, url.href, body);\n\n const res = await fetch(url.href, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: body || undefined,\n });\n\n const retStr = await res.text();\n // console.info(formatTime(Date.now()), 'response', url.href, retStr);\n try {\n return JSON.parse(retStr);\n } catch (e) {\n console.error(formatTime(Date.now()), 'huobiRequestFailed', path, JSON.stringify(params), retStr);\n throw e;\n }\n }\n\n const requestParams = `AccessKeyId=${\n this.params.auth.access_key\n }&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=${encodeURIComponent(\n new Date().toISOString().split('.')[0],\n )}${\n method === 'GET' && params !== undefined\n ? `&${Object.entries(params)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${v}`)\n .join('&')}`\n : ''\n }`;\n\n const body = method === 'GET' ? '' : JSON.stringify(params);\n\n const requestString = `${method}\\n${api_root}\\n${path}\\n${requestParams}`;\n\n const str = CryptoJS.enc.Base64.stringify(\n CryptoJS.HmacSHA256(requestString, this.params.auth.secret_key),\n );\n\n const url = new URL(`https://${api_root}${path}?${requestParams}&Signature=${encodeURIComponent(str)}`);\n // url.searchParams.sort();\n console.info(formatTime(Date.now()), method, url.href, body);\n const res = await fetch(url.href, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: body || undefined,\n });\n\n const retStr = await res.text();\n // console.info(formatTime(Date.now()), 'response', url.href, retStr);\n try {\n return JSON.parse(retStr);\n } catch (e) {\n console.error(formatTime(Date.now()), 'huobiRequestFailed', path, JSON.stringify(params), retStr);\n throw e;\n }\n }\n\n // swap_ws = new WebSocket(new URL(`wss://${this.swap_api_root}/linear-swap-ws`));\n\n getAccount(): Promise<{\n status: string;\n data: {\n id: number;\n type: string;\n state: string;\n subtype: string;\n }[];\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40743-7773-11ed-9966-0242ac110003\n return this.request('GET', '/v1/account/accounts', this.spot_api_root);\n }\n\n getPerpetualContractSymbols(params?: {\n contract_code?: string;\n support_margin_mode?: string;\n pair?: string;\n contract_type?: string;\n business_type?: string;\n }): Promise<{\n status: string;\n data: {\n symbol: string;\n contract_code: string;\n contract_size: number;\n price_tick: number;\n settlement_date: string;\n delivery_time: string;\n create_date: string;\n contract_status: number;\n support_margin_mode: string;\n contract_type: string;\n pair: string;\n business_type: string;\n dilivery_date: string;\n }[];\n ts: string;\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb72f34-77b5-11ed-9966-0242ac110003\n return this.request('GET', '/linear-swap-api/v1/swap_contract_info', this.swap_api_root, params);\n }\n\n getSpotSymbols(): Promise<{\n status: string;\n data: {\n si: string;\n scr: string;\n sc: string;\n dn: string;\n bc: string;\n bcdn: string;\n qc: string;\n qcdn: string;\n state: string;\n whe: boolean;\n cd: boolean;\n te: boolean;\n toa: number;\n sp: string;\n w: number;\n ttp: number;\n tap: number;\n tpp: number;\n fp: number;\n suspend_desc: string;\n transfer_board_desc: string;\n tags: string;\n lr: number;\n smlr: number;\n flr: string;\n wr: string;\n d: number;\n elr: number;\n p: any;\n castate: string;\n ca1oa: number;\n ca2oa: number;\n }[];\n ts: string;\n full: number;\n err_code: string;\n err_msg: string;\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec47f16-7773-11ed-9966-0242ac110003\n return this.request('GET', '/v2/settings/common/symbols', this.spot_api_root);\n }\n\n getUid(): Promise<{ data: number; code: number }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec491c9-7773-11ed-9966-0242ac110003\n return this.request('GET', '/v2/user/uid', this.spot_api_root);\n }\n\n getUnifiedAccountInfo(): Promise<{\n status: string;\n code: number;\n msg: string;\n data: {\n margin_asset: string;\n margin_balance: number;\n cross_margin_static: number;\n cross_profit_unreal: number;\n withdraw_available: number;\n }[];\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=10000073-77b7-11ed-9966-0242ac110003\n return this.request('GET', '/linear-swap-api/v3/unified_account_info', this.swap_api_root);\n }\n\n getSwapCrossPositionInfo(params?: {\n contract_code?: string;\n pair?: string;\n contract_type: string;\n }): Promise<{\n status: string;\n ts: number;\n data: {\n contract_code: string;\n contract_type: string;\n direction: string;\n margin_mode: string;\n volume: number;\n available: number;\n cost_hold: number;\n last_price: number;\n profit_unreal: number;\n lever_rate: number;\n }[];\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb74963-77b5-11ed-9966-0242ac110003\n return this.request('POST', '/linear-swap-api/v1/swap_cross_position_info', this.swap_api_root, params);\n }\n\n /**\n * 【全仓】获取平台阶梯保证金\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb72290-77b5-11ed-9966-0242ac110003\n */\n getSwapCrossLadderMargin = (params?: {\n contract_code?: string;\n pair?: string;\n contract_type?: string;\n business_type?: string;\n }): Promise<{\n status: string;\n data: Array<{ contract_code: string; pair: string; list: Array<{ lever_rate: number }> }>;\n }> => this.request('GET', '/linear-swap-api/v1/swap_cross_ladder_margin', this.swap_api_root, params);\n\n getSwapOpenOrders(params?: {\n contract_code?: string;\n pair?: string;\n page_index?: number;\n page_size?: number;\n sort_by?: string;\n trade_type?: string;\n }): Promise<{\n status: string;\n data: {\n orders: {\n order_id_str: string;\n contract_code: string;\n order_price_type: string;\n direction: string;\n offset: string;\n volume: number;\n created_at: number;\n price: number;\n trade_volume: number;\n }[];\n };\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb784d4-77b5-11ed-9966-0242ac110003\n return this.request('POST', '/linear-swap-api/v1/swap_cross_openorders', this.swap_api_root, params);\n }\n\n getSpotAccountBalance(account_uid: number): Promise<{\n status: string;\n data: {\n list: {\n currency: string;\n balance: string;\n type: string;\n }[];\n };\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec40922-7773-11ed-9966-0242ac110003\n return this.request('GET', `/v1/account/accounts/${account_uid}/balance`, this.spot_api_root);\n }\n\n getCrossMarginLoanInfo(): Promise<{\n status: string;\n code: number;\n data: {\n currency: string;\n 'loanable-amt': string;\n }[];\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41863-7773-11ed-9966-0242ac110003\n return this.request('GET', '/v1/cross-margin/loan-info', this.spot_api_root);\n }\n\n getSpotTick(params: { symbol: string }): Promise<{\n status: string;\n tick: {\n close: number;\n };\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec3fc25-7773-11ed-9966-0242ac110003\n return this.request('GET', `/market/detail/merged`, this.spot_api_root, params);\n }\n\n /**\n * 【通用】批量获取合约资金费率\n *\n * 接口权限: 读取\n *\n * 限频: 其他非行情类的公开接口,比如获取指数信息,限价信息,交割结算、平台持仓信息等,所有用户都是每个IP3秒最多240次请求(所有该IP的非行情类的公开接口请求共享3秒240次的额度)\n *\n * 接口描述: 该接口支持全仓模式和逐仓模式\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71b45-77b5-11ed-9966-0242ac110003\n */\n getSwapBatchFundingRate = (params: {\n contract_code?: string;\n }): Promise<{\n status: string;\n ts: number;\n data: {\n estimated_rate: null;\n funding_rate: string;\n contract_code: string;\n symbol: string;\n fee_asset: string;\n funding_time: string;\n next_funding_time: null;\n trade_partition: string;\n }[];\n }> => {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb7a7b5-77b5-11ed-9966-0242ac110003\n return this.request('GET', `/linear-swap-api/v1/swap_batch_funding_rate`, this.swap_api_root, params);\n };\n\n /**\n * 【通用】获取市场最近成交记录\n *\n * 接口权限: 读取\n *\n * 限频: 行情类的公开接口,比如:获取K线数据、获取聚合行情、市场行情、获取行情深度数据、获取溢价指数K线、获取实时预测资金费率k线,获取基差数据、获取市场最近成交记录:\n *\n * (1) restful接口:同一个IP, 所有业务(交割合约、币本位永续合约和U本位合约)总共1秒最多800个请求\n *\n * 接口描述: 该接口支持全仓模式和逐仓模式\n *\n * 请求参数contract_code支持交割合约代码,格式为BTC-USDT-210625;同时支持合约标识,格式为 BTC-USDT(永续)、BTC-USDT-CW(当周)、BTC-USDT-NW(次周)、BTC-USDT-CQ(当季)、BTC-USDT-NQ(次季)。\n *\n * business_type 在查询交割合约数据时为必填参数。且参数值要传:futures 或 all 。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb73c34-77b5-11ed-9966-0242ac110003\n */\n getSwapMarketTrade = (params: {\n contract_code?: string;\n business_type?: string;\n }): Promise<{\n ch: string;\n status: string;\n tick: {\n data: {\n amount: string;\n quantity: string;\n trade_turnover: string;\n ts: number;\n id: number;\n price: string;\n direction: string;\n contract_code: string;\n business_type: string;\n trade_partition: string;\n }[];\n id: number;\n ts: number;\n };\n ts: number;\n }> => this.request('GET', `/linear-swap-ex/market/trade`, this.swap_api_root, params);\n\n /**\n * 获得当前合约的总持仓量\n *\n * https://huobiapi.github.io/docs/usdt_swap/v1/cn/#3218e7531a\n */\n getSwapOpenInterest = (params: {\n contract_code?: string;\n pair?: string;\n contract_type?: string;\n business_type?: string;\n }): Promise<{\n status: string;\n data: {\n volume: number;\n amount: number;\n symbol: string;\n value: number;\n contract_code: string;\n trade_amount: number;\n trade_volume: number;\n trade_turnover: number;\n business_type: string;\n pair: string;\n contract_type: string;\n }[];\n ts: number;\n }> => this.request('GET', '/linear-swap-api/v1/swap_open_interest', this.swap_api_root, params);\n\n /**\n * 【通用】获取市场最优挂单\n *\n * 接口权限: 读取\n *\n * 限频: 行情类的公开接口,比如:获取K线数据、获取聚合行情、市场行情、获取行情深度数据、获取溢价指数K线、获取实时预测资金费率k线,获取基差数据、获取市场最近成交记录:\n *\n * (1) restful接口:同一个IP, 所有业务(交割合约、币本位永续合约和U本位合约)总共1秒最多800个请求\n *\n * 接口描述: 该接口支持全仓模式和逐仓模式\n *\n * 请求参数contract_code支持交割合约代码,格式为BTC-USDT-210625;同时支持合约标识,格式为 BTC-USDT(永续)、BTC-USDT-CW(当周)、BTC-USDT-NW(次周)、BTC-USDT-CQ(当季)、BTC-USDT-NQ(次季)。\n *\n * business_type 在查询交割合约数据时为必填参数。且参数值要传:futures 或 all 。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb735e0-77b5-11ed-9966-0242ac110003\n */\n getSwapMarketBbo = (params: {\n contract_code?: string;\n }): Promise<{\n status: string;\n ticks: {\n trade_partition: string;\n business_type: string;\n contract_code: string;\n ask: number[] | null;\n bid: number[] | null;\n mrid: number;\n ts: number;\n }[];\n ts: number;\n }> => this.request('GET', `/linear-swap-ex/market/bbo`, this.swap_api_root, params);\n\n postSpotOrder(params: {\n symbol: string;\n 'account-id': string;\n amount: string;\n market_amount?: string;\n 'borrow-amount'?: string;\n type: string;\n 'trade-purpose': string;\n price?: string;\n source: string;\n }): Promise<{ success: boolean; code: number; message: string }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=10000065-77b7-11ed-9966-0242ac110003\n return this.request('POST', `/v1/order/auto/place`, this.spot_api_root, params);\n }\n\n postSwapOrder(params: {\n contract_code: string;\n contract_type: string;\n price?: number;\n volume: number;\n offset: string;\n direction: string;\n lever_rate: number;\n order_price_type: string;\n }): Promise<{ status: string; ts: number; data: { order_id: number; order_id_str: string } }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb77159-77b5-11ed-9966-0242ac110003\n return this.request('POST', '/linear-swap-api/v1/swap_cross_order', this.swap_api_root, params);\n }\n\n getSpotAccountDepositAddresses(params: { currency: string }): Promise<{\n code: number;\n message: string;\n data: {\n currency: string;\n chain: string;\n address: string;\n }[];\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45fb7-7773-11ed-9966-0242ac110003\n return this.request('GET', `/v2/account/deposit/address`, this.spot_api_root, params);\n }\n\n getAccountLedger(params: { accountId: string; currency: string }): Promise<{\n status: string;\n data: {\n transactTime: number;\n transactAmt: number;\n }[];\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec4610b-7773-11ed-9966-0242ac110003\n return this.request('GET', `/v2/account/ledger`, this.spot_api_root, params);\n }\n\n postSuperMarginAccountTransferOut(params: {\n currency: string;\n amount: string;\n }): Promise<{ status: string; data: number }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41ff0-7773-11ed-9966-0242ac110003\n return this.request('POST', `/v1/cross-margin/transfer-out`, this.spot_api_root, params);\n }\n\n postSuperMarginAccountTransferIn(params: {\n currency: string;\n amount: string;\n }): Promise<{ status: string; data: number }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41f0e-7773-11ed-9966-0242ac110003\n return this.request('POST', `/v1/cross-margin/transfer-in`, this.spot_api_root, params);\n }\n\n postSpotAccountTransfer(params: {\n from: string;\n to: string;\n currency: string;\n amount: number;\n 'margin-account': string;\n }): Promise<{ success: boolean; data: number; code: number; message: string }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=10000095-77b7-11ed-9966-0242ac110003\n return this.request('POST', `/v2/account/transfer`, this.spot_api_root, params);\n }\n\n postBorrow(params: { currency: string; amount: string }): Promise<{\n status: string;\n data: number;\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41b5d-7773-11ed-9966-0242ac110003\n return this.request('POST', `/v1/cross-margin/orders`, this.spot_api_root, params);\n }\n\n postWithdraw(params: {\n address: string;\n amount: string;\n currency: string;\n fee: string;\n chain: string;\n }): Promise<{\n status: string;\n data: number;\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec42cfd-7773-11ed-9966-0242ac110003\n return this.request('POST', `/v1/dw/withdraw/api/create`, this.spot_api_root, params);\n }\n\n getDepositWithdrawHistory(params: {\n currency: string;\n type: string;\n from?: string;\n size?: string;\n direct?: string;\n }): Promise<{\n status: string;\n 'error-code': string;\n 'error-msg': string;\n data: {\n id: number;\n type: string;\n currency: string;\n 'tx-hash': string;\n chain: string;\n amount: string;\n address: string;\n 'address-tag': string;\n fee: string;\n state: string;\n 'create-at': number;\n 'update-at': number;\n }[];\n }> {\n // https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec44f99-7773-11ed-9966-0242ac110003\n return this.request(`GET`, `/v1/query/deposit-withdraw`, this.spot_api_root, params);\n }\n\n /**\n * 获取合约的历史资金费率\n *\n * 接口权限: 读取\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=5d51f1f9-77b6-11ed-9966-0242ac110003\n */\n getSwapHistoricalFundingRate(params: {\n contract_code: string;\n page_index?: number;\n page_size?: number;\n }): Promise<{\n status: string;\n ts: number;\n data: {\n data: {\n symbol: string;\n contract_code: string;\n fee_asset: string;\n funding_time: string;\n funding_rate: string;\n realized_rate: string;\n avg_premium_index: string;\n }[];\n total_page: number;\n current_page: number;\n total_size: number;\n };\n }> {\n return this.request(\n 'GET',\n `/linear-swap-api/v1/swap_historical_funding_rate`,\n this.swap_api_root,\n params,\n );\n }\n\n /**\n * 资产划转(母子用户之间)\n *\n * 接口权限: 交易\n *\n * 限频: 2次/2s\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec45d8e-7773-11ed-9966-0242ac110003\n */\n postSubUserTransfer(params: {\n 'sub-uid': number;\n currency: string;\n amount: number;\n 'client-order-id'?: string;\n type: string;\n }): Promise<{\n data: number;\n status: string;\n }> {\n return this.request('POST', '/v1/subuser/transfer', this.spot_api_root, params);\n }\n\n /**\n * 获取子用户列表\n *\n * 接口权限: 读取\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec48f09-7773-11ed-9966-0242ac110003\n */\n getSubUserList(params?: { fromId?: number }): Promise<{\n code: number;\n message?: string;\n data: {\n uid: number;\n userState: string;\n subUserName: string;\n note: string;\n }[];\n nextId?: number;\n ok: boolean;\n }> {\n return this.request('GET', `/v2/sub-user/user-list`, this.spot_api_root, params);\n }\n\n /**\n * 账户类型查询\n *\n * 是否验签: 是\n *\n * 接口权限: 读取\n *\n * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。\n *\n * 接口描述: 此接口用于客户查询的账号类型,当前U本位合约有统一账户和非统一账户(全仓逐仓账户)类型。统一账户类型资产放在USDT一个账户上,全仓逐仓账户类型资产放在不同的币对。\n * 统一账户类型为最新升级的,当前不支持API下单。若需要用用API下单请切换账户类型为非统一账户。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb71825-77b5-11ed-9966-0242ac110003\n */\n getSwapUnifiedAccountType(): Promise<{\n code: number;\n msg: string;\n ts: number;\n data: {\n account_type: number;\n };\n }> {\n return this.request('GET', '/linear-swap-api/v3/swap_unified_account_type', this.swap_api_root);\n }\n\n /**\n * 账户类型更改接口\n *\n * 是否验签: 是\n *\n * 接口权限: 交易\n *\n * 限频: 每个UID 3秒最多 144 次请求(交易接口3秒最多 72 次请求,查询接口3秒最多 72 次请求) (该UID的所有币种和不同到期日的合约的所有私有接口共享该限制) 。\n *\n * 接口描述: 调用该接口前需要保证U本位合约无持仓和挂单,当由非统一账户(全仓逐仓账户)变为统一账户还需将资产从逐仓账户划转到全仓账户。\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=8cb7196b-77b5-11ed-9966-0242ac110003\n */\n postSwapSwitchAccountType(params: { account_type: number }): Promise<{\n code: number;\n msg: string;\n ts: number;\n data: {\n account_type: number;\n };\n }> {\n return this.request('POST', '/linear-swap-api/v3/swap_switch_account_type', this.swap_api_root, params);\n }\n\n /**\n * APIv2币链参考信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec478f0-7773-11ed-9966-0242ac110003\n */\n getV2ReferenceCurrencies = (params: {\n currency?: string;\n authorizedUser?: string;\n }): Promise<{\n code: number;\n data: {\n currency: string;\n assetType: number;\n chains: {\n chain: string;\n displayName: string;\n fullName: string;\n baseChain?: string;\n baseChainProtocol?: string;\n isDynamic?: boolean;\n numOfConfirmations: number;\n numOfFastConfirmations: number;\n depositStatus: string;\n minDepositAmt: string;\n withdrawStatus: string;\n minWithdrawAmt: string;\n withdrawPrecision: number;\n maxWithdrawAmt: string;\n withdrawQuotaPerDay: string;\n withdrawQuotaPerYear: null;\n withdrawQuotaTotal: null;\n withdrawFeeType: string;\n transactFeeWithdraw?: string;\n addrWithTag: boolean;\n addrDepositTag: boolean;\n minTransactFeeWithdraw?: string;\n transactFeeRateWithdraw?: string;\n maxTransactFeeWithdraw?: string;\n }[];\n instStatus: string;\n }[];\n }> => this.request('GET', '/v2/reference/currencies', this.spot_api_root, params);\n\n /**\n * APIv2币链参考信息\n *\n * https://www.htx.com/zh-cn/opend/newApiPages/?id=7ec41049-7773-11ed-9966-0242ac110003\n */\n getAccountHistory = (params: {\n 'account-id': string;\n currency?: string;\n 'transact-types'?: number;\n 'start-time'?: number;\n 'end-time'?: number;\n sort?: 'asc' | 'desc';\n size?: number;\n 'from-id'?: number;\n }): Promise<{\n // code: number;\n 'transact-amt': string;\n 'avail-balance': string;\n 'acct-balance': string;\n 'transact-time': string;\n 'record-id': string;\n status: string;\n data: {\n 'account-id': string;\n currency: string;\n 'record-id': string;\n 'transact-amt': string;\n 'transact-type': string;\n 'avail-balance': string;\n 'acct-balance': string;\n 'transact-time': string;\n }[];\n }> => this.request('GET', '/v1/account/history', this.spot_api_root, params);\n}\n\nexport const client = new HuobiClient({\n auth: {\n access_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n },\n});\n"]}
package/lib/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import './index';
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,SAAS,CAAC"}
package/lib/cli.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ require("./index");
5
+ //# sourceMappingURL=cli.js.map
package/lib/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,mBAAiB","sourcesContent":["#!/usr/bin/env node\nimport './index';\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cluster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cluster.d.ts","sourceRoot":"","sources":["../src/cluster.ts"],"names":[],"mappings":""}
package/lib/cluster.js ADDED
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const protocol_1 = require("@yuants/protocol");
30
+ const secret_1 = require("@yuants/secret");
31
+ const utils_1 = require("@yuants/utils");
32
+ const cluster_1 = __importDefault(require("cluster"));
33
+ const rxjs_1 = require("rxjs");
34
+ const logger_1 = require("./logger");
35
+ (0, logger_1.overrideConsole)();
36
+ if (cluster_1.default.isPrimary) {
37
+ console.info('This is the primary process');
38
+ const logBuffer = new rxjs_1.Subject();
39
+ logBuffer
40
+ .pipe(
41
+ //
42
+ (0, rxjs_1.bufferTime)(100), (0, rxjs_1.map)((v) => v.join('\n')), (0, rxjs_1.filter)((v) => v.trim() !== ''))
43
+ .subscribe((message) => {
44
+ console.info(message);
45
+ });
46
+ (0, rxjs_1.defer)(() => (0, secret_1.loadSecrets)({
47
+ terminal: protocol_1.Terminal.fromNodeEnv(),
48
+ encryption_key_base58: process.env.ENCRYPTION_KEY_BASE58,
49
+ }))
50
+ .pipe(
51
+ //
52
+ (0, rxjs_1.retry)({ delay: 5000 }), (0, rxjs_1.repeat)({ delay: 5000 }))
53
+ .pipe((0, utils_1.listWatch)((x) => x.secret.id, (account) => (0, rxjs_1.defer)(() => new rxjs_1.Observable((subscriber) => {
54
+ if (account.secret.public_data.type !== 'api_key_htx')
55
+ return;
56
+ if (!account.secret.public_data.name)
57
+ return;
58
+ if (!account.decrypted_data)
59
+ return;
60
+ if (!account.decrypted_data.access_key)
61
+ return;
62
+ if (!account.decrypted_data.secret_key)
63
+ return;
64
+ const worker = cluster_1.default.fork({
65
+ ENCRYPTION_KEY_BASE58: '',
66
+ ACCESS_KEY: account.decrypted_data.access_key,
67
+ SECRET_KEY: account.decrypted_data.secret_key,
68
+ WRITE_QUOTE_TO_SQL: account.secret.public_data.write_quote_to_sql ? 'true' : 'false',
69
+ TERMINAL_ID: `@yuants/vendor-huobi/worker/${account.secret.public_data.name}`,
70
+ WORKER_LABEL: account.secret.public_data.name,
71
+ });
72
+ worker.on('message', (message) => {
73
+ if (message.type === 'log') {
74
+ logBuffer.next(`[Worker ${worker.process.pid} ${message.label}] ${message.level}: ${message.message}`);
75
+ }
76
+ });
77
+ worker.on('exit', (code, signal) => {
78
+ if (code === 0) {
79
+ console.log(`Worker ${worker.process.pid} exited gracefully`);
80
+ subscriber.complete();
81
+ }
82
+ else {
83
+ console.error(`Worker ${worker.process.pid} exited with code ${code} and signal ${signal}`);
84
+ subscriber.error(new Error(`Worker ${worker.process.pid} exited with code ${code} and signal ${signal}`));
85
+ }
86
+ });
87
+ return () => {
88
+ worker.kill();
89
+ console.log(`Worker ${worker.process.pid} killed`);
90
+ };
91
+ })).pipe(
92
+ //
93
+ (0, rxjs_1.retry)({ delay: 1000 }), (0, rxjs_1.repeat)({ delay: 1000 })), (a, b) => a.secret.updated_at === b.secret.updated_at))
94
+ .subscribe();
95
+ }
96
+ else {
97
+ console.info('This is the worker process', process.pid, process.env);
98
+ Promise.resolve().then(() => __importStar(require('./index')));
99
+ }
100
+ //# sourceMappingURL=cluster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cluster.js","sourceRoot":"","sources":["../src/cluster.ts"],"names":[],"mappings":"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","sourcesContent":["import { Terminal } from '@yuants/protocol';\nimport { loadSecrets } from '@yuants/secret';\nimport { listWatch } from '@yuants/utils';\nimport cluster from 'cluster';\nimport { bufferTime, defer, filter, map, Observable, repeat, retry, Subject } from 'rxjs';\nimport { overrideConsole } from './logger';\n\noverrideConsole();\n\nif (cluster.isPrimary) {\n console.info('This is the primary process');\n\n const logBuffer = new Subject<string>();\n\n logBuffer\n .pipe(\n //\n bufferTime(100),\n map((v) => v.join('\\n')),\n filter((v) => v.trim() !== ''),\n )\n .subscribe((message) => {\n console.info(message);\n });\n\n defer(() =>\n loadSecrets<{ access_key: string; secret_key: string }>({\n terminal: Terminal.fromNodeEnv(),\n encryption_key_base58: process.env.ENCRYPTION_KEY_BASE58!,\n }),\n )\n .pipe(\n //\n retry({ delay: 5000 }),\n repeat({ delay: 5000 }),\n )\n .pipe(\n listWatch(\n (x) => x.secret.id,\n (account) =>\n defer(\n () =>\n new Observable((subscriber) => {\n if (account.secret.public_data.type !== 'api_key_htx') return;\n if (!account.secret.public_data.name) return;\n if (!account.decrypted_data) return;\n if (!account.decrypted_data.access_key) return;\n if (!account.decrypted_data.secret_key) return;\n\n const worker = cluster.fork({\n ENCRYPTION_KEY_BASE58: '',\n ACCESS_KEY: account.decrypted_data.access_key,\n SECRET_KEY: account.decrypted_data.secret_key,\n WRITE_QUOTE_TO_SQL: account.secret.public_data.write_quote_to_sql ? 'true' : 'false',\n TERMINAL_ID: `@yuants/vendor-huobi/worker/${account.secret.public_data.name}`,\n WORKER_LABEL: account.secret.public_data.name,\n });\n\n worker.on('message', (message: any) => {\n if (message.type === 'log') {\n logBuffer.next(\n `[Worker ${worker.process.pid} ${message.label}] ${message.level}: ${message.message}`,\n );\n }\n });\n\n worker.on('exit', (code, signal) => {\n if (code === 0) {\n console.log(`Worker ${worker.process.pid} exited gracefully`);\n subscriber.complete();\n } else {\n console.error(\n `Worker ${worker.process.pid} exited with code ${code} and signal ${signal}`,\n );\n subscriber.error(\n new Error(`Worker ${worker.process.pid} exited with code ${code} and signal ${signal}`),\n );\n }\n });\n return () => {\n worker.kill();\n console.log(`Worker ${worker.process.pid} killed`);\n };\n }),\n ).pipe(\n //\n retry({ delay: 1000 }),\n repeat({ delay: 1000 }), // 重试间隔为 1 秒\n ),\n (a, b) => a.secret.updated_at === b.secret.updated_at,\n ),\n )\n .subscribe();\n} else {\n console.info('This is the worker process', process.pid, process.env);\n import('./index');\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { IExtensionContext } from '@yuants/extension';
2
+ declare const _default: (context: IExtensionContext) => void;
3
+ export default _default;
4
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA+B,MAAM,mBAAmB,CAAC;kCAC1D,iBAAiB;AAA1C,wBAmFE"}