///|
pub fn serve(self : Mocket, port~ : Int) -> Unit {
createServer(
fn(req, res, _) {
// 优化:简化 headers 转换逻辑
let string_headers = {}
guard (try? req.headers().to_value().to_json()) is Ok(Object(headers)) else {
res.write_head(400, @js.Object::new().to_value())
res.end("Invalid headers")
return
}
// 批量转换 headers,减少单个处理的开销
headers.each(fn(key, value) {
if value is String(v) {
string_headers.set(key, v)
}
})
let event = {
req: {
method_: req.req_method(),
url: req.url(),
body: "",
headers: string_headers,
},
res: { status_code: 200, headers: {} },
params: {},
}
// 查找匹配的路由
guard self.find_route(req.req_method(), req.url())
is Some((handler, params)) else {
res.write_head(404, @js.Object::new().to_value())
res.end("Not Found")
return
}
// 设置路径参数
event.params = params
run(fn() {
// 如果是 post,先等待 data 事件
if event.req.method_ == "POST" {
let body = suspend(fn(res, _) {
let buffer = @buffer.new()
req.on("data", fn(data) { buffer.write_string(data.to_string()) })
req.on("end", fn(_) { res(buffer.to_string()) })
}) catch {
_ => panic()
}
event.req.body = body
}
// 执行中间件链
execute_middlewares(self.middlewares, event)
let response = handler(event)
let body = match response {
{ "__": String(contentType), "body": body, .. } => {
event.res.headers.set("Content-Type", contentType)
body
}
_ => {
match response {
Json::Object(_) =>
event.res.headers.set(
"Content-Type", "application/json;charset=UTF-8",
)
_ =>
event.res.headers.set(
"Content-Type", "text/plain;charset=UTF-8",
)
}
response
}
}
let body_str = if body is String(str) { str } else { body.stringify() }
res.write_head(
event.res.status_code,
(try? @js.Value::from_json(event.res.headers.to_json())).or(
@js.Object::new().to_value(),
),
)
res.end(body_str)
})
},
port,
)
}