iq-option-client 1.3.3 → 1.3.5

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 (30) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +73 -2
  3. package/dist/bin/MultiMarketExample.d.ts +1 -0
  4. package/dist/bin/MultiMarketExample.js +204 -0
  5. package/dist/bin/QuickExample.d.ts +1 -0
  6. package/dist/bin/QuickExample.js +139 -0
  7. package/dist/bin/Test200Candles.d.ts +1 -0
  8. package/dist/bin/Test200Candles.js +212 -0
  9. package/dist/bin/TestGetCandles.d.ts +1 -0
  10. package/dist/bin/TestGetCandles.js +211 -0
  11. package/dist/lib/Service/IQOptionService/Helper/CandleValidator.d.ts +21 -0
  12. package/dist/lib/Service/IQOptionService/Helper/CandleValidator.js +110 -0
  13. package/dist/lib/Service/IQOptionService/Helper/CurrencyValidator.d.ts +21 -0
  14. package/dist/lib/Service/IQOptionService/Helper/CurrencyValidator.js +127 -0
  15. package/dist/lib/Service/IQOptionService/Helper/index.d.ts +2 -0
  16. package/dist/lib/Service/IQOptionService/Helper/index.js +3 -1
  17. package/dist/lib/Service/IQOptionService/IQOptionApi.d.ts +12 -0
  18. package/dist/lib/Service/IQOptionService/IQOptionApi.js +144 -1
  19. package/dist/lib/Service/IQOptionService/IQOptionStreamCandleGenerated.js +13 -4
  20. package/dist/lib/Service/IQOptionService/IQOptionWs.js +2 -1
  21. package/dist/lib/Service/IQOptionService/Model/IQOptionAction.d.ts +4 -1
  22. package/dist/lib/Service/IQOptionService/Model/IQOptionAction.js +4 -1
  23. package/dist/lib/Service/IQOptionService/Model/IQOptionCurrencyUpdated.d.ts +77 -0
  24. package/dist/lib/Service/IQOptionService/Model/IQOptionCurrencyUpdated.js +11 -0
  25. package/dist/lib/Service/IQOptionService/Model/index.d.ts +1 -0
  26. package/dist/lib/Service/IQOptionService/Model/index.js +2 -1
  27. package/dist/lib/Service/IQOptionService/Repository/IQOptionRepository.d.ts +4 -0
  28. package/dist/lib/Service/IQOptionService/Repository/WebSocketRepository.d.ts +13 -0
  29. package/dist/lib/Service/IQOptionService/Repository/WebSocketRepository.js +40 -1
  30. package/package.json +5 -2
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /*
4
+ * Copyright (C) 2020 Wellington Rocha
5
+ * All Rights Reserved.
6
+ *
7
+ * Unauthorized copying of this file, via any medium is strictly prohibited.
8
+ *
9
+ * Proprietary and confidential.
10
+ */
11
+ // Load environment variables from .env file if it exists
12
+ try {
13
+ require("dotenv").config();
14
+ }
15
+ catch (e) {
16
+ // dotenv is optional, continue without it
17
+ }
18
+ const Core = require("../lib");
19
+ const Logger_1 = require("../lib/Helper/Logger");
20
+ // Get credentials from environment variables
21
+ const email = process.env.IQ_OPTION_EMAIL;
22
+ const password = process.env.IQ_OPTION_PASSWORD;
23
+ if (!email || !password) {
24
+ // eslint-disable-next-line no-console
25
+ console.error("Error: IQ_OPTION_EMAIL and IQ_OPTION_PASSWORD environment variables are required");
26
+ process.exit(1);
27
+ }
28
+ const logger = Logger_1.LoggerFactory.getDefault();
29
+ const api = new Core.IQOptionApi(email, password);
30
+ logger.info("=== Teste: Buscar 200 Últimos Candles ===");
31
+ api.connectAsync()
32
+ .then(async (profile) => {
33
+ logger.info("✅ Conectado com sucesso!", {
34
+ metadata: {
35
+ userId: profile.user_id,
36
+ email: profile.email,
37
+ },
38
+ });
39
+ // Configuração do teste
40
+ const market = Core.IQOptionMarket.EURUSD;
41
+ const time = Core.IQOptionTime.ONE_MINUTE;
42
+ const numberOfCandles = 200;
43
+ logger.info("📊 Configuração do teste:", {
44
+ metadata: {
45
+ market: market,
46
+ time: time,
47
+ numberOfCandles: numberOfCandles,
48
+ },
49
+ });
50
+ // Iniciar stream para obter um candle atual e pegar o ID
51
+ logger.info("🔄 Iniciando stream para obter ID do candle atual...");
52
+ const candleStream = new Core.IQOptionStreamCandleGenerated(api.getIQOptionWs(), market, time);
53
+ await candleStream.startStream();
54
+ logger.info("✅ Stream iniciado, aguardando candle atual...");
55
+ // Aguardar um candle para obter o ID atual
56
+ const currentCandle = await new Promise((resolve, reject) => {
57
+ const timeout = setTimeout(() => {
58
+ candleStream.destroy();
59
+ reject(new Error("Timeout aguardando candle atual"));
60
+ }, 30000);
61
+ candleStream.on("data", (candle) => {
62
+ clearTimeout(timeout);
63
+ candleStream.destroy();
64
+ resolve(candle);
65
+ });
66
+ candleStream.on("error", (error) => {
67
+ clearTimeout(timeout);
68
+ candleStream.destroy();
69
+ reject(error);
70
+ });
71
+ });
72
+ logger.info("🕯️ Candle atual recebido:", {
73
+ metadata: {
74
+ id: currentCandle.id,
75
+ active_id: currentCandle.active_id,
76
+ size: currentCandle.size,
77
+ from: currentCandle.from,
78
+ to: currentCandle.to,
79
+ timestamp: new Date(currentCandle.from * 1000).toISOString(),
80
+ },
81
+ });
82
+ // Calcular range para buscar 200 candles anteriores
83
+ const toId = currentCandle.id;
84
+ const fromId = toId - numberOfCandles + 1; // +1 para incluir o candle atual
85
+ logger.info("📊 Buscando histórico de candles:", {
86
+ metadata: {
87
+ fromId: fromId,
88
+ toId: toId,
89
+ activeId: currentCandle.active_id,
90
+ size: currentCandle.size,
91
+ expectedCount: numberOfCandles,
92
+ },
93
+ });
94
+ try {
95
+ const startTime = Date.now();
96
+ const historicalCandles = await api.getCandles(currentCandle.active_id, currentCandle.size, fromId, toId, true, // split_normalization
97
+ true // only_closed
98
+ );
99
+ const endTime = Date.now();
100
+ const duration = endTime - startTime;
101
+ logger.info(`✅ Histórico recebido!`, {
102
+ metadata: {
103
+ count: historicalCandles.length,
104
+ expected: numberOfCandles,
105
+ duration: `${duration}ms`,
106
+ fromId: fromId,
107
+ toId: toId,
108
+ },
109
+ });
110
+ if (historicalCandles.length === 0) {
111
+ logger.warn("⚠️ Nenhum candle retornado. Verifique os IDs.");
112
+ process.exit(1);
113
+ }
114
+ // Validar se recebemos a quantidade esperada
115
+ if (historicalCandles.length < numberOfCandles) {
116
+ logger.warn(`⚠️ Recebidos ${historicalCandles.length} candles, esperados ${numberOfCandles}`, {
117
+ metadata: {
118
+ received: historicalCandles.length,
119
+ expected: numberOfCandles,
120
+ difference: numberOfCandles - historicalCandles.length,
121
+ },
122
+ });
123
+ }
124
+ else {
125
+ logger.info(`✅ Recebidos ${historicalCandles.length} candles (esperados ${numberOfCandles})`);
126
+ }
127
+ // Mostrar estatísticas dos candles
128
+ const firstCandle = historicalCandles[0];
129
+ const lastCandle = historicalCandles[historicalCandles.length - 1];
130
+ logger.info("📈 Primeiro candle (mais antigo):", {
131
+ metadata: {
132
+ id: firstCandle.id,
133
+ timestamp: new Date(firstCandle.from * 1000).toISOString(),
134
+ open: firstCandle.open,
135
+ close: firstCandle.close,
136
+ high: firstCandle.max,
137
+ low: firstCandle.min,
138
+ },
139
+ });
140
+ logger.info("📈 Último candle (mais recente):", {
141
+ metadata: {
142
+ id: lastCandle.id,
143
+ timestamp: new Date(lastCandle.from * 1000).toISOString(),
144
+ open: lastCandle.open,
145
+ close: lastCandle.close,
146
+ high: lastCandle.max,
147
+ low: lastCandle.min,
148
+ },
149
+ });
150
+ // Calcular estatísticas
151
+ const prices = historicalCandles.map(c => c.close);
152
+ const minPrice = Math.min(...prices);
153
+ const maxPrice = Math.max(...prices);
154
+ const avgPrice = prices.reduce((a, b) => a + b, 0) / prices.length;
155
+ logger.info("📊 Estatísticas dos candles:", {
156
+ metadata: {
157
+ totalCandles: historicalCandles.length,
158
+ minPrice: minPrice,
159
+ maxPrice: maxPrice,
160
+ avgPrice: avgPrice.toFixed(5),
161
+ priceRange: (maxPrice - minPrice).toFixed(5),
162
+ },
163
+ });
164
+ // Validar estrutura dos candles
165
+ const invalidCandles = historicalCandles.filter(candle => {
166
+ return !(typeof candle.id === "number" &&
167
+ typeof candle.open === "number" &&
168
+ typeof candle.close === "number" &&
169
+ typeof candle.max === "number" &&
170
+ typeof candle.min === "number" &&
171
+ typeof candle.from === "number" &&
172
+ typeof candle.to === "number");
173
+ });
174
+ if (invalidCandles.length > 0) {
175
+ logger.warn(`⚠️ ${invalidCandles.length} candles com estrutura inválida`);
176
+ }
177
+ else {
178
+ logger.info("✅ Todos os candles têm estrutura válida");
179
+ }
180
+ // Mostrar alguns candles de exemplo (primeiro, meio, último)
181
+ const middleIndex = Math.floor(historicalCandles.length / 2);
182
+ const examples = [
183
+ { label: "Primeiro", candle: firstCandle },
184
+ { label: "Meio", candle: historicalCandles[middleIndex] },
185
+ { label: "Último", candle: lastCandle },
186
+ ];
187
+ logger.info("📋 Exemplos de candles:", {
188
+ metadata: {
189
+ examples: examples.map(ex => ({
190
+ label: ex.label,
191
+ id: ex.candle.id,
192
+ timestamp: new Date(ex.candle.from * 1000).toISOString(),
193
+ open: ex.candle.open,
194
+ close: ex.candle.close,
195
+ })),
196
+ },
197
+ });
198
+ logger.info("✅ Teste concluído com sucesso!");
199
+ process.exit(0);
200
+ }
201
+ catch (error) {
202
+ const err = error instanceof Error ? error : new Error(String(error));
203
+ logger.error("❌ Erro ao buscar histórico", {}, err);
204
+ process.exit(1);
205
+ }
206
+ })
207
+ .catch((e) => {
208
+ const error = e instanceof Error ? e : new Error(String(e));
209
+ logger.error("❌ Erro na aplicação", { operation: "main" }, error);
210
+ process.exit(1);
211
+ });
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVzdDIwMENhbmRsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL1Rlc3QyMDBDYW5kbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7Ozs7R0FPRztBQUNILHlEQUF5RDtBQUN6RCxJQUFJLENBQUM7SUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDVCwwQ0FBMEM7QUFDOUMsQ0FBQztBQUVELCtCQUErQjtBQUMvQixpREFBcUQ7QUFFckQsNkNBQTZDO0FBQzdDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0FBQzFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7QUFFaEQsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RCLHNDQUFzQztJQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLGtGQUFrRixDQUFDLENBQUM7SUFDbEcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBRUQsTUFBTSxNQUFNLEdBQUcsc0JBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBRWxELE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztBQUV6RCxHQUFHLENBQUMsWUFBWSxFQUFFO0tBQ2IsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO1FBQ3BDLFFBQVEsRUFBRTtZQUNOLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN2QixLQUFLLEVBQUUsT0FB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
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /*
4
+ * Copyright (C) 2020 Wellington Rocha
5
+ * All Rights Reserved.
6
+ *
7
+ * Unauthorized copying of this file, via any medium is strictly prohibited.
8
+ *
9
+ * Proprietary and confidential.
10
+ */
11
+ // Load environment variables from .env file if it exists
12
+ try {
13
+ require("dotenv").config();
14
+ }
15
+ catch (e) {
16
+ // dotenv is optional, continue without it
17
+ }
18
+ const Core = require("../lib");
19
+ const Logger_1 = require("../lib/Helper/Logger");
20
+ // Get credentials from environment variables
21
+ const email = process.env.IQ_OPTION_EMAIL;
22
+ const password = process.env.IQ_OPTION_PASSWORD;
23
+ if (!email || !password) {
24
+ // eslint-disable-next-line no-console
25
+ console.error("Error: IQ_OPTION_EMAIL and IQ_OPTION_PASSWORD environment variables are required");
26
+ process.exit(1);
27
+ }
28
+ const logger = Logger_1.LoggerFactory.getDefault();
29
+ const api = new Core.IQOptionApi(email, password);
30
+ logger.info("=== Teste: Buscar Histórico de Candles ===");
31
+ api.connectAsync()
32
+ .then(async (profile) => {
33
+ logger.info("✅ Conectado com sucesso!", {
34
+ metadata: {
35
+ userId: profile.user_id,
36
+ email: profile.email,
37
+ },
38
+ });
39
+ // Teste 1: Buscar candles históricos para EURUSD
40
+ logger.info("📊 Teste 1: Buscar candles históricos para EURUSD (active_id: 1)");
41
+ try {
42
+ // Usar IDs de exemplo baseados nas mensagens que você mostrou
43
+ // Vamos buscar um range pequeno primeiro para testar
44
+ const candles1 = await api.getCandles(1, // EURUSD
45
+ 60, // 1 minuto (60 segundos)
46
+ 1000, // from_id (exemplo - você precisa usar IDs reais)
47
+ 1100, // to_id (exemplo - você precisa usar IDs reais)
48
+ true, // split_normalization
49
+ true // only_closed
50
+ );
51
+ logger.info(`✅ Teste 1: Recebidos ${candles1.length} candles`, {
52
+ metadata: {
53
+ count: candles1.length,
54
+ activeId: 1,
55
+ size: 60,
56
+ },
57
+ });
58
+ if (candles1.length > 0) {
59
+ logger.info("📈 Primeiro candle:", {
60
+ metadata: {
61
+ id: candles1[0].id,
62
+ open: candles1[0].open,
63
+ close: candles1[0].close,
64
+ high: candles1[0].max,
65
+ low: candles1[0].min,
66
+ from: candles1[0].from,
67
+ to: candles1[0].to,
68
+ },
69
+ });
70
+ logger.info("📈 Último candle:", {
71
+ metadata: {
72
+ id: candles1[candles1.length - 1].id,
73
+ open: candles1[candles1.length - 1].open,
74
+ close: candles1[candles1.length - 1].close,
75
+ high: candles1[candles1.length - 1].max,
76
+ low: candles1[candles1.length - 1].min,
77
+ },
78
+ });
79
+ // Validar estrutura dos candles
80
+ const isValid = candles1.every(candle => {
81
+ return (typeof candle.id === "number" &&
82
+ typeof candle.open === "number" &&
83
+ typeof candle.close === "number" &&
84
+ typeof candle.max === "number" &&
85
+ typeof candle.min === "number" &&
86
+ typeof candle.from === "number" &&
87
+ typeof candle.to === "number");
88
+ });
89
+ if (isValid) {
90
+ logger.info("✅ Validação: Todos os candles têm estrutura válida");
91
+ }
92
+ else {
93
+ logger.warn("⚠️ Validação: Alguns candles podem ter estrutura inválida");
94
+ }
95
+ }
96
+ else {
97
+ logger.warn("⚠️ Nenhum candle retornado. Pode ser que os IDs não existam ou o range esteja vazio.");
98
+ logger.info("💡 Dica: Você precisa usar IDs de candles reais. Tente obter IDs do stream de candles primeiro.");
99
+ }
100
+ }
101
+ catch (error) {
102
+ const err = error instanceof Error ? error : new Error(String(error));
103
+ logger.error("❌ Teste 1 falhou", {}, err);
104
+ }
105
+ // Teste 2: Buscar candles com diferentes tamanhos
106
+ logger.info("📊 Teste 2: Buscar candles de 2 minutos (120 segundos)");
107
+ try {
108
+ const candles2 = await api.getCandles(1, // EURUSD
109
+ 120, // 2 minutos (120 segundos)
110
+ 500, // from_id
111
+ 600, // to_id
112
+ true, true);
113
+ logger.info(`✅ Teste 2: Recebidos ${candles2.length} candles de 2 minutos`, {
114
+ metadata: {
115
+ count: candles2.length,
116
+ size: 120,
117
+ },
118
+ });
119
+ }
120
+ catch (error) {
121
+ const err = error instanceof Error ? error : new Error(String(error));
122
+ logger.error("❌ Teste 2 falhou", {}, err);
123
+ }
124
+ // Teste 3: Obter IDs reais do stream primeiro
125
+ logger.info("📊 Teste 3: Obter IDs reais do stream de candles");
126
+ try {
127
+ const market = Core.IQOptionMarket.EURUSD;
128
+ const time = Core.IQOptionTime.ONE_MINUTE;
129
+ const candleStream = new Core.IQOptionStreamCandleGenerated(api.getIQOptionWs(), market, time);
130
+ await candleStream.startStream();
131
+ logger.info("✅ Stream de candles iniciado, aguardando candles...");
132
+ // Aguardar alguns candles para obter IDs reais
133
+ const receivedCandles = [];
134
+ candleStream.on("data", async (candle) => {
135
+ receivedCandles.push(candle);
136
+ logger.info(`🕯️ Candle recebido do stream`, {
137
+ metadata: {
138
+ id: candle.id,
139
+ active_id: candle.active_id,
140
+ from: candle.from,
141
+ to: candle.to,
142
+ },
143
+ });
144
+ // Após receber 3 candles, tentar buscar histórico usando os IDs
145
+ if (receivedCandles.length >= 3) {
146
+ candleStream.destroy();
147
+ const firstCandle = receivedCandles[0];
148
+ const lastCandle = receivedCandles[receivedCandles.length - 1];
149
+ logger.info("📊 Teste 4: Buscar histórico usando IDs reais do stream");
150
+ logger.info("Usando IDs:", {
151
+ metadata: {
152
+ fromId: firstCandle.id,
153
+ toId: lastCandle.id,
154
+ activeId: firstCandle.active_id,
155
+ size: firstCandle.size,
156
+ },
157
+ });
158
+ try {
159
+ const historicalCandles = await api.getCandles(firstCandle.active_id, firstCandle.size, firstCandle.id - 10, // Buscar alguns candles antes
160
+ lastCandle.id + 10, // E alguns depois
161
+ true, true);
162
+ logger.info(`✅ Teste 4: Recebidos ${historicalCandles.length} candles históricos`, {
163
+ metadata: {
164
+ count: historicalCandles.length,
165
+ requestedRange: {
166
+ from: firstCandle.id - 10,
167
+ to: lastCandle.id + 10,
168
+ },
169
+ },
170
+ });
171
+ if (historicalCandles.length > 0) {
172
+ logger.info("📈 Exemplo de candle histórico:", {
173
+ metadata: {
174
+ id: historicalCandles[0].id,
175
+ open: historicalCandles[0].open,
176
+ close: historicalCandles[0].close,
177
+ high: historicalCandles[0].max,
178
+ low: historicalCandles[0].min,
179
+ timestamp: new Date(historicalCandles[0].from * 1000).toISOString(),
180
+ },
181
+ });
182
+ }
183
+ logger.info("✅ Todos os testes concluídos!");
184
+ process.exit(0);
185
+ }
186
+ catch (error) {
187
+ const err = error instanceof Error ? error : new Error(String(error));
188
+ logger.error("❌ Teste 4 falhou", {}, err);
189
+ process.exit(1);
190
+ }
191
+ }
192
+ });
193
+ // Timeout de segurança
194
+ setTimeout(() => {
195
+ logger.warn("⏱️ Timeout - encerrando teste");
196
+ candleStream.destroy();
197
+ process.exit(0);
198
+ }, 60000);
199
+ }
200
+ catch (error) {
201
+ const err = error instanceof Error ? error : new Error(String(error));
202
+ logger.error("❌ Teste 3 falhou", {}, err);
203
+ process.exit(1);
204
+ }
205
+ })
206
+ .catch((e) => {
207
+ const error = e instanceof Error ? e : new Error(String(e));
208
+ logger.error("❌ Erro na aplicação", { operation: "main" }, error);
209
+ process.exit(1);
210
+ });
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVzdEdldENhbmRsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL1Rlc3RHZXRDYW5kbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7Ozs7R0FPRztBQUNILHlEQUF5RDtBQUN6RCxJQUFJLENBQUM7SUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDVCwwQ0FBMEM7QUFDOUMsQ0FBQztBQUVELCtCQUErQjtBQUMvQixpREFBcUQ7QUFFckQsNkNBQTZDO0FBQzdDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0FBQzFDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7QUFFaEQsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RCLHNDQUFzQztJQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLGtGQUFrRixDQUFDLENBQUM7SUFDbEcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBRUQsTUFBTSxNQUFNLEdBQUcsc0JBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBRWxELE1BQU0sQ0FBQyxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQztBQUUxRCxHQUFHLENBQUMsWUFBWSxFQUFFO0tBQ2IsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO1FBQ3BDLFFBQVEsRUFBRTtZQUNOLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN2QixLQUFLLEVBQUUsT0FB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QUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNiLE1BQU0sR0FBRyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0FBQ0wsQ0FBQyxDQUFDO0tBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7SUFDZCxNQUFNLEtBQUssR0FBRyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixDQUFDLENBQUMsQ0FBQyJ9
@@ -0,0 +1,21 @@
1
+ import { IQOptionCandle } from "../Model/IQOptionCandle";
2
+ /**
3
+ * Validator for candle messages.
4
+ */
5
+ export declare class CandleValidator {
6
+ /**
7
+ * Validate candle data structure.
8
+ *
9
+ * @param candle Candle data to validate
10
+ * @throws {IQOptionError} If validation fails
11
+ */
12
+ static validate(candle: any): candle is IQOptionCandle;
13
+ /**
14
+ * Validate candle message structure (with name and microserviceName).
15
+ *
16
+ * @param message Full message object
17
+ * @returns Validated candle data
18
+ * @throws {IQOptionError} If validation fails
19
+ */
20
+ static validateMessage(message: any): IQOptionCandle;
21
+ }
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CandleValidator = void 0;
4
+ const IQOptionError_1 = require("../Error/IQOptionError");
5
+ /**
6
+ * Validator for candle messages.
7
+ */
8
+ class CandleValidator {
9
+ /**
10
+ * Validate candle data structure.
11
+ *
12
+ * @param candle Candle data to validate
13
+ * @throws {IQOptionError} If validation fails
14
+ */
15
+ static validate(candle) {
16
+ if (!candle || typeof candle !== "object") {
17
+ throw new IQOptionError_1.IQOptionError("Candle data is required and must be an object", "VALIDATION_ERROR");
18
+ }
19
+ const requiredFields = [
20
+ "active_id",
21
+ "size",
22
+ "at",
23
+ "from",
24
+ "to",
25
+ "id",
26
+ "open",
27
+ "close",
28
+ "min",
29
+ "max",
30
+ "ask",
31
+ "bid",
32
+ "volume",
33
+ "phase",
34
+ ];
35
+ // Check all required fields exist
36
+ for (const field of requiredFields) {
37
+ if (!(field in candle)) {
38
+ throw new IQOptionError_1.IQOptionError(`Missing required field: ${field}`, "VALIDATION_ERROR");
39
+ }
40
+ }
41
+ // Validate field types
42
+ if (typeof candle.active_id !== "number" || candle.active_id <= 0) {
43
+ throw new IQOptionError_1.IQOptionError("active_id must be a positive number", "VALIDATION_ERROR");
44
+ }
45
+ if (typeof candle.size !== "number" || candle.size <= 0) {
46
+ throw new IQOptionError_1.IQOptionError("size must be a positive number", "VALIDATION_ERROR");
47
+ }
48
+ if (typeof candle.at !== "number" || candle.at <= 0) {
49
+ throw new IQOptionError_1.IQOptionError("at must be a positive number (timestamp)", "VALIDATION_ERROR");
50
+ }
51
+ if (typeof candle.from !== "number" || candle.from <= 0) {
52
+ throw new IQOptionError_1.IQOptionError("from must be a positive number (timestamp)", "VALIDATION_ERROR");
53
+ }
54
+ if (typeof candle.to !== "number" || candle.to <= 0) {
55
+ throw new IQOptionError_1.IQOptionError("to must be a positive number (timestamp)", "VALIDATION_ERROR");
56
+ }
57
+ if (candle.from >= candle.to) {
58
+ throw new IQOptionError_1.IQOptionError("from timestamp must be less than to timestamp", "VALIDATION_ERROR");
59
+ }
60
+ if (typeof candle.id !== "number" || candle.id <= 0) {
61
+ throw new IQOptionError_1.IQOptionError("id must be a positive number", "VALIDATION_ERROR");
62
+ }
63
+ // Validate price fields
64
+ const priceFields = ["open", "close", "min", "max", "ask", "bid"];
65
+ for (const field of priceFields) {
66
+ if (typeof candle[field] !== "number" || candle[field] < 0) {
67
+ throw new IQOptionError_1.IQOptionError(`${field} must be a non-negative number`, "VALIDATION_ERROR");
68
+ }
69
+ }
70
+ // Validate OHLC relationships
71
+ if (candle.min > candle.max) {
72
+ throw new IQOptionError_1.IQOptionError("min must be less than or equal to max", "VALIDATION_ERROR");
73
+ }
74
+ if (candle.open < candle.min || candle.open > candle.max) {
75
+ throw new IQOptionError_1.IQOptionError("open must be between min and max", "VALIDATION_ERROR");
76
+ }
77
+ if (candle.close < candle.min || candle.close > candle.max) {
78
+ throw new IQOptionError_1.IQOptionError("close must be between min and max", "VALIDATION_ERROR");
79
+ }
80
+ if (typeof candle.volume !== "number" || candle.volume < 0) {
81
+ throw new IQOptionError_1.IQOptionError("volume must be a non-negative number", "VALIDATION_ERROR");
82
+ }
83
+ if (typeof candle.phase !== "string" || candle.phase.length === 0) {
84
+ throw new IQOptionError_1.IQOptionError("phase must be a non-empty string", "VALIDATION_ERROR");
85
+ }
86
+ return true;
87
+ }
88
+ /**
89
+ * Validate candle message structure (with name and microserviceName).
90
+ *
91
+ * @param message Full message object
92
+ * @returns Validated candle data
93
+ * @throws {IQOptionError} If validation fails
94
+ */
95
+ static validateMessage(message) {
96
+ if (!message || typeof message !== "object") {
97
+ throw new IQOptionError_1.IQOptionError("Message is required and must be an object", "VALIDATION_ERROR");
98
+ }
99
+ if (message.name !== "candle-generated") {
100
+ throw new IQOptionError_1.IQOptionError(`Invalid message name: expected "candle-generated", got "${message.name}"`, "VALIDATION_ERROR");
101
+ }
102
+ if (!message.msg || typeof message.msg !== "object") {
103
+ throw new IQOptionError_1.IQOptionError("Message must contain a 'msg' object with candle data", "VALIDATION_ERROR");
104
+ }
105
+ this.validate(message.msg);
106
+ return message.msg;
107
+ }
108
+ }
109
+ exports.CandleValidator = CandleValidator;
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FuZGxlVmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9TZXJ2aWNlL0lRT3B0aW9uU2VydmljZS9IZWxwZXIvQ2FuZGxlVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVNBLDBEQUF1RDtBQUV2RDs7R0FFRztBQUNILE1BQWEsZUFBZTtJQUN4Qjs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBVztRQUM5QixJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSw2QkFBYSxDQUFDLCtDQUErQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDakcsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFnQztZQUNoRCxXQUFXO1lBQ1gsTUFBTTtZQUNOLElBQUk7WUFDSixNQUFNO1lBQ04sSUFBSTtZQUNKLElBQUk7WUFDSixNQUFNO1lBQ04sT0FBTztZQUNQLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxRQUFRO1lBQ1IsT0FBTztTQUNWLENBQUM7UUFFRixrQ0FBa0M7UUFDbEMsS0FBSyxNQUFNLEtBQUssSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLDZCQUFhLENBQUMsMkJBQTJCLEtBQUssRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDcEYsQ0FBQztRQUNMLENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDaEUsTUFBTSxJQUFJLDZCQUFhLENBQUMscUNBQXFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUN2RixDQUFD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
@@ -0,0 +1,21 @@
1
+ import { IQOptionCurrencyUpdated } from "../Model/IQOptionCurrencyUpdated";
2
+ /**
3
+ * Validator for currency update messages.
4
+ */
5
+ export declare class CurrencyValidator {
6
+ /**
7
+ * Validate currency data structure.
8
+ *
9
+ * @param currency Currency data to validate
10
+ * @throws {IQOptionError} If validation fails
11
+ */
12
+ static validate(currency: any): currency is IQOptionCurrencyUpdated;
13
+ /**
14
+ * Validate currency update message structure (with name and microserviceName).
15
+ *
16
+ * @param message Full message object
17
+ * @returns Validated currency data
18
+ * @throws {IQOptionError} If validation fails
19
+ */
20
+ static validateMessage(message: any): IQOptionCurrencyUpdated;
21
+ }