@solncebro/exchange-engine 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/README.md +7 -7
- package/dist/auth/binanceAuth.js +3 -6
- package/dist/auth/binanceAuth.js.map +1 -1
- package/dist/auth/bybitAuth.d.ts +0 -1
- package/dist/auth/bybitAuth.d.ts.map +1 -1
- package/dist/auth/bybitAuth.js +2 -9
- package/dist/auth/bybitAuth.js.map +1 -1
- package/dist/constants/binance.d.ts +8 -5
- package/dist/constants/binance.d.ts.map +1 -1
- package/dist/constants/binance.js +10 -23
- package/dist/constants/binance.js.map +1 -1
- package/dist/constants/bybit.d.ts +7 -9
- package/dist/constants/bybit.d.ts.map +1 -1
- package/dist/constants/bybit.js +10 -13
- package/dist/constants/bybit.js.map +1 -1
- package/dist/constants/mappings.d.ts +9 -0
- package/dist/constants/mappings.d.ts.map +1 -0
- package/dist/constants/mappings.js +40 -0
- package/dist/constants/mappings.js.map +1 -0
- package/dist/exchanges/BaseExchangeClient.d.ts +37 -0
- package/dist/exchanges/BaseExchangeClient.d.ts.map +1 -0
- package/dist/exchanges/BaseExchangeClient.js +91 -0
- package/dist/exchanges/BaseExchangeClient.js.map +1 -0
- package/dist/exchanges/BinanceBaseClient.d.ts +21 -0
- package/dist/exchanges/BinanceBaseClient.d.ts.map +1 -0
- package/dist/exchanges/BinanceBaseClient.js +64 -0
- package/dist/exchanges/BinanceBaseClient.js.map +1 -0
- package/dist/exchanges/BinanceFutures.d.ts +9 -21
- package/dist/exchanges/BinanceFutures.d.ts.map +1 -1
- package/dist/exchanges/BinanceFutures.js +23 -94
- package/dist/exchanges/BinanceFutures.js.map +1 -1
- package/dist/exchanges/BinanceSpot.d.ts +9 -21
- package/dist/exchanges/BinanceSpot.d.ts.map +1 -1
- package/dist/exchanges/BinanceSpot.js +16 -94
- package/dist/exchanges/BinanceSpot.js.map +1 -1
- package/dist/exchanges/BybitLinear.d.ts +19 -20
- package/dist/exchanges/BybitLinear.d.ts.map +1 -1
- package/dist/exchanges/BybitLinear.js +66 -71
- package/dist/exchanges/BybitLinear.js.map +1 -1
- package/dist/exchanges/BybitSpot.d.ts +17 -19
- package/dist/exchanges/BybitSpot.d.ts.map +1 -1
- package/dist/exchanges/BybitSpot.js +42 -64
- package/dist/exchanges/BybitSpot.js.map +1 -1
- package/dist/exchanges/Exchange.d.ts +1 -1
- package/dist/exchanges/Exchange.d.ts.map +1 -1
- package/dist/exchanges/Exchange.js +3 -2
- package/dist/exchanges/Exchange.js.map +1 -1
- package/dist/http/BaseHttpClient.d.ts +10 -1
- package/dist/http/BaseHttpClient.d.ts.map +1 -1
- package/dist/http/BaseHttpClient.js +27 -5
- package/dist/http/BaseHttpClient.js.map +1 -1
- package/dist/http/BinanceBaseHttpClient.d.ts +49 -0
- package/dist/http/BinanceBaseHttpClient.d.ts.map +1 -0
- package/dist/http/BinanceBaseHttpClient.js +86 -0
- package/dist/http/BinanceBaseHttpClient.js.map +1 -0
- package/dist/http/BinanceFuturesHttpClient.d.ts +11 -40
- package/dist/http/BinanceFuturesHttpClient.d.ts.map +1 -1
- package/dist/http/BinanceFuturesHttpClient.js +38 -185
- package/dist/http/BinanceFuturesHttpClient.js.map +1 -1
- package/dist/http/BinanceSpotHttpClient.d.ts +5 -24
- package/dist/http/BinanceSpotHttpClient.d.ts.map +1 -1
- package/dist/http/BinanceSpotHttpClient.js +15 -90
- package/dist/http/BinanceSpotHttpClient.js.map +1 -1
- package/dist/http/BybitHttpClient.d.ts +82 -134
- package/dist/http/BybitHttpClient.d.ts.map +1 -1
- package/dist/http/BybitHttpClient.js +61 -94
- package/dist/http/BybitHttpClient.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/normalizers/binanceNormalizer.d.ts +29 -19
- package/dist/normalizers/binanceNormalizer.d.ts.map +1 -1
- package/dist/normalizers/binanceNormalizer.js +55 -35
- package/dist/normalizers/binanceNormalizer.js.map +1 -1
- package/dist/normalizers/bybitNormalizer.d.ts +25 -19
- package/dist/normalizers/bybitNormalizer.d.ts.map +1 -1
- package/dist/normalizers/bybitNormalizer.js +60 -45
- package/dist/normalizers/bybitNormalizer.js.map +1 -1
- package/dist/precision/precision.d.ts +3 -3
- package/dist/precision/precision.d.ts.map +1 -1
- package/dist/precision/precision.js +4 -4
- package/dist/precision/precision.js.map +1 -1
- package/dist/types/common.d.ts +57 -22
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js +40 -0
- package/dist/types/common.js.map +1 -1
- package/dist/types/exchange.d.ts +14 -8
- package/dist/types/exchange.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/stream.d.ts +9 -0
- package/dist/types/stream.d.ts.map +1 -0
- package/dist/types/stream.js +3 -0
- package/dist/types/stream.js.map +1 -0
- package/dist/utils/crypto.d.ts +2 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +11 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/httpParams.d.ts +3 -0
- package/dist/utils/httpParams.d.ts.map +1 -0
- package/dist/utils/httpParams.js +15 -0
- package/dist/utils/httpParams.js.map +1 -0
- package/dist/utils/klineLoader.d.ts +10 -0
- package/dist/utils/klineLoader.d.ts.map +1 -0
- package/dist/utils/klineLoader.js +19 -0
- package/dist/utils/klineLoader.js.map +1 -0
- package/dist/ws/BinanceFuturesPublicStream.d.ts +8 -7
- package/dist/ws/BinanceFuturesPublicStream.d.ts.map +1 -1
- package/dist/ws/BinanceFuturesPublicStream.js +49 -79
- package/dist/ws/BinanceFuturesPublicStream.js.map +1 -1
- package/dist/ws/BinanceSpotPublicStream.d.ts +7 -5
- package/dist/ws/BinanceSpotPublicStream.d.ts.map +1 -1
- package/dist/ws/BinanceSpotPublicStream.js +24 -31
- package/dist/ws/BinanceSpotPublicStream.js.map +1 -1
- package/dist/ws/BinanceUserDataStream.d.ts +3 -3
- package/dist/ws/BinanceUserDataStream.d.ts.map +1 -1
- package/dist/ws/BinanceUserDataStream.js +10 -10
- package/dist/ws/BinanceUserDataStream.js.map +1 -1
- package/dist/ws/BybitPrivateStream.d.ts +1 -1
- package/dist/ws/BybitPrivateStream.d.ts.map +1 -1
- package/dist/ws/BybitPrivateStream.js +12 -29
- package/dist/ws/BybitPrivateStream.js.map +1 -1
- package/dist/ws/BybitPublicStream.d.ts +5 -4
- package/dist/ws/BybitPublicStream.d.ts.map +1 -1
- package/dist/ws/BybitPublicStream.js +18 -24
- package/dist/ws/BybitPublicStream.js.map +1 -1
- package/dist/ws/BybitTradeStream.d.ts +4 -2
- package/dist/ws/BybitTradeStream.d.ts.map +1 -1
- package/dist/ws/BybitTradeStream.js +32 -44
- package/dist/ws/BybitTradeStream.js.map +1 -1
- package/dist/ws/binanceWebSocketUtils.d.ts +4 -0
- package/dist/ws/binanceWebSocketUtils.d.ts.map +1 -0
- package/dist/ws/binanceWebSocketUtils.js +7 -0
- package/dist/ws/binanceWebSocketUtils.js.map +1 -0
- package/dist/ws/bybitWebSocketUtils.d.ts +28 -0
- package/dist/ws/bybitWebSocketUtils.d.ts.map +1 -0
- package/dist/ws/bybitWebSocketUtils.js +29 -0
- package/dist/ws/bybitWebSocketUtils.js.map +1 -0
- package/package.json +21 -3
|
@@ -1,85 +1,93 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BybitLinear = void 0;
|
|
4
|
+
const common_1 = require("../types/common");
|
|
4
5
|
const BybitHttpClient_1 = require("../http/BybitHttpClient");
|
|
5
6
|
const bybitNormalizer_1 = require("../normalizers/bybitNormalizer");
|
|
6
7
|
const BybitPublicStream_1 = require("../ws/BybitPublicStream");
|
|
7
8
|
const BybitTradeStream_1 = require("../ws/BybitTradeStream");
|
|
8
9
|
const bybit_1 = require("../constants/bybit");
|
|
9
|
-
const
|
|
10
|
-
class BybitLinear {
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
const BaseExchangeClient_1 = require("./BaseExchangeClient");
|
|
11
|
+
class BybitLinear extends BaseExchangeClient_1.BaseExchangeClient {
|
|
12
|
+
marketLabel = 'linear';
|
|
13
|
+
klineLimit = 200;
|
|
14
|
+
isDemoMode;
|
|
13
15
|
httpClient;
|
|
14
16
|
publicStream;
|
|
15
17
|
tradeStream;
|
|
16
|
-
logger;
|
|
17
|
-
onNotify;
|
|
18
18
|
constructor(args) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
this.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
this.
|
|
19
|
+
super(args);
|
|
20
|
+
const isDemoMode = args.config.isDemoMode === true;
|
|
21
|
+
this.isDemoMode = isDemoMode;
|
|
22
|
+
const baseUrl = isDemoMode ? bybit_1.BYBIT_DEMO_BASE_URL : bybit_1.BYBIT_BASE_URL;
|
|
23
|
+
const publicWebSocketUrl = isDemoMode ? bybit_1.BYBIT_DEMO_PUBLIC_LINEAR_WEBSOCKET_URL : bybit_1.BYBIT_PUBLIC_LINEAR_WEBSOCKET_URL;
|
|
24
|
+
this.httpClient = new BybitHttpClient_1.BybitHttpClient({
|
|
25
|
+
baseUrl,
|
|
25
26
|
apiKey: args.config.apiKey,
|
|
26
27
|
secret: args.config.secret,
|
|
27
28
|
logger: args.logger,
|
|
28
|
-
onNotify: args.onNotify,
|
|
29
29
|
});
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return this.markets;
|
|
30
|
+
this.publicStream = new BybitPublicStream_1.BybitPublicStream(publicWebSocketUrl, args.logger, args.onNotify);
|
|
31
|
+
if (isDemoMode) {
|
|
32
|
+
this.tradeStream = null;
|
|
34
33
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
34
|
+
else {
|
|
35
|
+
this.tradeStream = new BybitTradeStream_1.BybitTradeStream({
|
|
36
|
+
url: bybit_1.BYBIT_TRADE_WEBSOCKET_URL,
|
|
37
|
+
apiKey: args.config.apiKey,
|
|
38
|
+
secret: args.config.secret,
|
|
39
|
+
logger: args.logger,
|
|
40
|
+
onNotify: args.onNotify,
|
|
41
|
+
});
|
|
40
42
|
}
|
|
41
|
-
this.logger.info(`Loaded ${this.markets.size} linear markets`);
|
|
42
|
-
return this.markets;
|
|
43
43
|
}
|
|
44
|
-
|
|
45
|
-
this.
|
|
44
|
+
getPublicStream() {
|
|
45
|
+
return this.publicStream;
|
|
46
|
+
}
|
|
47
|
+
async fetchAndNormalizeTradeSymbols() {
|
|
48
|
+
const raw = await this.httpClient.fetchInstrumentsInfo('linear');
|
|
49
|
+
return (0, bybitNormalizer_1.normalizeBybitTradeSymbols)(raw.result.list);
|
|
50
|
+
}
|
|
51
|
+
async fetchAndNormalizeTickers() {
|
|
46
52
|
const raw = await this.httpClient.fetchTickers('linear');
|
|
47
53
|
return (0, bybitNormalizer_1.normalizeBybitTickers)(raw.result.list);
|
|
48
54
|
}
|
|
49
|
-
async
|
|
50
|
-
this.logger.debug(`Fetching klines for ${symbol} ${interval}`);
|
|
55
|
+
async fetchAndNormalizeKlines(symbol, interval, options) {
|
|
51
56
|
const bybitInterval = bybit_1.BYBIT_KLINE_INTERVAL[interval];
|
|
52
|
-
const raw = await this.httpClient.fetchKline(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
57
|
+
const raw = await this.httpClient.fetchKline({
|
|
58
|
+
category: 'linear',
|
|
59
|
+
symbol,
|
|
60
|
+
interval: bybitInterval,
|
|
61
|
+
options,
|
|
56
62
|
});
|
|
57
63
|
return (0, bybitNormalizer_1.normalizeBybitKlines)(raw.result.list);
|
|
58
64
|
}
|
|
59
|
-
async
|
|
60
|
-
this.
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
subscribeKlines(args) {
|
|
64
|
-
this.publicStream.subscribeKlines(args.symbol, args.interval, args.handler);
|
|
65
|
-
}
|
|
66
|
-
unsubscribeKlines(args) {
|
|
67
|
-
this.publicStream.unsubscribeKlines(args.symbol, args.interval, args.handler);
|
|
65
|
+
async fetchAndNormalizeBalance() {
|
|
66
|
+
const raw = await this.httpClient.fetchWalletBalance('UNIFIED');
|
|
67
|
+
return (0, bybitNormalizer_1.normalizeBybitBalance)(raw.result);
|
|
68
68
|
}
|
|
69
|
-
async
|
|
70
|
-
this.logger.debug(`Creating order via WS: ${args.symbol}`);
|
|
69
|
+
async createOrderWebSocket(args) {
|
|
71
70
|
const orderParams = {
|
|
72
71
|
category: 'linear',
|
|
73
72
|
symbol: args.symbol,
|
|
74
|
-
orderType: args.type ===
|
|
75
|
-
side: args.side ===
|
|
73
|
+
orderType: args.type === common_1.OrderType.Market ? 'Market' : 'Limit',
|
|
74
|
+
side: args.side === common_1.OrderSide.Buy ? 'Buy' : 'Sell',
|
|
76
75
|
qty: this.amountToPrecision(args.symbol, args.amount),
|
|
77
76
|
...args.params,
|
|
78
77
|
};
|
|
79
78
|
if (args.price > 0) {
|
|
80
79
|
orderParams.price = this.priceToPrecision(args.symbol, args.price);
|
|
81
80
|
}
|
|
82
|
-
|
|
81
|
+
if (this.tradeStream !== null) {
|
|
82
|
+
this.logger.debug(`Creating order via WebSocket: ${args.symbol}`);
|
|
83
|
+
return this.tradeStream.createOrder(orderParams);
|
|
84
|
+
}
|
|
85
|
+
this.logger.debug(`Creating order via REST: ${args.symbol}`);
|
|
86
|
+
const raw = await this.httpClient.createOrder(orderParams);
|
|
87
|
+
return (0, bybitNormalizer_1.buildBybitOrderFromCreateResponse)(args, raw.result.orderId);
|
|
88
|
+
}
|
|
89
|
+
async fetchFundingRateHistory() {
|
|
90
|
+
throw new Error('Not implemented for Bybit');
|
|
83
91
|
}
|
|
84
92
|
async fetchPosition(symbol) {
|
|
85
93
|
this.logger.debug(`Fetching position for ${symbol}`);
|
|
@@ -92,38 +100,25 @@ class BybitLinear {
|
|
|
92
100
|
}
|
|
93
101
|
async setLeverage(leverage, symbol) {
|
|
94
102
|
this.logger.info(`Setting leverage to ${leverage}x for ${symbol}`);
|
|
95
|
-
await this.httpClient.setLeverage('linear', symbol, leverage, leverage);
|
|
103
|
+
await this.httpClient.setLeverage({ category: 'linear', symbol, buyLeverage: leverage, sellLeverage: leverage });
|
|
96
104
|
}
|
|
97
105
|
async setMarginMode(marginMode, symbol) {
|
|
98
106
|
this.logger.info(`Setting margin mode to ${marginMode} for ${symbol}`);
|
|
99
|
-
const tradeMode = marginMode ===
|
|
107
|
+
const tradeMode = marginMode === common_1.MarginMode.Isolated ? 1 : 0;
|
|
100
108
|
const defaultLeverage = 10;
|
|
101
|
-
await this.httpClient.switchIsolated(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
amountToPrecision(symbol, amount) {
|
|
109
|
-
const market = this.markets.get(symbol);
|
|
110
|
-
if (!market) {
|
|
111
|
-
this.logger.warn(`Market ${symbol} not found, using raw amount`);
|
|
112
|
-
return String(amount);
|
|
113
|
-
}
|
|
114
|
-
return (0, precision_1.amountToPrecision)(market, amount);
|
|
115
|
-
}
|
|
116
|
-
priceToPrecision(symbol, price) {
|
|
117
|
-
const market = this.markets.get(symbol);
|
|
118
|
-
if (!market) {
|
|
119
|
-
this.logger.warn(`Market ${symbol} not found, using raw price`);
|
|
120
|
-
return String(price);
|
|
121
|
-
}
|
|
122
|
-
return (0, precision_1.priceToPrecision)(market, price);
|
|
109
|
+
await this.httpClient.switchIsolated({
|
|
110
|
+
category: 'linear',
|
|
111
|
+
symbol,
|
|
112
|
+
tradeMode,
|
|
113
|
+
buyLeverage: defaultLeverage,
|
|
114
|
+
sellLeverage: defaultLeverage,
|
|
115
|
+
});
|
|
123
116
|
}
|
|
124
117
|
async close() {
|
|
125
118
|
this.logger.info('Closing Bybit Linear connection');
|
|
126
|
-
this.tradeStream
|
|
119
|
+
if (this.tradeStream !== null) {
|
|
120
|
+
this.tradeStream.disconnect();
|
|
121
|
+
}
|
|
127
122
|
this.publicStream.close();
|
|
128
123
|
}
|
|
129
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BybitLinear.js","sourceRoot":"","sources":["../../src/exchanges/BybitLinear.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"BybitLinear.js","sourceRoot":"","sources":["../../src/exchanges/BybitLinear.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,24 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { Kline, KlineInterval,
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
private
|
|
1
|
+
import type { CreateOrderWebSocketArgs, ExchangeArgs, FetchPageWithLimitArgs } from '../types/exchange';
|
|
2
|
+
import type { Kline, KlineInterval, TradeSymbolBySymbol, TickerBySymbol, BalanceByAsset, Position, Order, FundingRateHistory } from '../types/common';
|
|
3
|
+
import { MarginMode } from '../types/common';
|
|
4
|
+
import type { PublicStreamLike } from '../types/stream';
|
|
5
|
+
import { BaseExchangeClient } from './BaseExchangeClient';
|
|
6
|
+
declare class BybitSpot extends BaseExchangeClient {
|
|
7
|
+
protected readonly marketLabel = "spot";
|
|
8
|
+
protected readonly klineLimit = 200;
|
|
9
|
+
private readonly httpClient;
|
|
10
|
+
private readonly publicStream;
|
|
10
11
|
constructor(args: ExchangeArgs);
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
protected getPublicStream(): PublicStreamLike;
|
|
13
|
+
protected fetchAndNormalizeTradeSymbols(): Promise<TradeSymbolBySymbol>;
|
|
14
|
+
protected fetchAndNormalizeTickers(): Promise<TickerBySymbol>;
|
|
15
|
+
protected fetchAndNormalizeKlines(symbol: string, interval: KlineInterval, options?: FetchPageWithLimitArgs): Promise<Kline[]>;
|
|
16
|
+
protected fetchAndNormalizeBalance(): Promise<BalanceByAsset>;
|
|
17
|
+
createOrderWebSocket(args: CreateOrderWebSocketArgs): Promise<Order>;
|
|
18
|
+
fetchFundingRateHistory(): Promise<FundingRateHistory[]>;
|
|
18
19
|
fetchPosition(_symbol: string): Promise<Position>;
|
|
19
20
|
setLeverage(_leverage: number, _symbol: string): Promise<void>;
|
|
20
21
|
setMarginMode(_marginMode: MarginMode, _symbol: string): Promise<void>;
|
|
21
|
-
fetchBalance(): Promise<BalanceByAsset>;
|
|
22
|
-
amountToPrecision(symbol: string, amount: number): string;
|
|
23
|
-
priceToPrecision(symbol: string, price: number): string;
|
|
24
22
|
close(): Promise<void>;
|
|
25
23
|
}
|
|
26
24
|
export { BybitSpot };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BybitSpot.d.ts","sourceRoot":"","sources":["../../src/exchanges/BybitSpot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"BybitSpot.d.ts","sourceRoot":"","sources":["../../src/exchanges/BybitSpot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACxG,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,QAAQ,EACR,KAAK,EACL,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAwB,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAiBxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,cAAM,SAAU,SAAQ,kBAAkB;IACxC,SAAS,CAAC,QAAQ,CAAC,WAAW,UAAU;IACxC,SAAS,CAAC,QAAQ,CAAC,UAAU,OAAO;IAEpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;gBAErC,IAAI,EAAE,YAAY;IAqB9B,SAAS,CAAC,eAAe,IAAI,gBAAgB;cAI7B,6BAA6B,IAAI,OAAO,CAAC,mBAAmB,CAAC;cAM7D,wBAAwB,IAAI,OAAO,CAAC,cAAc,CAAC;cAMnD,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;cAYH,wBAAwB,IAAI,OAAO,CAAC,cAAc,CAAC;IAM7D,oBAAoB,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,KAAK,CAAC;IA2BpE,uBAAuB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAIxD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIjD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,aAAa,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -1,78 +1,77 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BybitSpot = void 0;
|
|
4
|
+
const common_1 = require("../types/common");
|
|
4
5
|
const BybitHttpClient_1 = require("../http/BybitHttpClient");
|
|
5
6
|
const bybitNormalizer_1 = require("../normalizers/bybitNormalizer");
|
|
6
7
|
const BybitPublicStream_1 = require("../ws/BybitPublicStream");
|
|
7
8
|
const bybit_1 = require("../constants/bybit");
|
|
8
|
-
const
|
|
9
|
-
class BybitSpot {
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
const BaseExchangeClient_1 = require("./BaseExchangeClient");
|
|
10
|
+
class BybitSpot extends BaseExchangeClient_1.BaseExchangeClient {
|
|
11
|
+
marketLabel = 'spot';
|
|
12
|
+
klineLimit = 200;
|
|
12
13
|
httpClient;
|
|
13
14
|
publicStream;
|
|
14
|
-
logger;
|
|
15
|
-
onNotify;
|
|
16
15
|
constructor(args) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
this.
|
|
16
|
+
super(args);
|
|
17
|
+
const isDemoMode = args.config.isDemoMode === true;
|
|
18
|
+
const baseUrl = isDemoMode ? bybit_1.BYBIT_DEMO_BASE_URL : bybit_1.BYBIT_BASE_URL;
|
|
19
|
+
const publicWebSocketUrl = isDemoMode ? bybit_1.BYBIT_DEMO_PUBLIC_SPOT_WEBSOCKET_URL : bybit_1.BYBIT_PUBLIC_SPOT_WEBSOCKET_URL;
|
|
20
|
+
this.httpClient = new BybitHttpClient_1.BybitHttpClient({
|
|
21
|
+
baseUrl,
|
|
22
|
+
apiKey: args.config.apiKey,
|
|
23
|
+
secret: args.config.secret,
|
|
24
|
+
logger: args.logger,
|
|
25
|
+
});
|
|
26
|
+
this.publicStream = new BybitPublicStream_1.BybitPublicStream(publicWebSocketUrl, args.logger, args.onNotify);
|
|
22
27
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
this.logger.info('Loading spot markets');
|
|
28
|
+
getPublicStream() {
|
|
29
|
+
return this.publicStream;
|
|
30
|
+
}
|
|
31
|
+
async fetchAndNormalizeTradeSymbols() {
|
|
28
32
|
const raw = await this.httpClient.fetchInstrumentsInfo('spot');
|
|
29
|
-
|
|
30
|
-
for (const [symbol, market] of normalized) {
|
|
31
|
-
this.markets.set(symbol, market);
|
|
32
|
-
}
|
|
33
|
-
this.logger.info(`Loaded ${this.markets.size} spot markets`);
|
|
34
|
-
return this.markets;
|
|
33
|
+
return (0, bybitNormalizer_1.normalizeBybitTradeSymbols)(raw.result.list);
|
|
35
34
|
}
|
|
36
|
-
async
|
|
37
|
-
this.logger.debug('Fetching spot tickers');
|
|
35
|
+
async fetchAndNormalizeTickers() {
|
|
38
36
|
const raw = await this.httpClient.fetchTickers('spot');
|
|
39
37
|
return (0, bybitNormalizer_1.normalizeBybitTickers)(raw.result.list);
|
|
40
38
|
}
|
|
41
|
-
async
|
|
42
|
-
this.logger.debug(`Fetching klines for ${symbol} ${interval}`);
|
|
39
|
+
async fetchAndNormalizeKlines(symbol, interval, options) {
|
|
43
40
|
const bybitInterval = bybit_1.BYBIT_KLINE_INTERVAL[interval];
|
|
44
|
-
const raw = await this.httpClient.fetchKline(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
41
|
+
const raw = await this.httpClient.fetchKline({
|
|
42
|
+
category: 'spot',
|
|
43
|
+
symbol,
|
|
44
|
+
interval: bybitInterval,
|
|
45
|
+
options,
|
|
48
46
|
});
|
|
49
47
|
return (0, bybitNormalizer_1.normalizeBybitKlines)(raw.result.list);
|
|
50
48
|
}
|
|
51
|
-
async
|
|
52
|
-
this.
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
subscribeKlines(args) {
|
|
56
|
-
this.publicStream.subscribeKlines(args.symbol, args.interval, args.handler);
|
|
57
|
-
}
|
|
58
|
-
unsubscribeKlines(args) {
|
|
59
|
-
this.publicStream.unsubscribeKlines(args.symbol, args.interval, args.handler);
|
|
49
|
+
async fetchAndNormalizeBalance() {
|
|
50
|
+
const raw = await this.httpClient.fetchWalletBalance('UNIFIED');
|
|
51
|
+
return (0, bybitNormalizer_1.normalizeBybitBalance)(raw.result);
|
|
60
52
|
}
|
|
61
|
-
async
|
|
53
|
+
async createOrderWebSocket(args) {
|
|
62
54
|
this.logger.debug(`Creating order via REST: ${args.symbol}`);
|
|
55
|
+
const isMarket = args.type === common_1.OrderType.Market;
|
|
63
56
|
const orderParams = {
|
|
64
57
|
category: 'spot',
|
|
65
58
|
symbol: args.symbol,
|
|
66
|
-
orderType:
|
|
67
|
-
side: args.side ===
|
|
59
|
+
orderType: isMarket ? 'Market' : 'Limit',
|
|
60
|
+
side: args.side === common_1.OrderSide.Buy ? 'Buy' : 'Sell',
|
|
68
61
|
qty: this.amountToPrecision(args.symbol, args.amount),
|
|
69
62
|
...args.params,
|
|
70
63
|
};
|
|
64
|
+
if (isMarket) {
|
|
65
|
+
orderParams.marketUnit = 'baseCoin';
|
|
66
|
+
}
|
|
71
67
|
if (args.price > 0) {
|
|
72
68
|
orderParams.price = this.priceToPrecision(args.symbol, args.price);
|
|
73
69
|
}
|
|
74
70
|
const raw = await this.httpClient.createOrder(orderParams);
|
|
75
|
-
return (0, bybitNormalizer_1.
|
|
71
|
+
return (0, bybitNormalizer_1.buildBybitOrderFromCreateResponse)(args, raw.result.orderId);
|
|
72
|
+
}
|
|
73
|
+
async fetchFundingRateHistory() {
|
|
74
|
+
throw new Error('Not supported for spot market');
|
|
76
75
|
}
|
|
77
76
|
async fetchPosition(_symbol) {
|
|
78
77
|
throw new Error('Not supported for spot market');
|
|
@@ -83,27 +82,6 @@ class BybitSpot {
|
|
|
83
82
|
async setMarginMode(_marginMode, _symbol) {
|
|
84
83
|
throw new Error('Not supported for spot market');
|
|
85
84
|
}
|
|
86
|
-
async fetchBalance() {
|
|
87
|
-
this.logger.debug('Fetching balance');
|
|
88
|
-
const raw = await this.httpClient.fetchWalletBalance('UNIFIED');
|
|
89
|
-
return (0, bybitNormalizer_1.normalizeBybitBalance)(raw.result);
|
|
90
|
-
}
|
|
91
|
-
amountToPrecision(symbol, amount) {
|
|
92
|
-
const market = this.markets.get(symbol);
|
|
93
|
-
if (!market) {
|
|
94
|
-
this.logger.warn(`Market ${symbol} not found, using raw amount`);
|
|
95
|
-
return String(amount);
|
|
96
|
-
}
|
|
97
|
-
return (0, precision_1.amountToPrecision)(market, amount);
|
|
98
|
-
}
|
|
99
|
-
priceToPrecision(symbol, price) {
|
|
100
|
-
const market = this.markets.get(symbol);
|
|
101
|
-
if (!market) {
|
|
102
|
-
this.logger.warn(`Market ${symbol} not found, using raw price`);
|
|
103
|
-
return String(price);
|
|
104
|
-
}
|
|
105
|
-
return (0, precision_1.priceToPrecision)(market, price);
|
|
106
|
-
}
|
|
107
85
|
async close() {
|
|
108
86
|
this.logger.info('Closing Bybit Spot connection');
|
|
109
87
|
this.publicStream.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BybitSpot.js","sourceRoot":"","sources":["../../src/exchanges/BybitSpot.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"BybitSpot.js","sourceRoot":"","sources":["../../src/exchanges/BybitSpot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Exchange.d.ts","sourceRoot":"","sources":["../../src/exchanges/Exchange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,
|
|
1
|
+
{"version":3,"file":"Exchange.d.ts","sourceRoot":"","sources":["../../src/exchanges/Exchange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM/C,cAAM,QAAQ;IACZ,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;gBAElB,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY;IAgB5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Exchange = void 0;
|
|
4
|
+
const common_1 = require("../types/common");
|
|
4
5
|
const BinanceFutures_1 = require("./BinanceFutures");
|
|
5
6
|
const BinanceSpot_1 = require("./BinanceSpot");
|
|
6
7
|
const BybitLinear_1 = require("./BybitLinear");
|
|
@@ -11,11 +12,11 @@ class Exchange {
|
|
|
11
12
|
spot;
|
|
12
13
|
constructor(name, args) {
|
|
13
14
|
this.name = name;
|
|
14
|
-
if (name ===
|
|
15
|
+
if (name === common_1.ExchangeName.Binance) {
|
|
15
16
|
this.futures = new BinanceFutures_1.BinanceFutures(args);
|
|
16
17
|
this.spot = new BinanceSpot_1.BinanceSpot(args);
|
|
17
18
|
}
|
|
18
|
-
else if (name ===
|
|
19
|
+
else if (name === common_1.ExchangeName.Bybit) {
|
|
19
20
|
this.futures = new BybitLinear_1.BybitLinear(args);
|
|
20
21
|
this.spot = new BybitSpot_1.BybitSpot(args);
|
|
21
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Exchange.js","sourceRoot":"","sources":["../../src/exchanges/Exchange.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"Exchange.js","sourceRoot":"","sources":["../../src/exchanges/Exchange.ts"],"names":[],"mappings":";;;AACA,4CAA+C;AAC/C,qDAAkD;AAClD,+CAA4C;AAC5C,+CAA4C;AAC5C,2CAAwC;AAExC,MAAM,QAAQ;IACH,IAAI,CAAe;IACnB,OAAO,CAAiB;IACxB,IAAI,CAAiB;IAE9B,YAAY,IAAkB,EAAE,IAAkB;QAChD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,IAAI,KAAK,qBAAY,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,GAAG,IAAI,+BAAc,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,IAAI,KAAK,qBAAY,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,MAAM,eAAe,GAAU,IAAI,CAAC;YAEpC,MAAM,IAAI,KAAK,CAAC,qBAAqB,eAAe,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;CACF;AAEQ,4BAAQ"}
|
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
import { AxiosInstance } from 'axios';
|
|
2
2
|
import { ExchangeLogger } from '../types/common';
|
|
3
|
+
interface BaseHttpClientArgs {
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
logger: ExchangeLogger;
|
|
7
|
+
timeout?: number;
|
|
8
|
+
}
|
|
3
9
|
export declare abstract class BaseHttpClient {
|
|
4
10
|
protected readonly axiosInstance: AxiosInstance;
|
|
5
11
|
protected readonly logger: ExchangeLogger;
|
|
6
12
|
protected readonly apiKey: string;
|
|
7
|
-
constructor(
|
|
13
|
+
constructor(args: BaseHttpClientArgs);
|
|
8
14
|
protected get<T>(url: string, params?: Record<string, string | number | boolean>, headers?: Record<string, string>): Promise<T>;
|
|
9
15
|
protected post<T>(url: string, data?: Record<string, unknown>, headers?: Record<string, string>): Promise<T>;
|
|
16
|
+
protected postWithParams<T>(url: string, params?: Record<string, string | number | boolean>, headers?: Record<string, string>): Promise<T>;
|
|
10
17
|
protected put<T>(url: string, data?: Record<string, unknown>, headers?: Record<string, string>): Promise<T>;
|
|
18
|
+
protected putWithParams<T>(url: string, params?: Record<string, string | number | boolean>, headers?: Record<string, string>): Promise<T>;
|
|
11
19
|
protected delete<T>(url: string, params?: Record<string, string | number | boolean>, headers?: Record<string, string>): Promise<T>;
|
|
12
20
|
private handleError;
|
|
13
21
|
}
|
|
22
|
+
export {};
|
|
14
23
|
//# sourceMappingURL=BaseHttpClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseHttpClient.d.ts","sourceRoot":"","sources":["../../src/http/BaseHttpClient.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAc,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AA+BjD,8BAAsB,cAAc;IAClC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEtB,
|
|
1
|
+
{"version":3,"file":"BaseHttpClient.d.ts","sourceRoot":"","sources":["../../src/http/BaseHttpClient.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAc,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AA+BjD,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8BAAsB,cAAc;IAClC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEtB,IAAI,EAAE,kBAAkB;cASpB,GAAG,CAAC,CAAC,EACnB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EAClD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;cAwBG,IAAI,CAAC,CAAC,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;cAaG,cAAc,CAAC,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EAClD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;cAaG,GAAG,CAAC,CAAC,EACnB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;cAaG,aAAa,CAAC,CAAC,EAC7B,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EAClD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;cAaG,MAAM,CAAC,CAAC,EACtB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EAClD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;IAab,OAAO,CAAC,WAAW;CAWpB"}
|
|
@@ -30,12 +30,12 @@ class BaseHttpClient {
|
|
|
30
30
|
axiosInstance;
|
|
31
31
|
logger;
|
|
32
32
|
apiKey;
|
|
33
|
-
constructor(
|
|
34
|
-
this.apiKey = apiKey;
|
|
35
|
-
this.logger = logger;
|
|
33
|
+
constructor(args) {
|
|
34
|
+
this.apiKey = args.apiKey;
|
|
35
|
+
this.logger = args.logger;
|
|
36
36
|
this.axiosInstance = axios_1.default.create({
|
|
37
|
-
baseURL,
|
|
38
|
-
timeout: timeout ?? 30000,
|
|
37
|
+
baseURL: args.baseUrl,
|
|
38
|
+
timeout: args.timeout ?? 30000,
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
41
|
async get(url, params, headers) {
|
|
@@ -69,6 +69,17 @@ class BaseHttpClient {
|
|
|
69
69
|
throw error;
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
|
+
async postWithParams(url, params, headers) {
|
|
73
|
+
try {
|
|
74
|
+
this.logger.debug(`POST ${url} with params: ${JSON.stringify(params)}`);
|
|
75
|
+
const response = await this.axiosInstance.post(url, null, { params, headers });
|
|
76
|
+
return response.data;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
this.handleError(error);
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
72
83
|
async put(url, data, headers) {
|
|
73
84
|
try {
|
|
74
85
|
this.logger.debug(`PUT ${url} with data: ${JSON.stringify(data)}`);
|
|
@@ -80,6 +91,17 @@ class BaseHttpClient {
|
|
|
80
91
|
throw error;
|
|
81
92
|
}
|
|
82
93
|
}
|
|
94
|
+
async putWithParams(url, params, headers) {
|
|
95
|
+
try {
|
|
96
|
+
this.logger.debug(`PUT ${url} with params: ${JSON.stringify(params)}`);
|
|
97
|
+
const response = await this.axiosInstance.put(url, null, { params, headers });
|
|
98
|
+
return response.data;
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
this.handleError(error);
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
83
105
|
async delete(url, params, headers) {
|
|
84
106
|
try {
|
|
85
107
|
this.logger.debug(`DELETE ${url} with params: ${JSON.stringify(params)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseHttpClient.js","sourceRoot":"","sources":["../../src/http/BaseHttpClient.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAyD;AAGzD,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,SAAS,WAAW,CAAC,KAAiB;IACpC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;IAErC,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,CAAC;AACzC,CAAC;AAED,SAAS,eAAe,CAAC,KAAiB,EAAE,OAAe;IACzD,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAE5D,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;
|
|
1
|
+
{"version":3,"file":"BaseHttpClient.js","sourceRoot":"","sources":["../../src/http/BaseHttpClient.ts"],"names":[],"mappings":"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"}
|