Просмотр исходного кода

fix(api-gateway): add session validation retry attempts on timedout requests

Karol Sójko 1 год назад
Родитель
Сommit
6aee51bd45
1 измененных файлов с 40 добавлено и 22 удалено
  1. 40 22
      packages/api-gateway/src/Service/Http/HttpServiceProxy.ts

+ 40 - 22
packages/api-gateway/src/Service/Http/HttpServiceProxy.ts

@@ -26,29 +26,47 @@ export class HttpServiceProxy implements ServiceProxyInterface {
     @inject(TYPES.ApiGateway_Timer) private timer: TimerInterface,
   ) {}
 
-  async validateSession(headers: {
-    authorization: string
-    sharedVaultOwnerContext?: string
-  }): Promise<{ status: number; data: unknown; headers: { contentType: string } }> {
-    const authResponse = await this.httpClient.request({
-      method: 'POST',
-      headers: {
-        Authorization: headers.authorization,
-        Accept: 'application/json',
-        'x-shared-vault-owner-context': headers.sharedVaultOwnerContext,
-      },
-      validateStatus: (status: number) => {
-        return status >= 200 && status < 500
-      },
-      url: `${this.authServerUrl}/sessions/validate`,
-    })
+  async validateSession(
+    headers: {
+      authorization: string
+      sharedVaultOwnerContext?: string
+    },
+    retryAttempt?: number,
+  ): Promise<{ status: number; data: unknown; headers: { contentType: string } }> {
+    try {
+      const authResponse = await this.httpClient.request({
+        method: 'POST',
+        headers: {
+          Authorization: headers.authorization,
+          Accept: 'application/json',
+          'x-shared-vault-owner-context': headers.sharedVaultOwnerContext,
+        },
+        validateStatus: (status: number) => {
+          return status >= 200 && status < 500
+        },
+        url: `${this.authServerUrl}/sessions/validate`,
+      })
 
-    return {
-      status: authResponse.status,
-      data: authResponse.data,
-      headers: {
-        contentType: authResponse.headers['content-type'] as string,
-      },
+      return {
+        status: authResponse.status,
+        data: authResponse.data,
+        headers: {
+          contentType: authResponse.headers['content-type'] as string,
+        },
+      }
+    } catch (error) {
+      const requestTimedOut =
+        'code' in (error as Record<string, unknown>) && (error as Record<string, unknown>).code === 'ETIMEDOUT'
+      const tooManyRetryAttempts = retryAttempt && retryAttempt > 2
+      if (!tooManyRetryAttempts && requestTimedOut) {
+        await this.timer.sleep(50)
+
+        const nextRetryAttempt = retryAttempt ? retryAttempt + 1 : 1
+
+        return this.validateSession(headers, nextRetryAttempt)
+      }
+
+      throw error
     }
   }