diff --git a/packages/aws-appsync/src/link/retry-link.ts b/packages/aws-appsync/src/link/retry-link.ts index a08bfeb8..159b7e26 100644 --- a/packages/aws-appsync/src/link/retry-link.ts +++ b/packages/aws-appsync/src/link/retry-link.ts @@ -18,6 +18,7 @@ const MAX_DELAY_MS = 5 * 60 * 1000; const getDelay = count => ((2 ** count) * BASE_TIME_MS) + (JITTER_FACTOR * Math.random()); export const SKIP_RETRY_KEY = '@@skipRetry'; +export const PERMANENT_ERROR_KEY = typeof Symbol !== 'undefined' ? Symbol('permanentError') : '@@permanentError'; export const getEffectDelay = (_action: OfflineAction, retries: number) => { const delay = getDelay(retries); @@ -30,8 +31,13 @@ export const createRetryLink = (origLink: ApolloLink) => { const retryLink = new RetryLink({ attempts: (count, operation, error) => { + const { [PERMANENT_ERROR_KEY]: permanent = false } = error; const { [SKIP_RETRY_KEY]: skipRetry = false } = operation.variables; + if (permanent) { + return false; + } + if (error.statusCode >= 400 && error.statusCode < 500) { return false; } diff --git a/packages/aws-appsync/src/link/subscription-handshake-link.ts b/packages/aws-appsync/src/link/subscription-handshake-link.ts index b64e6529..64e04ff3 100644 --- a/packages/aws-appsync/src/link/subscription-handshake-link.ts +++ b/packages/aws-appsync/src/link/subscription-handshake-link.ts @@ -13,6 +13,7 @@ import * as Paho from '../vendor/paho-mqtt'; import { ApolloError } from "apollo-client"; import { FieldNode } from "graphql"; import { getMainDefinition } from "apollo-utilities"; +import { PERMANENT_ERROR_KEY } from "./retry-link"; const logger = rootLogger.extend('subscriptions'); const mqttLogger = logger.extend('mqtt'); @@ -66,11 +67,11 @@ export class SubscriptionHandshakeLink extends ApolloLink { } = { subscription: { newSubscriptions: {}, mqttConnections: [] } }, errors = [], }: { - extensions?: { - subscription: SubscriptionExtension - }, - errors: any[] - } = subsInfo; + extensions?: { + subscription: SubscriptionExtension + }, + errors: any[] + } = subsInfo; if (errors && errors.length) { return new Observable(observer => { @@ -170,7 +171,7 @@ export class SubscriptionHandshakeLink extends ApolloLink { if (errorCode !== 0) { topics.forEach(t => { if (this.topicObservers.has(t)) { - this.topicObservers.get(t).forEach(observer => observer.error(args)); + this.topicObservers.get(t).forEach(observer => observer.error({ ...args, [PERMANENT_ERROR_KEY]: true })); } }); }