hono-alibaba-cloud-fc3-adapter
Version:
An adapter for using Hono with Alibaba Cloud Function Compute 3.0
66 lines (65 loc) • 2.18 kB
JavaScript
import { decodeBase64, encodeBase64 } from "hono/utils/encode";
const parseEvent = (event) => {
return JSON.parse(event.toString("utf-8"));
};
/**
* Accepts events from Alibaba Cloud FC3 and return Alibaba Cloud FC3 responses
*/
export const handle = (app) => {
return async (eventRaw, context) => {
const event = parseEvent(eventRaw);
const req = createRequest(event);
const res = await app.fetch(req, {
event,
context,
});
return createResponse(res);
};
};
export const createRequest = (event) => {
const url = new URL(`https://${event.requestContext.domainName}${event.rawPath}`);
const params = new URLSearchParams(event.queryParameters);
url.search = params.toString();
const headers = new Headers(event.headers);
const method = event.requestContext.http.method;
const requestInit = {
headers,
method,
};
if (event.body) {
requestInit.body = event.isBase64Encoded
? decodeBase64(event.body)
: event.body;
}
return new Request(url, requestInit);
};
export const createResponse = async (res) => {
const contentType = res.headers.get("content-type");
let isBase64Encoded = contentType && isContentTypeBinary(contentType) ? true : false;
if (!isBase64Encoded) {
const contentEncoding = res.headers.get("content-encoding");
isBase64Encoded = isContentEncodingBinary(contentEncoding);
}
const body = isBase64Encoded
? encodeBase64(await res.arrayBuffer())
: await res.text();
const headers = {};
res.headers.forEach((value, key) => {
headers[key] = value;
});
return {
statusCode: res.status,
headers,
body,
isBase64Encoded,
};
};
export const isContentTypeBinary = (contentType) => {
return !/^(text\/(plain|html|css|javascript|csv).*|application\/(.*json|.*xml).*|image\/svg\+xml.*)$/.test(contentType);
};
export const isContentEncodingBinary = (contentEncoding) => {
if (contentEncoding === null) {
return false;
}
return /^(gzip|deflate|compress|br)/.test(contentEncoding);
};