@hacksaw/hono-google-cloud-logging
Version:
Google Cloud Logging Middleware for Hono
84 lines (83 loc) • 2.62 kB
JavaScript
export function buildRequest(req) {
const headers = buildHeaders(req);
return new Request(buildUrl(req).toString(), {
method: req.method || "GET",
headers,
body: buildBody(req, headers),
});
}
export async function handleResponse(res, honoResponse) {
res.status(honoResponse.status);
for (const [key, value] of honoResponse.headers.entries()) {
res.setHeader(key, value);
}
const contentType = honoResponse.headers.get("content-type") || "";
if (contentType.includes("application/json")) {
const json = await honoResponse.json();
res.json(json);
}
else if (isTextContentType(contentType)) {
const text = await honoResponse.text();
res.send(text);
}
else {
const buffer = await honoResponse.arrayBuffer();
res.end(Buffer.from(buffer));
}
}
function isTextContentType(contentType) {
return (contentType.includes("text/html") ||
contentType.includes("text/plain") ||
contentType.includes("application/xml") ||
contentType.includes("text/css") ||
contentType.includes("application/javascript"));
}
function buildUrl(req) {
const url = new URL(req.url || "/", `${req.protocol}://${req.headers.host || "localhost"}`);
for (const [key, value] of Object.entries(req.query || {})) {
if (Array.isArray(value)) {
for (const v of value) {
url.searchParams.append(key, v);
}
}
else if (value !== undefined) {
url.searchParams.append(key, value);
}
}
return url;
}
function buildHeaders(req) {
const headers = new Headers();
for (const [key, value] of Object.entries(req.headers)) {
if (value) {
if (Array.isArray(value)) {
for (const v of value) {
headers.append(key, v);
}
}
else {
headers.append(key, value);
}
}
}
return headers;
}
function buildBody(req, headers) {
let body = null;
if (req.method !== "GET" && req.method !== "HEAD" && req.body) {
if (Buffer.isBuffer(req.body)) {
body = req.body;
}
else if (typeof req.body === "string") {
body = req.body;
}
// Handle JSON body (object)
else if (typeof req.body === "object") {
body = JSON.stringify(req.body);
if (!headers.has("content-type")) {
headers.set("content-type", "application/json");
}
}
}
return body;
}