@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.
Files changed (257) hide show
  1. package/README.md +3 -0
  2. package/dist/cjs/GraphQLAPI.js +66 -0
  3. package/dist/cjs/GraphQLAPI.js.map +1 -0
  4. package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js +117 -0
  5. package/dist/cjs/Providers/AWSAppSyncEventsProvider/index.js.map +1 -0
  6. package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js +96 -0
  7. package/dist/cjs/Providers/AWSAppSyncRealTimeProvider/index.js.map +1 -0
  8. package/dist/cjs/Providers/AWSWebSocketProvider/appsyncUrl.js +113 -0
  9. package/dist/cjs/Providers/AWSWebSocketProvider/appsyncUrl.js.map +1 -0
  10. package/dist/cjs/Providers/AWSWebSocketProvider/authHeaders.js +99 -0
  11. package/dist/cjs/Providers/AWSWebSocketProvider/authHeaders.js.map +1 -0
  12. package/dist/cjs/Providers/AWSWebSocketProvider/index.js +693 -0
  13. package/dist/cjs/Providers/AWSWebSocketProvider/index.js.map +1 -0
  14. package/dist/cjs/Providers/constants.js +149 -0
  15. package/dist/cjs/Providers/constants.js.map +1 -0
  16. package/dist/cjs/index.js +18 -0
  17. package/dist/cjs/index.js.map +1 -0
  18. package/dist/cjs/internals/InternalGraphQLAPI.js +269 -0
  19. package/dist/cjs/internals/InternalGraphQLAPI.js.map +1 -0
  20. package/dist/cjs/internals/events/appsyncRequest.js +96 -0
  21. package/dist/cjs/internals/events/appsyncRequest.js.map +1 -0
  22. package/dist/cjs/internals/events/index.js +142 -0
  23. package/dist/cjs/internals/events/index.js.map +1 -0
  24. package/dist/cjs/internals/events/types.js +6 -0
  25. package/dist/cjs/internals/events/types.js.map +1 -0
  26. package/dist/cjs/internals/events/utils.js +57 -0
  27. package/dist/cjs/internals/events/utils.js.map +1 -0
  28. package/dist/cjs/internals/generateClient.js +86 -0
  29. package/dist/cjs/internals/generateClient.js.map +1 -0
  30. package/dist/cjs/internals/graphqlAuth.js +63 -0
  31. package/dist/cjs/internals/graphqlAuth.js.map +1 -0
  32. package/dist/cjs/internals/graphqlRequest.js +19 -0
  33. package/dist/cjs/internals/graphqlRequest.js.map +1 -0
  34. package/dist/cjs/internals/index.js +16 -0
  35. package/dist/cjs/internals/index.js.map +1 -0
  36. package/dist/cjs/internals/server/generateClientWithAmplifyInstance.js +48 -0
  37. package/dist/cjs/internals/server/generateClientWithAmplifyInstance.js.map +1 -0
  38. package/dist/cjs/internals/server/index.js +9 -0
  39. package/dist/cjs/internals/server/index.js.map +1 -0
  40. package/dist/cjs/internals/types.js +4 -0
  41. package/dist/cjs/internals/types.js.map +1 -0
  42. package/dist/cjs/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.js +10 -0
  43. package/dist/cjs/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.js.map +1 -0
  44. package/dist/cjs/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.js +10 -0
  45. package/dist/cjs/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.js.map +1 -0
  46. package/dist/cjs/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.js +14 -0
  47. package/dist/cjs/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.js.map +1 -0
  48. package/dist/cjs/internals/v6.js +155 -0
  49. package/dist/cjs/internals/v6.js.map +1 -0
  50. package/dist/cjs/server/generateClient.js +42 -0
  51. package/dist/cjs/server/generateClient.js.map +1 -0
  52. package/dist/cjs/server/index.js +9 -0
  53. package/dist/cjs/server/index.js.map +1 -0
  54. package/dist/cjs/types/PubSub.js +49 -0
  55. package/dist/cjs/types/PubSub.js.map +1 -0
  56. package/dist/cjs/types/index.js +34 -0
  57. package/dist/cjs/types/index.js.map +1 -0
  58. package/dist/cjs/utils/ConnectionStateMonitor.js +134 -0
  59. package/dist/cjs/utils/ConnectionStateMonitor.js.map +1 -0
  60. package/dist/cjs/utils/ReachabilityMonitor/index.js +10 -0
  61. package/dist/cjs/utils/ReachabilityMonitor/index.js.map +1 -0
  62. package/dist/cjs/utils/ReachabilityMonitor/index.native.js +12 -0
  63. package/dist/cjs/utils/ReachabilityMonitor/index.native.js.map +1 -0
  64. package/dist/cjs/utils/ReconnectionMonitor.js +71 -0
  65. package/dist/cjs/utils/ReconnectionMonitor.js.map +1 -0
  66. package/dist/cjs/utils/errors/GraphQLApiError.js +21 -0
  67. package/dist/cjs/utils/errors/GraphQLApiError.js.map +1 -0
  68. package/dist/cjs/utils/errors/assertValidationError.js +18 -0
  69. package/dist/cjs/utils/errors/assertValidationError.js.map +1 -0
  70. package/dist/cjs/utils/errors/constants.js +47 -0
  71. package/dist/cjs/utils/errors/constants.js.map +1 -0
  72. package/dist/cjs/utils/errors/createGraphQLResultWithError.js +15 -0
  73. package/dist/cjs/utils/errors/createGraphQLResultWithError.js.map +1 -0
  74. package/dist/cjs/utils/errors/index.js +16 -0
  75. package/dist/cjs/utils/errors/index.js.map +1 -0
  76. package/dist/cjs/utils/errors/repackageAuthError.js +38 -0
  77. package/dist/cjs/utils/errors/repackageAuthError.js.map +1 -0
  78. package/dist/cjs/utils/errors/validation.js +28 -0
  79. package/dist/cjs/utils/errors/validation.js.map +1 -0
  80. package/dist/cjs/utils/index.js +11 -0
  81. package/dist/cjs/utils/index.js.map +1 -0
  82. package/dist/cjs/utils/resolveConfig.js +32 -0
  83. package/dist/cjs/utils/resolveConfig.js.map +1 -0
  84. package/dist/cjs/utils/resolveLibraryOptions.js +16 -0
  85. package/dist/cjs/utils/resolveLibraryOptions.js.map +1 -0
  86. package/dist/esm/GraphQLAPI.d.ts +37 -0
  87. package/dist/esm/GraphQLAPI.mjs +63 -0
  88. package/dist/esm/GraphQLAPI.mjs.map +1 -0
  89. package/dist/esm/Providers/AWSAppSyncEventsProvider/index.d.ts +49 -0
  90. package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs +115 -0
  91. package/dist/esm/Providers/AWSAppSyncEventsProvider/index.mjs.map +1 -0
  92. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.d.ts +47 -0
  93. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs +94 -0
  94. package/dist/esm/Providers/AWSAppSyncRealTimeProvider/index.mjs.map +1 -0
  95. package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.d.ts +21 -0
  96. package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.mjs +107 -0
  97. package/dist/esm/Providers/AWSWebSocketProvider/appsyncUrl.mjs.map +1 -0
  98. package/dist/esm/Providers/AWSWebSocketProvider/authHeaders.d.ts +8 -0
  99. package/dist/esm/Providers/AWSWebSocketProvider/authHeaders.mjs +97 -0
  100. package/dist/esm/Providers/AWSWebSocketProvider/authHeaders.mjs.map +1 -0
  101. package/dist/esm/Providers/AWSWebSocketProvider/index.d.ts +99 -0
  102. package/dist/esm/Providers/AWSWebSocketProvider/index.mjs +691 -0
  103. package/dist/esm/Providers/AWSWebSocketProvider/index.mjs.map +1 -0
  104. package/dist/esm/Providers/constants.d.ts +135 -0
  105. package/dist/esm/Providers/constants.mjs +147 -0
  106. package/dist/esm/Providers/constants.mjs.map +1 -0
  107. package/dist/esm/index.d.ts +6 -0
  108. package/dist/esm/index.mjs +7 -0
  109. package/dist/esm/index.mjs.map +1 -0
  110. package/dist/esm/internals/InternalGraphQLAPI.d.ts +45 -0
  111. package/dist/esm/internals/InternalGraphQLAPI.mjs +270 -0
  112. package/dist/esm/internals/InternalGraphQLAPI.mjs.map +1 -0
  113. package/dist/esm/internals/events/appsyncRequest.d.ts +14 -0
  114. package/dist/esm/internals/events/appsyncRequest.mjs +96 -0
  115. package/dist/esm/internals/events/appsyncRequest.mjs.map +1 -0
  116. package/dist/esm/internals/events/index.d.ts +58 -0
  117. package/dist/esm/internals/events/index.mjs +139 -0
  118. package/dist/esm/internals/events/index.mjs.map +1 -0
  119. package/dist/esm/internals/events/types.d.ts +93 -0
  120. package/dist/esm/internals/events/types.mjs +2 -0
  121. package/dist/esm/internals/events/types.mjs.map +1 -0
  122. package/dist/esm/internals/events/utils.d.ts +16 -0
  123. package/dist/esm/internals/events/utils.mjs +53 -0
  124. package/dist/esm/internals/events/utils.mjs.map +1 -0
  125. package/dist/esm/internals/generateClient.d.ts +12 -0
  126. package/dist/esm/internals/generateClient.mjs +85 -0
  127. package/dist/esm/internals/generateClient.mjs.map +1 -0
  128. package/dist/esm/internals/graphqlAuth.d.ts +3 -0
  129. package/dist/esm/internals/graphqlAuth.mjs +64 -0
  130. package/dist/esm/internals/graphqlAuth.mjs.map +1 -0
  131. package/dist/esm/internals/graphqlRequest.d.ts +3 -0
  132. package/dist/esm/internals/graphqlRequest.mjs +18 -0
  133. package/dist/esm/internals/graphqlRequest.mjs.map +1 -0
  134. package/dist/esm/internals/index.d.ts +4 -0
  135. package/dist/esm/internals/index.mjs +4 -0
  136. package/dist/esm/internals/index.mjs.map +1 -0
  137. package/dist/esm/internals/server/generateClientWithAmplifyInstance.d.ts +13 -0
  138. package/dist/esm/internals/server/generateClientWithAmplifyInstance.mjs +61 -0
  139. package/dist/esm/internals/server/generateClientWithAmplifyInstance.mjs.map +1 -0
  140. package/dist/esm/internals/server/index.d.ts +1 -0
  141. package/dist/esm/internals/server/index.mjs +2 -0
  142. package/dist/esm/internals/server/index.mjs.map +1 -0
  143. package/dist/esm/internals/types.d.ts +34 -0
  144. package/dist/esm/internals/types.mjs +2 -0
  145. package/dist/esm/internals/types.mjs.map +1 -0
  146. package/dist/esm/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.d.ts +2 -0
  147. package/dist/esm/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.mjs +8 -0
  148. package/dist/esm/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.mjs.map +1 -0
  149. package/dist/esm/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.d.ts +8 -0
  150. package/dist/esm/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.mjs +8 -0
  151. package/dist/esm/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.mjs.map +1 -0
  152. package/dist/esm/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.d.ts +2 -0
  153. package/dist/esm/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.mjs +12 -0
  154. package/dist/esm/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.mjs.map +1 -0
  155. package/dist/esm/internals/v6.d.ts +100 -0
  156. package/dist/esm/internals/v6.mjs +152 -0
  157. package/dist/esm/internals/v6.mjs.map +1 -0
  158. package/dist/esm/server/generateClient.d.ts +21 -0
  159. package/dist/esm/server/generateClient.mjs +41 -0
  160. package/dist/esm/server/generateClient.mjs.map +1 -0
  161. package/dist/esm/server/index.d.ts +1 -0
  162. package/dist/esm/server/index.mjs +2 -0
  163. package/dist/esm/server/index.mjs.map +1 -0
  164. package/dist/esm/types/PubSub.d.ts +27 -0
  165. package/dist/esm/types/PubSub.mjs +47 -0
  166. package/dist/esm/types/PubSub.mjs.map +1 -0
  167. package/dist/esm/types/index.d.ts +369 -0
  168. package/dist/esm/types/index.mjs +30 -0
  169. package/dist/esm/types/index.mjs.map +1 -0
  170. package/dist/esm/utils/ConnectionStateMonitor.d.ts +69 -0
  171. package/dist/esm/utils/ConnectionStateMonitor.mjs +132 -0
  172. package/dist/esm/utils/ConnectionStateMonitor.mjs.map +1 -0
  173. package/dist/esm/utils/ReachabilityMonitor/index.d.ts +1 -0
  174. package/dist/esm/utils/ReachabilityMonitor/index.mjs +8 -0
  175. package/dist/esm/utils/ReachabilityMonitor/index.mjs.map +1 -0
  176. package/dist/esm/utils/ReachabilityMonitor/index.native.d.ts +1 -0
  177. package/dist/esm/utils/ReachabilityMonitor/index.native.mjs +9 -0
  178. package/dist/esm/utils/ReachabilityMonitor/index.native.mjs.map +1 -0
  179. package/dist/esm/utils/ReconnectionMonitor.d.ts +29 -0
  180. package/dist/esm/utils/ReconnectionMonitor.mjs +69 -0
  181. package/dist/esm/utils/ReconnectionMonitor.mjs.map +1 -0
  182. package/dist/esm/utils/errors/GraphQLApiError.d.ts +7 -0
  183. package/dist/esm/utils/errors/GraphQLApiError.mjs +19 -0
  184. package/dist/esm/utils/errors/GraphQLApiError.mjs.map +1 -0
  185. package/dist/esm/utils/errors/assertValidationError.d.ts +5 -0
  186. package/dist/esm/utils/errors/assertValidationError.mjs +17 -0
  187. package/dist/esm/utils/errors/assertValidationError.mjs.map +1 -0
  188. package/dist/esm/utils/errors/constants.d.ts +7 -0
  189. package/dist/esm/utils/errors/constants.mjs +46 -0
  190. package/dist/esm/utils/errors/constants.mjs.map +1 -0
  191. package/dist/esm/utils/errors/createGraphQLResultWithError.d.ts +2 -0
  192. package/dist/esm/utils/errors/createGraphQLResultWithError.mjs +13 -0
  193. package/dist/esm/utils/errors/createGraphQLResultWithError.mjs.map +1 -0
  194. package/dist/esm/utils/errors/index.d.ts +4 -0
  195. package/dist/esm/utils/errors/index.mjs +5 -0
  196. package/dist/esm/utils/errors/index.mjs.map +1 -0
  197. package/dist/esm/utils/errors/repackageAuthError.d.ts +7 -0
  198. package/dist/esm/utils/errors/repackageAuthError.mjs +36 -0
  199. package/dist/esm/utils/errors/repackageAuthError.mjs.map +1 -0
  200. package/dist/esm/utils/errors/validation.d.ts +7 -0
  201. package/dist/esm/utils/errors/validation.mjs +26 -0
  202. package/dist/esm/utils/errors/validation.mjs.map +1 -0
  203. package/dist/esm/utils/index.d.ts +2 -0
  204. package/dist/esm/utils/index.mjs +3 -0
  205. package/dist/esm/utils/index.mjs.map +1 -0
  206. package/dist/esm/utils/resolveConfig.d.ts +12 -0
  207. package/dist/esm/utils/resolveConfig.mjs +33 -0
  208. package/dist/esm/utils/resolveConfig.mjs.map +1 -0
  209. package/dist/esm/utils/resolveLibraryOptions.d.ts +11 -0
  210. package/dist/esm/utils/resolveLibraryOptions.mjs +13 -0
  211. package/dist/esm/utils/resolveLibraryOptions.mjs.map +1 -0
  212. package/internals/package.json +8 -0
  213. package/internals/server/package.json +8 -0
  214. package/package.json +99 -0
  215. package/server/package.json +7 -0
  216. package/src/GraphQLAPI.ts +97 -0
  217. package/src/Providers/AWSAppSyncEventsProvider/index.ts +218 -0
  218. package/src/Providers/AWSAppSyncRealTimeProvider/index.ts +185 -0
  219. package/src/Providers/AWSWebSocketProvider/appsyncUrl.ts +152 -0
  220. package/src/Providers/AWSWebSocketProvider/authHeaders.ts +146 -0
  221. package/src/Providers/AWSWebSocketProvider/index.ts +1028 -0
  222. package/src/Providers/constants.ts +154 -0
  223. package/src/index.ts +12 -0
  224. package/src/internals/InternalGraphQLAPI.ts +424 -0
  225. package/src/internals/events/appsyncRequest.ts +169 -0
  226. package/src/internals/events/index.ts +199 -0
  227. package/src/internals/events/types.ts +109 -0
  228. package/src/internals/events/utils.ts +77 -0
  229. package/src/internals/generateClient.ts +120 -0
  230. package/src/internals/graphqlAuth.ts +87 -0
  231. package/src/internals/graphqlRequest.ts +30 -0
  232. package/src/internals/index.ts +10 -0
  233. package/src/internals/server/generateClientWithAmplifyInstance.ts +73 -0
  234. package/src/internals/server/index.ts +4 -0
  235. package/src/internals/types.ts +42 -0
  236. package/src/internals/utils/runtimeTypeGuards/isApiGraphQLProviderConfig.ts +10 -0
  237. package/src/internals/utils/runtimeTypeGuards/isConfigureEventWithResourceConfig.ts +13 -0
  238. package/src/internals/utils/runtimeTypeGuards/isGraphQLResponseWithErrors.ts +15 -0
  239. package/src/internals/v6.ts +189 -0
  240. package/src/server/generateClient.ts +68 -0
  241. package/src/server/index.ts +4 -0
  242. package/src/types/PubSub.ts +57 -0
  243. package/src/types/index.ts +524 -0
  244. package/src/utils/ConnectionStateMonitor.ts +195 -0
  245. package/src/utils/ReachabilityMonitor/index.native.ts +7 -0
  246. package/src/utils/ReachabilityMonitor/index.ts +5 -0
  247. package/src/utils/ReconnectionMonitor.ts +77 -0
  248. package/src/utils/errors/GraphQLApiError.ts +21 -0
  249. package/src/utils/errors/assertValidationError.ts +19 -0
  250. package/src/utils/errors/constants.ts +56 -0
  251. package/src/utils/errors/createGraphQLResultWithError.ts +15 -0
  252. package/src/utils/errors/index.ts +7 -0
  253. package/src/utils/errors/repackageAuthError.ts +43 -0
  254. package/src/utils/errors/validation.ts +26 -0
  255. package/src/utils/index.ts +5 -0
  256. package/src/utils/resolveConfig.ts +46 -0
  257. 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
+ };