@solncebro/exchange-engine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +390 -0
  4. package/dist/auth/binanceAuth.d.ts +9 -0
  5. package/dist/auth/binanceAuth.d.ts.map +1 -0
  6. package/dist/auth/binanceAuth.js +31 -0
  7. package/dist/auth/binanceAuth.js.map +1 -0
  8. package/dist/auth/bybitAuth.d.ts +10 -0
  9. package/dist/auth/bybitAuth.d.ts.map +1 -0
  10. package/dist/auth/bybitAuth.js +23 -0
  11. package/dist/auth/bybitAuth.js.map +1 -0
  12. package/dist/constants/binance.d.ts +9 -0
  13. package/dist/constants/binance.d.ts.map +1 -0
  14. package/dist/constants/binance.js +28 -0
  15. package/dist/constants/binance.js.map +1 -0
  16. package/dist/constants/bybit.d.ts +14 -0
  17. package/dist/constants/bybit.d.ts.map +1 -0
  18. package/dist/constants/bybit.js +33 -0
  19. package/dist/constants/bybit.js.map +1 -0
  20. package/dist/exchanges/BinanceFutures.d.ts +28 -0
  21. package/dist/exchanges/BinanceFutures.d.ts.map +1 -0
  22. package/dist/exchanges/BinanceFutures.js +125 -0
  23. package/dist/exchanges/BinanceFutures.js.map +1 -0
  24. package/dist/exchanges/BinanceSpot.d.ts +28 -0
  25. package/dist/exchanges/BinanceSpot.d.ts.map +1 -0
  26. package/dist/exchanges/BinanceSpot.js +116 -0
  27. package/dist/exchanges/BinanceSpot.js.map +1 -0
  28. package/dist/exchanges/BybitLinear.d.ts +28 -0
  29. package/dist/exchanges/BybitLinear.d.ts.map +1 -0
  30. package/dist/exchanges/BybitLinear.js +131 -0
  31. package/dist/exchanges/BybitLinear.js.map +1 -0
  32. package/dist/exchanges/BybitSpot.d.ts +27 -0
  33. package/dist/exchanges/BybitSpot.d.ts.map +1 -0
  34. package/dist/exchanges/BybitSpot.js +113 -0
  35. package/dist/exchanges/BybitSpot.js.map +1 -0
  36. package/dist/exchanges/Exchange.d.ts +11 -0
  37. package/dist/exchanges/Exchange.d.ts.map +1 -0
  38. package/dist/exchanges/Exchange.js +32 -0
  39. package/dist/exchanges/Exchange.js.map +1 -0
  40. package/dist/http/BaseHttpClient.d.ts +14 -0
  41. package/dist/http/BaseHttpClient.d.ts.map +1 -0
  42. package/dist/http/BaseHttpClient.js +77 -0
  43. package/dist/http/BaseHttpClient.js.map +1 -0
  44. package/dist/http/BinanceFuturesHttpClient.d.ts +53 -0
  45. package/dist/http/BinanceFuturesHttpClient.d.ts.map +1 -0
  46. package/dist/http/BinanceFuturesHttpClient.js +235 -0
  47. package/dist/http/BinanceFuturesHttpClient.js.map +1 -0
  48. package/dist/http/BinanceSpotHttpClient.d.ts +26 -0
  49. package/dist/http/BinanceSpotHttpClient.d.ts.map +1 -0
  50. package/dist/http/BinanceSpotHttpClient.js +98 -0
  51. package/dist/http/BinanceSpotHttpClient.js.map +1 -0
  52. package/dist/http/BybitHttpClient.d.ts +143 -0
  53. package/dist/http/BybitHttpClient.d.ts.map +1 -0
  54. package/dist/http/BybitHttpClient.js +233 -0
  55. package/dist/http/BybitHttpClient.js.map +1 -0
  56. package/dist/index.d.ts +4 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +6 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/normalizers/binanceNormalizer.d.ts +79 -0
  61. package/dist/normalizers/binanceNormalizer.d.ts.map +1 -0
  62. package/dist/normalizers/binanceNormalizer.js +133 -0
  63. package/dist/normalizers/binanceNormalizer.js.map +1 -0
  64. package/dist/normalizers/bybitNormalizer.d.ts +79 -0
  65. package/dist/normalizers/bybitNormalizer.d.ts.map +1 -0
  66. package/dist/normalizers/bybitNormalizer.js +150 -0
  67. package/dist/normalizers/bybitNormalizer.js.map +1 -0
  68. package/dist/precision/precision.d.ts +6 -0
  69. package/dist/precision/precision.d.ts.map +1 -0
  70. package/dist/precision/precision.js +29 -0
  71. package/dist/precision/precision.js.map +1 -0
  72. package/dist/types/common.d.ts +86 -0
  73. package/dist/types/common.d.ts.map +1 -0
  74. package/dist/types/common.js +3 -0
  75. package/dist/types/common.js.map +1 -0
  76. package/dist/types/exchange.d.ts +43 -0
  77. package/dist/types/exchange.d.ts.map +1 -0
  78. package/dist/types/exchange.js +3 -0
  79. package/dist/types/exchange.js.map +1 -0
  80. package/dist/types/index.d.ts +3 -0
  81. package/dist/types/index.d.ts.map +1 -0
  82. package/dist/types/index.js +3 -0
  83. package/dist/types/index.js.map +1 -0
  84. package/dist/ws/BinanceFuturesPublicStream.d.ts +30 -0
  85. package/dist/ws/BinanceFuturesPublicStream.d.ts.map +1 -0
  86. package/dist/ws/BinanceFuturesPublicStream.js +216 -0
  87. package/dist/ws/BinanceFuturesPublicStream.js.map +1 -0
  88. package/dist/ws/BinanceSpotPublicStream.d.ts +24 -0
  89. package/dist/ws/BinanceSpotPublicStream.d.ts.map +1 -0
  90. package/dist/ws/BinanceSpotPublicStream.js +186 -0
  91. package/dist/ws/BinanceSpotPublicStream.js.map +1 -0
  92. package/dist/ws/BinanceUserDataStream.d.ts +23 -0
  93. package/dist/ws/BinanceUserDataStream.d.ts.map +1 -0
  94. package/dist/ws/BinanceUserDataStream.js +48 -0
  95. package/dist/ws/BinanceUserDataStream.js.map +1 -0
  96. package/dist/ws/BybitPrivateStream.d.ts +25 -0
  97. package/dist/ws/BybitPrivateStream.d.ts.map +1 -0
  98. package/dist/ws/BybitPrivateStream.js +79 -0
  99. package/dist/ws/BybitPrivateStream.js.map +1 -0
  100. package/dist/ws/BybitPublicStream.d.ts +25 -0
  101. package/dist/ws/BybitPublicStream.d.ts.map +1 -0
  102. package/dist/ws/BybitPublicStream.js +178 -0
  103. package/dist/ws/BybitPublicStream.js.map +1 -0
  104. package/dist/ws/BybitTradeStream.d.ts +27 -0
  105. package/dist/ws/BybitTradeStream.d.ts.map +1 -0
  106. package/dist/ws/BybitTradeStream.js +146 -0
  107. package/dist/ws/BybitTradeStream.js.map +1 -0
  108. package/package.json +58 -0
@@ -0,0 +1,25 @@
1
+ import type { ExchangeLogger, Kline, KlineInterval, TickerBySymbol } from '../types/common';
2
+ declare class BybitPublicStream {
3
+ private ws;
4
+ private readonly url;
5
+ private readonly logger;
6
+ private readonly onNotify?;
7
+ private readonly tickerHandlerSet;
8
+ private readonly klineHandlerByKey;
9
+ private readonly activeSubscriptionSet;
10
+ constructor(url: string, logger: ExchangeLogger, onNotify?: (message: string) => void | Promise<void>);
11
+ subscribeAllTickers(handler: (tickers: TickerBySymbol) => void): void;
12
+ unsubscribeAllTickers(handler: (tickers: TickerBySymbol) => void): void;
13
+ subscribeKlines(symbol: string, interval: KlineInterval, handler: (kline: Kline) => void): void;
14
+ unsubscribeKlines(symbol: string, interval: KlineInterval, handler: (kline: Kline) => void): void;
15
+ close(): void;
16
+ private ensureConnected;
17
+ private handleMessage;
18
+ private handleKlineMessage;
19
+ private resubscribeAll;
20
+ private sendSubscribe;
21
+ private sendUnsubscribe;
22
+ private resolveTickerTopic;
23
+ }
24
+ export { BybitPublicStream };
25
+ //# sourceMappingURL=BybitPublicStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BybitPublicStream.d.ts","sourceRoot":"","sources":["../../src/ws/BybitPublicStream.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAiC5F,cAAM,iBAAiB;IACrB,OAAO,CAAC,EAAE,CAAkD;IAC5D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAA4C;IACtE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqD;IACtF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuD;IACzF,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA0B;gBAEpD,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrG,mBAAmB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;IAOrE,qBAAqB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;IASvE,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAoB/F,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAuBjG,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,kBAAkB;CAG3B;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BybitPublicStream = void 0;
4
+ const websocket_engine_1 = require("@solncebro/websocket-engine");
5
+ const bybitNormalizer_1 = require("../normalizers/bybitNormalizer");
6
+ const bybit_1 = require("../constants/bybit");
7
+ function parseBybitMessage(rawData) {
8
+ return JSON.parse(rawData.toString());
9
+ }
10
+ function isBybitPongResponse(message) {
11
+ return message.op === 'pong' || message.ret_msg === 'pong';
12
+ }
13
+ function resolveUnifiedInterval(bybitInterval) {
14
+ for (const [unified, bybit] of Object.entries(bybit_1.BYBIT_KLINE_INTERVAL)) {
15
+ if (bybit === bybitInterval) {
16
+ return unified;
17
+ }
18
+ }
19
+ return '1m';
20
+ }
21
+ class BybitPublicStream {
22
+ ws = null;
23
+ url;
24
+ logger;
25
+ onNotify;
26
+ tickerHandlerSet = new Set();
27
+ klineHandlerByKey = new Map();
28
+ activeSubscriptionSet = new Set();
29
+ constructor(url, logger, onNotify) {
30
+ this.url = url;
31
+ this.logger = logger;
32
+ this.onNotify = onNotify;
33
+ }
34
+ subscribeAllTickers(handler) {
35
+ this.tickerHandlerSet.add(handler);
36
+ const topic = this.resolveTickerTopic();
37
+ this.activeSubscriptionSet.add(topic);
38
+ this.ensureConnected();
39
+ }
40
+ unsubscribeAllTickers(handler) {
41
+ this.tickerHandlerSet.delete(handler);
42
+ if (this.tickerHandlerSet.size === 0) {
43
+ const topic = this.resolveTickerTopic();
44
+ this.activeSubscriptionSet.delete(topic);
45
+ }
46
+ }
47
+ subscribeKlines(symbol, interval, handler) {
48
+ const key = `${symbol}_${interval}`;
49
+ if (!this.klineHandlerByKey.has(key)) {
50
+ this.klineHandlerByKey.set(key, new Set());
51
+ }
52
+ this.klineHandlerByKey.get(key).add(handler);
53
+ const bybitInterval = bybit_1.BYBIT_KLINE_INTERVAL[interval];
54
+ const topic = `kline.${bybitInterval}.${symbol}`;
55
+ this.activeSubscriptionSet.add(topic);
56
+ if (this.ws !== null) {
57
+ this.sendSubscribe([topic]);
58
+ }
59
+ else {
60
+ this.ensureConnected();
61
+ }
62
+ }
63
+ unsubscribeKlines(symbol, interval, handler) {
64
+ const key = `${symbol}_${interval}`;
65
+ const handlerSet = this.klineHandlerByKey.get(key);
66
+ if (!handlerSet) {
67
+ return;
68
+ }
69
+ handlerSet.delete(handler);
70
+ if (handlerSet.size === 0) {
71
+ this.klineHandlerByKey.delete(key);
72
+ const bybitInterval = bybit_1.BYBIT_KLINE_INTERVAL[interval];
73
+ const topic = `kline.${bybitInterval}.${symbol}`;
74
+ this.activeSubscriptionSet.delete(topic);
75
+ if (this.ws !== null) {
76
+ this.sendUnsubscribe([topic]);
77
+ }
78
+ }
79
+ }
80
+ close() {
81
+ if (this.ws !== null) {
82
+ this.ws.close();
83
+ this.ws = null;
84
+ }
85
+ }
86
+ ensureConnected() {
87
+ if (this.ws !== null) {
88
+ return;
89
+ }
90
+ this.ws = new websocket_engine_1.ReliableWebSocket({
91
+ label: 'BybitPublicStream',
92
+ url: this.url,
93
+ logger: this.logger,
94
+ parseMessage: parseBybitMessage,
95
+ onMessage: (message) => this.handleMessage(message),
96
+ onReconnectSuccess: () => this.resubscribeAll(),
97
+ onNotify: this.onNotify,
98
+ heartbeat: {
99
+ buildPayload: () => ({ op: 'ping' }),
100
+ isResponse: isBybitPongResponse,
101
+ },
102
+ configuration: {
103
+ pingInterval: 20000,
104
+ },
105
+ });
106
+ this.resubscribeAll();
107
+ }
108
+ handleMessage(message) {
109
+ if (message.op === 'subscribe' || message.op === 'unsubscribe') {
110
+ if (message.success) {
111
+ this.logger.debug(`Bybit subscription successful: ${message.op}`);
112
+ }
113
+ else {
114
+ this.logger.error(`Bybit subscription error: ${JSON.stringify(message)}`);
115
+ }
116
+ return;
117
+ }
118
+ if (!message.topic || !Array.isArray(message.data)) {
119
+ return;
120
+ }
121
+ const topic = message.topic;
122
+ if (topic.startsWith('tickers.')) {
123
+ const tickers = (0, bybitNormalizer_1.normalizeBybitTickers)(message.data);
124
+ for (const handler of this.tickerHandlerSet) {
125
+ handler(tickers);
126
+ }
127
+ return;
128
+ }
129
+ if (topic.startsWith('kline.')) {
130
+ this.handleKlineMessage(topic, message.data);
131
+ }
132
+ }
133
+ handleKlineMessage(topic, dataList) {
134
+ const partList = topic.split('.');
135
+ if (partList.length < 3) {
136
+ return;
137
+ }
138
+ const bybitInterval = partList[1];
139
+ const symbol = partList.slice(2).join('.');
140
+ const unifiedInterval = resolveUnifiedInterval(bybitInterval);
141
+ const key = `${symbol}_${unifiedInterval}`;
142
+ const handlerSet = this.klineHandlerByKey.get(key);
143
+ if (!handlerSet || dataList.length === 0) {
144
+ return;
145
+ }
146
+ const kline = (0, bybitNormalizer_1.normalizeBybitKlineWsMessage)(dataList[0]);
147
+ for (const handler of handlerSet) {
148
+ handler(kline);
149
+ }
150
+ }
151
+ resubscribeAll() {
152
+ const topicList = Array.from(this.activeSubscriptionSet);
153
+ if (topicList.length > 0) {
154
+ this.sendSubscribe(topicList);
155
+ }
156
+ }
157
+ sendSubscribe(topicList) {
158
+ try {
159
+ this.ws.sendToConnectedSocket({ op: 'subscribe', args: topicList });
160
+ }
161
+ catch {
162
+ this.logger.warn('BybitPublicStream: failed to subscribe, socket not connected');
163
+ }
164
+ }
165
+ sendUnsubscribe(topicList) {
166
+ try {
167
+ this.ws.sendToConnectedSocket({ op: 'unsubscribe', args: topicList });
168
+ }
169
+ catch {
170
+ this.logger.warn('BybitPublicStream: failed to unsubscribe, socket not connected');
171
+ }
172
+ }
173
+ resolveTickerTopic() {
174
+ return this.url.includes('linear') ? 'tickers.linear' : 'tickers.spot';
175
+ }
176
+ }
177
+ exports.BybitPublicStream = BybitPublicStream;
178
+ //# sourceMappingURL=BybitPublicStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BybitPublicStream.js","sourceRoot":"","sources":["../../src/ws/BybitPublicStream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ExchangeLogger, Order } from '../types/common';
2
+ interface BybitTradeStreamArgs {
3
+ apiKey: string;
4
+ secret: string;
5
+ logger: ExchangeLogger;
6
+ onNotify?: (message: string) => void | Promise<void>;
7
+ }
8
+ declare class BybitTradeStream {
9
+ private ws;
10
+ private readonly logger;
11
+ private readonly apiKey;
12
+ private readonly secret;
13
+ private readonly onNotify?;
14
+ private readonly pendingRequestByReqId;
15
+ private connectPromise;
16
+ constructor(args: BybitTradeStreamArgs);
17
+ createOrder(orderParams: Record<string, unknown>): Promise<Order>;
18
+ disconnect(): void;
19
+ isConnected(): boolean;
20
+ private ensureConnected;
21
+ private initConnection;
22
+ private authenticate;
23
+ private handleMessage;
24
+ }
25
+ export { BybitTradeStream };
26
+ export type { BybitTradeStreamArgs };
27
+ //# sourceMappingURL=BybitTradeStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BybitTradeStream.d.ts","sourceRoot":"","sources":["../../src/ws/BybitTradeStream.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAe7D,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAkBD,cAAM,gBAAgB;IACpB,OAAO,CAAC,EAAE,CAAqD;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAA4C;IACtE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA0C;IAChF,OAAO,CAAC,cAAc,CAA8B;gBAExC,IAAI,EAAE,oBAAoB;IAOhC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IAsBvE,UAAU,IAAI,IAAI;IAelB,WAAW,IAAI,OAAO;YAIR,eAAe;IAkB7B,OAAO,CAAC,cAAc;YAkCR,YAAY;IAkB1B,OAAO,CAAC,aAAa;CAuBtB;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC5B,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BybitTradeStream = void 0;
7
+ const node_crypto_1 = __importDefault(require("node:crypto"));
8
+ const websocket_engine_1 = require("@solncebro/websocket-engine");
9
+ const bybitNormalizer_1 = require("../normalizers/bybitNormalizer");
10
+ const bybit_1 = require("../constants/bybit");
11
+ function parseBybitTradeMessage(rawData) {
12
+ return JSON.parse(rawData.toString());
13
+ }
14
+ function isBybitPongResponse(message) {
15
+ return message.op === 'pong' || message.ret_msg === 'pong';
16
+ }
17
+ const ORDER_TIMEOUT_MS = 30000;
18
+ class BybitTradeStream {
19
+ ws = null;
20
+ logger;
21
+ apiKey;
22
+ secret;
23
+ onNotify;
24
+ pendingRequestByReqId = new Map();
25
+ connectPromise = null;
26
+ constructor(args) {
27
+ this.logger = args.logger;
28
+ this.apiKey = args.apiKey;
29
+ this.secret = args.secret;
30
+ this.onNotify = args.onNotify;
31
+ }
32
+ async createOrder(orderParams) {
33
+ await this.ensureConnected();
34
+ const reqId = `order_${Date.now()}_${Math.random().toString(36).slice(2)}`;
35
+ const request = {
36
+ op: 'order.create',
37
+ args: [{ ...orderParams }],
38
+ header: { 'X-BAPI-TIMESTAMP': String(Date.now()), 'X-BAPI-RECV-WINDOW': '7000' },
39
+ reqId,
40
+ };
41
+ return new Promise((resolve, reject) => {
42
+ const timeout = setTimeout(() => {
43
+ this.pendingRequestByReqId.delete(reqId);
44
+ reject(new Error(`Order creation timeout after ${ORDER_TIMEOUT_MS}ms`));
45
+ }, ORDER_TIMEOUT_MS);
46
+ this.pendingRequestByReqId.set(reqId, { resolve, reject, timeout });
47
+ this.ws.sendToConnectedSocket(request);
48
+ });
49
+ }
50
+ disconnect() {
51
+ for (const [reqId, pending] of this.pendingRequestByReqId) {
52
+ clearTimeout(pending.timeout);
53
+ pending.reject(new Error('BybitTradeStream disconnected'));
54
+ this.pendingRequestByReqId.delete(reqId);
55
+ }
56
+ if (this.ws !== null) {
57
+ this.ws.close();
58
+ this.ws = null;
59
+ }
60
+ this.connectPromise = null;
61
+ }
62
+ isConnected() {
63
+ return this.ws !== null;
64
+ }
65
+ async ensureConnected() {
66
+ if (this.ws !== null) {
67
+ return;
68
+ }
69
+ if (this.connectPromise !== null) {
70
+ return this.connectPromise;
71
+ }
72
+ this.connectPromise = this.initConnection();
73
+ try {
74
+ await this.connectPromise;
75
+ }
76
+ finally {
77
+ this.connectPromise = null;
78
+ }
79
+ }
80
+ initConnection() {
81
+ return new Promise((resolve, reject) => {
82
+ let resolved = false;
83
+ this.ws = new websocket_engine_1.ReliableWebSocket({
84
+ label: 'BybitTradeStream',
85
+ url: bybit_1.BYBIT_TRADE_WS_URL,
86
+ logger: this.logger,
87
+ parseMessage: parseBybitTradeMessage,
88
+ onMessage: (message) => this.handleMessage(message),
89
+ onOpen: async (context) => {
90
+ try {
91
+ await this.authenticate(context);
92
+ resolved = true;
93
+ resolve();
94
+ }
95
+ catch (error) {
96
+ if (!resolved) {
97
+ resolved = true;
98
+ reject(error);
99
+ }
100
+ }
101
+ },
102
+ onNotify: this.onNotify,
103
+ heartbeat: {
104
+ buildPayload: () => ({ op: 'ping' }),
105
+ isResponse: isBybitPongResponse,
106
+ },
107
+ configuration: {
108
+ pingInterval: 20000,
109
+ },
110
+ });
111
+ });
112
+ }
113
+ async authenticate(context) {
114
+ const timestamp = Date.now();
115
+ const payload = `GET/realtime${timestamp}`;
116
+ const signature = node_crypto_1.default.createHmac('sha256', this.secret).update(payload).digest('hex');
117
+ context.send({
118
+ op: 'auth',
119
+ args: [this.apiKey, timestamp, signature],
120
+ });
121
+ await context.waitForMessage((message) => message.op === 'auth' && message.success === true, 10000);
122
+ this.logger.info('BybitTradeStream authenticated');
123
+ }
124
+ handleMessage(message) {
125
+ if (message.op === 'auth') {
126
+ return;
127
+ }
128
+ if (message.op === 'order.create' && message.reqId) {
129
+ const pending = this.pendingRequestByReqId.get(message.reqId);
130
+ if (!pending) {
131
+ return;
132
+ }
133
+ clearTimeout(pending.timeout);
134
+ this.pendingRequestByReqId.delete(message.reqId);
135
+ if (message.success && message.data) {
136
+ const order = (0, bybitNormalizer_1.normalizeBybitOrder)(message.data);
137
+ pending.resolve(order);
138
+ }
139
+ else {
140
+ pending.reject(new Error(message.reason ?? message.ret_msg ?? 'Order creation failed'));
141
+ }
142
+ }
143
+ }
144
+ }
145
+ exports.BybitTradeStream = BybitTradeStream;
146
+ //# sourceMappingURL=BybitTradeStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BybitTradeStream.js","sourceRoot":"","sources":["../../src/ws/BybitTradeStream.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@solncebro/exchange-engine",
3
+ "version": "0.1.0",
4
+ "description": "Universal TypeScript client library for Binance and Bybit with unified API, type safety, and WebSocket support",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "README.md",
10
+ "LICENSE",
11
+ "CHANGELOG.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "rm -rf dist && tsc -p tsconfig.json",
15
+ "build:watch": "tsc -p tsconfig.json --watch",
16
+ "test:smoke": "ts-node --project test/tsconfig.json test/smoke.test.ts",
17
+ "type-check": "tsc -p tsconfig.json --noEmit",
18
+ "prepublishOnly": "npm run build && npm run type-check"
19
+ },
20
+ "keywords": [
21
+ "exchange",
22
+ "binance",
23
+ "bybit",
24
+ "trading",
25
+ "websocket",
26
+ "rest",
27
+ "crypto",
28
+ "cryptocurrency",
29
+ "api",
30
+ "client",
31
+ "typescript"
32
+ ],
33
+ "author": {
34
+ "name": "solncebro",
35
+ "url": "https://github.com/solncebro"
36
+ },
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/solncebro/exchange-engine.git"
41
+ },
42
+ "bugs": {
43
+ "url": "https://github.com/solncebro/exchange-engine/issues"
44
+ },
45
+ "homepage": "https://github.com/solncebro/exchange-engine#readme",
46
+ "engines": {
47
+ "node": ">=18.0.0"
48
+ },
49
+ "dependencies": {
50
+ "@solncebro/websocket-engine": "^0.1.0",
51
+ "axios": "^1.7.7"
52
+ },
53
+ "devDependencies": {
54
+ "@types/node": "^22.0.0",
55
+ "@types/ws": "^8.18.1",
56
+ "typescript": "^5.7.0"
57
+ }
58
+ }