@aws-amplify/api-graphql 4.4.4-unstable.5d549c3.0 → 4.5.0

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.
Files changed (30) hide show
  1. package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js +10 -1
  2. package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js.map +1 -1
  3. package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js +8 -0
  4. package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js.map +1 -1
  5. package/dist/cjs/Providers/AWSWebSocketProvider/appsyncUrl.js +3 -2
  6. package/dist/cjs/Providers/AWSWebSocketProvider/appsyncUrl.js.map +1 -1
  7. package/dist/cjs/Providers/AWSWebSocketProvider/index.js +9 -5
  8. package/dist/cjs/Providers/AWSWebSocketProvider/index.js.map +1 -1
  9. package/dist/cjs/Providers/constants.js +5 -1
  10. package/dist/cjs/Providers/constants.js.map +1 -1
  11. package/dist/esm/Providers/AWSAppSyncEventsProvider/index.d.ts +6 -1
  12. package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs +10 -2
  13. package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs.map +1 -1
  14. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.d.ts +5 -0
  15. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs +9 -1
  16. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs.map +1 -1
  17. package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.mjs +3 -2
  18. package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.mjs.map +1 -1
  19. package/dist/esm/Providers/AWSWebSocketProvider/index.d.ts +5 -0
  20. package/dist/esm/Providers/AWSWebSocketProvider/index.mjs +10 -6
  21. package/dist/esm/Providers/AWSWebSocketProvider/index.mjs.map +1 -1
  22. package/dist/esm/Providers/constants.d.ts +1 -0
  23. package/dist/esm/Providers/constants.mjs +5 -1
  24. package/dist/esm/Providers/constants.mjs.map +1 -1
  25. package/package.json +4 -4
  26. package/src/Providers/AWSAppSyncEventsProvider/index.ts +17 -2
  27. package/src/Providers/AWSAppSyncRealTimeProvider/index.ts +20 -1
  28. package/src/Providers/AWSWebSocketProvider/appsyncUrl.ts +3 -2
  29. package/src/Providers/AWSWebSocketProvider/index.ts +23 -12
  30. package/src/Providers/constants.ts +4 -0
@@ -9,7 +9,7 @@ import {
9
9
  } from '@aws-amplify/core/internals/utils';
10
10
  import { CustomHeaders } from '@aws-amplify/data-schema/runtime';
11
11
 
12
- import { MESSAGE_TYPES } from '../constants';
12
+ import { DEFAULT_KEEP_ALIVE_TIMEOUT, MESSAGE_TYPES } from '../constants';
13
13
  import { AWSWebSocketProvider } from '../AWSWebSocketProvider';
14
14
  import { awsRealTimeHeaderBasedAuth } from '../AWSWebSocketProvider/authHeaders';
15
15
 
@@ -44,7 +44,7 @@ interface DataResponse {
44
44
  const PROVIDER_NAME = 'AWSAppSyncEventsProvider';
45
45
  const WS_PROTOCOL_NAME = 'aws-appsync-event-ws';
46
46
 
47
- class AWSAppSyncEventProvider extends AWSWebSocketProvider {
47
+ export class AWSAppSyncEventProvider extends AWSWebSocketProvider {
48
48
  constructor() {
49
49
  super({ providerName: PROVIDER_NAME, wsProtocolName: WS_PROTOCOL_NAME });
50
50
  }
@@ -187,6 +187,21 @@ class AWSAppSyncEventProvider extends AWSWebSocketProvider {
187
187
  type: MESSAGE_TYPES.EVENT_STOP,
188
188
  };
189
189
  }
190
+
191
+ protected _extractConnectionTimeout(data: Record<string, any>): number {
192
+ const { connectionTimeoutMs = DEFAULT_KEEP_ALIVE_TIMEOUT } = data;
193
+
194
+ return connectionTimeoutMs;
195
+ }
196
+
197
+ protected _extractErrorCodeAndType(data: Record<string, any>): {
198
+ errorCode: number;
199
+ errorType: string;
200
+ } {
201
+ const { errors: [{ errorType = '', errorCode = 0 } = {}] = [] } = data;
202
+
203
+ return { errorCode, errorType };
204
+ }
190
205
  }
191
206
 
192
207
  export const AppSyncEventProvider = new AWSAppSyncEventProvider();
@@ -10,7 +10,7 @@ import {
10
10
  } from '@aws-amplify/core/internals/utils';
11
11
  import { CustomHeaders } from '@aws-amplify/data-schema/runtime';
12
12
 
13
- import { MESSAGE_TYPES } from '../constants';
13
+ import { DEFAULT_KEEP_ALIVE_TIMEOUT, MESSAGE_TYPES } from '../constants';
14
14
  import { AWSWebSocketProvider } from '../AWSWebSocketProvider';
15
15
  import { awsRealTimeHeaderBasedAuth } from '../AWSWebSocketProvider/authHeaders';
16
16
 
@@ -158,4 +158,23 @@ export class AWSAppSyncRealTimeProvider extends AWSWebSocketProvider {
158
158
  type: MESSAGE_TYPES.GQL_STOP,
159
159
  };
160
160
  }
161
+
162
+ protected _extractConnectionTimeout(data: Record<string, any>): number {
163
+ const {
164
+ payload: { connectionTimeoutMs = DEFAULT_KEEP_ALIVE_TIMEOUT } = {},
165
+ } = data;
166
+
167
+ return connectionTimeoutMs;
168
+ }
169
+
170
+ protected _extractErrorCodeAndType(data: any): {
171
+ errorCode: number;
172
+ errorType: string;
173
+ } {
174
+ const {
175
+ payload: { errors: [{ errorType = '', errorCode = 0 } = {}] = [] } = {},
176
+ } = data;
177
+
178
+ return { errorCode, errorType };
179
+ }
161
180
  }
@@ -13,7 +13,7 @@ const protocol = 'wss://';
13
13
  const standardDomainPattern =
14
14
  /^https:\/\/\w{26}\.appsync-api\.\w{2}(?:(?:-\w{2,})+)-\d\.amazonaws.com(?:\.cn)?\/graphql$/i;
15
15
  const eventDomainPattern =
16
- /^https:\/\/\w{26}\.ddpg-api\.\w{2}(?:(?:-\w{2,})+)-\d\.amazonaws.com(?:\.cn)?\/event$/i;
16
+ /^https:\/\/\w{26}\.\w+-api\.\w{2}(?:(?:-\w{2,})+)-\d\.amazonaws.com(?:\.cn)?\/event$/i;
17
17
  const customDomainPath = '/realtime';
18
18
 
19
19
  export const isCustomDomain = (url: string): boolean => {
@@ -31,7 +31,8 @@ export const getRealtimeEndpointUrl = (
31
31
  if (isEventDomain(realtimeEndpoint)) {
32
32
  realtimeEndpoint = realtimeEndpoint
33
33
  .concat(customDomainPath)
34
- .replace('ddpg-api', 'grt-gamma');
34
+ .replace('ddpg-api', 'grt-gamma')
35
+ .replace('appsync-api', 'appsync-realtime-api');
35
36
  } else if (isCustomDomain(realtimeEndpoint)) {
36
37
  realtimeEndpoint = realtimeEndpoint.concat(customDomainPath);
37
38
  } else {
@@ -27,6 +27,7 @@ import {
27
27
  MAX_DELAY_MS,
28
28
  MESSAGE_TYPES,
29
29
  NON_RETRYABLE_CODES,
30
+ NON_RETRYABLE_ERROR_TYPES,
30
31
  SOCKET_STATUS,
31
32
  START_ACK_TIMEOUT,
32
33
  SUBSCRIPTION_STATUS,
@@ -546,6 +547,15 @@ export abstract class AWSWebSocketProvider {
546
547
  { id: string; payload: string | Record<string, unknown>; type: string },
547
548
  ];
548
549
 
550
+ protected abstract _extractConnectionTimeout(
551
+ data: Record<string, any>,
552
+ ): number;
553
+
554
+ protected abstract _extractErrorCodeAndType(data: Record<string, any>): {
555
+ errorCode: number;
556
+ errorType: string;
557
+ };
558
+
549
559
  private _handleIncomingSubscriptionMessage(message: MessageEvent) {
550
560
  if (typeof message.data !== 'string') {
551
561
  return;
@@ -629,14 +639,14 @@ export abstract class AWSWebSocketProvider {
629
639
  });
630
640
 
631
641
  this.logger.debug(
632
- `${CONTROL_MSG.CONNECTION_FAILED}: ${JSON.stringify(payload)}`,
642
+ `${CONTROL_MSG.CONNECTION_FAILED}: ${JSON.stringify(payload ?? data)}`,
633
643
  );
634
644
 
635
645
  observer.error({
636
646
  errors: [
637
647
  {
638
648
  ...new GraphQLError(
639
- `${CONTROL_MSG.CONNECTION_FAILED}: ${JSON.stringify(payload)}`,
649
+ `${CONTROL_MSG.CONNECTION_FAILED}: ${JSON.stringify(payload ?? data)}`,
640
650
  ),
641
651
  },
642
652
  ],
@@ -830,10 +840,10 @@ export abstract class AWSWebSocketProvider {
830
840
  );
831
841
 
832
842
  const data = JSON.parse(message.data) as ParsedMessagePayload;
833
- const {
834
- type,
835
- payload: { connectionTimeoutMs = DEFAULT_KEEP_ALIVE_TIMEOUT } = {},
836
- } = data;
843
+
844
+ const { type } = data;
845
+
846
+ const connectionTimeoutMs = this._extractConnectionTimeout(data);
837
847
 
838
848
  if (type === MESSAGE_TYPES.GQL_CONNECTION_ACK) {
839
849
  ackOk = true;
@@ -844,11 +854,7 @@ export abstract class AWSWebSocketProvider {
844
854
  }
845
855
 
846
856
  if (type === MESSAGE_TYPES.GQL_CONNECTION_ERROR) {
847
- const {
848
- payload: {
849
- errors: [{ errorType = '', errorCode = 0 } = {}] = [],
850
- } = {},
851
- } = data;
857
+ const { errorType, errorCode } = this._extractErrorCodeAndType(data);
852
858
 
853
859
  // TODO(Eslint): refactor to reject an Error object instead of a plain object
854
860
  // eslint-disable-next-line prefer-promise-reject-errors
@@ -920,7 +926,12 @@ export abstract class AWSWebSocketProvider {
920
926
  errorCode: number;
921
927
  };
922
928
 
923
- if (NON_RETRYABLE_CODES.includes(errorCode)) {
929
+ if (
930
+ NON_RETRYABLE_CODES.includes(errorCode) ||
931
+ // Event API does not currently return `errorCode`. This may change in the future.
932
+ // For now fall back to also checking known non-retryable error types
933
+ NON_RETRYABLE_ERROR_TYPES.includes(errorType)
934
+ ) {
924
935
  throw new NonRetryableError(errorType);
925
936
  } else if (errorType) {
926
937
  throw new Error(errorType);
@@ -5,6 +5,10 @@ export { AMPLIFY_SYMBOL } from '@aws-amplify/core/internals/utils';
5
5
  export const MAX_DELAY_MS = 5000;
6
6
 
7
7
  export const NON_RETRYABLE_CODES = [400, 401, 403];
8
+ export const NON_RETRYABLE_ERROR_TYPES = [
9
+ 'BadRequestException',
10
+ 'UnauthorizedException',
11
+ ];
8
12
 
9
13
  export const CONNECTION_STATE_CHANGE = 'ConnectionStateChange';
10
14