iqoptionapi-node 1.0.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 (147) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +219 -0
  3. package/dist/auth/CredentialAbstraction.d.ts +25 -0
  4. package/dist/auth/CredentialAbstraction.d.ts.map +1 -0
  5. package/dist/auth/CredentialAbstraction.js +46 -0
  6. package/dist/auth/CredentialAbstraction.js.map +1 -0
  7. package/dist/auth/EmailPasswordAuth.d.ts +11 -0
  8. package/dist/auth/EmailPasswordAuth.d.ts.map +1 -0
  9. package/dist/auth/EmailPasswordAuth.js +36 -0
  10. package/dist/auth/EmailPasswordAuth.js.map +1 -0
  11. package/dist/auth/SessionManager.d.ts +14 -0
  12. package/dist/auth/SessionManager.d.ts.map +1 -0
  13. package/dist/auth/SessionManager.js +51 -0
  14. package/dist/auth/SessionManager.js.map +1 -0
  15. package/dist/auth/SsidAuth.d.ts +10 -0
  16. package/dist/auth/SsidAuth.d.ts.map +1 -0
  17. package/dist/auth/SsidAuth.js +26 -0
  18. package/dist/auth/SsidAuth.js.map +1 -0
  19. package/dist/client/IQOptionClient.d.ts +58 -0
  20. package/dist/client/IQOptionClient.d.ts.map +1 -0
  21. package/dist/client/IQOptionClient.js +125 -0
  22. package/dist/client/IQOptionClient.js.map +1 -0
  23. package/dist/errors/index.d.ts +22 -0
  24. package/dist/errors/index.d.ts.map +1 -0
  25. package/dist/errors/index.js +53 -0
  26. package/dist/errors/index.js.map +1 -0
  27. package/dist/index.d.ts +8 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +22 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/logger/index.d.ts +6 -0
  32. package/dist/logger/index.d.ts.map +1 -0
  33. package/dist/logger/index.js +33 -0
  34. package/dist/logger/index.js.map +1 -0
  35. package/dist/market-data/AssetCatalog.d.ts +16 -0
  36. package/dist/market-data/AssetCatalog.d.ts.map +1 -0
  37. package/dist/market-data/AssetCatalog.js +45 -0
  38. package/dist/market-data/AssetCatalog.js.map +1 -0
  39. package/dist/market-data/CandleBuffer.d.ts +12 -0
  40. package/dist/market-data/CandleBuffer.d.ts.map +1 -0
  41. package/dist/market-data/CandleBuffer.js +44 -0
  42. package/dist/market-data/CandleBuffer.js.map +1 -0
  43. package/dist/market-data/CandleStream.d.ts +19 -0
  44. package/dist/market-data/CandleStream.d.ts.map +1 -0
  45. package/dist/market-data/CandleStream.js +73 -0
  46. package/dist/market-data/CandleStream.js.map +1 -0
  47. package/dist/market-data/HistoricalCandles.d.ts +11 -0
  48. package/dist/market-data/HistoricalCandles.d.ts.map +1 -0
  49. package/dist/market-data/HistoricalCandles.js +32 -0
  50. package/dist/market-data/HistoricalCandles.js.map +1 -0
  51. package/dist/market-data/TickAggregator.d.ts +13 -0
  52. package/dist/market-data/TickAggregator.d.ts.map +1 -0
  53. package/dist/market-data/TickAggregator.js +40 -0
  54. package/dist/market-data/TickAggregator.js.map +1 -0
  55. package/dist/market-data/TickStream.d.ts +18 -0
  56. package/dist/market-data/TickStream.d.ts.map +1 -0
  57. package/dist/market-data/TickStream.js +68 -0
  58. package/dist/market-data/TickStream.js.map +1 -0
  59. package/dist/protocol/V1Adapter.d.ts +20 -0
  60. package/dist/protocol/V1Adapter.d.ts.map +1 -0
  61. package/dist/protocol/V1Adapter.js +21 -0
  62. package/dist/protocol/V1Adapter.js.map +1 -0
  63. package/dist/trading/BinaryOptions.d.ts +31 -0
  64. package/dist/trading/BinaryOptions.d.ts.map +1 -0
  65. package/dist/trading/BinaryOptions.js +107 -0
  66. package/dist/trading/BinaryOptions.js.map +1 -0
  67. package/dist/trading/DigitalOptions.d.ts +31 -0
  68. package/dist/trading/DigitalOptions.d.ts.map +1 -0
  69. package/dist/trading/DigitalOptions.js +107 -0
  70. package/dist/trading/DigitalOptions.js.map +1 -0
  71. package/dist/trading/OrderCache.d.ts +17 -0
  72. package/dist/trading/OrderCache.d.ts.map +1 -0
  73. package/dist/trading/OrderCache.js +39 -0
  74. package/dist/trading/OrderCache.js.map +1 -0
  75. package/dist/trading/OrderHistory.d.ts +9 -0
  76. package/dist/trading/OrderHistory.d.ts.map +1 -0
  77. package/dist/trading/OrderHistory.js +17 -0
  78. package/dist/trading/OrderHistory.js.map +1 -0
  79. package/dist/transformers/entities.d.ts +8 -0
  80. package/dist/transformers/entities.d.ts.map +1 -0
  81. package/dist/transformers/entities.js +51 -0
  82. package/dist/transformers/entities.js.map +1 -0
  83. package/dist/transformers/toCamelCase.d.ts +2 -0
  84. package/dist/transformers/toCamelCase.d.ts.map +1 -0
  85. package/dist/transformers/toCamelCase.js +18 -0
  86. package/dist/transformers/toCamelCase.js.map +1 -0
  87. package/dist/transport/MessageRouter.d.ts +17 -0
  88. package/dist/transport/MessageRouter.d.ts.map +1 -0
  89. package/dist/transport/MessageRouter.js +87 -0
  90. package/dist/transport/MessageRouter.js.map +1 -0
  91. package/dist/transport/ReconnectionManager.d.ts +25 -0
  92. package/dist/transport/ReconnectionManager.d.ts.map +1 -0
  93. package/dist/transport/ReconnectionManager.js +63 -0
  94. package/dist/transport/ReconnectionManager.js.map +1 -0
  95. package/dist/transport/WebSocketTransport.d.ts +21 -0
  96. package/dist/transport/WebSocketTransport.d.ts.map +1 -0
  97. package/dist/transport/WebSocketTransport.js +68 -0
  98. package/dist/transport/WebSocketTransport.js.map +1 -0
  99. package/dist/types/logger.d.ts +7 -0
  100. package/dist/types/logger.d.ts.map +1 -0
  101. package/dist/types/logger.js +3 -0
  102. package/dist/types/logger.js.map +1 -0
  103. package/dist/types/market-data.d.ts +38 -0
  104. package/dist/types/market-data.d.ts.map +1 -0
  105. package/dist/types/market-data.js +3 -0
  106. package/dist/types/market-data.js.map +1 -0
  107. package/dist/types/messages.d.ts +8 -0
  108. package/dist/types/messages.d.ts.map +1 -0
  109. package/dist/types/messages.js +3 -0
  110. package/dist/types/messages.js.map +1 -0
  111. package/dist/types/primitives.d.ts +29 -0
  112. package/dist/types/primitives.d.ts.map +1 -0
  113. package/dist/types/primitives.js +29 -0
  114. package/dist/types/primitives.js.map +1 -0
  115. package/dist/types/profile.d.ts +24 -0
  116. package/dist/types/profile.d.ts.map +1 -0
  117. package/dist/types/profile.js +3 -0
  118. package/dist/types/profile.js.map +1 -0
  119. package/dist/types/raw/asset.d.ts +20 -0
  120. package/dist/types/raw/asset.d.ts.map +1 -0
  121. package/dist/types/raw/asset.js +3 -0
  122. package/dist/types/raw/asset.js.map +1 -0
  123. package/dist/types/raw/candle.d.ts +15 -0
  124. package/dist/types/raw/candle.d.ts.map +1 -0
  125. package/dist/types/raw/candle.js +3 -0
  126. package/dist/types/raw/candle.js.map +1 -0
  127. package/dist/types/raw/order.d.ts +31 -0
  128. package/dist/types/raw/order.d.ts.map +1 -0
  129. package/dist/types/raw/order.js +3 -0
  130. package/dist/types/raw/order.js.map +1 -0
  131. package/dist/types/raw/tick.d.ts +9 -0
  132. package/dist/types/raw/tick.d.ts.map +1 -0
  133. package/dist/types/raw/tick.js +3 -0
  134. package/dist/types/raw/tick.js.map +1 -0
  135. package/dist/types/trading.d.ts +38 -0
  136. package/dist/types/trading.d.ts.map +1 -0
  137. package/dist/types/trading.js +3 -0
  138. package/dist/types/trading.js.map +1 -0
  139. package/dist/validators/malformedMessage.d.ts +16 -0
  140. package/dist/validators/malformedMessage.d.ts.map +1 -0
  141. package/dist/validators/malformedMessage.js +15 -0
  142. package/dist/validators/malformedMessage.js.map +1 -0
  143. package/dist/validators/messageSchema.d.ts +7 -0
  144. package/dist/validators/messageSchema.d.ts.map +1 -0
  145. package/dist/validators/messageSchema.js +25 -0
  146. package/dist/validators/messageSchema.js.map +1 -0
  147. package/package.json +81 -0
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IQOptionClient = void 0;
4
+ const WebSocketTransport_1 = require("../transport/WebSocketTransport");
5
+ const MessageRouter_1 = require("../transport/MessageRouter");
6
+ const ReconnectionManager_1 = require("../transport/ReconnectionManager");
7
+ const SessionManager_1 = require("../auth/SessionManager");
8
+ const EmailPasswordAuth_1 = require("../auth/EmailPasswordAuth");
9
+ const SsidAuth_1 = require("../auth/SsidAuth");
10
+ const CredentialAbstraction_1 = require("../auth/CredentialAbstraction");
11
+ const AssetCatalog_1 = require("../market-data/AssetCatalog");
12
+ const HistoricalCandles_1 = require("../market-data/HistoricalCandles");
13
+ const CandleStream_1 = require("../market-data/CandleStream");
14
+ const TickStream_1 = require("../market-data/TickStream");
15
+ const OrderCache_1 = require("../trading/OrderCache");
16
+ const BinaryOptions_1 = require("../trading/BinaryOptions");
17
+ const DigitalOptions_1 = require("../trading/DigitalOptions");
18
+ const OrderHistory_1 = require("../trading/OrderHistory");
19
+ const logger_1 = require("../logger");
20
+ const IQ_WS_URL = 'wss://iqoption.com/echo/websocket';
21
+ class IQOptionClient {
22
+ transport;
23
+ router;
24
+ reconnection;
25
+ session;
26
+ emailAuth;
27
+ ssidAuth;
28
+ catalog;
29
+ historical;
30
+ candleStream;
31
+ tickStream;
32
+ orderCache;
33
+ binaryOptions;
34
+ digitalOptions;
35
+ orderHistory;
36
+ constructor(options = {}) {
37
+ const url = options.url ?? IQ_WS_URL;
38
+ const logger = options.logger ?? (options.silent ? logger_1.noopLogger : (0, logger_1.createConsoleLogger)());
39
+ const maxRetries = options.maxReconnectRetries ?? 5;
40
+ this.transport = new WebSocketTransport_1.WebSocketTransport(url);
41
+ this.router = new MessageRouter_1.MessageRouter(this.transport);
42
+ this.reconnection = new ReconnectionManager_1.ReconnectionManager(this.transport, maxRetries);
43
+ this.session = new SessionManager_1.SessionManager(logger);
44
+ this.emailAuth = new EmailPasswordAuth_1.EmailPasswordAuth(this.router, this.session);
45
+ this.ssidAuth = new SsidAuth_1.SsidAuth(this.router, this.session);
46
+ this.catalog = new AssetCatalog_1.AssetCatalog(this.router);
47
+ this.historical = new HistoricalCandles_1.HistoricalCandles(this.router, this.catalog);
48
+ this.candleStream = new CandleStream_1.CandleStream(this.router, this.catalog, this.reconnection);
49
+ this.tickStream = new TickStream_1.TickStream(this.router, this.catalog, this.reconnection);
50
+ this.orderCache = new OrderCache_1.OrderCache();
51
+ this.binaryOptions = new BinaryOptions_1.BinaryOptions(this.router, this.catalog, this.orderCache);
52
+ this.digitalOptions = new DigitalOptions_1.DigitalOptions(this.router, this.catalog, this.orderCache);
53
+ this.orderHistory = new OrderHistory_1.OrderHistory(this.orderCache);
54
+ }
55
+ async connect() {
56
+ await this.transport.connect();
57
+ }
58
+ disconnect() {
59
+ this.reconnection.reset();
60
+ this.router.clearPending();
61
+ this.transport.disconnect();
62
+ }
63
+ async login(credentials) {
64
+ return this.emailAuth.login(new CredentialAbstraction_1.EmailPasswordCredentials(credentials.email, credentials.password));
65
+ }
66
+ async restoreSession(ssid) {
67
+ return this.ssidAuth.restore(ssid);
68
+ }
69
+ getProfile() {
70
+ return this.session.getProfile();
71
+ }
72
+ // --- Assets ---
73
+ getAllAssets() {
74
+ return this.catalog.getAllAssets();
75
+ }
76
+ getOpenAssets() {
77
+ return this.catalog.getOpenAssets();
78
+ }
79
+ getOtcAssets() {
80
+ return this.catalog.getOtcAssets();
81
+ }
82
+ getNonOtcAssets() {
83
+ return this.catalog.getNonOtcAssets();
84
+ }
85
+ getAsset(symbol) {
86
+ return this.catalog.getAsset(symbol);
87
+ }
88
+ // --- Market Data ---
89
+ getCandles(symbol, timeframe, count, endTime) {
90
+ return this.historical.getCandles(symbol, timeframe, count, endTime);
91
+ }
92
+ subscribeCandles(symbol, timeframe, callback) {
93
+ this.candleStream.subscribe(symbol, timeframe, callback);
94
+ }
95
+ unsubscribeCandles(symbol, timeframe) {
96
+ this.candleStream.unsubscribe(symbol, timeframe);
97
+ }
98
+ subscribeQuotes(symbol, callback) {
99
+ this.tickStream.subscribe(symbol, callback);
100
+ }
101
+ unsubscribeQuotes(symbol) {
102
+ this.tickStream.unsubscribe(symbol);
103
+ }
104
+ // --- Trading ---
105
+ buyBinaryOption(params) {
106
+ return this.binaryOptions.buy(params);
107
+ }
108
+ checkBinaryOptionResult(orderId, timeoutMs) {
109
+ return this.binaryOptions.checkResult(orderId, timeoutMs);
110
+ }
111
+ buyDigitalOption(params) {
112
+ return this.digitalOptions.buy(params);
113
+ }
114
+ checkDigitalOptionResult(orderId, timeoutMs) {
115
+ return this.digitalOptions.checkResult(orderId, timeoutMs);
116
+ }
117
+ getOpenPositions() {
118
+ return this.orderHistory.getOpenPositions();
119
+ }
120
+ getClosedPositions(limit) {
121
+ return this.orderHistory.getClosedPositions(limit);
122
+ }
123
+ }
124
+ exports.IQOptionClient = IQOptionClient;
125
+ //# sourceMappingURL=IQOptionClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IQOptionClient.js","sourceRoot":"","sources":["../../src/client/IQOptionClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export declare class IQOptionError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class AuthenticationError extends IQOptionError {
5
+ constructor(message: string);
6
+ }
7
+ export declare class ConnectionError extends IQOptionError {
8
+ constructor(message: string);
9
+ }
10
+ export declare class ProtocolError extends IQOptionError {
11
+ constructor(message: string);
12
+ }
13
+ export declare class TradingError extends IQOptionError {
14
+ constructor(message: string);
15
+ }
16
+ export declare class ValidationError extends IQOptionError {
17
+ constructor(message: string);
18
+ }
19
+ export declare class TimeoutError extends IQOptionError {
20
+ constructor(message: string);
21
+ }
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,mBAAoB,SAAQ,aAAa;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAgB,SAAQ,aAAa;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,aAAc,SAAQ,aAAa;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,YAAa,SAAQ,aAAa;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAgB,SAAQ,aAAa;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,YAAa,SAAQ,aAAa;gBACjC,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TimeoutError = exports.ValidationError = exports.TradingError = exports.ProtocolError = exports.ConnectionError = exports.AuthenticationError = exports.IQOptionError = void 0;
4
+ class IQOptionError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = 'IQOptionError';
8
+ }
9
+ }
10
+ exports.IQOptionError = IQOptionError;
11
+ class AuthenticationError extends IQOptionError {
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = 'AuthenticationError';
15
+ }
16
+ }
17
+ exports.AuthenticationError = AuthenticationError;
18
+ class ConnectionError extends IQOptionError {
19
+ constructor(message) {
20
+ super(message);
21
+ this.name = 'ConnectionError';
22
+ }
23
+ }
24
+ exports.ConnectionError = ConnectionError;
25
+ class ProtocolError extends IQOptionError {
26
+ constructor(message) {
27
+ super(message);
28
+ this.name = 'ProtocolError';
29
+ }
30
+ }
31
+ exports.ProtocolError = ProtocolError;
32
+ class TradingError extends IQOptionError {
33
+ constructor(message) {
34
+ super(message);
35
+ this.name = 'TradingError';
36
+ }
37
+ }
38
+ exports.TradingError = TradingError;
39
+ class ValidationError extends IQOptionError {
40
+ constructor(message) {
41
+ super(message);
42
+ this.name = 'ValidationError';
43
+ }
44
+ }
45
+ exports.ValidationError = ValidationError;
46
+ class TimeoutError extends IQOptionError {
47
+ constructor(message) {
48
+ super(message);
49
+ this.name = 'TimeoutError';
50
+ }
51
+ }
52
+ exports.TimeoutError = TimeoutError;
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AALD,sCAKC;AAED,MAAa,mBAAoB,SAAQ,aAAa;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC;AAED,MAAa,eAAgB,SAAQ,aAAa;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AALD,0CAKC;AAED,MAAa,aAAc,SAAQ,aAAa;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AALD,sCAKC;AAED,MAAa,YAAa,SAAQ,aAAa;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AALD,oCAKC;AAED,MAAa,eAAgB,SAAQ,aAAa;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AALD,0CAKC;AAED,MAAa,YAAa,SAAQ,aAAa;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AALD,oCAKC"}
@@ -0,0 +1,8 @@
1
+ export { IQOptionClient } from './client/IQOptionClient';
2
+ export type { IQOptionClientOptions } from './client/IQOptionClient';
3
+ export * from './types/primitives';
4
+ export * from './errors';
5
+ export type { IQAsset, IQCandle, IQTick, IQAssetMap, Schedule } from './types/market-data';
6
+ export type { IQProfile } from './types/profile';
7
+ export type { IQPosition, BuyBinaryOptionParams, BuyDigitalOptionParams, BinaryOptionResult, DigitalOptionResult, OrderStatus, OrderResult, } from './types/trading';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AAEzB,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC3F,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EACV,UAAU,EACV,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,WAAW,GACZ,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.IQOptionClient = void 0;
18
+ var IQOptionClient_1 = require("./client/IQOptionClient");
19
+ Object.defineProperty(exports, "IQOptionClient", { enumerable: true, get: function () { return IQOptionClient_1.IQOptionClient; } });
20
+ __exportStar(require("./types/primitives"), exports);
21
+ __exportStar(require("./errors"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0DAAyD;AAAhD,gHAAA,cAAc,OAAA;AAGvB,qDAAmC;AACnC,2CAAyB"}
@@ -0,0 +1,6 @@
1
+ import type { ILogger } from '../types/logger';
2
+ type LogLevel = 'debug' | 'info' | 'warn' | 'error';
3
+ export declare function createConsoleLogger(minLevel?: LogLevel): ILogger;
4
+ export declare const noopLogger: ILogger;
5
+ export {};
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAIpD,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,QAAiB,GAAG,OAAO,CAgBxE;AAED,eAAO,MAAM,UAAU,EAAE,OAKxB,CAAC"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.noopLogger = void 0;
4
+ exports.createConsoleLogger = createConsoleLogger;
5
+ const LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };
6
+ function createConsoleLogger(minLevel = 'info') {
7
+ const min = LEVELS[minLevel];
8
+ return {
9
+ debug: (msg) => {
10
+ if (LEVELS.debug >= min)
11
+ console.debug(`[IQOption] ${msg}`);
12
+ },
13
+ info: (msg) => {
14
+ if (LEVELS.info >= min)
15
+ console.info(`[IQOption] ${msg}`);
16
+ },
17
+ warn: (msg) => {
18
+ if (LEVELS.warn >= min)
19
+ console.warn(`[IQOption] ${msg}`);
20
+ },
21
+ error: (msg) => {
22
+ if (LEVELS.error >= min)
23
+ console.error(`[IQOption] ${msg}`);
24
+ },
25
+ };
26
+ }
27
+ exports.noopLogger = {
28
+ debug: () => undefined,
29
+ info: () => undefined,
30
+ warn: () => undefined,
31
+ error: () => undefined,
32
+ };
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":";;;AAMA,kDAgBC;AAlBD,MAAM,MAAM,GAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAElF,SAAgB,mBAAmB,CAAC,WAAqB,MAAM;IAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;YACb,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG;gBAAE,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACZ,IAAI,MAAM,CAAC,IAAI,IAAI,GAAG;gBAAE,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACZ,IAAI,MAAM,CAAC,IAAI,IAAI,GAAG;gBAAE,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;YACb,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG;gBAAE,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;QAC9D,CAAC;KACF,CAAC;AACJ,CAAC;AAEY,QAAA,UAAU,GAAY;IACjC,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;IACtB,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;IACrB,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;IACrB,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;CACvB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { MessageRouter } from '../transport/MessageRouter';
2
+ import type { IQAsset } from '../types/market-data';
3
+ import type { ActiveId } from '../types/primitives';
4
+ export declare class AssetCatalog {
5
+ private readonly byId;
6
+ private readonly byName;
7
+ constructor(router: MessageRouter);
8
+ private populate;
9
+ getAsset(symbol: string): IQAsset | undefined;
10
+ getAssetById(activeId: ActiveId): IQAsset | undefined;
11
+ getAllAssets(): IQAsset[];
12
+ getOpenAssets(): IQAsset[];
13
+ getOtcAssets(): IQAsset[];
14
+ getNonOtcAssets(): IQAsset[];
15
+ }
16
+ //# sourceMappingURL=AssetCatalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetCatalog.d.ts","sourceRoot":"","sources":["../../src/market-data/AssetCatalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,KAAK,EAAE,OAAO,EAAc,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAIpD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;gBAEzC,MAAM,EAAE,aAAa;IAOjC,OAAO,CAAC,QAAQ;IAWhB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAK7C,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS;IAIrD,YAAY,IAAI,OAAO,EAAE;IAIzB,aAAa,IAAI,OAAO,EAAE;IAI1B,YAAY,IAAI,OAAO,EAAE;IAIzB,eAAe,IAAI,OAAO,EAAE;CAG7B"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AssetCatalog = void 0;
4
+ const entities_1 = require("../transformers/entities");
5
+ const V1Adapter_1 = require("../protocol/V1Adapter");
6
+ class AssetCatalog {
7
+ byId = new Map();
8
+ byName = new Map();
9
+ constructor(router) {
10
+ router.registerHandler(V1Adapter_1.V1Adapter.initData, (msg) => {
11
+ const data = msg.msg;
12
+ this.populate(data);
13
+ });
14
+ }
15
+ populate(data) {
16
+ this.byId.clear();
17
+ this.byName.clear();
18
+ for (const raw of data.instruments) {
19
+ const asset = (0, entities_1.transformAsset)(raw);
20
+ this.byId.set(asset.activeId, asset);
21
+ this.byName.set(asset.name.toUpperCase(), asset);
22
+ }
23
+ }
24
+ getAsset(symbol) {
25
+ const upper = symbol.toUpperCase();
26
+ return this.byName.get(upper) ?? this.byName.get(`${upper}-OTC`);
27
+ }
28
+ getAssetById(activeId) {
29
+ return this.byId.get(activeId);
30
+ }
31
+ getAllAssets() {
32
+ return Array.from(this.byId.values());
33
+ }
34
+ getOpenAssets() {
35
+ return this.getAllAssets().filter((a) => !a.isSuspended);
36
+ }
37
+ getOtcAssets() {
38
+ return this.getAllAssets().filter((a) => a.isOtc);
39
+ }
40
+ getNonOtcAssets() {
41
+ return this.getAllAssets().filter((a) => !a.isOtc);
42
+ }
43
+ }
44
+ exports.AssetCatalog = AssetCatalog;
45
+ //# sourceMappingURL=AssetCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetCatalog.js","sourceRoot":"","sources":["../../src/market-data/AssetCatalog.ts"],"names":[],"mappings":";;;AAIA,uDAA0D;AAC1D,qDAAkD;AAElD,MAAa,YAAY;IACN,IAAI,GAAe,IAAI,GAAG,EAAE,CAAC;IAC7B,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;IAErD,YAAY,MAAqB;QAC/B,MAAM,CAAC,eAAe,CAAC,qBAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;YACjD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAoB,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,IAAmB;QAClC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,IAAA,yBAAc,EAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;IACnE,CAAC;IAED,YAAY,CAAC,QAAkB;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC3D,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;CACF;AA9CD,oCA8CC"}
@@ -0,0 +1,12 @@
1
+ import type { IQCandle } from '../types/market-data';
2
+ export declare class CandleBuffer {
3
+ private readonly candles;
4
+ private readonly maxSize;
5
+ constructor(maxSize?: number);
6
+ push(candle: IQCandle): void;
7
+ getAll(): readonly IQCandle[];
8
+ getLast(count: number): readonly IQCandle[];
9
+ clear(): void;
10
+ get size(): number;
11
+ }
12
+ //# sourceMappingURL=CandleBuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CandleBuffer.d.ts","sourceRoot":"","sources":["../../src/market-data/CandleBuffer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIrD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,SAAc;IAIjC,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI;IAuB5B,MAAM,IAAI,SAAS,QAAQ,EAAE;IAI7B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,QAAQ,EAAE;IAI3C,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CandleBuffer = void 0;
4
+ const DEFAULT_MAX = 500;
5
+ class CandleBuffer {
6
+ candles = [];
7
+ maxSize;
8
+ constructor(maxSize = DEFAULT_MAX) {
9
+ this.maxSize = maxSize;
10
+ }
11
+ push(candle) {
12
+ const existing = this.candles.findIndex((c) => c.time === candle.time);
13
+ if (existing !== -1) {
14
+ this.candles[existing] = candle; // update in place (same-timestamp merge)
15
+ return;
16
+ }
17
+ // Insert at the correct position to keep the array sorted by time.
18
+ let insertAt = this.candles.length;
19
+ for (let i = this.candles.length - 1; i >= 0; i--) {
20
+ const c = this.candles[i];
21
+ if (c !== undefined && c.time <= candle.time)
22
+ break;
23
+ insertAt = i;
24
+ }
25
+ this.candles.splice(insertAt, 0, candle);
26
+ if (this.candles.length > this.maxSize) {
27
+ this.candles.shift(); // drop oldest
28
+ }
29
+ }
30
+ getAll() {
31
+ return this.candles;
32
+ }
33
+ getLast(count) {
34
+ return this.candles.slice(-count);
35
+ }
36
+ clear() {
37
+ this.candles.length = 0;
38
+ }
39
+ get size() {
40
+ return this.candles.length;
41
+ }
42
+ }
43
+ exports.CandleBuffer = CandleBuffer;
44
+ //# sourceMappingURL=CandleBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CandleBuffer.js","sourceRoot":"","sources":["../../src/market-data/CandleBuffer.ts"],"names":[],"mappings":";;;AAEA,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,MAAa,YAAY;IACN,OAAO,GAAe,EAAE,CAAC;IACzB,OAAO,CAAS;IAEjC,YAAY,OAAO,GAAG,WAAW;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,MAAgB;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvE,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC,yCAAyC;YAC1E,OAAO;QACT,CAAC;QAED,mEAAmE;QACnE,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI;gBAAE,MAAM;YACpD,QAAQ,GAAG,CAAC,CAAC;QACf,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAEzC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,cAAc;QACtC,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;CACF;AA9CD,oCA8CC"}
@@ -0,0 +1,19 @@
1
+ import type { MessageRouter } from '../transport/MessageRouter';
2
+ import type { ReconnectionManager } from '../transport/ReconnectionManager';
3
+ import type { AssetCatalog } from './AssetCatalog';
4
+ import type { IQCandle } from '../types/market-data';
5
+ import type { TimeFrame } from '../types/primitives';
6
+ import { CandleBuffer } from './CandleBuffer';
7
+ export declare class CandleStream {
8
+ private readonly router;
9
+ private readonly catalog;
10
+ private readonly subs;
11
+ constructor(router: MessageRouter, catalog: AssetCatalog, reconnection: ReconnectionManager);
12
+ subscribe(symbol: string, timeframe: TimeFrame, callback: (candle: IQCandle) => void): void;
13
+ unsubscribe(symbol: string, timeframe: TimeFrame): void;
14
+ getBuffer(symbol: string, timeframe: TimeFrame): CandleBuffer | undefined;
15
+ private resubscribeAll;
16
+ private sendSubscribe;
17
+ private sendUnsubscribe;
18
+ }
19
+ //# sourceMappingURL=CandleStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CandleStream.d.ts","sourceRoot":"","sources":["../../src/market-data/CandleStream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,4BAA4B,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAiB9C,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmC;gBAE5C,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB;IAQ3F,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAuB3F,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAUvD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS;IAIzE,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,eAAe;CAMxB"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CandleStream = void 0;
4
+ const CandleBuffer_1 = require("./CandleBuffer");
5
+ const entities_1 = require("../transformers/entities");
6
+ const errors_1 = require("../errors");
7
+ const V1Adapter_1 = require("../protocol/V1Adapter");
8
+ function subKey(symbol, timeframe) {
9
+ return `${symbol.toUpperCase()}:${String(timeframe)}`;
10
+ }
11
+ class CandleStream {
12
+ router;
13
+ catalog;
14
+ subs = new Map();
15
+ constructor(router, catalog, reconnection) {
16
+ this.router = router;
17
+ this.catalog = catalog;
18
+ reconnection.on('reconnected', () => {
19
+ this.resubscribeAll();
20
+ });
21
+ }
22
+ subscribe(symbol, timeframe, callback) {
23
+ const key = subKey(symbol, timeframe);
24
+ if (this.subs.has(key))
25
+ return;
26
+ const asset = this.catalog.getAsset(symbol);
27
+ if (!asset)
28
+ throw new errors_1.ValidationError(`Unknown asset: ${symbol}`);
29
+ const buffer = new CandleBuffer_1.CandleBuffer();
30
+ const handler = (msg) => {
31
+ const raw = msg.msg;
32
+ if (raw.active_id !== asset.activeId || raw.size !== timeframe)
33
+ return;
34
+ const candle = (0, entities_1.transformCandle)(raw);
35
+ buffer.push(candle);
36
+ callback(candle);
37
+ };
38
+ this.router.registerHandler(V1Adapter_1.V1Adapter.candleGenerated, handler);
39
+ this.sendSubscribe(asset.activeId, timeframe);
40
+ this.subs.set(key, { activeId: asset.activeId, timeframe, buffer, handler, callback });
41
+ }
42
+ unsubscribe(symbol, timeframe) {
43
+ const key = subKey(symbol, timeframe);
44
+ const sub = this.subs.get(key);
45
+ if (!sub)
46
+ return;
47
+ this.router.unregisterHandler(V1Adapter_1.V1Adapter.candleGenerated, sub.handler);
48
+ this.sendUnsubscribe(sub.activeId, sub.timeframe);
49
+ this.subs.delete(key);
50
+ }
51
+ getBuffer(symbol, timeframe) {
52
+ return this.subs.get(subKey(symbol, timeframe))?.buffer;
53
+ }
54
+ resubscribeAll() {
55
+ for (const sub of this.subs.values()) {
56
+ this.sendSubscribe(sub.activeId, sub.timeframe);
57
+ }
58
+ }
59
+ sendSubscribe(activeId, timeframe) {
60
+ this.router.sendMessage(V1Adapter_1.V1Adapter.subscribe, {
61
+ name: V1Adapter_1.V1Adapter.candleGenerated,
62
+ params: { active_id: activeId, size: timeframe },
63
+ });
64
+ }
65
+ sendUnsubscribe(activeId, timeframe) {
66
+ this.router.sendMessage(V1Adapter_1.V1Adapter.unsubscribe, {
67
+ name: V1Adapter_1.V1Adapter.candleGenerated,
68
+ params: { active_id: activeId, size: timeframe },
69
+ });
70
+ }
71
+ }
72
+ exports.CandleStream = CandleStream;
73
+ //# sourceMappingURL=CandleStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CandleStream.js","sourceRoot":"","sources":["../../src/market-data/CandleStream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MessageRouter } from '../transport/MessageRouter';
2
+ import type { AssetCatalog } from './AssetCatalog';
3
+ import type { IQCandle } from '../types/market-data';
4
+ import type { TimeFrame } from '../types/primitives';
5
+ export declare class HistoricalCandles {
6
+ private readonly router;
7
+ private readonly catalog;
8
+ constructor(router: MessageRouter, catalog: AssetCatalog);
9
+ getCandles(symbol: string, timeframe: TimeFrame, count: number, endTime?: number): Promise<IQCandle[]>;
10
+ }
11
+ //# sourceMappingURL=HistoricalCandles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HistoricalCandles.d.ts","sourceRoot":"","sources":["../../src/market-data/HistoricalCandles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAMrD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;gBAE3B,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY;IAKlD,UAAU,CACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,EAAE,CAAC;CAmBvB"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HistoricalCandles = void 0;
4
+ const entities_1 = require("../transformers/entities");
5
+ const errors_1 = require("../errors");
6
+ const V1Adapter_1 = require("../protocol/V1Adapter");
7
+ class HistoricalCandles {
8
+ router;
9
+ catalog;
10
+ constructor(router, catalog) {
11
+ this.router = router;
12
+ this.catalog = catalog;
13
+ }
14
+ async getCandles(symbol, timeframe, count, endTime) {
15
+ const asset = this.catalog.getAsset(symbol);
16
+ if (!asset)
17
+ throw new errors_1.ValidationError(`Unknown asset: ${symbol}`);
18
+ if (count <= 0)
19
+ throw new errors_1.ValidationError('count must be greater than 0');
20
+ const params = {
21
+ active_id: asset.activeId,
22
+ size: timeframe,
23
+ count,
24
+ };
25
+ if (endTime !== undefined)
26
+ params['to'] = Math.floor(endTime / 1000);
27
+ const response = await this.router.sendRequest(V1Adapter_1.V1Adapter.getCandles, params);
28
+ return response.msg.candles.map(entities_1.transformCandle).sort((a, b) => a.time - b.time);
29
+ }
30
+ }
31
+ exports.HistoricalCandles = HistoricalCandles;
32
+ //# sourceMappingURL=HistoricalCandles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HistoricalCandles.js","sourceRoot":"","sources":["../../src/market-data/HistoricalCandles.ts"],"names":[],"mappings":";;;AAKA,uDAA2D;AAC3D,sCAA4C;AAC5C,qDAAkD;AAElD,MAAa,iBAAiB;IACX,MAAM,CAAgB;IACtB,OAAO,CAAe;IAEvC,YAAY,MAAqB,EAAE,OAAqB;QACtD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,UAAU,CACd,MAAc,EACd,SAAoB,EACpB,KAAa,EACb,OAAgB;QAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,wBAAe,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;QAClE,IAAI,KAAK,IAAI,CAAC;YAAE,MAAM,IAAI,wBAAe,CAAC,8BAA8B,CAAC,CAAC;QAE1E,MAAM,MAAM,GAA4B;YACtC,SAAS,EAAE,KAAK,CAAC,QAAQ;YACzB,IAAI,EAAE,SAAS;YACf,KAAK;SACN,CAAC;QACF,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAErE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAC5C,qBAAS,CAAC,UAAU,EACpB,MAAM,CACP,CAAC;QAEF,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,0BAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC;CACF;AAjCD,8CAiCC"}
@@ -0,0 +1,13 @@
1
+ import type { IQTick } from '../types/market-data';
2
+ import type { ActiveId } from '../types/primitives';
3
+ export declare class TickAggregator {
4
+ private readonly windows;
5
+ private readonly windowMs;
6
+ private readonly maxTicks;
7
+ constructor(windowMs?: number, maxTicks?: number);
8
+ push(tick: IQTick): void;
9
+ getWindow(assetId: ActiveId): readonly IQTick[];
10
+ clearAsset(assetId: ActiveId): void;
11
+ clear(): void;
12
+ }
13
+ //# sourceMappingURL=TickAggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TickAggregator.d.ts","sourceRoot":"","sources":["../../src/market-data/TickAggregator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAKpD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,QAAQ,SAAoB,EAAE,QAAQ,SAAoB;IAKtE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAgBxB,SAAS,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,MAAM,EAAE;IAI/C,UAAU,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI;IAInC,KAAK,IAAI,IAAI;CAGd"}