@mstuercke/api-utils 4.3.1 → 5.0.1
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/package.json +19 -22
- package/src/rest/client/fetchRestApi.ts +47 -0
- package/src/rest/client/index.ts +1 -0
- package/src/rest/server/RestApi.ts +144 -0
- package/src/rest/server/buildRestApiRouteHandler.ts +26 -0
- package/{dist/rest/server/index.js → src/rest/server/index.ts} +0 -1
- package/src/rest/types/RestApiRequest.ts +14 -0
- package/src/rest/types/RestApiRequestHandler.ts +21 -0
- package/src/rest/types/RestApiRequestHandlerWithAuthentication.ts +12 -0
- package/src/rest/types/RestApiResponse.ts +5 -0
- package/src/rest/types/RestApiRoute.ts +34 -0
- package/src/rest/types/RestApiRouteHandler.ts +22 -0
- package/src/rest/types/RestApiRouteWithAuthentication.ts +12 -0
- package/src/rest/types/common/BearerToken.ts +1 -0
- package/src/rest/types/common/RestPathParams.ts +1 -0
- package/src/rest/types/common/RestQueryParams.ts +1 -0
- package/src/rest/types/common/RestRequestBody.ts +1 -0
- package/src/rest/types/common/RestRequestHeaders.ts +1 -0
- package/src/rest/types/common/RestRequestHeadersWithAuthorization.ts +11 -0
- package/src/rest/types/common/RestRequireAuthentication.ts +1 -0
- package/src/rest/types/common/RestResponseBody.ts +1 -0
- package/{dist/rest/types/common/index.js → src/rest/types/common/index.ts} +0 -1
- package/{dist/rest/types/index.js → src/rest/types/index.ts} +0 -1
- package/src/rest/types/internal/InternalRestApiRequest.ts +19 -0
- package/src/rest/types/internal/index.ts +2 -0
- package/src/types/OmitNever.ts +1 -0
- package/src/ws/client/index.ts +1 -0
- package/src/ws/client/useWsApi.ts +88 -0
- package/src/ws/server/WsApi.ts +75 -0
- package/src/ws/server/buildWsApiRouteHandler.ts +15 -0
- package/src/ws/server/closeConnection.ts +16 -0
- package/src/ws/server/getApiGatewayManagementApiClient.ts +11 -0
- package/src/ws/server/getConnection.ts +12 -0
- package/{dist/ws/server/index.js → src/ws/server/index.ts} +0 -1
- package/src/ws/server/sendResponse.ts +17 -0
- package/src/ws/server/trpc/TrpcSubscriptionRequest.ts +8 -0
- package/src/ws/server/trpc/TrpcSubscriptionResponse.ts +8 -0
- package/src/ws/server/trpc/awsLambdaTrpcSubscriptionRequestHandler.ts +105 -0
- package/src/ws/types/WsApiConnection.ts +4 -0
- package/src/ws/types/WsApiRequestHandler.ts +15 -0
- package/src/ws/types/WsApiRoute.ts +17 -0
- package/src/ws/types/WsApiRouteHandler.ts +14 -0
- package/src/ws/types/common/WsApiAction.ts +1 -0
- package/src/ws/types/common/WsApiRequest.ts +3 -0
- package/src/ws/types/common/WsApiResponse.ts +1 -0
- package/src/ws/types/common/index.ts +3 -0
- package/{dist/ws/types/index.js → src/ws/types/index.ts} +0 -1
- package/dist/rest/client/fetchRestApi.d.ts +0 -4
- package/dist/rest/client/fetchRestApi.d.ts.map +0 -1
- package/dist/rest/client/fetchRestApi.js +0 -19
- package/dist/rest/client/fetchRestApi.js.map +0 -1
- package/dist/rest/client/index.d.ts +0 -2
- package/dist/rest/client/index.d.ts.map +0 -1
- package/dist/rest/client/index.js +0 -2
- package/dist/rest/client/index.js.map +0 -1
- package/dist/rest/server/RestApi.d.ts +0 -13
- package/dist/rest/server/RestApi.d.ts.map +0 -1
- package/dist/rest/server/RestApi.js +0 -101
- package/dist/rest/server/RestApi.js.map +0 -1
- package/dist/rest/server/buildRestApiRouteHandler.d.ts +0 -3
- package/dist/rest/server/buildRestApiRouteHandler.d.ts.map +0 -1
- package/dist/rest/server/buildRestApiRouteHandler.js +0 -5
- package/dist/rest/server/buildRestApiRouteHandler.js.map +0 -1
- package/dist/rest/server/index.d.ts +0 -3
- package/dist/rest/server/index.d.ts.map +0 -1
- package/dist/rest/server/index.js.map +0 -1
- package/dist/rest/types/RestApiRequest.d.ts +0 -9
- package/dist/rest/types/RestApiRequest.d.ts.map +0 -1
- package/dist/rest/types/RestApiRequest.js +0 -2
- package/dist/rest/types/RestApiRequest.js.map +0 -1
- package/dist/rest/types/RestApiRequestHandler.d.ts +0 -5
- package/dist/rest/types/RestApiRequestHandler.d.ts.map +0 -1
- package/dist/rest/types/RestApiRequestHandler.js +0 -2
- package/dist/rest/types/RestApiRequestHandler.js.map +0 -1
- package/dist/rest/types/RestApiRequestHandlerWithAuthentication.d.ts +0 -4
- package/dist/rest/types/RestApiRequestHandlerWithAuthentication.d.ts.map +0 -1
- package/dist/rest/types/RestApiRequestHandlerWithAuthentication.js +0 -2
- package/dist/rest/types/RestApiRequestHandlerWithAuthentication.js.map +0 -1
- package/dist/rest/types/RestApiResponse.d.ts +0 -6
- package/dist/rest/types/RestApiResponse.d.ts.map +0 -1
- package/dist/rest/types/RestApiResponse.js +0 -2
- package/dist/rest/types/RestApiResponse.js.map +0 -1
- package/dist/rest/types/RestApiRoute.d.ts +0 -15
- package/dist/rest/types/RestApiRoute.d.ts.map +0 -1
- package/dist/rest/types/RestApiRoute.js +0 -2
- package/dist/rest/types/RestApiRoute.js.map +0 -1
- package/dist/rest/types/RestApiRouteHandler.d.ts +0 -8
- package/dist/rest/types/RestApiRouteHandler.d.ts.map +0 -1
- package/dist/rest/types/RestApiRouteHandler.js +0 -2
- package/dist/rest/types/RestApiRouteHandler.js.map +0 -1
- package/dist/rest/types/RestApiRouteWithAuthentication.d.ts +0 -4
- package/dist/rest/types/RestApiRouteWithAuthentication.d.ts.map +0 -1
- package/dist/rest/types/RestApiRouteWithAuthentication.js +0 -2
- package/dist/rest/types/RestApiRouteWithAuthentication.js.map +0 -1
- package/dist/rest/types/common/BearerToken.d.ts +0 -2
- package/dist/rest/types/common/BearerToken.d.ts.map +0 -1
- package/dist/rest/types/common/BearerToken.js +0 -2
- package/dist/rest/types/common/BearerToken.js.map +0 -1
- package/dist/rest/types/common/RestPathParams.d.ts +0 -2
- package/dist/rest/types/common/RestPathParams.d.ts.map +0 -1
- package/dist/rest/types/common/RestPathParams.js +0 -2
- package/dist/rest/types/common/RestPathParams.js.map +0 -1
- package/dist/rest/types/common/RestQueryParams.d.ts +0 -2
- package/dist/rest/types/common/RestQueryParams.d.ts.map +0 -1
- package/dist/rest/types/common/RestQueryParams.js +0 -2
- package/dist/rest/types/common/RestQueryParams.js.map +0 -1
- package/dist/rest/types/common/RestRequestBody.d.ts +0 -2
- package/dist/rest/types/common/RestRequestBody.d.ts.map +0 -1
- package/dist/rest/types/common/RestRequestBody.js +0 -2
- package/dist/rest/types/common/RestRequestBody.js.map +0 -1
- package/dist/rest/types/common/RestRequestHeaders.d.ts +0 -2
- package/dist/rest/types/common/RestRequestHeaders.d.ts.map +0 -1
- package/dist/rest/types/common/RestRequestHeaders.js +0 -2
- package/dist/rest/types/common/RestRequestHeaders.js.map +0 -1
- package/dist/rest/types/common/RestRequestHeadersWithAuthorization.d.ts +0 -8
- package/dist/rest/types/common/RestRequestHeadersWithAuthorization.d.ts.map +0 -1
- package/dist/rest/types/common/RestRequestHeadersWithAuthorization.js +0 -2
- package/dist/rest/types/common/RestRequestHeadersWithAuthorization.js.map +0 -1
- package/dist/rest/types/common/RestRequireAuthentication.d.ts +0 -2
- package/dist/rest/types/common/RestRequireAuthentication.d.ts.map +0 -1
- package/dist/rest/types/common/RestRequireAuthentication.js +0 -2
- package/dist/rest/types/common/RestRequireAuthentication.js.map +0 -1
- package/dist/rest/types/common/RestResponseBody.d.ts +0 -2
- package/dist/rest/types/common/RestResponseBody.d.ts.map +0 -1
- package/dist/rest/types/common/RestResponseBody.js +0 -2
- package/dist/rest/types/common/RestResponseBody.js.map +0 -1
- package/dist/rest/types/common/index.d.ts +0 -9
- package/dist/rest/types/common/index.d.ts.map +0 -1
- package/dist/rest/types/common/index.js.map +0 -1
- package/dist/rest/types/index.d.ts +0 -9
- package/dist/rest/types/index.d.ts.map +0 -1
- package/dist/rest/types/index.js.map +0 -1
- package/dist/rest/types/internal/InternalRestApiRequest.d.ts +0 -7
- package/dist/rest/types/internal/InternalRestApiRequest.d.ts.map +0 -1
- package/dist/rest/types/internal/InternalRestApiRequest.js +0 -2
- package/dist/rest/types/internal/InternalRestApiRequest.js.map +0 -1
- package/dist/rest/types/internal/index.d.ts +0 -3
- package/dist/rest/types/internal/index.d.ts.map +0 -1
- package/dist/rest/types/internal/index.js +0 -3
- package/dist/rest/types/internal/index.js.map +0 -1
- package/dist/types/OmitNever.d.ts +0 -4
- package/dist/types/OmitNever.d.ts.map +0 -1
- package/dist/types/OmitNever.js +0 -2
- package/dist/types/OmitNever.js.map +0 -1
- package/dist/ws/client/index.d.ts +0 -2
- package/dist/ws/client/index.d.ts.map +0 -1
- package/dist/ws/client/index.js +0 -2
- package/dist/ws/client/index.js.map +0 -1
- package/dist/ws/client/useWsApi.d.ts +0 -20
- package/dist/ws/client/useWsApi.d.ts.map +0 -1
- package/dist/ws/client/useWsApi.js +0 -59
- package/dist/ws/client/useWsApi.js.map +0 -1
- package/dist/ws/server/WsApi.d.ts +0 -8
- package/dist/ws/server/WsApi.d.ts.map +0 -1
- package/dist/ws/server/WsApi.js +0 -55
- package/dist/ws/server/WsApi.js.map +0 -1
- package/dist/ws/server/buildWsApiRouteHandler.d.ts +0 -3
- package/dist/ws/server/buildWsApiRouteHandler.d.ts.map +0 -1
- package/dist/ws/server/buildWsApiRouteHandler.js +0 -7
- package/dist/ws/server/buildWsApiRouteHandler.js.map +0 -1
- package/dist/ws/server/closeConnection.d.ts +0 -3
- package/dist/ws/server/closeConnection.d.ts.map +0 -1
- package/dist/ws/server/closeConnection.js +0 -13
- package/dist/ws/server/closeConnection.js.map +0 -1
- package/dist/ws/server/getApiGatewayManagementApiClient.d.ts +0 -3
- package/dist/ws/server/getApiGatewayManagementApiClient.d.ts.map +0 -1
- package/dist/ws/server/getApiGatewayManagementApiClient.js +0 -10
- package/dist/ws/server/getApiGatewayManagementApiClient.js.map +0 -1
- package/dist/ws/server/getConnection.d.ts +0 -4
- package/dist/ws/server/getConnection.d.ts.map +0 -1
- package/dist/ws/server/getConnection.js +0 -9
- package/dist/ws/server/getConnection.js.map +0 -1
- package/dist/ws/server/index.d.ts +0 -9
- package/dist/ws/server/index.d.ts.map +0 -1
- package/dist/ws/server/index.js.map +0 -1
- package/dist/ws/server/sendResponse.d.ts +0 -3
- package/dist/ws/server/sendResponse.d.ts.map +0 -1
- package/dist/ws/server/sendResponse.js +0 -9
- package/dist/ws/server/sendResponse.js.map +0 -1
- package/dist/ws/server/trpc/TrpcSubscriptionRequest.d.ts +0 -12
- package/dist/ws/server/trpc/TrpcSubscriptionRequest.d.ts.map +0 -1
- package/dist/ws/server/trpc/TrpcSubscriptionRequest.js +0 -2
- package/dist/ws/server/trpc/TrpcSubscriptionRequest.js.map +0 -1
- package/dist/ws/server/trpc/TrpcSubscriptionResponse.d.ts +0 -12
- package/dist/ws/server/trpc/TrpcSubscriptionResponse.d.ts.map +0 -1
- package/dist/ws/server/trpc/TrpcSubscriptionResponse.js +0 -2
- package/dist/ws/server/trpc/TrpcSubscriptionResponse.js.map +0 -1
- package/dist/ws/server/trpc/awsLambdaTrpcSubscriptionRequestHandler.d.ts +0 -7
- package/dist/ws/server/trpc/awsLambdaTrpcSubscriptionRequestHandler.d.ts.map +0 -1
- package/dist/ws/server/trpc/awsLambdaTrpcSubscriptionRequestHandler.js +0 -85
- package/dist/ws/server/trpc/awsLambdaTrpcSubscriptionRequestHandler.js.map +0 -1
- package/dist/ws/types/WsApiConnection.d.ts +0 -5
- package/dist/ws/types/WsApiConnection.d.ts.map +0 -1
- package/dist/ws/types/WsApiConnection.js +0 -2
- package/dist/ws/types/WsApiConnection.js.map +0 -1
- package/dist/ws/types/WsApiRequestHandler.d.ts +0 -11
- package/dist/ws/types/WsApiRequestHandler.d.ts.map +0 -1
- package/dist/ws/types/WsApiRequestHandler.js +0 -2
- package/dist/ws/types/WsApiRequestHandler.js.map +0 -1
- package/dist/ws/types/WsApiRoute.d.ts +0 -9
- package/dist/ws/types/WsApiRoute.d.ts.map +0 -1
- package/dist/ws/types/WsApiRoute.js +0 -2
- package/dist/ws/types/WsApiRoute.js.map +0 -1
- package/dist/ws/types/WsApiRouteHandler.d.ts +0 -8
- package/dist/ws/types/WsApiRouteHandler.d.ts.map +0 -1
- package/dist/ws/types/WsApiRouteHandler.js +0 -2
- package/dist/ws/types/WsApiRouteHandler.js.map +0 -1
- package/dist/ws/types/common/WsApiAction.d.ts +0 -2
- package/dist/ws/types/common/WsApiAction.d.ts.map +0 -1
- package/dist/ws/types/common/WsApiAction.js +0 -2
- package/dist/ws/types/common/WsApiAction.js.map +0 -1
- package/dist/ws/types/common/WsApiRequest.d.ts +0 -5
- package/dist/ws/types/common/WsApiRequest.d.ts.map +0 -1
- package/dist/ws/types/common/WsApiRequest.js +0 -2
- package/dist/ws/types/common/WsApiRequest.js.map +0 -1
- package/dist/ws/types/common/WsApiResponse.d.ts +0 -2
- package/dist/ws/types/common/WsApiResponse.d.ts.map +0 -1
- package/dist/ws/types/common/WsApiResponse.js +0 -2
- package/dist/ws/types/common/WsApiResponse.js.map +0 -1
- package/dist/ws/types/common/index.d.ts +0 -4
- package/dist/ws/types/common/index.d.ts.map +0 -1
- package/dist/ws/types/common/index.js +0 -4
- package/dist/ws/types/common/index.js.map +0 -1
- package/dist/ws/types/index.d.ts +0 -6
- package/dist/ws/types/index.d.ts.map +0 -1
- 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
|
+
};
|
|
@@ -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,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,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 @@
|
|
|
1
|
+
export type WsApiResponse = object | never
|
|
@@ -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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rest/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA"}
|
|
@@ -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 +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 +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 +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 +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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RestApiRequestHandlerWithAuthentication.d.ts","sourceRoot":"","sources":["../../../src/rest/types/RestApiRequestHandlerWithAuthentication.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAC,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAEhH,MAAM,MAAM,uCAAuC,CAC/C,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,IAC7C,qBAAqB,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA"}
|