@mstuercke/api-utils 4.3.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/package.json +17 -40
  2. package/src/rest/client/fetchRestApi.ts +47 -0
  3. package/src/rest/client/index.ts +1 -0
  4. package/src/rest/server/RestApi.ts +144 -0
  5. package/src/rest/server/buildRestApiRouteHandler.ts +26 -0
  6. package/{dist/rest/server/index.js → src/rest/server/index.ts} +0 -1
  7. package/src/rest/types/RestApiRequest.ts +14 -0
  8. package/src/rest/types/RestApiRequestHandler.ts +21 -0
  9. package/src/rest/types/RestApiRequestHandlerWithAuthentication.ts +12 -0
  10. package/src/rest/types/RestApiResponse.ts +5 -0
  11. package/src/rest/types/RestApiRoute.ts +34 -0
  12. package/src/rest/types/RestApiRouteHandler.ts +22 -0
  13. package/src/rest/types/RestApiRouteWithAuthentication.ts +12 -0
  14. package/src/rest/types/common/BearerToken.ts +1 -0
  15. package/src/rest/types/common/RestPathParams.ts +1 -0
  16. package/src/rest/types/common/RestQueryParams.ts +1 -0
  17. package/src/rest/types/common/RestRequestBody.ts +1 -0
  18. package/src/rest/types/common/RestRequestHeaders.ts +1 -0
  19. package/src/rest/types/common/RestRequestHeadersWithAuthorization.ts +11 -0
  20. package/src/rest/types/common/RestRequireAuthentication.ts +1 -0
  21. package/src/rest/types/common/RestResponseBody.ts +1 -0
  22. package/{dist/rest/types/common/index.js → src/rest/types/common/index.ts} +0 -1
  23. package/{dist/rest/types/index.js → src/rest/types/index.ts} +0 -1
  24. package/src/rest/types/internal/InternalRestApiRequest.ts +19 -0
  25. package/src/rest/types/internal/index.ts +2 -0
  26. package/src/types/OmitNever.ts +1 -0
  27. package/src/ws/client/index.ts +1 -0
  28. package/src/ws/client/useWsApi.ts +88 -0
  29. package/src/ws/server/WsApi.ts +75 -0
  30. package/src/ws/server/buildWsApiRouteHandler.ts +15 -0
  31. package/src/ws/server/closeConnection.ts +16 -0
  32. package/src/ws/server/getApiGatewayManagementApiClient.ts +11 -0
  33. package/src/ws/server/getConnection.ts +12 -0
  34. package/{dist/ws/server/index.d.ts → src/ws/server/index.ts} +3 -2
  35. package/src/ws/server/sendResponse.ts +17 -0
  36. package/src/ws/server/trpc/TrpcSubscriptionRequest.ts +8 -0
  37. package/src/ws/server/trpc/TrpcSubscriptionResponse.ts +8 -0
  38. package/src/ws/server/trpc/awsLambdaTrpcSubscriptionRequestHandler.ts +105 -0
  39. package/src/ws/types/WsApiConnection.ts +4 -0
  40. package/src/ws/types/WsApiRequestHandler.ts +15 -0
  41. package/src/ws/types/WsApiRoute.ts +17 -0
  42. package/src/ws/types/WsApiRouteHandler.ts +14 -0
  43. package/src/ws/types/common/WsApiAction.ts +1 -0
  44. package/src/ws/types/common/WsApiRequest.ts +3 -0
  45. package/src/ws/types/common/WsApiResponse.ts +1 -0
  46. package/src/ws/types/common/index.ts +3 -0
  47. package/{dist/ws/types/index.js → src/ws/types/index.ts} +0 -1
  48. package/dist/rest/client/fetchRestApi.d.ts +0 -4
  49. package/dist/rest/client/fetchRestApi.d.ts.map +0 -1
  50. package/dist/rest/client/fetchRestApi.js +0 -19
  51. package/dist/rest/client/fetchRestApi.js.map +0 -1
  52. package/dist/rest/client/index.d.ts +0 -2
  53. package/dist/rest/client/index.d.ts.map +0 -1
  54. package/dist/rest/client/index.js +0 -2
  55. package/dist/rest/client/index.js.map +0 -1
  56. package/dist/rest/server/RestApi.d.ts +0 -13
  57. package/dist/rest/server/RestApi.d.ts.map +0 -1
  58. package/dist/rest/server/RestApi.js +0 -101
  59. package/dist/rest/server/RestApi.js.map +0 -1
  60. package/dist/rest/server/buildRestApiRouteHandler.d.ts +0 -3
  61. package/dist/rest/server/buildRestApiRouteHandler.d.ts.map +0 -1
  62. package/dist/rest/server/buildRestApiRouteHandler.js +0 -5
  63. package/dist/rest/server/buildRestApiRouteHandler.js.map +0 -1
  64. package/dist/rest/server/index.d.ts +0 -3
  65. package/dist/rest/server/index.d.ts.map +0 -1
  66. package/dist/rest/server/index.js.map +0 -1
  67. package/dist/rest/types/RestApiRequest.d.ts +0 -9
  68. package/dist/rest/types/RestApiRequest.d.ts.map +0 -1
  69. package/dist/rest/types/RestApiRequest.js +0 -2
  70. package/dist/rest/types/RestApiRequest.js.map +0 -1
  71. package/dist/rest/types/RestApiRequestHandler.d.ts +0 -5
  72. package/dist/rest/types/RestApiRequestHandler.d.ts.map +0 -1
  73. package/dist/rest/types/RestApiRequestHandler.js +0 -2
  74. package/dist/rest/types/RestApiRequestHandler.js.map +0 -1
  75. package/dist/rest/types/RestApiRequestHandlerWithAuthentication.d.ts +0 -4
  76. package/dist/rest/types/RestApiRequestHandlerWithAuthentication.d.ts.map +0 -1
  77. package/dist/rest/types/RestApiRequestHandlerWithAuthentication.js +0 -2
  78. package/dist/rest/types/RestApiRequestHandlerWithAuthentication.js.map +0 -1
  79. package/dist/rest/types/RestApiResponse.d.ts +0 -6
  80. package/dist/rest/types/RestApiResponse.d.ts.map +0 -1
  81. package/dist/rest/types/RestApiResponse.js +0 -2
  82. package/dist/rest/types/RestApiResponse.js.map +0 -1
  83. package/dist/rest/types/RestApiRoute.d.ts +0 -15
  84. package/dist/rest/types/RestApiRoute.d.ts.map +0 -1
  85. package/dist/rest/types/RestApiRoute.js +0 -2
  86. package/dist/rest/types/RestApiRoute.js.map +0 -1
  87. package/dist/rest/types/RestApiRouteHandler.d.ts +0 -8
  88. package/dist/rest/types/RestApiRouteHandler.d.ts.map +0 -1
  89. package/dist/rest/types/RestApiRouteHandler.js +0 -2
  90. package/dist/rest/types/RestApiRouteHandler.js.map +0 -1
  91. package/dist/rest/types/RestApiRouteWithAuthentication.d.ts +0 -4
  92. package/dist/rest/types/RestApiRouteWithAuthentication.d.ts.map +0 -1
  93. package/dist/rest/types/RestApiRouteWithAuthentication.js +0 -2
  94. package/dist/rest/types/RestApiRouteWithAuthentication.js.map +0 -1
  95. package/dist/rest/types/common/BearerToken.d.ts +0 -2
  96. package/dist/rest/types/common/BearerToken.d.ts.map +0 -1
  97. package/dist/rest/types/common/BearerToken.js +0 -2
  98. package/dist/rest/types/common/BearerToken.js.map +0 -1
  99. package/dist/rest/types/common/RestPathParams.d.ts +0 -2
  100. package/dist/rest/types/common/RestPathParams.d.ts.map +0 -1
  101. package/dist/rest/types/common/RestPathParams.js +0 -2
  102. package/dist/rest/types/common/RestPathParams.js.map +0 -1
  103. package/dist/rest/types/common/RestQueryParams.d.ts +0 -2
  104. package/dist/rest/types/common/RestQueryParams.d.ts.map +0 -1
  105. package/dist/rest/types/common/RestQueryParams.js +0 -2
  106. package/dist/rest/types/common/RestQueryParams.js.map +0 -1
  107. package/dist/rest/types/common/RestRequestBody.d.ts +0 -2
  108. package/dist/rest/types/common/RestRequestBody.d.ts.map +0 -1
  109. package/dist/rest/types/common/RestRequestBody.js +0 -2
  110. package/dist/rest/types/common/RestRequestBody.js.map +0 -1
  111. package/dist/rest/types/common/RestRequestHeaders.d.ts +0 -2
  112. package/dist/rest/types/common/RestRequestHeaders.d.ts.map +0 -1
  113. package/dist/rest/types/common/RestRequestHeaders.js +0 -2
  114. package/dist/rest/types/common/RestRequestHeaders.js.map +0 -1
  115. package/dist/rest/types/common/RestRequestHeadersWithAuthorization.d.ts +0 -8
  116. package/dist/rest/types/common/RestRequestHeadersWithAuthorization.d.ts.map +0 -1
  117. package/dist/rest/types/common/RestRequestHeadersWithAuthorization.js +0 -2
  118. package/dist/rest/types/common/RestRequestHeadersWithAuthorization.js.map +0 -1
  119. package/dist/rest/types/common/RestRequireAuthentication.d.ts +0 -2
  120. package/dist/rest/types/common/RestRequireAuthentication.d.ts.map +0 -1
  121. package/dist/rest/types/common/RestRequireAuthentication.js +0 -2
  122. package/dist/rest/types/common/RestRequireAuthentication.js.map +0 -1
  123. package/dist/rest/types/common/RestResponseBody.d.ts +0 -2
  124. package/dist/rest/types/common/RestResponseBody.d.ts.map +0 -1
  125. package/dist/rest/types/common/RestResponseBody.js +0 -2
  126. package/dist/rest/types/common/RestResponseBody.js.map +0 -1
  127. package/dist/rest/types/common/index.d.ts +0 -9
  128. package/dist/rest/types/common/index.d.ts.map +0 -1
  129. package/dist/rest/types/common/index.js.map +0 -1
  130. package/dist/rest/types/index.d.ts +0 -9
  131. package/dist/rest/types/index.d.ts.map +0 -1
  132. package/dist/rest/types/index.js.map +0 -1
  133. package/dist/rest/types/internal/InternalRestApiRequest.d.ts +0 -7
  134. package/dist/rest/types/internal/InternalRestApiRequest.d.ts.map +0 -1
  135. package/dist/rest/types/internal/InternalRestApiRequest.js +0 -2
  136. package/dist/rest/types/internal/InternalRestApiRequest.js.map +0 -1
  137. package/dist/rest/types/internal/index.d.ts +0 -3
  138. package/dist/rest/types/internal/index.d.ts.map +0 -1
  139. package/dist/rest/types/internal/index.js +0 -3
  140. package/dist/rest/types/internal/index.js.map +0 -1
  141. package/dist/types/OmitNever.d.ts +0 -4
  142. package/dist/types/OmitNever.d.ts.map +0 -1
  143. package/dist/types/OmitNever.js +0 -2
  144. package/dist/types/OmitNever.js.map +0 -1
  145. package/dist/ws/client/index.d.ts +0 -2
  146. package/dist/ws/client/index.d.ts.map +0 -1
  147. package/dist/ws/client/index.js +0 -2
  148. package/dist/ws/client/index.js.map +0 -1
  149. package/dist/ws/client/useWsApi.d.ts +0 -20
  150. package/dist/ws/client/useWsApi.d.ts.map +0 -1
  151. package/dist/ws/client/useWsApi.js +0 -59
  152. package/dist/ws/client/useWsApi.js.map +0 -1
  153. package/dist/ws/server/WsApi.d.ts +0 -8
  154. package/dist/ws/server/WsApi.d.ts.map +0 -1
  155. package/dist/ws/server/WsApi.js +0 -55
  156. package/dist/ws/server/WsApi.js.map +0 -1
  157. package/dist/ws/server/awsLambdaTrpcSubscriptionRequestHandler.d.ts +0 -7
  158. package/dist/ws/server/awsLambdaTrpcSubscriptionRequestHandler.d.ts.map +0 -1
  159. package/dist/ws/server/awsLambdaTrpcSubscriptionRequestHandler.js +0 -71
  160. package/dist/ws/server/awsLambdaTrpcSubscriptionRequestHandler.js.map +0 -1
  161. package/dist/ws/server/buildWsApiRouteHandler.d.ts +0 -3
  162. package/dist/ws/server/buildWsApiRouteHandler.d.ts.map +0 -1
  163. package/dist/ws/server/buildWsApiRouteHandler.js +0 -7
  164. package/dist/ws/server/buildWsApiRouteHandler.js.map +0 -1
  165. package/dist/ws/server/closeConnection.d.ts +0 -3
  166. package/dist/ws/server/closeConnection.d.ts.map +0 -1
  167. package/dist/ws/server/closeConnection.js +0 -13
  168. package/dist/ws/server/closeConnection.js.map +0 -1
  169. package/dist/ws/server/getApiGatewayManagementApiClient.d.ts +0 -3
  170. package/dist/ws/server/getApiGatewayManagementApiClient.d.ts.map +0 -1
  171. package/dist/ws/server/getApiGatewayManagementApiClient.js +0 -10
  172. package/dist/ws/server/getApiGatewayManagementApiClient.js.map +0 -1
  173. package/dist/ws/server/getConnection.d.ts +0 -4
  174. package/dist/ws/server/getConnection.d.ts.map +0 -1
  175. package/dist/ws/server/getConnection.js +0 -9
  176. package/dist/ws/server/getConnection.js.map +0 -1
  177. package/dist/ws/server/index.d.ts.map +0 -1
  178. package/dist/ws/server/index.js +0 -7
  179. package/dist/ws/server/index.js.map +0 -1
  180. package/dist/ws/server/sendResponse.d.ts +0 -3
  181. package/dist/ws/server/sendResponse.d.ts.map +0 -1
  182. package/dist/ws/server/sendResponse.js +0 -9
  183. package/dist/ws/server/sendResponse.js.map +0 -1
  184. package/dist/ws/types/WsApiConnection.d.ts +0 -5
  185. package/dist/ws/types/WsApiConnection.d.ts.map +0 -1
  186. package/dist/ws/types/WsApiConnection.js +0 -2
  187. package/dist/ws/types/WsApiConnection.js.map +0 -1
  188. package/dist/ws/types/WsApiRequestHandler.d.ts +0 -11
  189. package/dist/ws/types/WsApiRequestHandler.d.ts.map +0 -1
  190. package/dist/ws/types/WsApiRequestHandler.js +0 -2
  191. package/dist/ws/types/WsApiRequestHandler.js.map +0 -1
  192. package/dist/ws/types/WsApiRoute.d.ts +0 -9
  193. package/dist/ws/types/WsApiRoute.d.ts.map +0 -1
  194. package/dist/ws/types/WsApiRoute.js +0 -2
  195. package/dist/ws/types/WsApiRoute.js.map +0 -1
  196. package/dist/ws/types/WsApiRouteHandler.d.ts +0 -8
  197. package/dist/ws/types/WsApiRouteHandler.d.ts.map +0 -1
  198. package/dist/ws/types/WsApiRouteHandler.js +0 -2
  199. package/dist/ws/types/WsApiRouteHandler.js.map +0 -1
  200. package/dist/ws/types/common/WsApiAction.d.ts +0 -2
  201. package/dist/ws/types/common/WsApiAction.d.ts.map +0 -1
  202. package/dist/ws/types/common/WsApiAction.js +0 -2
  203. package/dist/ws/types/common/WsApiAction.js.map +0 -1
  204. package/dist/ws/types/common/WsApiRequest.d.ts +0 -5
  205. package/dist/ws/types/common/WsApiRequest.d.ts.map +0 -1
  206. package/dist/ws/types/common/WsApiRequest.js +0 -2
  207. package/dist/ws/types/common/WsApiRequest.js.map +0 -1
  208. package/dist/ws/types/common/WsApiResponse.d.ts +0 -2
  209. package/dist/ws/types/common/WsApiResponse.d.ts.map +0 -1
  210. package/dist/ws/types/common/WsApiResponse.js +0 -2
  211. package/dist/ws/types/common/WsApiResponse.js.map +0 -1
  212. package/dist/ws/types/common/index.d.ts +0 -4
  213. package/dist/ws/types/common/index.d.ts.map +0 -1
  214. package/dist/ws/types/common/index.js +0 -4
  215. package/dist/ws/types/common/index.js.map +0 -1
  216. package/dist/ws/types/index.d.ts +0 -6
  217. package/dist/ws/types/index.d.ts.map +0 -1
  218. package/dist/ws/types/index.js.map +0 -1
@@ -0,0 +1,75 @@
1
+ import {APIGatewayProxyEvent, APIGatewayProxyResult} from 'aws-lambda';
2
+ import {
3
+ WsApiAction,
4
+ WsApiConnection,
5
+ WsApiRequest,
6
+ WsApiRequestHandler,
7
+ WsApiResponse,
8
+ WsApiRouteHandler,
9
+ } from '../types';
10
+ import {closeConnection} from './closeConnection';
11
+ import {sendResponse} from './sendResponse';
12
+
13
+ export class WsApi {
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ private readonly routeHandlers: { [action: WsApiAction]: WsApiRequestHandler<any, any, any> } = {
16
+ '$connect': () => Promise.resolve(),
17
+ '$disconnect': () => Promise.resolve(),
18
+ };
19
+
20
+ addRouteHandler<
21
+ Action extends WsApiAction,
22
+ Request extends WsApiRequest<Action>,
23
+ Response extends WsApiResponse
24
+ >(routeHandler: WsApiRouteHandler<Action, Request, Response>) {
25
+ this.routeHandlers[routeHandler.route.action] = routeHandler.requestHandler;
26
+ return this;
27
+ }
28
+
29
+ async handleRequest(event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> {
30
+ const {connectionId, domainName, stage, eventType} = event.requestContext;
31
+
32
+ if (!eventType) throw 'No eventType';
33
+ if (!connectionId) throw 'No connectionId';
34
+ if (!domainName) throw 'No domainName';
35
+
36
+ let request: WsApiRequest<WsApiAction>;
37
+ switch (eventType) {
38
+ case 'CONNECT':
39
+ request = {action: '$connect'};
40
+ break;
41
+
42
+ case 'DISCONNECT':
43
+ request = {action: '$disconnect'};
44
+ break;
45
+
46
+ case 'MESSAGE':
47
+ if (!event.body) throw 'No body';
48
+ request = JSON.parse(event.body) as WsApiRequest<WsApiAction>;
49
+ break;
50
+
51
+ default:
52
+ throw `Unknown eventType ${eventType}`;
53
+ }
54
+
55
+ const endpoint = `https://${domainName}/${stage}`;
56
+ const connection: WsApiConnection = {endpoint, connectionId};
57
+
58
+ const requestHandler = this.routeHandlers[request.action];
59
+ if (!requestHandler) {
60
+ await closeConnection(connection);
61
+ throw `No requestHandler found for action ${request.action}`;
62
+ }
63
+
64
+ await requestHandler(request, {
65
+ connection,
66
+ sendResponse: async (response) => await sendResponse(connection, response),
67
+ closeConnection: async () => await closeConnection(connection),
68
+ });
69
+
70
+ return {
71
+ statusCode: 200,
72
+ body: '',
73
+ };
74
+ }
75
+ }
@@ -0,0 +1,15 @@
1
+ import {WsApiAction, WsApiRequest, WsApiRequestHandler, WsApiResponse, WsApiRoute, WsApiRouteHandler} from '../types';
2
+
3
+ export const buildWsApiRouteHandler = <
4
+ Action extends WsApiAction,
5
+ Request extends WsApiRequest<Action>,
6
+ Response extends WsApiResponse
7
+ >(
8
+ route: WsApiRoute<Action, Request, Response>,
9
+ requestHandler: WsApiRequestHandler<Action, Request, Response>,
10
+ ): WsApiRouteHandler<Action, Request, Response> => {
11
+ return {
12
+ route,
13
+ requestHandler,
14
+ };
15
+ };
@@ -0,0 +1,16 @@
1
+ import {DeleteConnectionCommand} from '@aws-sdk/client-apigatewaymanagementapi';
2
+ import {WsApiConnection} from '../types';
3
+ import {getApiGatewayManagementApiClient} from './getApiGatewayManagementApiClient';
4
+
5
+ export const closeConnection = async ({endpoint, connectionId}: WsApiConnection) => {
6
+ try {
7
+ await getApiGatewayManagementApiClient(endpoint).send(
8
+ new DeleteConnectionCommand({ConnectionId: connectionId}),
9
+ );
10
+ } catch (err) {
11
+ if (err && typeof err === 'object' && 'name' in err && err?.name === 'GoneException')
12
+ return;
13
+
14
+ throw err;
15
+ }
16
+ };
@@ -0,0 +1,11 @@
1
+ import {ApiGatewayManagementApiClient} from '@aws-sdk/client-apigatewaymanagementapi';
2
+
3
+ const clients: { [endpoint: string]: ApiGatewayManagementApiClient } = {};
4
+ export const getApiGatewayManagementApiClient = (endpoint: string): ApiGatewayManagementApiClient => {
5
+ if (clients[endpoint])
6
+ return clients[endpoint];
7
+
8
+ const client = new ApiGatewayManagementApiClient({endpoint});
9
+ clients[endpoint] = client;
10
+ return client;
11
+ };
@@ -0,0 +1,12 @@
1
+ import {APIGatewayProxyEvent} from 'aws-lambda';
2
+ import {WsApiConnection} from '../types';
3
+
4
+ export const getConnection = (event: APIGatewayProxyEvent): WsApiConnection => {
5
+ if (!event.requestContext.connectionId)
6
+ throw 'no connectionId';
7
+
8
+ return {
9
+ endpoint: `https://${event.requestContext.domainName}/${event.requestContext.stage}`,
10
+ connectionId: event.requestContext.connectionId,
11
+ };
12
+ };
@@ -1,7 +1,8 @@
1
- export * from './awsLambdaTrpcSubscriptionRequestHandler';
1
+ export * from './trpc/TrpcSubscriptionRequest';
2
+ export * from './trpc/TrpcSubscriptionResponse';
3
+ export * from './trpc/awsLambdaTrpcSubscriptionRequestHandler';
2
4
  export * from './buildWsApiRouteHandler';
3
5
  export * from './closeConnection';
4
6
  export * from './getConnection';
5
7
  export * from './sendResponse';
6
8
  export * from './WsApi';
7
- //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,17 @@
1
+ import {PostToConnectionCommand} from '@aws-sdk/client-apigatewaymanagementapi';
2
+ import {WsApiConnection, WsApiResponse} from '../types';
3
+ import {getApiGatewayManagementApiClient} from './getApiGatewayManagementApiClient';
4
+
5
+ export const sendResponse = async <
6
+ Response extends WsApiResponse
7
+ >({
8
+ endpoint,
9
+ connectionId,
10
+ }: WsApiConnection, response: Response): Promise<void> => {
11
+ await getApiGatewayManagementApiClient(endpoint).send(
12
+ new PostToConnectionCommand({
13
+ ConnectionId: connectionId,
14
+ Data: JSON.stringify(response),
15
+ }),
16
+ );
17
+ };
@@ -0,0 +1,8 @@
1
+ export type TrpcSubscriptionRequest<Input = unknown> = {
2
+ id: number | string
3
+ method: 'subscription'
4
+ params: { path: string, input?: Input }
5
+ } | {
6
+ id: number | string
7
+ method: 'subscription.stop'
8
+ }
@@ -0,0 +1,8 @@
1
+ export type TrpcSubscriptionResponse<Data = unknown> = {
2
+ id: number | string;
3
+ result: (
4
+ | { type: 'data', data: Data }
5
+ | { type: 'started' }
6
+ | { type: 'stopped' }
7
+ )
8
+ }
@@ -0,0 +1,105 @@
1
+ import {PostToConnectionCommand} from '@aws-sdk/client-apigatewaymanagementapi';
2
+ import {AnyTRPCRouter, callTRPCProcedure} from '@trpc/server';
3
+ import type {APIGatewayResult} from '@trpc/server/adapters/aws-lambda';
4
+ import type {Observable} from '@trpc/server/observable';
5
+ import {APIGatewayProxyEvent} from 'aws-lambda';
6
+ import {getApiGatewayManagementApiClient} from '../getApiGatewayManagementApiClient';
7
+ import {getConnection} from '../getConnection';
8
+ import {TrpcSubscriptionRequest} from './TrpcSubscriptionRequest';
9
+ import {TrpcSubscriptionResponse} from './TrpcSubscriptionResponse';
10
+
11
+ export const awsLambdaTrpcSubscriptionRequestHandler = <Router extends AnyTRPCRouter>(opts: {
12
+ router: Router
13
+ }) => {
14
+ const {router} = opts;
15
+
16
+ return async (event: APIGatewayProxyEvent): Promise<APIGatewayResult> => {
17
+ const connection = getConnection(event);
18
+
19
+ if (!event.body || event.body === '[]')
20
+ return {statusCode: 200, body: ''};
21
+
22
+ const request = (JSON.parse(event.body) as TrpcSubscriptionRequest);
23
+
24
+ const sendMessage = async (response: TrpcSubscriptionResponse) => {
25
+ await getApiGatewayManagementApiClient(connection.endpoint).send(
26
+ new PostToConnectionCommand({
27
+ ConnectionId: connection.connectionId,
28
+ Data: JSON.stringify(response),
29
+ }),
30
+ );
31
+ };
32
+ const stopConnection = async (): Promise<void> => {
33
+ await sendMessage({
34
+ id: request.id,
35
+ result: {type: 'stopped'},
36
+ });
37
+ };
38
+
39
+ try {
40
+ if (request.method === 'subscription.stop') {
41
+ await stopConnection();
42
+ }
43
+
44
+ if (request.method === 'subscription') {
45
+ await sendMessage({
46
+ id: request.id,
47
+ result: {type: 'started'},
48
+ });
49
+
50
+ const sub = (await callTRPCProcedure({
51
+ procedures: router._def.procedures,
52
+ path: request.params.path,
53
+ type: 'subscription',
54
+ ctx: {},
55
+ getRawInput: async () => request.params.input,
56
+ })) as Observable<unknown, unknown>;
57
+
58
+ const messageQueue: TrpcSubscriptionResponse[] = [];
59
+ sub.subscribe({
60
+ next: (data: unknown) => {
61
+ messageQueue.push({
62
+ id: request.id,
63
+ result: {
64
+ type: 'data',
65
+ data: data,
66
+ },
67
+ });
68
+ },
69
+ error: (err) => {
70
+ console.error(err);
71
+ messageQueue.push({
72
+ id: request.id,
73
+ result: {type: 'stopped'},
74
+ });
75
+ },
76
+ complete: () => {
77
+ messageQueue.push({
78
+ id: request.id,
79
+ result: {type: 'stopped'},
80
+ });
81
+ },
82
+ });
83
+
84
+ let stopped = false;
85
+ while (!stopped) {
86
+ const message = messageQueue.shift();
87
+ if (!message)
88
+ continue;
89
+
90
+ await sendMessage(message);
91
+
92
+ stopped = message.result.type === 'stopped';
93
+ }
94
+ }
95
+ } catch (err) {
96
+ console.error(err);
97
+ await stopConnection()
98
+ }
99
+
100
+ return {
101
+ statusCode: 200,
102
+ body: '',
103
+ };
104
+ };
105
+ };
@@ -0,0 +1,4 @@
1
+ export type WsApiConnection = {
2
+ endpoint: string
3
+ connectionId: string
4
+ }
@@ -0,0 +1,15 @@
1
+ import {OmitNever} from '../../types/OmitNever';
2
+ import {WsApiConnection} from './WsApiConnection';
3
+ import {WsApiAction, WsApiRequest, WsApiResponse} from './common';
4
+
5
+ export type WsApiRequestHandler<
6
+ Action extends WsApiAction,
7
+ Request extends WsApiRequest<Action>,
8
+ Response extends WsApiResponse,
9
+ > = (request: Request & { action: Action }, responseActions: OmitNever<{
10
+ connection: WsApiConnection
11
+ sendResponse: [Response] extends [never] ? never : (response: Response) => Promise<void>
12
+ closeConnection: () => Promise<void>
13
+ }>) => Promise<void>;
14
+
15
+
@@ -0,0 +1,17 @@
1
+ import {WsApiAction, WsApiRequest, WsApiResponse} from './common';
2
+
3
+ export type WsApiRoute<
4
+ Action extends WsApiAction,
5
+ Request extends WsApiRequest<Action>,
6
+ Response extends WsApiResponse,
7
+ > = {
8
+ action: Action
9
+
10
+ // this is a workaround to force optional generics to be typesafe
11
+ __types?: {
12
+ Request: Request
13
+ Response: Response
14
+ };
15
+ };
16
+
17
+
@@ -0,0 +1,14 @@
1
+ import {WsApiRequestHandler} from './WsApiRequestHandler';
2
+ import {WsApiRoute} from './WsApiRoute';
3
+ import {WsApiAction, WsApiRequest, WsApiResponse} from './common';
4
+
5
+ export type WsApiRouteHandler<
6
+ Action extends WsApiAction,
7
+ Request extends WsApiRequest<Action>,
8
+ Response extends WsApiResponse,
9
+ > = {
10
+ route: WsApiRoute<Action, Request, Response>,
11
+ requestHandler: WsApiRequestHandler<Action, Request, Response>
12
+ }
13
+
14
+
@@ -0,0 +1 @@
1
+ export type WsApiAction = '$connect' | '$disconnect' | string
@@ -0,0 +1,3 @@
1
+ import {WsApiAction} from './WsApiAction';
2
+
3
+ export type WsApiRequest<Action extends WsApiAction> = { action: Action }
@@ -0,0 +1 @@
1
+ export type WsApiResponse = object | never
@@ -0,0 +1,3 @@
1
+ export * from './WsApiRequest'
2
+ export * from './WsApiResponse'
3
+ export * from './WsApiAction'
@@ -3,4 +3,3 @@ export * from './WsApiConnection';
3
3
  export * from './WsApiRequestHandler';
4
4
  export * from './WsApiRoute';
5
5
  export * from './WsApiRouteHandler';
6
- //# sourceMappingURL=index.js.map
@@ -1,4 +0,0 @@
1
- import { RestApiRequest, RestApiRoute, RestPathParams, RestQueryParams, RestRequestBody, RestRequestHeaders, RestRequestHeadersWithAuthorization, RestRequireAuthentication, RestResponseBody } from '../types';
2
- import { OmitNever } from '../types/internal';
3
- export declare function fetchRestApi<PathParams extends RestPathParams, QueryParams extends RestQueryParams, RequestHeaders extends RestRequestHeaders, RequestBody extends RestRequestBody, ResponseBody extends RestResponseBody, RequireAuthentication extends RestRequireAuthentication>(restApiUrl: string, route: RestApiRoute<PathParams, QueryParams, RequestHeaders, RequestBody, ResponseBody, RequireAuthentication>, request: OmitNever<RestApiRequest<PathParams, QueryParams, RestRequestHeadersWithAuthorization<RequestHeaders, RequireAuthentication>, RequestBody>>): Promise<ResponseBody>;
4
- //# sourceMappingURL=fetchRestApi.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetchRestApi.d.ts","sourceRoot":"","sources":["../../../src/rest/client/fetchRestApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,YAAY,EACZ,cAAc,EACd,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,mCAAmC,EACnC,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAG5C,wBAAsB,YAAY,CAC9B,UAAU,SAAS,cAAc,EACjC,WAAW,SAAS,eAAe,EACnC,cAAc,SAAS,kBAAkB,EACzC,WAAW,SAAS,eAAe,EACnC,YAAY,SAAS,gBAAgB,EACrC,qBAAqB,SAAS,yBAAyB,EACvD,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,YAAY,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,qBAAqB,CAAC,EAC9G,OAAO,EAAE,SAAS,CAAC,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,mCAAmC,CAAC,cAAc,EAAE,qBAAqB,CAAC,EAAE,WAAW,CAAC,CAAC,GACrJ,OAAO,CAAC,YAAY,CAAC,CAsBvB"}
@@ -1,19 +0,0 @@
1
- export async function fetchRestApi(restApiUrl, route, request) {
2
- const pathParams = 'pathParams' in request ? request.pathParams : undefined;
3
- const queryParams = 'queryParams' in request ? request.queryParams : undefined;
4
- const headers = 'headers' in request ? request.headers : undefined;
5
- const body = 'body' in request ? request.body : undefined;
6
- const url = `${restApiUrl}${route.buildUrl(pathParams, queryParams)}`;
7
- const response = await fetch(url, {
8
- method: route.method,
9
- headers: headers,
10
- body: body ? JSON.stringify(body) : null,
11
- });
12
- if (!response.ok && response.status !== 404)
13
- throw `Request ${route.method} ${url} failed`;
14
- const text = (await response.text()).trim();
15
- return response.ok && response.status !== 204
16
- ? text ? JSON.parse(text) : null
17
- : null;
18
- }
19
- //# sourceMappingURL=fetchRestApi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetchRestApi.js","sourceRoot":"","sources":["../../../src/rest/client/fetchRestApi.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,KAAK,UAAU,YAAY,CAO9B,UAAkB,EAClB,KAA8G,EAC9G,OAAoJ;IAEtJ,MAAM,UAAU,GAAG,YAAY,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAwB,CAAC,CAAC,CAAC,SAAkB,CAAC;IACnG,MAAM,WAAW,GAAG,aAAa,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,WAA0B,CAAC,CAAC,CAAC,SAAkB,CAAC;IACvG,MAAM,OAAO,GAAG,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAyB,CAAC,CAAC,CAAC,SAAkB,CAAC;IAC9F,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAmB,CAAC,CAAC,CAAC,SAAkB,CAAC;IAElF,MAAM,GAAG,GAAG,GAAG,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;IACtE,MAAM,QAAQ,GAAG,MAAM,KAAK,CACxB,GAAG,EACH;QACE,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;KACzC,CAAC,CAAC;IAEP,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QACzC,MAAM,WAAW,KAAK,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC;IAEhD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,OAAO,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QACzC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;QAChC,CAAC,CAAC,IAAI,CAAC;AACb,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from './fetchRestApi';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rest/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA"}
@@ -1,2 +0,0 @@
1
- export * from './fetchRestApi';
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rest/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA"}
@@ -1,13 +0,0 @@
1
- import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';
2
- import { RestApiRouteHandler, RestPathParams, RestQueryParams, RestRequestBody, RestRequestHeaders, RestRequireAuthentication, RestResponseBody } from '../types';
3
- export type AnyRestApiRouteHandler = RestApiRouteHandler<RestPathParams, RestQueryParams, RestRequestHeaders, RestRequestBody, RestResponseBody, RestRequireAuthentication>;
4
- export declare class RestApi {
5
- private routeHandlers;
6
- addRouteHandler<PathParams extends RestPathParams, QueryParams extends RestQueryParams, RequestHeaders extends RestRequestHeaders, RequestBody extends RestRequestBody, ResponseBody extends RestResponseBody, RequireAuthentication extends RestRequireAuthentication>(routeHandler: RestApiRouteHandler<PathParams, QueryParams, RequestHeaders, RequestBody, ResponseBody, RequireAuthentication>): this;
7
- handleRequest(proxyEvent: APIGatewayProxyEvent, onError?: (error: unknown) => Promise<void>): Promise<APIGatewayProxyResult>;
8
- private getMatchingRouteHandlers;
9
- private getMatchingRouteHandler;
10
- private extractPathParams;
11
- private extractQueryParams;
12
- }
13
- //# sourceMappingURL=RestApi.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RestApi.d.ts","sourceRoot":"","sources":["../../../src/rest/server/RestApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAE,qBAAqB,EAAC,MAAM,YAAY,CAAC;AAGvE,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAUlB,MAAM,MAAM,sBAAsB,GAAG,mBAAmB,CACpD,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,yBAAyB,CAC5B,CAAA;AAOD,qBAAa,OAAO;IAClB,OAAO,CAAC,aAAa,CAAgC;IAErD,eAAe,CACX,UAAU,SAAS,cAAc,EACjC,WAAW,SAAS,eAAe,EACnC,cAAc,SAAS,kBAAkB,EACzC,WAAW,SAAS,eAAe,EACnC,YAAY,SAAS,gBAAgB,EACrC,qBAAqB,SAAS,yBAAyB,EACvD,YAAY,EAAE,mBAAmB,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,qBAAqB,CAAC;IAK1H,aAAa,CAAC,UAAU,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAwDlI,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,kBAAkB;CAc3B"}
@@ -1,101 +0,0 @@
1
- import { URL } from 'node:url';
2
- import { match } from 'path-to-regexp';
3
- const DEFAULT_RESPONSE_HEADERS = {
4
- 'Content-Type': 'application/json; charset=utf-8',
5
- 'Access-Control-Allow-Origin': '*',
6
- 'Access-Control-Allow-Methods': '*',
7
- 'Access-Control-Allow-Headers': '*',
8
- };
9
- export class RestApi {
10
- routeHandlers = [];
11
- addRouteHandler(routeHandler) {
12
- this.routeHandlers = [...this.routeHandlers, routeHandler];
13
- return this;
14
- }
15
- async handleRequest(proxyEvent, onError) {
16
- try {
17
- const url = new URL(`${proxyEvent.headers?.['origin'] || 'https://no-origin'}${proxyEvent.path}`);
18
- const routeHandler = this.getMatchingRouteHandler(url, proxyEvent.httpMethod);
19
- if (!routeHandler && proxyEvent.httpMethod === 'OPTIONS') {
20
- const allowedHttpMethods = this.getMatchingRouteHandlers(url).map(({ routeHandler }) => routeHandler.route.method);
21
- return {
22
- statusCode: 200,
23
- body: '',
24
- headers: {
25
- ...DEFAULT_RESPONSE_HEADERS,
26
- 'Access-Control-Allow-Methods': allowedHttpMethods.join(','),
27
- },
28
- };
29
- }
30
- if (!routeHandler)
31
- return {
32
- statusCode: 405,
33
- headers: DEFAULT_RESPONSE_HEADERS,
34
- body: `Method ${proxyEvent.httpMethod} not allowed on ${proxyEvent.path}`,
35
- };
36
- const { routeHandler: { requestHandler, route }, pathParams } = routeHandler;
37
- const userId = proxyEvent.requestContext.authorizer?.principalId;
38
- if (route.requireAuthentication && !userId)
39
- return { statusCode: 401, body: '' };
40
- const responseBody = await requestHandler({
41
- pathParams,
42
- queryParams: this.extractQueryParams(proxyEvent),
43
- headers: proxyEvent.headers,
44
- body: proxyEvent.body && JSON.parse(proxyEvent.body),
45
- userId,
46
- });
47
- return {
48
- statusCode: responseBody.status,
49
- body: responseBody.body ? JSON.stringify(responseBody.body) : '',
50
- headers: {
51
- ...DEFAULT_RESPONSE_HEADERS,
52
- ...(responseBody.headers || {}),
53
- },
54
- };
55
- }
56
- catch (error) {
57
- if (onError)
58
- await onError(error);
59
- console.error(error);
60
- return {
61
- statusCode: 500,
62
- headers: DEFAULT_RESPONSE_HEADERS,
63
- body: JSON.stringify({ error }),
64
- };
65
- }
66
- }
67
- getMatchingRouteHandlers(url) {
68
- return this.routeHandlers.reduce((matchingRouteHandlers, routeHandler) => {
69
- const pathParams = this.extractPathParams(routeHandler, url);
70
- const matchingRouteHandler = {
71
- routeHandler,
72
- pathParams,
73
- };
74
- return pathParams
75
- ? [...matchingRouteHandlers, matchingRouteHandler]
76
- : matchingRouteHandlers;
77
- }, []);
78
- }
79
- getMatchingRouteHandler(url, httpMethod) {
80
- return this.getMatchingRouteHandlers(url)
81
- .find(({ routeHandler }) => routeHandler.route.method === httpMethod);
82
- }
83
- extractPathParams(routeHandler, url) {
84
- const matcher = match(routeHandler.route.path, { decode: decodeURIComponent });
85
- return (matcher(url.pathname) || null)?.params;
86
- }
87
- extractQueryParams(proxyEvent) {
88
- const keys = new Set([
89
- ...Object.keys(proxyEvent.queryStringParameters || {}),
90
- ...Object.keys(proxyEvent.multiValueQueryStringParameters || {}),
91
- ]);
92
- const queryParams = {};
93
- for (const key of keys.values()) {
94
- const singleValue = proxyEvent.queryStringParameters?.[key];
95
- const multiValues = proxyEvent.multiValueQueryStringParameters?.[key] || [];
96
- queryParams[key] = multiValues.length > 1 ? multiValues : singleValue;
97
- }
98
- return queryParams;
99
- }
100
- }
101
- //# sourceMappingURL=RestApi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RestApi.js","sourceRoot":"","sources":["../../../src/rest/server/RestApi.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { RestApiRequestHandler, RestApiRoute, RestApiRouteHandler, RestResponseBody } from '../types';
2
- export declare const buildRestApiRouteHandler: <PathParams extends object = never, QueryParams extends object = never, RequestHeaders extends Record<string, string> = never, RequestBody extends object = never, ResponseBody extends RestResponseBody = never, RequireAuthentication extends boolean = false>(route: RestApiRoute<PathParams, QueryParams, RequestHeaders, RequestBody, ResponseBody, RequireAuthentication>, requestHandler: RestApiRequestHandler<PathParams, QueryParams, RequestHeaders, RequestBody, ResponseBody, RequireAuthentication>) => RestApiRouteHandler<PathParams, QueryParams, RequestHeaders, RequestBody, ResponseBody, RequireAuthentication>;
3
- //# sourceMappingURL=buildRestApiRouteHandler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"buildRestApiRouteHandler.d.ts","sourceRoot":"","sources":["../../../src/rest/server/buildRestApiRouteHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,mBAAmB,EAMnB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,wBAAwB,0QAQ1B,aAAa,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,qBAAqB,CAAC,kBAC9F,sBAAsB,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,qBAAqB,CAAC,KACjI,oBAAoB,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,qBAAqB,CAG9G,CAAC"}
@@ -1,5 +0,0 @@
1
- export const buildRestApiRouteHandler = (route, requestHandler) => ({
2
- route,
3
- requestHandler,
4
- });
5
- //# sourceMappingURL=buildRestApiRouteHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"buildRestApiRouteHandler.js","sourceRoot":"","sources":["../../../src/rest/server/buildRestApiRouteHandler.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAQpC,KAA8G,EAC9G,cAAgI,EAClB,EAAE,CAAC,CAAC;IACpH,KAAK;IACL,cAAc;CACf,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- export * from './buildRestApiRouteHandler';
2
- export * from './RestApi';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rest/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,WAAW,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rest/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,WAAW,CAAC"}
@@ -1,9 +0,0 @@
1
- import { RestPathParams, RestQueryParams, RestRequestBody, RestRequestHeaders } from './common';
2
- import { OmitNever } from './internal';
3
- export type RestApiRequest<PathParams extends RestPathParams = never, QueryParams extends RestQueryParams = never, RequestHeaders extends RestRequestHeaders = never, RequestBody extends RestRequestBody = never> = OmitNever<{
4
- pathParams: PathParams;
5
- queryParams: QueryParams;
6
- headers: RequestHeaders;
7
- body: RequestBody;
8
- }>;
9
- //# sourceMappingURL=RestApiRequest.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RestApiRequest.d.ts","sourceRoot":"","sources":["../../../src/rest/types/RestApiRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAC,MAAM,UAAU,CAAC;AAC9F,OAAO,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AAErC,MAAM,MAAM,cAAc,CACtB,UAAU,SAAS,cAAc,GAAG,KAAK,EACzC,WAAW,SAAS,eAAe,GAAG,KAAK,EAC3C,cAAc,SAAS,kBAAkB,GAAG,KAAK,EACjD,WAAW,SAAS,eAAe,GAAG,KAAK,IAAI,SAAS,CAAC;IAC3D,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,WAAW,CAAA;CAClB,CAAC,CAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=RestApiRequest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RestApiRequest.js","sourceRoot":"","sources":["../../../src/rest/types/RestApiRequest.ts"],"names":[],"mappings":""}
@@ -1,5 +0,0 @@
1
- import { RestApiResponse } from './RestApiResponse';
2
- import { RestPathParams, RestQueryParams, RestRequestBody, RestRequestHeaders, RestRequireAuthentication, RestResponseBody } from './common';
3
- import { InternalRestApiRequest } from './internal';
4
- export type RestApiRequestHandler<PathParams extends RestPathParams = never, QueryParams extends RestQueryParams = never, RequestHeaders extends RestRequestHeaders = never, RequestBody extends RestRequestBody = never, ResponseBody extends RestResponseBody = never, RequireAuthentication extends RestRequireAuthentication = false> = (request: InternalRestApiRequest<PathParams, QueryParams, RequestHeaders, RequestBody, RequireAuthentication>) => Promise<RestApiResponse<ResponseBody>>;
5
- //# sourceMappingURL=RestApiRequestHandler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RestApiRequestHandler.d.ts","sourceRoot":"","sources":["../../../src/rest/types/RestApiRequestHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAC,sBAAsB,EAAC,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,qBAAqB,CAC7B,UAAU,SAAS,cAAc,GAAG,KAAK,EACzC,WAAW,SAAS,eAAe,GAAG,KAAK,EAC3C,cAAc,SAAS,kBAAkB,GAAG,KAAK,EACjD,WAAW,SAAS,eAAe,GAAG,KAAK,EAC3C,YAAY,SAAS,gBAAgB,GAAG,KAAK,EAC7C,qBAAqB,SAAS,yBAAyB,GAAG,KAAK,IAC/D,CAAC,OAAO,EAAE,sBAAsB,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,qBAAqB,CAAC,KAAK,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=RestApiRequestHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RestApiRequestHandler.js","sourceRoot":"","sources":["../../../src/rest/types/RestApiRequestHandler.ts"],"names":[],"mappings":""}
@@ -1,4 +0,0 @@
1
- import { RestApiRequestHandler } from './RestApiRequestHandler';
2
- import { RestPathParams, RestQueryParams, RestRequestBody, RestRequestHeaders, RestResponseBody } from './common';
3
- export type RestApiRequestHandlerWithAuthentication<PathParams extends RestPathParams = never, QueryParams extends RestQueryParams = never, RequestHeaders extends RestRequestHeaders = never, RequestBody extends RestRequestBody = never, ResponseBody extends RestResponseBody = never> = RestApiRequestHandler<PathParams, QueryParams, RequestHeaders, RequestBody, ResponseBody, true>;
4
- //# sourceMappingURL=RestApiRequestHandlerWithAuthentication.d.ts.map