@solncebro/exchange-engine 0.1.2 → 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.
Files changed (117) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/constants/binance.d.ts +4 -5
  3. package/dist/constants/binance.d.ts.map +1 -1
  4. package/dist/constants/binance.js +5 -21
  5. package/dist/constants/binance.js.map +1 -1
  6. package/dist/constants/bybit.d.ts +6 -6
  7. package/dist/constants/bybit.d.ts.map +1 -1
  8. package/dist/constants/bybit.js +7 -7
  9. package/dist/constants/bybit.js.map +1 -1
  10. package/dist/constants/mappings.d.ts +9 -0
  11. package/dist/constants/mappings.d.ts.map +1 -0
  12. package/dist/constants/mappings.js +40 -0
  13. package/dist/constants/mappings.js.map +1 -0
  14. package/dist/exchanges/BaseExchangeClient.d.ts +9 -8
  15. package/dist/exchanges/BaseExchangeClient.d.ts.map +1 -1
  16. package/dist/exchanges/BaseExchangeClient.js +26 -26
  17. package/dist/exchanges/BaseExchangeClient.js.map +1 -1
  18. package/dist/exchanges/BinanceBaseClient.d.ts +5 -5
  19. package/dist/exchanges/BinanceBaseClient.d.ts.map +1 -1
  20. package/dist/exchanges/BinanceBaseClient.js +7 -8
  21. package/dist/exchanges/BinanceBaseClient.js.map +1 -1
  22. package/dist/exchanges/BinanceFutures.d.ts +4 -2
  23. package/dist/exchanges/BinanceFutures.d.ts.map +1 -1
  24. package/dist/exchanges/BinanceFutures.js +12 -6
  25. package/dist/exchanges/BinanceFutures.js.map +1 -1
  26. package/dist/exchanges/BinanceSpot.d.ts +3 -1
  27. package/dist/exchanges/BinanceSpot.d.ts.map +1 -1
  28. package/dist/exchanges/BinanceSpot.js +5 -2
  29. package/dist/exchanges/BinanceSpot.js.map +1 -1
  30. package/dist/exchanges/BybitLinear.d.ts +8 -6
  31. package/dist/exchanges/BybitLinear.d.ts.map +1 -1
  32. package/dist/exchanges/BybitLinear.js +19 -15
  33. package/dist/exchanges/BybitLinear.js.map +1 -1
  34. package/dist/exchanges/BybitSpot.d.ts +7 -5
  35. package/dist/exchanges/BybitSpot.d.ts.map +1 -1
  36. package/dist/exchanges/BybitSpot.js +13 -9
  37. package/dist/exchanges/BybitSpot.js.map +1 -1
  38. package/dist/exchanges/Exchange.d.ts +1 -1
  39. package/dist/exchanges/Exchange.d.ts.map +1 -1
  40. package/dist/exchanges/Exchange.js +3 -2
  41. package/dist/exchanges/Exchange.js.map +1 -1
  42. package/dist/http/BaseHttpClient.d.ts.map +1 -1
  43. package/dist/http/BaseHttpClient.js.map +1 -1
  44. package/dist/http/BinanceBaseHttpClient.d.ts +7 -7
  45. package/dist/http/BinanceBaseHttpClient.d.ts.map +1 -1
  46. package/dist/http/BinanceBaseHttpClient.js.map +1 -1
  47. package/dist/http/BinanceFuturesHttpClient.d.ts +6 -6
  48. package/dist/http/BinanceFuturesHttpClient.d.ts.map +1 -1
  49. package/dist/http/BinanceFuturesHttpClient.js +2 -5
  50. package/dist/http/BinanceFuturesHttpClient.js.map +1 -1
  51. package/dist/http/BybitHttpClient.d.ts +14 -13
  52. package/dist/http/BybitHttpClient.d.ts.map +1 -1
  53. package/dist/http/BybitHttpClient.js.map +1 -1
  54. package/dist/index.d.ts +3 -4
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +9 -6
  57. package/dist/index.js.map +1 -1
  58. package/dist/normalizers/binanceNormalizer.d.ts +28 -19
  59. package/dist/normalizers/binanceNormalizer.d.ts.map +1 -1
  60. package/dist/normalizers/binanceNormalizer.js +47 -30
  61. package/dist/normalizers/binanceNormalizer.js.map +1 -1
  62. package/dist/normalizers/bybitNormalizer.d.ts +21 -21
  63. package/dist/normalizers/bybitNormalizer.d.ts.map +1 -1
  64. package/dist/normalizers/bybitNormalizer.js +39 -40
  65. package/dist/normalizers/bybitNormalizer.js.map +1 -1
  66. package/dist/precision/precision.d.ts +3 -3
  67. package/dist/precision/precision.d.ts.map +1 -1
  68. package/dist/precision/precision.js +4 -4
  69. package/dist/precision/precision.js.map +1 -1
  70. package/dist/types/common.d.ts +54 -21
  71. package/dist/types/common.d.ts.map +1 -1
  72. package/dist/types/common.js +40 -0
  73. package/dist/types/common.js.map +1 -1
  74. package/dist/types/exchange.d.ts +9 -7
  75. package/dist/types/exchange.d.ts.map +1 -1
  76. package/dist/types/index.d.ts +2 -2
  77. package/dist/types/index.d.ts.map +1 -1
  78. package/dist/types/stream.d.ts +1 -2
  79. package/dist/types/stream.d.ts.map +1 -1
  80. package/dist/utils/httpParams.d.ts +2 -2
  81. package/dist/utils/httpParams.d.ts.map +1 -1
  82. package/dist/utils/httpParams.js.map +1 -1
  83. package/dist/ws/BinanceFuturesPublicStream.d.ts +4 -4
  84. package/dist/ws/BinanceFuturesPublicStream.d.ts.map +1 -1
  85. package/dist/ws/BinanceFuturesPublicStream.js +40 -41
  86. package/dist/ws/BinanceFuturesPublicStream.js.map +1 -1
  87. package/dist/ws/BinanceSpotPublicStream.d.ts +2 -2
  88. package/dist/ws/BinanceSpotPublicStream.d.ts.map +1 -1
  89. package/dist/ws/BinanceSpotPublicStream.js +15 -17
  90. package/dist/ws/BinanceSpotPublicStream.js.map +1 -1
  91. package/dist/ws/BinanceUserDataStream.d.ts +2 -2
  92. package/dist/ws/BinanceUserDataStream.d.ts.map +1 -1
  93. package/dist/ws/BinanceUserDataStream.js +3 -3
  94. package/dist/ws/BinanceUserDataStream.js.map +1 -1
  95. package/dist/ws/BybitPrivateStream.js +5 -5
  96. package/dist/ws/BybitPrivateStream.js.map +1 -1
  97. package/dist/ws/BybitPublicStream.d.ts.map +1 -1
  98. package/dist/ws/BybitPublicStream.js +9 -10
  99. package/dist/ws/BybitPublicStream.js.map +1 -1
  100. package/dist/ws/BybitTradeStream.d.ts.map +1 -1
  101. package/dist/ws/BybitTradeStream.js +12 -8
  102. package/dist/ws/BybitTradeStream.js.map +1 -1
  103. package/dist/ws/{binanceWsUtils.d.ts → binanceWebSocketUtils.d.ts} +1 -1
  104. package/dist/ws/binanceWebSocketUtils.d.ts.map +1 -0
  105. package/dist/ws/binanceWebSocketUtils.js +7 -0
  106. package/dist/ws/binanceWebSocketUtils.js.map +1 -0
  107. package/dist/ws/bybitWebSocketUtils.d.ts +28 -0
  108. package/dist/ws/bybitWebSocketUtils.d.ts.map +1 -0
  109. package/dist/ws/{bybitWsUtils.js → bybitWebSocketUtils.js} +3 -3
  110. package/dist/ws/bybitWebSocketUtils.js.map +1 -0
  111. package/package.json +6 -2
  112. package/dist/ws/binanceWsUtils.d.ts.map +0 -1
  113. package/dist/ws/binanceWsUtils.js +0 -13
  114. package/dist/ws/binanceWsUtils.js.map +0 -1
  115. package/dist/ws/bybitWsUtils.d.ts +0 -29
  116. package/dist/ws/bybitWsUtils.d.ts.map +0 -1
  117. package/dist/ws/bybitWsUtils.js.map +0 -1
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BybitTradeStream = void 0;
4
4
  const websocket_engine_1 = require("@solncebro/websocket-engine");
5
5
  const bybitNormalizer_1 = require("../normalizers/bybitNormalizer");
6
- const bybitWsUtils_1 = require("./bybitWsUtils");
6
+ const bybitWebSocketUtils_1 = require("./bybitWebSocketUtils");
7
7
  function parseBybitTradeMessage(rawData) {
8
8
  return JSON.parse(rawData.toString());
9
9
  }
@@ -39,6 +39,10 @@ class BybitTradeStream {
39
39
  reject(new Error(`Order creation timeout after ${ORDER_TIMEOUT_MS}ms`));
40
40
  }, ORDER_TIMEOUT_MS);
41
41
  this.pendingRequestByRequestId.set(requestId, { resolve, reject, timeout });
42
+ if (this.webSocket === null) {
43
+ reject(new Error('WebSocket is not connected'));
44
+ return;
45
+ }
42
46
  this.webSocket.sendToConnectedSocket(request);
43
47
  });
44
48
  }
@@ -74,7 +78,7 @@ class BybitTradeStream {
74
78
  }
75
79
  initConnection() {
76
80
  return new Promise((resolve, reject) => {
77
- let resolved = false;
81
+ let isResolved = false;
78
82
  this.webSocket = new websocket_engine_1.ReliableWebSocket({
79
83
  label: 'BybitTradeStream',
80
84
  url: this.url,
@@ -84,26 +88,26 @@ class BybitTradeStream {
84
88
  onOpen: async (context) => {
85
89
  try {
86
90
  await this.authenticate(context);
87
- resolved = true;
91
+ isResolved = true;
88
92
  resolve();
89
93
  }
90
94
  catch (error) {
91
- if (!resolved) {
92
- resolved = true;
95
+ if (!isResolved) {
96
+ isResolved = true;
93
97
  reject(error);
94
98
  }
95
99
  }
96
100
  },
97
101
  onNotify: this.onNotify,
98
- heartbeat: bybitWsUtils_1.BYBIT_HEARTBEAT_CONFIG,
102
+ heartbeat: bybitWebSocketUtils_1.BYBIT_HEARTBEAT_CONFIG,
99
103
  configuration: {
100
- pingInterval: bybitWsUtils_1.BYBIT_PING_INTERVAL,
104
+ pingInterval: bybitWebSocketUtils_1.BYBIT_PING_INTERVAL,
101
105
  },
102
106
  });
103
107
  });
104
108
  }
105
109
  async authenticate(context) {
106
- await (0, bybitWsUtils_1.authenticateBybitWs)({ context, apiKey: this.apiKey, secret: this.secret, label: 'BybitTradeStream', logger: this.logger });
110
+ await (0, bybitWebSocketUtils_1.authenticateBybitWebSocket)({ context, apiKey: this.apiKey, secret: this.secret, label: 'BybitTradeStream', logger: this.logger });
107
111
  }
108
112
  handleMessage(message) {
109
113
  if (message.op === 'auth') {
@@ -1 +1 @@
1
- {"version":3,"file":"BybitTradeStream.js","sourceRoot":"","sources":["../../src/ws/BybitTradeStream.ts"],"names":[],"mappings":";;;AACA,kEAAgE;AAIhE,oEAAqE;AAGrE,iDAIwB;AAqBxB,SAAS,sBAAsB,CAAC,OAAgB;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAsB,CAAC;AAC7D,CAAC;AAED,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAM,gBAAgB;IACZ,SAAS,GAAgD,IAAI,CAAC;IACrD,GAAG,CAAS;IACZ,MAAM,CAAiB;IACvB,MAAM,CAAS;IACf,MAAM,CAAS;IACf,QAAQ,CAA6C;IACrD,yBAAyB,GAAgC,IAAI,GAAG,EAAE,CAAC;IAC5E,cAAc,GAAyB,IAAI,CAAC;IAEpD,YAAY,IAA0B;QACpC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAoC;QACpD,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE7B,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE,CAAC;YAC1B,MAAM,EAAE,EAAE,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,oBAAoB,EAAE,MAAM,EAAE;YAChF,KAAK,EAAE,SAAS;SACjB,CAAC;QAEF,OAAO,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACjD,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,gBAAgB,IAAI,CAAC,CAAC,CAAC;YAC1E,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAErB,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5E,IAAI,CAAC,SAAU,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,UAAU;QACR,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAClE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,cAAc,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,QAAQ,GAAG,KAAK,CAAC;YAErB,IAAI,CAAC,SAAS,GAAG,IAAI,oCAAiB,CAAoB;gBACxD,KAAK,EAAE,kBAAkB;gBACzB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,YAAY,EAAE,sBAAsB;gBACpC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;gBACnD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;oBACxB,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;wBACjC,QAAQ,GAAG,IAAI,CAAC;wBAChB,OAAO,EAAE,CAAC;oBACZ,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,QAAQ,EAAE,CAAC;4BACd,QAAQ,GAAG,IAAI,CAAC;4BAChB,MAAM,CAAC,KAAK,CAAC,CAAC;wBAChB,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,qCAAsB;gBACjC,aAAa,EAAE;oBACb,YAAY,EAAE,kCAAmB;iBAClC;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,OAAgD;QACzE,MAAM,IAAA,kCAAmB,EAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACnI,CAAC;IAEO,aAAa,CAAC,OAA0B;QAC9C,IAAI,OAAO,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,EAAE,KAAK,cAAc,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAElE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YAED,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAErD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAG,IAAA,qCAAmB,EAAC,OAAO,CAAC,IAA6B,CAAC,CAAC;gBACzE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAEQ,4CAAgB"}
1
+ {"version":3,"file":"BybitTradeStream.js","sourceRoot":"","sources":["../../src/ws/BybitTradeStream.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import type { KlineInterval } from '../types/common';
2
2
  declare function resolveUnifiedBinanceInterval(binanceInterval: string): KlineInterval;
3
3
  export { resolveUnifiedBinanceInterval };
4
- //# sourceMappingURL=binanceWsUtils.d.ts.map
4
+ //# sourceMappingURL=binanceWebSocketUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binanceWebSocketUtils.d.ts","sourceRoot":"","sources":["../../src/ws/binanceWebSocketUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,iBAAS,6BAA6B,CAAC,eAAe,EAAE,MAAM,GAAG,aAAa,CAE7E;AAED,OAAO,EAAE,6BAA6B,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveUnifiedBinanceInterval = resolveUnifiedBinanceInterval;
4
+ function resolveUnifiedBinanceInterval(binanceInterval) {
5
+ return binanceInterval;
6
+ }
7
+ //# sourceMappingURL=binanceWebSocketUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binanceWebSocketUtils.js","sourceRoot":"","sources":["../../src/ws/binanceWebSocketUtils.ts"],"names":[],"mappings":";;AAMS,sEAA6B;AAJtC,SAAS,6BAA6B,CAAC,eAAuB;IAC5D,OAAO,eAAgC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { WebSocketOpenContext } from '@solncebro/websocket-engine';
2
+ import type { ExchangeLogger } from '../types/common';
3
+ interface BybitBaseWebSocketMessage {
4
+ op?: string;
5
+ data?: unknown;
6
+ success?: boolean;
7
+ ret_msg?: string;
8
+ [key: string]: unknown;
9
+ }
10
+ declare const BYBIT_PING_INTERVAL = 20000;
11
+ declare function isBybitPongResponse(message: BybitBaseWebSocketMessage): boolean;
12
+ declare const BYBIT_HEARTBEAT_CONFIG: {
13
+ buildPayload: () => {
14
+ op: string;
15
+ };
16
+ isResponse: typeof isBybitPongResponse;
17
+ };
18
+ interface AuthenticateBybitWebSocketArgs {
19
+ context: WebSocketOpenContext<BybitBaseWebSocketMessage>;
20
+ apiKey: string;
21
+ secret: string;
22
+ label: string;
23
+ logger: ExchangeLogger;
24
+ }
25
+ declare function authenticateBybitWebSocket(args: AuthenticateBybitWebSocketArgs): Promise<void>;
26
+ export { isBybitPongResponse, BYBIT_HEARTBEAT_CONFIG, BYBIT_PING_INTERVAL, authenticateBybitWebSocket, };
27
+ export type { BybitBaseWebSocketMessage, AuthenticateBybitWebSocketArgs };
28
+ //# sourceMappingURL=bybitWebSocketUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bybitWebSocketUtils.d.ts","sourceRoot":"","sources":["../../src/ws/bybitWebSocketUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,UAAU,yBAAyB;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,QAAA,MAAM,mBAAmB,QAAQ,CAAC;AAElC,iBAAS,mBAAmB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAExE;AAED,QAAA,MAAM,sBAAsB;;;;;CAG3B,CAAC;AAEF,UAAU,8BAA8B;IACtC,OAAO,EAAE,oBAAoB,CAAC,yBAAyB,CAAC,CAAC;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,iBAAe,0BAA0B,CAAC,IAAI,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB7F;AAED,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,0BAA0B,GAC3B,CAAC;AACF,YAAY,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,CAAC"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BYBIT_PING_INTERVAL = exports.BYBIT_HEARTBEAT_CONFIG = void 0;
4
4
  exports.isBybitPongResponse = isBybitPongResponse;
5
- exports.authenticateBybitWs = authenticateBybitWs;
5
+ exports.authenticateBybitWebSocket = authenticateBybitWebSocket;
6
6
  const crypto_1 = require("../utils/crypto");
7
7
  const BYBIT_PING_INTERVAL = 20000;
8
8
  exports.BYBIT_PING_INTERVAL = BYBIT_PING_INTERVAL;
@@ -14,7 +14,7 @@ const BYBIT_HEARTBEAT_CONFIG = {
14
14
  isResponse: isBybitPongResponse,
15
15
  };
16
16
  exports.BYBIT_HEARTBEAT_CONFIG = BYBIT_HEARTBEAT_CONFIG;
17
- async function authenticateBybitWs(args) {
17
+ async function authenticateBybitWebSocket(args) {
18
18
  const { context, apiKey, secret, label, logger } = args;
19
19
  const timestamp = Date.now();
20
20
  const payload = `GET/realtime${timestamp}`;
@@ -26,4 +26,4 @@ async function authenticateBybitWs(args) {
26
26
  await context.waitForMessage((message) => message.op === 'auth' && message.success === true, 10000);
27
27
  logger.info(`${label} authenticated`);
28
28
  }
29
- //# sourceMappingURL=bybitWsUtils.js.map
29
+ //# sourceMappingURL=bybitWebSocketUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bybitWebSocketUtils.js","sourceRoot":"","sources":["../../src/ws/bybitWebSocketUtils.ts"],"names":[],"mappings":";;;AAmDE,kDAAmB;AAGnB,gEAA0B;AApD5B,4CAA6C;AAU7C,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAyChC,kDAAmB;AAvCrB,SAAS,mBAAmB,CAAC,OAAkC;IAC7D,OAAO,OAAO,CAAC,EAAE,KAAK,MAAM,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC;AAC7D,CAAC;AAED,MAAM,sBAAsB,GAAG;IAC7B,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IACpC,UAAU,EAAE,mBAAmB;CAChC,CAAC;AA+BA,wDAAsB;AArBxB,KAAK,UAAU,0BAA0B,CAAC,IAAoC;IAC5E,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,eAAe,SAAS,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAA,mBAAU,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE9C,OAAO,CAAC,IAAI,CAAC;QACX,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;KACrC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,cAAc,CAC1B,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,MAAM,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAC9D,KAAK,CACN,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAAC;AACxC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solncebro/exchange-engine",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "Universal TypeScript client library for Binance and Bybit with unified API, type safety, and WebSocket support",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -24,8 +24,9 @@
24
24
  "test:watch": "jest --watch",
25
25
  "test:coverage": "jest --coverage",
26
26
  "test:smoke": "ts-node --project test/tsconfig.json test/smoke.test.ts",
27
+ "lint": "eslint src/ test/",
27
28
  "type-check": "tsc -p tsconfig.json --noEmit",
28
- "prepublishOnly": "npm run test && npm run build && npm run type-check"
29
+ "prepublishOnly": "yarn lint && yarn test && yarn build && yarn type-check"
29
30
  },
30
31
  "keywords": [
31
32
  "exchange",
@@ -64,6 +65,9 @@
64
65
  "@types/jest": "^30.0.0",
65
66
  "@types/node": "^22.0.0",
66
67
  "@types/ws": "^8.18.1",
68
+ "@typescript-eslint/eslint-plugin": "^8.56.1",
69
+ "@typescript-eslint/parser": "^8.56.1",
70
+ "eslint": "^10.0.2",
67
71
  "jest": "^30.2.0",
68
72
  "ts-jest": "^29.4.6",
69
73
  "ts-node": "^10.9.2",
@@ -1 +0,0 @@
1
- {"version":3,"file":"binanceWsUtils.d.ts","sourceRoot":"","sources":["../../src/ws/binanceWsUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD,iBAAS,6BAA6B,CAAC,eAAe,EAAE,MAAM,GAAG,aAAa,CAQ7E;AAED,OAAO,EAAE,6BAA6B,EAAE,CAAC"}
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolveUnifiedBinanceInterval = resolveUnifiedBinanceInterval;
4
- const binance_1 = require("../constants/binance");
5
- function resolveUnifiedBinanceInterval(binanceInterval) {
6
- for (const [unified, binance] of Object.entries(binance_1.BINANCE_KLINE_INTERVAL)) {
7
- if (binance === binanceInterval) {
8
- return unified;
9
- }
10
- }
11
- return '1m';
12
- }
13
- //# sourceMappingURL=binanceWsUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"binanceWsUtils.js","sourceRoot":"","sources":["../../src/ws/binanceWsUtils.ts"],"names":[],"mappings":";;AAaS,sEAA6B;AAZtC,kDAA8D;AAE9D,SAAS,6BAA6B,CAAC,eAAuB;IAC5D,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gCAAsB,CAAC,EAAE,CAAC;QACxE,IAAI,OAAO,KAAK,eAAe,EAAE,CAAC;YAChC,OAAO,OAAwB,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,29 +0,0 @@
1
- import type { WebSocketOpenContext } from '@solncebro/websocket-engine';
2
- interface BybitBaseWsMessage {
3
- op?: string;
4
- data?: unknown;
5
- success?: boolean;
6
- ret_msg?: string;
7
- [key: string]: unknown;
8
- }
9
- declare const BYBIT_PING_INTERVAL = 20000;
10
- declare function isBybitPongResponse(message: BybitBaseWsMessage): boolean;
11
- declare const BYBIT_HEARTBEAT_CONFIG: {
12
- buildPayload: () => {
13
- op: string;
14
- };
15
- isResponse: typeof isBybitPongResponse;
16
- };
17
- interface AuthenticateBybitWsArgs {
18
- context: WebSocketOpenContext<BybitBaseWsMessage>;
19
- apiKey: string;
20
- secret: string;
21
- label: string;
22
- logger: {
23
- info(message: string, ...args: unknown[]): void;
24
- };
25
- }
26
- declare function authenticateBybitWs(args: AuthenticateBybitWsArgs): Promise<void>;
27
- export { isBybitPongResponse, BYBIT_HEARTBEAT_CONFIG, BYBIT_PING_INTERVAL, authenticateBybitWs, };
28
- export type { BybitBaseWsMessage, AuthenticateBybitWsArgs };
29
- //# sourceMappingURL=bybitWsUtils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bybitWsUtils.d.ts","sourceRoot":"","sources":["../../src/ws/bybitWsUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGxE,UAAU,kBAAkB;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,QAAA,MAAM,mBAAmB,QAAQ,CAAC;AAElC,iBAAS,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAEjE;AAED,QAAA,MAAM,sBAAsB;;;;;CAG3B,CAAC;AAEF,UAAU,uBAAuB;IAC/B,OAAO,EAAE,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE;QAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;KAAE,CAAC;CAC7D;AAED,iBAAe,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/E;AAED,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,CAAC;AACF,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"bybitWsUtils.js","sourceRoot":"","sources":["../../src/ws/bybitWsUtils.ts"],"names":[],"mappings":";;;AAkDE,kDAAmB;AAGnB,kDAAmB;AApDrB,4CAA6C;AAU7C,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAyChC,kDAAmB;AAvCrB,SAAS,mBAAmB,CAAC,OAA2B;IACtD,OAAO,OAAO,CAAC,EAAE,KAAK,MAAM,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC;AAC7D,CAAC;AAED,MAAM,sBAAsB,GAAG;IAC7B,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IACpC,UAAU,EAAE,mBAAmB;CAChC,CAAC;AA+BA,wDAAsB;AArBxB,KAAK,UAAU,mBAAmB,CAAC,IAA6B;IAC9D,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,eAAe,SAAS,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAA,mBAAU,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE9C,OAAO,CAAC,IAAI,CAAC;QACX,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;KACrC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,cAAc,CAC1B,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,MAAM,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAC9D,KAAK,CACN,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,gBAAgB,CAAC,CAAC;AACxC,CAAC"}