okx-api 2.0.7 → 3.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +336 -11
- package/dist/cjs/constants/funding.js.map +1 -0
- package/dist/cjs/index.d.ts +43 -0
- package/dist/cjs/index.js +64 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/{lib → dist/cjs}/rest-client.d.ts +28 -15
- package/{lib → dist/cjs}/rest-client.js +41 -68
- package/dist/cjs/rest-client.js.map +1 -0
- package/dist/cjs/types/rest/client.d.ts +36 -0
- package/{lib → dist/cjs}/types/rest/client.js.map +1 -1
- package/{lib → dist/cjs}/types/rest/request/account.d.ts +1 -1
- package/dist/cjs/types/rest/request/account.js.map +1 -0
- package/{lib → dist/cjs}/types/rest/request/block-trading.d.ts +1 -1
- package/dist/cjs/types/rest/request/block-trading.js.map +1 -0
- package/dist/cjs/types/rest/request/convert.js.map +1 -0
- package/dist/cjs/types/rest/request/copy-trading.js.map +1 -0
- package/dist/cjs/types/rest/request/funding.js.map +1 -0
- package/dist/cjs/types/rest/request/grid-trading.js.map +1 -0
- package/dist/cjs/types/rest/request/public.js.map +1 -0
- package/dist/cjs/types/rest/request/recurring-buy.js.map +1 -0
- package/{lib → dist/cjs}/types/rest/request/shared.d.ts +1 -1
- package/dist/cjs/types/rest/request/shared.js.map +1 -0
- package/dist/cjs/types/rest/request/signal-bot.js.map +1 -0
- package/dist/cjs/types/rest/request/simple-earn.js.map +1 -0
- package/dist/cjs/types/rest/request/spread-trading.js.map +1 -0
- package/dist/cjs/types/rest/request/subaccount.js.map +1 -0
- package/{lib → dist/cjs}/types/rest/request/trade.d.ts +1 -1
- package/dist/cjs/types/rest/request/trade.js.map +1 -0
- package/{lib → dist/cjs}/types/rest/response/private-account.d.ts +1 -1
- package/dist/cjs/types/rest/response/private-account.js.map +1 -0
- package/{lib → dist/cjs}/types/rest/response/private-block-trading.d.ts +1 -1
- package/dist/cjs/types/rest/response/private-block-trading.js.map +1 -0
- package/dist/cjs/types/rest/response/private-copy-trading.js.map +1 -0
- package/dist/cjs/types/rest/response/private-flexible-loan.js.map +1 -0
- package/{lib → dist/cjs}/types/rest/response/private-funding.d.ts +1 -1
- package/dist/cjs/types/rest/response/private-funding.js.map +1 -0
- package/dist/cjs/types/rest/response/private-recurring-buy.js.map +1 -0
- package/dist/cjs/types/rest/response/private-signal-bot.js.map +1 -0
- package/dist/cjs/types/rest/response/private-spread-trading.js.map +1 -0
- package/dist/cjs/types/rest/response/private-subaccount.js.map +1 -0
- package/{lib → dist/cjs}/types/rest/response/private-trade.d.ts +1 -1
- package/dist/cjs/types/rest/response/private-trade.js.map +1 -0
- package/{lib → dist/cjs}/types/rest/response/public-data.d.ts +1 -1
- package/dist/cjs/types/rest/response/public-data.js.map +1 -0
- package/{lib → dist/cjs}/types/rest/shared.d.ts +2 -2
- package/dist/cjs/types/rest/shared.js.map +1 -0
- package/dist/cjs/types/shared.d.ts +13 -0
- package/{lib → dist/cjs}/types/shared.js.map +1 -1
- package/dist/cjs/types/websockets/ws-api-request.d.ts +61 -0
- package/dist/cjs/types/websockets/ws-api-request.js +3 -0
- package/dist/cjs/types/websockets/ws-api-request.js.map +1 -0
- package/dist/cjs/types/websockets/ws-api-response.d.ts +28 -0
- package/dist/cjs/types/websockets/ws-api-response.js +3 -0
- package/dist/cjs/types/websockets/ws-api-response.js.map +1 -0
- package/dist/cjs/types/websockets/ws-api.d.ts +139 -0
- package/dist/cjs/types/websockets/ws-api.js +38 -0
- package/dist/cjs/types/websockets/ws-api.js.map +1 -0
- package/{lib/types/websockets/event.d.ts → dist/cjs/types/websockets/ws-events.d.ts} +7 -1
- package/dist/cjs/types/websockets/ws-events.js +11 -0
- package/dist/cjs/types/websockets/ws-events.js.map +1 -0
- package/dist/cjs/types/websockets/ws-general.d.ts +48 -0
- package/dist/cjs/types/websockets/ws-general.js +3 -0
- package/dist/cjs/types/websockets/ws-general.js.map +1 -0
- package/{lib/types/websockets/request.d.ts → dist/cjs/types/websockets/ws-request.d.ts} +0 -22
- package/dist/cjs/types/websockets/ws-request.js +3 -0
- package/dist/cjs/types/websockets/ws-request.js.map +1 -0
- package/{lib → dist/cjs}/util/BaseRestClient.d.ts +2 -1
- package/dist/cjs/util/BaseRestClient.js +243 -0
- package/dist/cjs/util/BaseRestClient.js.map +1 -0
- package/dist/cjs/util/BaseWSClient.d.ts +198 -0
- package/dist/cjs/util/BaseWSClient.js +770 -0
- package/dist/cjs/util/BaseWSClient.js.map +1 -0
- package/dist/cjs/util/WsStore.d.ts +75 -0
- package/dist/cjs/util/WsStore.js +303 -0
- package/dist/cjs/util/WsStore.js.map +1 -0
- package/dist/cjs/util/WsStore.types.d.ts +51 -0
- package/dist/cjs/util/WsStore.types.js +14 -0
- package/dist/cjs/util/WsStore.types.js.map +1 -0
- package/dist/cjs/util/logger.d.ts +8 -0
- package/{lib → dist/cjs}/util/logger.js +3 -11
- package/dist/cjs/util/logger.js.map +1 -0
- package/{lib → dist/cjs}/util/requestUtils.d.ts +2 -1
- package/{lib → dist/cjs}/util/requestUtils.js +9 -1
- package/dist/cjs/util/requestUtils.js.map +1 -0
- package/{lib → dist/cjs}/util/typeGuards.d.ts +4 -2
- package/{lib → dist/cjs}/util/typeGuards.js +34 -0
- package/dist/cjs/util/typeGuards.js.map +1 -0
- package/dist/cjs/util/webCryptoAPI.d.ts +15 -0
- package/dist/cjs/util/webCryptoAPI.js +82 -0
- package/dist/cjs/util/webCryptoAPI.js.map +1 -0
- package/dist/cjs/util/websocket-util.d.ts +142 -0
- package/dist/cjs/util/websocket-util.js +533 -0
- package/dist/cjs/util/websocket-util.js.map +1 -0
- package/dist/cjs/websocket-api-client.d.ts +135 -0
- package/dist/cjs/websocket-api-client.js +171 -0
- package/dist/cjs/websocket-api-client.js.map +1 -0
- package/{lib/websocket-client.d.ts → dist/cjs/websocket-client-legacy.d.ts} +16 -38
- package/dist/cjs/websocket-client-legacy.js +524 -0
- package/dist/cjs/websocket-client-legacy.js.map +1 -0
- package/dist/cjs/websocket-client.d.ts +81 -0
- package/dist/cjs/websocket-client.js +548 -0
- package/dist/cjs/websocket-client.js.map +1 -0
- package/dist/mjs/constants/funding.d.ts +139 -0
- package/dist/mjs/constants/funding.js +140 -0
- package/dist/mjs/constants/funding.js.map +1 -0
- package/dist/mjs/index.d.ts +43 -0
- package/dist/mjs/index.js +48 -0
- package/dist/mjs/index.js.map +1 -0
- package/dist/mjs/package.json +3 -0
- package/dist/mjs/rest-client.d.ts +1173 -0
- package/dist/mjs/rest-client.js +1271 -0
- package/dist/mjs/rest-client.js.map +1 -0
- package/dist/mjs/types/rest/client.d.ts +36 -0
- package/dist/mjs/types/rest/client.js +2 -0
- package/{lib/types/websockets → dist/mjs/types/rest}/client.js.map +1 -1
- package/dist/mjs/types/rest/request/account.d.ts +144 -0
- package/dist/mjs/types/rest/request/account.js +2 -0
- package/dist/mjs/types/rest/request/account.js.map +1 -0
- package/dist/mjs/types/rest/request/block-trading.d.ts +76 -0
- package/dist/mjs/types/rest/request/block-trading.js +2 -0
- package/dist/mjs/types/rest/request/block-trading.js.map +1 -0
- package/dist/mjs/types/rest/request/convert.d.ts +19 -0
- package/dist/mjs/types/rest/request/convert.js +2 -0
- package/dist/mjs/types/rest/request/convert.js.map +1 -0
- package/dist/mjs/types/rest/request/copy-trading.d.ts +117 -0
- package/dist/mjs/types/rest/request/copy-trading.js +2 -0
- package/dist/mjs/types/rest/request/copy-trading.js.map +1 -0
- package/dist/mjs/types/rest/request/funding.d.ts +43 -0
- package/dist/mjs/types/rest/request/funding.js +2 -0
- package/dist/mjs/types/rest/request/funding.js.map +1 -0
- package/dist/mjs/types/rest/request/grid-trading.d.ts +66 -0
- package/dist/mjs/types/rest/request/grid-trading.js +2 -0
- package/dist/mjs/types/rest/request/grid-trading.js.map +1 -0
- package/dist/mjs/types/rest/request/public.d.ts +55 -0
- package/dist/mjs/types/rest/request/public.js +2 -0
- package/dist/mjs/types/rest/request/public.js.map +1 -0
- package/dist/mjs/types/rest/request/recurring-buy.d.ts +28 -0
- package/dist/mjs/types/rest/request/recurring-buy.js +2 -0
- package/dist/mjs/types/rest/request/recurring-buy.js.map +1 -0
- package/dist/mjs/types/rest/request/shared.d.ts +7 -0
- package/dist/mjs/types/rest/request/shared.js +2 -0
- package/dist/mjs/types/rest/request/shared.js.map +1 -0
- package/dist/mjs/types/rest/request/signal-bot.d.ts +97 -0
- package/dist/mjs/types/rest/request/signal-bot.js +2 -0
- package/dist/mjs/types/rest/request/signal-bot.js.map +1 -0
- package/dist/mjs/types/rest/request/simple-earn.d.ts +23 -0
- package/dist/mjs/types/rest/request/simple-earn.js +2 -0
- package/dist/mjs/types/rest/request/simple-earn.js.map +1 -0
- package/dist/mjs/types/rest/request/spread-trading.d.ts +69 -0
- package/dist/mjs/types/rest/request/spread-trading.js +2 -0
- package/dist/mjs/types/rest/request/spread-trading.js.map +1 -0
- package/dist/mjs/types/rest/request/subaccount.d.ts +33 -0
- package/dist/mjs/types/rest/request/subaccount.js +2 -0
- package/dist/mjs/types/rest/request/subaccount.js.map +1 -0
- package/dist/mjs/types/rest/request/trade.d.ts +194 -0
- package/dist/mjs/types/rest/request/trade.js +2 -0
- package/dist/mjs/types/rest/request/trade.js.map +1 -0
- package/dist/mjs/types/rest/response/private-account.d.ts +448 -0
- package/dist/mjs/types/rest/response/private-account.js +2 -0
- package/dist/mjs/types/rest/response/private-account.js.map +1 -0
- package/dist/mjs/types/rest/response/private-block-trading.d.ts +124 -0
- package/dist/mjs/types/rest/response/private-block-trading.js +2 -0
- package/dist/mjs/types/rest/response/private-block-trading.js.map +1 -0
- package/dist/mjs/types/rest/response/private-copy-trading.d.ts +259 -0
- package/dist/mjs/types/rest/response/private-copy-trading.js +2 -0
- package/dist/mjs/types/rest/response/private-copy-trading.js.map +1 -0
- package/dist/mjs/types/rest/response/private-flexible-loan.d.ts +72 -0
- package/dist/mjs/types/rest/response/private-flexible-loan.js +2 -0
- package/dist/mjs/types/rest/response/private-flexible-loan.js.map +1 -0
- package/dist/mjs/types/rest/response/private-funding.d.ts +102 -0
- package/dist/mjs/types/rest/response/private-funding.js +2 -0
- package/dist/mjs/types/rest/response/private-funding.js.map +1 -0
- package/dist/mjs/types/rest/response/private-recurring-buy.d.ts +63 -0
- package/dist/mjs/types/rest/response/private-recurring-buy.js +2 -0
- package/dist/mjs/types/rest/response/private-recurring-buy.js.map +1 -0
- package/dist/mjs/types/rest/response/private-signal-bot.d.ts +22 -0
- package/dist/mjs/types/rest/response/private-signal-bot.js +2 -0
- package/dist/mjs/types/rest/response/private-signal-bot.js.map +1 -0
- package/dist/mjs/types/rest/response/private-spread-trading.d.ts +126 -0
- package/dist/mjs/types/rest/response/private-spread-trading.js +2 -0
- package/dist/mjs/types/rest/response/private-spread-trading.js.map +1 -0
- package/dist/mjs/types/rest/response/private-subaccount.d.ts +80 -0
- package/dist/mjs/types/rest/response/private-subaccount.js +2 -0
- package/dist/mjs/types/rest/response/private-subaccount.js.map +1 -0
- package/dist/mjs/types/rest/response/private-trade.d.ts +355 -0
- package/dist/mjs/types/rest/response/private-trade.js +2 -0
- package/dist/mjs/types/rest/response/private-trade.js.map +1 -0
- package/dist/mjs/types/rest/response/public-data.d.ts +174 -0
- package/dist/mjs/types/rest/response/public-data.js +2 -0
- package/dist/mjs/types/rest/response/public-data.js.map +1 -0
- package/dist/mjs/types/rest/shared.d.ts +45 -0
- package/dist/mjs/types/rest/shared.js +2 -0
- package/dist/mjs/types/rest/shared.js.map +1 -0
- package/dist/mjs/types/shared.d.ts +13 -0
- package/dist/mjs/types/shared.js +2 -0
- package/{lib/types/rest → dist/mjs/types}/shared.js.map +1 -1
- package/dist/mjs/types/websockets/ws-api-request.d.ts +61 -0
- package/dist/mjs/types/websockets/ws-api-request.js +2 -0
- package/dist/mjs/types/websockets/ws-api-request.js.map +1 -0
- package/dist/mjs/types/websockets/ws-api-response.d.ts +28 -0
- package/dist/mjs/types/websockets/ws-api-response.js +2 -0
- package/dist/mjs/types/websockets/ws-api-response.js.map +1 -0
- package/dist/mjs/types/websockets/ws-api.d.ts +139 -0
- package/dist/mjs/types/websockets/ws-api.js +35 -0
- package/dist/mjs/types/websockets/ws-api.js.map +1 -0
- package/dist/mjs/types/websockets/ws-events.d.ts +33 -0
- package/dist/mjs/types/websockets/ws-events.js +8 -0
- package/dist/mjs/types/websockets/ws-events.js.map +1 -0
- package/dist/mjs/types/websockets/ws-general.d.ts +48 -0
- package/dist/mjs/types/websockets/ws-general.js +2 -0
- package/dist/mjs/types/websockets/ws-general.js.map +1 -0
- package/dist/mjs/types/websockets/ws-request.d.ts +93 -0
- package/dist/mjs/types/websockets/ws-request.js +2 -0
- package/dist/mjs/types/websockets/ws-request.js.map +1 -0
- package/dist/mjs/util/BaseRestClient.d.ts +30 -0
- package/dist/mjs/util/BaseRestClient.js +236 -0
- package/dist/mjs/util/BaseRestClient.js.map +1 -0
- package/dist/mjs/util/BaseWSClient.d.ts +198 -0
- package/dist/mjs/util/BaseWSClient.js +763 -0
- package/dist/mjs/util/BaseWSClient.js.map +1 -0
- package/dist/mjs/util/WsStore.d.ts +75 -0
- package/dist/mjs/util/WsStore.js +298 -0
- package/dist/mjs/util/WsStore.js.map +1 -0
- package/dist/mjs/util/WsStore.types.d.ts +51 -0
- package/dist/mjs/util/WsStore.types.js +11 -0
- package/dist/mjs/util/WsStore.types.js.map +1 -0
- package/dist/mjs/util/logger.d.ts +8 -0
- package/dist/mjs/util/logger.js +14 -0
- package/dist/mjs/util/logger.js.map +1 -0
- package/dist/mjs/util/requestUtils.d.ts +8 -0
- package/dist/mjs/util/requestUtils.js +51 -0
- package/dist/mjs/util/requestUtils.js.map +1 -0
- package/dist/mjs/util/typeGuards.d.ts +19 -0
- package/dist/mjs/util/typeGuards.js +85 -0
- package/dist/mjs/util/typeGuards.js.map +1 -0
- package/dist/mjs/util/webCryptoAPI.d.ts +15 -0
- package/dist/mjs/util/webCryptoAPI.js +77 -0
- package/dist/mjs/util/webCryptoAPI.js.map +1 -0
- package/dist/mjs/util/websocket-util.d.ts +142 -0
- package/dist/mjs/util/websocket-util.js +517 -0
- package/dist/mjs/util/websocket-util.js.map +1 -0
- package/dist/mjs/websocket-api-client.d.ts +135 -0
- package/dist/mjs/websocket-api-client.js +167 -0
- package/dist/mjs/websocket-api-client.js.map +1 -0
- package/dist/mjs/websocket-client-legacy.d.ts +76 -0
- package/dist/mjs/websocket-client-legacy.js +517 -0
- package/dist/mjs/websocket-client-legacy.js.map +1 -0
- package/dist/mjs/websocket-client.d.ts +81 -0
- package/dist/mjs/websocket-client.js +544 -0
- package/dist/mjs/websocket-client.js.map +1 -0
- package/llms.txt +5604 -3719
- package/package.json +28 -13
- package/index.js +0 -1
- package/lib/constants/funding.js.map +0 -1
- package/lib/constants/index.d.ts +0 -1
- package/lib/constants/index.js +0 -18
- package/lib/constants/index.js.map +0 -1
- package/lib/index.d.ts +0 -5
- package/lib/index.js +0 -22
- package/lib/index.js.map +0 -1
- package/lib/rest-client.js.map +0 -1
- package/lib/types/index.d.ts +0 -3
- package/lib/types/index.js +0 -20
- package/lib/types/index.js.map +0 -1
- package/lib/types/rest/client.d.ts +0 -20
- package/lib/types/rest/index.d.ts +0 -4
- package/lib/types/rest/index.js +0 -21
- package/lib/types/rest/index.js.map +0 -1
- package/lib/types/rest/request/account.js.map +0 -1
- package/lib/types/rest/request/announement.d.ts +0 -0
- package/lib/types/rest/request/announement.js +0 -1
- package/lib/types/rest/request/announement.js.map +0 -1
- package/lib/types/rest/request/block-trading.js.map +0 -1
- package/lib/types/rest/request/convert.js.map +0 -1
- package/lib/types/rest/request/copy-trading.js.map +0 -1
- package/lib/types/rest/request/funding.js.map +0 -1
- package/lib/types/rest/request/grid-trading.js.map +0 -1
- package/lib/types/rest/request/index.d.ts +0 -14
- package/lib/types/rest/request/index.js +0 -31
- package/lib/types/rest/request/index.js.map +0 -1
- package/lib/types/rest/request/public.js.map +0 -1
- package/lib/types/rest/request/recurring-buy.js.map +0 -1
- package/lib/types/rest/request/shared.js.map +0 -1
- package/lib/types/rest/request/signal-bot.js.map +0 -1
- package/lib/types/rest/request/simple-earn.js.map +0 -1
- package/lib/types/rest/request/spread-trading.js.map +0 -1
- package/lib/types/rest/request/subaccount.js.map +0 -1
- package/lib/types/rest/request/trade.js.map +0 -1
- package/lib/types/rest/response/index.d.ts +0 -11
- package/lib/types/rest/response/index.js +0 -28
- package/lib/types/rest/response/index.js.map +0 -1
- package/lib/types/rest/response/private-account.js.map +0 -1
- package/lib/types/rest/response/private-block-trading.js.map +0 -1
- package/lib/types/rest/response/private-copy-trading.js.map +0 -1
- package/lib/types/rest/response/private-flexible-loan.js.map +0 -1
- package/lib/types/rest/response/private-funding.js.map +0 -1
- package/lib/types/rest/response/private-recurring-buy.js.map +0 -1
- package/lib/types/rest/response/private-signal-bot.js.map +0 -1
- package/lib/types/rest/response/private-spread-trading.js.map +0 -1
- package/lib/types/rest/response/private-subaccount.js.map +0 -1
- package/lib/types/rest/response/private-trade.js.map +0 -1
- package/lib/types/rest/response/public-data.js.map +0 -1
- package/lib/types/shared.d.ts +0 -6
- package/lib/types/websockets/client.d.ts +0 -22
- package/lib/types/websockets/client.js +0 -3
- package/lib/types/websockets/event.js +0 -3
- package/lib/types/websockets/event.js.map +0 -1
- package/lib/types/websockets/index.d.ts +0 -3
- package/lib/types/websockets/index.js +0 -20
- package/lib/types/websockets/index.js.map +0 -1
- package/lib/types/websockets/request.js +0 -3
- package/lib/types/websockets/request.js.map +0 -1
- package/lib/util/BaseRestClient.js +0 -217
- package/lib/util/BaseRestClient.js.map +0 -1
- package/lib/util/WsStore.d.ts +0 -66
- package/lib/util/WsStore.js +0 -168
- package/lib/util/WsStore.js.map +0 -1
- package/lib/util/browser-support.d.ts +0 -6
- package/lib/util/browser-support.js +0 -48
- package/lib/util/browser-support.js.map +0 -1
- package/lib/util/index.d.ts +0 -4
- package/lib/util/index.js +0 -21
- package/lib/util/index.js.map +0 -1
- package/lib/util/logger.d.ts +0 -9
- package/lib/util/logger.js.map +0 -1
- package/lib/util/node-support.d.ts +0 -1
- package/lib/util/node-support.js +0 -8
- package/lib/util/node-support.js.map +0 -1
- package/lib/util/requestUtils.js.map +0 -1
- package/lib/util/typeGuards.js.map +0 -1
- package/lib/util/websocket-util.d.ts +0 -35
- package/lib/util/websocket-util.js +0 -282
- package/lib/util/websocket-util.js.map +0 -1
- package/lib/websocket-client.js +0 -472
- package/lib/websocket-client.js.map +0 -1
- /package/{lib → dist/cjs}/constants/funding.d.ts +0 -0
- /package/{lib → dist/cjs}/constants/funding.js +0 -0
- /package/{lib → dist/cjs}/types/rest/client.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/account.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/block-trading.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/convert.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/request/convert.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/copy-trading.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/request/copy-trading.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/funding.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/request/funding.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/grid-trading.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/request/grid-trading.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/public.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/request/public.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/recurring-buy.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/request/recurring-buy.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/shared.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/signal-bot.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/request/signal-bot.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/simple-earn.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/request/simple-earn.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/spread-trading.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/request/spread-trading.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/subaccount.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/request/subaccount.js +0 -0
- /package/{lib → dist/cjs}/types/rest/request/trade.js +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-account.js +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-block-trading.js +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-copy-trading.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-copy-trading.js +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-flexible-loan.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-flexible-loan.js +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-funding.js +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-recurring-buy.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-recurring-buy.js +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-signal-bot.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-signal-bot.js +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-spread-trading.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-spread-trading.js +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-subaccount.d.ts +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-subaccount.js +0 -0
- /package/{lib → dist/cjs}/types/rest/response/private-trade.js +0 -0
- /package/{lib → dist/cjs}/types/rest/response/public-data.js +0 -0
- /package/{lib → dist/cjs}/types/rest/shared.js +0 -0
- /package/{lib → dist/cjs}/types/shared.js +0 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { Agent } from 'https';
|
|
3
|
+
import { getRestBaseUrl, programId, programKey, serializeParams, } from './requestUtils.js';
|
|
4
|
+
import { isRawAPIResponse } from './typeGuards.js';
|
|
5
|
+
import { checkWebCryptoAPISupported, signMessage, } from './webCryptoAPI.js';
|
|
6
|
+
// axios.interceptors.request.use((request) => {
|
|
7
|
+
// console.log(new Date(), 'Starting Request', JSON.stringify(request, null, 2));
|
|
8
|
+
// return request;
|
|
9
|
+
// });
|
|
10
|
+
// axios.interceptors.response.use((response) => {
|
|
11
|
+
// // console.log(new Date(), 'Response:', JSON.stringify(response, null, 2));
|
|
12
|
+
// console.log(
|
|
13
|
+
// new Date(),
|
|
14
|
+
// 'Response:',
|
|
15
|
+
// JSON.stringify(
|
|
16
|
+
// {
|
|
17
|
+
// data: response.data,
|
|
18
|
+
// headers: response.headers,
|
|
19
|
+
// },
|
|
20
|
+
// null,
|
|
21
|
+
// 2,
|
|
22
|
+
// ),
|
|
23
|
+
// );
|
|
24
|
+
// return response;
|
|
25
|
+
// });
|
|
26
|
+
export const MISSING_CREDENTIALS_ERROR = 'Private endpoints require api and secret to be provided in the REST client constructor';
|
|
27
|
+
export default class BaseRestClient {
|
|
28
|
+
options;
|
|
29
|
+
baseUrl;
|
|
30
|
+
globalRequestOptions;
|
|
31
|
+
apiKey;
|
|
32
|
+
apiSecret;
|
|
33
|
+
apiPassphrase;
|
|
34
|
+
constructor(options = {}, requestOptions = {}) {
|
|
35
|
+
// this.environment = environment;
|
|
36
|
+
this.options = {
|
|
37
|
+
// if true, we'll throw errors if any params are undefined
|
|
38
|
+
strict_param_validation: false,
|
|
39
|
+
market: 'prod',
|
|
40
|
+
...options,
|
|
41
|
+
};
|
|
42
|
+
this.baseUrl = getRestBaseUrl(options.market || 'prod', options);
|
|
43
|
+
const hasOneCredential = options.apiKey || options.apiSecret || options.apiPass;
|
|
44
|
+
const hasAllCredentials = !!options.apiKey && !!options.apiSecret && !!options.apiPass;
|
|
45
|
+
// Allow empty object
|
|
46
|
+
if (hasOneCredential && !hasAllCredentials) {
|
|
47
|
+
throw new Error('API Key, Secret AND Passphrase are ALL required for private enpoints');
|
|
48
|
+
}
|
|
49
|
+
if (hasAllCredentials && !this.options.customSignMessageFn) {
|
|
50
|
+
// Provide a user friendly error message if the user is using an outdated Node.js version (where Web Crypto API is not available).
|
|
51
|
+
// A few users have been caught out by using the end-of-life Node.js v18 release.
|
|
52
|
+
checkWebCryptoAPISupported();
|
|
53
|
+
}
|
|
54
|
+
this.globalRequestOptions = {
|
|
55
|
+
// in ms == 5 minutes by default
|
|
56
|
+
timeout: 1000 * 60 * 5,
|
|
57
|
+
// custom request options based on axios specs - see: https://github.com/axios/axios#request-config
|
|
58
|
+
...requestOptions,
|
|
59
|
+
};
|
|
60
|
+
if (!this.globalRequestOptions.headers) {
|
|
61
|
+
this.globalRequestOptions.headers = {};
|
|
62
|
+
}
|
|
63
|
+
if (options.market === 'demo') {
|
|
64
|
+
throw new Error('ERROR: to use demo trading, set the "demoTrading: true" flag in the constructor');
|
|
65
|
+
}
|
|
66
|
+
// Note: `x-simulated-trading: 1` needs to be added to the header of the Demo Trading request.
|
|
67
|
+
if (options.demoTrading) {
|
|
68
|
+
this.globalRequestOptions.headers['x-simulated-trading'] = 1;
|
|
69
|
+
}
|
|
70
|
+
this.globalRequestOptions.headers['Content-Type'] = 'application/json';
|
|
71
|
+
this.globalRequestOptions.headers['Accept'] = 'application/json';
|
|
72
|
+
// If enabled, configure a https agent with keepAlive enabled
|
|
73
|
+
if (this.options.keepAlive) {
|
|
74
|
+
// Extract existing https agent parameters, if provided, to prevent the keepAlive flag from overwriting an existing https agent completely
|
|
75
|
+
const existingHttpsAgent = this.globalRequestOptions.httpsAgent;
|
|
76
|
+
const existingAgentOptions = existingHttpsAgent?.options || {};
|
|
77
|
+
// For more advanced configuration, raise an issue on GitHub or use the "requestOptions"
|
|
78
|
+
// parameter to define a custom httpsAgent with the desired properties
|
|
79
|
+
this.globalRequestOptions.httpsAgent = new Agent({
|
|
80
|
+
...existingAgentOptions,
|
|
81
|
+
keepAlive: true,
|
|
82
|
+
keepAliveMsecs: this.options.keepAliveMsecs,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
this.apiKey = options?.apiKey;
|
|
86
|
+
this.apiSecret = options?.apiSecret;
|
|
87
|
+
this.apiPassphrase = options?.apiPass;
|
|
88
|
+
}
|
|
89
|
+
get(endpoint, params) {
|
|
90
|
+
return this._call('GET', endpoint, params, true);
|
|
91
|
+
}
|
|
92
|
+
post(endpoint, params) {
|
|
93
|
+
return this._call('POST', endpoint, params, true);
|
|
94
|
+
}
|
|
95
|
+
getPrivate(endpoint, params) {
|
|
96
|
+
return this._call('GET', endpoint, params, false);
|
|
97
|
+
}
|
|
98
|
+
postPrivate(endpoint, params) {
|
|
99
|
+
return this._call('POST', endpoint, Array.isArray(params)
|
|
100
|
+
? params.map((p) => ({ ...p, [programKey]: programId }))
|
|
101
|
+
: { ...params, [programKey]: programId }, false);
|
|
102
|
+
}
|
|
103
|
+
deletePrivate(endpoint, params) {
|
|
104
|
+
return this._call('DELETE', endpoint, params, false);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Make a HTTP request to a specific endpoint. Private endpoints are automatically signed.
|
|
108
|
+
*/
|
|
109
|
+
async _call(method, endpoint, params, isPublicApi) {
|
|
110
|
+
const options = {
|
|
111
|
+
...this.globalRequestOptions,
|
|
112
|
+
url: [this.baseUrl, endpoint].join(endpoint.startsWith('/') ? '' : '/'),
|
|
113
|
+
method: method,
|
|
114
|
+
json: true,
|
|
115
|
+
};
|
|
116
|
+
// Delete any params without value
|
|
117
|
+
if (params) {
|
|
118
|
+
for (const key in params) {
|
|
119
|
+
if (typeof params[key] === 'undefined') {
|
|
120
|
+
delete params[key];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const tsISO = new Date().toISOString();
|
|
125
|
+
const signResult = await this.signRequest(isPublicApi, tsISO, method, endpoint, params);
|
|
126
|
+
if (!options.headers) {
|
|
127
|
+
options.headers = {};
|
|
128
|
+
}
|
|
129
|
+
if (!isPublicApi) {
|
|
130
|
+
options.headers['OK-ACCESS-KEY'] = this.apiKey;
|
|
131
|
+
options.headers['OK-ACCESS-SIGN'] = signResult.sign;
|
|
132
|
+
options.headers['OK-ACCESS-TIMESTAMP'] = tsISO;
|
|
133
|
+
options.headers['OK-ACCESS-PASSPHRASE'] = this.apiPassphrase;
|
|
134
|
+
}
|
|
135
|
+
if (method === 'GET') {
|
|
136
|
+
options.params = signResult.requestBody;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
options.data = signResult.requestBody;
|
|
140
|
+
}
|
|
141
|
+
// console.log(new Date(), 'request: ', {
|
|
142
|
+
// url: options.url,
|
|
143
|
+
// method,
|
|
144
|
+
// params: signResult.requestBody,
|
|
145
|
+
// sign: signResult.sign,
|
|
146
|
+
// options,
|
|
147
|
+
// });
|
|
148
|
+
return axios(options)
|
|
149
|
+
.then((response) => {
|
|
150
|
+
// Check this is an API response without an error code.
|
|
151
|
+
// If so, resolve the nested data property, else throw the full response body
|
|
152
|
+
if (isRawAPIResponse(response.data) &&
|
|
153
|
+
response.status == 200 &&
|
|
154
|
+
response.data?.code === '0') {
|
|
155
|
+
return response.data.data;
|
|
156
|
+
}
|
|
157
|
+
// console.log('request: ', JSON.stringify(options, null, 2));
|
|
158
|
+
// console.log(
|
|
159
|
+
// 'bad response: ',
|
|
160
|
+
// JSON.stringify(
|
|
161
|
+
// {
|
|
162
|
+
// data: response.data,
|
|
163
|
+
// headers: response.headers,
|
|
164
|
+
// },
|
|
165
|
+
// null,
|
|
166
|
+
// 2
|
|
167
|
+
// )
|
|
168
|
+
// );
|
|
169
|
+
// Also throw if API returned error code
|
|
170
|
+
// This API error thrown by the exchange will be post-processed by the exception parser
|
|
171
|
+
throw { response };
|
|
172
|
+
})
|
|
173
|
+
.catch((e) => this.parseException(e));
|
|
174
|
+
}
|
|
175
|
+
async signMessage(paramsStr, secret, method, algorithm) {
|
|
176
|
+
if (typeof this.options.customSignMessageFn === 'function') {
|
|
177
|
+
return this.options.customSignMessageFn(paramsStr, secret);
|
|
178
|
+
}
|
|
179
|
+
return await signMessage(paramsStr, secret, method, algorithm);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Sign request
|
|
183
|
+
*/
|
|
184
|
+
async signRequest(isPublicApi, tsISO, method, endpoint, params) {
|
|
185
|
+
const res = {
|
|
186
|
+
requestBody: params,
|
|
187
|
+
method,
|
|
188
|
+
endpoint,
|
|
189
|
+
sign: '',
|
|
190
|
+
};
|
|
191
|
+
if (isPublicApi) {
|
|
192
|
+
return res;
|
|
193
|
+
}
|
|
194
|
+
if (!this.apiKey || !this.apiSecret || !this.apiPassphrase) {
|
|
195
|
+
throw new Error(MISSING_CREDENTIALS_ERROR);
|
|
196
|
+
}
|
|
197
|
+
const serializedParams = serializeParams(params, method, this.options.strict_param_validation);
|
|
198
|
+
const message = tsISO + method + endpoint + serializedParams;
|
|
199
|
+
// console.log(new Date(), `Sign params: `, {
|
|
200
|
+
// message,
|
|
201
|
+
// secret: this.apiSecret,
|
|
202
|
+
// });
|
|
203
|
+
return {
|
|
204
|
+
...res,
|
|
205
|
+
sign: await this.signMessage(message, this.apiSecret, 'base64', 'SHA-256'),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Generic handler to parse request exceptions
|
|
210
|
+
*/
|
|
211
|
+
parseException(e) {
|
|
212
|
+
if (this.options.parse_exceptions === false) {
|
|
213
|
+
throw e;
|
|
214
|
+
}
|
|
215
|
+
// Something happened in setting up the request that triggered an Error
|
|
216
|
+
if (!e.response) {
|
|
217
|
+
if (!e.request) {
|
|
218
|
+
throw e.message;
|
|
219
|
+
}
|
|
220
|
+
// request made but no response received
|
|
221
|
+
throw e;
|
|
222
|
+
}
|
|
223
|
+
// The request was made and the server responded with a status code
|
|
224
|
+
// that falls out of the range of 2xx
|
|
225
|
+
const response = e.response;
|
|
226
|
+
throw response.data;
|
|
227
|
+
// throw {
|
|
228
|
+
// status: response.status,
|
|
229
|
+
// statusText: response.statusText,
|
|
230
|
+
// data: response.data,
|
|
231
|
+
// headers: response.headers,
|
|
232
|
+
// requestOptions: this.options,
|
|
233
|
+
// };
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=BaseRestClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseRestClient.js","sourceRoot":"","sources":["../../../src/util/BaseRestClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAI9B,OAAO,EACL,cAAc,EACd,SAAS,EACT,UAAU,EACV,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,0BAA0B,EAG1B,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,gDAAgD;AAChD,mFAAmF;AACnF,oBAAoB;AACpB,MAAM;AAEN,kDAAkD;AAClD,gFAAgF;AAChF,iBAAiB;AACjB,kBAAkB;AAClB,mBAAmB;AACnB,sBAAsB;AACtB,UAAU;AACV,+BAA+B;AAC/B,qCAAqC;AACrC,WAAW;AACX,cAAc;AACd,WAAW;AACX,SAAS;AACT,OAAO;AACP,qBAAqB;AACrB,MAAM;AAEN,MAAM,CAAC,MAAM,yBAAyB,GACpC,wFAAwF,CAAC;AAS3F,MAAM,CAAC,OAAO,OAAgB,cAAc;IAClC,OAAO,CAAoB;IAE3B,OAAO,CAAS;IAEhB,oBAAoB,CAAqB;IAEzC,MAAM,CAAqB;IAE3B,SAAS,CAAqB;IAE9B,aAAa,CAAqB;IAE1C,YACE,UAA6B,EAAE,EAC/B,iBAAqC,EAAE;QAEvC,kCAAkC;QAElC,IAAI,CAAC,OAAO,GAAG;YACb,0DAA0D;YAC1D,uBAAuB,EAAE,KAAK;YAC9B,MAAM,EAAE,MAAM;YACd,GAAG,OAAO;SACX,CAAC;QAEF,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,OAAO,CAAC,CAAC;QAEjE,MAAM,gBAAgB,GACpB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;QACzD,MAAM,iBAAiB,GACrB,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAE/D,qBAAqB;QACrB,IAAI,gBAAgB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;QACJ,CAAC;QAED,IAAI,iBAAiB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAC3D,kIAAkI;YAClI,iFAAiF;YACjF,0BAA0B,EAAE,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,oBAAoB,GAAG;YAC1B,gCAAgC;YAChC,OAAO,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC;YACtB,mGAAmG;YACnG,GAAG,cAAc;SAClB,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,CAAC,oBAAoB,CAAC,OAAO,GAAG,EAAE,CAAC;QACzC,CAAC;QAED,IAAK,OAAO,CAAC,MAAc,KAAK,MAAM,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;QACJ,CAAC;QAED,+FAA+F;QAC/F,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QACvE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,kBAAkB,CAAC;QAEjE,6DAA6D;QAC7D,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC3B,0IAA0I;YAC1I,MAAM,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAExC,CAAC;YACd,MAAM,oBAAoB,GAAG,kBAAkB,EAAE,OAAO,IAAI,EAAE,CAAC;YAE/D,wFAAwF;YACxF,sEAAsE;YACtE,IAAI,CAAC,oBAAoB,CAAC,UAAU,GAAG,IAAI,KAAK,CAAC;gBAC/C,GAAG,oBAAoB;gBACvB,SAAS,EAAE,IAAI;gBACf,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;aAC5C,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,OAAO,CAAC;IACxC,CAAC;IAEM,GAAG,CAAC,QAAgB,EAAE,MAAY;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAEM,IAAI,CAAC,QAAgB,EAAE,MAAY;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IAEM,UAAU,CAAC,QAAgB,EAAE,MAAY;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAEM,WAAW,CAAC,QAAgB,EAAE,MAAY;QAC/C,OAAO,IAAI,CAAC,KAAK,CACf,MAAM,EACN,QAAQ,EACR,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACnB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACxD,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,EAC1C,KAAK,CACN,CAAC;IACJ,CAAC;IAEM,aAAa,CAAC,QAAgB,EAAE,MAAY;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,KAAK,CACjB,MAAc,EACd,QAAgB,EAChB,MAA0B,EAC1B,WAAoB;QAEpB,MAAM,OAAO,GAAG;YACd,GAAG,IAAI,CAAC,oBAAoB;YAC5B,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YACvE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI;SACX,CAAC;QAEF,kCAAkC;QAClC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,IAAI,OAAQ,MAAc,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC;oBAChD,OAAQ,MAAc,CAAC,GAAG,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CACvC,WAAW,EACX,KAAK,EACL,MAAM,EACN,QAAQ,EACR,MAAM,CACP,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YAC/C,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC;YACpD,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC;YAC/C,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAC/D,CAAC;QAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC;QACxC,CAAC;QAED,yCAAyC;QACzC,oBAAoB;QACpB,UAAU;QACV,kCAAkC;QAClC,yBAAyB;QACzB,aAAa;QACb,MAAM;QAEN,OAAO,KAAK,CAAC,OAAO,CAAC;aAClB,IAAI,CAAC,CAAC,QAA6C,EAAE,EAAE;YACtD,uDAAuD;YACvD,6EAA6E;YAC7E,IACE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC/B,QAAQ,CAAC,MAAM,IAAI,GAAG;gBACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,EAC3B,CAAC;gBACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,CAAC;YAED,8DAA8D;YAC9D,eAAe;YACf,sBAAsB;YACtB,oBAAoB;YACpB,QAAQ;YACR,6BAA6B;YAC7B,mCAAmC;YACnC,SAAS;YACT,YAAY;YACZ,QAAQ;YACR,MAAM;YACN,KAAK;YAEL,wCAAwC;YACxC,uFAAuF;YACvF,MAAM,EAAE,QAAQ,EAAE,CAAC;QACrB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,SAAiB,EACjB,MAAc,EACd,MAAwB,EACxB,SAAwB;QAExB,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,KAAK,UAAU,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,MAAM,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CACvB,WAAoB,EACpB,KAAa,EACb,MAAc,EACd,QAAgB,EAChB,MAAqB;QAErB,MAAM,GAAG,GAAqB;YAC5B,WAAW,EAAE,MAAM;YACnB,MAAM;YACN,QAAQ;YACR,IAAI,EAAE,EAAE;SACT,CAAC;QAEF,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,gBAAgB,GAAG,eAAe,CACtC,MAAM,EACN,MAAM,EACN,IAAI,CAAC,OAAO,CAAC,uBAAuB,CACrC,CAAC;QAEF,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,gBAAgB,CAAC;QAC7D,6CAA6C;QAC7C,aAAa;QACb,4BAA4B;QAC5B,MAAM;QAEN,OAAO;YACL,GAAG,GAAG;YACN,IAAI,EAAE,MAAM,IAAI,CAAC,WAAW,CAC1B,OAAO,EACP,IAAI,CAAC,SAAS,EACd,QAAQ,EACR,SAAS,CACV;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,CAAM;QAC3B,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,KAAK,KAAK,EAAE,CAAC;YAC5C,MAAM,CAAC,CAAC;QACV,CAAC;QAED,uEAAuE;QACvE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBACf,MAAM,CAAC,CAAC,OAAO,CAAC;YAClB,CAAC;YAED,wCAAwC;YACxC,MAAM,CAAC,CAAC;QACV,CAAC;QAED,mEAAmE;QACnE,qCAAqC;QACrC,MAAM,QAAQ,GAAkB,CAAC,CAAC,QAAQ,CAAC;QAC3C,MAAM,QAAQ,CAAC,IAAI,CAAC;QACpB,UAAU;QACV,6BAA6B;QAC7B,qCAAqC;QACrC,yBAAyB;QACzB,+BAA+B;QAC/B,kCAAkC;QAClC,KAAK;IACP,CAAC;CACF"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import EventEmitter from 'events';
|
|
2
|
+
import WebSocket from 'isomorphic-ws';
|
|
3
|
+
import { WSOperation } from '../types/websockets/ws-api.js';
|
|
4
|
+
import { MessageEventLike } from '../types/websockets/ws-events.js';
|
|
5
|
+
import { WebsocketClientOptions, WSClientConfigurableOptions } from '../types/websockets/ws-general.js';
|
|
6
|
+
import { DefaultLogger } from './logger.js';
|
|
7
|
+
import { WsTopicRequest, WsTopicRequestOrStringTopic } from './websocket-util.js';
|
|
8
|
+
import WsStore from './WsStore.js';
|
|
9
|
+
import { WSConnectedResult } from './WsStore.types.js';
|
|
10
|
+
export interface WSClientEventMap<WsKey extends string, TWSUpdateEventData = any> {
|
|
11
|
+
/** Connection opened. If this connection was previously opened and reconnected, expect the reconnected event instead */
|
|
12
|
+
open: (evt: {
|
|
13
|
+
wsKey: WsKey;
|
|
14
|
+
event: any;
|
|
15
|
+
wsUrl: string;
|
|
16
|
+
ws: WebSocket;
|
|
17
|
+
}) => void;
|
|
18
|
+
/** Reconnecting a dropped connection */
|
|
19
|
+
reconnect: (evt: {
|
|
20
|
+
wsKey: WsKey;
|
|
21
|
+
event: any;
|
|
22
|
+
}) => void;
|
|
23
|
+
/** Successfully reconnected a connection that dropped */
|
|
24
|
+
reconnected: (evt: {
|
|
25
|
+
wsKey: WsKey;
|
|
26
|
+
event: any;
|
|
27
|
+
wsUrl: string;
|
|
28
|
+
ws: WebSocket;
|
|
29
|
+
}) => void;
|
|
30
|
+
/** Connection closed */
|
|
31
|
+
close: (evt: {
|
|
32
|
+
wsKey: WsKey;
|
|
33
|
+
event: any;
|
|
34
|
+
}) => void;
|
|
35
|
+
/** Received reply to websocket command (e.g. after subscribing to topics) */
|
|
36
|
+
response: (response: any & {
|
|
37
|
+
wsKey: WsKey;
|
|
38
|
+
}) => void;
|
|
39
|
+
/** Received data for topic */
|
|
40
|
+
update: (response: any & {
|
|
41
|
+
wsKey: WsKey;
|
|
42
|
+
}) => void;
|
|
43
|
+
/** Exception from ws client OR custom listeners (e.g. if you throw inside your event handler) */
|
|
44
|
+
exception: (response: TWSUpdateEventData & {
|
|
45
|
+
wsKey: WsKey;
|
|
46
|
+
}) => void;
|
|
47
|
+
/** Confirmation that a connection successfully authenticated */
|
|
48
|
+
authenticated: (event: {
|
|
49
|
+
wsKey: WsKey;
|
|
50
|
+
event: any;
|
|
51
|
+
}) => void;
|
|
52
|
+
}
|
|
53
|
+
export interface BaseWebsocketClient<TWSKey extends string, TWSRequestEvent extends object, TWSUpdateEventData = any> {
|
|
54
|
+
on<U extends keyof WSClientEventMap<TWSKey, TWSUpdateEventData>>(event: U, listener: WSClientEventMap<TWSKey, TWSUpdateEventData>[U]): this;
|
|
55
|
+
emit<U extends keyof WSClientEventMap<TWSKey, TWSUpdateEventData>>(event: U, ...args: Parameters<WSClientEventMap<TWSKey, TWSUpdateEventData>[U]>): boolean;
|
|
56
|
+
}
|
|
57
|
+
export interface EmittableEvent<TEvent = any> {
|
|
58
|
+
eventType: 'response' | 'update' | 'exception' | 'authenticated';
|
|
59
|
+
event: TEvent;
|
|
60
|
+
isWSAPIResponse?: boolean;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* A midflight WS request event (e.g. subscribe to these topics).
|
|
64
|
+
*
|
|
65
|
+
* - requestKey: unique identifier for this request, if available. Can be anything as a string.
|
|
66
|
+
* - requestEvent: the raw request, as an object, that will be sent on the ws connection. This may contain multiple topics/requests in one object, if the exchange supports it.
|
|
67
|
+
*/
|
|
68
|
+
export interface MidflightWsRequestEvent<TEvent = object> {
|
|
69
|
+
requestKey: string;
|
|
70
|
+
requestEvent: TEvent;
|
|
71
|
+
}
|
|
72
|
+
export declare abstract class BaseWebsocketClient<TWSKey extends string, TWSRequestEvent extends object> extends EventEmitter {
|
|
73
|
+
/**
|
|
74
|
+
* State store to track a list of topics (topic requests) we are expected to be subscribed to if reconnected
|
|
75
|
+
*/
|
|
76
|
+
private wsStore;
|
|
77
|
+
logger: DefaultLogger;
|
|
78
|
+
protected options: WebsocketClientOptions;
|
|
79
|
+
private wsApiRequestId;
|
|
80
|
+
private timeOffsetMs;
|
|
81
|
+
/**
|
|
82
|
+
* { [wsKey]: { [requestId]: request } }
|
|
83
|
+
*/
|
|
84
|
+
private midflightRequestCache;
|
|
85
|
+
constructor(options?: WSClientConfigurableOptions, logger?: DefaultLogger);
|
|
86
|
+
/**
|
|
87
|
+
* Return true if this wsKey connection should automatically authenticate immediately after connecting
|
|
88
|
+
*/
|
|
89
|
+
protected abstract isAuthOnConnectWsKey(wsKey: TWSKey): boolean;
|
|
90
|
+
protected abstract sendPingEvent(wsKey: TWSKey, ws: WebSocket): void;
|
|
91
|
+
protected abstract sendPongEvent(wsKey: TWSKey, ws: WebSocket): void;
|
|
92
|
+
protected abstract isWsPing(data: any): boolean;
|
|
93
|
+
protected abstract isWsPong(data: any): boolean;
|
|
94
|
+
protected abstract getWsAuthRequestEvent(wsKey: TWSKey): Promise<object>;
|
|
95
|
+
protected abstract isPrivateTopicRequest(request: WsTopicRequest<string>, wsKey: TWSKey): boolean;
|
|
96
|
+
protected abstract getPrivateWSKeys(): TWSKey[];
|
|
97
|
+
protected abstract getWsUrl(wsKey: TWSKey): Promise<string>;
|
|
98
|
+
protected abstract getMaxTopicsPerSubscribeEvent(wsKey: TWSKey): number | null;
|
|
99
|
+
/**
|
|
100
|
+
* @returns one or more correctly structured request events for performing a operations over WS. This can vary per exchange spec.
|
|
101
|
+
*/
|
|
102
|
+
protected abstract getWsRequestEvents(operation: WSOperation, requests: WsTopicRequest<string>[], wsKey: TWSKey): Promise<MidflightWsRequestEvent<TWSRequestEvent>[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Abstraction called to sort ws events into emittable event types (response to a request, data update, etc)
|
|
105
|
+
*/
|
|
106
|
+
protected abstract resolveEmittableEvents(wsKey: TWSKey, event: MessageEventLike): EmittableEvent[];
|
|
107
|
+
/**
|
|
108
|
+
* Request connection of all dependent (public & private) websockets, instead of waiting for automatic connection by library
|
|
109
|
+
*/
|
|
110
|
+
protected abstract connectAll(): Promise<WSConnectedResult | undefined>[];
|
|
111
|
+
protected isPrivateWsKey(wsKey: TWSKey): boolean;
|
|
112
|
+
/** Returns auto-incrementing request ID, used to track promise references for async requests */
|
|
113
|
+
protected getNewRequestId(): number;
|
|
114
|
+
protected abstract sendWSAPIRequest(wsKey: TWSKey, operation: string, params?: any): Promise<unknown>;
|
|
115
|
+
getTimeOffsetMs(): number;
|
|
116
|
+
setTimeOffsetMs(newOffset: number): void;
|
|
117
|
+
/**
|
|
118
|
+
* Don't call directly! Use subscribe() instead!
|
|
119
|
+
*
|
|
120
|
+
* Subscribe to one or more topics on a WS connection (identified by WS Key).
|
|
121
|
+
*
|
|
122
|
+
* - Topics are automatically cached
|
|
123
|
+
* - Connections are automatically opened, if not yet connected
|
|
124
|
+
* - Authentication is automatically handled
|
|
125
|
+
* - Topics are automatically resubscribed to, if something happens to the connection, unless you call unsubsribeTopicsForWsKey(topics, key).
|
|
126
|
+
*
|
|
127
|
+
* @param wsRequests array of topics to subscribe to
|
|
128
|
+
* @param wsKey ws key referring to the ws connection these topics should be subscribed on
|
|
129
|
+
*/
|
|
130
|
+
protected subscribeTopicsForWsKey(wsTopicRequests: WsTopicRequestOrStringTopic<string>[], wsKey: TWSKey): Promise<unknown>;
|
|
131
|
+
protected unsubscribeTopicsForWsKey(wsTopicRequests: WsTopicRequestOrStringTopic<string>[], wsKey: TWSKey): Promise<unknown>;
|
|
132
|
+
/**
|
|
133
|
+
* Splits topic requests into two groups, public & private topic requests
|
|
134
|
+
*/
|
|
135
|
+
private sortTopicRequestsIntoPublicPrivate;
|
|
136
|
+
/** Get the WsStore that tracks websockets & topics */
|
|
137
|
+
getWsStore(): WsStore<TWSKey, WsTopicRequest<string>>;
|
|
138
|
+
close(wsKey: TWSKey, force?: boolean): void;
|
|
139
|
+
closeAll(force?: boolean): void;
|
|
140
|
+
isConnected(wsKey: TWSKey): boolean;
|
|
141
|
+
/**
|
|
142
|
+
* Request connection to a specific websocket, instead of waiting for automatic connection.
|
|
143
|
+
*/
|
|
144
|
+
connect(wsKey: TWSKey, customUrl?: string | undefined, throwOnError?: boolean): Promise<WSConnectedResult | undefined>;
|
|
145
|
+
private connectToWsUrl;
|
|
146
|
+
private parseWsError;
|
|
147
|
+
/** Get a signature, build the auth request and send it */
|
|
148
|
+
private sendAuthRequest;
|
|
149
|
+
private reconnectWithDelay;
|
|
150
|
+
private ping;
|
|
151
|
+
private clearTimers;
|
|
152
|
+
private clearPingTimer;
|
|
153
|
+
private clearPongTimer;
|
|
154
|
+
/**
|
|
155
|
+
* Returns a list of string events that can be individually sent upstream to complete subscribing/unsubscribing/etc to these topics
|
|
156
|
+
*
|
|
157
|
+
* If events are an object, these should be stringified (`return JSON.stringify(event);`)
|
|
158
|
+
* Each event returned by this will be sent one at a time
|
|
159
|
+
*
|
|
160
|
+
* Events are automatically split into smaller batches, by this method, if needed.
|
|
161
|
+
*/
|
|
162
|
+
protected getWsOperationEventsForTopics(topics: WsTopicRequest<string>[], wsKey: TWSKey, operation: WSOperation): Promise<MidflightWsRequestEvent<TWSRequestEvent>[]>;
|
|
163
|
+
/**
|
|
164
|
+
* @private Use the `subscribe(topics)` method to subscribe to topics. Send WS message to subscribe to topics.
|
|
165
|
+
*/
|
|
166
|
+
private requestSubscribeTopics;
|
|
167
|
+
/**
|
|
168
|
+
* @private Use the `unsubscribe(topics)` method to unsubscribe from topics. Send WS message to unsubscribe from topics.
|
|
169
|
+
*/
|
|
170
|
+
private requestUnsubscribeTopics;
|
|
171
|
+
getCachedMidFlightRequest(wsKey: TWSKey, requestKey: string): TWSRequestEvent | undefined;
|
|
172
|
+
removeCachedMidFlightRequest(wsKey: TWSKey, requestKey: string): void;
|
|
173
|
+
tryWsSend(wsKey: TWSKey, wsMessage: string, throwExceptions?: boolean): void;
|
|
174
|
+
private onWsOpen;
|
|
175
|
+
/**
|
|
176
|
+
* Handle subscription to private topics _after_ authentication successfully completes asynchronously.
|
|
177
|
+
*
|
|
178
|
+
* Only used for exchanges that require auth before sending private topic subscription requests
|
|
179
|
+
*/
|
|
180
|
+
private onWsAuthenticated;
|
|
181
|
+
private onWsPing;
|
|
182
|
+
private onWsPong;
|
|
183
|
+
/**
|
|
184
|
+
* Raw incoming event handler. Parsing happens in integration layer via resolveEmittableEvents().
|
|
185
|
+
*/
|
|
186
|
+
private onWsMessage;
|
|
187
|
+
private onWsClose;
|
|
188
|
+
private getWs;
|
|
189
|
+
private setWsState;
|
|
190
|
+
/**
|
|
191
|
+
* Promise-driven method to assert that a ws has successfully connected (will await until connection is open)
|
|
192
|
+
*/
|
|
193
|
+
assertIsConnected(wsKey: TWSKey): Promise<unknown>;
|
|
194
|
+
/**
|
|
195
|
+
* Promise-driven method to assert that a ws has been successfully authenticated (will await until auth is confirmed)
|
|
196
|
+
*/
|
|
197
|
+
assertIsAuthenticated(wsKey: TWSKey): Promise<unknown>;
|
|
198
|
+
}
|