@aws-amplify/api-graphql 4.4.0 → 4.4.1-events.619318.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 (98) hide show
  1. package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js +94 -0
  2. package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js.map +1 -0
  3. package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js +35 -732
  4. package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js.map +1 -1
  5. package/dist/cjs/Providers/AWSWebSocketProvider/appsyncUrl.js +112 -0
  6. package/dist/cjs/Providers/AWSWebSocketProvider/appsyncUrl.js.map +1 -0
  7. package/dist/cjs/Providers/AWSWebSocketProvider/authHeaders.js +99 -0
  8. package/dist/cjs/Providers/AWSWebSocketProvider/authHeaders.js.map +1 -0
  9. package/dist/cjs/Providers/AWSWebSocketProvider/index.js +623 -0
  10. package/dist/cjs/Providers/AWSWebSocketProvider/index.js.map +1 -0
  11. package/dist/cjs/Providers/constants.js +32 -2
  12. package/dist/cjs/Providers/constants.js.map +1 -1
  13. package/dist/cjs/index.js +4 -1
  14. package/dist/cjs/index.js.map +1 -1
  15. package/dist/cjs/internals/InternalGraphQLAPI.js +8 -67
  16. package/dist/cjs/internals/InternalGraphQLAPI.js.map +1 -1
  17. package/dist/cjs/internals/events/appsyncRequest.js +97 -0
  18. package/dist/cjs/internals/events/appsyncRequest.js.map +1 -0
  19. package/dist/cjs/internals/events/index.js +73 -0
  20. package/dist/cjs/internals/events/index.js.map +1 -0
  21. package/dist/cjs/internals/events/types.js +6 -0
  22. package/dist/cjs/internals/events/types.js.map +1 -0
  23. package/dist/cjs/internals/events/utils.js +57 -0
  24. package/dist/cjs/internals/events/utils.js.map +1 -0
  25. package/dist/cjs/internals/graphqlAuth.js +64 -0
  26. package/dist/cjs/internals/graphqlAuth.js.map +1 -0
  27. package/dist/cjs/internals/graphqlRequest.js +20 -0
  28. package/dist/cjs/internals/graphqlRequest.js.map +1 -0
  29. package/dist/cjs/utils/ReconnectionMonitor.js +1 -1
  30. package/dist/cjs/utils/ReconnectionMonitor.js.map +1 -1
  31. package/dist/cjs/utils/resolveConfig.js +19 -0
  32. package/dist/cjs/utils/resolveConfig.js.map +1 -1
  33. package/dist/esm/Providers/AWSAppSyncEventsProvider/index.d.ts +42 -0
  34. package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs +93 -0
  35. package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs.map +1 -0
  36. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.d.ts +24 -71
  37. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs +35 -732
  38. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs.map +1 -1
  39. package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.d.ts +21 -0
  40. package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.mjs +106 -0
  41. package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.mjs.map +1 -0
  42. package/dist/esm/Providers/AWSWebSocketProvider/authHeaders.d.ts +8 -0
  43. package/dist/esm/Providers/AWSWebSocketProvider/authHeaders.mjs +97 -0
  44. package/dist/esm/Providers/AWSWebSocketProvider/authHeaders.mjs.map +1 -0
  45. package/dist/esm/Providers/AWSWebSocketProvider/index.d.ts +83 -0
  46. package/dist/esm/Providers/AWSWebSocketProvider/index.mjs +621 -0
  47. package/dist/esm/Providers/AWSWebSocketProvider/index.mjs.map +1 -0
  48. package/dist/esm/Providers/constants.d.ts +33 -3
  49. package/dist/esm/Providers/constants.mjs +32 -2
  50. package/dist/esm/Providers/constants.mjs.map +1 -1
  51. package/dist/esm/index.d.ts +3 -0
  52. package/dist/esm/index.mjs +2 -0
  53. package/dist/esm/index.mjs.map +1 -1
  54. package/dist/esm/internals/InternalGraphQLAPI.d.ts +0 -1
  55. package/dist/esm/internals/InternalGraphQLAPI.mjs +9 -68
  56. package/dist/esm/internals/InternalGraphQLAPI.mjs.map +1 -1
  57. package/dist/esm/internals/events/appsyncRequest.d.ts +14 -0
  58. package/dist/esm/internals/events/appsyncRequest.mjs +96 -0
  59. package/dist/esm/internals/events/appsyncRequest.mjs.map +1 -0
  60. package/dist/esm/internals/events/index.d.ts +17 -0
  61. package/dist/esm/internals/events/index.mjs +69 -0
  62. package/dist/esm/internals/events/index.mjs.map +1 -0
  63. package/dist/esm/internals/events/types.d.ts +23 -0
  64. package/dist/esm/internals/events/types.mjs +2 -0
  65. package/dist/esm/internals/events/types.mjs.map +1 -0
  66. package/dist/esm/internals/events/utils.d.ts +16 -0
  67. package/dist/esm/internals/events/utils.mjs +53 -0
  68. package/dist/esm/internals/events/utils.mjs.map +1 -0
  69. package/dist/esm/internals/graphqlAuth.d.ts +3 -0
  70. package/dist/esm/internals/graphqlAuth.mjs +64 -0
  71. package/dist/esm/internals/graphqlAuth.mjs.map +1 -0
  72. package/dist/esm/internals/graphqlRequest.d.ts +3 -0
  73. package/dist/esm/internals/graphqlRequest.mjs +18 -0
  74. package/dist/esm/internals/graphqlRequest.mjs.map +1 -0
  75. package/dist/esm/utils/ConnectionStateMonitor.d.ts +29 -1
  76. package/dist/esm/utils/ReconnectionMonitor.d.ts +1 -1
  77. package/dist/esm/utils/ReconnectionMonitor.mjs +1 -1
  78. package/dist/esm/utils/ReconnectionMonitor.mjs.map +1 -1
  79. package/dist/esm/utils/resolveConfig.mjs +19 -0
  80. package/dist/esm/utils/resolveConfig.mjs.map +1 -1
  81. package/package.json +4 -4
  82. package/src/Providers/AWSAppSyncEventsProvider/index.ts +187 -0
  83. package/src/Providers/AWSAppSyncRealTimeProvider/index.ts +58 -1051
  84. package/src/Providers/AWSWebSocketProvider/appsyncUrl.ts +151 -0
  85. package/src/Providers/AWSWebSocketProvider/authHeaders.ts +146 -0
  86. package/src/Providers/AWSWebSocketProvider/index.ts +925 -0
  87. package/src/Providers/constants.ts +32 -2
  88. package/src/index.ts +5 -0
  89. package/src/internals/InternalGraphQLAPI.ts +15 -102
  90. package/src/internals/events/appsyncRequest.ts +169 -0
  91. package/src/internals/events/index.ts +138 -0
  92. package/src/internals/events/types.ts +35 -0
  93. package/src/internals/events/utils.ts +77 -0
  94. package/src/internals/graphqlAuth.ts +87 -0
  95. package/src/internals/graphqlRequest.ts +30 -0
  96. package/src/utils/ConnectionStateMonitor.ts +2 -13
  97. package/src/utils/ReconnectionMonitor.ts +1 -1
  98. package/src/utils/resolveConfig.ts +23 -0
@@ -0,0 +1,151 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { RequestOptions } from '@aws-amplify/data-schema/runtime';
5
+ import {
6
+ AmplifyUrl,
7
+ AmplifyUrlSearchParams,
8
+ } from '@aws-amplify/core/internals/utils';
9
+
10
+ import { AWSAppSyncRealTimeProviderOptions } from '../AWSAppSyncRealTimeProvider';
11
+
12
+ const protocol = 'wss://';
13
+ const standardDomainPattern =
14
+ /^https:\/\/\w{26}\.appsync-api\.\w{2}(?:(?:-\w{2,})+)-\d\.amazonaws.com(?:\.cn)?\/graphql$/i;
15
+ const eventDomainPattern =
16
+ /^https:\/\/\w{26}\.ddpg-api\.\w{2}(?:(?:-\w{2,})+)-\d\.amazonaws.com(?:\.cn)?\/event$/i;
17
+ const customDomainPath = '/realtime';
18
+
19
+ export const isCustomDomain = (url: string): boolean => {
20
+ return url.match(standardDomainPattern) === null;
21
+ };
22
+
23
+ const isEventDomain = (url: string): boolean =>
24
+ url.match(eventDomainPattern) !== null;
25
+
26
+ export const getRealtimeEndpointUrl = (
27
+ appSyncGraphqlEndpoint: string | undefined,
28
+ ): URL => {
29
+ let realtimeEndpoint = appSyncGraphqlEndpoint ?? '';
30
+
31
+ if (isEventDomain(realtimeEndpoint)) {
32
+ realtimeEndpoint = realtimeEndpoint
33
+ .concat(customDomainPath)
34
+ .replace('ddpg-api', 'grt-gamma');
35
+ } else if (isCustomDomain(realtimeEndpoint)) {
36
+ realtimeEndpoint = realtimeEndpoint.concat(customDomainPath);
37
+ } else {
38
+ realtimeEndpoint = realtimeEndpoint
39
+ .replace('appsync-api', 'appsync-realtime-api')
40
+ .replace('gogi-beta', 'grt-beta')
41
+ .replace('ddpg-api', 'grt-gamma');
42
+ }
43
+
44
+ realtimeEndpoint = realtimeEndpoint
45
+ .replace('https://', protocol)
46
+ .replace('http://', protocol);
47
+
48
+ return new AmplifyUrl(realtimeEndpoint);
49
+ };
50
+
51
+ /**
52
+ * Strips out `Authorization` header if present
53
+ */
54
+ const extractNonAuthHeaders = (
55
+ headers?: AWSAppSyncRealTimeProviderOptions['additionalCustomHeaders'],
56
+ ): Record<string, string> => {
57
+ if (!headers) {
58
+ return {};
59
+ }
60
+
61
+ if ('Authorization' in headers) {
62
+ const { Authorization: _, ...nonAuthHeaders } = headers;
63
+
64
+ return nonAuthHeaders;
65
+ }
66
+
67
+ return headers;
68
+ };
69
+
70
+ /**
71
+ *
72
+ * @param headers - http headers
73
+ * @returns uri-encoded query parameters derived from custom headers
74
+ */
75
+ export const queryParamsFromCustomHeaders = (
76
+ headers?: AWSAppSyncRealTimeProviderOptions['additionalCustomHeaders'],
77
+ ): URLSearchParams => {
78
+ const nonAuthHeaders = extractNonAuthHeaders(headers);
79
+
80
+ const params = new AmplifyUrlSearchParams();
81
+
82
+ Object.entries(nonAuthHeaders).forEach(([k, v]) => {
83
+ params.append(k, v);
84
+ });
85
+
86
+ return params;
87
+ };
88
+
89
+ /**
90
+ * Normalizes AppSync realtime endpoint URL
91
+ *
92
+ * @param appSyncGraphqlEndpoint - AppSync endpointUri from config
93
+ * @param urlParams - URLSearchParams
94
+ * @returns fully resolved string realtime endpoint URL
95
+ */
96
+ export const realtimeUrlWithQueryString = (
97
+ appSyncGraphqlEndpoint: string | undefined,
98
+ urlParams: URLSearchParams,
99
+ ): string => {
100
+ const realtimeEndpointUrl = getRealtimeEndpointUrl(appSyncGraphqlEndpoint);
101
+
102
+ // preserves any query params a customer might manually set in the configuration
103
+ const existingParams = new AmplifyUrlSearchParams(realtimeEndpointUrl.search);
104
+
105
+ for (const [k, v] of urlParams.entries()) {
106
+ existingParams.append(k, v);
107
+ }
108
+
109
+ realtimeEndpointUrl.search = existingParams.toString();
110
+
111
+ return realtimeEndpointUrl.toString();
112
+ };
113
+
114
+ // TODO: move to separate file?
115
+ export const additionalHeadersFromOptions = async (
116
+ options: AWSAppSyncRealTimeProviderOptions,
117
+ ) => {
118
+ const {
119
+ appSyncGraphqlEndpoint,
120
+ query,
121
+ libraryConfigHeaders = () => ({}),
122
+ additionalHeaders = {},
123
+ authToken,
124
+ } = options;
125
+
126
+ let additionalCustomHeaders = {};
127
+ const _libraryConfigHeaders = await libraryConfigHeaders();
128
+
129
+ if (typeof additionalHeaders === 'function') {
130
+ const requestOptions: RequestOptions = {
131
+ url: appSyncGraphqlEndpoint || '',
132
+ queryString: query || '',
133
+ };
134
+ additionalCustomHeaders = await additionalHeaders(requestOptions);
135
+ } else {
136
+ additionalCustomHeaders = additionalHeaders;
137
+ }
138
+
139
+ // if an authorization header is set, have the explicit, operation-level authToken take precedence
140
+ if (authToken) {
141
+ additionalCustomHeaders = {
142
+ ...additionalCustomHeaders,
143
+ Authorization: authToken,
144
+ };
145
+ }
146
+
147
+ return {
148
+ additionalCustomHeaders,
149
+ libraryConfigHeaders: _libraryConfigHeaders,
150
+ };
151
+ };
@@ -0,0 +1,146 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { ConsoleLogger, fetchAuthSession } from '@aws-amplify/core';
5
+ import { signRequest } from '@aws-amplify/core/internals/aws-client-utils';
6
+ import { AmplifyUrl } from '@aws-amplify/core/internals/utils';
7
+
8
+ import { AWS_APPSYNC_REALTIME_HEADERS } from '../constants';
9
+ import { AWSAppSyncRealTimeProviderOptions } from '../AWSAppSyncRealTimeProvider';
10
+
11
+ const logger = new ConsoleLogger('AWSAppSyncRealTimeProvider Auth');
12
+
13
+ type AWSAppSyncRealTimeAuthInput =
14
+ Partial<AWSAppSyncRealTimeProviderOptions> & {
15
+ canonicalUri: string;
16
+ payload: string;
17
+ host?: string | undefined;
18
+ };
19
+
20
+ const awsAuthTokenHeader = async ({ host }: AWSAppSyncRealTimeAuthInput) => {
21
+ const session = await fetchAuthSession();
22
+
23
+ return {
24
+ Authorization: session?.tokens?.accessToken?.toString(),
25
+ host,
26
+ };
27
+ };
28
+
29
+ const awsRealTimeApiKeyHeader = async ({
30
+ apiKey,
31
+ host,
32
+ }: AWSAppSyncRealTimeAuthInput) => {
33
+ const dt = new Date();
34
+ const dtStr = dt.toISOString().replace(/[:-]|\.\d{3}/g, '');
35
+
36
+ return {
37
+ host,
38
+ 'x-amz-date': dtStr,
39
+ 'x-api-key': apiKey,
40
+ };
41
+ };
42
+
43
+ const awsRealTimeIAMHeader = async ({
44
+ payload,
45
+ canonicalUri,
46
+ appSyncGraphqlEndpoint,
47
+ region,
48
+ }: AWSAppSyncRealTimeAuthInput) => {
49
+ const endpointInfo = {
50
+ region,
51
+ service: 'appsync',
52
+ };
53
+
54
+ const creds = (await fetchAuthSession()).credentials;
55
+
56
+ const request = {
57
+ url: `${appSyncGraphqlEndpoint}${canonicalUri}`,
58
+ data: payload,
59
+ method: 'POST',
60
+ headers: { ...AWS_APPSYNC_REALTIME_HEADERS },
61
+ };
62
+
63
+ const signedParams = signRequest(
64
+ {
65
+ headers: request.headers,
66
+ method: request.method,
67
+ url: new AmplifyUrl(request.url),
68
+ body: request.data,
69
+ },
70
+ {
71
+ credentials: creds!,
72
+ signingRegion: endpointInfo.region!,
73
+ signingService: endpointInfo.service,
74
+ },
75
+ );
76
+
77
+ return signedParams.headers;
78
+ };
79
+
80
+ const customAuthHeader = async ({
81
+ host,
82
+ additionalCustomHeaders,
83
+ }: AWSAppSyncRealTimeAuthInput) => {
84
+ /**
85
+ * If `additionalHeaders` was provided to the subscription as a function,
86
+ * the headers that are returned by that function will already have been
87
+ * provided before this function is called.
88
+ */
89
+ if (!additionalCustomHeaders?.Authorization) {
90
+ throw new Error('No auth token specified');
91
+ }
92
+
93
+ return {
94
+ Authorization: additionalCustomHeaders.Authorization,
95
+ host,
96
+ };
97
+ };
98
+
99
+ export const awsRealTimeHeaderBasedAuth = async ({
100
+ apiKey,
101
+ authenticationType,
102
+ canonicalUri,
103
+ appSyncGraphqlEndpoint,
104
+ region,
105
+ additionalCustomHeaders,
106
+ payload,
107
+ }: AWSAppSyncRealTimeAuthInput): Promise<
108
+ Record<string, string | undefined> | undefined
109
+ > => {
110
+ const headerHandler = {
111
+ apiKey: awsRealTimeApiKeyHeader,
112
+ iam: awsRealTimeIAMHeader,
113
+ oidc: awsAuthTokenHeader,
114
+ userPool: awsAuthTokenHeader,
115
+ lambda: customAuthHeader,
116
+ none: customAuthHeader,
117
+ } as const;
118
+
119
+ if (!authenticationType || !headerHandler[authenticationType]) {
120
+ logger.debug(`Authentication type ${authenticationType} not supported`);
121
+
122
+ return undefined;
123
+ } else {
124
+ const handler = headerHandler[authenticationType];
125
+
126
+ const host = appSyncGraphqlEndpoint
127
+ ? new AmplifyUrl(appSyncGraphqlEndpoint).host
128
+ : undefined;
129
+
130
+ const resolvedApiKey = authenticationType === 'apiKey' ? apiKey : undefined;
131
+
132
+ logger.debug(`Authenticating with ${JSON.stringify(authenticationType)}`);
133
+
134
+ const result = await handler({
135
+ payload,
136
+ canonicalUri,
137
+ appSyncGraphqlEndpoint,
138
+ apiKey: resolvedApiKey,
139
+ region,
140
+ host,
141
+ additionalCustomHeaders,
142
+ });
143
+
144
+ return result;
145
+ }
146
+ };