@yuants/vendor-okx 0.31.9 → 0.31.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account-actions-with-credential.js.map +1 -1
- package/dist/accountInfos/loan.js.map +1 -1
- package/dist/accountInfos/strategy.js.map +1 -1
- package/dist/accountInfos/uid.js +1 -1
- package/dist/accountInfos/uid.js.map +1 -1
- package/dist/api/private-api.js.map +1 -1
- package/dist/api/public-api.js.map +1 -1
- package/dist/experimental/getOrders.js.map +1 -1
- package/dist/experimental/getPositions.js.map +1 -1
- package/dist/experimental/product.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/orders/cancelOrder.js.map +1 -1
- package/dist/orders/listOrders.js.map +1 -1
- package/dist/orders/modifyOrder.js.map +1 -1
- package/dist/orders/submitOrder.js.map +1 -1
- package/dist/public-data/interest_rate.js +5 -4
- package/dist/public-data/interest_rate.js.map +1 -1
- package/dist/public-data/market-order.js.map +1 -1
- package/dist/public-data/new-quote.js.map +1 -1
- package/dist/public-data/ohlc.js +43 -10
- package/dist/public-data/ohlc.js.map +1 -1
- package/dist/public-data/product.js.map +1 -1
- package/dist/public-data/quote.js.map +1 -1
- package/dist/services/interest-ledger-service.js +33 -0
- package/dist/services/interest-ledger-service.js.map +1 -0
- package/dist/services/interest-rate-service.js.map +1 -1
- package/dist/services/ohlc-service.js.map +1 -1
- package/dist/services.js.map +1 -1
- package/dist/trade.js.map +1 -1
- package/dist/transfer.js +1 -1
- package/dist/transfer.js.map +1 -1
- package/dist/utils/provideOHLCFromTimeBackwardService.js.map +1 -1
- package/dist/utils/provideSeriesFromTimeBackwardService.js.map +1 -1
- package/dist/ws.js +24 -24
- package/dist/ws.js.map +1 -1
- package/lib/account-actions-with-credential.js.map +1 -1
- package/lib/accountInfos/loan.js.map +1 -1
- package/lib/accountInfos/strategy.js.map +1 -1
- package/lib/accountInfos/trading.d.ts.map +1 -1
- package/lib/accountInfos/uid.d.ts +2 -2
- package/lib/accountInfos/uid.d.ts.map +1 -1
- package/lib/accountInfos/uid.js +1 -1
- package/lib/accountInfos/uid.js.map +1 -1
- package/lib/api/private-api.d.ts +4 -4
- package/lib/api/private-api.d.ts.map +1 -1
- package/lib/api/private-api.js +32 -32
- package/lib/api/private-api.js.map +1 -1
- package/lib/api/public-api.d.ts +1 -11
- package/lib/api/public-api.d.ts.map +1 -1
- package/lib/api/public-api.js.map +1 -1
- package/lib/experimental/getOrders.d.ts.map +1 -1
- package/lib/experimental/getOrders.js.map +1 -1
- package/lib/experimental/getPositions.d.ts.map +1 -1
- package/lib/experimental/getPositions.js.map +1 -1
- package/lib/experimental/product.d.ts.map +1 -1
- package/lib/experimental/product.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/orders/cancelOrder.d.ts.map +1 -1
- package/lib/orders/cancelOrder.js.map +1 -1
- package/lib/orders/listOrders.d.ts.map +1 -1
- package/lib/orders/listOrders.js.map +1 -1
- package/lib/orders/modifyOrder.d.ts.map +1 -1
- package/lib/orders/modifyOrder.js.map +1 -1
- package/lib/orders/submitOrder.d.ts.map +1 -1
- package/lib/orders/submitOrder.js.map +1 -1
- package/lib/public-data/interest_rate.js +5 -4
- package/lib/public-data/interest_rate.js.map +1 -1
- package/lib/public-data/market-order.js.map +1 -1
- package/lib/public-data/new-quote.js.map +1 -1
- package/lib/public-data/ohlc.js +42 -9
- package/lib/public-data/ohlc.js.map +1 -1
- package/lib/public-data/product.js.map +1 -1
- package/lib/public-data/quote.js.map +1 -1
- package/lib/services/interest-ledger-service.d.ts +2 -0
- package/lib/services/interest-ledger-service.d.ts.map +1 -0
- package/lib/services/interest-ledger-service.js +35 -0
- package/lib/services/interest-ledger-service.js.map +1 -0
- package/lib/services/interest-rate-service.js.map +1 -1
- package/lib/services/ohlc-service.js.map +1 -1
- package/lib/services.js.map +1 -1
- package/lib/trade.js.map +1 -1
- package/lib/transfer.js +1 -1
- package/lib/transfer.js.map +1 -1
- package/lib/tsdoc-metadata.json +1 -1
- package/lib/utils/provideOHLCFromTimeBackwardService.d.ts.map +1 -1
- package/lib/utils/provideOHLCFromTimeBackwardService.js.map +1 -1
- package/lib/utils/provideSeriesFromTimeBackwardService.d.ts +1 -1
- package/lib/utils/provideSeriesFromTimeBackwardService.d.ts.map +1 -1
- package/lib/utils/provideSeriesFromTimeBackwardService.js.map +1 -1
- package/lib/ws.d.ts +1 -1
- package/lib/ws.d.ts.map +1 -1
- package/lib/ws.js +24 -24
- package/lib/ws.js.map +1 -1
- package/package.json +48 -48
- package/temp/build/typescript/ts_xKrCYDcc.json +1 -0
- package/temp/package-deps.json +24 -23
- package/temp/test/jest/haste-map-0104fb5fee08bd97aacd02300cdbf195-f3ddf881f4f21e2e5ae6006d95adf2b1-267deb988b5111321a1cf92c4d020334 +0 -0
- package/temp/vendor-okx.api.json +18 -2
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const protocol_1 = require("@yuants/protocol");
|
|
4
|
+
const utils_1 = require("@yuants/utils");
|
|
5
|
+
const exchange_1 = require("@yuants/exchange");
|
|
6
|
+
const private_api_1 = require("../api/private-api");
|
|
7
|
+
const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
8
|
+
const WINDOW_MS = 365 * 24 * 3600000;
|
|
9
|
+
const fetchInterestRateLedgerBackward = async (req) => {
|
|
10
|
+
var _a;
|
|
11
|
+
const params = {};
|
|
12
|
+
params.end = req.time.toString();
|
|
13
|
+
params.begin = (req.time - WINDOW_MS).toString();
|
|
14
|
+
params.limit = 100;
|
|
15
|
+
params.type = req.ledger_type;
|
|
16
|
+
const res = await (0, private_api_1.getAccountBillsArchive)(req.credential.payload, params);
|
|
17
|
+
return ((_a = res.data) !== null && _a !== void 0 ? _a : [])
|
|
18
|
+
.map((v) => {
|
|
19
|
+
const ms = Number(v.ts);
|
|
20
|
+
return {
|
|
21
|
+
id: v.billId,
|
|
22
|
+
product_id: (0, utils_1.encodePath)('OKX', v.instType, v.instId),
|
|
23
|
+
amount: v.balChg,
|
|
24
|
+
account_id: req.account_id,
|
|
25
|
+
currency: v.ccy,
|
|
26
|
+
created_at: (0, utils_1.formatTime)(ms),
|
|
27
|
+
};
|
|
28
|
+
})
|
|
29
|
+
.filter((x) => Date.parse(x.created_at) <= req.time);
|
|
30
|
+
};
|
|
31
|
+
(0, exchange_1.provideInterestLedgerService)(terminal, {
|
|
32
|
+
direction: 'backward',
|
|
33
|
+
type: 'OKX',
|
|
34
|
+
}, fetchInterestRateLedgerBackward);
|
|
35
|
+
//# sourceMappingURL=interest-ledger-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interest-ledger-service.js","sourceRoot":"","sources":["../../src/services/interest-ledger-service.ts"],"names":[],"mappings":";;AACA,+CAA4C;AAC5C,yCAAuD;AACvD,+CAAgE;AAChE,oDAA4D;AAO5D,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,MAAM,SAAS,GAAG,GAAG,GAAG,EAAE,GAAG,OAAQ,CAAC;AAEtC,MAAM,+BAA+B,GAAG,KAAK,EAAE,GAK9C,EAA8B,EAAE;;IAC/B,MAAM,MAAM,GAAoC,EAAE,CAAC;IACnD,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IACjC,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjD,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;IACnB,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC;IAC9B,MAAM,GAAG,GAAG,MAAM,IAAA,oCAAsB,EAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzE,OAAO,CAAC,MAAA,GAAG,CAAC,IAAI,mCAAI,EAAE,CAAC;SACpB,GAAG,CAAC,CAAC,CAAC,EAAmB,EAAE;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxB,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,MAAM;YACZ,UAAU,EAAE,IAAA,kBAAU,EAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;YACnD,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,CAAC,CAAC,GAAG;YACf,UAAU,EAAE,IAAA,kBAAU,EAAC,EAAE,CAAC;SACR,CAAC;IACvB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAW,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF,IAAA,uCAA4B,EAC1B,QAAQ,EACR;IACE,SAAS,EAAE,UAAU;IACrB,IAAI,EAAE,KAAK;CACZ,EACD,+BAA+B,CAChC,CAAC","sourcesContent":["import { IInterestLedger } from '@yuants/data-interest-rate';\nimport { Terminal } from '@yuants/protocol';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { provideInterestLedgerService } from '@yuants/exchange';\nimport { getAccountBillsArchive } from '../api/private-api';\n\ninterface IExchangeCredential {\n type: string;\n payload: any;\n}\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst WINDOW_MS = 365 * 24 * 3600_000;\n\nconst fetchInterestRateLedgerBackward = async (req: {\n credential: IExchangeCredential;\n account_id: string;\n time: number;\n ledger_type: string;\n}): Promise<IInterestLedger[]> => {\n const params: Record<string, string | number> = {};\n params.end = req.time.toString();\n params.begin = (req.time - WINDOW_MS).toString();\n params.limit = 100;\n params.type = req.ledger_type;\n const res = await getAccountBillsArchive(req.credential.payload, params);\n return (res.data ?? [])\n .map((v): IInterestLedger => {\n const ms = Number(v.ts);\n return {\n id: v.billId,\n product_id: encodePath('OKX', v.instType, v.instId),\n amount: v.balChg,\n account_id: req.account_id,\n currency: v.ccy,\n created_at: formatTime(ms),\n } as IInterestLedger;\n })\n .filter((x) => Date.parse(x.created_at!) <= req.time);\n};\n\nprovideInterestLedgerService(\n terminal,\n {\n direction: 'backward',\n type: 'OKX',\n },\n fetchInterestRateLedgerBackward,\n);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interest-rate-service.js","sourceRoot":"","sources":["../../src/services/interest-rate-service.ts"],"names":[],"mappings":";;AACA,+CAA8D;AAC9D,+CAA4C;AAC5C,yCAAuD;AACvD,kDAAiF;AAEjF,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,MAAM,4BAA4B,GAAG,KAAK,EAAE,GAI3C,EAA4B,EAAE;IAC7B,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAA,kBAAU,EAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,QAAQ,KAAK,MAAM,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAEjG,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,IAAA,kCAAqB,EAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,EAAE,CAAC,CAAC;IAC3E,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"interest-rate-service.js","sourceRoot":"","sources":["../../src/services/interest-rate-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { IInterestRate } from '@yuants/data-interest-rate';\nimport { provideInterestRateService } from '@yuants/exchange';\nimport { Terminal } from '@yuants/protocol';\nimport { decodePath, formatTime } from '@yuants/utils';\nimport { getFundingRateHistory, getLendingRateHistory } from '../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst fetchSwapFundingRateBackward = async (req: {\n product_id: string;\n time: number;\n series_id: string;\n}): Promise<IInterestRate[]> => {\n const [, instType, instId] = decodePath(req.product_id);\n if (instType !== 'SWAP' || !instId) throw new Error(`Unsupported product_id: ${req.product_id}`);\n\n const endedAtMs = req.time;\n const res = await getFundingRateHistory({ instId, after: `${endedAtMs}` });\n if (res.code !== '0') {\n throw new Error(`OKX getFundingRateHistory failed: ${res.code} ${res.msg}`);\n }\n\n return res.data\n .map((v): IInterestRate => {\n const ms = Number(v.fundingTime);\n const rate = Number(v.fundingRate);\n return {\n series_id: req.series_id,\n product_id: req.product_id,\n datasource_id: 'OKX',\n created_at: formatTime(ms),\n long_rate: `${-rate}`,\n short_rate: `${rate}`,\n settlement_price: '',\n };\n })\n .filter((x) => Date.parse(x.created_at) < endedAtMs);\n};\n\nconst fetchMarginInterestRateBackward = async (req: {\n product_id: string;\n time: number;\n series_id: string;\n}): Promise<IInterestRate[]> => {\n const [, instType, instId] = decodePath(req.product_id);\n if (instType !== 'MARGIN' || !instId) throw new Error(`Unsupported product_id: ${req.product_id}`);\n\n const [base, quote] = instId.split('-');\n if (!base || !quote) throw new Error(`Invalid MARGIN instId: ${instId}`);\n\n const endedAtMs = req.time;\n\n const [resBase, resQuote] = await Promise.all([\n getLendingRateHistory({ ccy: base, after: `${endedAtMs}` }),\n getLendingRateHistory({ ccy: quote, after: `${endedAtMs}` }),\n ]);\n\n if (resBase.code !== '0')\n throw new Error(`OKX getLendingRateHistory failed: ${resBase.code} ${resBase.msg}`);\n if (resQuote.code !== '0')\n throw new Error(`OKX getLendingRateHistory failed: ${resQuote.code} ${resQuote.msg}`);\n\n const mapTsToBaseRate = new Map<string, string>();\n resBase.data.forEach((v) => mapTsToBaseRate.set(v.ts, v.rate));\n\n const data: IInterestRate[] = [];\n resQuote.data.forEach((v) => {\n const baseRate = mapTsToBaseRate.get(v.ts);\n if (!baseRate) return;\n\n const longRate = Number(v.rate) / 365 / 24;\n const shortRate = Number(baseRate) / 365 / 24;\n\n data.push({\n series_id: req.series_id,\n product_id: req.product_id,\n datasource_id: 'OKX',\n created_at: formatTime(+v.ts),\n long_rate: `${-longRate}`,\n short_rate: `${-shortRate}`,\n settlement_price: '',\n });\n });\n\n return data.filter((x) => Date.parse(x.created_at) < endedAtMs);\n};\n\nprovideInterestRateService(\n terminal,\n {\n product_id_prefix: 'OKX/SWAP/',\n direction: 'backward',\n },\n fetchSwapFundingRateBackward,\n {\n egress_token_capacity: 10,\n egress_token_refill_interval: 2000,\n },\n);\n\nprovideInterestRateService(\n terminal,\n {\n product_id_prefix: 'OKX/MARGIN/',\n direction: 'backward',\n },\n fetchMarginInterestRateBackward,\n {\n egress_token_capacity: 6,\n egress_token_refill_interval: 1000,\n },\n);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ohlc-service.js","sourceRoot":"","sources":["../../src/services/ohlc-service.ts"],"names":[],"mappings":";;AACA,+CAAsD;AACtD,+CAA6D;AAC7D,yCAAgF;AAChF,kDAAsD;AAEtD,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,MAAM,sBAAsB,GAAoB;IAC9C,qBAAqB,EAAE,EAAE;IACzB,4BAA4B,EAAE,IAAI;CACnC,CAAC;AAEF,MAAM,wBAAwB,GAA2B;IACvD,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;IAEZ,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IAEZ,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;CACV,CAAC;AAEF,MAAM,qBAAqB,GAAG,KAAK,EAAE,GAKpC,EAAoB,EAAE;IACrB,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAA,kBAAU,EAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAEnF,MAAM,GAAG,GAAG,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEnE,MAAM,MAAM,GAAG,IAAA,+BAAuB,EAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC;IAE3B,MAAM,GAAG,GAAG,MAAM,IAAA,8BAAiB,EAAC;QAClC,MAAM;QACN,GAAG;QACH,KAAK,EAAE,GAAG,SAAS,EAAE;QACrB,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"ohlc-service.js","sourceRoot":"","sources":["../../src/services/ohlc-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOHLC } from '@yuants/data-ohlc';\nimport { provideOHLCService } from '@yuants/exchange';\nimport { IServiceOptions, Terminal } from '@yuants/protocol';\nimport { convertDurationToOffset, decodePath, formatTime } from '@yuants/utils';\nimport { getHistoryCandles } from '../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst INGEST_SERVICE_OPTIONS: IServiceOptions = {\n egress_token_capacity: 20,\n egress_token_refill_interval: 2000,\n};\n\nconst DURATION_TO_OKX_BAR_TYPE: Record<string, string> = {\n PT1M: '1m',\n PT3M: '3m',\n PT5M: '5m',\n PT15M: '15m',\n PT30M: '30m',\n\n PT1H: '1H',\n PT2H: '2H',\n PT4H: '4H',\n PT6H: '6H',\n PT12H: '12H',\n\n P1D: '1D',\n P1W: '1W',\n P1M: '1M',\n};\n\nconst fetchOHLCPageBackward = async (req: {\n product_id: string;\n duration: string;\n time: number;\n series_id: string;\n}): Promise<IOHLC[]> => {\n const [, instType, instId] = decodePath(req.product_id);\n if (!instType || !instId) throw new Error(`Invalid product_id: ${req.product_id}`);\n\n const bar = DURATION_TO_OKX_BAR_TYPE[req.duration];\n if (!bar) throw new Error(`Unsupported duration: ${req.duration}`);\n\n const offset = convertDurationToOffset(req.duration);\n const endedAtMs = req.time;\n\n const res = await getHistoryCandles({\n instId,\n bar,\n after: `${endedAtMs}`,\n limit: '300',\n });\n if (res.code !== '0') {\n throw new Error(`OKX getHistoryCandles failed: ${res.code} ${res.msg}`);\n }\n\n return res.data\n .map(\n (x): IOHLC => ({\n series_id: req.series_id,\n datasource_id: 'OKX',\n product_id: req.product_id,\n duration: req.duration,\n created_at: formatTime(+x[0]),\n closed_at: formatTime(+x[0] + offset),\n open: x[1],\n high: x[2],\n low: x[3],\n close: x[4],\n volume: x[5],\n open_interest: '0',\n }),\n )\n .filter((x) => Date.parse(x.created_at) < endedAtMs);\n};\n\nprovideOHLCService(\n terminal,\n {\n product_id_prefix: 'OKX/SWAP/',\n duration_list: Object.keys(DURATION_TO_OKX_BAR_TYPE),\n direction: 'backward',\n },\n fetchOHLCPageBackward,\n INGEST_SERVICE_OPTIONS,\n);\n\nprovideOHLCService(\n terminal,\n {\n product_id_prefix: 'OKX/SPOT/',\n duration_list: Object.keys(DURATION_TO_OKX_BAR_TYPE),\n direction: 'backward',\n },\n fetchOHLCPageBackward,\n INGEST_SERVICE_OPTIONS,\n);\n\nprovideOHLCService(\n terminal,\n {\n product_id_prefix: 'OKX/MARGIN/',\n duration_list: Object.keys(DURATION_TO_OKX_BAR_TYPE),\n direction: 'backward',\n },\n fetchOHLCPageBackward,\n INGEST_SERVICE_OPTIONS,\n);\n"]}
|
package/lib/services.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":";;AAAA,+CAA4C;AAC5C,+BAA6B;AAC7B,4CAAyD;AACzD,mDAA4E;AAE5E,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AACxC,MAAM,UAAU,GAAG,IAAA,kCAAoB,GAAE,CAAC;AAE1C,IAAA,YAAK,EAAC,KAAK,IAAI,EAAE;IACf,MAAM,gBAAgB,GAAG,MAAM,IAAA,yBAAmB,EAAC,UAAU,CAAC,CAAC;IAI/D,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,iBAAiB,EACjB;QACE,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,UAAU,EAAE;YACV,UAAU,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;SACxC;KACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,IAAI,GAAG,CAAC,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":";;AAAA,+CAA4C;AAC5C,+BAA6B;AAC7B,4CAAyD;AACzD,mDAA4E;AAE5E,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AACxC,MAAM,UAAU,GAAG,IAAA,kCAAoB,GAAE,CAAC;AAE1C,IAAA,YAAK,EAAC,KAAK,IAAI,EAAE;IACf,MAAM,gBAAgB,GAAG,MAAM,IAAA,yBAAmB,EAAC,UAAU,CAAC,CAAC;IAI/D,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,iBAAiB,EACjB;QACE,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,UAAU,EAAE;YACV,UAAU,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;SACxC;KACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAiB,EAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5D,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;IACpD,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC","sourcesContent":["import { Terminal } from '@yuants/protocol';\nimport { defer } from 'rxjs';\nimport { getTradingAccountId } from './accountInfos/uid';\nimport { getDefaultCredential, postGridAlgoOrder } from './api/private-api';\n\nconst terminal = Terminal.fromNodeEnv();\nconst credential = getDefaultCredential();\n\ndefer(async () => {\n const tradingAccountId = await getTradingAccountId(credential);\n\n type Request = Parameters<typeof postGridAlgoOrder>[1];\n\n terminal.server.provideService<Request, any>(\n 'Grid/Algo-Order',\n {\n required: ['account_id'],\n properties: {\n account_id: { const: tradingAccountId },\n },\n },\n async (msg) => {\n if (msg.req) {\n msg.req.tag = process.env.BROKER_CODE;\n const result = await postGridAlgoOrder(credential, msg.req);\n return { res: { code: 0, message: 'OK', data: result } };\n }\n return { res: { code: 0, message: 'No Params' } };\n },\n );\n}).subscribe();\n"]}
|
package/lib/trade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trade.js","sourceRoot":"","sources":["../src/trade.ts"],"names":[],"mappings":"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","sourcesContent":["import { IProduct } from '@yuants/data-product';\nimport { ITrade } from '@yuants/data-trade';\nimport { Terminal } from '@yuants/protocol';\nimport { buildInsertManyIntoTableSQL, escapeSQL, requestSQL } from '@yuants/sql';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { defer, repeat, retry, tap, timeout } from 'rxjs';\nimport { getAccountBillsArchive, getDefaultCredential } from './api/private-api';\nimport { getTradingAccountId } from './accountInfos/uid';\n\nconst credential = getDefaultCredential();\n\nconst tradeParser = async (accountId: string, params: Record<string, string>): Promise<ITrade[]> => {\n const tradeList: ITrade[] = [];\n const result = await getAccountBillsArchive(credential, params);\n const productIdToProduct = new Map<string, IProduct>();\n const productIdSet = new Set<string>();\n if (result.code === '0' && result.data) {\n const data = result.data;\n const mapTradeIdToBillList = new Map<string, typeof data>();\n data.forEach((item) => {\n productIdSet.add(encodePath('OKX', item.instType, item.instId));\n mapTradeIdToBillList.set(item.tradeId, [...(mapTradeIdToBillList.get(item.tradeId) ?? []), item]);\n });\n if (productIdSet.size > 0) {\n const productList = await requestSQL<IProduct[]>(\n Terminal.fromNodeEnv(),\n `\n select * from product where product_id in (${Array.from(productIdSet)\n .map((productId) => escapeSQL(productId))\n .join(',')})\n `,\n );\n if (productList.length > 0) {\n productList.forEach((p) => productIdToProduct.set(p.product_id, p));\n }\n }\n for (const [tradeId, v] of mapTradeIdToBillList) {\n if (!((v[0].instType === 'SPOT' && v.length === 2) || v[0].instType === 'SWAP')) continue;\n const trade: ITrade = {\n id: tradeId,\n account_id: accountId,\n product_id: '',\n direction: '',\n traded_volume: '',\n traded_price: '',\n traded_value: '',\n post_volume: '',\n fee: '',\n fee_currency: '',\n created_at: '0',\n };\n\n v.forEach((bill) => {\n trade.created_at = Math.max(Number(trade.created_at), Number(bill.ts)).toString();\n trade.product_id = encodePath('OKX', bill.instType, bill.instId);\n trade.traded_price = bill.px;\n if (bill.instType === 'SWAP') {\n if (bill.subType === '1') trade.direction = 'OPEN_LONG';\n if (bill.subType === '2') trade.direction = 'CLOSE_LONG';\n if (bill.subType === '3') trade.direction = 'OPEN_LONG';\n if (bill.subType === '4') trade.direction = 'OPEN_SHORT';\n if (bill.subType === '5') trade.direction = 'CLOSE_LONG';\n if (bill.subType === '6') trade.direction = 'CLOSE_SHORT';\n trade.traded_volume = bill.sz;\n trade.traded_value = (Number(bill.sz) * Number(bill.px)).toString();\n }\n if (bill.instType === 'SPOT') {\n if (bill.subType === '1') {\n if (bill.ccy !== 'USDT') {\n trade.direction = 'OPEN_LONG';\n } else {\n trade.direction = 'CLOSE_LONG';\n }\n }\n\n if (bill.ccy !== 'USDT') {\n trade.traded_volume = bill.sz;\n }\n if (bill.ccy === 'USDT') {\n trade.traded_value = bill.sz;\n }\n }\n // fee\n if (bill.fee !== '0') {\n trade.fee = Math.abs(Number(bill.fee)).toString();\n trade.fee_currency = bill.ccy;\n }\n });\n trade.created_at = formatTime(Number(trade.created_at));\n if (productIdToProduct.has(trade.product_id)) {\n trade.traded_value = (\n +trade.traded_value * +(productIdToProduct.get(trade.product_id)?.value_scale ?? 1)\n ).toString();\n } else {\n throw new Error(`Not Found Product With Product Id: ${trade.product_id}`);\n }\n tradeList.push(trade);\n }\n }\n return tradeList;\n};\n\nconst getAccountTradeWithAccountId = async (accountId: string) => {\n const currentTrade = await requestSQL<ITrade[]>(\n Terminal.fromNodeEnv(),\n `\n select * from trade where account_id=${escapeSQL(accountId)} order by created_at desc limit 1;\n `,\n );\n const params: Record<string, string> = {\n type: '2',\n begin: (new Date().getTime() - 1000 * 60 * 60 * 24 * 30 * 3).toString(),\n };\n if (currentTrade.length === 1) {\n params['begin'] = new Date(currentTrade[0].created_at ?? 0).getTime().toString();\n }\n console.log(formatTime(Date.now()), 'getAccountTrade', `params: ${JSON.stringify(params)}`);\n const tradeList = await tradeParser(accountId, params);\n console.log(formatTime(Date.now()), 'getAccountTrade', `tradeList: ${JSON.stringify(tradeList)}`);\n await requestSQL(\n Terminal.fromNodeEnv(),\n buildInsertManyIntoTableSQL(tradeList, 'trade', {\n columns: [\n 'id',\n 'account_id',\n 'product_id',\n 'traded_volume',\n 'traded_value',\n 'traded_price',\n 'direction',\n 'fee',\n 'fee_currency',\n 'created_at',\n ],\n conflictKeys: ['id'],\n }),\n );\n};\n\n(async () => {\n const account_id = await getTradingAccountId(credential);\n console.log(formatTime(Date.now()), 'getAccountTrade', `AccountID: ${account_id}`);\n defer(() => getAccountTradeWithAccountId(account_id))\n .pipe(\n //\n timeout(10_000), // 超时设定:10 秒\n tap({\n error: (err) => {\n console.error(formatTime(Date.now()), 'getAccountTradeError', err);\n },\n }),\n repeat({ delay: 30_000 }),\n retry({ delay: 5000 }),\n )\n .subscribe();\n})();\n"]}
|
|
1
|
+
{"version":3,"file":"trade.js","sourceRoot":"","sources":["../src/trade.ts"],"names":[],"mappings":"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","sourcesContent":["import { IProduct } from '@yuants/data-product';\nimport { ITrade } from '@yuants/data-trade';\nimport { Terminal } from '@yuants/protocol';\nimport { buildInsertManyIntoTableSQL, escapeSQL, requestSQL } from '@yuants/sql';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { defer, repeat, retry, tap, timeout } from 'rxjs';\nimport { getAccountBillsArchive, getDefaultCredential } from './api/private-api';\nimport { getTradingAccountId } from './accountInfos/uid';\n\nconst credential = getDefaultCredential();\n\nconst tradeParser = async (accountId: string, params: Record<string, string>): Promise<ITrade[]> => {\n const tradeList: ITrade[] = [];\n const result = await getAccountBillsArchive(credential, params);\n const productIdToProduct = new Map<string, IProduct>();\n const productIdSet = new Set<string>();\n if (result.code === '0' && result.data) {\n const data = result.data;\n const mapTradeIdToBillList = new Map<string, typeof data>();\n data.forEach((item) => {\n productIdSet.add(encodePath('OKX', item.instType, item.instId));\n mapTradeIdToBillList.set(item.tradeId, [...(mapTradeIdToBillList.get(item.tradeId) ?? []), item]);\n });\n if (productIdSet.size > 0) {\n const productList = await requestSQL<IProduct[]>(\n Terminal.fromNodeEnv(),\n `\n select * from product where product_id in (${Array.from(productIdSet)\n .map((productId) => escapeSQL(productId))\n .join(',')})\n `,\n );\n if (productList.length > 0) {\n productList.forEach((p) => productIdToProduct.set(p.product_id, p));\n }\n }\n for (const [tradeId, v] of mapTradeIdToBillList) {\n if (!((v[0].instType === 'SPOT' && v.length === 2) || v[0].instType === 'SWAP')) continue;\n const trade: ITrade = {\n id: tradeId,\n account_id: accountId,\n product_id: '',\n direction: '',\n traded_volume: '',\n traded_price: '',\n traded_value: '',\n post_volume: '',\n fee: '',\n fee_currency: '',\n created_at: '0',\n };\n\n v.forEach((bill) => {\n trade.created_at = Math.max(Number(trade.created_at), Number(bill.ts)).toString();\n trade.product_id = encodePath('OKX', bill.instType, bill.instId);\n trade.traded_price = bill.px;\n if (bill.instType === 'SWAP') {\n if (bill.subType === '1') trade.direction = 'OPEN_LONG';\n if (bill.subType === '2') trade.direction = 'CLOSE_LONG';\n if (bill.subType === '3') trade.direction = 'OPEN_LONG';\n if (bill.subType === '4') trade.direction = 'OPEN_SHORT';\n if (bill.subType === '5') trade.direction = 'CLOSE_LONG';\n if (bill.subType === '6') trade.direction = 'CLOSE_SHORT';\n trade.traded_volume = bill.sz;\n trade.traded_value = (Number(bill.sz) * Number(bill.px)).toString();\n }\n if (bill.instType === 'SPOT') {\n if (bill.subType === '1') {\n if (bill.ccy !== 'USDT') {\n trade.direction = 'OPEN_LONG';\n } else {\n trade.direction = 'CLOSE_LONG';\n }\n }\n\n if (bill.ccy !== 'USDT') {\n trade.traded_volume = bill.sz;\n }\n if (bill.ccy === 'USDT') {\n trade.traded_value = bill.sz;\n }\n }\n // fee\n if (bill.fee !== '0') {\n trade.fee = Math.abs(Number(bill.fee)).toString();\n trade.fee_currency = bill.ccy;\n }\n });\n trade.created_at = formatTime(Number(trade.created_at));\n if (productIdToProduct.has(trade.product_id)) {\n trade.traded_value = (\n +trade.traded_value * +(productIdToProduct.get(trade.product_id)?.value_scale ?? 1)\n ).toString();\n } else {\n throw new Error(`Not Found Product With Product Id: ${trade.product_id}`);\n }\n tradeList.push(trade);\n }\n }\n return tradeList;\n};\n\nconst getAccountTradeWithAccountId = async (accountId: string) => {\n const currentTrade = await requestSQL<ITrade[]>(\n Terminal.fromNodeEnv(),\n `\n select * from trade where account_id=${escapeSQL(accountId)} order by created_at desc limit 1;\n `,\n );\n const params: Record<string, string> = {\n type: '2',\n begin: (new Date().getTime() - 1000 * 60 * 60 * 24 * 30 * 3).toString(),\n };\n if (currentTrade.length === 1) {\n params['begin'] = new Date(currentTrade[0].created_at ?? 0).getTime().toString();\n }\n console.log(formatTime(Date.now()), 'getAccountTrade', `params: ${JSON.stringify(params)}`);\n const tradeList = await tradeParser(accountId, params);\n console.log(formatTime(Date.now()), 'getAccountTrade', `tradeList: ${JSON.stringify(tradeList)}`);\n await requestSQL(\n Terminal.fromNodeEnv(),\n buildInsertManyIntoTableSQL(tradeList, 'trade', {\n columns: [\n 'id',\n 'account_id',\n 'product_id',\n 'traded_volume',\n 'traded_value',\n 'traded_price',\n 'direction',\n 'fee',\n 'fee_currency',\n 'created_at',\n ],\n conflictKeys: ['id'],\n }),\n );\n};\n\n(async () => {\n const account_id = await getTradingAccountId(credential);\n console.log(formatTime(Date.now()), 'getAccountTrade', `AccountID: ${account_id}`);\n defer(() => getAccountTradeWithAccountId(account_id))\n .pipe(\n //\n timeout(10_000), // 超时设定:10 秒\n tap({\n error: (err) => {\n console.error(formatTime(Date.now()), 'getAccountTradeError', err);\n },\n }),\n repeat({ delay: 30_000 }),\n retry({ delay: 5000 }),\n )\n .subscribe();\n})();\n"]}
|
package/lib/transfer.js
CHANGED
package/lib/transfer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { Terminal } from '@yuants/protocol';\nimport { addAccountTransferAddress } from '@yuants/transfer';\nimport { formatTime } from '@yuants/utils';\nimport { defer } from 'rxjs';\nimport {\n getAccountConfig,\n getAssetCurrencies,\n getAssetDepositAddress,\n getAssetDepositHistory,\n getAssetWithdrawalHistory,\n getDefaultCredential,\n getSubAccountList,\n postAssetTransfer,\n postAssetWithdrawal,\n postFinanceSavingsPurchaseRedempt,\n} from './api/private-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst credential = getDefaultCredential();\n\nconst cacheOfAssetCurrencies = createCache(() => getAssetCurrencies(credential), { expire: 3600_000 });\n\ndefer(async () => {\n const account_config = await getAccountConfig(credential);\n if (!account_config) throw new Error('Failed to get account config');\n console.info(formatTime(Date.now()), 'AccountConfig', JSON.stringify(account_config));\n const { mainUid, uid } = account_config.data[0];\n const isMainAccount = mainUid === uid;\n\n const TRADING_ACCOUNT_ID = `okx/${uid}/trading`;\n const FUNDING_ACCOUNT_ID = `okx/${uid}/funding/USDT`;\n const EARNING_ACCOUNT_ID = `okx/${uid}/earning/USDT`;\n\n // BLOCK_CHAIN: only available for main account\n if (isMainAccount) {\n const depositAddressRes = await getAssetDepositAddress(credential, { ccy: 'USDT' });\n console.info(formatTime(Date.now()), 'DepositAddress', JSON.stringify(depositAddressRes.data));\n const addresses = depositAddressRes.data.filter((v) => v.chain === 'USDT-TRC20' && v.to === '6');\n for (const address of addresses) {\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: 'TRC20',\n currency: 'USDT',\n address: address.addr,\n onApply: {\n INIT: async (order) => {\n if (\n !order.current_amount ||\n order.current_amount < 3 // 最小提币额度\n ) {\n return { state: 'ERROR', message: 'Amount too small' };\n }\n const res = await cacheOfAssetCurrencies.query('');\n const theRes = res?.data?.find((x) => x.ccy === 'USDT' && x.chain === 'USDT-TRC20');\n const _fee = theRes?.minFee;\n if (!_fee) return { state: 'ERROR', message: 'Currency Info not found, cannot get fee' };\n const fee = +_fee;\n const amt = Math.floor(order.current_amount - fee);\n const transferResult = await postAssetWithdrawal(credential, {\n amt: `${amt}`,\n ccy: 'USDT',\n chain: 'USDT-TRC20',\n fee: `${fee}`,\n dest: '4', // 链上提币\n toAddr: order.current_rx_address!,\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const wdId = transferResult.data[0]?.wdId;\n return { state: 'AWAIT_TX_ID', context: wdId };\n },\n AWAIT_TX_ID: async (transferOrder) => {\n const wdId = transferOrder.current_tx_context;\n const withdrawalHistory = await getAssetWithdrawalHistory(credential, { wdId });\n const txId = withdrawalHistory.data?.[0]?.txId;\n if (!txId) {\n return { state: 'AWAIT_TX_ID', context: wdId };\n }\n return { state: 'COMPLETE', transaction_id: txId };\n },\n },\n onEval: async (transferOrder) => {\n const checkResult = await getAssetDepositHistory(credential, {\n ccy: 'USDT',\n txId: transferOrder.current_transaction_id,\n type: '4',\n });\n\n if (checkResult.code !== '0') {\n return {\n state: 'INIT',\n };\n }\n\n if (checkResult.data[0].state !== '2') {\n return { state: 'PENDING' };\n }\n const received_amount = +checkResult.data[0].amt;\n return { state: 'COMPLETE', received_amount };\n },\n });\n }\n }\n\n // Funding-Trading\n {\n const FUNDING_TRADING_NETWORK_ID = `OKX/${uid}/Funding-Trading`;\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: FUNDING_TRADING_NETWORK_ID,\n currency: 'USDT',\n address: 'funding',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '0',\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n from: '6',\n to: '18',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n addAccountTransferAddress({\n terminal,\n account_id: TRADING_ACCOUNT_ID,\n network_id: FUNDING_TRADING_NETWORK_ID,\n currency: 'USDT',\n address: 'trading',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '0',\n ccy: order.currency,\n amt: `${order.current_amount}`,\n from: '18',\n to: '6',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n }\n // Funding-Earning\n {\n const FUNDING_EARNING_NETWORK_ID = `OKX/${uid}/Funding-Earning`;\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: FUNDING_EARNING_NETWORK_ID,\n currency: 'USDT',\n address: 'funding',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postFinanceSavingsPurchaseRedempt(credential, {\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n side: 'purchase',\n rate: '0.01',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: 'ok' };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n addAccountTransferAddress({\n terminal,\n account_id: EARNING_ACCOUNT_ID,\n network_id: FUNDING_EARNING_NETWORK_ID,\n currency: 'USDT',\n address: 'earning',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postFinanceSavingsPurchaseRedempt(credential, {\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n side: 'redempt',\n rate: '0.01',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: 'ok' };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n }\n\n // SubAccount\n {\n const getSubAccountNetworkId = (subUid: string) => `OKX/${mainUid}/SubAccount/${subUid}`;\n if (isMainAccount) {\n const subAcctsRes = await getSubAccountList(credential);\n for (const item of subAcctsRes.data || []) {\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: getSubAccountNetworkId(item.uid),\n currency: 'USDT',\n address: 'main',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '1',\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n from: '6',\n to: '6',\n subAcct: item.subAcct,\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (order) => {\n // ISSUE: OKX API Issue: transId is incorrect or transId does not match with ‘ type’\n // const checkResult = await client.getAssetTransferState({ transId: order.current_transaction_id });\n // const received_amount = checkResult?.data?.[0]?.amt;\n // if (!received_amount) {\n // return { state: 'INIT', message: checkResult.msg };\n // }\n // return { state: 'COMPLETE', received_amount: +received_amount };\n\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n }\n }\n // SubAccount API\n else {\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: getSubAccountNetworkId(uid),\n currency: 'USDT',\n address: 'sub',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '3',\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n from: '6',\n to: '6',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (order) => {\n // ISSUE: OKX API Issue: transId is incorrect or transId does not match with ‘ type’\n // const checkResult = await client.getAssetTransferState({ transId: order.current_transaction_id });\n // const received_amount = checkResult?.data?.[0]?.amt;\n // if (!received_amount) {\n // return { state: 'INIT', message: checkResult.msg };\n // }\n // return { state: 'COMPLETE', received_amount: +received_amount };\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n }\n }\n}).subscribe();\n"]}
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":";;AAAA,yCAA4C;AAC5C,+CAA4C;AAC5C,+CAA6D;AAC7D,yCAA2C;AAC3C,+BAA6B;AAC7B,mDAW2B;AAE3B,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,MAAM,UAAU,GAAG,IAAA,kCAAoB,GAAE,CAAC;AAE1C,MAAM,sBAAsB,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,IAAA,gCAAkB,EAAC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAQ,EAAE,CAAC,CAAC;AAEvG,IAAA,YAAK,EAAC,KAAK,IAAI,EAAE;IACf,MAAM,cAAc,GAAG,MAAM,IAAA,8BAAgB,EAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACrE,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;IACtF,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,OAAO,KAAK,GAAG,CAAC;IAEtC,MAAM,kBAAkB,GAAG,OAAO,GAAG,UAAU,CAAC;IAChD,MAAM,kBAAkB,GAAG,OAAO,GAAG,eAAe,CAAC;IACrD,MAAM,kBAAkB,GAAG,OAAO,GAAG,eAAe,CAAC;IAErD,+CAA+C;IAC/C,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,iBAAiB,GAAG,MAAM,IAAA,oCAAsB,EAAC,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/F,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,YAAY,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;QACjG,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,IAAA,oCAAyB,EAAC;gBACxB,QAAQ;gBACR,UAAU,EAAE,kBAAkB;gBAC9B,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,OAAO,CAAC,IAAI;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;;wBACpB,IACE,CAAC,KAAK,CAAC,cAAc;4BACrB,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,SAAS;0BAClC,CAAC;4BACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;wBACzD,CAAC;wBACD,MAAM,GAAG,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;wBACnD,MAAM,MAAM,GAAG,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,0CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC;wBACpF,MAAM,IAAI,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAC;wBAC5B,IAAI,CAAC,IAAI;4BAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;wBACzF,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC;wBAClB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;wBACnD,MAAM,cAAc,GAAG,MAAM,IAAA,iCAAmB,EAAC,UAAU,EAAE;4BAC3D,GAAG,EAAE,GAAG,GAAG,EAAE;4BACb,GAAG,EAAE,MAAM;4BACX,KAAK,EAAE,YAAY;4BACnB,GAAG,EAAE,GAAG,GAAG,EAAE;4BACb,IAAI,EAAE,GAAG,EAAE,OAAO;4BAClB,MAAM,EAAE,KAAK,CAAC,kBAAmB;yBAClC,CAAC,CAAC;wBACH,IAAI,cAAc,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;4BAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC;wBACxD,CAAC;wBACD,MAAM,IAAI,GAAG,MAAA,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAC;wBAC1C,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBACjD,CAAC;oBACD,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;;wBACnC,MAAM,IAAI,GAAG,aAAa,CAAC,kBAAkB,CAAC;wBAC9C,MAAM,iBAAiB,GAAG,MAAM,IAAA,uCAAyB,EAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;wBAChF,MAAM,IAAI,GAAG,MAAA,MAAA,iBAAiB,CAAC,IAAI,0CAAG,CAAC,CAAC,0CAAE,IAAI,CAAC;wBAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;4BACV,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;wBACjD,CAAC;wBACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;oBACrD,CAAC;iBACF;gBACD,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;oBAC9B,MAAM,WAAW,GAAG,MAAM,IAAA,oCAAsB,EAAC,UAAU,EAAE;wBAC3D,GAAG,EAAE,MAAM;wBACX,IAAI,EAAE,aAAa,CAAC,sBAAsB;wBAC1C,IAAI,EAAE,GAAG;qBACV,CAAC,CAAC;oBAEH,IAAI,WAAW,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;wBAC7B,OAAO;4BACL,KAAK,EAAE,MAAM;yBACd,CAAC;oBACJ,CAAC;oBAED,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;wBACtC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;oBAC9B,CAAC;oBACD,MAAM,eAAe,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;oBACjD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;gBAChD,CAAC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,CAAC;QACC,MAAM,0BAA0B,GAAG,OAAO,GAAG,kBAAkB,CAAC;QAChE,IAAA,oCAAyB,EAAC;YACxB,QAAQ;YACR,UAAU,EAAE,kBAAkB;YAC9B,UAAU,EAAE,0BAA0B;YACtC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE;gBACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACpB,MAAM,cAAc,GAAG,MAAM,IAAA,+BAAiB,EAAC,UAAU,EAAE;wBACzD,IAAI,EAAE,GAAG;wBACT,GAAG,EAAE,MAAM;wBACX,GAAG,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE;wBAC9B,IAAI,EAAE,GAAG;wBACT,EAAE,EAAE,IAAI;qBACT,CAAC,CAAC;oBACH,IAAI,cAAc,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;wBAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC;oBACxD,CAAC;oBACD,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;oBACtD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;gBAC/C,CAAC;aACF;YACD,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;gBAC9B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC;YAC9E,CAAC;SACF,CAAC,CAAC;QACH,IAAA,oCAAyB,EAAC;YACxB,QAAQ;YACR,UAAU,EAAE,kBAAkB;YAC9B,UAAU,EAAE,0BAA0B;YACtC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE;gBACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACpB,MAAM,cAAc,GAAG,MAAM,IAAA,+BAAiB,EAAC,UAAU,EAAE;wBACzD,IAAI,EAAE,GAAG;wBACT,GAAG,EAAE,KAAK,CAAC,QAAQ;wBACnB,GAAG,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE;wBAC9B,IAAI,EAAE,IAAI;wBACV,EAAE,EAAE,GAAG;qBACR,CAAC,CAAC;oBACH,IAAI,cAAc,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;wBAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC;oBACxD,CAAC;oBACD,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;oBACtD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;gBAC/C,CAAC;aACF;YACD,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;gBAC9B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC;YAC9E,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IACD,kBAAkB;IAClB,CAAC;QACC,MAAM,0BAA0B,GAAG,OAAO,GAAG,kBAAkB,CAAC;QAChE,IAAA,oCAAyB,EAAC;YACxB,QAAQ;YACR,UAAU,EAAE,kBAAkB;YAC9B,UAAU,EAAE,0BAA0B;YACtC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE;gBACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACpB,MAAM,cAAc,GAAG,MAAM,IAAA,+CAAiC,EAAC,UAAU,EAAE;wBACzE,GAAG,EAAE,MAAM;wBACX,GAAG,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE;wBAC9B,IAAI,EAAE,UAAU;wBAChB,IAAI,EAAE,MAAM;qBACb,CAAC,CAAC;oBACH,IAAI,cAAc,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;wBAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC;oBACxD,CAAC;oBACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;gBACrD,CAAC;aACF;YACD,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;gBAC9B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC;YAC9E,CAAC;SACF,CAAC,CAAC;QACH,IAAA,oCAAyB,EAAC;YACxB,QAAQ;YACR,UAAU,EAAE,kBAAkB;YAC9B,UAAU,EAAE,0BAA0B;YACtC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE;gBACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACpB,MAAM,cAAc,GAAG,MAAM,IAAA,+CAAiC,EAAC,UAAU,EAAE;wBACzE,GAAG,EAAE,MAAM;wBACX,GAAG,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE;wBAC9B,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,MAAM;qBACb,CAAC,CAAC;oBACH,IAAI,cAAc,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;wBAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC;oBACxD,CAAC;oBACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;gBACrD,CAAC;aACF;YACD,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;gBAC9B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,CAAC,cAAc,EAAE,CAAC;YAC9E,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,aAAa;IACb,CAAC;QACC,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,OAAO,OAAO,eAAe,MAAM,EAAE,CAAC;QACzF,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAiB,EAAC,UAAU,CAAC,CAAC;YACxD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;gBAC1C,IAAA,oCAAyB,EAAC;oBACxB,QAAQ;oBACR,UAAU,EAAE,kBAAkB;oBAC9B,UAAU,EAAE,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC;oBAC5C,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,MAAM;oBACf,OAAO,EAAE;wBACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;4BACpB,MAAM,cAAc,GAAG,MAAM,IAAA,+BAAiB,EAAC,UAAU,EAAE;gCACzD,IAAI,EAAE,GAAG;gCACT,GAAG,EAAE,MAAM;gCACX,GAAG,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE;gCAC9B,IAAI,EAAE,GAAG;gCACT,EAAE,EAAE,GAAG;gCACP,OAAO,EAAE,IAAI,CAAC,OAAO;6BACtB,CAAC,CAAC;4BACH,IAAI,cAAc,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gCAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC;4BACxD,CAAC;4BACD,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;4BACtD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;wBAC/C,CAAC;qBACF;oBACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;wBACtB,oFAAoF;wBACpF,qGAAqG;wBACrG,uDAAuD;wBACvD,0BAA0B;wBAC1B,wDAAwD;wBACxD,IAAI;wBACJ,mEAAmE;wBAEnE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC;oBACtE,CAAC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,iBAAiB;aACZ,CAAC;YACJ,IAAA,oCAAyB,EAAC;gBACxB,QAAQ;gBACR,UAAU,EAAE,kBAAkB;gBAC9B,UAAU,EAAE,sBAAsB,CAAC,GAAG,CAAC;gBACvC,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE;oBACP,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;wBACpB,MAAM,cAAc,GAAG,MAAM,IAAA,+BAAiB,EAAC,UAAU,EAAE;4BACzD,IAAI,EAAE,GAAG;4BACT,GAAG,EAAE,MAAM;4BACX,GAAG,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE;4BAC9B,IAAI,EAAE,GAAG;4BACT,EAAE,EAAE,GAAG;yBACR,CAAC,CAAC;wBACH,IAAI,cAAc,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;4BAChC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC;wBACxD,CAAC;wBACD,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;wBACtD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;oBAC/C,CAAC;iBACF;gBACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACtB,oFAAoF;oBACpF,qGAAqG;oBACrG,uDAAuD;oBACvD,0BAA0B;oBAC1B,wDAAwD;oBACxD,IAAI;oBACJ,mEAAmE;oBACnE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC;gBACtE,CAAC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { Terminal } from '@yuants/protocol';\nimport { addAccountTransferAddress } from '@yuants/transfer';\nimport { formatTime } from '@yuants/utils';\nimport { defer } from 'rxjs';\nimport {\n getAccountConfig,\n getAssetCurrencies,\n getAssetDepositAddress,\n getAssetDepositHistory,\n getAssetWithdrawalHistory,\n getDefaultCredential,\n getSubAccountList,\n postAssetTransfer,\n postAssetWithdrawal,\n postFinanceSavingsPurchaseRedempt,\n} from './api/private-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst credential = getDefaultCredential();\n\nconst cacheOfAssetCurrencies = createCache(() => getAssetCurrencies(credential), { expire: 3600_000 });\n\ndefer(async () => {\n const account_config = await getAccountConfig(credential);\n if (!account_config) throw new Error('Failed to get account config');\n console.info(formatTime(Date.now()), 'AccountConfig', JSON.stringify(account_config));\n const { mainUid, uid } = account_config.data[0];\n const isMainAccount = mainUid === uid;\n\n const TRADING_ACCOUNT_ID = `okx/${uid}/trading`;\n const FUNDING_ACCOUNT_ID = `okx/${uid}/funding/USDT`;\n const EARNING_ACCOUNT_ID = `okx/${uid}/earning/USDT`;\n\n // BLOCK_CHAIN: only available for main account\n if (isMainAccount) {\n const depositAddressRes = await getAssetDepositAddress(credential, { ccy: 'USDT' });\n console.info(formatTime(Date.now()), 'DepositAddress', JSON.stringify(depositAddressRes.data));\n const addresses = depositAddressRes.data.filter((v) => v.chain === 'USDT-TRC20' && v.to === '6');\n for (const address of addresses) {\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: 'TRC20',\n currency: 'USDT',\n address: address.addr,\n onApply: {\n INIT: async (order) => {\n if (\n !order.current_amount ||\n order.current_amount < 3 // 最小提币额度\n ) {\n return { state: 'ERROR', message: 'Amount too small' };\n }\n const res = await cacheOfAssetCurrencies.query('');\n const theRes = res?.data?.find((x) => x.ccy === 'USDT' && x.chain === 'USDT-TRC20');\n const _fee = theRes?.minFee;\n if (!_fee) return { state: 'ERROR', message: 'Currency Info not found, cannot get fee' };\n const fee = +_fee;\n const amt = Math.floor(order.current_amount - fee);\n const transferResult = await postAssetWithdrawal(credential, {\n amt: `${amt}`,\n ccy: 'USDT',\n chain: 'USDT-TRC20',\n fee: `${fee}`,\n dest: '4', // 链上提币\n toAddr: order.current_rx_address!,\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const wdId = transferResult.data[0]?.wdId;\n return { state: 'AWAIT_TX_ID', context: wdId };\n },\n AWAIT_TX_ID: async (transferOrder) => {\n const wdId = transferOrder.current_tx_context;\n const withdrawalHistory = await getAssetWithdrawalHistory(credential, { wdId });\n const txId = withdrawalHistory.data?.[0]?.txId;\n if (!txId) {\n return { state: 'AWAIT_TX_ID', context: wdId };\n }\n return { state: 'COMPLETE', transaction_id: txId };\n },\n },\n onEval: async (transferOrder) => {\n const checkResult = await getAssetDepositHistory(credential, {\n ccy: 'USDT',\n txId: transferOrder.current_transaction_id,\n type: '4',\n });\n\n if (checkResult.code !== '0') {\n return {\n state: 'INIT',\n };\n }\n\n if (checkResult.data[0].state !== '2') {\n return { state: 'PENDING' };\n }\n const received_amount = +checkResult.data[0].amt;\n return { state: 'COMPLETE', received_amount };\n },\n });\n }\n }\n\n // Funding-Trading\n {\n const FUNDING_TRADING_NETWORK_ID = `OKX/${uid}/Funding-Trading`;\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: FUNDING_TRADING_NETWORK_ID,\n currency: 'USDT',\n address: 'funding',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '0',\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n from: '6',\n to: '18',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n addAccountTransferAddress({\n terminal,\n account_id: TRADING_ACCOUNT_ID,\n network_id: FUNDING_TRADING_NETWORK_ID,\n currency: 'USDT',\n address: 'trading',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '0',\n ccy: order.currency,\n amt: `${order.current_amount}`,\n from: '18',\n to: '6',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n }\n // Funding-Earning\n {\n const FUNDING_EARNING_NETWORK_ID = `OKX/${uid}/Funding-Earning`;\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: FUNDING_EARNING_NETWORK_ID,\n currency: 'USDT',\n address: 'funding',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postFinanceSavingsPurchaseRedempt(credential, {\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n side: 'purchase',\n rate: '0.01',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: 'ok' };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n addAccountTransferAddress({\n terminal,\n account_id: EARNING_ACCOUNT_ID,\n network_id: FUNDING_EARNING_NETWORK_ID,\n currency: 'USDT',\n address: 'earning',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postFinanceSavingsPurchaseRedempt(credential, {\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n side: 'redempt',\n rate: '0.01',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: 'ok' };\n },\n },\n onEval: async (transferOrder) => {\n return { state: 'COMPLETE', received_amount: transferOrder.current_amount };\n },\n });\n }\n\n // SubAccount\n {\n const getSubAccountNetworkId = (subUid: string) => `OKX/${mainUid}/SubAccount/${subUid}`;\n if (isMainAccount) {\n const subAcctsRes = await getSubAccountList(credential);\n for (const item of subAcctsRes.data || []) {\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: getSubAccountNetworkId(item.uid),\n currency: 'USDT',\n address: 'main',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '1',\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n from: '6',\n to: '6',\n subAcct: item.subAcct,\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (order) => {\n // ISSUE: OKX API Issue: transId is incorrect or transId does not match with ‘ type’\n // const checkResult = await client.getAssetTransferState({ transId: order.current_transaction_id });\n // const received_amount = checkResult?.data?.[0]?.amt;\n // if (!received_amount) {\n // return { state: 'INIT', message: checkResult.msg };\n // }\n // return { state: 'COMPLETE', received_amount: +received_amount };\n\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n }\n }\n // SubAccount API\n else {\n addAccountTransferAddress({\n terminal,\n account_id: FUNDING_ACCOUNT_ID,\n network_id: getSubAccountNetworkId(uid),\n currency: 'USDT',\n address: 'sub',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: '3',\n ccy: 'USDT',\n amt: `${order.current_amount}`,\n from: '6',\n to: '6',\n });\n if (transferResult.code !== '0') {\n return { state: 'INIT', message: transferResult.msg };\n }\n const transaction_id = transferResult.data[0].transId;\n return { state: 'COMPLETE', transaction_id };\n },\n },\n onEval: async (order) => {\n // ISSUE: OKX API Issue: transId is incorrect or transId does not match with ‘ type’\n // const checkResult = await client.getAssetTransferState({ transId: order.current_transaction_id });\n // const received_amount = checkResult?.data?.[0]?.amt;\n // if (!received_amount) {\n // return { state: 'INIT', message: checkResult.msg };\n // }\n // return { state: 'COMPLETE', received_amount: +received_amount };\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n }\n }\n}).subscribe();\n"]}
|
package/lib/tsdoc-metadata.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provideOHLCFromTimeBackwardService.d.ts","sourceRoot":"","sources":["../../src/utils/provideOHLCFromTimeBackwardService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAA8B,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI7D;;;;;;GAMG;AACH,eAAO,MAAM,kCAAkC;
|
|
1
|
+
{"version":3,"file":"provideOHLCFromTimeBackwardService.d.ts","sourceRoot":"","sources":["../../src/utils/provideOHLCFromTimeBackwardService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAA8B,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI7D;;;;;;GAMG;AACH,eAAO,MAAM,kCAAkC,GAAI,KAAK;IACtD,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,EAAE,CAAC,GAAG,EAAE;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACvB,cAAc,EAAE,eAAe,CAAC;CACjC,SAyCA,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provideOHLCFromTimeBackwardService.js","sourceRoot":"","sources":["../../src/utils/provideOHLCFromTimeBackwardService.ts"],"names":[],"mappings":";;;AAAA,iDAAsE;AAEtE,iGAA8F;AAC9F,yCAAoE;AAEpE;;;;;;GAMG;AACI,MAAM,kCAAkC,GAAG,CAAC,GAalD,EAAE,EAAE;IACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAE5D,IAAA,sCAA0B,EAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAE3F,IAAA,2EAAoC,EAAQ;QAC1C,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI,EAAE,MAAM;QACZ,sBAAsB,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC;QAC3C,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;YACrC,4CAA4C;YAC5C,2CAA2C;YAC3C,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,IAAA,kBAAU,EAAC,SAAS,CAAC,CAAC;YAEpE,IAAI,kBAAkB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"provideOHLCFromTimeBackwardService.js","sourceRoot":"","sources":["../../src/utils/provideOHLCFromTimeBackwardService.ts"],"names":[],"mappings":";;;AAAA,iDAAsE;AAEtE,iGAA8F;AAC9F,yCAAoE;AAEpE;;;;;;GAMG;AACI,MAAM,kCAAkC,GAAG,CAAC,GAalD,EAAE,EAAE;IACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAE5D,IAAA,sCAA0B,EAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAE3F,IAAA,2EAAoC,EAAQ;QAC1C,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI,EAAE,MAAM;QACZ,sBAAsB,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC;QAC3C,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;YACrC,4CAA4C;YAC5C,2CAA2C;YAC3C,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,IAAA,kBAAU,EAAC,SAAS,CAAC,CAAC;YAEpE,IAAI,kBAAkB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5D,MAAM,YAAY,QAAQ,mBAAmB,CAAC;YAChD,CAAC;YAED,MAAM,MAAM,GAAG,IAAA,+BAAuB,EAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,2BAA2B,CAAC;YACpC,CAAC;YACD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,wBAAwB,CAAC;YACjC,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClB,MAAM,qBAAqB,CAAC;YAC9B,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC;gBAC7B,EAAE;gBACF,SAAS;gBACT,aAAa;gBACb,UAAU;gBACV,QAAQ;gBACR,MAAM;gBACN,IAAI;aACL,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,cAAc,EAAE,GAAG,CAAC,cAAc;KACnC,CAAC,CAAC;AACL,CAAC,CAAC;AAtDW,QAAA,kCAAkC,sCAsD7C","sourcesContent":["import { IOHLC, provideOHLCDurationService } from '@yuants/data-ohlc';\nimport { IServiceOptions, Terminal } from '@yuants/protocol';\nimport { provideSeriesFromTimeBackwardService } from './provideSeriesFromTimeBackwardService';\nimport { convertDurationToOffset, decodePath } from '@yuants/utils';\n\n/**\n * Provide OHLC from time backward service\n *\n * 提供 K线数据 按时间向后查询服务\n *\n * @public\n */\nexport const provideOHLCFromTimeBackwardService = (ctx: {\n terminal: Terminal;\n datasource_id: string;\n supported_durations: string[];\n queryFn: (ctx: {\n series_id: string;\n datasource_id: string;\n product_id: string;\n duration: string;\n offset: number;\n time: string;\n }) => Promise<IOHLC[]>;\n serviceOptions: IServiceOptions;\n}) => {\n const supportedDurations = new Set(ctx.supported_durations);\n\n provideOHLCDurationService(ctx.terminal, ctx.datasource_id, () => ctx.supported_durations);\n\n provideSeriesFromTimeBackwardService<IOHLC>({\n terminal: ctx.terminal,\n type: 'ohlc',\n series_id_prefix_parts: [ctx.datasource_id],\n queryFn: async ({ series_id, time }) => {\n // series_id 格式: OKX/{product_id}/{duration}\n // 其中 product_id 可能包含转义的 /,如 SPOT\\/BTC-USDT\n const [datasource_id, product_id, duration] = decodePath(series_id);\n\n if (supportedDurations && !supportedDurations.has(duration)) {\n throw `duration ${duration} is not supported`;\n }\n\n const offset = convertDurationToOffset(duration);\n if (!datasource_id) {\n throw 'datasource_id is required';\n }\n if (!product_id) {\n throw 'product_id is required';\n }\n if (isNaN(offset)) {\n throw 'duration is invalid';\n }\n const data = await ctx.queryFn({\n //\n series_id,\n datasource_id,\n product_id,\n duration,\n offset,\n time,\n });\n return data;\n },\n serviceOptions: ctx.serviceOptions,\n });\n};\n"]}
|
|
@@ -17,6 +17,6 @@ export declare const provideSeriesFromTimeBackwardService: <T extends {
|
|
|
17
17
|
series_id: string;
|
|
18
18
|
time: string;
|
|
19
19
|
}) => Promise<T[]>;
|
|
20
|
-
serviceOptions?: IServiceOptions
|
|
20
|
+
serviceOptions?: IServiceOptions;
|
|
21
21
|
}) => void;
|
|
22
22
|
//# sourceMappingURL=provideSeriesFromTimeBackwardService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provideSeriesFromTimeBackwardService.d.ts","sourceRoot":"","sources":["../../src/utils/provideSeriesFromTimeBackwardService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI7D;;;;;;GAMG;AACH,eAAO,MAAM,oCAAoC;
|
|
1
|
+
{"version":3,"file":"provideSeriesFromTimeBackwardService.d.ts","sourceRoot":"","sources":["../../src/utils/provideSeriesFromTimeBackwardService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI7D;;;;;;GAMG;AACH,eAAO,MAAM,oCAAoC,GAC/C,CAAC,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EACnD,KAAK;IACL,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,OAAO,EAAE,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACpE,cAAc,CAAC,EAAE,eAAe,CAAC;CAClC,SA2EA,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provideSeriesFromTimeBackwardService.js","sourceRoot":"","sources":["../../src/utils/provideSeriesFromTimeBackwardService.ts"],"names":[],"mappings":";;;AACA,qCAAsE;AACtE,yCAAyD;AAEzD;;;;;;GAMG;AACI,MAAM,oCAAoC,GAAG,CAElD,GAMD,EAAE,EAAE;IAOH,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAChC,6BAA6B,EAC7B;QACE,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC;QACvC,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE;YACzB,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,IAAA,oBAAY,EAAC,IAAA,kBAAU,EAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,GAAG,EAAE;YACnG,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;SAC9C;KACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC;QAEpC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpD,OAAO;YACL,GAAG,EAAE;gBACH,IAAI,EAAE,CAAC;gBACP,OAAO,EAAE,IAAI;gBACb,IAAI;aACL;SACF,CAAC;IACJ,CAAC,EACD,GAAG,CAAC,cAAc,CACnB,CAAC;IAEF,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAChC,8BAA8B,EAC9B;QACE,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC;QACvC,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE;YACzB,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;SAC9C;KACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CACtD,6BAA6B,EAC7B,GAAG,CAAC,GAAG,CACR,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"provideSeriesFromTimeBackwardService.js","sourceRoot":"","sources":["../../src/utils/provideSeriesFromTimeBackwardService.ts"],"names":[],"mappings":";;;AACA,qCAAsE;AACtE,yCAAyD;AAEzD;;;;;;GAMG;AACI,MAAM,oCAAoC,GAAG,CAElD,GAMD,EAAE,EAAE;IAOH,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAChC,6BAA6B,EAC7B;QACE,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC;QACvC,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE;YACzB,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,IAAA,oBAAY,EAAC,IAAA,kBAAU,EAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,GAAG,EAAE;YACnG,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;SAC9C;KACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC;QAEpC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpD,OAAO;YACL,GAAG,EAAE;gBACH,IAAI,EAAE,CAAC;gBACP,OAAO,EAAE,IAAI;gBACb,IAAI;aACL;SACF,CAAC;IACJ,CAAC,EACD,GAAG,CAAC,cAAc,CACnB,CAAC;IAEF,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAChC,8BAA8B,EAC9B;QACE,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC;QACvC,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE;YACzB,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;SAC9C;KACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CACtD,6BAA6B,EAC7B,GAAG,CAAC,GAAG,CACR,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,EAAE,GAAG,EAAE,CAAC;QACjB,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAA,gBAAU,EACd,GAAG,CAAC,QAAQ,EACZ,IAAA,iCAA2B,EAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE;gBAC5C,YAAY,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;aAC1C,CAAC,CACH,CAAC;QACJ,CAAC;QAED,OAAO;YACL,GAAG,EAAE;gBACH,IAAI,EAAE,CAAC;gBACP,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;iBACvB;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAnFW,QAAA,oCAAoC,wCAmF/C","sourcesContent":["import { IServiceOptions, Terminal } from '@yuants/protocol';\nimport { buildInsertManyIntoTableSQL, requestSQL } from '@yuants/sql';\nimport { encodePath, escapeRegExp } from '@yuants/utils';\n\n/**\n * Provide series from time backward service\n *\n * 提供从时间点向前 (不包含该时间点) 查询序列数据的服务\n *\n * @public\n */\nexport const provideSeriesFromTimeBackwardService = <\n T extends { series_id: string; created_at: string },\n>(ctx: {\n terminal: Terminal;\n type: string;\n series_id_prefix_parts: string[];\n queryFn: (ctx: { series_id: string; time: string }) => Promise<T[]>;\n serviceOptions?: IServiceOptions;\n}) => {\n interface IQuerySeriesFromTimeBackwardReq {\n time: string;\n type: string;\n series_id: string;\n }\n\n ctx.terminal.server.provideService<IQuerySeriesFromTimeBackwardReq, T[]>(\n 'QuerySeriesFromTimeBackward',\n {\n type: 'object',\n required: ['type', 'series_id', 'time'],\n properties: {\n type: { const: ctx.type },\n series_id: { type: 'string', pattern: `^${escapeRegExp(encodePath(ctx.series_id_prefix_parts))}/` },\n time: { type: 'string', format: 'date-time' },\n },\n },\n async (msg) => {\n const { time, series_id } = msg.req;\n\n const data = await ctx.queryFn({ series_id, time });\n\n return {\n res: {\n code: 0,\n message: 'OK',\n data,\n },\n };\n },\n ctx.serviceOptions,\n );\n\n ctx.terminal.server.provideService<IQuerySeriesFromTimeBackwardReq, {}>(\n 'UpdateSeriesFromTimeBackward',\n {\n type: 'object',\n required: ['type', 'series_id', 'time'],\n properties: {\n type: { const: ctx.type },\n series_id: { type: 'string' },\n time: { type: 'string', format: 'date-time' },\n },\n },\n async (msg) => {\n const res = await ctx.terminal.client.requestForResponse<IQuerySeriesFromTimeBackwardReq, T[]>(\n 'QuerySeriesFromTimeBackward',\n msg.req,\n );\n\n if (!res.data) {\n return { res };\n }\n\n if (res.data.length > 0) {\n await requestSQL(\n ctx.terminal,\n buildInsertManyIntoTableSQL(res.data, 'ohlc', {\n conflictKeys: ['series_id', 'created_at'],\n }),\n );\n }\n\n return {\n res: {\n code: 0,\n message: 'OK',\n data: {\n count: res.data.length,\n },\n },\n };\n },\n );\n};\n"]}
|
package/lib/ws.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export declare const useOpenInterest: (instId: string) => Observable<{
|
|
|
13
13
|
oi: string;
|
|
14
14
|
}[]>;
|
|
15
15
|
export declare const useOHLC: (candleType: string, instId: string) => Observable<string[][]>;
|
|
16
|
-
export declare const useMarketBooks: (channel:
|
|
16
|
+
export declare const useMarketBooks: (channel: "books" | "books5" | "bbo-tbt" | "books-l2-tbt" | "books50-l2-tbt", instId: string) => Observable<IWSOrderBook[]>;
|
|
17
17
|
export declare const useFundingRate: (instId: string) => Observable<{
|
|
18
18
|
fundingRate: string;
|
|
19
19
|
fundingTime: string;
|
package/lib/ws.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,UAAU,EAKX,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AA8T1D,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,UAAU,EAKX,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AA8T1D,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM;YAG1B,MAAM;UACR,MAAM;WACL,MAAM;WACN,MAAM;WACN,MAAM;WACN,MAAM;IAKhB,CAAC;AAEJ,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM;YAGhC,MAAM;QACV,MAAM;IAKb,CAAC;AAEJ,eAAO,MAAM,OAAO,GAAI,YAAY,MAAM,EAAE,QAAQ,MAAM,2BAIvD,CAAC;AAEJ,eAAO,MAAM,cAAc,GACzB,SAAS,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,GAAG,gBAAgB,EAC3E,QAAQ,MAAM,+BAKb,CAAC;AAEJ,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM;iBAG1B,MAAM;iBACN,MAAM;YACX,MAAM;cACJ,MAAM;YACR,MAAM;oBACE,MAAM;oBACN,MAAM;qBACL,MAAM;qBACN,MAAM;aACd,MAAM;qBACE,MAAM;eACZ,MAAM;QACb,MAAM;IAKb,CAAC"}
|
package/lib/ws.js
CHANGED
|
@@ -8,6 +8,30 @@ const MetricsWebSocketConnectionsGauge = protocol_1.GlobalPrometheusRegistry.gau
|
|
|
8
8
|
const MetricsWebSocketChannelGauge = protocol_1.GlobalPrometheusRegistry.gauge('okx_websocket_channel', 'Number of OKX WebSocket channels subscribed');
|
|
9
9
|
const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
10
10
|
class OKXWsClient {
|
|
11
|
+
// ISSUE: 连接限制:3 次/秒 (基于IP)
|
|
12
|
+
// https://www.okx.com/docs-v5/zh/#overview-websocket-connect
|
|
13
|
+
// 每个连接 对于 订阅/取消订阅/登录 请求的总次数限制为 480 次/小时
|
|
14
|
+
static GetWsClient(path) {
|
|
15
|
+
var _a;
|
|
16
|
+
const existing = OKXWsClient.pool.find((item) => item.path === path && !item.isFull);
|
|
17
|
+
if (existing && !existing.client.isClosed()) {
|
|
18
|
+
existing.requests++;
|
|
19
|
+
if (existing.requests >= 480) {
|
|
20
|
+
existing.isFull = true;
|
|
21
|
+
}
|
|
22
|
+
return existing.client;
|
|
23
|
+
}
|
|
24
|
+
const client = ((_a = existing === null || existing === void 0 ? void 0 : existing.client) === null || _a === void 0 ? void 0 : _a.isClosed()) ? existing.client.revive() : new OKXWsClient(path);
|
|
25
|
+
if (existing) {
|
|
26
|
+
existing.client = client;
|
|
27
|
+
existing.requests = 1;
|
|
28
|
+
existing.isFull = false;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
OKXWsClient.pool.push({ path, client, requests: 1, isFull: false });
|
|
32
|
+
}
|
|
33
|
+
return client;
|
|
34
|
+
}
|
|
11
35
|
constructor(path) {
|
|
12
36
|
this.baseURL = `wss://ws.okx.com:8443`;
|
|
13
37
|
this.connectStatus = 'closed';
|
|
@@ -75,30 +99,6 @@ class OKXWsClient {
|
|
|
75
99
|
this.initSocket();
|
|
76
100
|
this.startKeepAlive();
|
|
77
101
|
}
|
|
78
|
-
// ISSUE: 连接限制:3 次/秒 (基于IP)
|
|
79
|
-
// https://www.okx.com/docs-v5/zh/#overview-websocket-connect
|
|
80
|
-
// 每个连接 对于 订阅/取消订阅/登录 请求的总次数限制为 480 次/小时
|
|
81
|
-
static GetWsClient(path) {
|
|
82
|
-
var _a;
|
|
83
|
-
const existing = OKXWsClient.pool.find((item) => item.path === path && !item.isFull);
|
|
84
|
-
if (existing && !existing.client.isClosed()) {
|
|
85
|
-
existing.requests++;
|
|
86
|
-
if (existing.requests >= 480) {
|
|
87
|
-
existing.isFull = true;
|
|
88
|
-
}
|
|
89
|
-
return existing.client;
|
|
90
|
-
}
|
|
91
|
-
const client = ((_a = existing === null || existing === void 0 ? void 0 : existing.client) === null || _a === void 0 ? void 0 : _a.isClosed()) ? existing.client.revive() : new OKXWsClient(path);
|
|
92
|
-
if (existing) {
|
|
93
|
-
existing.client = client;
|
|
94
|
-
existing.requests = 1;
|
|
95
|
-
existing.isFull = false;
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
OKXWsClient.pool.push({ path, client, requests: 1, isFull: false });
|
|
99
|
-
}
|
|
100
|
-
return client;
|
|
101
|
-
}
|
|
102
102
|
revive() {
|
|
103
103
|
this.initSocket();
|
|
104
104
|
this.startKeepAlive();
|
package/lib/ws.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"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","sourcesContent":["import { GlobalPrometheusRegistry, Terminal } from '@yuants/protocol';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport {\n catchError,\n EMPTY,\n filter,\n interval,\n Observable,\n shareReplay,\n Subscription,\n tap,\n timeout,\n} from 'rxjs';\nimport { IWSOrderBook } from './public-data/market-order';\n\nconst MetricsWebSocketConnectionsGauge = GlobalPrometheusRegistry.gauge(\n 'okx_websocket_connections',\n 'Number of active OKX WebSocket connections',\n);\n\nconst MetricsWebSocketChannelGauge = GlobalPrometheusRegistry.gauge(\n 'okx_websocket_channel',\n 'Number of OKX WebSocket channels subscribed',\n);\n\ntype ConnectStatus = 'connecting' | 'connected' | 'closed' | 'reconnecting';\nconst terminal = Terminal.fromNodeEnv();\n\nclass OKXWsClient {\n private static readonly pool: {\n path: string;\n client: OKXWsClient;\n requests: number;\n isFull: boolean;\n }[] = [];\n\n // ISSUE: 连接限制:3 次/秒 (基于IP)\n // https://www.okx.com/docs-v5/zh/#overview-websocket-connect\n // 每个连接 对于 订阅/取消订阅/登录 请求的总次数限制为 480 次/小时\n static GetWsClient(path: string): OKXWsClient {\n const existing = OKXWsClient.pool.find((item) => item.path === path && !item.isFull);\n if (existing && !existing.client.isClosed()) {\n existing.requests++;\n if (existing.requests >= 480) {\n existing.isFull = true;\n }\n return existing.client;\n }\n\n const client = existing?.client?.isClosed() ? existing.client.revive() : new OKXWsClient(path);\n if (existing) {\n existing.client = client;\n existing.requests = 1;\n existing.isFull = false;\n } else {\n OKXWsClient.pool.push({ path, client, requests: 1, isFull: false });\n }\n return client;\n }\n\n private readonly baseURL: string = `wss://ws.okx.com:8443`;\n private readonly path: string;\n private ws!: WebSocket;\n private connectStatus: ConnectStatus = 'closed';\n private keepAlive?: Subscription;\n private readonly subscriptions = new Map<\n string,\n {\n channel: string;\n instId?: string;\n }\n >();\n private readonly handlers: Record<string, Function> = {};\n private readonly connectionListeners: Record<'error' | 'close', Set<EventListener>> = {\n error: new Set(),\n close: new Set(),\n };\n\n private readonly handleOpen = () => {\n this.connectStatus = 'connected';\n console.info(formatTime(Date.now()), '✅ WS connected');\n for (const { channel, instId } of this.subscriptions.values()) {\n this.sendSubscribeMessage(channel, instId);\n }\n };\n\n private readonly handleMessage = (raw: MessageEvent) => {\n if (raw.data === 'pong') {\n return;\n }\n const msg = JSON.parse(raw.data);\n if (msg.arg?.channel) {\n const channelId = encodePath(msg.arg.channel, msg.arg.instId);\n const data = msg.data;\n const handler = this.handlers[channelId];\n if (data && handler) {\n handler(data, msg.arg);\n }\n } else if (msg.event) {\n console.info(formatTime(Date.now()), 'Event:', msg);\n }\n };\n\n private readonly handleError = (event: Event) => {\n console.error(formatTime(Date.now()), '❌ WS error', event);\n };\n\n private readonly handleClose = (event: CloseEvent) => {\n console.error(formatTime(Date.now()), '❌ WS closed', event);\n MetricsWebSocketConnectionsGauge.labels({ path: this.path }).dec();\n\n const closedSocket = event.target as WebSocket;\n if (closedSocket !== this.ws) {\n return;\n }\n\n if (this.connectStatus === 'reconnecting') {\n return;\n }\n\n this.connectStatus = 'closed';\n\n if (this.subscriptions.size === 0) {\n return;\n }\n\n this.connectStatus = 'reconnecting';\n setTimeout(() => {\n if (this.connectStatus === 'connecting' || this.connectStatus === 'connected') {\n return;\n }\n if (this.subscriptions.size === 0) {\n this.connectStatus = 'closed';\n return;\n }\n this.initSocket();\n }, 1000);\n };\n\n constructor(path: string) {\n this.path = path;\n this.initSocket();\n this.startKeepAlive();\n }\n\n private revive(): OKXWsClient {\n this.initSocket();\n this.startKeepAlive();\n return this;\n }\n\n private initSocket() {\n this.connectStatus = 'connecting';\n this.ws = new WebSocket(`${this.baseURL}/${this.path}`);\n MetricsWebSocketConnectionsGauge.labels({ path: this.path, terminal_id: terminal.terminal_id }).inc();\n\n this.ws.addEventListener('open', this.handleOpen);\n this.ws.addEventListener('message', this.handleMessage);\n this.ws.addEventListener('error', this.handleError);\n this.ws.addEventListener('close', this.handleClose);\n\n for (const listener of this.connectionListeners.error) {\n this.ws.addEventListener('error', listener);\n }\n for (const listener of this.connectionListeners.close) {\n this.ws.addEventListener('close', listener);\n }\n }\n\n private startKeepAlive() {\n if (this.keepAlive && !this.keepAlive.closed) {\n return;\n }\n this.keepAlive = interval(25_000)\n .pipe(\n tap(() => {\n if (this.connectStatus === 'connected') {\n this.ws.send('ping');\n }\n }),\n )\n .subscribe();\n }\n\n private stopKeepAlive() {\n if (this.keepAlive && !this.keepAlive.closed) {\n this.keepAlive.unsubscribe();\n }\n }\n\n private isClosed() {\n return this.ws?.readyState === WebSocket.CLOSING || this.ws?.readyState === WebSocket.CLOSED;\n }\n\n private sendSubscribeMessage(channel: string, instId?: string) {\n const message = {\n op: 'subscribe',\n args: [{ channel, instId }],\n };\n this.ws.send(JSON.stringify(message));\n const channelId = encodePath(channel, instId);\n console.info(formatTime(Date.now()), `📩 Sent subscribe for ${channelId}`);\n }\n\n private sendUnsubscribeMessage(channel: string, instId?: string) {\n const message = {\n op: 'unsubscribe',\n args: [{ channel, instId }],\n };\n this.ws.send(JSON.stringify(message));\n const channelId = encodePath(channel, instId);\n console.info(formatTime(Date.now()), `📩 Sent unsubscribe for ${channelId}`);\n }\n\n addConnectionListener(type: 'error' | 'close', listener: EventListener): () => void {\n this.connectionListeners[type].add(listener);\n this.ws.addEventListener(type, listener);\n return () => {\n this.connectionListeners[type].delete(listener);\n this.ws.removeEventListener(type, listener);\n };\n }\n\n subscribe(channel: string, instId?: string, handler?: Function) {\n const channelId = encodePath(channel, instId);\n if (this.subscriptions.has(channelId)) {\n console.info(formatTime(Date.now()), `⚠️ Already subscribed: ${channelId}`);\n return;\n }\n\n this.subscriptions.set(channelId, { channel, instId });\n MetricsWebSocketChannelGauge.labels({ channel, terminal_id: terminal.terminal_id }).inc();\n\n if (handler) {\n this.handlers[channelId] = handler;\n }\n\n this.startKeepAlive();\n\n if (this.connectStatus === 'connected') {\n this.sendSubscribeMessage(channel, instId);\n } else if (this.isClosed()) {\n this.initSocket();\n } else {\n console.info(formatTime(Date.now()), `📩 Queued subscribe for ${channelId} waiting for connection`);\n }\n }\n\n unsubscribe(channel: string, instId?: string) {\n const channelId = encodePath(channel, instId);\n if (!this.subscriptions.has(channelId)) return;\n\n if (this.connectStatus === 'connected') {\n this.sendUnsubscribeMessage(channel, instId);\n }\n this.subscriptions.delete(channelId);\n MetricsWebSocketChannelGauge.labels({ channel }).dec();\n delete this.handlers[channelId];\n\n if (this.subscriptions.size === 0) {\n this.stopKeepAlive();\n if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {\n this.ws.close();\n }\n }\n }\n}\n\n// 全局缓存:存储已创建的 WebSocket Observable,实现订阅复用\n// key: encodePath(path, channel, instId)\n// value: shared Observable\nconst wsObservableCache = new Map<string, Observable<any>>();\n\nconst fromWsChannelAndInstId = <T>(path: string, channel: string, instId: string) => {\n const cacheKey = encodePath(path, channel, instId);\n\n // 检查缓存中是否已存在该订阅\n const cached = wsObservableCache.get(cacheKey);\n if (cached) {\n console.info(formatTime(Date.now()), `♻️ Reusing cached subscription: ${cacheKey}`);\n return cached as Observable<T>;\n }\n\n // 创建新的 Observable\n const observable$ = new Observable<T>((subscriber) => {\n const client = OKXWsClient.GetWsClient(path);\n client.subscribe(channel, instId, (data: T) => {\n subscriber.next(data);\n });\n const removeError = client.addConnectionListener('error', (err) => {\n subscriber.error(err);\n });\n const removeClose = client.addConnectionListener('close', () => {\n subscriber.error('WS Connection Closed');\n });\n subscriber.add(() => {\n removeError();\n removeClose();\n client.unsubscribe(channel, instId);\n });\n }).pipe(\n // 防止单个连接断开导致数据流关闭\n timeout(60_000),\n tap({\n error: (err) => {\n console.info(formatTime(Date.now()), 'WS_SUBSCRIBE_ERROR', channel, instId, err);\n },\n }),\n // 暂时不太确定是否能支持 retry\n // retry({ delay: 1000 }),\n catchError(() => EMPTY),\n // 🔑 关键:使用 shareReplay 实现订阅复用\n // - bufferSize: 1 - 缓存最新的一个值,新订阅者可以立即获得最新数据\n // - refCount: true - 当所有订阅者都取消订阅时,自动取消上游订阅并清理资源\n shareReplay({ bufferSize: 1, refCount: true }),\n // 当订阅完全结束时,从缓存中移除\n tap({\n finalize: () => {\n console.info(formatTime(Date.now()), `🗑️ Removing from cache: ${cacheKey}`);\n wsObservableCache.delete(cacheKey);\n },\n }),\n );\n\n // 存入缓存\n wsObservableCache.set(cacheKey, observable$);\n console.info(formatTime(Date.now()), `📦 Cached new subscription: ${cacheKey}`);\n\n return observable$;\n};\n\nexport const useTicker = (instId: string) =>\n fromWsChannelAndInstId<\n {\n instId: string;\n last: string;\n askPx: string;\n bidPx: string;\n askSz: string;\n bidSz: string;\n }[]\n >('ws/v5/public', 'tickers', instId).pipe(\n //\n filter((data) => data.length > 0),\n );\n\nexport const useOpenInterest = (instId: string) =>\n fromWsChannelAndInstId<\n {\n instId: string;\n oi: string; // open interest\n }[]\n >('ws/v5/public', 'open-interest', instId).pipe(\n //\n filter((data) => data.length > 0),\n );\n\nexport const useOHLC = (candleType: string, instId: string) =>\n fromWsChannelAndInstId<string[][]>('ws/v5/business', candleType, instId).pipe(\n //\n filter((data) => data.length > 0),\n );\n\nexport const useMarketBooks = (\n channel: 'books' | 'books5' | 'bbo-tbt' | 'books-l2-tbt' | 'books50-l2-tbt',\n instId: string,\n) =>\n fromWsChannelAndInstId<IWSOrderBook[]>('ws/v5/public', channel, instId).pipe(\n //\n filter((data) => data.length > 0),\n );\n\nexport const useFundingRate = (instId: string) =>\n fromWsChannelAndInstId<\n {\n fundingRate: string;\n fundingTime: string;\n instId: string;\n instType: string;\n method: string;\n maxFundingRate: string;\n minFundingRate: string;\n nextFundingRate: string;\n nextFundingTime: string;\n premium: string;\n settFundingRate: string;\n settState: string;\n ts: string;\n }[]\n >('ws/v5/public', 'funding-rate', instId).pipe(\n //\n filter((data) => data.length > 0),\n );\n"]}
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"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","sourcesContent":["import { GlobalPrometheusRegistry, Terminal } from '@yuants/protocol';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport {\n catchError,\n EMPTY,\n filter,\n interval,\n Observable,\n shareReplay,\n Subscription,\n tap,\n timeout,\n} from 'rxjs';\nimport { IWSOrderBook } from './public-data/market-order';\n\nconst MetricsWebSocketConnectionsGauge = GlobalPrometheusRegistry.gauge(\n 'okx_websocket_connections',\n 'Number of active OKX WebSocket connections',\n);\n\nconst MetricsWebSocketChannelGauge = GlobalPrometheusRegistry.gauge(\n 'okx_websocket_channel',\n 'Number of OKX WebSocket channels subscribed',\n);\n\ntype ConnectStatus = 'connecting' | 'connected' | 'closed' | 'reconnecting';\nconst terminal = Terminal.fromNodeEnv();\n\nclass OKXWsClient {\n private static readonly pool: {\n path: string;\n client: OKXWsClient;\n requests: number;\n isFull: boolean;\n }[] = [];\n\n // ISSUE: 连接限制:3 次/秒 (基于IP)\n // https://www.okx.com/docs-v5/zh/#overview-websocket-connect\n // 每个连接 对于 订阅/取消订阅/登录 请求的总次数限制为 480 次/小时\n static GetWsClient(path: string): OKXWsClient {\n const existing = OKXWsClient.pool.find((item) => item.path === path && !item.isFull);\n if (existing && !existing.client.isClosed()) {\n existing.requests++;\n if (existing.requests >= 480) {\n existing.isFull = true;\n }\n return existing.client;\n }\n\n const client = existing?.client?.isClosed() ? existing.client.revive() : new OKXWsClient(path);\n if (existing) {\n existing.client = client;\n existing.requests = 1;\n existing.isFull = false;\n } else {\n OKXWsClient.pool.push({ path, client, requests: 1, isFull: false });\n }\n return client;\n }\n\n private readonly baseURL: string = `wss://ws.okx.com:8443`;\n private readonly path: string;\n private ws!: WebSocket;\n private connectStatus: ConnectStatus = 'closed';\n private keepAlive?: Subscription;\n private readonly subscriptions = new Map<\n string,\n {\n channel: string;\n instId?: string;\n }\n >();\n private readonly handlers: Record<string, Function> = {};\n private readonly connectionListeners: Record<'error' | 'close', Set<EventListener>> = {\n error: new Set(),\n close: new Set(),\n };\n\n private readonly handleOpen = () => {\n this.connectStatus = 'connected';\n console.info(formatTime(Date.now()), '✅ WS connected');\n for (const { channel, instId } of this.subscriptions.values()) {\n this.sendSubscribeMessage(channel, instId);\n }\n };\n\n private readonly handleMessage = (raw: MessageEvent) => {\n if (raw.data === 'pong') {\n return;\n }\n const msg = JSON.parse(raw.data);\n if (msg.arg?.channel) {\n const channelId = encodePath(msg.arg.channel, msg.arg.instId);\n const data = msg.data;\n const handler = this.handlers[channelId];\n if (data && handler) {\n handler(data, msg.arg);\n }\n } else if (msg.event) {\n console.info(formatTime(Date.now()), 'Event:', msg);\n }\n };\n\n private readonly handleError = (event: Event) => {\n console.error(formatTime(Date.now()), '❌ WS error', event);\n };\n\n private readonly handleClose = (event: CloseEvent) => {\n console.error(formatTime(Date.now()), '❌ WS closed', event);\n MetricsWebSocketConnectionsGauge.labels({ path: this.path }).dec();\n\n const closedSocket = event.target as WebSocket;\n if (closedSocket !== this.ws) {\n return;\n }\n\n if (this.connectStatus === 'reconnecting') {\n return;\n }\n\n this.connectStatus = 'closed';\n\n if (this.subscriptions.size === 0) {\n return;\n }\n\n this.connectStatus = 'reconnecting';\n setTimeout(() => {\n if (this.connectStatus === 'connecting' || this.connectStatus === 'connected') {\n return;\n }\n if (this.subscriptions.size === 0) {\n this.connectStatus = 'closed';\n return;\n }\n this.initSocket();\n }, 1000);\n };\n\n constructor(path: string) {\n this.path = path;\n this.initSocket();\n this.startKeepAlive();\n }\n\n private revive(): OKXWsClient {\n this.initSocket();\n this.startKeepAlive();\n return this;\n }\n\n private initSocket() {\n this.connectStatus = 'connecting';\n this.ws = new WebSocket(`${this.baseURL}/${this.path}`);\n MetricsWebSocketConnectionsGauge.labels({ path: this.path, terminal_id: terminal.terminal_id }).inc();\n\n this.ws.addEventListener('open', this.handleOpen);\n this.ws.addEventListener('message', this.handleMessage);\n this.ws.addEventListener('error', this.handleError);\n this.ws.addEventListener('close', this.handleClose);\n\n for (const listener of this.connectionListeners.error) {\n this.ws.addEventListener('error', listener);\n }\n for (const listener of this.connectionListeners.close) {\n this.ws.addEventListener('close', listener);\n }\n }\n\n private startKeepAlive() {\n if (this.keepAlive && !this.keepAlive.closed) {\n return;\n }\n this.keepAlive = interval(25_000)\n .pipe(\n tap(() => {\n if (this.connectStatus === 'connected') {\n this.ws.send('ping');\n }\n }),\n )\n .subscribe();\n }\n\n private stopKeepAlive() {\n if (this.keepAlive && !this.keepAlive.closed) {\n this.keepAlive.unsubscribe();\n }\n }\n\n private isClosed() {\n return this.ws?.readyState === WebSocket.CLOSING || this.ws?.readyState === WebSocket.CLOSED;\n }\n\n private sendSubscribeMessage(channel: string, instId?: string) {\n const message = {\n op: 'subscribe',\n args: [{ channel, instId }],\n };\n this.ws.send(JSON.stringify(message));\n const channelId = encodePath(channel, instId);\n console.info(formatTime(Date.now()), `📩 Sent subscribe for ${channelId}`);\n }\n\n private sendUnsubscribeMessage(channel: string, instId?: string) {\n const message = {\n op: 'unsubscribe',\n args: [{ channel, instId }],\n };\n this.ws.send(JSON.stringify(message));\n const channelId = encodePath(channel, instId);\n console.info(formatTime(Date.now()), `📩 Sent unsubscribe for ${channelId}`);\n }\n\n addConnectionListener(type: 'error' | 'close', listener: EventListener): () => void {\n this.connectionListeners[type].add(listener);\n this.ws.addEventListener(type, listener);\n return () => {\n this.connectionListeners[type].delete(listener);\n this.ws.removeEventListener(type, listener);\n };\n }\n\n subscribe(channel: string, instId?: string, handler?: Function) {\n const channelId = encodePath(channel, instId);\n if (this.subscriptions.has(channelId)) {\n console.info(formatTime(Date.now()), `⚠️ Already subscribed: ${channelId}`);\n return;\n }\n\n this.subscriptions.set(channelId, { channel, instId });\n MetricsWebSocketChannelGauge.labels({ channel, terminal_id: terminal.terminal_id }).inc();\n\n if (handler) {\n this.handlers[channelId] = handler;\n }\n\n this.startKeepAlive();\n\n if (this.connectStatus === 'connected') {\n this.sendSubscribeMessage(channel, instId);\n } else if (this.isClosed()) {\n this.initSocket();\n } else {\n console.info(formatTime(Date.now()), `📩 Queued subscribe for ${channelId} waiting for connection`);\n }\n }\n\n unsubscribe(channel: string, instId?: string) {\n const channelId = encodePath(channel, instId);\n if (!this.subscriptions.has(channelId)) return;\n\n if (this.connectStatus === 'connected') {\n this.sendUnsubscribeMessage(channel, instId);\n }\n this.subscriptions.delete(channelId);\n MetricsWebSocketChannelGauge.labels({ channel }).dec();\n delete this.handlers[channelId];\n\n if (this.subscriptions.size === 0) {\n this.stopKeepAlive();\n if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {\n this.ws.close();\n }\n }\n }\n}\n\n// 全局缓存:存储已创建的 WebSocket Observable,实现订阅复用\n// key: encodePath(path, channel, instId)\n// value: shared Observable\nconst wsObservableCache = new Map<string, Observable<any>>();\n\nconst fromWsChannelAndInstId = <T>(path: string, channel: string, instId: string) => {\n const cacheKey = encodePath(path, channel, instId);\n\n // 检查缓存中是否已存在该订阅\n const cached = wsObservableCache.get(cacheKey);\n if (cached) {\n console.info(formatTime(Date.now()), `♻️ Reusing cached subscription: ${cacheKey}`);\n return cached as Observable<T>;\n }\n\n // 创建新的 Observable\n const observable$ = new Observable<T>((subscriber) => {\n const client = OKXWsClient.GetWsClient(path);\n client.subscribe(channel, instId, (data: T) => {\n subscriber.next(data);\n });\n const removeError = client.addConnectionListener('error', (err) => {\n subscriber.error(err);\n });\n const removeClose = client.addConnectionListener('close', () => {\n subscriber.error('WS Connection Closed');\n });\n subscriber.add(() => {\n removeError();\n removeClose();\n client.unsubscribe(channel, instId);\n });\n }).pipe(\n // 防止单个连接断开导致数据流关闭\n timeout(60_000),\n tap({\n error: (err) => {\n console.info(formatTime(Date.now()), 'WS_SUBSCRIBE_ERROR', channel, instId, err);\n },\n }),\n // 暂时不太确定是否能支持 retry\n // retry({ delay: 1000 }),\n catchError(() => EMPTY),\n // 🔑 关键:使用 shareReplay 实现订阅复用\n // - bufferSize: 1 - 缓存最新的一个值,新订阅者可以立即获得最新数据\n // - refCount: true - 当所有订阅者都取消订阅时,自动取消上游订阅并清理资源\n shareReplay({ bufferSize: 1, refCount: true }),\n // 当订阅完全结束时,从缓存中移除\n tap({\n finalize: () => {\n console.info(formatTime(Date.now()), `🗑️ Removing from cache: ${cacheKey}`);\n wsObservableCache.delete(cacheKey);\n },\n }),\n );\n\n // 存入缓存\n wsObservableCache.set(cacheKey, observable$);\n console.info(formatTime(Date.now()), `📦 Cached new subscription: ${cacheKey}`);\n\n return observable$;\n};\n\nexport const useTicker = (instId: string) =>\n fromWsChannelAndInstId<\n {\n instId: string;\n last: string;\n askPx: string;\n bidPx: string;\n askSz: string;\n bidSz: string;\n }[]\n >('ws/v5/public', 'tickers', instId).pipe(\n //\n filter((data) => data.length > 0),\n );\n\nexport const useOpenInterest = (instId: string) =>\n fromWsChannelAndInstId<\n {\n instId: string;\n oi: string; // open interest\n }[]\n >('ws/v5/public', 'open-interest', instId).pipe(\n //\n filter((data) => data.length > 0),\n );\n\nexport const useOHLC = (candleType: string, instId: string) =>\n fromWsChannelAndInstId<string[][]>('ws/v5/business', candleType, instId).pipe(\n //\n filter((data) => data.length > 0),\n );\n\nexport const useMarketBooks = (\n channel: 'books' | 'books5' | 'bbo-tbt' | 'books-l2-tbt' | 'books50-l2-tbt',\n instId: string,\n) =>\n fromWsChannelAndInstId<IWSOrderBook[]>('ws/v5/public', channel, instId).pipe(\n //\n filter((data) => data.length > 0),\n );\n\nexport const useFundingRate = (instId: string) =>\n fromWsChannelAndInstId<\n {\n fundingRate: string;\n fundingTime: string;\n instId: string;\n instType: string;\n method: string;\n maxFundingRate: string;\n minFundingRate: string;\n nextFundingRate: string;\n nextFundingTime: string;\n premium: string;\n settFundingRate: string;\n settState: string;\n ts: string;\n }[]\n >('ws/v5/public', 'funding-rate', instId).pipe(\n //\n filter((data) => data.length > 0),\n );\n"]}
|