iq-option-client 1.3.3
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.
- package/LICENSE +16 -0
- package/README.md +531 -0
- package/dist/bin/IQOption.d.ts +2 -0
- package/dist/bin/IQOption.js +100 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +26 -0
- package/dist/lib/Helper/Logger/ILogger.d.ts +39 -0
- package/dist/lib/Helper/Logger/ILogger.js +3 -0
- package/dist/lib/Helper/Logger/LogLevel.d.ts +10 -0
- package/dist/lib/Helper/Logger/LogLevel.js +23 -0
- package/dist/lib/Helper/Logger/LoggerContext.d.ts +59 -0
- package/dist/lib/Helper/Logger/LoggerContext.js +49 -0
- package/dist/lib/Helper/Logger/LoggerFactory.d.ts +22 -0
- package/dist/lib/Helper/Logger/LoggerFactory.js +87 -0
- package/dist/lib/Helper/Logger/WinstonLogger.d.ts +21 -0
- package/dist/lib/Helper/Logger/WinstonLogger.js +56 -0
- package/dist/lib/Helper/Logger/index.d.ts +5 -0
- package/dist/lib/Helper/Logger/index.js +30 -0
- package/dist/lib/Helper/LoggerHelper.d.ts +11 -0
- package/dist/lib/Helper/LoggerHelper.js +48 -0
- package/dist/lib/Helper/SleepHelper.d.ts +6 -0
- package/dist/lib/Helper/SleepHelper.js +15 -0
- package/dist/lib/Helper/index.d.ts +3 -0
- package/dist/lib/Helper/index.js +20 -0
- package/dist/lib/Service/IQOptionService/Adapter/StreamAdapter.d.ts +16 -0
- package/dist/lib/Service/IQOptionService/Adapter/StreamAdapter.js +47 -0
- package/dist/lib/Service/IQOptionService/Adapter/index.d.ts +1 -0
- package/dist/lib/Service/IQOptionService/Adapter/index.js +26 -0
- package/dist/lib/Service/IQOptionService/Builder/OrderBuilder.d.ts +44 -0
- package/dist/lib/Service/IQOptionService/Builder/OrderBuilder.js +91 -0
- package/dist/lib/Service/IQOptionService/Builder/OrderRequest.d.ts +28 -0
- package/dist/lib/Service/IQOptionService/Builder/OrderRequest.js +20 -0
- package/dist/lib/Service/IQOptionService/Builder/index.d.ts +2 -0
- package/dist/lib/Service/IQOptionService/Builder/index.js +27 -0
- package/dist/lib/Service/IQOptionService/Command/CommandInvoker.d.ts +13 -0
- package/dist/lib/Service/IQOptionService/Command/CommandInvoker.js +35 -0
- package/dist/lib/Service/IQOptionService/Command/GetProfileCommand.d.ts +13 -0
- package/dist/lib/Service/IQOptionService/Command/GetProfileCommand.js +20 -0
- package/dist/lib/Service/IQOptionService/Command/ICommand.d.ts +13 -0
- package/dist/lib/Service/IQOptionService/Command/ICommand.js +11 -0
- package/dist/lib/Service/IQOptionService/Command/SendOrderCommand.d.ts +14 -0
- package/dist/lib/Service/IQOptionService/Command/SendOrderCommand.js +20 -0
- package/dist/lib/Service/IQOptionService/Command/index.d.ts +4 -0
- package/dist/lib/Service/IQOptionService/Command/index.js +29 -0
- package/dist/lib/Service/IQOptionService/Error/AuthenticationError.d.ts +7 -0
- package/dist/lib/Service/IQOptionService/Error/AuthenticationError.js +22 -0
- package/dist/lib/Service/IQOptionService/Error/ConnectionError.d.ts +7 -0
- package/dist/lib/Service/IQOptionService/Error/ConnectionError.js +22 -0
- package/dist/lib/Service/IQOptionService/Error/ErrorHandler.d.ts +17 -0
- package/dist/lib/Service/IQOptionService/Error/ErrorHandler.js +58 -0
- package/dist/lib/Service/IQOptionService/Error/IQOptionError.d.ts +15 -0
- package/dist/lib/Service/IQOptionService/Error/IQOptionError.js +46 -0
- package/dist/lib/Service/IQOptionService/Error/OrderError.d.ts +7 -0
- package/dist/lib/Service/IQOptionService/Error/OrderError.js +22 -0
- package/dist/lib/Service/IQOptionService/Error/RetryStrategy.d.ts +42 -0
- package/dist/lib/Service/IQOptionService/Error/RetryStrategy.js +67 -0
- package/dist/lib/Service/IQOptionService/Error/Retryable.d.ts +20 -0
- package/dist/lib/Service/IQOptionService/Error/Retryable.js +36 -0
- package/dist/lib/Service/IQOptionService/Error/TimeoutError.d.ts +7 -0
- package/dist/lib/Service/IQOptionService/Error/TimeoutError.js +23 -0
- package/dist/lib/Service/IQOptionService/Error/index.d.ts +8 -0
- package/dist/lib/Service/IQOptionService/Error/index.js +33 -0
- package/dist/lib/Service/IQOptionService/Factory/StreamFactory.d.ts +17 -0
- package/dist/lib/Service/IQOptionService/Factory/StreamFactory.js +43 -0
- package/dist/lib/Service/IQOptionService/Factory/StreamType.d.ts +9 -0
- package/dist/lib/Service/IQOptionService/Factory/StreamType.js +22 -0
- package/dist/lib/Service/IQOptionService/Factory/index.d.ts +2 -0
- package/dist/lib/Service/IQOptionService/Factory/index.js +27 -0
- package/dist/lib/Service/IQOptionService/Helper/InputValidator.d.ts +34 -0
- package/dist/lib/Service/IQOptionService/Helper/InputValidator.js +101 -0
- package/dist/lib/Service/IQOptionService/Helper/RequestIdGenerator.d.ts +18 -0
- package/dist/lib/Service/IQOptionService/Helper/RequestIdGenerator.js +37 -0
- package/dist/lib/Service/IQOptionService/Helper/index.d.ts +2 -0
- package/dist/lib/Service/IQOptionService/Helper/index.js +27 -0
- package/dist/lib/Service/IQOptionService/IQOptionApi.d.ts +96 -0
- package/dist/lib/Service/IQOptionService/IQOptionApi.js +343 -0
- package/dist/lib/Service/IQOptionService/IQOptionExpired.d.ts +7 -0
- package/dist/lib/Service/IQOptionService/IQOptionExpired.js +27 -0
- package/dist/lib/Service/IQOptionService/IQOptionStreamCandleGenerated.d.ts +55 -0
- package/dist/lib/Service/IQOptionService/IQOptionStreamCandleGenerated.js +88 -0
- package/dist/lib/Service/IQOptionService/IQOptionStreamOptionClose.d.ts +33 -0
- package/dist/lib/Service/IQOptionService/IQOptionStreamOptionClose.js +59 -0
- package/dist/lib/Service/IQOptionService/IQOptionStreamTradersSentiment.d.ts +46 -0
- package/dist/lib/Service/IQOptionService/IQOptionStreamTradersSentiment.js +84 -0
- package/dist/lib/Service/IQOptionService/IQOptionStreamUserAlerts.d.ts +40 -0
- package/dist/lib/Service/IQOptionService/IQOptionStreamUserAlerts.js +79 -0
- package/dist/lib/Service/IQOptionService/IQOptionWrapper.d.ts +51 -0
- package/dist/lib/Service/IQOptionService/IQOptionWrapper.js +111 -0
- package/dist/lib/Service/IQOptionService/IQOptionWs.d.ts +56 -0
- package/dist/lib/Service/IQOptionService/IQOptionWs.js +125 -0
- package/dist/lib/Service/IQOptionService/Interface/IAuthService.d.ts +12 -0
- package/dist/lib/Service/IQOptionService/Interface/IAuthService.js +11 -0
- package/dist/lib/Service/IQOptionService/Interface/IIQOptionStream.d.ts +9 -0
- package/dist/lib/Service/IQOptionService/Interface/IIQOptionStream.js +11 -0
- package/dist/lib/Service/IQOptionService/Interface/IWebSocketClient.d.ts +26 -0
- package/dist/lib/Service/IQOptionService/Interface/IWebSocketClient.js +3 -0
- package/dist/lib/Service/IQOptionService/Interface/index.d.ts +3 -0
- package/dist/lib/Service/IQOptionService/Interface/index.js +28 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionAction.d.ts +23 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionAction.js +36 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionCandle.d.ts +61 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionCandle.js +11 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionCurrency.d.ts +9 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionCurrency.js +22 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionCurrencyType.d.ts +8 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionCurrencyType.js +21 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionInitializationData.d.ts +117 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionInitializationData.js +14 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionInstrumentType.d.ts +4 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionInstrumentType.js +9 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionInstruments.d.ts +22 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionInstruments.js +3 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionMarket.d.ts +100 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionMarket.js +113 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionMarketInvert.d.ts +6 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionMarketInvert.js +108 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionMode.d.ts +7 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionMode.js +20 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionModel.d.ts +13 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionModel.js +26 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionName.d.ts +8 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionName.js +21 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionOptionClosed.d.ts +43 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionOptionClosed.js +11 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionOptionOpened.d.ts +39 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionOptionOpened.js +11 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionProfile.d.ts +152 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionProfile.js +11 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionResult.d.ts +17 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionResult.js +30 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionTime.d.ts +12 -0
- package/dist/lib/Service/IQOptionService/Model/IQOptionTime.js +25 -0
- package/dist/lib/Service/IQOptionService/Model/index.d.ts +17 -0
- package/dist/lib/Service/IQOptionService/Model/index.js +42 -0
- package/dist/lib/Service/IQOptionService/Repository/IQOptionRepository.d.ts +26 -0
- package/dist/lib/Service/IQOptionService/Repository/IQOptionRepository.js +3 -0
- package/dist/lib/Service/IQOptionService/Repository/WebSocketRepository.d.ts +19 -0
- package/dist/lib/Service/IQOptionService/Repository/WebSocketRepository.js +99 -0
- package/dist/lib/Service/IQOptionService/Repository/index.d.ts +2 -0
- package/dist/lib/Service/IQOptionService/Repository/index.js +27 -0
- package/dist/lib/Service/IQOptionService/Strategy/BinaryOrderStrategy.d.ts +15 -0
- package/dist/lib/Service/IQOptionService/Strategy/BinaryOrderStrategy.js +66 -0
- package/dist/lib/Service/IQOptionService/Strategy/DigitalOrderStrategy.d.ts +15 -0
- package/dist/lib/Service/IQOptionService/Strategy/DigitalOrderStrategy.js +83 -0
- package/dist/lib/Service/IQOptionService/Strategy/IOrderStrategy.d.ts +10 -0
- package/dist/lib/Service/IQOptionService/Strategy/IOrderStrategy.js +3 -0
- package/dist/lib/Service/IQOptionService/Strategy/index.d.ts +3 -0
- package/dist/lib/Service/IQOptionService/Strategy/index.js +28 -0
- package/dist/lib/Service/IQOptionService/index.d.ts +16 -0
- package/dist/lib/Service/IQOptionService/index.js +41 -0
- package/dist/lib/Service/index.d.ts +1 -0
- package/dist/lib/Service/index.js +26 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.js +27 -0
- package/package.json +67 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IQOptionStreamOptionClose = void 0;
|
|
4
|
+
/*
|
|
5
|
+
* Copyright (C) 2020 Wellington Rocha
|
|
6
|
+
* All Rights Reserved.
|
|
7
|
+
*
|
|
8
|
+
* Unauthorized copying of this file, via any medium is strictly prohibited.
|
|
9
|
+
*
|
|
10
|
+
* Proprietary and confidential.
|
|
11
|
+
*/
|
|
12
|
+
const stream_1 = require("stream");
|
|
13
|
+
const Core = require("../..");
|
|
14
|
+
/**
|
|
15
|
+
* Stream candle generated.
|
|
16
|
+
*/
|
|
17
|
+
class IQOptionStreamOptionClose extends stream_1.Readable {
|
|
18
|
+
/**
|
|
19
|
+
* Constructor.
|
|
20
|
+
*
|
|
21
|
+
* @param iqOptionWS
|
|
22
|
+
* @param market
|
|
23
|
+
*/
|
|
24
|
+
constructor(iqOptionWS) {
|
|
25
|
+
super({ objectMode: true });
|
|
26
|
+
this.iqOptionWS = iqOptionWS;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Default read
|
|
30
|
+
*/
|
|
31
|
+
_read() { }
|
|
32
|
+
/**
|
|
33
|
+
* Start stream.
|
|
34
|
+
*/
|
|
35
|
+
async startStream() {
|
|
36
|
+
Core.logger().silly("IQOptionStreamOptionClose::startStream");
|
|
37
|
+
if (!this.iqOptionWS.isConnected()) {
|
|
38
|
+
return Promise.reject("Socket is not connected.");
|
|
39
|
+
}
|
|
40
|
+
this.iqOptionWS
|
|
41
|
+
.socket()
|
|
42
|
+
.on("message", (data) => this.parseMessage(data.toString()));
|
|
43
|
+
return Promise.resolve();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* On message.
|
|
47
|
+
*
|
|
48
|
+
* @param message
|
|
49
|
+
*/
|
|
50
|
+
parseMessage(message) {
|
|
51
|
+
const messageJSON = JSON.parse(message);
|
|
52
|
+
if (messageJSON.name === Core.IQOptionAction.BINARY_OPTION_CLOSE ||
|
|
53
|
+
messageJSON.name === Core.IQOptionAction.DIGITAL_OPEN_CLOSED) {
|
|
54
|
+
this.emit("data", messageJSON.msg);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.IQOptionStreamOptionClose = IQOptionStreamOptionClose;
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVFPcHRpb25TdHJlYW1PcHRpb25DbG9zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvU2VydmljZS9JUU9wdGlvblNlcnZpY2UvSVFPcHRpb25TdHJlYW1PcHRpb25DbG9zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7OztHQU9HO0FBQ0gsbUNBQWtDO0FBQ2xDLDhCQUE4QjtBQUk5Qjs7R0FFRztBQUNILE1BQWEseUJBQ1QsU0FBUSxpQkFBUTtJQVFoQjs7Ozs7T0FLRztJQUNILFlBQW1CLFVBQXNCO1FBQ3JDLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssS0FBVSxDQUFDO0lBRXZCOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFdBQVc7UUFDcEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDakMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVO2FBQ1YsTUFBTSxFQUFFO2FBQ1IsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssWUFBWSxDQUFDLE9BQWU7UUFDaEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxJQUNJLFdBQVcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUI7WUFDNUQsV0FBVyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixFQUM5RCxDQUFDO1lBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDTCxDQUFDO0NBQ0o7QUFyREQsOERBcURDIn0=
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Readable } from "stream";
|
|
2
|
+
import * as Core from "../..";
|
|
3
|
+
import { IIQOptionStream } from "./Interface/IIQOptionStream";
|
|
4
|
+
import { IQOptionWs } from "./IQOptionWs";
|
|
5
|
+
/**
|
|
6
|
+
* Stream candle generated.
|
|
7
|
+
*/
|
|
8
|
+
export declare class IQOptionStreamOptionTradersSentiment extends Readable implements IIQOptionStream {
|
|
9
|
+
/**
|
|
10
|
+
* Socket.
|
|
11
|
+
*/
|
|
12
|
+
private readonly iqOptionWS;
|
|
13
|
+
/**
|
|
14
|
+
* Market.
|
|
15
|
+
*/
|
|
16
|
+
private readonly market;
|
|
17
|
+
/**
|
|
18
|
+
* Constructor.
|
|
19
|
+
*
|
|
20
|
+
* @param iqOptionWS
|
|
21
|
+
* @param market
|
|
22
|
+
*/
|
|
23
|
+
constructor(iqOptionWS: IQOptionWs, market: Core.IQOptionMarket);
|
|
24
|
+
/**
|
|
25
|
+
* Default read
|
|
26
|
+
*/
|
|
27
|
+
_read(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Start stream.
|
|
30
|
+
*/
|
|
31
|
+
startStream(): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Listerner event
|
|
34
|
+
*/
|
|
35
|
+
listener(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Candle subscribe.
|
|
38
|
+
*/
|
|
39
|
+
subscribe(market: Core.IQOptionMarket): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* On message.
|
|
42
|
+
*
|
|
43
|
+
* @param message
|
|
44
|
+
*/
|
|
45
|
+
private parseMessage;
|
|
46
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IQOptionStreamOptionTradersSentiment = void 0;
|
|
4
|
+
/*
|
|
5
|
+
* Copyright (C) 2020 Wellington Rocha
|
|
6
|
+
* All Rights Reserved.
|
|
7
|
+
*
|
|
8
|
+
* Unauthorized copying of this file, via any medium is strictly prohibited.
|
|
9
|
+
*
|
|
10
|
+
* Proprietary and confidential.
|
|
11
|
+
*/
|
|
12
|
+
const stream_1 = require("stream");
|
|
13
|
+
const Core = require("../..");
|
|
14
|
+
/**
|
|
15
|
+
* Stream candle generated.
|
|
16
|
+
*/
|
|
17
|
+
class IQOptionStreamOptionTradersSentiment extends stream_1.Readable {
|
|
18
|
+
/**
|
|
19
|
+
* Constructor.
|
|
20
|
+
*
|
|
21
|
+
* @param iqOptionWS
|
|
22
|
+
* @param market
|
|
23
|
+
*/
|
|
24
|
+
constructor(iqOptionWS, market) {
|
|
25
|
+
super({ objectMode: true });
|
|
26
|
+
this.iqOptionWS = iqOptionWS;
|
|
27
|
+
this.market = market;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Default read
|
|
31
|
+
*/
|
|
32
|
+
_read() { }
|
|
33
|
+
/**
|
|
34
|
+
* Start stream.
|
|
35
|
+
*/
|
|
36
|
+
async startStream() {
|
|
37
|
+
Core.logger().silly("IQOptionStreamOptionTradersSentiment::startStream");
|
|
38
|
+
return this.subscribe(this.market)
|
|
39
|
+
.then(() => this.listener())
|
|
40
|
+
.catch((e) => Promise.reject(e));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Listerner event
|
|
44
|
+
*/
|
|
45
|
+
async listener() {
|
|
46
|
+
Core.logger().silly("IQOptionStreamOptionTradersSentiment::listener");
|
|
47
|
+
this.iqOptionWS
|
|
48
|
+
.socket()
|
|
49
|
+
.on("message", (data) => this.parseMessage(data.toString()));
|
|
50
|
+
return Promise.resolve();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Candle subscribe.
|
|
54
|
+
*/
|
|
55
|
+
subscribe(market) {
|
|
56
|
+
Core.logger().silly("IQOptionStreamOptionTradersSentiment::subscribeTradersSentiments");
|
|
57
|
+
if (!this.iqOptionWS.isConnected()) {
|
|
58
|
+
return Promise.reject("Socket is not connected.");
|
|
59
|
+
}
|
|
60
|
+
const message = {
|
|
61
|
+
name: Core.IQOptionAction.TRADERS_MOOD_CHANGED,
|
|
62
|
+
params: {
|
|
63
|
+
routingFilters: {
|
|
64
|
+
instrument: "turbo-option",
|
|
65
|
+
asset_id: market,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
return Promise.resolve(this.iqOptionWS.send(Core.IQOptionName.SUBSCRIBE_MESSAGE, message));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* On message.
|
|
73
|
+
*
|
|
74
|
+
* @param message
|
|
75
|
+
*/
|
|
76
|
+
parseMessage(message) {
|
|
77
|
+
const messageJSON = JSON.parse(message);
|
|
78
|
+
if (messageJSON.name === Core.IQOptionAction.TRADERS_MOOD_CHANGED) {
|
|
79
|
+
this.emit("data", messageJSON.msg);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.IQOptionStreamOptionTradersSentiment = IQOptionStreamOptionTradersSentiment;
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVFPcHRpb25TdHJlYW1UcmFkZXJzU2VudGltZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9TZXJ2aWNlL0lRT3B0aW9uU2VydmljZS9JUU9wdGlvblN0cmVhbVRyYWRlcnNTZW50aW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7R0FPRztBQUNILG1DQUFrQztBQUNsQyw4QkFBOEI7QUFJOUI7O0dBRUc7QUFDSCxNQUFhLG9DQUNULFNBQVEsaUJBQVE7SUFhaEI7Ozs7O09BS0c7SUFDSCxZQUFtQixVQUFzQixFQUFFLE1BQTJCO1FBQ2xFLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssS0FBVSxDQUFDO0lBRXZCOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFdBQVc7UUFDcEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FDZixtREFBbUQsQ0FDdEQsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQzdCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDM0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFFBQVE7UUFDakIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxVQUFVO2FBQ1YsTUFBTSxFQUFFO2FBQ1IsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxNQUEyQjtRQUN4QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUNmLGtFQUFrRSxDQUNyRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUNqQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUc7WUFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0I7WUFDOUMsTUFBTSxFQUFFO2dCQUNKLGNBQWMsRUFBRTtvQkFDWixVQUFVLEVBQUUsY0FBYztvQkFDMUIsUUFBUSxFQUFFLE1BQU07aUJBQ25CO2FBQ0o7U0FDSixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUNyRSxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxZQUFZLENBQUMsT0FBZTtRQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDTCxDQUFDO0NBQ0o7QUF6RkQsb0ZBeUZDIn0=
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Readable } from "stream";
|
|
2
|
+
import { IIQOptionStream } from "./Interface/IIQOptionStream";
|
|
3
|
+
import { IQOptionWs } from "./IQOptionWs";
|
|
4
|
+
/**
|
|
5
|
+
* Stream user alerts generated.
|
|
6
|
+
*/
|
|
7
|
+
export declare class IQOptionStreamUserAlerts extends Readable implements IIQOptionStream {
|
|
8
|
+
/**
|
|
9
|
+
* Socket.
|
|
10
|
+
*/
|
|
11
|
+
private readonly iqOptionWS;
|
|
12
|
+
/**
|
|
13
|
+
* Constructor.
|
|
14
|
+
*
|
|
15
|
+
* @param iqOptionWS
|
|
16
|
+
*/
|
|
17
|
+
constructor(iqOptionWS: IQOptionWs);
|
|
18
|
+
/**
|
|
19
|
+
* Default read
|
|
20
|
+
*/
|
|
21
|
+
_read(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Start stream.
|
|
24
|
+
*/
|
|
25
|
+
startStream(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Subcribe.
|
|
28
|
+
*/
|
|
29
|
+
subscribe(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Listerner event
|
|
32
|
+
*/
|
|
33
|
+
listener(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* On message.
|
|
36
|
+
*
|
|
37
|
+
* @param message
|
|
38
|
+
*/
|
|
39
|
+
private parseMessage;
|
|
40
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IQOptionStreamUserAlerts = void 0;
|
|
4
|
+
/*
|
|
5
|
+
* Copyright (C) 2020 Wellington Rocha
|
|
6
|
+
* All Rights Reserved.
|
|
7
|
+
*
|
|
8
|
+
* Unauthorized copying of this file, via any medium is strictly prohibited.
|
|
9
|
+
*
|
|
10
|
+
* Proprietary and confidential.
|
|
11
|
+
*/
|
|
12
|
+
const stream_1 = require("stream");
|
|
13
|
+
const Core = require("../..");
|
|
14
|
+
/**
|
|
15
|
+
* Stream user alerts generated.
|
|
16
|
+
*/
|
|
17
|
+
class IQOptionStreamUserAlerts extends stream_1.Readable {
|
|
18
|
+
/**
|
|
19
|
+
* Constructor.
|
|
20
|
+
*
|
|
21
|
+
* @param iqOptionWS
|
|
22
|
+
*/
|
|
23
|
+
constructor(iqOptionWS) {
|
|
24
|
+
super({ objectMode: true });
|
|
25
|
+
this.iqOptionWS = iqOptionWS;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Default read
|
|
29
|
+
*/
|
|
30
|
+
_read() { }
|
|
31
|
+
/**
|
|
32
|
+
* Start stream.
|
|
33
|
+
*/
|
|
34
|
+
startStream() {
|
|
35
|
+
return Promise.resolve();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Subcribe.
|
|
39
|
+
*/
|
|
40
|
+
subscribe() {
|
|
41
|
+
Core.logger().silly("IQOptionStreamUserAlerts::subscribe");
|
|
42
|
+
if (!this.iqOptionWS.isConnected()) {
|
|
43
|
+
return Promise.reject("Socket is not connected.");
|
|
44
|
+
}
|
|
45
|
+
const messageAlertChanged = {
|
|
46
|
+
name: Core.IQOptionAction.ALERT_CHANGED,
|
|
47
|
+
};
|
|
48
|
+
const messageAlertTriggered = {
|
|
49
|
+
name: Core.IQOptionAction.ALERT_TRIGGERED,
|
|
50
|
+
};
|
|
51
|
+
return Promise.all([
|
|
52
|
+
this.iqOptionWS.send(Core.IQOptionName.SUBSCRIBE_MESSAGE, messageAlertChanged),
|
|
53
|
+
this.iqOptionWS.send(Core.IQOptionName.SUBSCRIBE_MESSAGE, messageAlertTriggered),
|
|
54
|
+
]).then();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Listerner event
|
|
58
|
+
*/
|
|
59
|
+
async listener() {
|
|
60
|
+
Core.logger().silly("IQOptionStreamUserAlerts::listener");
|
|
61
|
+
this.iqOptionWS
|
|
62
|
+
.socket()
|
|
63
|
+
.on("message", (data) => this.parseMessage(data.toString()));
|
|
64
|
+
return Promise.resolve();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* On message.
|
|
68
|
+
*
|
|
69
|
+
* @param message
|
|
70
|
+
*/
|
|
71
|
+
parseMessage(message) {
|
|
72
|
+
const messageJSON = JSON.parse(message);
|
|
73
|
+
if (messageJSON.microserviceName === Core.IQOptionAction.USER_ALERTS) {
|
|
74
|
+
this.emit("data", messageJSON.msg);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.IQOptionStreamUserAlerts = IQOptionStreamUserAlerts;
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVFPcHRpb25TdHJlYW1Vc2VyQWxlcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9TZXJ2aWNlL0lRT3B0aW9uU2VydmljZS9JUU9wdGlvblN0cmVhbVVzZXJBbGVydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7R0FPRztBQUNILG1DQUFrQztBQUNsQyw4QkFBOEI7QUFJOUI7O0dBRUc7QUFDSCxNQUFhLHdCQUNULFNBQVEsaUJBQVE7SUFRaEI7Ozs7T0FJRztJQUNILFlBQW1CLFVBQXNCO1FBQ3JDLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssS0FBVSxDQUFDO0lBRXZCOztPQUVHO0lBQ0ksV0FBVztRQUNkLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVM7UUFDWixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUNqQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsTUFBTSxtQkFBbUIsR0FBRztZQUN4QixJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhO1NBQzFDLENBQUM7UUFDRixNQUFNLHFCQUFxQixHQUFHO1lBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWU7U0FDNUMsQ0FBQztRQUNGLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNmLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUNuQyxtQkFBbUIsQ0FDdEI7WUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFDbkMscUJBQXFCLENBQ3hCO1NBQ0osQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFFBQVE7UUFDakIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxVQUFVO2FBQ1YsTUFBTSxFQUFFO2FBQ1IsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssWUFBWSxDQUFDLE9BQWU7UUFDaEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25FLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBL0VELDREQStFQyJ9
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { IAuthService } from "./Interface/IAuthService";
|
|
2
|
+
import { ILogger } from "../../Helper/Logger";
|
|
3
|
+
/**
|
|
4
|
+
* IQ Option authentication wrapper.
|
|
5
|
+
*/
|
|
6
|
+
export declare class IQOptionWrapper implements IAuthService {
|
|
7
|
+
/**
|
|
8
|
+
* Endpoint.
|
|
9
|
+
*/
|
|
10
|
+
private readonly endpoint;
|
|
11
|
+
/**
|
|
12
|
+
* E-mail.
|
|
13
|
+
*/
|
|
14
|
+
private readonly email;
|
|
15
|
+
/**
|
|
16
|
+
* Password.
|
|
17
|
+
*/
|
|
18
|
+
private readonly password;
|
|
19
|
+
/**
|
|
20
|
+
* HTTP client.
|
|
21
|
+
*/
|
|
22
|
+
private readonly client;
|
|
23
|
+
/**
|
|
24
|
+
* Logger instance.
|
|
25
|
+
*/
|
|
26
|
+
private readonly logger;
|
|
27
|
+
/**
|
|
28
|
+
* Constructor.
|
|
29
|
+
*
|
|
30
|
+
* @param email User email
|
|
31
|
+
* @param password User password
|
|
32
|
+
* @param logger Optional logger instance
|
|
33
|
+
*/
|
|
34
|
+
constructor(email: string, password: string, logger?: ILogger);
|
|
35
|
+
/**
|
|
36
|
+
* Authenticate user and get SSID token.
|
|
37
|
+
*/
|
|
38
|
+
authenticate(email?: string, password?: string): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Legacy method for backward compatibility.
|
|
41
|
+
* @deprecated Use authenticate() instead.
|
|
42
|
+
*/
|
|
43
|
+
auth(): Promise<string>;
|
|
44
|
+
/**
|
|
45
|
+
* HTTP request.
|
|
46
|
+
*
|
|
47
|
+
* @param path
|
|
48
|
+
* @param data
|
|
49
|
+
*/
|
|
50
|
+
private request;
|
|
51
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IQOptionWrapper = void 0;
|
|
4
|
+
/*
|
|
5
|
+
* Copyright (C) 2020 Wellington Rocha
|
|
6
|
+
* All Rights Reserved.
|
|
7
|
+
*
|
|
8
|
+
* Unauthorized copying of this file, via any medium is strictly prohibited.
|
|
9
|
+
*
|
|
10
|
+
* Proprietary and confidential.
|
|
11
|
+
*/
|
|
12
|
+
const axios_1 = require("axios");
|
|
13
|
+
const http = require("http");
|
|
14
|
+
const https = require("https");
|
|
15
|
+
const qs = require("querystring");
|
|
16
|
+
const Logger_1 = require("../../Helper/Logger");
|
|
17
|
+
const AuthenticationError_1 = require("./Error/AuthenticationError");
|
|
18
|
+
const InputValidator_1 = require("./Helper/InputValidator");
|
|
19
|
+
/**
|
|
20
|
+
* IQ Option authentication wrapper.
|
|
21
|
+
*/
|
|
22
|
+
class IQOptionWrapper {
|
|
23
|
+
/**
|
|
24
|
+
* Constructor.
|
|
25
|
+
*
|
|
26
|
+
* @param email User email
|
|
27
|
+
* @param password User password
|
|
28
|
+
* @param logger Optional logger instance
|
|
29
|
+
*/
|
|
30
|
+
constructor(email, password, logger) {
|
|
31
|
+
/**
|
|
32
|
+
* Endpoint.
|
|
33
|
+
*/
|
|
34
|
+
this.endpoint = "https://auth.iqoption.com";
|
|
35
|
+
this.logger = logger || Logger_1.LoggerFactory.create({ className: "IQOptionWrapper" });
|
|
36
|
+
this.logger.silly("IQOptionWrapper::constructor");
|
|
37
|
+
this.email = email;
|
|
38
|
+
this.password = password;
|
|
39
|
+
this.client = axios_1.default.create({
|
|
40
|
+
httpAgent: new http.Agent({ keepAlive: true }),
|
|
41
|
+
httpsAgent: new https.Agent({ keepAlive: true }),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Authenticate user and get SSID token.
|
|
46
|
+
*/
|
|
47
|
+
async authenticate(email, password) {
|
|
48
|
+
var _a;
|
|
49
|
+
const userEmail = email || this.email;
|
|
50
|
+
const userPassword = password || this.password;
|
|
51
|
+
// Validate inputs
|
|
52
|
+
InputValidator_1.InputValidator.validateEmail(userEmail);
|
|
53
|
+
InputValidator_1.InputValidator.validatePassword(userPassword);
|
|
54
|
+
this.logger.silly("IQOptionWrapper::authenticate", { operation: "authenticate", metadata: { email: userEmail } });
|
|
55
|
+
try {
|
|
56
|
+
const response = await this.request("api/v1.0/login", {
|
|
57
|
+
email: userEmail,
|
|
58
|
+
password: userPassword,
|
|
59
|
+
});
|
|
60
|
+
const ssid = (_a = response.data) === null || _a === void 0 ? void 0 : _a.ssid;
|
|
61
|
+
if (!ssid) {
|
|
62
|
+
throw new AuthenticationError_1.AuthenticationError("No SSID received from authentication response");
|
|
63
|
+
}
|
|
64
|
+
this.logger.info("Authentication successful", { operation: "authenticate", metadata: { email: userEmail } });
|
|
65
|
+
return ssid;
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
69
|
+
this.logger.error("Authentication failed", { operation: "authenticate", metadata: { email: userEmail } }, error);
|
|
70
|
+
throw new AuthenticationError_1.AuthenticationError("Authentication failed", { email: userEmail }, error);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Legacy method for backward compatibility.
|
|
75
|
+
* @deprecated Use authenticate() instead.
|
|
76
|
+
*/
|
|
77
|
+
auth() {
|
|
78
|
+
return this.authenticate();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* HTTP request.
|
|
82
|
+
*
|
|
83
|
+
* @param path
|
|
84
|
+
* @param data
|
|
85
|
+
*/
|
|
86
|
+
async request(path, data) {
|
|
87
|
+
var _a;
|
|
88
|
+
this.logger.silly("IQOptionWrapper::request", { operation: "request", metadata: { path } });
|
|
89
|
+
const options = {
|
|
90
|
+
method: "POST",
|
|
91
|
+
baseURL: this.endpoint,
|
|
92
|
+
url: path,
|
|
93
|
+
headers: {
|
|
94
|
+
"Content-type": "application/x-www-form-urlencoded",
|
|
95
|
+
Accept: "application/json",
|
|
96
|
+
},
|
|
97
|
+
data: qs.stringify(data),
|
|
98
|
+
};
|
|
99
|
+
try {
|
|
100
|
+
const response = await this.client.request(options);
|
|
101
|
+
return Promise.resolve(response.data);
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
const error = ((_a = e === null || e === void 0 ? void 0 : e.response) === null || _a === void 0 ? void 0 : _a.data) || e;
|
|
105
|
+
this.logger.error("HTTP request failed", { operation: "request", metadata: { path } }, e);
|
|
106
|
+
return Promise.reject(error);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.IQOptionWrapper = IQOptionWrapper;
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVFPcHRpb25XcmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9TZXJ2aWNlL0lRT3B0aW9uU2VydmljZS9JUU9wdGlvbldyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7R0FPRztBQUNILGlDQUE2QztBQUM3Qyw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLGtDQUFrQztBQUVsQyxnREFBNkQ7QUFDN0QscUVBQWtFO0FBQ2xFLDREQUF5RDtBQUV6RDs7R0FFRztBQUNILE1BQWEsZUFBZTtJQTBCeEI7Ozs7OztPQU1HO0lBQ0gsWUFBbUIsS0FBYSxFQUFFLFFBQWdCLEVBQUUsTUFBZ0I7UUFoQ3BFOztXQUVHO1FBQ2MsYUFBUSxHQUFXLDJCQUEyQixDQUFDO1FBOEI1RCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxzQkFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLGVBQUssQ0FBQyxNQUFNLENBQUM7WUFDdkIsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM5QyxVQUFVLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ25ELENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBYyxFQUFFLFFBQWlCOztRQUN2RCxNQUFNLFNBQVMsR0FBRyxLQUFL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
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as WebSocket from "ws";
|
|
2
|
+
import { IWebSocketClient } from "./Interface/IWebSocketClient";
|
|
3
|
+
import { ILogger } from "../../Helper/Logger";
|
|
4
|
+
import * as Core from "../../index";
|
|
5
|
+
/**
|
|
6
|
+
* IQ Option WebSocket client implementation.
|
|
7
|
+
*/
|
|
8
|
+
export declare class IQOptionWs implements IWebSocketClient {
|
|
9
|
+
/**
|
|
10
|
+
* Host endpoint.
|
|
11
|
+
*/
|
|
12
|
+
private readonly endpoint;
|
|
13
|
+
/**
|
|
14
|
+
* Socket client.
|
|
15
|
+
*/
|
|
16
|
+
private _socket;
|
|
17
|
+
/**
|
|
18
|
+
* Wait time to restart socket.
|
|
19
|
+
*/
|
|
20
|
+
private readonly waitToRestart;
|
|
21
|
+
/**
|
|
22
|
+
* Logger instance.
|
|
23
|
+
*/
|
|
24
|
+
private readonly logger;
|
|
25
|
+
/**
|
|
26
|
+
* Constructor.
|
|
27
|
+
*
|
|
28
|
+
* @param logger Optional logger instance
|
|
29
|
+
*/
|
|
30
|
+
constructor(logger?: ILogger);
|
|
31
|
+
/**
|
|
32
|
+
* Start socket connection.
|
|
33
|
+
*/
|
|
34
|
+
connect(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Send message.
|
|
37
|
+
*
|
|
38
|
+
* @param name
|
|
39
|
+
* @param msg
|
|
40
|
+
* @param requestID
|
|
41
|
+
*/
|
|
42
|
+
send(name: Core.IQOptionName | string, msg: any, requestID?: number): Promise<any>;
|
|
43
|
+
/**
|
|
44
|
+
* Get socket.
|
|
45
|
+
*/
|
|
46
|
+
socket(): WebSocket;
|
|
47
|
+
/**
|
|
48
|
+
* Is connected.
|
|
49
|
+
* Fixed: logic was inverted
|
|
50
|
+
*/
|
|
51
|
+
isConnected(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Restart socket.
|
|
54
|
+
*/
|
|
55
|
+
private restartSocket;
|
|
56
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IQOptionWs = void 0;
|
|
4
|
+
/*
|
|
5
|
+
* Copyright (C) 2020 Wellington Rocha
|
|
6
|
+
* All Rights Reserved.
|
|
7
|
+
*
|
|
8
|
+
* Unauthorized copying of this file, via any medium is strictly prohibited.
|
|
9
|
+
*
|
|
10
|
+
* Proprietary and confidential.
|
|
11
|
+
*/
|
|
12
|
+
const WebSocket = require("ws");
|
|
13
|
+
const Logger_1 = require("../../Helper/Logger");
|
|
14
|
+
/**
|
|
15
|
+
* IQ Option WebSocket client implementation.
|
|
16
|
+
*/
|
|
17
|
+
class IQOptionWs {
|
|
18
|
+
/**
|
|
19
|
+
* Constructor.
|
|
20
|
+
*
|
|
21
|
+
* @param logger Optional logger instance
|
|
22
|
+
*/
|
|
23
|
+
constructor(logger) {
|
|
24
|
+
/**
|
|
25
|
+
* Host endpoint.
|
|
26
|
+
*/
|
|
27
|
+
this.endpoint = "wss://iqoption.com";
|
|
28
|
+
/**
|
|
29
|
+
* Wait time to restart socket.
|
|
30
|
+
*/
|
|
31
|
+
this.waitToRestart = 1000;
|
|
32
|
+
this.logger = logger || Logger_1.LoggerFactory.create({ className: "IQOptionWs" });
|
|
33
|
+
this.logger.silly("IQOptionWs::constructor");
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Start socket connection.
|
|
37
|
+
*/
|
|
38
|
+
connect() {
|
|
39
|
+
try {
|
|
40
|
+
this.logger.silly("IQOptionWs::connect");
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
// Fixed: removed double slash in URL
|
|
43
|
+
this._socket = new WebSocket(`${this.endpoint}/echo/websocket`);
|
|
44
|
+
this._socket.on("open", () => {
|
|
45
|
+
this.logger.info("WebSocket connected", { operation: "connect" });
|
|
46
|
+
resolve();
|
|
47
|
+
});
|
|
48
|
+
this._socket.on("error", (error) => {
|
|
49
|
+
this.logger.error("WebSocket error", { operation: "connect" }, error);
|
|
50
|
+
reject(error);
|
|
51
|
+
});
|
|
52
|
+
this._socket.on("close", () => {
|
|
53
|
+
this.logger.warn("WebSocket closed", { operation: "close" });
|
|
54
|
+
this.restartSocket();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
60
|
+
this.logger.error("Failed to create WebSocket", { operation: "connect" }, error);
|
|
61
|
+
return Promise.reject(error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Send message.
|
|
66
|
+
*
|
|
67
|
+
* @param name
|
|
68
|
+
* @param msg
|
|
69
|
+
* @param requestID
|
|
70
|
+
*/
|
|
71
|
+
send(name, msg, requestID) {
|
|
72
|
+
this.logger.silly("IQOptionWs::send", {
|
|
73
|
+
operation: "send",
|
|
74
|
+
requestId: requestID,
|
|
75
|
+
metadata: { messageName: name },
|
|
76
|
+
});
|
|
77
|
+
if (!this._socket || this._socket.readyState !== WebSocket.OPEN) {
|
|
78
|
+
const error = new Error("Socket is not connected.");
|
|
79
|
+
this.logger.error("Cannot send message - socket not connected", { operation: "send" });
|
|
80
|
+
return Promise.reject(error);
|
|
81
|
+
}
|
|
82
|
+
const message = {
|
|
83
|
+
name,
|
|
84
|
+
msg,
|
|
85
|
+
};
|
|
86
|
+
if (requestID) {
|
|
87
|
+
message.request_id = String(requestID);
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
this._socket.send(JSON.stringify(message));
|
|
91
|
+
return Promise.resolve();
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
95
|
+
this.logger.error("Failed to send message", { operation: "send" }, error);
|
|
96
|
+
return Promise.reject(error);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get socket.
|
|
101
|
+
*/
|
|
102
|
+
socket() {
|
|
103
|
+
return this._socket;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Is connected.
|
|
107
|
+
* Fixed: logic was inverted
|
|
108
|
+
*/
|
|
109
|
+
isConnected() {
|
|
110
|
+
return this._socket !== undefined && this._socket.readyState === WebSocket.OPEN;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Restart socket.
|
|
114
|
+
*/
|
|
115
|
+
restartSocket() {
|
|
116
|
+
this.logger.silly("IQOptionWs::restartSocket");
|
|
117
|
+
setTimeout(() => {
|
|
118
|
+
this.connect().catch((error) => {
|
|
119
|
+
this.logger.error("Failed to restart socket", { operation: "restartSocket" }, error);
|
|
120
|
+
});
|
|
121
|
+
}, this.waitToRestart);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.IQOptionWs = IQOptionWs;
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVFPcHRpb25Xcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvU2VydmljZS9JUU9wdGlvblNlcnZpY2UvSVFPcHRpb25Xcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7OztHQU9HO0FBQ0gsZ0NBQWdDO0FBRWhDLGdEQUE2RDtBQUc3RDs7R0FFRztBQUNILE1BQWEsVUFBVTtJQXFCbkI7Ozs7T0FJRztJQUNILFlBQW1CLE1BQWdCO1FBekJuQzs7V0FFRztRQUNjLGFBQVEsR0FBVyxvQkFBb0IsQ0FBQztRQU96RDs7V0FFRztRQUNjLGtCQUFhLEdBQUcsSUFBSSxDQUFDO1FBYWxDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLHNCQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1YsSUFBSSxDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUN6QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNuQyxxQ0FBcUM7Z0JBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO29CQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO29CQUNsRSxPQUFPLEVBQUUsQ0FBQztnQkFDZCxDQUFDLENBQUMs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
|