From 10e1964b37caa477507745356892509989298a5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dezzy?= Date: Wed, 14 Aug 2024 11:30:26 -0300 Subject: [PATCH] chore(iqoption): Add refreshLogIn method to IQOptionProvider and WebSocketClient --- packages/iqoption/lib/IQOptionProvider.ts | 10 +++++++++- packages/iqoption/lib/types.ts | 5 ++++- .../iqoption/lib/websocket/WebSocketClient.ts | 19 +++++++++++++++---- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/packages/iqoption/lib/IQOptionProvider.ts b/packages/iqoption/lib/IQOptionProvider.ts index 0eceb12..e112348 100644 --- a/packages/iqoption/lib/IQOptionProvider.ts +++ b/packages/iqoption/lib/IQOptionProvider.ts @@ -23,12 +23,14 @@ export class IQOptionProvider implements BaseIQOptionProvider { private isCorsBypassEnabled: boolean + private lastLogInCredentials: LogInCredentials + constructor() { this.api = axios.create({ baseURL: 'https://trade.gomerebroker.com/api', }) - this.webSocket = new WebSocketClient() + this.webSocket = new WebSocketClient(this.refreshLogIn) } public async enableCorsBypass(): Promise { @@ -43,6 +45,8 @@ export class IQOptionProvider implements BaseIQOptionProvider { }: LogInCredentials): Promise { console.log('Logging in...') + this.lastLogInCredentials = { email, password } + await this.webSocket.subscribe() const authApi = axios.create({ @@ -76,4 +80,8 @@ export class IQOptionProvider implements BaseIQOptionProvider { return account } + + public async refreshLogIn(): Promise { + await this.logIn(this.lastLogInCredentials) + } } diff --git a/packages/iqoption/lib/types.ts b/packages/iqoption/lib/types.ts index c924456..3b9c873 100644 --- a/packages/iqoption/lib/types.ts +++ b/packages/iqoption/lib/types.ts @@ -17,6 +17,7 @@ export interface LogInCredentials { export interface BaseIQOptionProvider { enableCorsBypass(): Promise logIn(credentials: LogInCredentials): Promise + refreshLogIn(): Promise } export interface PlaceDigitalOption { @@ -108,12 +109,14 @@ export interface WaitForOptions { export interface BaseWebSocketClient { history: WebSocketEventHistory[] + refreshLogIn: () => Promise subscribe(): Promise send( Request: EventRequestConstructor, - args?: CheckForUnion + args?: CheckForUnion, + attempt?: number ): Promise> waitFor( Response: EventResponseConstructor, diff --git a/packages/iqoption/lib/websocket/WebSocketClient.ts b/packages/iqoption/lib/websocket/WebSocketClient.ts index 224eea9..d313677 100644 --- a/packages/iqoption/lib/websocket/WebSocketClient.ts +++ b/packages/iqoption/lib/websocket/WebSocketClient.ts @@ -24,7 +24,7 @@ export class WebSocketClient implements BaseWebSocketClient { public history: WebSocketEventHistory[] - constructor() { + constructor(public refreshLogIn: () => Promise) { this.subscribers = [new HeartbeatSubscriber(this)] this.history = [] @@ -81,17 +81,26 @@ export class WebSocketClient implements BaseWebSocketClient { public async send( Request: EventRequestConstructor, - args?: CheckForUnion + args?: CheckForUnion, + attempts = 0 ): Promise> { const request = new Request() + if (attempts > 0) { + console.log('Retrying request', request.name, attempts) + } + + if (attempts > 5) { + throw new Error('Max attempts reached') + } + while ( this.webSocket.readyState !== WebSocket.OPEN && this.webSocket.readyState !== WebSocket.CONNECTING ) { console.log('Waiting socket to connect to send message...') - await this.subscribe() + await this.refreshLogIn() await sleep(100) } @@ -117,7 +126,9 @@ export class WebSocketClient implements BaseWebSocketClient { } catch (err) { console.error(err) - throw err + await this.refreshLogIn() + + return this.send(Request, args, attempts + 1) } return event