@divine-lab/request 1.0.4 → 1.1.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.
@@ -52,6 +52,12 @@ export declare const SERVER_ERRORS: {
52
52
  readonly title: "Conflict";
53
53
  readonly detail: "The request conflicts with the current state of the server.";
54
54
  };
55
+ readonly TOO_MANY_REQUESTS: {
56
+ readonly status: 429;
57
+ readonly type: "about:blank";
58
+ readonly title: "Too Many Requests";
59
+ readonly detail: "The user has sent too many requests in a given amount of time.";
60
+ };
55
61
  };
56
62
  export type ServerErrorKey = keyof typeof SERVER_ERRORS;
57
63
  export type ServerErrorOptions = {
@@ -55,4 +55,10 @@ exports.SERVER_ERRORS = {
55
55
  title: "Conflict",
56
56
  detail: "The request conflicts with the current state of the server.",
57
57
  },
58
+ TOO_MANY_REQUESTS: {
59
+ status: 429,
60
+ type: "about:blank",
61
+ title: "Too Many Requests",
62
+ detail: "The user has sent too many requests in a given amount of time.",
63
+ },
58
64
  };
@@ -100,8 +100,14 @@ function REGISTER_ROUTE(fastify, method, path, handler, options) {
100
100
  async function globalErrorHandler(error, _request, reply) {
101
101
  if (error instanceof APIError_1.APIError)
102
102
  return errorResponse(reply, error.error, { title: error.title, detail: error.detail, type: error.type, data: error.data, status: error.status });
103
- if (error.validation)
104
- return errorResponse(reply, "BAD_REQUEST", { detail: error.message, data: null });
103
+ if (error.statusCode && error.statusCode === 429)
104
+ return errorResponse(reply, "TOO_MANY_REQUESTS", { title: "Too Many Requests", detail: "You have sent too many requests in a given amount of time. Please try again later.", data: error.message.match(/\d+\s+\w+/)?.[0], status: 429 });
105
+ if (error.validation) {
106
+ const data = [];
107
+ for (const err of error.validation)
108
+ data.push({ property: err.instancePath ? err.instancePath.substring(1) : err.params.missingProperty || "unknown", message: `${error.validationContext} ${err.message}` });
109
+ return errorResponse(reply, "BAD_REQUEST", { detail: "Invalid request data, try again with proper formatting", data: data });
110
+ }
105
111
  logger_1.default.error(`Error processing request: ${error.message}`);
106
112
  return errorResponse(reply, "INTERNAL_SERVER_ERROR", { title: "Internal Server Error", detail: "An unexpected error occurred", type: "about:blank", data: null, status: 500 });
107
113
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@divine-lab/request",
3
- "version": "1.0.4",
3
+ "version": "1.1.0",
4
4
  "description": "Simple utility for standardizing request and response objects.",
5
5
  "author": {
6
6
  "name": "Ishpreet Singh",
package/readme.md CHANGED
@@ -14,7 +14,7 @@ success response and error response both follow a defined standard.
14
14
  These functions are defined to be used with fastify for now.
15
15
 
16
16
  ```ts
17
- import { successResponse } from "@divine-lab/request/fastify-helpers"
17
+ import { successResponse } from "@divine-lab/request/fastify-helpers";
18
18
 
19
19
  // Mock type
20
20
  type SuccessResponse = {
@@ -22,22 +22,22 @@ type SuccessResponse = {
22
22
  title: string;
23
23
  detail: string;
24
24
  data: any;
25
- }
25
+ };
26
26
 
27
27
  // Example of a success response:
28
28
  const userCreatedResponse: SuccessResponse = {
29
29
  success: true,
30
30
  title: "Account created successfully",
31
- detail: "You will recieve a email confirming the account creation in a 5-10 minutes."
32
- data: { id: 1, name: "user", age: 21 }
33
- }
31
+ detail: "You will recieve a email confirming the account creation in a 5-10 minutes.",
32
+ data: { id: 1, name: "user", age: 21 },
33
+ };
34
34
 
35
35
  // Example success response
36
- successResponse(res, 200, userCreatedResponse)
36
+ successResponse(res, 200, userCreatedResponse);
37
37
  ```
38
38
 
39
39
  ```ts
40
- import { errorResponse } from "@divine-lab/request/fastify-helpers"
40
+ import { errorResponse } from "@divine-lab/request/fastify-helpers";
41
41
 
42
42
  // Mock type
43
43
  type ErrorResponse = {
@@ -47,7 +47,7 @@ type ErrorResponse = {
47
47
  type: string;
48
48
  instance: string;
49
49
  data: any;
50
- }
50
+ };
51
51
 
52
52
  // Example of Error Response
53
53
  const userNotFoundError: ErrorResponse = {
@@ -55,12 +55,12 @@ const userNotFoundError: ErrorResponse = {
55
55
  title: "User Not Found",
56
56
  detail: "The User with the user id '1' not found in our database, please contact customer support if this is a mistake.",
57
57
  type: "http://example-errors.com/404/user-not-found",
58
- instance: "/users/1"
59
- data: null
60
- }
58
+ instance: "/users/1",
59
+ data: null,
60
+ };
61
61
 
62
62
  // example error response
63
- errorResponse(res, "UNKNOWN", userNotFoundError)
63
+ errorResponse(res, "UNKNOWN", userNotFoundError);
64
64
  ```
65
65
 
66
66
  Note: RFC9457 requires error responses to contain `instance` in the response. Right now all error responses automatically attach the request url as the instance.
@@ -115,4 +115,4 @@ Enable by setting ENV Variable `DIVINE_LAB_REQUEST_API_LOG` to `true`.
115
115
 
116
116
  #### Contact:
117
117
 
118
- - mail: <a href="mailto:ishpreet7521@gmail.com">ishpreet7521@gmail.com<a>
118
+ - mail: <a href="mailto:ishpreet@appshala.com">ishpreet@appshala.com<a>