Skip to content

Commit e285ef2

Browse files
authored
feat: add exception handling utility with common HTTP error responses (#76)
1 parent 7103a30 commit e285ef2

2 files changed

Lines changed: 78 additions & 11 deletions

File tree

src/index.luau

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,9 @@ Nova.__index = Nova
2828

2929
Nova.chain = require("@utils/Chain")
3030
Nova.response = require("@utils/Response")
31+
Nova.exception = require("@utils/Exception")
3132

32-
local function devMiddleware(req: Types.Request, next: Types.Next)
33-
local res = next()
34-
local status = res.config.status or 200
35-
33+
local function statusLog(status: number, req)
3634
local statusColor = "\27[31m"
3735
if status >= 200 and status < 300 then
3836
statusColor = "\27[32m"
@@ -47,6 +45,13 @@ local function devMiddleware(req: Types.Request, next: Types.Next)
4745
end
4846
end
4947

48+
local function devMiddleware(req: Types.Request, next: Types.Next)
49+
local res = next()
50+
local status = res.config.status or 200
51+
52+
statusLog(status, req)
53+
end
54+
5055
function Nova.new(port: number, middlewares: { (req: Types.Request, next: Types.Next) -> () }?)
5156
local self = setmetatable({}, Nova)
5257
self.port = port
@@ -120,20 +125,30 @@ function Nova:listen(handler: () -> ())
120125
return FAVICON_CACHED_RESPONSE or FAVICON_EMPTY_RESPONSE :: net.NetResponse
121126
end
122127

123-
local success, result: Types.ResponsePayload | any = pcall(rootPipeline, request)
124-
128+
local success, result: Types.ResponsePayload
129+
| { statusCode: number, message: string } | any = pcall(rootPipeline, request)
130+
125131
if not success then
126-
if isDev then
132+
statusLog(result.statusCode or 500, request)
133+
if typeof(result) == "table" then
134+
return {
135+
status = result.statusCode,
136+
body = encode("json", { error = result.message }),
137+
headers = { ["Content-Type"] = "application/json" }
138+
}
139+
else
127140
local errorMessage = debug.traceback(tostring(result), 2)
128-
print("\27[31m[Error]: " .. errorMessage .. "\27[0m")
141+
print("\27[31m[Error]: \n" .. errorMessage .. "\27[0m")
142+
143+
return INTERNAL_ERROR_RESPONSE :: net.NetResponse
129144
end
130-
return INTERNAL_ERROR_RESPONSE :: net.NetResponse
131145
end
132-
133-
local status: number
146+
147+
local status: number?
134148
local headers = nil
135149

136150
if result.config then
151+
137152
status = result.config.status
138153
headers = result.config.headers
139154
end

src/utils/Exception.luau

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
local Exception = {}
2+
3+
-- // BASE EXCEPTION FUNCTION // --
4+
5+
function Exception.HttpException(statusCode: number, message: string)
6+
return {
7+
statusCode = statusCode,
8+
message = message
9+
}
10+
end
11+
12+
-- // COMMON 4xx // --
13+
14+
function Exception.BadRequest(message: string?)
15+
return Exception.HttpException(400, message or "Bad Request")
16+
end
17+
18+
function Exception.Unauthorized(message: string?)
19+
return Exception.HttpException(401, message or "Unauthorized")
20+
end
21+
22+
function Exception.Forbidden(message: string?)
23+
return Exception.HttpException(403, message or "Forbidden")
24+
end
25+
26+
function Exception.NotFound(message: string?)
27+
return Exception.HttpException(404, message or "Not Found")
28+
end
29+
30+
function Exception.Conflict(message: string?)
31+
return Exception.HttpException(409, message or "Conflict")
32+
end
33+
34+
function Exception.TooManyRequests(message: string?)
35+
return Exception.HttpException(429, message or "Too Many Requests")
36+
end
37+
38+
-- // COMMON 5xx // --
39+
40+
function Exception.InternalServerError(message: string?)
41+
return Exception.HttpException(500, message or "Internal Server Error")
42+
end
43+
44+
function Exception.BadGateway(message: string?)
45+
return Exception.HttpException(502, message or "Bad Gateway")
46+
end
47+
48+
function Exception.ServiceUnavailable(message: string?)
49+
return Exception.HttpException(503, message or "Service Unavailable")
50+
end
51+
52+
return Exception

0 commit comments

Comments
 (0)