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,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transformCandle = transformCandle;
4
+ exports.transformAsset = transformAsset;
5
+ exports.transformTick = transformTick;
6
+ function asActiveId(n) {
7
+ return n;
8
+ }
9
+ function transformCandle(raw) {
10
+ return {
11
+ activeId: asActiveId(raw.active_id),
12
+ timeframe: raw.size,
13
+ open: raw.open,
14
+ high: raw.max,
15
+ low: raw.min,
16
+ close: raw.close,
17
+ volume: raw.volume,
18
+ time: raw.at * 1000, // server sends Unix seconds; SDK uses ms
19
+ };
20
+ }
21
+ function transformAsset(raw) {
22
+ // Dual OTC detection: explicit flag OR -OTC name suffix.
23
+ const isOtc = raw.is_otc === true || raw.name.includes('-OTC');
24
+ const schedules = (raw.schedule ?? []).map((s) => ({
25
+ open: s.open,
26
+ close: s.close,
27
+ }));
28
+ return {
29
+ activeId: asActiveId(raw.id),
30
+ name: raw.name,
31
+ symbol: raw.name.replace(/-OTC$/, ''),
32
+ precision: raw.precision,
33
+ isOtc,
34
+ isSuspended: raw.suspended === true,
35
+ profitPercent: {
36
+ binary: raw.option?.profit ?? 0,
37
+ digital: raw.digital_profit ?? 0,
38
+ },
39
+ schedules,
40
+ };
41
+ }
42
+ function transformTick(raw) {
43
+ return {
44
+ assetId: asActiveId(raw.active_id),
45
+ price: raw.price,
46
+ ask: raw.ask,
47
+ bid: raw.bid,
48
+ time: raw.time * 1000,
49
+ };
50
+ }
51
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/transformers/entities.ts"],"names":[],"mappings":";;AAUA,0CAWC;AAED,wCAqBC;AAED,sCAQC;AAhDD,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAwB,CAAC;AAClC,CAAC;AAED,SAAgB,eAAe,CAAC,GAAgB;IAC9C,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;QACnC,SAAS,EAAE,GAAG,CAAC,IAAI;QACnB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,GAAG;QACb,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,yCAAyC;KAC/D,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAAC,GAAe;IAC5C,yDAAyD;IACzD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAe,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACrC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,KAAK;QACL,WAAW,EAAE,GAAG,CAAC,SAAS,KAAK,IAAI;QACnC,aAAa,EAAE;YACb,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;YAC/B,OAAO,EAAE,GAAG,CAAC,cAAc,IAAI,CAAC;SACjC;QACD,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa,CAAC,GAAc;IAC1C,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function toCamelCase(obj: unknown): unknown;
2
+ //# sourceMappingURL=toCamelCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toCamelCase.d.ts","sourceRoot":"","sources":["../../src/transformers/toCamelCase.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CASjD"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toCamelCase = toCamelCase;
4
+ function snakeToCamel(key) {
5
+ return key.replace(/_([a-z])/g, (_, ch) => ch.toUpperCase());
6
+ }
7
+ function toCamelCase(obj) {
8
+ if (obj === null || typeof obj !== 'object')
9
+ return obj;
10
+ if (Array.isArray(obj))
11
+ return obj.map(toCamelCase);
12
+ const result = {};
13
+ for (const [key, value] of Object.entries(obj)) {
14
+ result[snakeToCamel(key)] = toCamelCase(value);
15
+ }
16
+ return result;
17
+ }
18
+ //# sourceMappingURL=toCamelCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toCamelCase.js","sourceRoot":"","sources":["../../src/transformers/toCamelCase.ts"],"names":[],"mappings":";;AAIA,kCASC;AAbD,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAU,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,SAAgB,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAEpD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;QAC1E,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { IQRawMessage, MessageName } from '../types/messages';
3
+ import type { WebSocketTransport } from './WebSocketTransport';
4
+ export type MessageHandler = (msg: IQRawMessage) => void;
5
+ export declare class MessageRouter extends EventEmitter {
6
+ private readonly transport;
7
+ private readonly persistentHandlers;
8
+ private readonly pending;
9
+ constructor(transport: WebSocketTransport);
10
+ private dispatch;
11
+ sendRequest<T = unknown>(name: MessageName, msg: unknown, timeoutMs?: number): Promise<IQRawMessage<T>>;
12
+ sendMessage(name: MessageName, msg: unknown): void;
13
+ registerHandler(name: MessageName, handler: MessageHandler): void;
14
+ unregisterHandler(name: MessageName, handler: MessageHandler): void;
15
+ clearPending(): void;
16
+ }
17
+ //# sourceMappingURL=MessageRouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageRouter.d.ts","sourceRoot":"","sources":["../../src/transport/MessageRouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;AAUzD,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA+C;IAClF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;gBAEjD,SAAS,EAAE,kBAAkB;IAQzC,OAAO,CAAC,QAAQ;IA+BhB,WAAW,CAAC,CAAC,GAAG,OAAO,EACrB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,OAAO,EACZ,SAAS,SAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAsB3B,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI;IAIlD,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IASjE,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAInE,YAAY,IAAI,IAAI;CAOrB"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessageRouter = void 0;
4
+ const events_1 = require("events");
5
+ const crypto_1 = require("crypto");
6
+ const errors_1 = require("../errors");
7
+ const DEFAULT_TIMEOUT_MS = 10_000;
8
+ class MessageRouter extends events_1.EventEmitter {
9
+ transport;
10
+ persistentHandlers = new Map();
11
+ pending = new Map();
12
+ constructor(transport) {
13
+ super();
14
+ this.transport = transport;
15
+ this.transport.on('message', (raw) => {
16
+ this.dispatch(raw);
17
+ });
18
+ }
19
+ dispatch(raw) {
20
+ let parsed;
21
+ try {
22
+ parsed = JSON.parse(raw);
23
+ }
24
+ catch {
25
+ this.emit('parseError', raw);
26
+ return;
27
+ }
28
+ // Correlate to a pending request first
29
+ if (parsed.request_id) {
30
+ const req = this.pending.get(parsed.request_id);
31
+ if (req) {
32
+ clearTimeout(req.timer);
33
+ this.pending.delete(parsed.request_id);
34
+ req.resolve(parsed);
35
+ return;
36
+ }
37
+ }
38
+ // Route to persistent handlers
39
+ const handlers = this.persistentHandlers.get(parsed.name);
40
+ if (handlers) {
41
+ for (const handler of handlers) {
42
+ handler(parsed);
43
+ }
44
+ }
45
+ this.emit('message', parsed);
46
+ }
47
+ sendRequest(name, msg, timeoutMs = DEFAULT_TIMEOUT_MS) {
48
+ const requestId = (0, crypto_1.randomUUID)();
49
+ this.transport.send(JSON.stringify({ name, msg, request_id: requestId }));
50
+ return new Promise((resolve, reject) => {
51
+ const timer = setTimeout(() => {
52
+ this.pending.delete(requestId);
53
+ reject(new errors_1.TimeoutError(`Request '${name}' timed out after ${String(timeoutMs)}ms`));
54
+ }, timeoutMs);
55
+ this.pending.set(requestId, {
56
+ resolve: (m) => {
57
+ resolve(m);
58
+ },
59
+ reject,
60
+ timer,
61
+ });
62
+ });
63
+ }
64
+ sendMessage(name, msg) {
65
+ this.transport.send(JSON.stringify({ name, msg }));
66
+ }
67
+ registerHandler(name, handler) {
68
+ let set = this.persistentHandlers.get(name);
69
+ if (!set) {
70
+ set = new Set();
71
+ this.persistentHandlers.set(name, set);
72
+ }
73
+ set.add(handler);
74
+ }
75
+ unregisterHandler(name, handler) {
76
+ this.persistentHandlers.get(name)?.delete(handler);
77
+ }
78
+ clearPending() {
79
+ for (const [id, req] of this.pending) {
80
+ clearTimeout(req.timer);
81
+ req.reject(new errors_1.TimeoutError(`Pending request '${id}' cancelled`));
82
+ }
83
+ this.pending.clear();
84
+ }
85
+ }
86
+ exports.MessageRouter = MessageRouter;
87
+ //# sourceMappingURL=MessageRouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageRouter.js","sourceRoot":"","sources":["../../src/transport/MessageRouter.ts"],"names":[],"mappings":";;;AAAA,mCAAsC;AACtC,mCAAoC;AAEpC,sCAAyC;AAWzC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAa,aAAc,SAAQ,qBAAY;IAC5B,SAAS,CAAqB;IAC9B,kBAAkB,GAAG,IAAI,GAAG,EAAoC,CAAC;IACjE,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE7D,YAAY,SAA6B;QACvC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,GAAW;QAC1B,IAAI,MAAoB,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,uCAAuC;QACvC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAChD,IAAI,GAAG,EAAE,CAAC;gBACR,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACvC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,WAAW,CACT,IAAiB,EACjB,GAAY,EACZ,SAAS,GAAG,kBAAkB;QAE9B,MAAM,SAAS,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAyB,CAAC,CAC5E,CAAC;QAEF,OAAO,IAAI,OAAO,CAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC/B,MAAM,CAAC,IAAI,qBAAY,CAAC,YAAY,IAAI,qBAAqB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YACvF,CAAC,EAAE,SAAS,CAAC,CAAC;YAEd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE;gBAC1B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oBACb,OAAO,CAAC,CAAoB,CAAC,CAAC;gBAChC,CAAC;gBACD,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,IAAiB,EAAE,GAAY;QACzC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,EAAyB,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,eAAe,CAAC,IAAiB,EAAE,OAAuB;QACxD,IAAI,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IAED,iBAAiB,CAAC,IAAiB,EAAE,OAAuB;QAC1D,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,YAAY;QACV,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxB,GAAG,CAAC,MAAM,CAAC,IAAI,qBAAY,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF;AA9FD,sCA8FC"}
@@ -0,0 +1,25 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { WebSocketTransport } from './WebSocketTransport';
3
+ export declare interface ReconnectionManager {
4
+ on(event: 'reconnecting', listener: (info: {
5
+ attempt: number;
6
+ delayMs: number;
7
+ }) => void): this;
8
+ on(event: 'reconnected' | 'failed', listener: () => void): this;
9
+ emit(event: 'reconnecting', info: {
10
+ attempt: number;
11
+ delayMs: number;
12
+ }): boolean;
13
+ emit(event: 'reconnected' | 'failed'): boolean;
14
+ }
15
+ export declare class ReconnectionManager extends EventEmitter {
16
+ private readonly transport;
17
+ private readonly maxRetries;
18
+ private attempts;
19
+ private active;
20
+ private timer;
21
+ constructor(transport: WebSocketTransport, maxRetries?: number);
22
+ private schedule;
23
+ reset(): void;
24
+ }
25
+ //# sourceMappingURL=ReconnectionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReconnectionManager.d.ts","sourceRoot":"","sources":["../../src/transport/ReconnectionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAa/D,MAAM,CAAC,OAAO,WAAW,mBAAmB;IAC1C,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAChG,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAChE,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IACjF,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;CAChD;AAGD,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAA8C;gBAE/C,SAAS,EAAE,kBAAkB,EAAE,UAAU,SAAI;IASzD,OAAO,CAAC,QAAQ;IA2BhB,KAAK,IAAI,IAAI;CAQd"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReconnectionManager = void 0;
4
+ const events_1 = require("events");
5
+ const BASE_MS = 1_000;
6
+ const MAX_MS = 8_000;
7
+ const JITTER = 0.2;
8
+ function backoffDelay(attempt) {
9
+ const base = Math.min(BASE_MS * Math.pow(2, attempt), MAX_MS);
10
+ const jitter = base * JITTER * (Math.random() * 2 - 1);
11
+ return Math.round(base + jitter);
12
+ }
13
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging
14
+ class ReconnectionManager extends events_1.EventEmitter {
15
+ transport;
16
+ maxRetries;
17
+ attempts = 0;
18
+ active = false;
19
+ timer = null;
20
+ constructor(transport, maxRetries = 5) {
21
+ super();
22
+ this.transport = transport;
23
+ this.maxRetries = maxRetries;
24
+ this.transport.on('disconnected', (code) => {
25
+ if (code !== 1000 && !this.active)
26
+ this.schedule();
27
+ });
28
+ }
29
+ schedule() {
30
+ if (this.attempts >= this.maxRetries) {
31
+ this.emit('failed');
32
+ return;
33
+ }
34
+ this.active = true;
35
+ const delayMs = backoffDelay(this.attempts);
36
+ this.emit('reconnecting', { attempt: this.attempts + 1, delayMs });
37
+ this.timer = setTimeout(() => {
38
+ this.timer = null;
39
+ this.transport
40
+ .connect()
41
+ .then(() => {
42
+ this.attempts = 0;
43
+ this.active = false;
44
+ this.emit('reconnected');
45
+ })
46
+ .catch(() => {
47
+ this.attempts++;
48
+ this.active = false;
49
+ this.schedule();
50
+ });
51
+ }, delayMs);
52
+ }
53
+ reset() {
54
+ if (this.timer) {
55
+ clearTimeout(this.timer);
56
+ this.timer = null;
57
+ }
58
+ this.attempts = 0;
59
+ this.active = false;
60
+ }
61
+ }
62
+ exports.ReconnectionManager = ReconnectionManager;
63
+ //# sourceMappingURL=ReconnectionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReconnectionManager.js","sourceRoot":"","sources":["../../src/transport/ReconnectionManager.ts"],"names":[],"mappings":";;;AAAA,mCAAsC;AAGtC,MAAM,OAAO,GAAG,KAAK,CAAC;AACtB,MAAM,MAAM,GAAG,KAAK,CAAC;AACrB,MAAM,MAAM,GAAG,GAAG,CAAC;AAEnB,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;AACnC,CAAC;AAUD,4EAA4E;AAC5E,MAAa,mBAAoB,SAAQ,qBAAY;IAClC,SAAS,CAAqB;IAC9B,UAAU,CAAS;IAC5B,QAAQ,GAAG,CAAC,CAAC;IACb,MAAM,GAAG,KAAK,CAAC;IACf,KAAK,GAAyC,IAAI,CAAC;IAE3D,YAAY,SAA6B,EAAE,UAAU,GAAG,CAAC;QACvD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;YACzC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnE,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,SAAS;iBACX,OAAO,EAAE;iBACT,IAAI,CAAC,GAAG,EAAE;gBACT,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;gBAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;gBACpB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3B,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;gBACpB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC,CAAC,CAAC;QACP,CAAC,EAAE,OAAO,CAAC,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;CACF;AAnDD,kDAmDC"}
@@ -0,0 +1,21 @@
1
+ import { EventEmitter } from 'events';
2
+ export declare interface WebSocketTransport {
3
+ on(event: 'connected', listener: () => void): this;
4
+ on(event: 'disconnected', listener: (code: number, reason: string) => void): this;
5
+ on(event: 'message', listener: (data: string) => void): this;
6
+ on(event: 'error', listener: (error: Error) => void): this;
7
+ emit(event: 'connected'): boolean;
8
+ emit(event: 'disconnected', code: number, reason: string): boolean;
9
+ emit(event: 'message', data: string): boolean;
10
+ emit(event: 'error', error: Error): boolean;
11
+ }
12
+ export declare class WebSocketTransport extends EventEmitter {
13
+ private ws;
14
+ private readonly url;
15
+ constructor(url: string);
16
+ connect(): Promise<void>;
17
+ send(data: string): void;
18
+ disconnect(code?: number): void;
19
+ get isConnected(): boolean;
20
+ }
21
+ //# sourceMappingURL=WebSocketTransport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketTransport.d.ts","sourceRoot":"","sources":["../../src/transport/WebSocketTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAetC,MAAM,CAAC,OAAO,WAAW,kBAAkB;IACzC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACnD,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAClF,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7D,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3D,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IAClC,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACnE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;CAC7C;AAGD,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEjB,GAAG,EAAE,MAAM;IAMvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCxB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOxB,UAAU,CAAC,IAAI,SAAO,GAAG,IAAI;IAK7B,IAAI,WAAW,IAAI,OAAO,CAEzB;CACF"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WebSocketTransport = void 0;
7
+ const events_1 = require("events");
8
+ const ws_1 = __importDefault(require("ws"));
9
+ const errors_1 = require("../errors");
10
+ // Allow loopback ws:// for in-process test servers; all other connections require wss://.
11
+ const LOOPBACK_RE = /^ws:\/\/(localhost|127\.0\.0\.1)(:\d+)?(\/|$)/;
12
+ function validateUrl(url) {
13
+ if (url.startsWith('wss://') || LOOPBACK_RE.test(url))
14
+ return;
15
+ throw new errors_1.ValidationError(`Only WSS connections are allowed. Received: ${url.replace(/\?.*/, '')}`);
16
+ }
17
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging
18
+ class WebSocketTransport extends events_1.EventEmitter {
19
+ ws = null;
20
+ url;
21
+ constructor(url) {
22
+ super();
23
+ validateUrl(url);
24
+ this.url = url;
25
+ }
26
+ connect() {
27
+ return new Promise((resolve, reject) => {
28
+ const isLoopback = LOOPBACK_RE.test(this.url);
29
+ const ws = new ws_1.default(this.url, {
30
+ rejectUnauthorized: !isLoopback,
31
+ });
32
+ const onOpen = () => {
33
+ ws.removeListener('error', onInitError);
34
+ this.ws = ws;
35
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
36
+ ws.on('message', (data) => this.emit('message', String(data)));
37
+ ws.on('close', (code, reason) => {
38
+ this.ws = null;
39
+ this.emit('disconnected', code, reason.toString());
40
+ });
41
+ ws.on('error', (err) => this.emit('error', new errors_1.ConnectionError(err.message)));
42
+ this.emit('connected');
43
+ resolve();
44
+ };
45
+ const onInitError = (err) => {
46
+ ws.removeListener('open', onOpen);
47
+ reject(new errors_1.ConnectionError(err.message));
48
+ };
49
+ ws.once('open', onOpen);
50
+ ws.once('error', onInitError);
51
+ });
52
+ }
53
+ send(data) {
54
+ if (this.ws?.readyState !== ws_1.default.OPEN) {
55
+ throw new errors_1.ConnectionError('WebSocket is not connected');
56
+ }
57
+ this.ws.send(data);
58
+ }
59
+ disconnect(code = 1000) {
60
+ this.ws?.close(code);
61
+ this.ws = null;
62
+ }
63
+ get isConnected() {
64
+ return this.ws?.readyState === ws_1.default.OPEN;
65
+ }
66
+ }
67
+ exports.WebSocketTransport = WebSocketTransport;
68
+ //# sourceMappingURL=WebSocketTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketTransport.js","sourceRoot":"","sources":["../../src/transport/WebSocketTransport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ILogger {
2
+ debug(message: string): void;
3
+ info(message: string): void;
4
+ warn(message: string): void;
5
+ error(message: string): void;
6
+ }
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/types/logger.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/types/logger.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import type { ActiveId, TimeFrame } from './primitives';
2
+ export interface Schedule {
3
+ open: number;
4
+ close: number;
5
+ }
6
+ export interface IQAsset {
7
+ activeId: ActiveId;
8
+ name: string;
9
+ symbol: string;
10
+ precision: number;
11
+ isOtc: boolean;
12
+ isSuspended: boolean;
13
+ profitPercent: {
14
+ binary: number;
15
+ digital: number;
16
+ };
17
+ schedules: Schedule[];
18
+ }
19
+ export interface IQCandle {
20
+ activeId: ActiveId;
21
+ timeframe: TimeFrame;
22
+ open: number;
23
+ high: number;
24
+ low: number;
25
+ close: number;
26
+ volume: number;
27
+ time: number;
28
+ }
29
+ export interface IQTick {
30
+ assetId: ActiveId;
31
+ price: number;
32
+ ask: number;
33
+ bid: number;
34
+ time: number;
35
+ }
36
+ /** Record<ActiveId, IQAsset> */
37
+ export type IQAssetMap = Map<ActiveId, IQAsset>;
38
+ //# sourceMappingURL=market-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market-data.d.ts","sourceRoot":"","sources":["../../src/types/market-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,QAAQ,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gCAAgC;AAChC,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=market-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market-data.js","sourceRoot":"","sources":["../../src/types/market-data.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export type MessageName = 'authorization' | 'ssid' | 'profile' | 'get-candles' | 'candles' | 'candle-generated' | 'subscribeMessage' | 'unsubscribeMessage' | 'quote-generated' | 'init_data' | 'buyV2' | 'buy-complete' | 'option' | 'digital-options/place-order-binary' | 'heartbeat';
2
+ export interface IQRawMessage<T = unknown> {
3
+ name: MessageName;
4
+ msg: T;
5
+ request_id?: string;
6
+ }
7
+ export type IQIncomingMessage = IQRawMessage;
8
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/types/messages.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GACnB,eAAe,GACf,MAAM,GACN,SAAS,GACT,aAAa,GACb,SAAS,GACT,kBAAkB,GAClB,kBAAkB,GAClB,oBAAoB,GACpB,iBAAiB,GACjB,WAAW,GACX,OAAO,GACP,cAAc,GACd,QAAQ,GACR,oCAAoC,GACpC,WAAW,CAAC;AAEhB,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,CAAC,CAAC;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/types/messages.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ declare const __brand: unique symbol;
2
+ type Brand<T, B> = T & {
3
+ [__brand]: B;
4
+ };
5
+ export type ActiveId = Brand<number, 'ActiveId'>;
6
+ export declare enum TimeFrame {
7
+ S1 = 1,
8
+ S5 = 5,
9
+ S10 = 10,
10
+ S15 = 15,
11
+ S30 = 30,
12
+ M1 = 60,
13
+ M5 = 300,
14
+ M15 = 900,
15
+ M30 = 1800,
16
+ H1 = 3600,
17
+ H4 = 14400,
18
+ D1 = 86400
19
+ }
20
+ export declare enum Direction {
21
+ Call = "call",
22
+ Put = "put"
23
+ }
24
+ export declare enum AccountType {
25
+ Practice = "PRACTICE",
26
+ Real = "REAL"
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=primitives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/types/primitives.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,OAAO,EAAE,OAAO,MAAM,CAAC;AACrC,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC;AAExC,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEjD,oBAAY,SAAS;IACnB,EAAE,IAAI;IACN,EAAE,IAAI;IACN,GAAG,KAAK;IACR,GAAG,KAAK;IACR,GAAG,KAAK;IACR,EAAE,KAAK;IACP,EAAE,MAAM;IACR,GAAG,MAAM;IACT,GAAG,OAAO;IACV,EAAE,OAAO;IACT,EAAE,QAAQ;IACV,EAAE,QAAQ;CACX;AAED,oBAAY,SAAS;IACnB,IAAI,SAAS;IACb,GAAG,QAAQ;CACZ;AAED,oBAAY,WAAW;IACrB,QAAQ,aAAa;IACrB,IAAI,SAAS;CACd"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AccountType = exports.Direction = exports.TimeFrame = void 0;
4
+ var TimeFrame;
5
+ (function (TimeFrame) {
6
+ TimeFrame[TimeFrame["S1"] = 1] = "S1";
7
+ TimeFrame[TimeFrame["S5"] = 5] = "S5";
8
+ TimeFrame[TimeFrame["S10"] = 10] = "S10";
9
+ TimeFrame[TimeFrame["S15"] = 15] = "S15";
10
+ TimeFrame[TimeFrame["S30"] = 30] = "S30";
11
+ TimeFrame[TimeFrame["M1"] = 60] = "M1";
12
+ TimeFrame[TimeFrame["M5"] = 300] = "M5";
13
+ TimeFrame[TimeFrame["M15"] = 900] = "M15";
14
+ TimeFrame[TimeFrame["M30"] = 1800] = "M30";
15
+ TimeFrame[TimeFrame["H1"] = 3600] = "H1";
16
+ TimeFrame[TimeFrame["H4"] = 14400] = "H4";
17
+ TimeFrame[TimeFrame["D1"] = 86400] = "D1";
18
+ })(TimeFrame || (exports.TimeFrame = TimeFrame = {}));
19
+ var Direction;
20
+ (function (Direction) {
21
+ Direction["Call"] = "call";
22
+ Direction["Put"] = "put";
23
+ })(Direction || (exports.Direction = Direction = {}));
24
+ var AccountType;
25
+ (function (AccountType) {
26
+ AccountType["Practice"] = "PRACTICE";
27
+ AccountType["Real"] = "REAL";
28
+ })(AccountType || (exports.AccountType = AccountType = {}));
29
+ //# sourceMappingURL=primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/types/primitives.ts"],"names":[],"mappings":";;;AAKA,IAAY,SAaX;AAbD,WAAY,SAAS;IACnB,qCAAM,CAAA;IACN,qCAAM,CAAA;IACN,wCAAQ,CAAA;IACR,wCAAQ,CAAA;IACR,wCAAQ,CAAA;IACR,sCAAO,CAAA;IACP,uCAAQ,CAAA;IACR,yCAAS,CAAA;IACT,0CAAU,CAAA;IACV,wCAAS,CAAA;IACT,yCAAU,CAAA;IACV,yCAAU,CAAA;AACZ,CAAC,EAbW,SAAS,yBAAT,SAAS,QAapB;AAED,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,0BAAa,CAAA;IACb,wBAAW,CAAA;AACb,CAAC,EAHW,SAAS,yBAAT,SAAS,QAGpB;AAED,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,oCAAqB,CAAA;IACrB,4BAAa,CAAA;AACf,CAAC,EAHW,WAAW,2BAAX,WAAW,QAGtB"}
@@ -0,0 +1,24 @@
1
+ import type { AccountType } from './primitives';
2
+ /** Raw wire format received from IQOption server (snake_case). */
3
+ export interface IQRawProfile {
4
+ ssid: string;
5
+ user_id: number;
6
+ email: string;
7
+ first_name: string;
8
+ last_name: string;
9
+ balance: number;
10
+ currency: string;
11
+ currency_char: string;
12
+ }
13
+ /** SDK profile exposed to consumers (camelCase). */
14
+ export interface IQProfile {
15
+ ssid: string;
16
+ userId: number;
17
+ email: string;
18
+ firstName: string;
19
+ lastName: string;
20
+ balance: number;
21
+ currency: string;
22
+ accountType: AccountType;
23
+ }
24
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/types/profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,kEAAkE;AAClE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;CAC1B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/types/profile.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ export interface IQRawSchedule {
2
+ open: number;
3
+ close: number;
4
+ }
5
+ export interface IQRawAsset {
6
+ id: number;
7
+ name: string;
8
+ is_otc?: boolean;
9
+ suspended?: boolean;
10
+ precision: number;
11
+ schedule?: IQRawSchedule[];
12
+ option?: {
13
+ profit?: number;
14
+ };
15
+ digital_profit?: number;
16
+ }
17
+ export interface IQRawInitData {
18
+ instruments: IQRawAsset[];
19
+ }
20
+ //# sourceMappingURL=asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../../src/types/raw/asset.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B"}