Skip to content

Commit 423212c

Browse files
Merge pull request #97 from bitgopatmcl/make-response-encoder-return-express-middleware
feat: make response encoder return an express middleware
2 parents 66886e6 + 2449199 commit 423212c

File tree

2 files changed

+24
-26
lines changed

2 files changed

+24
-26
lines changed

packages/express-wrapper/src/request.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export const decodeRequestAndEncodeResponse = (
4545
): express.RequestHandler => {
4646
return createNamedFunction(
4747
'decodeRequestAndEncodeResponse' + httpRoute.method + apiName,
48-
async (req, res) => {
48+
async (req, res, next) => {
4949
const maybeRequest = httpRoute.request.decode(req);
5050
if (maybeRequest._tag === 'Left') {
5151
console.log('Request failed to decode');
@@ -63,10 +63,12 @@ export const decodeRequestAndEncodeResponse = (
6363
} catch (err) {
6464
console.warn('Error in route handler:', err);
6565
res.status(500).end();
66+
next();
6667
return;
6768
}
6869

69-
responseEncoder(httpRoute, rawResponse, res);
70+
const expressHandler = responseEncoder(httpRoute, rawResponse);
71+
expressHandler(req, res, next);
7072
},
7173
);
7274
};

packages/express-wrapper/src/response.ts

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,24 @@ export type NumericOrKeyedResponseType<R extends HttpRoute> =
2222
export type ResponseEncoder = (
2323
route: HttpRoute,
2424
serviceFnResponse: NumericOrKeyedResponseType<HttpRoute>,
25-
expressRes: express.Response,
26-
) => void;
25+
) => express.RequestHandler;
2726

28-
export const defaultResponseEncoder: ResponseEncoder = (
29-
route,
30-
serviceFnResponse,
31-
expressRes,
32-
) => {
33-
const { type, payload } = serviceFnResponse;
34-
const status = typeof type === 'number' ? type : (KeyToHttpStatus as any)[type];
35-
if (status === undefined) {
36-
console.warn('Unknown status code returned');
37-
expressRes.status(500).end();
38-
return;
39-
}
40-
const responseCodec = route.response[status];
41-
try {
42-
expressRes.status(status).json(responseCodec!.encode(payload)).end();
43-
} catch {
44-
console.warn(
45-
"Unable to encode route's return value, did you return the expected type?",
46-
);
47-
expressRes.status(500).end();
48-
}
49-
};
27+
export const defaultResponseEncoder: ResponseEncoder =
28+
(route, serviceFnResponse) => (_req, res) => {
29+
const { type, payload } = serviceFnResponse;
30+
const status = typeof type === 'number' ? type : (KeyToHttpStatus as any)[type];
31+
if (status === undefined) {
32+
console.warn('Unknown status code returned');
33+
res.status(500).end();
34+
return;
35+
}
36+
const responseCodec = route.response[status];
37+
try {
38+
res.status(status).json(responseCodec!.encode(payload)).end();
39+
} catch {
40+
console.warn(
41+
"Unable to encode route's return value, did you return the expected type?",
42+
);
43+
res.status(500).end();
44+
}
45+
};

0 commit comments

Comments
 (0)