@vladimirdev635/gql-client 0.0.74 → 0.0.76

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/executor.d.ts CHANGED
@@ -2,6 +2,9 @@ import { ClientConfig, ExecuteResult, IExecutor, OperationResult, OperationVaria
2
2
  export declare class Executor<TClientContext, TRequestContext extends RequestContext> implements IExecutor<TRequestContext> {
3
3
  private readonly config;
4
4
  constructor(config: ClientConfig<TClientContext, TRequestContext>);
5
+ withRetry<T>(shouldRetry: (iteration: number, error: unknown) => boolean, execute: () => Promise<T>): Promise<T>;
5
6
  executeSync<T extends SyncOperation<unknown, unknown>>(operation: T, variables: OperationVariables<T>, requestContext: TRequestContext): Promise<ExecuteResult<OperationResult<T>>>;
7
+ _executeSync<T extends SyncOperation<unknown, unknown>>(operation: T, variables: OperationVariables<T>, requestContext: TRequestContext): Promise<ExecuteResult<OperationResult<T>>>;
6
8
  executeSubscription<T extends SubscriptionOperation<unknown, unknown>>(operation: T, variables: OperationVariables<T>, requestContext: TRequestContext, controller: AbortController): Promise<ExecuteResult<SubOpAsyncIterable<OperationResult<T>>>>;
9
+ _executeSubscription<T extends SubscriptionOperation<unknown, unknown>>(operation: T, variables: OperationVariables<T>, requestContext: TRequestContext, controller: AbortController): Promise<ExecuteResult<SubOpAsyncIterable<OperationResult<T>>>>;
7
10
  }
package/executor.js CHANGED
@@ -3,7 +3,30 @@ export class Executor {
3
3
  constructor(config) {
4
4
  this.config = config;
5
5
  }
6
+ async withRetry(shouldRetry, execute) {
7
+ let iteration = 0;
8
+ let error;
9
+ do {
10
+ try {
11
+ return await execute();
12
+ }
13
+ catch (e) {
14
+ error = e;
15
+ iteration++;
16
+ }
17
+ } while (shouldRetry(iteration, error));
18
+ throw error;
19
+ }
6
20
  async executeSync(operation, variables, requestContext) {
21
+ const retryOptions = {
22
+ context: this.config.context,
23
+ operation,
24
+ variables,
25
+ requestContext,
26
+ };
27
+ return await this.withRetry((iteration, error) => this.config.retryConfig.shouldSyncRetry(error, iteration, retryOptions), () => this._executeSync(operation, variables, requestContext));
28
+ }
29
+ async _executeSync(operation, variables, requestContext) {
7
30
  for (const middleware of this.config.middlewares.beforeSerialization) {
8
31
  [operation, variables] = await middleware({
9
32
  clientContext: this.config.context,
@@ -58,6 +81,15 @@ export class Executor {
58
81
  return { result, response };
59
82
  }
60
83
  async executeSubscription(operation, variables, requestContext, controller) {
84
+ const retryOptions = {
85
+ context: this.config.context,
86
+ operation,
87
+ variables,
88
+ requestContext,
89
+ };
90
+ return await this.withRetry((iteration, error) => this.config.retryConfig.shouldSubscriptionRetry(error, iteration, retryOptions), () => this._executeSubscription(operation, variables, requestContext, controller));
91
+ }
92
+ async _executeSubscription(operation, variables, requestContext, controller) {
61
93
  for (const middleware of this.config.middlewares.beforeSerialization) {
62
94
  [operation, variables] = await middleware({
63
95
  clientContext: this.config.context,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vladimirdev635/gql-client",
3
- "version": "0.0.74",
3
+ "version": "0.0.76",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "types": "./index.d.ts",
package/types/config.d.ts CHANGED
@@ -1,11 +1,23 @@
1
- import { RequestContext } from './base.js';
1
+ import { Operation, OperationVariables, RequestContext, SubscriptionOperation, SyncOperation } from './base.js';
2
2
  import { ClientMiddlewaresConfig } from './middlewares/config.js';
3
3
  import { ClientParser } from './parser.js';
4
4
  import { ClientSerializer } from './serializer.js';
5
+ interface RetryConfigOptions<TClientContext, TRequestContext extends RequestContext, OperationType extends Operation<unknown, unknown>> {
6
+ context: TClientContext;
7
+ requestContext: TRequestContext;
8
+ operation: OperationType;
9
+ variables: OperationVariables<OperationType>;
10
+ }
11
+ interface RetryConfig<TClientContext, TRequestContext extends RequestContext> {
12
+ shouldSyncRetry: (error: unknown, iteration: number, options: RetryConfigOptions<TClientContext, TRequestContext, SyncOperation<unknown, unknown>>) => boolean;
13
+ shouldSubscriptionRetry: (error: unknown, iteration: number, options: RetryConfigOptions<TClientContext, TRequestContext, SubscriptionOperation<unknown, unknown>>) => boolean;
14
+ }
5
15
  export interface ClientConfig<TClientContext, TRequestContext extends RequestContext> {
6
16
  context: TClientContext;
17
+ retryConfig: RetryConfig<TClientContext, TRequestContext>;
7
18
  parser: ClientParser<TClientContext, TRequestContext>;
8
19
  serializer: ClientSerializer<TClientContext, TRequestContext>;
9
20
  middlewares: ClientMiddlewaresConfig<TClientContext, TRequestContext>;
10
21
  fetcher: (init: RequestInit) => Promise<Response>;
11
22
  }
23
+ export {};