@3rd-eye-labs/openmm 0.1.6 → 0.1.9

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 (216) hide show
  1. package/dist/api/routes/health.js +1 -1
  2. package/dist/api/routes/health.js.map +1 -1
  3. package/dist/cli/commands/grid.d.ts +3 -0
  4. package/dist/cli/commands/grid.d.ts.map +1 -0
  5. package/dist/cli/commands/grid.js +103 -0
  6. package/dist/cli/commands/grid.js.map +1 -0
  7. package/dist/cli/commands/multi-trade.d.ts +3 -0
  8. package/dist/cli/commands/multi-trade.d.ts.map +1 -0
  9. package/dist/cli/commands/multi-trade.js +175 -0
  10. package/dist/cli/commands/multi-trade.js.map +1 -0
  11. package/dist/cli/commands/trade.js +1 -1
  12. package/dist/cli/exchange-factory.d.ts +8 -0
  13. package/dist/cli/exchange-factory.d.ts.map +1 -1
  14. package/dist/cli/exchange-factory.js +16 -0
  15. package/dist/cli/exchange-factory.js.map +1 -1
  16. package/dist/cli/pool-discovery.d.ts +56 -0
  17. package/dist/cli/pool-discovery.d.ts.map +1 -0
  18. package/dist/cli/pool-discovery.js +283 -0
  19. package/dist/cli/pool-discovery.js.map +1 -0
  20. package/dist/config/environment.d.ts +23 -0
  21. package/dist/config/environment.d.ts.map +1 -1
  22. package/dist/config/environment.js +99 -59
  23. package/dist/config/environment.js.map +1 -1
  24. package/dist/core/price-aggregation/price-cache.d.ts +55 -0
  25. package/dist/core/price-aggregation/price-cache.d.ts.map +1 -0
  26. package/dist/core/price-aggregation/price-cache.js +152 -0
  27. package/dist/core/price-aggregation/price-cache.js.map +1 -0
  28. package/dist/examples/mexc-connector-comprehensive-test.d.ts +15 -0
  29. package/dist/examples/mexc-connector-comprehensive-test.d.ts.map +1 -0
  30. package/dist/examples/mexc-connector-comprehensive-test.js +514 -0
  31. package/dist/examples/mexc-connector-comprehensive-test.js.map +1 -0
  32. package/dist/examples/mexc-order-update-test.d.ts +4 -0
  33. package/dist/examples/mexc-order-update-test.d.ts.map +1 -0
  34. package/dist/examples/mexc-order-update-test.js +186 -0
  35. package/dist/examples/mexc-order-update-test.js.map +1 -0
  36. package/dist/examples/mexc-test.d.ts +9 -0
  37. package/dist/examples/mexc-test.d.ts.map +1 -0
  38. package/dist/examples/mexc-test.js +218 -0
  39. package/dist/examples/mexc-test.js.map +1 -0
  40. package/dist/examples/mexc-trades-debug.d.ts +2 -0
  41. package/dist/examples/mexc-trades-debug.d.ts.map +1 -0
  42. package/dist/examples/mexc-trades-debug.js +101 -0
  43. package/dist/examples/mexc-trades-debug.js.map +1 -0
  44. package/dist/examples/mexc-trades-subscription-debug.d.ts +2 -0
  45. package/dist/examples/mexc-trades-subscription-debug.d.ts.map +1 -0
  46. package/dist/examples/mexc-trades-subscription-debug.js +150 -0
  47. package/dist/examples/mexc-trades-subscription-debug.js.map +1 -0
  48. package/dist/examples/mexc-websocket-test.d.ts +8 -0
  49. package/dist/examples/mexc-websocket-test.d.ts.map +1 -0
  50. package/dist/examples/mexc-websocket-test.js +115 -0
  51. package/dist/examples/mexc-websocket-test.js.map +1 -0
  52. package/dist/examples/test-protobuf-status-detection.d.ts +9 -0
  53. package/dist/examples/test-protobuf-status-detection.d.ts.map +1 -0
  54. package/dist/examples/test-protobuf-status-detection.js +83 -0
  55. package/dist/examples/test-protobuf-status-detection.js.map +1 -0
  56. package/dist/exchanges/base-exchange-connector.d.ts +33 -0
  57. package/dist/exchanges/base-exchange-connector.d.ts.map +1 -0
  58. package/dist/exchanges/base-exchange-connector.js +55 -0
  59. package/dist/exchanges/base-exchange-connector.js.map +1 -0
  60. package/dist/exchanges/kraken/test-kraken-websocket.d.ts +19 -0
  61. package/dist/exchanges/kraken/test-kraken-websocket.d.ts.map +1 -0
  62. package/dist/exchanges/kraken/test-kraken-websocket.js +413 -0
  63. package/dist/exchanges/kraken/test-kraken-websocket.js.map +1 -0
  64. package/dist/mcp/resources/index.d.ts +3 -0
  65. package/dist/mcp/resources/index.d.ts.map +1 -0
  66. package/dist/mcp/resources/index.js +11 -0
  67. package/dist/mcp/resources/index.js.map +1 -0
  68. package/dist/mcp/server.d.ts +4 -0
  69. package/dist/mcp/server.d.ts.map +1 -0
  70. package/dist/mcp/server.js +29 -0
  71. package/dist/mcp/server.js.map +1 -0
  72. package/dist/mcp/tools/index.d.ts +3 -0
  73. package/dist/mcp/tools/index.d.ts.map +1 -0
  74. package/dist/mcp/tools/index.js +12 -0
  75. package/dist/mcp/tools/index.js.map +1 -0
  76. package/dist/tests/fixtures/test-helpers.d.ts +5 -0
  77. package/dist/tests/fixtures/test-helpers.d.ts.map +1 -0
  78. package/dist/tests/fixtures/test-helpers.js +8 -0
  79. package/dist/tests/fixtures/test-helpers.js.map +1 -0
  80. package/dist/tests/integration/exchanges/mexc/mexc-integration.test.d.ts +2 -0
  81. package/dist/tests/integration/exchanges/mexc/mexc-integration.test.d.ts.map +1 -0
  82. package/dist/tests/integration/exchanges/mexc/mexc-integration.test.js +237 -0
  83. package/dist/tests/integration/exchanges/mexc/mexc-integration.test.js.map +1 -0
  84. package/dist/tests/integration/price-aggregation/cardano-price-service.test.d.ts +2 -0
  85. package/dist/tests/integration/price-aggregation/cardano-price-service.test.d.ts.map +1 -0
  86. package/dist/tests/integration/price-aggregation/cardano-price-service.test.js +57 -0
  87. package/dist/tests/integration/price-aggregation/cardano-price-service.test.js.map +1 -0
  88. package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.d.ts +2 -0
  89. package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.d.ts.map +1 -0
  90. package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.js +141 -0
  91. package/dist/tests/integration/price-aggregation/price-aggregation-integration.test.js.map +1 -0
  92. package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.d.ts +2 -0
  93. package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.d.ts.map +1 -0
  94. package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.js +375 -0
  95. package/dist/tests/integration/strategies/grid/grid-strategy-e2e.test.js.map +1 -0
  96. package/dist/tests/unit/cli/exchange-factory.test.d.ts +2 -0
  97. package/dist/tests/unit/cli/exchange-factory.test.d.ts.map +1 -0
  98. package/dist/tests/unit/cli/exchange-factory.test.js +148 -0
  99. package/dist/tests/unit/cli/exchange-factory.test.js.map +1 -0
  100. package/dist/tests/unit/config/environment.test.d.ts +2 -0
  101. package/dist/tests/unit/config/environment.test.d.ts.map +1 -0
  102. package/dist/tests/unit/config/environment.test.js +158 -0
  103. package/dist/tests/unit/config/environment.test.js.map +1 -0
  104. package/dist/tests/unit/config/launcher-config.test.d.ts +2 -0
  105. package/dist/tests/unit/config/launcher-config.test.d.ts.map +1 -0
  106. package/dist/tests/unit/config/launcher-config.test.js +117 -0
  107. package/dist/tests/unit/config/launcher-config.test.js.map +1 -0
  108. package/dist/tests/unit/config/price-aggregation.test.d.ts +2 -0
  109. package/dist/tests/unit/config/price-aggregation.test.d.ts.map +1 -0
  110. package/dist/tests/unit/config/price-aggregation.test.js +144 -0
  111. package/dist/tests/unit/config/price-aggregation.test.js.map +1 -0
  112. package/dist/tests/unit/core/exchange/base-exchange-connector.test.d.ts +2 -0
  113. package/dist/tests/unit/core/exchange/base-exchange-connector.test.d.ts.map +1 -0
  114. package/dist/tests/unit/core/exchange/base-exchange-connector.test.js +191 -0
  115. package/dist/tests/unit/core/exchange/base-exchange-connector.test.js.map +1 -0
  116. package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.d.ts +2 -0
  117. package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.d.ts.map +1 -0
  118. package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.js +324 -0
  119. package/dist/tests/unit/core/exchange/base-exchange-data-mapper.test.js.map +1 -0
  120. package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.d.ts +2 -0
  121. package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.d.ts.map +1 -0
  122. package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.js +177 -0
  123. package/dist/tests/unit/core/price-aggregation/cardano-price-service.test.js.map +1 -0
  124. package/dist/tests/unit/core/price-aggregation/iris-api-client.test.d.ts +2 -0
  125. package/dist/tests/unit/core/price-aggregation/iris-api-client.test.d.ts.map +1 -0
  126. package/dist/tests/unit/core/price-aggregation/iris-api-client.test.js +168 -0
  127. package/dist/tests/unit/core/price-aggregation/iris-api-client.test.js.map +1 -0
  128. package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.d.ts +2 -0
  129. package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.d.ts.map +1 -0
  130. package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.js +217 -0
  131. package/dist/tests/unit/core/price-aggregation/iris-pool-discovery.test.js.map +1 -0
  132. package/dist/tests/unit/core/price-aggregation/price-calculator.test.d.ts +2 -0
  133. package/dist/tests/unit/core/price-aggregation/price-calculator.test.d.ts.map +1 -0
  134. package/dist/tests/unit/core/price-aggregation/price-calculator.test.js +229 -0
  135. package/dist/tests/unit/core/price-aggregation/price-calculator.test.js.map +1 -0
  136. package/dist/tests/unit/core/risk-management/risk-manager.test.d.ts +2 -0
  137. package/dist/tests/unit/core/risk-management/risk-manager.test.d.ts.map +1 -0
  138. package/dist/tests/unit/core/risk-management/risk-manager.test.js +194 -0
  139. package/dist/tests/unit/core/risk-management/risk-manager.test.js.map +1 -0
  140. package/dist/tests/unit/core/strategy/base-strategy.test.d.ts +2 -0
  141. package/dist/tests/unit/core/strategy/base-strategy.test.d.ts.map +1 -0
  142. package/dist/tests/unit/core/strategy/base-strategy.test.js +254 -0
  143. package/dist/tests/unit/core/strategy/base-strategy.test.js.map +1 -0
  144. package/dist/tests/unit/core/strategy/strategy-factory.test.d.ts +2 -0
  145. package/dist/tests/unit/core/strategy/strategy-factory.test.d.ts.map +1 -0
  146. package/dist/tests/unit/core/strategy/strategy-factory.test.js +213 -0
  147. package/dist/tests/unit/core/strategy/strategy-factory.test.js.map +1 -0
  148. package/dist/tests/unit/exchanges/mexc/mexc-auth.test.d.ts +2 -0
  149. package/dist/tests/unit/exchanges/mexc/mexc-auth.test.d.ts.map +1 -0
  150. package/dist/tests/unit/exchanges/mexc/mexc-auth.test.js +452 -0
  151. package/dist/tests/unit/exchanges/mexc/mexc-auth.test.js.map +1 -0
  152. package/dist/tests/unit/exchanges/mexc/mexc-connector.test.d.ts +2 -0
  153. package/dist/tests/unit/exchanges/mexc/mexc-connector.test.d.ts.map +1 -0
  154. package/dist/tests/unit/exchanges/mexc/mexc-connector.test.js +1419 -0
  155. package/dist/tests/unit/exchanges/mexc/mexc-connector.test.js.map +1 -0
  156. package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.d.ts +2 -0
  157. package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.d.ts.map +1 -0
  158. package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.js +435 -0
  159. package/dist/tests/unit/exchanges/mexc/mexc-data-mapper.test.js.map +1 -0
  160. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.d.ts +2 -0
  161. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.d.ts.map +1 -0
  162. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.js +314 -0
  163. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-decoder.test.js.map +1 -0
  164. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.d.ts +2 -0
  165. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.d.ts.map +1 -0
  166. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.js +178 -0
  167. package/dist/tests/unit/exchanges/mexc/mexc-protobuf-status-detection.test.js.map +1 -0
  168. package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.d.ts +2 -0
  169. package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.d.ts.map +1 -0
  170. package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.js +502 -0
  171. package/dist/tests/unit/exchanges/mexc/mexc-user-stream.test.js.map +1 -0
  172. package/dist/tests/unit/exchanges/mexc/mexc-utils.test.d.ts +2 -0
  173. package/dist/tests/unit/exchanges/mexc/mexc-utils.test.d.ts.map +1 -0
  174. package/dist/tests/unit/exchanges/mexc/mexc-utils.test.js +317 -0
  175. package/dist/tests/unit/exchanges/mexc/mexc-utils.test.js.map +1 -0
  176. package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.d.ts +2 -0
  177. package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.d.ts.map +1 -0
  178. package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.js +843 -0
  179. package/dist/tests/unit/exchanges/mexc/mexc-websocket.test.js.map +1 -0
  180. package/dist/tests/unit/strategies/grid/grid-calculator.test.d.ts +2 -0
  181. package/dist/tests/unit/strategies/grid/grid-calculator.test.d.ts.map +1 -0
  182. package/dist/tests/unit/strategies/grid/grid-calculator.test.js +67 -0
  183. package/dist/tests/unit/strategies/grid/grid-calculator.test.js.map +1 -0
  184. package/dist/tests/unit/strategies/grid/grid-order-manager.test.d.ts +2 -0
  185. package/dist/tests/unit/strategies/grid/grid-order-manager.test.d.ts.map +1 -0
  186. package/dist/tests/unit/strategies/grid/grid-order-manager.test.js +211 -0
  187. package/dist/tests/unit/strategies/grid/grid-order-manager.test.js.map +1 -0
  188. package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.d.ts +2 -0
  189. package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.d.ts.map +1 -0
  190. package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.js +197 -0
  191. package/dist/tests/unit/strategies/grid/grid-strategy-simple.test.js.map +1 -0
  192. package/dist/tests/unit/strategies/grid/grid-strategy.test.d.ts +2 -0
  193. package/dist/tests/unit/strategies/grid/grid-strategy.test.d.ts.map +1 -0
  194. package/dist/tests/unit/strategies/grid/grid-strategy.test.js +429 -0
  195. package/dist/tests/unit/strategies/grid/grid-strategy.test.js.map +1 -0
  196. package/dist/tests/unit/utils/logger.test.d.ts +2 -0
  197. package/dist/tests/unit/utils/logger.test.d.ts.map +1 -0
  198. package/dist/tests/unit/utils/logger.test.js +260 -0
  199. package/dist/tests/unit/utils/logger.test.js.map +1 -0
  200. package/dist/tests/unit/utils/symbol-utils.test.d.ts +2 -0
  201. package/dist/tests/unit/utils/symbol-utils.test.d.ts.map +1 -0
  202. package/dist/tests/unit/utils/symbol-utils.test.js +178 -0
  203. package/dist/tests/unit/utils/symbol-utils.test.js.map +1 -0
  204. package/dist/types/price-aggregation.d.ts +31 -0
  205. package/dist/types/price-aggregation.d.ts.map +1 -0
  206. package/dist/types/price-aggregation.js +6 -0
  207. package/dist/types/price-aggregation.js.map +1 -0
  208. package/dist/utils/crypto.d.ts +15 -0
  209. package/dist/utils/crypto.d.ts.map +1 -0
  210. package/dist/utils/crypto.js +50 -0
  211. package/dist/utils/crypto.js.map +1 -0
  212. package/dist/utils/validation.d.ts +36 -0
  213. package/dist/utils/validation.d.ts.map +1 -0
  214. package/dist/utils/validation.js +174 -0
  215. package/dist/utils/validation.js.map +1 -0
  216. package/package.json +1 -1
@@ -0,0 +1,502 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const mexc_user_stream_1 = require("../../../../exchanges/mexc/mexc-user-stream");
4
+ const mexc_websocket_1 = require("../../../../exchanges/mexc/mexc-websocket");
5
+ const utils_1 = require("../../../../utils");
6
+ jest.mock('../../../../exchanges/mexc/mexc-websocket');
7
+ jest.mock('../../../../utils');
8
+ const MockedMexcWebSocket = mexc_websocket_1.MexcWebSocket;
9
+ const MockedCreateLogger = utils_1.createLogger;
10
+ describe('MexcUserStream', () => {
11
+ let mexcUserStream;
12
+ let mockMakeRequestFn;
13
+ let mockWebSocket;
14
+ let mockLogger;
15
+ const setupUserStream = async () => {
16
+ const mockResponse = { listenKey: 'test_listen_key_123' };
17
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
18
+ await mexcUserStream.connectUserDataStream();
19
+ };
20
+ const setupTradeSubscription = async () => {
21
+ const callback = jest.fn();
22
+ await mexcUserStream.subscribeUserTrades(callback);
23
+ const wrappedCallback = mockWebSocket.subscribeToUserData.mock.calls[0][0];
24
+ return { callback, wrappedCallback };
25
+ };
26
+ beforeEach(() => {
27
+ jest.clearAllMocks();
28
+ mockLogger = {
29
+ info: jest.fn(),
30
+ warn: jest.fn(),
31
+ error: jest.fn(),
32
+ debug: jest.fn()
33
+ };
34
+ MockedCreateLogger.mockReturnValue(mockLogger);
35
+ mockWebSocket = {
36
+ connectWebSocket: jest.fn().mockResolvedValue(undefined),
37
+ disconnectWebSocket: jest.fn().mockResolvedValue(undefined),
38
+ subscribeToUserData: jest.fn().mockResolvedValue('subscription_id_123'),
39
+ isConnected: jest.fn().mockReturnValue(true)
40
+ };
41
+ MockedMexcWebSocket.mockImplementation(() => mockWebSocket);
42
+ mockMakeRequestFn = jest.fn();
43
+ mexcUserStream = new mexc_user_stream_1.MexcUserStream(mockMakeRequestFn);
44
+ });
45
+ describe('constructor', () => {
46
+ it('should initialize with makeRequestFn', () => {
47
+ expect(mexcUserStream).toBeInstanceOf(mexc_user_stream_1.MexcUserStream);
48
+ expect(MockedCreateLogger).toHaveBeenCalledWith('mexc-user-stream');
49
+ });
50
+ });
51
+ describe('getListenKey()', () => {
52
+ it('should successfully get listen key', async () => {
53
+ const mockResponse = { listenKey: 'test_listen_key_123' };
54
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
55
+ const listenKey = await mexcUserStream.getListenKey();
56
+ expect(mockMakeRequestFn).toHaveBeenCalledWith('/userDataStream', {}, 'POST');
57
+ expect(listenKey).toBe('test_listen_key_123');
58
+ });
59
+ it('should throw error when no listen key in response', async () => {
60
+ mockMakeRequestFn.mockResolvedValue({});
61
+ await expect(mexcUserStream.getListenKey()).rejects.toThrow('No listen key received from API');
62
+ });
63
+ it('should handle API request errors', async () => {
64
+ const error = new Error('API request failed');
65
+ mockMakeRequestFn.mockRejectedValue(error);
66
+ await expect(mexcUserStream.getListenKey()).rejects.toThrow('Failed to get listen key: API request failed');
67
+ });
68
+ it('should handle non-Error exceptions', async () => {
69
+ mockMakeRequestFn.mockRejectedValue('String error');
70
+ await expect(mexcUserStream.getListenKey()).rejects.toThrow('Failed to get listen key: Unknown error');
71
+ });
72
+ });
73
+ describe('connectUserDataStream()', () => {
74
+ it('should successfully connect user data stream', async () => {
75
+ const mockResponse = { listenKey: 'test_listen_key_123' };
76
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
77
+ await mexcUserStream.connectUserDataStream();
78
+ expect(mockMakeRequestFn).toHaveBeenCalledWith('/userDataStream', {}, 'POST');
79
+ expect(MockedMexcWebSocket).toHaveBeenCalledWith('wss://wbs-api.mexc.com/ws?listenKey=test_listen_key_123');
80
+ expect(mockWebSocket.connectWebSocket).toHaveBeenCalled();
81
+ });
82
+ it('should reuse existing WebSocket if available', async () => {
83
+ const mockResponse = { listenKey: 'test_listen_key_123' };
84
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
85
+ await mexcUserStream.connectUserDataStream();
86
+ expect(MockedMexcWebSocket).toHaveBeenCalledTimes(1);
87
+ await mexcUserStream.connectUserDataStream();
88
+ expect(MockedMexcWebSocket).toHaveBeenCalledTimes(1);
89
+ expect(mockWebSocket.connectWebSocket).toHaveBeenCalledTimes(2);
90
+ });
91
+ it('should setup keep alive interval', async () => {
92
+ jest.useFakeTimers();
93
+ const setIntervalSpy = jest.spyOn(global, 'setInterval');
94
+ const mockResponse = { listenKey: 'test_listen_key_123' };
95
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
96
+ await mexcUserStream.connectUserDataStream();
97
+ expect(setIntervalSpy).toHaveBeenCalledWith(expect.any(Function), 30 * 60 * 1000);
98
+ setIntervalSpy.mockRestore();
99
+ jest.useRealTimers();
100
+ });
101
+ it('should handle keep alive errors', async () => {
102
+ const mockResponse = { listenKey: 'test_listen_key_123' };
103
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
104
+ await mexcUserStream.connectUserDataStream();
105
+ mockMakeRequestFn.mockRejectedValueOnce(new Error('Keep alive failed'));
106
+ await mexcUserStream.keepAliveListenKey();
107
+ expect(mockLogger.warn).toHaveBeenCalledWith('Failed to keep alive listen key', { error: expect.any(Error) });
108
+ });
109
+ it('should handle connection errors', async () => {
110
+ const error = new Error('Connection failed');
111
+ mockMakeRequestFn.mockRejectedValue(error);
112
+ await expect(mexcUserStream.connectUserDataStream()).rejects.toThrow('Failed to connect user data stream: Failed to get listen key: Connection failed');
113
+ });
114
+ it('should handle non-Error exceptions', async () => {
115
+ mockMakeRequestFn.mockRejectedValue('String error');
116
+ await expect(mexcUserStream.connectUserDataStream()).rejects.toThrow('Failed to connect user data stream: Failed to get listen key: Unknown error');
117
+ });
118
+ });
119
+ describe('disconnectUserDataStream()', () => {
120
+ beforeEach(async () => {
121
+ const mockResponse = { listenKey: 'test_listen_key_123' };
122
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
123
+ await mexcUserStream.connectUserDataStream();
124
+ });
125
+ it('should successfully disconnect user data stream', async () => {
126
+ await mexcUserStream.disconnectUserDataStream();
127
+ expect(mockWebSocket.disconnectWebSocket).toHaveBeenCalled();
128
+ expect(mockMakeRequestFn).toHaveBeenCalledWith('/userDataStream', { listenKey: 'test_listen_key_123' }, 'DELETE');
129
+ });
130
+ it('should clear keep alive interval', async () => {
131
+ jest.useFakeTimers();
132
+ const clearIntervalSpy = jest.spyOn(global, 'clearInterval');
133
+ await mexcUserStream.disconnectUserDataStream();
134
+ expect(clearIntervalSpy).toHaveBeenCalled();
135
+ clearIntervalSpy.mockRestore();
136
+ jest.useRealTimers();
137
+ });
138
+ it('should handle disconnect errors gracefully', async () => {
139
+ mockWebSocket.disconnectWebSocket.mockRejectedValue(new Error('Disconnect failed'));
140
+ mockMakeRequestFn.mockRejectedValueOnce(new Error('Delete listen key failed'));
141
+ await mexcUserStream.disconnectUserDataStream();
142
+ expect(mockLogger.warn).toHaveBeenCalledWith('Error during user data stream disconnect', { error: expect.any(Error) });
143
+ });
144
+ it('should handle disconnect when not connected', async () => {
145
+ const freshUserStream = new mexc_user_stream_1.MexcUserStream(mockMakeRequestFn);
146
+ await freshUserStream.disconnectUserDataStream();
147
+ expect(mockWebSocket.disconnectWebSocket).not.toHaveBeenCalled();
148
+ });
149
+ });
150
+ describe('keepAliveListenKey()', () => {
151
+ it('should keep listen key alive when listen key exists', async () => {
152
+ const mockResponse = { listenKey: 'test_listen_key_123' };
153
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
154
+ await mexcUserStream.getListenKey();
155
+ mockMakeRequestFn.mockResolvedValueOnce({});
156
+ await mexcUserStream.keepAliveListenKey();
157
+ expect(mockMakeRequestFn).toHaveBeenCalledWith('/userDataStream', { listenKey: 'test_listen_key_123' }, 'PUT');
158
+ });
159
+ it('should do nothing when no listen key', async () => {
160
+ await mexcUserStream.keepAliveListenKey();
161
+ expect(mockMakeRequestFn).not.toHaveBeenCalled();
162
+ });
163
+ it('should handle keep alive errors', async () => {
164
+ const mockResponse = { listenKey: 'test_listen_key_123' };
165
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
166
+ await mexcUserStream.getListenKey();
167
+ const error = new Error('Keep alive failed');
168
+ mockMakeRequestFn.mockRejectedValueOnce(error);
169
+ await mexcUserStream.keepAliveListenKey();
170
+ expect(mockLogger.warn).toHaveBeenCalledWith('Failed to keep alive listen key', { error });
171
+ });
172
+ });
173
+ describe('deleteListenKey()', () => {
174
+ it('should delete listen key when listen key exists', async () => {
175
+ const mockResponse = { listenKey: 'test_listen_key_123' };
176
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
177
+ await mexcUserStream.getListenKey();
178
+ mockMakeRequestFn.mockResolvedValueOnce({});
179
+ await mexcUserStream.deleteListenKey();
180
+ expect(mockMakeRequestFn).toHaveBeenCalledWith('/userDataStream', { listenKey: 'test_listen_key_123' }, 'DELETE');
181
+ });
182
+ it('should do nothing when no listen key', async () => {
183
+ await mexcUserStream.deleteListenKey();
184
+ expect(mockMakeRequestFn).not.toHaveBeenCalled();
185
+ });
186
+ it('should handle delete errors and clear listen key', async () => {
187
+ const mockResponse = { listenKey: 'test_listen_key_123' };
188
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
189
+ await mexcUserStream.getListenKey();
190
+ const error = new Error('Delete failed');
191
+ mockMakeRequestFn.mockRejectedValueOnce(error);
192
+ await mexcUserStream.deleteListenKey();
193
+ expect(mockLogger.warn).toHaveBeenCalledWith('Failed to delete listen key', { error });
194
+ });
195
+ });
196
+ describe('subscribeUserOrders()', () => {
197
+ beforeEach(async () => {
198
+ const mockResponse = { listenKey: 'test_listen_key_123' };
199
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
200
+ await mexcUserStream.connectUserDataStream();
201
+ });
202
+ it('should successfully subscribe to user orders', async () => {
203
+ const callback = jest.fn();
204
+ const subscriptionId = await mexcUserStream.subscribeUserOrders(callback);
205
+ expect(mockWebSocket.subscribeToUserData).toHaveBeenCalledWith(callback);
206
+ expect(subscriptionId).toBe('subscription_id_123');
207
+ });
208
+ it('should throw error when not connected', async () => {
209
+ const freshUserStream = new mexc_user_stream_1.MexcUserStream(mockMakeRequestFn);
210
+ const callback = jest.fn();
211
+ await expect(freshUserStream.subscribeUserOrders(callback)).rejects.toThrow('User data stream not connected. Call connect() first.');
212
+ });
213
+ it('should handle subscription errors', async () => {
214
+ const error = new Error('Subscription failed');
215
+ mockWebSocket.subscribeToUserData.mockRejectedValue(error);
216
+ const callback = jest.fn();
217
+ await expect(mexcUserStream.subscribeUserOrders(callback)).rejects.toThrow('Failed to subscribe to user orders: Subscription failed');
218
+ });
219
+ it('should handle non-Error exceptions', async () => {
220
+ mockWebSocket.subscribeToUserData.mockRejectedValue('String error');
221
+ const callback = jest.fn();
222
+ await expect(mexcUserStream.subscribeUserOrders(callback)).rejects.toThrow('Failed to subscribe to user orders: Unknown error');
223
+ });
224
+ });
225
+ describe('subscribeUserTrades()', () => {
226
+ beforeEach(async () => {
227
+ const mockResponse = { listenKey: 'test_listen_key_123' };
228
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
229
+ await mexcUserStream.connectUserDataStream();
230
+ });
231
+ it('should successfully subscribe to user trades', async () => {
232
+ const callback = jest.fn();
233
+ const subscriptionId = await mexcUserStream.subscribeUserTrades(callback);
234
+ expect(mockWebSocket.subscribeToUserData).toHaveBeenCalledWith(expect.any(Function));
235
+ expect(subscriptionId).toBe('subscription_id_123');
236
+ });
237
+ it('should process trade execution data', async () => {
238
+ const callback = jest.fn();
239
+ await mexcUserStream.subscribeUserTrades(callback);
240
+ const wrappedCallback = mockWebSocket.subscribeToUserData.mock.calls[0][0];
241
+ const mockTradeData = {
242
+ id: 'order123',
243
+ symbol: 'BTC/USDT',
244
+ type: 'limit',
245
+ side: 'buy',
246
+ status: 'filled',
247
+ filled: 1.0,
248
+ amount: 1.0,
249
+ price: 50000,
250
+ remaining: 0,
251
+ timestamp: 1640995200000
252
+ };
253
+ wrappedCallback(mockTradeData);
254
+ expect(callback).toHaveBeenCalledWith(expect.objectContaining({
255
+ id: expect.stringContaining('order123'),
256
+ orderId: 'order123',
257
+ symbol: 'BTC/USDT',
258
+ side: 'buy',
259
+ amount: 1.0,
260
+ price: 50000,
261
+ timestamp: 1640995200000
262
+ }));
263
+ expect(mockLogger.info).toHaveBeenCalledWith('✅ User data stream connected successfully');
264
+ });
265
+ it('should not process non-trade execution data', async () => {
266
+ const callback = jest.fn();
267
+ await mexcUserStream.subscribeUserTrades(callback);
268
+ mockLogger.info.mockClear();
269
+ const wrappedCallback = mockWebSocket.subscribeToUserData.mock.calls[0][0];
270
+ const mockNonTradeData = {
271
+ id: 'order123',
272
+ symbol: 'BTC/USDT',
273
+ type: 'limit',
274
+ side: 'buy',
275
+ status: 'open',
276
+ filled: 0,
277
+ amount: 1.0,
278
+ price: 50000,
279
+ remaining: 1.0,
280
+ timestamp: Date.now()
281
+ };
282
+ wrappedCallback(mockNonTradeData);
283
+ expect(callback).not.toHaveBeenCalled();
284
+ // Only check that no new info logs were made after clearing
285
+ expect(mockLogger.info).not.toHaveBeenCalled();
286
+ });
287
+ it('should throw error when not connected', async () => {
288
+ const freshUserStream = new mexc_user_stream_1.MexcUserStream(mockMakeRequestFn);
289
+ const callback = jest.fn();
290
+ await expect(freshUserStream.subscribeUserTrades(callback)).rejects.toThrow('User data stream not connected. Call connect() first.');
291
+ });
292
+ it('should handle subscription errors', async () => {
293
+ const error = new Error('Subscription failed');
294
+ mockWebSocket.subscribeToUserData.mockRejectedValue(error);
295
+ const callback = jest.fn();
296
+ await expect(mexcUserStream.subscribeUserTrades(callback)).rejects.toThrow('Failed to subscribe to user trades: Subscription failed');
297
+ });
298
+ it('should handle non-Error exceptions', async () => {
299
+ mockWebSocket.subscribeToUserData.mockRejectedValue('String error');
300
+ const callback = jest.fn();
301
+ await expect(mexcUserStream.subscribeUserTrades(callback)).rejects.toThrow('Failed to subscribe to user trades: Unknown error');
302
+ });
303
+ });
304
+ describe('isUserDataStreamConnected()', () => {
305
+ it('should return false when not connected', () => {
306
+ expect(mexcUserStream.isUserDataStreamConnected()).toBe(false);
307
+ });
308
+ it('should return true when connected', async () => {
309
+ const mockResponse = { listenKey: 'test_listen_key_123' };
310
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
311
+ await mexcUserStream.connectUserDataStream();
312
+ expect(mexcUserStream.isUserDataStreamConnected()).toBe(true);
313
+ });
314
+ it('should return false when WebSocket is not connected', async () => {
315
+ const mockResponse = { listenKey: 'test_listen_key_123' };
316
+ mockMakeRequestFn.mockResolvedValue(mockResponse);
317
+ await mexcUserStream.connectUserDataStream();
318
+ mockWebSocket.isConnected.mockReturnValue(false);
319
+ expect(mexcUserStream.isUserDataStreamConnected()).toBe(false);
320
+ });
321
+ it('should return false when WebSocket is undefined', async () => {
322
+ const freshUserStream = new mexc_user_stream_1.MexcUserStream(mockMakeRequestFn);
323
+ expect(freshUserStream.isUserDataStreamConnected()).toBe(false);
324
+ });
325
+ });
326
+ describe('isTradeExecution()', () => {
327
+ it('should detect filled status as trade execution', async () => {
328
+ await setupUserStream();
329
+ const { callback, wrappedCallback } = await setupTradeSubscription();
330
+ const mockData = {
331
+ id: 'order123',
332
+ symbol: 'BTC/USDT',
333
+ type: 'limit',
334
+ side: 'buy',
335
+ status: 'filled',
336
+ filled: 1.0,
337
+ amount: 1.0,
338
+ price: 50000,
339
+ remaining: 0,
340
+ timestamp: Date.now()
341
+ };
342
+ wrappedCallback(mockData);
343
+ expect(callback).toHaveBeenCalled();
344
+ });
345
+ it('should detect partially filled orders as trade execution', async () => {
346
+ await setupUserStream();
347
+ const { callback, wrappedCallback } = await setupTradeSubscription();
348
+ const mockData = {
349
+ id: 'order123',
350
+ symbol: 'BTC/USDT',
351
+ type: 'limit',
352
+ side: 'buy',
353
+ status: 'partial',
354
+ filled: 0.5,
355
+ amount: 1.0,
356
+ price: 50000,
357
+ remaining: 0.5,
358
+ timestamp: Date.now()
359
+ };
360
+ wrappedCallback(mockData);
361
+ expect(callback).toHaveBeenCalled();
362
+ });
363
+ it('should detect executed quantity as trade execution', async () => {
364
+ await setupUserStream();
365
+ const { callback, wrappedCallback } = await setupTradeSubscription();
366
+ const mockData = {
367
+ id: 'order123',
368
+ symbol: 'BTC/USDT',
369
+ type: 'limit',
370
+ side: 'buy',
371
+ status: 'filled',
372
+ amount: 2.0,
373
+ filled: 1.0,
374
+ price: 50000,
375
+ remaining: 1.0,
376
+ timestamp: Date.now()
377
+ };
378
+ wrappedCallback(mockData);
379
+ expect(callback).toHaveBeenCalled();
380
+ });
381
+ it('should not detect non-execution events', async () => {
382
+ await setupUserStream();
383
+ const { callback, wrappedCallback } = await setupTradeSubscription();
384
+ const mockData = {
385
+ status: 'open',
386
+ filled: 0,
387
+ amount: 1.0
388
+ };
389
+ wrappedCallback(mockData);
390
+ expect(callback).not.toHaveBeenCalled();
391
+ });
392
+ });
393
+ describe('transformToTrade()', () => {
394
+ it('should transform order data to trade format with all fields', async () => {
395
+ await setupUserStream();
396
+ const { callback, wrappedCallback } = await setupTradeSubscription();
397
+ const mockData = {
398
+ tradeId: 'trade123',
399
+ id: 'order123',
400
+ symbol: 'BTC/USDT',
401
+ side: 'buy',
402
+ filled: '1.5',
403
+ price: '50000.00',
404
+ fee: '0.01',
405
+ timestamp: 1640995200000,
406
+ status: 'filled'
407
+ };
408
+ wrappedCallback(mockData);
409
+ expect(callback).toHaveBeenCalledWith({
410
+ id: 'trade123',
411
+ orderId: 'order123',
412
+ symbol: 'BTC/USDT',
413
+ side: 'buy',
414
+ amount: 1.5,
415
+ price: 50000.00,
416
+ fee: 0.01,
417
+ timestamp: 1640995200000
418
+ });
419
+ });
420
+ it('should handle missing fields with fallback values', async () => {
421
+ await setupUserStream();
422
+ const { callback, wrappedCallback } = await setupTradeSubscription();
423
+ const mockData = {
424
+ id: 'order123',
425
+ symbol: 'BTC/USDT',
426
+ side: 'sell',
427
+ status: 'filled'
428
+ };
429
+ const currentTime = Date.now();
430
+ wrappedCallback(mockData);
431
+ expect(callback).toHaveBeenCalledWith(expect.objectContaining({
432
+ id: expect.stringMatching(/order123_\d+/),
433
+ orderId: 'order123',
434
+ symbol: 'BTC/USDT',
435
+ side: 'sell',
436
+ amount: 0,
437
+ price: 0,
438
+ fee: 0,
439
+ timestamp: expect.any(Number)
440
+ }));
441
+ const actualCall = callback.mock.calls[0][0];
442
+ expect(actualCall.timestamp).toBeGreaterThanOrEqual(currentTime);
443
+ });
444
+ it('should use executedQty as fallback for amount', async () => {
445
+ await setupUserStream();
446
+ const { callback, wrappedCallback } = await setupTradeSubscription();
447
+ const mockData = {
448
+ id: 'order123',
449
+ symbol: 'BTC/USDT',
450
+ side: 'buy',
451
+ executedQty: '2.5',
452
+ status: 'filled'
453
+ };
454
+ wrappedCallback(mockData);
455
+ expect(callback).toHaveBeenCalledWith(expect.objectContaining({
456
+ amount: 2.5
457
+ }));
458
+ });
459
+ });
460
+ describe('edge cases and error handling', () => {
461
+ it('should handle malformed data in trade processing', async () => {
462
+ await setupUserStream();
463
+ const { callback, wrappedCallback } = await setupTradeSubscription();
464
+ wrappedCallback(null);
465
+ wrappedCallback(undefined);
466
+ wrappedCallback({});
467
+ wrappedCallback({ status: null, filled: null, amount: null });
468
+ expect(callback).not.toHaveBeenCalled();
469
+ });
470
+ it('should handle numeric string parsing errors gracefully', async () => {
471
+ await setupUserStream();
472
+ const { callback, wrappedCallback } = await setupTradeSubscription();
473
+ const mockData = {
474
+ id: 'order123',
475
+ symbol: 'BTC/USDT',
476
+ side: 'buy',
477
+ filled: 'invalid_number',
478
+ price: 'invalid_price',
479
+ fee: 'invalid_fee',
480
+ status: 'filled'
481
+ };
482
+ wrappedCallback(mockData);
483
+ expect(callback).toHaveBeenCalledWith(expect.objectContaining({
484
+ amount: NaN,
485
+ price: NaN,
486
+ fee: NaN
487
+ }));
488
+ });
489
+ it('should handle zero filled amounts correctly', async () => {
490
+ await setupUserStream();
491
+ const { callback, wrappedCallback } = await setupTradeSubscription();
492
+ const mockData = {
493
+ status: 'open',
494
+ filled: 0,
495
+ amount: 1.0
496
+ };
497
+ wrappedCallback(mockData);
498
+ expect(callback).not.toHaveBeenCalled();
499
+ });
500
+ });
501
+ });
502
+ //# sourceMappingURL=mexc-user-stream.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mexc-user-stream.test.js","sourceRoot":"","sources":["../../../../../src/tests/unit/exchanges/mexc/mexc-user-stream.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mexc-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mexc-utils.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/unit/exchanges/mexc/mexc-utils.test.ts"],"names":[],"mappings":""}