Skip to content

Commit fc9ba10

Browse files
authored
fix: update createRouter config (#106)
1 parent 0100968 commit fc9ba10

2 files changed

Lines changed: 109 additions & 9 deletions

File tree

packages/better-call/src/router.test.ts

Lines changed: 95 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -478,22 +478,26 @@ describe("error handling", () => {
478478
);
479479

480480
let errorCaught = false;
481+
let receivedRequest: Request | undefined;
481482
const customResponse = new Response("Custom error response", {
482483
status: 418,
483484
});
484485

485486
const router = createRouter(
486487
{ endpoint },
487488
{
488-
onError: (e) => {
489+
onError: (error, request) => {
489490
errorCaught = true;
491+
receivedRequest = request;
490492
return customResponse;
491493
},
492494
},
493495
);
494496

495-
const response = await router.handler(new Request("http://localhost"));
497+
const request = new Request("http://localhost");
498+
const response = await router.handler(request);
496499
expect(errorCaught).toBe(true);
500+
expect(receivedRequest).toBe(request);
497501
expect(response).toBe(customResponse);
498502
expect(response.status).toBe(418);
499503
});
@@ -517,7 +521,7 @@ describe("error handling", () => {
517521
const router = createRouter(
518522
{ endpoint },
519523
{
520-
onError: (e) => {
524+
onError: (error, request) => {
521525
errorCaught = true;
522526
// Convert APIError to Response
523527
return toResponse(apiError);
@@ -548,7 +552,7 @@ describe("error handling", () => {
548552
const router = createRouter(
549553
{ endpoint },
550554
{
551-
onError: (e) => {
555+
onError: (error, request) => {
552556
// Throw the error in the callback
553557
throw newError;
554558
},
@@ -930,6 +934,93 @@ describe("error handling", () => {
930934
});
931935
});
932936

937+
describe("onRequest and onResponse callbacks", () => {
938+
it("should pass request to onRequest callback", async () => {
939+
const endpoint = createEndpoint(
940+
"/",
941+
{
942+
method: "GET",
943+
},
944+
async () => {
945+
return "hello world";
946+
},
947+
);
948+
949+
let receivedRequest: Request | undefined;
950+
const router = createRouter(
951+
{ endpoint },
952+
{
953+
onRequest: (request) => {
954+
receivedRequest = request;
955+
},
956+
},
957+
);
958+
959+
const request = new Request("http://localhost");
960+
await router.handler(request);
961+
expect(receivedRequest).toBe(request);
962+
});
963+
964+
it("should pass response and request to onResponse callback", async () => {
965+
const endpoint = createEndpoint(
966+
"/",
967+
{
968+
method: "GET",
969+
},
970+
async () => {
971+
return "hello world";
972+
},
973+
);
974+
975+
let receivedResponse: Response | undefined;
976+
let receivedRequest: Request | undefined;
977+
const router = createRouter(
978+
{ endpoint },
979+
{
980+
onResponse: (response, request) => {
981+
receivedResponse = response;
982+
receivedRequest = request;
983+
},
984+
},
985+
);
986+
987+
const request = new Request("http://localhost");
988+
await router.handler(request);
989+
expect(receivedRequest).toBe(request);
990+
expect(receivedResponse).toBeInstanceOf(Response);
991+
});
992+
993+
it("should pass request to onError callback", async () => {
994+
const endpoint = createEndpoint(
995+
"/",
996+
{
997+
method: "GET",
998+
},
999+
async () => {
1000+
throw new Error("Test error");
1001+
},
1002+
);
1003+
1004+
let receivedError: unknown;
1005+
let receivedRequest: Request | undefined;
1006+
const router = createRouter(
1007+
{ endpoint },
1008+
{
1009+
onError: (error, request) => {
1010+
receivedError = error;
1011+
receivedRequest = request;
1012+
},
1013+
},
1014+
);
1015+
1016+
const request = new Request("http://localhost");
1017+
await router.handler(request);
1018+
expect(receivedRequest).toBe(request);
1019+
expect(receivedError).toBeInstanceOf(Error);
1020+
expect((receivedError as Error).message).toBe("Test error");
1021+
});
1022+
});
1023+
9331024
describe("base path", () => {
9341025
it("should work with base path", async () => {
9351026
const endpoint = createEndpoint(

packages/better-call/src/router.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import { getBody, isAPIError, isRequest } from "./utils";
1212

1313
export interface RouterConfig {
1414
throwError?: boolean;
15-
onError?: (e: unknown) => void | Promise<void> | Response | Promise<Response>;
1615
basePath?: string;
1716
routerMiddleware?: Array<{
1817
path: string;
@@ -27,11 +26,21 @@ export interface RouterConfig {
2726
/**
2827
* A callback to run before any response
2928
*/
30-
onResponse?: (res: Response) => any | Promise<any>;
29+
onResponse?: (response: Response, request: Request) => any | Promise<any>;
3130
/**
3231
* A callback to run before any request
3332
*/
34-
onRequest?: (req: Request) => any | Promise<any>;
33+
onRequest?: (request: Request) => any | Promise<any>;
34+
/**
35+
* A callback to run when an error is thrown in the router or middleware.
36+
*
37+
* @param error - the error that was thrown in the router or middleware.
38+
* @returns a Response object that will be returned to the client.
39+
*/
40+
onError?: (
41+
error: unknown,
42+
request: Request,
43+
) => void | Promise<void> | Response | Promise<Response>;
3544
/**
3645
* List of allowed media types (MIME types) for the router
3746
*
@@ -250,7 +259,7 @@ export const createRouter = <
250259
} catch (error) {
251260
if (config?.onError) {
252261
try {
253-
const errorResponse = await config.onError(error);
262+
const errorResponse = await config.onError(error, request);
254263

255264
if (errorResponse instanceof Response) {
256265
return toResponse(errorResponse);
@@ -288,7 +297,7 @@ export const createRouter = <
288297
}
289298
const req = isRequest(onReq) ? onReq : request;
290299
const res = await processRequest(req);
291-
const onRes = await config?.onResponse?.(res);
300+
const onRes = await config?.onResponse?.(res, req);
292301
if (onRes instanceof Response) {
293302
return onRes;
294303
}

0 commit comments

Comments
 (0)