Skip to content

Commit cf719cc

Browse files
committed
Refactor so that the mock handler object is created only once
1 parent 380c974 commit cf719cc

File tree

1 file changed

+17
-19
lines changed

1 file changed

+17
-19
lines changed

src/lambda.ts

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import inProcessRequestHandler from 'in-process-request';
33
import * as apigw from './types';
44
import eventToRequestOptions from './eventToRequestOptions'
55
import { inProcessResponseToLambdaResponse, errorResponse } from './response';
6+
import { MockRequestOptions, MockResponse } from 'in-process-request/dist/compile/httpMock';
67

78
declare namespace handler {
89
type APIGatewayEvent = apigw.APIGatewayEvent;
@@ -16,30 +17,27 @@ const eventWithMultiValueHeaders = (event: handler.APIGatewayEvent): boolean =>
1617
return event.multiValueHeaders !== null && typeof event.multiValueHeaders === 'object';
1718
}
1819

19-
const handlerPromise = (appPromiseFn: () => Promise<RequestListener>): handler.APIGatewayEventHandler => {
20-
let _p: Promise<RequestListener> | null = null;
20+
const processRequest = (app: Promise<RequestListener>): handler.APIGatewayEventHandler => {
21+
let appHandler: ((r: MockRequestOptions) => Promise<MockResponse>) | null = null;
2122
return async (event, ctx) => {
22-
if (!_p) {
23-
_p = appPromiseFn();
23+
if (!appHandler) {
24+
const resolvedApp = await app;
25+
appHandler = inProcessRequestHandler(resolvedApp);
26+
}
27+
try {
28+
const reqOptions = eventToRequestOptions(event, ctx);
29+
const mockResponse = await appHandler(reqOptions);
30+
return inProcessResponseToLambdaResponse(mockResponse, eventWithMultiValueHeaders(event));
31+
} catch (e) {
32+
console.error(e);
33+
return errorResponse();
2434
}
25-
const app = await _p;
26-
return processRequest(app, event, ctx);
2735
}
28-
}
36+
};
2937

30-
const processRequest = async (app: RequestListener, event: handler.APIGatewayEvent, ctx?: handler.LambdaContext): Promise<handler.LambdaResponse> => {
31-
try {
32-
const reqOptions = eventToRequestOptions(event, ctx);
33-
const appHandler = inProcessRequestHandler(app);
34-
const mockResponse = await appHandler(reqOptions);
35-
return inProcessResponseToLambdaResponse(mockResponse, eventWithMultiValueHeaders(event));
36-
} catch (e) {
37-
console.error(e);
38-
return errorResponse();
39-
}
40-
}
38+
const handlerPromise = (appPromiseFn: () => Promise<RequestListener>): handler.APIGatewayEventHandler => processRequest(appPromiseFn());
4139

42-
const handler = (app: RequestListener): handler.APIGatewayEventHandler => handlerPromise(async () => app);
40+
const handler = (app: RequestListener): handler.APIGatewayEventHandler => processRequest(Promise.resolve(app));
4341

4442
handler.deferred = handlerPromise;
4543

0 commit comments

Comments
 (0)