UNPKG

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
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); };