@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.
- package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js +10 -1
- package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js.map +1 -1
- package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js +8 -0
- package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js.map +1 -1
- package/dist/cjs/Providers/AWSWebSocketProvider/appsyncUrl.js +3 -2
- package/dist/cjs/Providers/AWSWebSocketProvider/appsyncUrl.js.map +1 -1
- package/dist/cjs/Providers/AWSWebSocketProvider/index.js +9 -5
- package/dist/cjs/Providers/AWSWebSocketProvider/index.js.map +1 -1
- package/dist/cjs/Providers/constants.js +5 -1
- package/dist/cjs/Providers/constants.js.map +1 -1
- package/dist/esm/Providers/AWSAppSyncEventsProvider/index.d.ts +6 -1
- package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs +10 -2
- package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs.map +1 -1
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.d.ts +5 -0
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs +9 -1
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs.map +1 -1
- package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.mjs +3 -2
- package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.mjs.map +1 -1
- package/dist/esm/Providers/AWSWebSocketProvider/index.d.ts +5 -0
- package/dist/esm/Providers/AWSWebSocketProvider/index.mjs +10 -6
- package/dist/esm/Providers/AWSWebSocketProvider/index.mjs.map +1 -1
- package/dist/esm/Providers/constants.d.ts +1 -0
- package/dist/esm/Providers/constants.mjs +5 -1
- package/dist/esm/Providers/constants.mjs.map +1 -1
- package/package.json +4 -4
- package/src/Providers/AWSAppSyncEventsProvider/index.ts +17 -2
- package/src/Providers/AWSAppSyncRealTimeProvider/index.ts +20 -1
- package/src/Providers/AWSWebSocketProvider/appsyncUrl.ts +3 -2
- package/src/Providers/AWSWebSocketProvider/index.ts +23 -12
- 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}
|
|
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
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
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 (
|
|
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
|
|