@aws-amplify/api-graphql 4.4.3-unstable.847fb51.0 → 4.4.3
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/AWSAppSyncRealTimeProvider/index.js +731 -34
- package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js.map +1 -1
- package/dist/cjs/Providers/constants.js +2 -32
- package/dist/cjs/Providers/constants.js.map +1 -1
- package/dist/cjs/index.js +1 -4
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/internals/InternalGraphQLAPI.js +67 -8
- package/dist/cjs/internals/InternalGraphQLAPI.js.map +1 -1
- package/dist/cjs/utils/ReconnectionMonitor.js +1 -1
- package/dist/cjs/utils/ReconnectionMonitor.js.map +1 -1
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.d.ts +71 -24
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs +731 -34
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs.map +1 -1
- package/dist/esm/Providers/constants.d.ts +3 -33
- package/dist/esm/Providers/constants.mjs +2 -32
- package/dist/esm/Providers/constants.mjs.map +1 -1
- package/dist/esm/index.d.ts +0 -3
- package/dist/esm/index.mjs +0 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/internals/InternalGraphQLAPI.d.ts +1 -0
- package/dist/esm/internals/InternalGraphQLAPI.mjs +68 -9
- package/dist/esm/internals/InternalGraphQLAPI.mjs.map +1 -1
- package/dist/esm/utils/ConnectionStateMonitor.d.ts +1 -29
- package/dist/esm/utils/ReconnectionMonitor.d.ts +1 -1
- package/dist/esm/utils/ReconnectionMonitor.mjs +1 -1
- package/dist/esm/utils/ReconnectionMonitor.mjs.map +1 -1
- package/package.json +4 -4
- package/src/Providers/AWSAppSyncRealTimeProvider/index.ts +1049 -56
- package/src/Providers/constants.ts +2 -32
- package/src/index.ts +0 -5
- package/src/internals/InternalGraphQLAPI.ts +102 -15
- package/src/utils/ConnectionStateMonitor.ts +13 -2
- package/src/utils/ReconnectionMonitor.ts +1 -1
- package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js +0 -98
- package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js.map +0 -1
- package/dist/cjs/Providers/AWSWebSocketProvider/appsyncUrl.js +0 -112
- package/dist/cjs/Providers/AWSWebSocketProvider/appsyncUrl.js.map +0 -1
- package/dist/cjs/Providers/AWSWebSocketProvider/authHeaders.js +0 -99
- package/dist/cjs/Providers/AWSWebSocketProvider/authHeaders.js.map +0 -1
- package/dist/cjs/Providers/AWSWebSocketProvider/index.js +0 -624
- package/dist/cjs/Providers/AWSWebSocketProvider/index.js.map +0 -1
- package/dist/cjs/internals/events/appsyncRequest.js +0 -97
- package/dist/cjs/internals/events/appsyncRequest.js.map +0 -1
- package/dist/cjs/internals/events/index.js +0 -73
- package/dist/cjs/internals/events/index.js.map +0 -1
- package/dist/cjs/internals/events/types.js +0 -6
- package/dist/cjs/internals/events/types.js.map +0 -1
- package/dist/cjs/internals/events/utils.js +0 -57
- package/dist/cjs/internals/events/utils.js.map +0 -1
- package/dist/cjs/internals/graphqlAuth.js +0 -64
- package/dist/cjs/internals/graphqlAuth.js.map +0 -1
- package/dist/cjs/internals/graphqlRequest.js +0 -20
- package/dist/cjs/internals/graphqlRequest.js.map +0 -1
- package/dist/esm/Providers/AWSAppSyncEventsProvider/index.d.ts +0 -43
- package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs +0 -97
- package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs.map +0 -1
- package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.d.ts +0 -21
- package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.mjs +0 -106
- package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.mjs.map +0 -1
- package/dist/esm/Providers/AWSWebSocketProvider/authHeaders.d.ts +0 -8
- package/dist/esm/Providers/AWSWebSocketProvider/authHeaders.mjs +0 -97
- package/dist/esm/Providers/AWSWebSocketProvider/authHeaders.mjs.map +0 -1
- package/dist/esm/Providers/AWSWebSocketProvider/index.d.ts +0 -89
- package/dist/esm/Providers/AWSWebSocketProvider/index.mjs +0 -622
- package/dist/esm/Providers/AWSWebSocketProvider/index.mjs.map +0 -1
- package/dist/esm/internals/events/appsyncRequest.d.ts +0 -14
- package/dist/esm/internals/events/appsyncRequest.mjs +0 -96
- package/dist/esm/internals/events/appsyncRequest.mjs.map +0 -1
- package/dist/esm/internals/events/index.d.ts +0 -17
- package/dist/esm/internals/events/index.mjs +0 -69
- package/dist/esm/internals/events/index.mjs.map +0 -1
- package/dist/esm/internals/events/types.d.ts +0 -23
- package/dist/esm/internals/events/types.mjs +0 -2
- package/dist/esm/internals/events/types.mjs.map +0 -1
- package/dist/esm/internals/events/utils.d.ts +0 -16
- package/dist/esm/internals/events/utils.mjs +0 -53
- package/dist/esm/internals/events/utils.mjs.map +0 -1
- package/dist/esm/internals/graphqlAuth.d.ts +0 -3
- package/dist/esm/internals/graphqlAuth.mjs +0 -64
- package/dist/esm/internals/graphqlAuth.mjs.map +0 -1
- package/dist/esm/internals/graphqlRequest.d.ts +0 -3
- package/dist/esm/internals/graphqlRequest.mjs +0 -18
- package/dist/esm/internals/graphqlRequest.mjs.map +0 -1
- package/src/Providers/AWSAppSyncEventsProvider/index.ts +0 -192
- package/src/Providers/AWSWebSocketProvider/appsyncUrl.ts +0 -151
- package/src/Providers/AWSWebSocketProvider/authHeaders.ts +0 -146
- package/src/Providers/AWSWebSocketProvider/index.ts +0 -932
- package/src/internals/events/appsyncRequest.ts +0 -169
- package/src/internals/events/index.ts +0 -138
- package/src/internals/events/types.ts +0 -35
- package/src/internals/events/utils.ts +0 -77
- package/src/internals/graphqlAuth.ts +0 -87
- package/src/internals/graphqlRequest.ts +0 -30
|
@@ -36,9 +36,9 @@ export enum MESSAGE_TYPES {
|
|
|
36
36
|
GQL_START_ACK = 'start_ack',
|
|
37
37
|
/**
|
|
38
38
|
* Server -> Client message.
|
|
39
|
-
* This message type is for subscription message from AWS AppSync RealTime
|
|
39
|
+
* This message type is for subscription message from AWS AppSync RealTime
|
|
40
40
|
*/
|
|
41
|
-
|
|
41
|
+
GQL_DATA = 'data',
|
|
42
42
|
/**
|
|
43
43
|
* Server -> Client message.
|
|
44
44
|
* This message type helps the client to know is still receiving messages from AWS AppSync RealTime
|
|
@@ -59,36 +59,6 @@ export enum MESSAGE_TYPES {
|
|
|
59
59
|
* This message type is for sending error messages from AWS AppSync RealTime to the client
|
|
60
60
|
*/
|
|
61
61
|
GQL_ERROR = 'error', // Server -> Client
|
|
62
|
-
/**
|
|
63
|
-
* Client -> Server message.
|
|
64
|
-
* This message type is for registering subscriptions with Events
|
|
65
|
-
*/
|
|
66
|
-
EVENT_SUBSCRIBE = 'subscribe',
|
|
67
|
-
/**
|
|
68
|
-
* Client -> Server message.
|
|
69
|
-
* This message type is for publishing a message with Events
|
|
70
|
-
*/
|
|
71
|
-
EVENT_PUBLISH = 'publish',
|
|
72
|
-
/**
|
|
73
|
-
* Server -> Client message.
|
|
74
|
-
* Server acknowledges successful subscription
|
|
75
|
-
*/
|
|
76
|
-
EVENT_SUBSCRIBE_ACK = 'subscribe_success',
|
|
77
|
-
/**
|
|
78
|
-
* Server -> Client message.
|
|
79
|
-
* Server acknowledges successful publish
|
|
80
|
-
*/
|
|
81
|
-
EVENT_PUBLISH_ACK = 'publish_success',
|
|
82
|
-
/**
|
|
83
|
-
* Client -> Server message.
|
|
84
|
-
* This message type is for unregister subscriptions with AWS AppSync RealTime
|
|
85
|
-
*/
|
|
86
|
-
EVENT_STOP = 'unsubscribe',
|
|
87
|
-
/**
|
|
88
|
-
* Server -> Client message.
|
|
89
|
-
* This is the ack response from AWS AppSync Events to EVENT_STOP message
|
|
90
|
-
*/
|
|
91
|
-
EVENT_COMPLETE = 'unsubscribe_success',
|
|
92
62
|
}
|
|
93
63
|
|
|
94
64
|
export enum SUBSCRIPTION_STATUS {
|
package/src/index.ts
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
-
import * as events from './internals/events';
|
|
5
|
-
|
|
6
|
-
export { events };
|
|
7
|
-
|
|
8
4
|
export { GraphQLAPI, GraphQLAPIClass, graphqlOperation } from './GraphQLAPI';
|
|
9
5
|
export * from './types';
|
|
10
6
|
|
|
11
7
|
export { CONNECTION_STATE_CHANGE } from './Providers/constants';
|
|
12
|
-
export * from './internals/events/types';
|
|
@@ -12,6 +12,7 @@ import { AmplifyClassV6 } from '@aws-amplify/core';
|
|
|
12
12
|
import {
|
|
13
13
|
AmplifyUrl,
|
|
14
14
|
CustomUserAgentDetails,
|
|
15
|
+
GraphQLAuthMode,
|
|
15
16
|
getAmplifyUserAgent,
|
|
16
17
|
} from '@aws-amplify/core/internals/utils';
|
|
17
18
|
import { isCancelError as isCancelErrorREST } from '@aws-amplify/api-rest';
|
|
@@ -29,11 +30,17 @@ import { AWSAppSyncRealTimeProvider } from '../Providers/AWSAppSyncRealTimeProvi
|
|
|
29
30
|
import { GraphQLOperation, GraphQLOptions, GraphQLResult } from '../types';
|
|
30
31
|
import { resolveConfig, resolveLibraryOptions } from '../utils';
|
|
31
32
|
import { repackageUnauthorizedError } from '../utils/errors/repackageAuthError';
|
|
32
|
-
import {
|
|
33
|
+
import {
|
|
34
|
+
NO_API_KEY,
|
|
35
|
+
NO_AUTH_TOKEN_HEADER,
|
|
36
|
+
NO_ENDPOINT,
|
|
37
|
+
NO_SIGNED_IN_USER,
|
|
38
|
+
NO_VALID_AUTH_TOKEN,
|
|
39
|
+
NO_VALID_CREDENTIALS,
|
|
40
|
+
} from '../utils/errors/constants';
|
|
33
41
|
import { GraphQLApiError, createGraphQLResultWithError } from '../utils/errors';
|
|
34
42
|
|
|
35
43
|
import { isGraphQLResponseWithErrors } from './utils/runtimeTypeGuards/isGraphQLResponseWithErrors';
|
|
36
|
-
import { headerBasedAuth } from './graphqlAuth';
|
|
37
44
|
|
|
38
45
|
const USER_AGENT_HEADER = 'x-amz-user-agent';
|
|
39
46
|
|
|
@@ -65,6 +72,80 @@ export class InternalGraphQLAPIClass {
|
|
|
65
72
|
return 'InternalGraphQLAPI';
|
|
66
73
|
}
|
|
67
74
|
|
|
75
|
+
private async _headerBasedAuth(
|
|
76
|
+
amplify: AmplifyClassV6,
|
|
77
|
+
authMode: GraphQLAuthMode,
|
|
78
|
+
additionalHeaders: Record<string, string> = {},
|
|
79
|
+
) {
|
|
80
|
+
const { apiKey } = resolveConfig(amplify);
|
|
81
|
+
|
|
82
|
+
let headers = {};
|
|
83
|
+
|
|
84
|
+
switch (authMode) {
|
|
85
|
+
case 'apiKey':
|
|
86
|
+
if (!apiKey) {
|
|
87
|
+
throw new GraphQLApiError(NO_API_KEY);
|
|
88
|
+
}
|
|
89
|
+
headers = {
|
|
90
|
+
'X-Api-Key': apiKey,
|
|
91
|
+
};
|
|
92
|
+
break;
|
|
93
|
+
case 'iam': {
|
|
94
|
+
const session = await amplify.Auth.fetchAuthSession();
|
|
95
|
+
if (session.credentials === undefined) {
|
|
96
|
+
throw new GraphQLApiError(NO_VALID_CREDENTIALS);
|
|
97
|
+
}
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case 'oidc':
|
|
101
|
+
case 'userPool': {
|
|
102
|
+
let token: string | undefined;
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
token = (
|
|
106
|
+
await amplify.Auth.fetchAuthSession()
|
|
107
|
+
).tokens?.accessToken.toString();
|
|
108
|
+
} catch (e) {
|
|
109
|
+
// fetchAuthSession failed
|
|
110
|
+
throw new GraphQLApiError({
|
|
111
|
+
...NO_SIGNED_IN_USER,
|
|
112
|
+
underlyingError: e,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// `fetchAuthSession()` succeeded but didn't return `tokens`.
|
|
117
|
+
// This may happen when unauthenticated access is enabled and there is
|
|
118
|
+
// no user signed in.
|
|
119
|
+
if (!token) {
|
|
120
|
+
throw new GraphQLApiError(NO_VALID_AUTH_TOKEN);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
headers = {
|
|
124
|
+
Authorization: token,
|
|
125
|
+
};
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case 'lambda':
|
|
129
|
+
if (
|
|
130
|
+
typeof additionalHeaders === 'object' &&
|
|
131
|
+
!additionalHeaders.Authorization
|
|
132
|
+
) {
|
|
133
|
+
throw new GraphQLApiError(NO_AUTH_TOKEN_HEADER);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
headers = {
|
|
137
|
+
Authorization: additionalHeaders.Authorization,
|
|
138
|
+
};
|
|
139
|
+
break;
|
|
140
|
+
case 'none':
|
|
141
|
+
break;
|
|
142
|
+
default:
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return headers;
|
|
147
|
+
}
|
|
148
|
+
|
|
68
149
|
/**
|
|
69
150
|
* to get the operation type
|
|
70
151
|
* @param operation
|
|
@@ -171,7 +252,6 @@ export class InternalGraphQLAPIClass {
|
|
|
171
252
|
authToken?: string,
|
|
172
253
|
): Promise<GraphQLResult<T>> {
|
|
173
254
|
const {
|
|
174
|
-
apiKey,
|
|
175
255
|
region,
|
|
176
256
|
endpoint: appSyncGraphqlEndpoint,
|
|
177
257
|
customEndpoint,
|
|
@@ -223,22 +303,29 @@ export class InternalGraphQLAPIClass {
|
|
|
223
303
|
};
|
|
224
304
|
}
|
|
225
305
|
|
|
226
|
-
|
|
227
|
-
amplify,
|
|
228
|
-
authMode,
|
|
229
|
-
apiKey,
|
|
230
|
-
additionalCustomHeaders,
|
|
231
|
-
);
|
|
232
|
-
|
|
306
|
+
// TODO: Figure what we need to do to remove `!`'s.
|
|
233
307
|
const headers = {
|
|
234
|
-
...(!customEndpoint &&
|
|
308
|
+
...(!customEndpoint &&
|
|
309
|
+
(await this._headerBasedAuth(
|
|
310
|
+
amplify,
|
|
311
|
+
authMode!,
|
|
312
|
+
additionalCustomHeaders,
|
|
313
|
+
))),
|
|
235
314
|
/**
|
|
236
315
|
* Custom endpoint headers.
|
|
237
316
|
* If there is both a custom endpoint and custom region present, we get the headers.
|
|
238
317
|
* If there is a custom endpoint but no region, we return an empty object.
|
|
239
318
|
* If neither are present, we return an empty object.
|
|
240
319
|
*/
|
|
241
|
-
...((customEndpoint &&
|
|
320
|
+
...((customEndpoint &&
|
|
321
|
+
(customEndpointRegion
|
|
322
|
+
? await this._headerBasedAuth(
|
|
323
|
+
amplify,
|
|
324
|
+
authMode!,
|
|
325
|
+
additionalCustomHeaders,
|
|
326
|
+
)
|
|
327
|
+
: {})) ||
|
|
328
|
+
{}),
|
|
242
329
|
// Custom headers included in Amplify configuration options:
|
|
243
330
|
...(customHeaders &&
|
|
244
331
|
(await customHeaders({
|
|
@@ -291,9 +378,9 @@ export class InternalGraphQLAPIClass {
|
|
|
291
378
|
let response: any;
|
|
292
379
|
|
|
293
380
|
try {
|
|
294
|
-
//
|
|
295
|
-
//
|
|
296
|
-
//
|
|
381
|
+
// See the inline doc of the REST `post()` API for possible errors to be thrown.
|
|
382
|
+
// As these errors are catastrophic they should be caught and handled by GraphQL
|
|
383
|
+
// API consumers.
|
|
297
384
|
const { body: responseBody } = await this._api.post(amplify, {
|
|
298
385
|
url: new AmplifyUrl(endpoint),
|
|
299
386
|
options: {
|
|
@@ -17,7 +17,18 @@ interface LinkedConnectionStates {
|
|
|
17
17
|
keepAliveState: LinkedHealthState;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
export const CONNECTION_CHANGE
|
|
20
|
+
export const CONNECTION_CHANGE: {
|
|
21
|
+
[key in
|
|
22
|
+
| 'KEEP_ALIVE_MISSED'
|
|
23
|
+
| 'KEEP_ALIVE'
|
|
24
|
+
| 'CONNECTION_ESTABLISHED'
|
|
25
|
+
| 'CONNECTION_FAILED'
|
|
26
|
+
| 'CLOSING_CONNECTION'
|
|
27
|
+
| 'OPENING_CONNECTION'
|
|
28
|
+
| 'CLOSED'
|
|
29
|
+
| 'ONLINE'
|
|
30
|
+
| 'OFFLINE']: Partial<LinkedConnectionStates>;
|
|
31
|
+
} = {
|
|
21
32
|
KEEP_ALIVE_MISSED: { keepAliveState: 'unhealthy' },
|
|
22
33
|
KEEP_ALIVE: { keepAliveState: 'healthy' },
|
|
23
34
|
CONNECTION_ESTABLISHED: { connectionState: 'connected' },
|
|
@@ -33,7 +44,7 @@ export const CONNECTION_CHANGE = {
|
|
|
33
44
|
CLOSED: { connectionState: 'disconnected' },
|
|
34
45
|
ONLINE: { networkState: 'connected' },
|
|
35
46
|
OFFLINE: { networkState: 'disconnected' },
|
|
36
|
-
}
|
|
47
|
+
};
|
|
37
48
|
|
|
38
49
|
export class ConnectionStateMonitor {
|
|
39
50
|
/**
|
|
@@ -11,7 +11,7 @@ export enum ReconnectEvent {
|
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Captures the reconnect event logic used to determine when to reconnect to PubSub providers.
|
|
14
|
-
*
|
|
14
|
+
* Reconnnect attempts are delayed by 5 seconds to let the interface settle.
|
|
15
15
|
* Attempting to reconnect only once creates unrecoverable states when the network state isn't
|
|
16
16
|
* supported by the browser, so this keeps retrying every minute until halted.
|
|
17
17
|
*/
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.AppSyncEventProvider = void 0;
|
|
5
|
-
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
6
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
7
|
-
const utils_1 = require("@aws-amplify/core/internals/utils");
|
|
8
|
-
const constants_1 = require("../constants");
|
|
9
|
-
const AWSWebSocketProvider_1 = require("../AWSWebSocketProvider");
|
|
10
|
-
const authHeaders_1 = require("../AWSWebSocketProvider/authHeaders");
|
|
11
|
-
const PROVIDER_NAME = 'AWSAppSyncEventsProvider';
|
|
12
|
-
const WS_PROTOCOL_NAME = 'aws-appsync-event-ws';
|
|
13
|
-
class AWSAppSyncEventProvider extends AWSWebSocketProvider_1.AWSWebSocketProvider {
|
|
14
|
-
constructor() {
|
|
15
|
-
super({ providerName: PROVIDER_NAME, wsProtocolName: WS_PROTOCOL_NAME });
|
|
16
|
-
}
|
|
17
|
-
getProviderName() {
|
|
18
|
-
return PROVIDER_NAME;
|
|
19
|
-
}
|
|
20
|
-
async connect(options) {
|
|
21
|
-
super.connect(options);
|
|
22
|
-
}
|
|
23
|
-
subscribe(options, customUserAgentDetails) {
|
|
24
|
-
return super.subscribe(options, customUserAgentDetails).pipe();
|
|
25
|
-
}
|
|
26
|
-
async publish(options, customUserAgentDetails) {
|
|
27
|
-
super.publish(options, customUserAgentDetails);
|
|
28
|
-
}
|
|
29
|
-
async _prepareSubscriptionPayload({ options, subscriptionId, customUserAgentDetails, additionalCustomHeaders, libraryConfigHeaders, publish, }) {
|
|
30
|
-
const { appSyncGraphqlEndpoint, authenticationType, query, variables, apiKey, region, } = options;
|
|
31
|
-
// This will be needed for WS publish
|
|
32
|
-
// const data = {
|
|
33
|
-
// events: [variables],
|
|
34
|
-
// };
|
|
35
|
-
const serializedData = JSON.stringify([variables]);
|
|
36
|
-
const headers = {
|
|
37
|
-
...(await (0, authHeaders_1.awsRealTimeHeaderBasedAuth)({
|
|
38
|
-
apiKey,
|
|
39
|
-
appSyncGraphqlEndpoint,
|
|
40
|
-
authenticationType,
|
|
41
|
-
payload: serializedData,
|
|
42
|
-
canonicalUri: '',
|
|
43
|
-
region,
|
|
44
|
-
additionalCustomHeaders,
|
|
45
|
-
})),
|
|
46
|
-
...libraryConfigHeaders,
|
|
47
|
-
...additionalCustomHeaders,
|
|
48
|
-
[utils_1.USER_AGENT_HEADER]: (0, utils_1.getAmplifyUserAgent)(customUserAgentDetails),
|
|
49
|
-
};
|
|
50
|
-
// Commented out code will be needed for WS publish
|
|
51
|
-
const subscriptionMessage = {
|
|
52
|
-
id: subscriptionId,
|
|
53
|
-
channel: query,
|
|
54
|
-
// events: [JSON.stringify(variables)],
|
|
55
|
-
authorization: {
|
|
56
|
-
...headers,
|
|
57
|
-
},
|
|
58
|
-
// payload: {
|
|
59
|
-
// events: serializedData,
|
|
60
|
-
// extensions: {
|
|
61
|
-
// authorization: {
|
|
62
|
-
// ...headers,
|
|
63
|
-
// },
|
|
64
|
-
// },
|
|
65
|
-
// },
|
|
66
|
-
type: publish
|
|
67
|
-
? constants_1.MESSAGE_TYPES.EVENT_PUBLISH
|
|
68
|
-
: constants_1.MESSAGE_TYPES.EVENT_SUBSCRIBE,
|
|
69
|
-
};
|
|
70
|
-
const serializedSubscriptionMessage = JSON.stringify(subscriptionMessage);
|
|
71
|
-
return serializedSubscriptionMessage;
|
|
72
|
-
}
|
|
73
|
-
_handleSubscriptionData(message) {
|
|
74
|
-
this.logger.debug(`subscription message from AWS AppSync Events: ${message.data}`);
|
|
75
|
-
const { id = '', event: payload, type, } = JSON.parse(String(message.data));
|
|
76
|
-
const { observer = null, query = '', variables = {}, } = this.subscriptionObserverMap.get(id) || {};
|
|
77
|
-
this.logger.debug({ id, observer, query, variables });
|
|
78
|
-
if (type === constants_1.MESSAGE_TYPES.DATA && payload) {
|
|
79
|
-
const deserializedEvent = JSON.parse(payload);
|
|
80
|
-
if (observer) {
|
|
81
|
-
observer.next(deserializedEvent);
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
this.logger.debug(`observer not found for id: ${id}`);
|
|
85
|
-
}
|
|
86
|
-
return [true, { id, type, payload: deserializedEvent }];
|
|
87
|
-
}
|
|
88
|
-
return [false, { id, type, payload }];
|
|
89
|
-
}
|
|
90
|
-
_unsubscribeMessage(subscriptionId) {
|
|
91
|
-
return {
|
|
92
|
-
id: subscriptionId,
|
|
93
|
-
type: constants_1.MESSAGE_TYPES.EVENT_STOP,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
exports.AppSyncEventProvider = new AWSAppSyncEventProvider();
|
|
98
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/Providers/AWSAppSyncEventsProvider/index.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AppSyncEventProvider = void 0;\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nconst utils_1 = require(\"@aws-amplify/core/internals/utils\");\nconst constants_1 = require(\"../constants\");\nconst AWSWebSocketProvider_1 = require(\"../AWSWebSocketProvider\");\nconst authHeaders_1 = require(\"../AWSWebSocketProvider/authHeaders\");\nconst PROVIDER_NAME = 'AWSAppSyncEventsProvider';\nconst WS_PROTOCOL_NAME = 'aws-appsync-event-ws';\nclass AWSAppSyncEventProvider extends AWSWebSocketProvider_1.AWSWebSocketProvider {\n constructor() {\n super({ providerName: PROVIDER_NAME, wsProtocolName: WS_PROTOCOL_NAME });\n }\n getProviderName() {\n return PROVIDER_NAME;\n }\n async connect(options) {\n super.connect(options);\n }\n subscribe(options, customUserAgentDetails) {\n return super.subscribe(options, customUserAgentDetails).pipe();\n }\n async publish(options, customUserAgentDetails) {\n super.publish(options, customUserAgentDetails);\n }\n async _prepareSubscriptionPayload({ options, subscriptionId, customUserAgentDetails, additionalCustomHeaders, libraryConfigHeaders, publish, }) {\n const { appSyncGraphqlEndpoint, authenticationType, query, variables, apiKey, region, } = options;\n // This will be needed for WS publish\n // const data = {\n // \tevents: [variables],\n // };\n const serializedData = JSON.stringify([variables]);\n const headers = {\n ...(await (0, authHeaders_1.awsRealTimeHeaderBasedAuth)({\n apiKey,\n appSyncGraphqlEndpoint,\n authenticationType,\n payload: serializedData,\n canonicalUri: '',\n region,\n additionalCustomHeaders,\n })),\n ...libraryConfigHeaders,\n ...additionalCustomHeaders,\n [utils_1.USER_AGENT_HEADER]: (0, utils_1.getAmplifyUserAgent)(customUserAgentDetails),\n };\n // Commented out code will be needed for WS publish\n const subscriptionMessage = {\n id: subscriptionId,\n channel: query,\n // events: [JSON.stringify(variables)],\n authorization: {\n ...headers,\n },\n // payload: {\n // \tevents: serializedData,\n // \textensions: {\n // \t\tauthorization: {\n // \t\t\t...headers,\n // \t\t},\n // \t},\n // },\n type: publish\n ? constants_1.MESSAGE_TYPES.EVENT_PUBLISH\n : constants_1.MESSAGE_TYPES.EVENT_SUBSCRIBE,\n };\n const serializedSubscriptionMessage = JSON.stringify(subscriptionMessage);\n return serializedSubscriptionMessage;\n }\n _handleSubscriptionData(message) {\n this.logger.debug(`subscription message from AWS AppSync Events: ${message.data}`);\n const { id = '', event: payload, type, } = JSON.parse(String(message.data));\n const { observer = null, query = '', variables = {}, } = this.subscriptionObserverMap.get(id) || {};\n this.logger.debug({ id, observer, query, variables });\n if (type === constants_1.MESSAGE_TYPES.DATA && payload) {\n const deserializedEvent = JSON.parse(payload);\n if (observer) {\n observer.next(deserializedEvent);\n }\n else {\n this.logger.debug(`observer not found for id: ${id}`);\n }\n return [true, { id, type, payload: deserializedEvent }];\n }\n return [false, { id, type, payload }];\n }\n _unsubscribeMessage(subscriptionId) {\n return {\n id: subscriptionId,\n type: constants_1.MESSAGE_TYPES.EVENT_STOP,\n };\n }\n}\nexports.AppSyncEventProvider = new AWSAppSyncEventProvider();\n"],"names":[],"mappings":"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"}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
4
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.additionalHeadersFromOptions = exports.realtimeUrlWithQueryString = exports.queryParamsFromCustomHeaders = exports.getRealtimeEndpointUrl = exports.isCustomDomain = void 0;
|
|
7
|
-
const utils_1 = require("@aws-amplify/core/internals/utils");
|
|
8
|
-
const protocol = 'wss://';
|
|
9
|
-
const standardDomainPattern = /^https:\/\/\w{26}\.appsync-api\.\w{2}(?:(?:-\w{2,})+)-\d\.amazonaws.com(?:\.cn)?\/graphql$/i;
|
|
10
|
-
const eventDomainPattern = /^https:\/\/\w{26}\.ddpg-api\.\w{2}(?:(?:-\w{2,})+)-\d\.amazonaws.com(?:\.cn)?\/event$/i;
|
|
11
|
-
const customDomainPath = '/realtime';
|
|
12
|
-
const isCustomDomain = (url) => {
|
|
13
|
-
return url.match(standardDomainPattern) === null;
|
|
14
|
-
};
|
|
15
|
-
exports.isCustomDomain = isCustomDomain;
|
|
16
|
-
const isEventDomain = (url) => url.match(eventDomainPattern) !== null;
|
|
17
|
-
const getRealtimeEndpointUrl = (appSyncGraphqlEndpoint) => {
|
|
18
|
-
let realtimeEndpoint = appSyncGraphqlEndpoint ?? '';
|
|
19
|
-
if (isEventDomain(realtimeEndpoint)) {
|
|
20
|
-
realtimeEndpoint = realtimeEndpoint
|
|
21
|
-
.concat(customDomainPath)
|
|
22
|
-
.replace('ddpg-api', 'grt-gamma');
|
|
23
|
-
}
|
|
24
|
-
else if ((0, exports.isCustomDomain)(realtimeEndpoint)) {
|
|
25
|
-
realtimeEndpoint = realtimeEndpoint.concat(customDomainPath);
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
realtimeEndpoint = realtimeEndpoint
|
|
29
|
-
.replace('appsync-api', 'appsync-realtime-api')
|
|
30
|
-
.replace('gogi-beta', 'grt-beta')
|
|
31
|
-
.replace('ddpg-api', 'grt-gamma');
|
|
32
|
-
}
|
|
33
|
-
realtimeEndpoint = realtimeEndpoint
|
|
34
|
-
.replace('https://', protocol)
|
|
35
|
-
.replace('http://', protocol);
|
|
36
|
-
return new utils_1.AmplifyUrl(realtimeEndpoint);
|
|
37
|
-
};
|
|
38
|
-
exports.getRealtimeEndpointUrl = getRealtimeEndpointUrl;
|
|
39
|
-
/**
|
|
40
|
-
* Strips out `Authorization` header if present
|
|
41
|
-
*/
|
|
42
|
-
const extractNonAuthHeaders = (headers) => {
|
|
43
|
-
if (!headers) {
|
|
44
|
-
return {};
|
|
45
|
-
}
|
|
46
|
-
if ('Authorization' in headers) {
|
|
47
|
-
const { Authorization: _, ...nonAuthHeaders } = headers;
|
|
48
|
-
return nonAuthHeaders;
|
|
49
|
-
}
|
|
50
|
-
return headers;
|
|
51
|
-
};
|
|
52
|
-
/**
|
|
53
|
-
*
|
|
54
|
-
* @param headers - http headers
|
|
55
|
-
* @returns uri-encoded query parameters derived from custom headers
|
|
56
|
-
*/
|
|
57
|
-
const queryParamsFromCustomHeaders = (headers) => {
|
|
58
|
-
const nonAuthHeaders = extractNonAuthHeaders(headers);
|
|
59
|
-
const params = new utils_1.AmplifyUrlSearchParams();
|
|
60
|
-
Object.entries(nonAuthHeaders).forEach(([k, v]) => {
|
|
61
|
-
params.append(k, v);
|
|
62
|
-
});
|
|
63
|
-
return params;
|
|
64
|
-
};
|
|
65
|
-
exports.queryParamsFromCustomHeaders = queryParamsFromCustomHeaders;
|
|
66
|
-
/**
|
|
67
|
-
* Normalizes AppSync realtime endpoint URL
|
|
68
|
-
*
|
|
69
|
-
* @param appSyncGraphqlEndpoint - AppSync endpointUri from config
|
|
70
|
-
* @param urlParams - URLSearchParams
|
|
71
|
-
* @returns fully resolved string realtime endpoint URL
|
|
72
|
-
*/
|
|
73
|
-
const realtimeUrlWithQueryString = (appSyncGraphqlEndpoint, urlParams) => {
|
|
74
|
-
const realtimeEndpointUrl = (0, exports.getRealtimeEndpointUrl)(appSyncGraphqlEndpoint);
|
|
75
|
-
// preserves any query params a customer might manually set in the configuration
|
|
76
|
-
const existingParams = new utils_1.AmplifyUrlSearchParams(realtimeEndpointUrl.search);
|
|
77
|
-
for (const [k, v] of urlParams.entries()) {
|
|
78
|
-
existingParams.append(k, v);
|
|
79
|
-
}
|
|
80
|
-
realtimeEndpointUrl.search = existingParams.toString();
|
|
81
|
-
return realtimeEndpointUrl.toString();
|
|
82
|
-
};
|
|
83
|
-
exports.realtimeUrlWithQueryString = realtimeUrlWithQueryString;
|
|
84
|
-
// TODO: move to separate file?
|
|
85
|
-
const additionalHeadersFromOptions = async (options) => {
|
|
86
|
-
const { appSyncGraphqlEndpoint, query, libraryConfigHeaders = () => ({}), additionalHeaders = {}, authToken, } = options;
|
|
87
|
-
let additionalCustomHeaders = {};
|
|
88
|
-
const _libraryConfigHeaders = await libraryConfigHeaders();
|
|
89
|
-
if (typeof additionalHeaders === 'function') {
|
|
90
|
-
const requestOptions = {
|
|
91
|
-
url: appSyncGraphqlEndpoint || '',
|
|
92
|
-
queryString: query || '',
|
|
93
|
-
};
|
|
94
|
-
additionalCustomHeaders = await additionalHeaders(requestOptions);
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
additionalCustomHeaders = additionalHeaders;
|
|
98
|
-
}
|
|
99
|
-
// if an authorization header is set, have the explicit, operation-level authToken take precedence
|
|
100
|
-
if (authToken) {
|
|
101
|
-
additionalCustomHeaders = {
|
|
102
|
-
...additionalCustomHeaders,
|
|
103
|
-
Authorization: authToken,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
return {
|
|
107
|
-
additionalCustomHeaders,
|
|
108
|
-
libraryConfigHeaders: _libraryConfigHeaders,
|
|
109
|
-
};
|
|
110
|
-
};
|
|
111
|
-
exports.additionalHeadersFromOptions = additionalHeadersFromOptions;
|
|
112
|
-
//# sourceMappingURL=appsyncUrl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"appsyncUrl.js","sources":["../../../../src/Providers/AWSWebSocketProvider/appsyncUrl.ts"],"sourcesContent":["\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.additionalHeadersFromOptions = exports.realtimeUrlWithQueryString = exports.queryParamsFromCustomHeaders = exports.getRealtimeEndpointUrl = exports.isCustomDomain = void 0;\nconst utils_1 = require(\"@aws-amplify/core/internals/utils\");\nconst protocol = 'wss://';\nconst standardDomainPattern = /^https:\\/\\/\\w{26}\\.appsync-api\\.\\w{2}(?:(?:-\\w{2,})+)-\\d\\.amazonaws.com(?:\\.cn)?\\/graphql$/i;\nconst eventDomainPattern = /^https:\\/\\/\\w{26}\\.ddpg-api\\.\\w{2}(?:(?:-\\w{2,})+)-\\d\\.amazonaws.com(?:\\.cn)?\\/event$/i;\nconst customDomainPath = '/realtime';\nconst isCustomDomain = (url) => {\n return url.match(standardDomainPattern) === null;\n};\nexports.isCustomDomain = isCustomDomain;\nconst isEventDomain = (url) => url.match(eventDomainPattern) !== null;\nconst getRealtimeEndpointUrl = (appSyncGraphqlEndpoint) => {\n let realtimeEndpoint = appSyncGraphqlEndpoint ?? '';\n if (isEventDomain(realtimeEndpoint)) {\n realtimeEndpoint = realtimeEndpoint\n .concat(customDomainPath)\n .replace('ddpg-api', 'grt-gamma');\n }\n else if ((0, exports.isCustomDomain)(realtimeEndpoint)) {\n realtimeEndpoint = realtimeEndpoint.concat(customDomainPath);\n }\n else {\n realtimeEndpoint = realtimeEndpoint\n .replace('appsync-api', 'appsync-realtime-api')\n .replace('gogi-beta', 'grt-beta')\n .replace('ddpg-api', 'grt-gamma');\n }\n realtimeEndpoint = realtimeEndpoint\n .replace('https://', protocol)\n .replace('http://', protocol);\n return new utils_1.AmplifyUrl(realtimeEndpoint);\n};\nexports.getRealtimeEndpointUrl = getRealtimeEndpointUrl;\n/**\n * Strips out `Authorization` header if present\n */\nconst extractNonAuthHeaders = (headers) => {\n if (!headers) {\n return {};\n }\n if ('Authorization' in headers) {\n const { Authorization: _, ...nonAuthHeaders } = headers;\n return nonAuthHeaders;\n }\n return headers;\n};\n/**\n *\n * @param headers - http headers\n * @returns uri-encoded query parameters derived from custom headers\n */\nconst queryParamsFromCustomHeaders = (headers) => {\n const nonAuthHeaders = extractNonAuthHeaders(headers);\n const params = new utils_1.AmplifyUrlSearchParams();\n Object.entries(nonAuthHeaders).forEach(([k, v]) => {\n params.append(k, v);\n });\n return params;\n};\nexports.queryParamsFromCustomHeaders = queryParamsFromCustomHeaders;\n/**\n * Normalizes AppSync realtime endpoint URL\n *\n * @param appSyncGraphqlEndpoint - AppSync endpointUri from config\n * @param urlParams - URLSearchParams\n * @returns fully resolved string realtime endpoint URL\n */\nconst realtimeUrlWithQueryString = (appSyncGraphqlEndpoint, urlParams) => {\n const realtimeEndpointUrl = (0, exports.getRealtimeEndpointUrl)(appSyncGraphqlEndpoint);\n // preserves any query params a customer might manually set in the configuration\n const existingParams = new utils_1.AmplifyUrlSearchParams(realtimeEndpointUrl.search);\n for (const [k, v] of urlParams.entries()) {\n existingParams.append(k, v);\n }\n realtimeEndpointUrl.search = existingParams.toString();\n return realtimeEndpointUrl.toString();\n};\nexports.realtimeUrlWithQueryString = realtimeUrlWithQueryString;\n// TODO: move to separate file?\nconst additionalHeadersFromOptions = async (options) => {\n const { appSyncGraphqlEndpoint, query, libraryConfigHeaders = () => ({}), additionalHeaders = {}, authToken, } = options;\n let additionalCustomHeaders = {};\n const _libraryConfigHeaders = await libraryConfigHeaders();\n if (typeof additionalHeaders === 'function') {\n const requestOptions = {\n url: appSyncGraphqlEndpoint || '',\n queryString: query || '',\n };\n additionalCustomHeaders = await additionalHeaders(requestOptions);\n }\n else {\n additionalCustomHeaders = additionalHeaders;\n }\n // if an authorization header is set, have the explicit, operation-level authToken take precedence\n if (authToken) {\n additionalCustomHeaders = {\n ...additionalCustomHeaders,\n Authorization: authToken,\n };\n }\n return {\n additionalCustomHeaders,\n libraryConfigHeaders: _libraryConfigHeaders,\n };\n};\nexports.additionalHeadersFromOptions = additionalHeadersFromOptions;\n"],"names":[],"mappings":"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"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
4
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.awsRealTimeHeaderBasedAuth = void 0;
|
|
7
|
-
const core_1 = require("@aws-amplify/core");
|
|
8
|
-
const aws_client_utils_1 = require("@aws-amplify/core/internals/aws-client-utils");
|
|
9
|
-
const utils_1 = require("@aws-amplify/core/internals/utils");
|
|
10
|
-
const constants_1 = require("../constants");
|
|
11
|
-
const logger = new core_1.ConsoleLogger('AWSAppSyncRealTimeProvider Auth');
|
|
12
|
-
const awsAuthTokenHeader = async ({ host }) => {
|
|
13
|
-
const session = await (0, core_1.fetchAuthSession)();
|
|
14
|
-
return {
|
|
15
|
-
Authorization: session?.tokens?.accessToken?.toString(),
|
|
16
|
-
host,
|
|
17
|
-
};
|
|
18
|
-
};
|
|
19
|
-
const awsRealTimeApiKeyHeader = async ({ apiKey, host, }) => {
|
|
20
|
-
const dt = new Date();
|
|
21
|
-
const dtStr = dt.toISOString().replace(/[:-]|\.\d{3}/g, '');
|
|
22
|
-
return {
|
|
23
|
-
host,
|
|
24
|
-
'x-amz-date': dtStr,
|
|
25
|
-
'x-api-key': apiKey,
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
const awsRealTimeIAMHeader = async ({ payload, canonicalUri, appSyncGraphqlEndpoint, region, }) => {
|
|
29
|
-
const endpointInfo = {
|
|
30
|
-
region,
|
|
31
|
-
service: 'appsync',
|
|
32
|
-
};
|
|
33
|
-
const creds = (await (0, core_1.fetchAuthSession)()).credentials;
|
|
34
|
-
const request = {
|
|
35
|
-
url: `${appSyncGraphqlEndpoint}${canonicalUri}`,
|
|
36
|
-
data: payload,
|
|
37
|
-
method: 'POST',
|
|
38
|
-
headers: { ...constants_1.AWS_APPSYNC_REALTIME_HEADERS },
|
|
39
|
-
};
|
|
40
|
-
const signedParams = (0, aws_client_utils_1.signRequest)({
|
|
41
|
-
headers: request.headers,
|
|
42
|
-
method: request.method,
|
|
43
|
-
url: new utils_1.AmplifyUrl(request.url),
|
|
44
|
-
body: request.data,
|
|
45
|
-
}, {
|
|
46
|
-
credentials: creds,
|
|
47
|
-
signingRegion: endpointInfo.region,
|
|
48
|
-
signingService: endpointInfo.service,
|
|
49
|
-
});
|
|
50
|
-
return signedParams.headers;
|
|
51
|
-
};
|
|
52
|
-
const customAuthHeader = async ({ host, additionalCustomHeaders, }) => {
|
|
53
|
-
/**
|
|
54
|
-
* If `additionalHeaders` was provided to the subscription as a function,
|
|
55
|
-
* the headers that are returned by that function will already have been
|
|
56
|
-
* provided before this function is called.
|
|
57
|
-
*/
|
|
58
|
-
if (!additionalCustomHeaders?.Authorization) {
|
|
59
|
-
throw new Error('No auth token specified');
|
|
60
|
-
}
|
|
61
|
-
return {
|
|
62
|
-
Authorization: additionalCustomHeaders.Authorization,
|
|
63
|
-
host,
|
|
64
|
-
};
|
|
65
|
-
};
|
|
66
|
-
const awsRealTimeHeaderBasedAuth = async ({ apiKey, authenticationType, canonicalUri, appSyncGraphqlEndpoint, region, additionalCustomHeaders, payload, }) => {
|
|
67
|
-
const headerHandler = {
|
|
68
|
-
apiKey: awsRealTimeApiKeyHeader,
|
|
69
|
-
iam: awsRealTimeIAMHeader,
|
|
70
|
-
oidc: awsAuthTokenHeader,
|
|
71
|
-
userPool: awsAuthTokenHeader,
|
|
72
|
-
lambda: customAuthHeader,
|
|
73
|
-
none: customAuthHeader,
|
|
74
|
-
};
|
|
75
|
-
if (!authenticationType || !headerHandler[authenticationType]) {
|
|
76
|
-
logger.debug(`Authentication type ${authenticationType} not supported`);
|
|
77
|
-
return undefined;
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
const handler = headerHandler[authenticationType];
|
|
81
|
-
const host = appSyncGraphqlEndpoint
|
|
82
|
-
? new utils_1.AmplifyUrl(appSyncGraphqlEndpoint).host
|
|
83
|
-
: undefined;
|
|
84
|
-
const resolvedApiKey = authenticationType === 'apiKey' ? apiKey : undefined;
|
|
85
|
-
logger.debug(`Authenticating with ${JSON.stringify(authenticationType)}`);
|
|
86
|
-
const result = await handler({
|
|
87
|
-
payload,
|
|
88
|
-
canonicalUri,
|
|
89
|
-
appSyncGraphqlEndpoint,
|
|
90
|
-
apiKey: resolvedApiKey,
|
|
91
|
-
region,
|
|
92
|
-
host,
|
|
93
|
-
additionalCustomHeaders,
|
|
94
|
-
});
|
|
95
|
-
return result;
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
exports.awsRealTimeHeaderBasedAuth = awsRealTimeHeaderBasedAuth;
|
|
99
|
-
//# sourceMappingURL=authHeaders.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authHeaders.js","sources":["../../../../src/Providers/AWSWebSocketProvider/authHeaders.ts"],"sourcesContent":["\"use strict\";\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.awsRealTimeHeaderBasedAuth = void 0;\nconst core_1 = require(\"@aws-amplify/core\");\nconst aws_client_utils_1 = require(\"@aws-amplify/core/internals/aws-client-utils\");\nconst utils_1 = require(\"@aws-amplify/core/internals/utils\");\nconst constants_1 = require(\"../constants\");\nconst logger = new core_1.ConsoleLogger('AWSAppSyncRealTimeProvider Auth');\nconst awsAuthTokenHeader = async ({ host }) => {\n const session = await (0, core_1.fetchAuthSession)();\n return {\n Authorization: session?.tokens?.accessToken?.toString(),\n host,\n };\n};\nconst awsRealTimeApiKeyHeader = async ({ apiKey, host, }) => {\n const dt = new Date();\n const dtStr = dt.toISOString().replace(/[:-]|\\.\\d{3}/g, '');\n return {\n host,\n 'x-amz-date': dtStr,\n 'x-api-key': apiKey,\n };\n};\nconst awsRealTimeIAMHeader = async ({ payload, canonicalUri, appSyncGraphqlEndpoint, region, }) => {\n const endpointInfo = {\n region,\n service: 'appsync',\n };\n const creds = (await (0, core_1.fetchAuthSession)()).credentials;\n const request = {\n url: `${appSyncGraphqlEndpoint}${canonicalUri}`,\n data: payload,\n method: 'POST',\n headers: { ...constants_1.AWS_APPSYNC_REALTIME_HEADERS },\n };\n const signedParams = (0, aws_client_utils_1.signRequest)({\n headers: request.headers,\n method: request.method,\n url: new utils_1.AmplifyUrl(request.url),\n body: request.data,\n }, {\n credentials: creds,\n signingRegion: endpointInfo.region,\n signingService: endpointInfo.service,\n });\n return signedParams.headers;\n};\nconst customAuthHeader = async ({ host, additionalCustomHeaders, }) => {\n /**\n * If `additionalHeaders` was provided to the subscription as a function,\n * the headers that are returned by that function will already have been\n * provided before this function is called.\n */\n if (!additionalCustomHeaders?.Authorization) {\n throw new Error('No auth token specified');\n }\n return {\n Authorization: additionalCustomHeaders.Authorization,\n host,\n };\n};\nconst awsRealTimeHeaderBasedAuth = async ({ apiKey, authenticationType, canonicalUri, appSyncGraphqlEndpoint, region, additionalCustomHeaders, payload, }) => {\n const headerHandler = {\n apiKey: awsRealTimeApiKeyHeader,\n iam: awsRealTimeIAMHeader,\n oidc: awsAuthTokenHeader,\n userPool: awsAuthTokenHeader,\n lambda: customAuthHeader,\n none: customAuthHeader,\n };\n if (!authenticationType || !headerHandler[authenticationType]) {\n logger.debug(`Authentication type ${authenticationType} not supported`);\n return undefined;\n }\n else {\n const handler = headerHandler[authenticationType];\n const host = appSyncGraphqlEndpoint\n ? new utils_1.AmplifyUrl(appSyncGraphqlEndpoint).host\n : undefined;\n const resolvedApiKey = authenticationType === 'apiKey' ? apiKey : undefined;\n logger.debug(`Authenticating with ${JSON.stringify(authenticationType)}`);\n const result = await handler({\n payload,\n canonicalUri,\n appSyncGraphqlEndpoint,\n apiKey: resolvedApiKey,\n region,\n host,\n additionalCustomHeaders,\n });\n return result;\n }\n};\nexports.awsRealTimeHeaderBasedAuth = awsRealTimeHeaderBasedAuth;\n"],"names":[],"mappings":"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"}
|