@aws-amplify/api-graphql 0.0.0-unstable-1ca644b-20260128091132
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/README.md +3 -0
- package/dist/cjs/GraphQLAPI.js +66 -0
- package/dist/cjs/GraphQLAPI.js.map +1 -0
- package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js +117 -0
- package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js.map +1 -0
- package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js +96 -0
- package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js.map +1 -0
- package/dist/cjs/Providers/AWSWebSocketProvider/appsyncUrl.js +113 -0
- package/dist/cjs/Providers/AWSWebSocketProvider/appsyncUrl.js.map +1 -0
- package/dist/cjs/Providers/AWSWebSocketProvider/authHeaders.js +99 -0
- package/dist/cjs/Providers/AWSWebSocketProvider/authHeaders.js.map +1 -0
- package/dist/cjs/Providers/AWSWebSocketProvider/index.js +693 -0
- package/dist/cjs/Providers/AWSWebSocketProvider/index.js.map +1 -0
- package/dist/cjs/Providers/constants.js +149 -0
- package/dist/cjs/Providers/constants.js.map +1 -0
- package/dist/cjs/index.js +18 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/internals/InternalGraphQLAPI.js +269 -0
- package/dist/cjs/internals/InternalGraphQLAPI.js.map +1 -0
- package/dist/cjs/internals/events/appsyncRequest.js +96 -0
- package/dist/cjs/internals/events/appsyncRequest.js.map +1 -0
- package/dist/cjs/internals/events/index.js +142 -0
- package/dist/cjs/internals/events/index.js.map +1 -0
- package/dist/cjs/internals/events/types.js +6 -0
- package/dist/cjs/internals/events/types.js.map +1 -0
- package/dist/cjs/internals/events/utils.js +57 -0
- package/dist/cjs/internals/events/utils.js.map +1 -0
- package/dist/cjs/internals/generateClient.js +86 -0
- package/dist/cjs/internals/generateClient.js.map +1 -0
- package/dist/cjs/internals/graphqlAuth.js +63 -0
- package/dist/cjs/internals/graphqlAuth.js.map +1 -0
- package/dist/cjs/internals/graphqlRequest.js +19 -0
- package/dist/cjs/internals/graphqlRequest.js.map +1 -0
- package/dist/cjs/internals/index.js +16 -0
- package/dist/cjs/internals/index.js.map +1 -0
- package/dist/cjs/internals/server/generateClientWithAmplifyInstance.js +48 -0
- package/dist/cjs/internals/server/generateClientWithAmplifyInstance.js.map +1 -0
- package/dist/cjs/internals/server/index.js +9 -0
- package/dist/cjs/internals/server/index.js.map +1 -0
- package/dist/cjs/internals/types.js +4 -0
- package/dist/cjs/internals/types.js.map +1 -0
- package/dist/cjs/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.js +10 -0
- package/dist/cjs/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.js.map +1 -0
- package/dist/cjs/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.js +10 -0
- package/dist/cjs/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.js.map +1 -0
- package/dist/cjs/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.js +14 -0
- package/dist/cjs/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.js.map +1 -0
- package/dist/cjs/internals/v6.js +155 -0
- package/dist/cjs/internals/v6.js.map +1 -0
- package/dist/cjs/server/generateClient.js +42 -0
- package/dist/cjs/server/generateClient.js.map +1 -0
- package/dist/cjs/server/index.js +9 -0
- package/dist/cjs/server/index.js.map +1 -0
- package/dist/cjs/types/PubSub.js +49 -0
- package/dist/cjs/types/PubSub.js.map +1 -0
- package/dist/cjs/types/index.js +34 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/utils/ConnectionStateMonitor.js +134 -0
- package/dist/cjs/utils/ConnectionStateMonitor.js.map +1 -0
- package/dist/cjs/utils/ReachabilityMonitor/index.js +10 -0
- package/dist/cjs/utils/ReachabilityMonitor/index.js.map +1 -0
- package/dist/cjs/utils/ReachabilityMonitor/index.native.js +12 -0
- package/dist/cjs/utils/ReachabilityMonitor/index.native.js.map +1 -0
- package/dist/cjs/utils/ReconnectionMonitor.js +71 -0
- package/dist/cjs/utils/ReconnectionMonitor.js.map +1 -0
- package/dist/cjs/utils/errors/GraphQLApiError.js +21 -0
- package/dist/cjs/utils/errors/GraphQLApiError.js.map +1 -0
- package/dist/cjs/utils/errors/assertValidationError.js +18 -0
- package/dist/cjs/utils/errors/assertValidationError.js.map +1 -0
- package/dist/cjs/utils/errors/constants.js +47 -0
- package/dist/cjs/utils/errors/constants.js.map +1 -0
- package/dist/cjs/utils/errors/createGraphQLResultWithError.js +15 -0
- package/dist/cjs/utils/errors/createGraphQLResultWithError.js.map +1 -0
- package/dist/cjs/utils/errors/index.js +16 -0
- package/dist/cjs/utils/errors/index.js.map +1 -0
- package/dist/cjs/utils/errors/repackageAuthError.js +38 -0
- package/dist/cjs/utils/errors/repackageAuthError.js.map +1 -0
- package/dist/cjs/utils/errors/validation.js +28 -0
- package/dist/cjs/utils/errors/validation.js.map +1 -0
- package/dist/cjs/utils/index.js +11 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/resolveConfig.js +32 -0
- package/dist/cjs/utils/resolveConfig.js.map +1 -0
- package/dist/cjs/utils/resolveLibraryOptions.js +16 -0
- package/dist/cjs/utils/resolveLibraryOptions.js.map +1 -0
- package/dist/esm/GraphQLAPI.d.ts +37 -0
- package/dist/esm/GraphQLAPI.mjs +63 -0
- package/dist/esm/GraphQLAPI.mjs.map +1 -0
- package/dist/esm/Providers/AWSAppSyncEventsProvider/index.d.ts +49 -0
- package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs +115 -0
- package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs.map +1 -0
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.d.ts +47 -0
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs +94 -0
- package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs.map +1 -0
- package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.d.ts +21 -0
- package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.mjs +107 -0
- package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.mjs.map +1 -0
- package/dist/esm/Providers/AWSWebSocketProvider/authHeaders.d.ts +8 -0
- package/dist/esm/Providers/AWSWebSocketProvider/authHeaders.mjs +97 -0
- package/dist/esm/Providers/AWSWebSocketProvider/authHeaders.mjs.map +1 -0
- package/dist/esm/Providers/AWSWebSocketProvider/index.d.ts +99 -0
- package/dist/esm/Providers/AWSWebSocketProvider/index.mjs +691 -0
- package/dist/esm/Providers/AWSWebSocketProvider/index.mjs.map +1 -0
- package/dist/esm/Providers/constants.d.ts +135 -0
- package/dist/esm/Providers/constants.mjs +147 -0
- package/dist/esm/Providers/constants.mjs.map +1 -0
- package/dist/esm/index.d.ts +6 -0
- package/dist/esm/index.mjs +7 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/internals/InternalGraphQLAPI.d.ts +45 -0
- package/dist/esm/internals/InternalGraphQLAPI.mjs +270 -0
- package/dist/esm/internals/InternalGraphQLAPI.mjs.map +1 -0
- package/dist/esm/internals/events/appsyncRequest.d.ts +14 -0
- package/dist/esm/internals/events/appsyncRequest.mjs +96 -0
- package/dist/esm/internals/events/appsyncRequest.mjs.map +1 -0
- package/dist/esm/internals/events/index.d.ts +58 -0
- package/dist/esm/internals/events/index.mjs +139 -0
- package/dist/esm/internals/events/index.mjs.map +1 -0
- package/dist/esm/internals/events/types.d.ts +93 -0
- package/dist/esm/internals/events/types.mjs +2 -0
- package/dist/esm/internals/events/types.mjs.map +1 -0
- package/dist/esm/internals/events/utils.d.ts +16 -0
- package/dist/esm/internals/events/utils.mjs +53 -0
- package/dist/esm/internals/events/utils.mjs.map +1 -0
- package/dist/esm/internals/generateClient.d.ts +12 -0
- package/dist/esm/internals/generateClient.mjs +85 -0
- package/dist/esm/internals/generateClient.mjs.map +1 -0
- package/dist/esm/internals/graphqlAuth.d.ts +3 -0
- package/dist/esm/internals/graphqlAuth.mjs +64 -0
- package/dist/esm/internals/graphqlAuth.mjs.map +1 -0
- package/dist/esm/internals/graphqlRequest.d.ts +3 -0
- package/dist/esm/internals/graphqlRequest.mjs +18 -0
- package/dist/esm/internals/graphqlRequest.mjs.map +1 -0
- package/dist/esm/internals/index.d.ts +4 -0
- package/dist/esm/internals/index.mjs +4 -0
- package/dist/esm/internals/index.mjs.map +1 -0
- package/dist/esm/internals/server/generateClientWithAmplifyInstance.d.ts +13 -0
- package/dist/esm/internals/server/generateClientWithAmplifyInstance.mjs +61 -0
- package/dist/esm/internals/server/generateClientWithAmplifyInstance.mjs.map +1 -0
- package/dist/esm/internals/server/index.d.ts +1 -0
- package/dist/esm/internals/server/index.mjs +2 -0
- package/dist/esm/internals/server/index.mjs.map +1 -0
- package/dist/esm/internals/types.d.ts +34 -0
- package/dist/esm/internals/types.mjs +2 -0
- package/dist/esm/internals/types.mjs.map +1 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.d.ts +2 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.mjs +8 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.mjs.map +1 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.d.ts +8 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.mjs +8 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.mjs.map +1 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.d.ts +2 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.mjs +12 -0
- package/dist/esm/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.mjs.map +1 -0
- package/dist/esm/internals/v6.d.ts +100 -0
- package/dist/esm/internals/v6.mjs +152 -0
- package/dist/esm/internals/v6.mjs.map +1 -0
- package/dist/esm/server/generateClient.d.ts +21 -0
- package/dist/esm/server/generateClient.mjs +41 -0
- package/dist/esm/server/generateClient.mjs.map +1 -0
- package/dist/esm/server/index.d.ts +1 -0
- package/dist/esm/server/index.mjs +2 -0
- package/dist/esm/server/index.mjs.map +1 -0
- package/dist/esm/types/PubSub.d.ts +27 -0
- package/dist/esm/types/PubSub.mjs +47 -0
- package/dist/esm/types/PubSub.mjs.map +1 -0
- package/dist/esm/types/index.d.ts +369 -0
- package/dist/esm/types/index.mjs +30 -0
- package/dist/esm/types/index.mjs.map +1 -0
- package/dist/esm/utils/ConnectionStateMonitor.d.ts +69 -0
- package/dist/esm/utils/ConnectionStateMonitor.mjs +132 -0
- package/dist/esm/utils/ConnectionStateMonitor.mjs.map +1 -0
- package/dist/esm/utils/ReachabilityMonitor/index.d.ts +1 -0
- package/dist/esm/utils/ReachabilityMonitor/index.mjs +8 -0
- package/dist/esm/utils/ReachabilityMonitor/index.mjs.map +1 -0
- package/dist/esm/utils/ReachabilityMonitor/index.native.d.ts +1 -0
- package/dist/esm/utils/ReachabilityMonitor/index.native.mjs +9 -0
- package/dist/esm/utils/ReachabilityMonitor/index.native.mjs.map +1 -0
- package/dist/esm/utils/ReconnectionMonitor.d.ts +29 -0
- package/dist/esm/utils/ReconnectionMonitor.mjs +69 -0
- package/dist/esm/utils/ReconnectionMonitor.mjs.map +1 -0
- package/dist/esm/utils/errors/GraphQLApiError.d.ts +7 -0
- package/dist/esm/utils/errors/GraphQLApiError.mjs +19 -0
- package/dist/esm/utils/errors/GraphQLApiError.mjs.map +1 -0
- package/dist/esm/utils/errors/assertValidationError.d.ts +5 -0
- package/dist/esm/utils/errors/assertValidationError.mjs +17 -0
- package/dist/esm/utils/errors/assertValidationError.mjs.map +1 -0
- package/dist/esm/utils/errors/constants.d.ts +7 -0
- package/dist/esm/utils/errors/constants.mjs +46 -0
- package/dist/esm/utils/errors/constants.mjs.map +1 -0
- package/dist/esm/utils/errors/createGraphQLResultWithError.d.ts +2 -0
- package/dist/esm/utils/errors/createGraphQLResultWithError.mjs +13 -0
- package/dist/esm/utils/errors/createGraphQLResultWithError.mjs.map +1 -0
- package/dist/esm/utils/errors/index.d.ts +4 -0
- package/dist/esm/utils/errors/index.mjs +5 -0
- package/dist/esm/utils/errors/index.mjs.map +1 -0
- package/dist/esm/utils/errors/repackageAuthError.d.ts +7 -0
- package/dist/esm/utils/errors/repackageAuthError.mjs +36 -0
- package/dist/esm/utils/errors/repackageAuthError.mjs.map +1 -0
- package/dist/esm/utils/errors/validation.d.ts +7 -0
- package/dist/esm/utils/errors/validation.mjs +26 -0
- package/dist/esm/utils/errors/validation.mjs.map +1 -0
- package/dist/esm/utils/index.d.ts +2 -0
- package/dist/esm/utils/index.mjs +3 -0
- package/dist/esm/utils/index.mjs.map +1 -0
- package/dist/esm/utils/resolveConfig.d.ts +12 -0
- package/dist/esm/utils/resolveConfig.mjs +33 -0
- package/dist/esm/utils/resolveConfig.mjs.map +1 -0
- package/dist/esm/utils/resolveLibraryOptions.d.ts +11 -0
- package/dist/esm/utils/resolveLibraryOptions.mjs +13 -0
- package/dist/esm/utils/resolveLibraryOptions.mjs.map +1 -0
- package/internals/package.json +8 -0
- package/internals/server/package.json +8 -0
- package/package.json +99 -0
- package/server/package.json +7 -0
- package/src/GraphQLAPI.ts +97 -0
- package/src/Providers/AWSAppSyncEventsProvider/index.ts +218 -0
- package/src/Providers/AWSAppSyncRealTimeProvider/index.ts +185 -0
- package/src/Providers/AWSWebSocketProvider/appsyncUrl.ts +152 -0
- package/src/Providers/AWSWebSocketProvider/authHeaders.ts +146 -0
- package/src/Providers/AWSWebSocketProvider/index.ts +1028 -0
- package/src/Providers/constants.ts +154 -0
- package/src/index.ts +12 -0
- package/src/internals/InternalGraphQLAPI.ts +424 -0
- package/src/internals/events/appsyncRequest.ts +169 -0
- package/src/internals/events/index.ts +199 -0
- package/src/internals/events/types.ts +109 -0
- package/src/internals/events/utils.ts +77 -0
- package/src/internals/generateClient.ts +120 -0
- package/src/internals/graphqlAuth.ts +87 -0
- package/src/internals/graphqlRequest.ts +30 -0
- package/src/internals/index.ts +10 -0
- package/src/internals/server/generateClientWithAmplifyInstance.ts +73 -0
- package/src/internals/server/index.ts +4 -0
- package/src/internals/types.ts +42 -0
- package/src/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.ts +10 -0
- package/src/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.ts +13 -0
- package/src/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.ts +15 -0
- package/src/internals/v6.ts +189 -0
- package/src/server/generateClient.ts +68 -0
- package/src/server/index.ts +4 -0
- package/src/types/PubSub.ts +57 -0
- package/src/types/index.ts +524 -0
- package/src/utils/ConnectionStateMonitor.ts +195 -0
- package/src/utils/ReachabilityMonitor/index.native.ts +7 -0
- package/src/utils/ReachabilityMonitor/index.ts +5 -0
- package/src/utils/ReconnectionMonitor.ts +77 -0
- package/src/utils/errors/GraphQLApiError.ts +21 -0
- package/src/utils/errors/assertValidationError.ts +19 -0
- package/src/utils/errors/constants.ts +56 -0
- package/src/utils/errors/createGraphQLResultWithError.ts +15 -0
- package/src/utils/errors/index.ts +7 -0
- package/src/utils/errors/repackageAuthError.ts +43 -0
- package/src/utils/errors/validation.ts +26 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/resolveConfig.ts +46 -0
- package/src/utils/resolveLibraryOptions.ts +14 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { AmplifyClassV6 } from '@aws-amplify/core';
|
|
4
|
+
import {
|
|
5
|
+
ApiAction,
|
|
6
|
+
Category,
|
|
7
|
+
CustomUserAgentDetails,
|
|
8
|
+
} from '@aws-amplify/core/internals/utils';
|
|
9
|
+
import {
|
|
10
|
+
CustomHeaders,
|
|
11
|
+
INTERNAL_USER_AGENT_OVERRIDE,
|
|
12
|
+
} from '@aws-amplify/data-schema/runtime';
|
|
13
|
+
import { Observable } from 'rxjs';
|
|
14
|
+
|
|
15
|
+
import { GraphQLOptions, GraphQLResult } from './types';
|
|
16
|
+
import { InternalGraphQLAPIClass } from './internals/InternalGraphQLAPI';
|
|
17
|
+
|
|
18
|
+
function isGraphQLOptionsWithOverride(
|
|
19
|
+
options: GraphQLOptions,
|
|
20
|
+
): options is GraphQLOptions & {
|
|
21
|
+
[INTERNAL_USER_AGENT_OVERRIDE]: CustomUserAgentDetails;
|
|
22
|
+
} {
|
|
23
|
+
return INTERNAL_USER_AGENT_OVERRIDE in options;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const graphqlOperation = (
|
|
27
|
+
query: any,
|
|
28
|
+
variables = {},
|
|
29
|
+
authToken?: string,
|
|
30
|
+
) => ({
|
|
31
|
+
query,
|
|
32
|
+
variables,
|
|
33
|
+
authToken,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Export Cloud Logic APIs
|
|
38
|
+
*/
|
|
39
|
+
export class GraphQLAPIClass extends InternalGraphQLAPIClass {
|
|
40
|
+
public getModuleName() {
|
|
41
|
+
return 'GraphQLAPI';
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Executes a GraphQL operation
|
|
46
|
+
*
|
|
47
|
+
* @param options - GraphQL Options
|
|
48
|
+
* @param [additionalHeaders] - headers to merge in after any `libraryConfigHeaders` set in the config
|
|
49
|
+
* @returns An Observable if the query is a subscription query, else a promise of the graphql result.
|
|
50
|
+
*/
|
|
51
|
+
graphql<T = any>(
|
|
52
|
+
amplify: AmplifyClassV6 | (() => Promise<AmplifyClassV6>),
|
|
53
|
+
options: GraphQLOptions,
|
|
54
|
+
additionalHeaders?: CustomHeaders,
|
|
55
|
+
): Observable<GraphQLResult<T>> | Promise<GraphQLResult<T>> {
|
|
56
|
+
const userAgentDetails: CustomUserAgentDetails = {
|
|
57
|
+
category: Category.API,
|
|
58
|
+
action: ApiAction.GraphQl,
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
if (isGraphQLOptionsWithOverride(options)) {
|
|
62
|
+
const {
|
|
63
|
+
[INTERNAL_USER_AGENT_OVERRIDE]: internalUserAgentOverride,
|
|
64
|
+
...cleanOptions
|
|
65
|
+
} = options;
|
|
66
|
+
|
|
67
|
+
return super.graphql(amplify, cleanOptions, additionalHeaders, {
|
|
68
|
+
...userAgentDetails,
|
|
69
|
+
...internalUserAgentOverride,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return super.graphql(amplify, options, additionalHeaders, {
|
|
74
|
+
...userAgentDetails,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Checks to see if an error thrown is from an api request cancellation
|
|
80
|
+
* @param error - Any error
|
|
81
|
+
* @returns A boolean indicating if the error was from an api request cancellation
|
|
82
|
+
*/
|
|
83
|
+
isCancelError(error: any): boolean {
|
|
84
|
+
return super.isCancelError(error);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Cancels an inflight request. Only applicable for graphql queries and mutations
|
|
89
|
+
* @param {any} request - request to cancel
|
|
90
|
+
* @returns A boolean indicating if the request was cancelled
|
|
91
|
+
*/
|
|
92
|
+
cancel(request: Promise<any>, message?: string): boolean {
|
|
93
|
+
return super.cancel(request, message);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export const GraphQLAPI = new GraphQLAPIClass();
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import {
|
|
4
|
+
CustomUserAgentDetails,
|
|
5
|
+
DocumentType,
|
|
6
|
+
GraphQLAuthMode,
|
|
7
|
+
USER_AGENT_HEADER,
|
|
8
|
+
getAmplifyUserAgent,
|
|
9
|
+
} from '@aws-amplify/core/internals/utils';
|
|
10
|
+
import { CustomHeaders } from '@aws-amplify/data-schema/runtime';
|
|
11
|
+
|
|
12
|
+
import { DEFAULT_KEEP_ALIVE_TIMEOUT, MESSAGE_TYPES } from '../constants';
|
|
13
|
+
import { AWSWebSocketProvider } from '../AWSWebSocketProvider';
|
|
14
|
+
import { awsRealTimeHeaderBasedAuth } from '../AWSWebSocketProvider/authHeaders';
|
|
15
|
+
import { serializeEvents } from '../../internals/events/utils';
|
|
16
|
+
|
|
17
|
+
// resolved/actual AuthMode values. identityPool gets resolves to IAM upstream in InternalGraphQLAPI._graphqlSubscribe
|
|
18
|
+
type ResolvedGraphQLAuthModes = Exclude<GraphQLAuthMode, 'identityPool'>;
|
|
19
|
+
|
|
20
|
+
interface AWSAppSyncEventProviderOptions {
|
|
21
|
+
appSyncGraphqlEndpoint?: string;
|
|
22
|
+
authenticationType?: ResolvedGraphQLAuthModes;
|
|
23
|
+
query?: string;
|
|
24
|
+
variables?: DocumentType;
|
|
25
|
+
apiKey?: string;
|
|
26
|
+
region?: string;
|
|
27
|
+
libraryConfigHeaders?(): Promise<Record<string, unknown> | Headers>;
|
|
28
|
+
additionalHeaders?: CustomHeaders;
|
|
29
|
+
additionalCustomHeaders?: Record<string, string>;
|
|
30
|
+
authToken?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface DataPayload {
|
|
34
|
+
id: string;
|
|
35
|
+
event: string;
|
|
36
|
+
type: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface DataResponse {
|
|
40
|
+
id: string;
|
|
41
|
+
payload: string;
|
|
42
|
+
type: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const PROVIDER_NAME = 'AWSAppSyncEventsProvider';
|
|
46
|
+
const WS_PROTOCOL_NAME = 'aws-appsync-event-ws';
|
|
47
|
+
const CONNECT_URI = ''; // events does not expect a connect uri
|
|
48
|
+
|
|
49
|
+
export class AWSAppSyncEventProvider extends AWSWebSocketProvider {
|
|
50
|
+
constructor() {
|
|
51
|
+
super({
|
|
52
|
+
providerName: PROVIDER_NAME,
|
|
53
|
+
wsProtocolName: WS_PROTOCOL_NAME,
|
|
54
|
+
connectUri: CONNECT_URI,
|
|
55
|
+
});
|
|
56
|
+
this.allowNoSubscriptions = true;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
getProviderName() {
|
|
60
|
+
return PROVIDER_NAME;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public async connect(options: AWSAppSyncEventProviderOptions) {
|
|
64
|
+
return super.connect(options);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public subscribe(
|
|
68
|
+
options?: AWSAppSyncEventProviderOptions,
|
|
69
|
+
customUserAgentDetails?: CustomUserAgentDetails,
|
|
70
|
+
) {
|
|
71
|
+
return super.subscribe(options, customUserAgentDetails).pipe();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public async publish(
|
|
75
|
+
options: AWSAppSyncEventProviderOptions,
|
|
76
|
+
customUserAgentDetails?: CustomUserAgentDetails,
|
|
77
|
+
) {
|
|
78
|
+
return super.publish(options, customUserAgentDetails);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public closeIfNoActiveSubscription() {
|
|
82
|
+
this._closeSocketIfRequired();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
protected async _prepareSubscriptionPayload({
|
|
86
|
+
options,
|
|
87
|
+
subscriptionId,
|
|
88
|
+
customUserAgentDetails,
|
|
89
|
+
additionalCustomHeaders,
|
|
90
|
+
libraryConfigHeaders,
|
|
91
|
+
publish,
|
|
92
|
+
}: {
|
|
93
|
+
options: AWSAppSyncEventProviderOptions;
|
|
94
|
+
subscriptionId: string;
|
|
95
|
+
customUserAgentDetails: CustomUserAgentDetails | undefined;
|
|
96
|
+
additionalCustomHeaders: Record<string, string>;
|
|
97
|
+
libraryConfigHeaders: Record<string, string>;
|
|
98
|
+
publish?: boolean;
|
|
99
|
+
}): Promise<string> {
|
|
100
|
+
const {
|
|
101
|
+
appSyncGraphqlEndpoint,
|
|
102
|
+
authenticationType,
|
|
103
|
+
query,
|
|
104
|
+
apiKey,
|
|
105
|
+
region,
|
|
106
|
+
variables,
|
|
107
|
+
} = options;
|
|
108
|
+
|
|
109
|
+
const data = {
|
|
110
|
+
channel: query,
|
|
111
|
+
events: variables !== undefined ? serializeEvents(variables) : undefined,
|
|
112
|
+
};
|
|
113
|
+
const serializedData = JSON.stringify(data);
|
|
114
|
+
|
|
115
|
+
const headers = {
|
|
116
|
+
...(await awsRealTimeHeaderBasedAuth({
|
|
117
|
+
apiKey,
|
|
118
|
+
appSyncGraphqlEndpoint,
|
|
119
|
+
authenticationType,
|
|
120
|
+
payload: serializedData,
|
|
121
|
+
canonicalUri: '',
|
|
122
|
+
region,
|
|
123
|
+
additionalCustomHeaders,
|
|
124
|
+
})),
|
|
125
|
+
...libraryConfigHeaders,
|
|
126
|
+
...additionalCustomHeaders,
|
|
127
|
+
[USER_AGENT_HEADER]: getAmplifyUserAgent(customUserAgentDetails),
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const subscriptionMessage = {
|
|
131
|
+
id: subscriptionId,
|
|
132
|
+
channel: query,
|
|
133
|
+
events: variables !== undefined ? serializeEvents(variables) : undefined,
|
|
134
|
+
authorization: {
|
|
135
|
+
...headers,
|
|
136
|
+
},
|
|
137
|
+
payload: {
|
|
138
|
+
events:
|
|
139
|
+
variables !== undefined ? serializeEvents(variables) : undefined,
|
|
140
|
+
channel: query,
|
|
141
|
+
extensions: {
|
|
142
|
+
authorization: {
|
|
143
|
+
...headers,
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
type: publish
|
|
148
|
+
? MESSAGE_TYPES.EVENT_PUBLISH
|
|
149
|
+
: MESSAGE_TYPES.EVENT_SUBSCRIBE,
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const serializedSubscriptionMessage = JSON.stringify(subscriptionMessage);
|
|
153
|
+
|
|
154
|
+
return serializedSubscriptionMessage;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
protected _handleSubscriptionData(
|
|
158
|
+
message: MessageEvent,
|
|
159
|
+
): [boolean, DataResponse] {
|
|
160
|
+
this.logger.debug(
|
|
161
|
+
`subscription message from AWS AppSync Events: ${message.data}`,
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
const {
|
|
165
|
+
id = '',
|
|
166
|
+
event: payload,
|
|
167
|
+
type,
|
|
168
|
+
}: DataPayload = JSON.parse(String(message.data));
|
|
169
|
+
|
|
170
|
+
const {
|
|
171
|
+
observer = null,
|
|
172
|
+
query = '',
|
|
173
|
+
variables = {},
|
|
174
|
+
} = this.subscriptionObserverMap.get(id) || {};
|
|
175
|
+
|
|
176
|
+
this.logger.debug({ id, observer, query, variables });
|
|
177
|
+
|
|
178
|
+
if (type === MESSAGE_TYPES.DATA && payload) {
|
|
179
|
+
const deserializedEvent = JSON.parse(payload);
|
|
180
|
+
if (observer) {
|
|
181
|
+
observer.next({ id, type, event: deserializedEvent });
|
|
182
|
+
} else {
|
|
183
|
+
this.logger.debug(`observer not found for id: ${id}`);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return [true, { id, type, payload: deserializedEvent }];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return [false, { id, type, payload }];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
protected _unsubscribeMessage(subscriptionId: string): {
|
|
193
|
+
id: string;
|
|
194
|
+
type: string;
|
|
195
|
+
} {
|
|
196
|
+
return {
|
|
197
|
+
id: subscriptionId,
|
|
198
|
+
type: MESSAGE_TYPES.EVENT_STOP,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
protected _extractConnectionTimeout(data: Record<string, any>): number {
|
|
203
|
+
const { connectionTimeoutMs = DEFAULT_KEEP_ALIVE_TIMEOUT } = data;
|
|
204
|
+
|
|
205
|
+
return connectionTimeoutMs;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
protected _extractErrorCodeAndType(data: Record<string, any>): {
|
|
209
|
+
errorCode: number;
|
|
210
|
+
errorType: string;
|
|
211
|
+
} {
|
|
212
|
+
const { errors: [{ errorType = '', errorCode = 0 } = {}] = [] } = data;
|
|
213
|
+
|
|
214
|
+
return { errorCode, errorType };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export const AppSyncEventProvider = new AWSAppSyncEventProvider();
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
CustomUserAgentDetails,
|
|
6
|
+
DocumentType,
|
|
7
|
+
GraphQLAuthMode,
|
|
8
|
+
USER_AGENT_HEADER,
|
|
9
|
+
getAmplifyUserAgent,
|
|
10
|
+
} from '@aws-amplify/core/internals/utils';
|
|
11
|
+
import { CustomHeaders } from '@aws-amplify/data-schema/runtime';
|
|
12
|
+
|
|
13
|
+
import { DEFAULT_KEEP_ALIVE_TIMEOUT, MESSAGE_TYPES } from '../constants';
|
|
14
|
+
import { AWSWebSocketProvider } from '../AWSWebSocketProvider';
|
|
15
|
+
import { awsRealTimeHeaderBasedAuth } from '../AWSWebSocketProvider/authHeaders';
|
|
16
|
+
|
|
17
|
+
// resolved/actual AuthMode values. identityPool gets resolves to IAM upstream in InternalGraphQLAPI._graphqlSubscribe
|
|
18
|
+
type ResolvedGraphQLAuthModes = Exclude<GraphQLAuthMode, 'identityPool'>;
|
|
19
|
+
|
|
20
|
+
export interface AWSAppSyncRealTimeProviderOptions {
|
|
21
|
+
appSyncGraphqlEndpoint?: string;
|
|
22
|
+
authenticationType?: ResolvedGraphQLAuthModes;
|
|
23
|
+
query?: string;
|
|
24
|
+
variables?: DocumentType;
|
|
25
|
+
apiKey?: string;
|
|
26
|
+
region?: string;
|
|
27
|
+
libraryConfigHeaders?(): Promise<Record<string, unknown> | Headers>;
|
|
28
|
+
additionalHeaders?: CustomHeaders;
|
|
29
|
+
additionalCustomHeaders?: Record<string, string>;
|
|
30
|
+
authToken?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface DataObject extends Record<string, unknown> {
|
|
34
|
+
data: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface DataPayload {
|
|
38
|
+
id: string;
|
|
39
|
+
payload: DataObject;
|
|
40
|
+
type: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const PROVIDER_NAME = 'AWSAppSyncRealTimeProvider';
|
|
44
|
+
const WS_PROTOCOL_NAME = 'graphql-ws';
|
|
45
|
+
const CONNECT_URI = '/connect';
|
|
46
|
+
|
|
47
|
+
export class AWSAppSyncRealTimeProvider extends AWSWebSocketProvider {
|
|
48
|
+
constructor() {
|
|
49
|
+
super({
|
|
50
|
+
providerName: PROVIDER_NAME,
|
|
51
|
+
wsProtocolName: WS_PROTOCOL_NAME,
|
|
52
|
+
connectUri: CONNECT_URI,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
getProviderName() {
|
|
57
|
+
return PROVIDER_NAME;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public subscribe(
|
|
61
|
+
options?: AWSAppSyncRealTimeProviderOptions,
|
|
62
|
+
customUserAgentDetails?: CustomUserAgentDetails,
|
|
63
|
+
) {
|
|
64
|
+
return super.subscribe(options, customUserAgentDetails);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
protected async _prepareSubscriptionPayload({
|
|
68
|
+
options,
|
|
69
|
+
subscriptionId,
|
|
70
|
+
customUserAgentDetails,
|
|
71
|
+
additionalCustomHeaders,
|
|
72
|
+
libraryConfigHeaders,
|
|
73
|
+
}: {
|
|
74
|
+
options: AWSAppSyncRealTimeProviderOptions;
|
|
75
|
+
subscriptionId: string;
|
|
76
|
+
customUserAgentDetails: CustomUserAgentDetails | undefined;
|
|
77
|
+
additionalCustomHeaders: Record<string, string>;
|
|
78
|
+
libraryConfigHeaders: Record<string, string>;
|
|
79
|
+
}): Promise<string> {
|
|
80
|
+
const {
|
|
81
|
+
appSyncGraphqlEndpoint,
|
|
82
|
+
authenticationType,
|
|
83
|
+
query,
|
|
84
|
+
variables,
|
|
85
|
+
apiKey,
|
|
86
|
+
region,
|
|
87
|
+
} = options;
|
|
88
|
+
const data = {
|
|
89
|
+
query,
|
|
90
|
+
variables,
|
|
91
|
+
};
|
|
92
|
+
const serializedData = JSON.stringify(data);
|
|
93
|
+
|
|
94
|
+
const headers = {
|
|
95
|
+
...(await awsRealTimeHeaderBasedAuth({
|
|
96
|
+
apiKey,
|
|
97
|
+
appSyncGraphqlEndpoint,
|
|
98
|
+
authenticationType,
|
|
99
|
+
payload: serializedData,
|
|
100
|
+
canonicalUri: '',
|
|
101
|
+
region,
|
|
102
|
+
additionalCustomHeaders,
|
|
103
|
+
})),
|
|
104
|
+
...libraryConfigHeaders,
|
|
105
|
+
...additionalCustomHeaders,
|
|
106
|
+
[USER_AGENT_HEADER]: getAmplifyUserAgent(customUserAgentDetails),
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const subscriptionMessage = {
|
|
110
|
+
id: subscriptionId,
|
|
111
|
+
payload: {
|
|
112
|
+
data: serializedData,
|
|
113
|
+
extensions: {
|
|
114
|
+
authorization: {
|
|
115
|
+
...headers,
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
type: MESSAGE_TYPES.GQL_START,
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
const serializedSubscriptionMessage = JSON.stringify(subscriptionMessage);
|
|
123
|
+
|
|
124
|
+
return serializedSubscriptionMessage;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
protected _handleSubscriptionData(
|
|
128
|
+
message: MessageEvent,
|
|
129
|
+
): [boolean, DataPayload] {
|
|
130
|
+
this.logger.debug(
|
|
131
|
+
`subscription message from AWS AppSync RealTime: ${message.data}`,
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
const { id = '', payload, type } = JSON.parse(String(message.data));
|
|
135
|
+
|
|
136
|
+
const {
|
|
137
|
+
observer = null,
|
|
138
|
+
query = '',
|
|
139
|
+
variables = {},
|
|
140
|
+
} = this.subscriptionObserverMap.get(id) || {};
|
|
141
|
+
|
|
142
|
+
this.logger.debug({ id, observer, query, variables });
|
|
143
|
+
|
|
144
|
+
if (type === MESSAGE_TYPES.DATA && payload && payload.data) {
|
|
145
|
+
if (observer) {
|
|
146
|
+
observer.next(payload);
|
|
147
|
+
} else {
|
|
148
|
+
this.logger.debug(`observer not found for id: ${id}`);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return [true, { id, type, payload }];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return [false, { id, type, payload }];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
protected _unsubscribeMessage(subscriptionId: string): {
|
|
158
|
+
id: string;
|
|
159
|
+
type: string;
|
|
160
|
+
} {
|
|
161
|
+
return {
|
|
162
|
+
id: subscriptionId,
|
|
163
|
+
type: MESSAGE_TYPES.GQL_STOP,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
protected _extractConnectionTimeout(data: Record<string, any>): number {
|
|
168
|
+
const {
|
|
169
|
+
payload: { connectionTimeoutMs = DEFAULT_KEEP_ALIVE_TIMEOUT } = {},
|
|
170
|
+
} = data;
|
|
171
|
+
|
|
172
|
+
return connectionTimeoutMs;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
protected _extractErrorCodeAndType(data: any): {
|
|
176
|
+
errorCode: number;
|
|
177
|
+
errorType: string;
|
|
178
|
+
} {
|
|
179
|
+
const {
|
|
180
|
+
payload: { errors: [{ errorType = '', errorCode = 0 } = {}] = [] } = {},
|
|
181
|
+
} = data;
|
|
182
|
+
|
|
183
|
+
return { errorCode, errorType };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
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}\.\w+-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
|
+
.replace('appsync-api', 'appsync-realtime-api');
|
|
36
|
+
} else if (isCustomDomain(realtimeEndpoint)) {
|
|
37
|
+
realtimeEndpoint = realtimeEndpoint.concat(customDomainPath);
|
|
38
|
+
} else {
|
|
39
|
+
realtimeEndpoint = realtimeEndpoint
|
|
40
|
+
.replace('appsync-api', 'appsync-realtime-api')
|
|
41
|
+
.replace('gogi-beta', 'grt-beta')
|
|
42
|
+
.replace('ddpg-api', 'grt-gamma');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
realtimeEndpoint = realtimeEndpoint
|
|
46
|
+
.replace('https://', protocol)
|
|
47
|
+
.replace('http://', protocol);
|
|
48
|
+
|
|
49
|
+
return new AmplifyUrl(realtimeEndpoint);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Strips out `Authorization` header if present
|
|
54
|
+
*/
|
|
55
|
+
const extractNonAuthHeaders = (
|
|
56
|
+
headers?: AWSAppSyncRealTimeProviderOptions['additionalCustomHeaders'],
|
|
57
|
+
): Record<string, string> => {
|
|
58
|
+
if (!headers) {
|
|
59
|
+
return {};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if ('Authorization' in headers) {
|
|
63
|
+
const { Authorization: _, ...nonAuthHeaders } = headers;
|
|
64
|
+
|
|
65
|
+
return nonAuthHeaders;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return headers;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
*
|
|
73
|
+
* @param headers - http headers
|
|
74
|
+
* @returns uri-encoded query parameters derived from custom headers
|
|
75
|
+
*/
|
|
76
|
+
export const queryParamsFromCustomHeaders = (
|
|
77
|
+
headers?: AWSAppSyncRealTimeProviderOptions['additionalCustomHeaders'],
|
|
78
|
+
): URLSearchParams => {
|
|
79
|
+
const nonAuthHeaders = extractNonAuthHeaders(headers);
|
|
80
|
+
|
|
81
|
+
const params = new AmplifyUrlSearchParams();
|
|
82
|
+
|
|
83
|
+
Object.entries(nonAuthHeaders).forEach(([k, v]) => {
|
|
84
|
+
params.append(k, v);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
return params;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Normalizes AppSync realtime endpoint URL
|
|
92
|
+
*
|
|
93
|
+
* @param appSyncGraphqlEndpoint - AppSync endpointUri from config
|
|
94
|
+
* @param urlParams - URLSearchParams
|
|
95
|
+
* @returns fully resolved string realtime endpoint URL
|
|
96
|
+
*/
|
|
97
|
+
export const realtimeUrlWithQueryString = (
|
|
98
|
+
appSyncGraphqlEndpoint: string | undefined,
|
|
99
|
+
urlParams: URLSearchParams,
|
|
100
|
+
): string => {
|
|
101
|
+
const realtimeEndpointUrl = getRealtimeEndpointUrl(appSyncGraphqlEndpoint);
|
|
102
|
+
|
|
103
|
+
// preserves any query params a customer might manually set in the configuration
|
|
104
|
+
const existingParams = new AmplifyUrlSearchParams(realtimeEndpointUrl.search);
|
|
105
|
+
|
|
106
|
+
for (const [k, v] of urlParams.entries()) {
|
|
107
|
+
existingParams.append(k, v);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
realtimeEndpointUrl.search = existingParams.toString();
|
|
111
|
+
|
|
112
|
+
return realtimeEndpointUrl.toString();
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// TODO: move to separate file?
|
|
116
|
+
export const additionalHeadersFromOptions = async (
|
|
117
|
+
options: AWSAppSyncRealTimeProviderOptions,
|
|
118
|
+
) => {
|
|
119
|
+
const {
|
|
120
|
+
appSyncGraphqlEndpoint,
|
|
121
|
+
query,
|
|
122
|
+
libraryConfigHeaders = () => ({}),
|
|
123
|
+
additionalHeaders = {},
|
|
124
|
+
authToken,
|
|
125
|
+
} = options;
|
|
126
|
+
|
|
127
|
+
let additionalCustomHeaders = {};
|
|
128
|
+
const _libraryConfigHeaders = await libraryConfigHeaders();
|
|
129
|
+
|
|
130
|
+
if (typeof additionalHeaders === 'function') {
|
|
131
|
+
const requestOptions: RequestOptions = {
|
|
132
|
+
url: appSyncGraphqlEndpoint || '',
|
|
133
|
+
queryString: query || '',
|
|
134
|
+
};
|
|
135
|
+
additionalCustomHeaders = await additionalHeaders(requestOptions);
|
|
136
|
+
} else {
|
|
137
|
+
additionalCustomHeaders = additionalHeaders;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// if an authorization header is set, have the explicit, operation-level authToken take precedence
|
|
141
|
+
if (authToken) {
|
|
142
|
+
additionalCustomHeaders = {
|
|
143
|
+
...additionalCustomHeaders,
|
|
144
|
+
Authorization: authToken,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return {
|
|
149
|
+
additionalCustomHeaders,
|
|
150
|
+
libraryConfigHeaders: _libraryConfigHeaders,
|
|
151
|
+
};
|
|
152
|
+
};
|