| "use strict";
|
| var __create = Object.create;
|
| var __defProp = Object.defineProperty;
|
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
| var __getOwnPropNames = Object.getOwnPropertyNames;
|
| var __getProtoOf = Object.getPrototypeOf;
|
| var __hasOwnProp = Object.prototype.hasOwnProperty;
|
| var __export = (target, all) => {
|
| for (var name in all)
|
| __defProp(target, name, { get: all[name], enumerable: true });
|
| };
|
| var __copyProps = (to, from, except, desc) => {
|
| if (from && typeof from === "object" || typeof from === "function") {
|
| for (let key of __getOwnPropNames(from))
|
| if (!__hasOwnProp.call(to, key) && key !== except)
|
| __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
| }
|
| return to;
|
| };
|
| var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
|
|
|
|
|
|
|
| isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
| mod
|
| ));
|
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
|
|
|
| var vercel_exports = {};
|
| __export(vercel_exports, {
|
| handle: () => handle
|
| });
|
| module.exports = __toCommonJS(vercel_exports);
|
|
|
|
|
| var import_node_http22 = require("http2");
|
|
|
|
|
| var import_node_http2 = require("http2");
|
| var import_node_stream = require("stream");
|
| var RequestError = class extends Error {
|
| constructor(message, options) {
|
| super(message, options);
|
| this.name = "RequestError";
|
| }
|
| };
|
| var toRequestError = (e) => {
|
| if (e instanceof RequestError) {
|
| return e;
|
| }
|
| return new RequestError(e.message, { cause: e });
|
| };
|
| var GlobalRequest = global.Request;
|
| var Request = class extends GlobalRequest {
|
| constructor(input, options) {
|
| if (typeof input === "object" && getRequestCache in input) {
|
| input = input[getRequestCache]();
|
| }
|
| if (typeof options?.body?.getReader !== "undefined") {
|
| ;
|
| options.duplex ??= "half";
|
| }
|
| super(input, options);
|
| }
|
| };
|
| var newHeadersFromIncoming = (incoming) => {
|
| const headerRecord = [];
|
| const rawHeaders = incoming.rawHeaders;
|
| for (let i = 0; i < rawHeaders.length; i += 2) {
|
| const { [i]: key, [i + 1]: value } = rawHeaders;
|
| if (key.charCodeAt(0) !==
|
| 58) {
|
| headerRecord.push([key, value]);
|
| }
|
| }
|
| return new Headers(headerRecord);
|
| };
|
| var wrapBodyStream = Symbol("wrapBodyStream");
|
| var newRequestFromIncoming = (method, url, headers, incoming, abortController) => {
|
| const init = {
|
| method,
|
| headers,
|
| signal: abortController.signal
|
| };
|
| if (method === "TRACE") {
|
| init.method = "GET";
|
| const req = new Request(url, init);
|
| Object.defineProperty(req, "method", {
|
| get() {
|
| return "TRACE";
|
| }
|
| });
|
| return req;
|
| }
|
| if (!(method === "GET" || method === "HEAD")) {
|
| if ("rawBody" in incoming && incoming.rawBody instanceof Buffer) {
|
| init.body = new ReadableStream({
|
| start(controller) {
|
| controller.enqueue(incoming.rawBody);
|
| controller.close();
|
| }
|
| });
|
| } else if (incoming[wrapBodyStream]) {
|
| let reader;
|
| init.body = new ReadableStream({
|
| async pull(controller) {
|
| try {
|
| reader ||= import_node_stream.Readable.toWeb(incoming).getReader();
|
| const { done, value } = await reader.read();
|
| if (done) {
|
| controller.close();
|
| } else {
|
| controller.enqueue(value);
|
| }
|
| } catch (error) {
|
| controller.error(error);
|
| }
|
| }
|
| });
|
| } else {
|
| init.body = import_node_stream.Readable.toWeb(incoming);
|
| }
|
| }
|
| return new Request(url, init);
|
| };
|
| var getRequestCache = Symbol("getRequestCache");
|
| var requestCache = Symbol("requestCache");
|
| var incomingKey = Symbol("incomingKey");
|
| var urlKey = Symbol("urlKey");
|
| var headersKey = Symbol("headersKey");
|
| var abortControllerKey = Symbol("abortControllerKey");
|
| var getAbortController = Symbol("getAbortController");
|
| var requestPrototype = {
|
| get method() {
|
| return this[incomingKey].method || "GET";
|
| },
|
| get url() {
|
| return this[urlKey];
|
| },
|
| get headers() {
|
| return this[headersKey] ||= newHeadersFromIncoming(this[incomingKey]);
|
| },
|
| [getAbortController]() {
|
| this[getRequestCache]();
|
| return this[abortControllerKey];
|
| },
|
| [getRequestCache]() {
|
| this[abortControllerKey] ||= new AbortController();
|
| return this[requestCache] ||= newRequestFromIncoming(
|
| this.method,
|
| this[urlKey],
|
| this.headers,
|
| this[incomingKey],
|
| this[abortControllerKey]
|
| );
|
| }
|
| };
|
| [
|
| "body",
|
| "bodyUsed",
|
| "cache",
|
| "credentials",
|
| "destination",
|
| "integrity",
|
| "mode",
|
| "redirect",
|
| "referrer",
|
| "referrerPolicy",
|
| "signal",
|
| "keepalive"
|
| ].forEach((k) => {
|
| Object.defineProperty(requestPrototype, k, {
|
| get() {
|
| return this[getRequestCache]()[k];
|
| }
|
| });
|
| });
|
| ["arrayBuffer", "blob", "clone", "formData", "json", "text"].forEach((k) => {
|
| Object.defineProperty(requestPrototype, k, {
|
| value: function() {
|
| return this[getRequestCache]()[k]();
|
| }
|
| });
|
| });
|
| Object.defineProperty(requestPrototype, Symbol.for("nodejs.util.inspect.custom"), {
|
| value: function(depth, options, inspectFn) {
|
| const props = {
|
| method: this.method,
|
| url: this.url,
|
| headers: this.headers,
|
| nativeRequest: this[requestCache]
|
| };
|
| return `Request (lightweight) ${inspectFn(props, { ...options, depth: depth == null ? null : depth - 1 })}`;
|
| }
|
| });
|
| Object.setPrototypeOf(requestPrototype, Request.prototype);
|
| var newRequest = (incoming, defaultHostname) => {
|
| const req = Object.create(requestPrototype);
|
| req[incomingKey] = incoming;
|
| const incomingUrl = incoming.url || "";
|
| if (incomingUrl[0] !== "/" &&
|
| (incomingUrl.startsWith("http://") || incomingUrl.startsWith("https://"))) {
|
| if (incoming instanceof import_node_http2.Http2ServerRequest) {
|
| throw new RequestError("Absolute URL for :path is not allowed in HTTP/2");
|
| }
|
| try {
|
| const url2 = new URL(incomingUrl);
|
| req[urlKey] = url2.href;
|
| } catch (e) {
|
| throw new RequestError("Invalid absolute URL", { cause: e });
|
| }
|
| return req;
|
| }
|
| const host = (incoming instanceof import_node_http2.Http2ServerRequest ? incoming.authority : incoming.headers.host) || defaultHostname;
|
| if (!host) {
|
| throw new RequestError("Missing host header");
|
| }
|
| let scheme;
|
| if (incoming instanceof import_node_http2.Http2ServerRequest) {
|
| scheme = incoming.scheme;
|
| if (!(scheme === "http" || scheme === "https")) {
|
| throw new RequestError("Unsupported scheme");
|
| }
|
| } else {
|
| scheme = incoming.socket && incoming.socket.encrypted ? "https" : "http";
|
| }
|
| const url = new URL(`${scheme}://${host}${incomingUrl}`);
|
| if (url.hostname.length !== host.length && url.hostname !== host.replace(/:\d+$/, "")) {
|
| throw new RequestError("Invalid host header");
|
| }
|
| req[urlKey] = url.href;
|
| return req;
|
| };
|
|
|
|
|
| var responseCache = Symbol("responseCache");
|
| var getResponseCache = Symbol("getResponseCache");
|
| var cacheKey = Symbol("cache");
|
| var GlobalResponse = global.Response;
|
| var Response2 = class _Response {
|
| #body;
|
| #init;
|
| [getResponseCache]() {
|
| delete this[cacheKey];
|
| return this[responseCache] ||= new GlobalResponse(this.#body, this.#init);
|
| }
|
| constructor(body, init) {
|
| let headers;
|
| this.#body = body;
|
| if (init instanceof _Response) {
|
| const cachedGlobalResponse = init[responseCache];
|
| if (cachedGlobalResponse) {
|
| this.#init = cachedGlobalResponse;
|
| this[getResponseCache]();
|
| return;
|
| } else {
|
| this.#init = init.#init;
|
| headers = new Headers(init.#init.headers);
|
| }
|
| } else {
|
| this.#init = init;
|
| }
|
| if (typeof body === "string" || typeof body?.getReader !== "undefined" || body instanceof Blob || body instanceof Uint8Array) {
|
| ;
|
| this[cacheKey] = [init?.status || 200, body, headers || init?.headers];
|
| }
|
| }
|
| get headers() {
|
| const cache = this[cacheKey];
|
| if (cache) {
|
| if (!(cache[2] instanceof Headers)) {
|
| cache[2] = new Headers(
|
| cache[2] || { "content-type": "text/plain; charset=UTF-8" }
|
| );
|
| }
|
| return cache[2];
|
| }
|
| return this[getResponseCache]().headers;
|
| }
|
| get status() {
|
| return this[cacheKey]?.[0] ?? this[getResponseCache]().status;
|
| }
|
| get ok() {
|
| const status = this.status;
|
| return status >= 200 && status < 300;
|
| }
|
| };
|
| ["body", "bodyUsed", "redirected", "statusText", "trailers", "type", "url"].forEach((k) => {
|
| Object.defineProperty(Response2.prototype, k, {
|
| get() {
|
| return this[getResponseCache]()[k];
|
| }
|
| });
|
| });
|
| ["arrayBuffer", "blob", "clone", "formData", "json", "text"].forEach((k) => {
|
| Object.defineProperty(Response2.prototype, k, {
|
| value: function() {
|
| return this[getResponseCache]()[k]();
|
| }
|
| });
|
| });
|
| Object.defineProperty(Response2.prototype, Symbol.for("nodejs.util.inspect.custom"), {
|
| value: function(depth, options, inspectFn) {
|
| const props = {
|
| status: this.status,
|
| headers: this.headers,
|
| ok: this.ok,
|
| nativeResponse: this[responseCache]
|
| };
|
| return `Response (lightweight) ${inspectFn(props, { ...options, depth: depth == null ? null : depth - 1 })}`;
|
| }
|
| });
|
| Object.setPrototypeOf(Response2, GlobalResponse);
|
| Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
|
|
|
|
|
| async function readWithoutBlocking(readPromise) {
|
| return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
|
| }
|
| function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
|
| const cancel = (error) => {
|
| reader.cancel(error).catch(() => {
|
| });
|
| };
|
| writable.on("close", cancel);
|
| writable.on("error", cancel);
|
| (currentReadPromise ?? reader.read()).then(flow, handleStreamError);
|
| return reader.closed.finally(() => {
|
| writable.off("close", cancel);
|
| writable.off("error", cancel);
|
| });
|
| function handleStreamError(error) {
|
| if (error) {
|
| writable.destroy(error);
|
| }
|
| }
|
| function onDrain() {
|
| reader.read().then(flow, handleStreamError);
|
| }
|
| function flow({ done, value }) {
|
| try {
|
| if (done) {
|
| writable.end();
|
| } else if (!writable.write(value)) {
|
| writable.once("drain", onDrain);
|
| } else {
|
| return reader.read().then(flow, handleStreamError);
|
| }
|
| } catch (e) {
|
| handleStreamError(e);
|
| }
|
| }
|
| }
|
| function writeFromReadableStream(stream, writable) {
|
| if (stream.locked) {
|
| throw new TypeError("ReadableStream is locked.");
|
| } else if (writable.destroyed) {
|
| return;
|
| }
|
| return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
|
| }
|
| var buildOutgoingHttpHeaders = (headers) => {
|
| const res = {};
|
| if (!(headers instanceof Headers)) {
|
| headers = new Headers(headers ?? void 0);
|
| }
|
| const cookies = [];
|
| for (const [k, v] of headers) {
|
| if (k === "set-cookie") {
|
| cookies.push(v);
|
| } else {
|
| res[k] = v;
|
| }
|
| }
|
| if (cookies.length > 0) {
|
| res["set-cookie"] = cookies;
|
| }
|
| res["content-type"] ??= "text/plain; charset=UTF-8";
|
| return res;
|
| };
|
|
|
|
|
| var X_ALREADY_SENT = "x-hono-already-sent";
|
|
|
|
|
| var import_node_crypto = __toESM(require("crypto"));
|
| if (typeof global.crypto === "undefined") {
|
| global.crypto = import_node_crypto.default;
|
| }
|
|
|
|
|
| var outgoingEnded = Symbol("outgoingEnded");
|
| var incomingDraining = Symbol("incomingDraining");
|
| var DRAIN_TIMEOUT_MS = 500;
|
| var MAX_DRAIN_BYTES = 64 * 1024 * 1024;
|
| var drainIncoming = (incoming) => {
|
| const incomingWithDrainState = incoming;
|
| if (incoming.destroyed || incomingWithDrainState[incomingDraining]) {
|
| return;
|
| }
|
| incomingWithDrainState[incomingDraining] = true;
|
| if (incoming instanceof import_node_http22.Http2ServerRequest) {
|
| try {
|
| ;
|
| incoming.stream?.close?.(import_node_http22.constants.NGHTTP2_NO_ERROR);
|
| } catch {
|
| }
|
| return;
|
| }
|
| let bytesRead = 0;
|
| const cleanup = () => {
|
| clearTimeout(timer);
|
| incoming.off("data", onData);
|
| incoming.off("end", cleanup);
|
| incoming.off("error", cleanup);
|
| };
|
| const forceClose = () => {
|
| cleanup();
|
| const socket = incoming.socket;
|
| if (socket && !socket.destroyed) {
|
| socket.destroySoon();
|
| }
|
| };
|
| const timer = setTimeout(forceClose, DRAIN_TIMEOUT_MS);
|
| timer.unref?.();
|
| const onData = (chunk) => {
|
| bytesRead += chunk.length;
|
| if (bytesRead > MAX_DRAIN_BYTES) {
|
| forceClose();
|
| }
|
| };
|
| incoming.on("data", onData);
|
| incoming.on("end", cleanup);
|
| incoming.on("error", cleanup);
|
| incoming.resume();
|
| };
|
| var handleRequestError = () => new Response(null, {
|
| status: 400
|
| });
|
| var handleFetchError = (e) => new Response(null, {
|
| status: e instanceof Error && (e.name === "TimeoutError" || e.constructor.name === "TimeoutError") ? 504 : 500
|
| });
|
| var handleResponseError = (e, outgoing) => {
|
| const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
|
| if (err.code === "ERR_STREAM_PREMATURE_CLOSE") {
|
| console.info("The user aborted a request.");
|
| } else {
|
| console.error(e);
|
| if (!outgoing.headersSent) {
|
| outgoing.writeHead(500, { "Content-Type": "text/plain" });
|
| }
|
| outgoing.end(`Error: ${err.message}`);
|
| outgoing.destroy(err);
|
| }
|
| };
|
| var flushHeaders = (outgoing) => {
|
| if ("flushHeaders" in outgoing && outgoing.writable) {
|
| outgoing.flushHeaders();
|
| }
|
| };
|
| var responseViaCache = async (res, outgoing) => {
|
| let [status, body, header] = res[cacheKey];
|
| let hasContentLength = false;
|
| if (!header) {
|
| header = { "content-type": "text/plain; charset=UTF-8" };
|
| } else if (header instanceof Headers) {
|
| hasContentLength = header.has("content-length");
|
| header = buildOutgoingHttpHeaders(header);
|
| } else if (Array.isArray(header)) {
|
| const headerObj = new Headers(header);
|
| hasContentLength = headerObj.has("content-length");
|
| header = buildOutgoingHttpHeaders(headerObj);
|
| } else {
|
| for (const key in header) {
|
| if (key.length === 14 && key.toLowerCase() === "content-length") {
|
| hasContentLength = true;
|
| break;
|
| }
|
| }
|
| }
|
| if (!hasContentLength) {
|
| if (typeof body === "string") {
|
| header["Content-Length"] = Buffer.byteLength(body);
|
| } else if (body instanceof Uint8Array) {
|
| header["Content-Length"] = body.byteLength;
|
| } else if (body instanceof Blob) {
|
| header["Content-Length"] = body.size;
|
| }
|
| }
|
| outgoing.writeHead(status, header);
|
| if (typeof body === "string" || body instanceof Uint8Array) {
|
| outgoing.end(body);
|
| } else if (body instanceof Blob) {
|
| outgoing.end(new Uint8Array(await body.arrayBuffer()));
|
| } else {
|
| flushHeaders(outgoing);
|
| await writeFromReadableStream(body, outgoing)?.catch(
|
| (e) => handleResponseError(e, outgoing)
|
| );
|
| }
|
| ;
|
| outgoing[outgoingEnded]?.();
|
| };
|
| var isPromise = (res) => typeof res.then === "function";
|
| var responseViaResponseObject = async (res, outgoing, options = {}) => {
|
| if (isPromise(res)) {
|
| if (options.errorHandler) {
|
| try {
|
| res = await res;
|
| } catch (err) {
|
| const errRes = await options.errorHandler(err);
|
| if (!errRes) {
|
| return;
|
| }
|
| res = errRes;
|
| }
|
| } else {
|
| res = await res.catch(handleFetchError);
|
| }
|
| }
|
| if (cacheKey in res) {
|
| return responseViaCache(res, outgoing);
|
| }
|
| const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
|
| if (res.body) {
|
| const reader = res.body.getReader();
|
| const values = [];
|
| let done = false;
|
| let currentReadPromise = void 0;
|
| if (resHeaderRecord["transfer-encoding"] !== "chunked") {
|
| let maxReadCount = 2;
|
| for (let i = 0; i < maxReadCount; i++) {
|
| currentReadPromise ||= reader.read();
|
| const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
|
| console.error(e);
|
| done = true;
|
| });
|
| if (!chunk) {
|
| if (i === 1) {
|
| await new Promise((resolve) => setTimeout(resolve));
|
| maxReadCount = 3;
|
| continue;
|
| }
|
| break;
|
| }
|
| currentReadPromise = void 0;
|
| if (chunk.value) {
|
| values.push(chunk.value);
|
| }
|
| if (chunk.done) {
|
| done = true;
|
| break;
|
| }
|
| }
|
| if (done && !("content-length" in resHeaderRecord)) {
|
| resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
|
| }
|
| }
|
| outgoing.writeHead(res.status, resHeaderRecord);
|
| values.forEach((value) => {
|
| ;
|
| outgoing.write(value);
|
| });
|
| if (done) {
|
| outgoing.end();
|
| } else {
|
| if (values.length === 0) {
|
| flushHeaders(outgoing);
|
| }
|
| await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
|
| }
|
| } else if (resHeaderRecord[X_ALREADY_SENT]) {
|
| } else {
|
| outgoing.writeHead(res.status, resHeaderRecord);
|
| outgoing.end();
|
| }
|
| ;
|
| outgoing[outgoingEnded]?.();
|
| };
|
| var getRequestListener = (fetchCallback, options = {}) => {
|
| const autoCleanupIncoming = options.autoCleanupIncoming ?? true;
|
| if (options.overrideGlobalObjects !== false && global.Request !== Request) {
|
| Object.defineProperty(global, "Request", {
|
| value: Request
|
| });
|
| Object.defineProperty(global, "Response", {
|
| value: Response2
|
| });
|
| }
|
| return async (incoming, outgoing) => {
|
| let res, req;
|
| try {
|
| req = newRequest(incoming, options.hostname);
|
| let incomingEnded = !autoCleanupIncoming || incoming.method === "GET" || incoming.method === "HEAD";
|
| if (!incomingEnded) {
|
| ;
|
| incoming[wrapBodyStream] = true;
|
| incoming.on("end", () => {
|
| incomingEnded = true;
|
| });
|
| if (incoming instanceof import_node_http22.Http2ServerRequest) {
|
| ;
|
| outgoing[outgoingEnded] = () => {
|
| if (!incomingEnded) {
|
| setTimeout(() => {
|
| if (!incomingEnded) {
|
| setTimeout(() => {
|
| drainIncoming(incoming);
|
| });
|
| }
|
| });
|
| }
|
| };
|
| }
|
| outgoing.on("finish", () => {
|
| if (!incomingEnded) {
|
| drainIncoming(incoming);
|
| }
|
| });
|
| }
|
| outgoing.on("close", () => {
|
| const abortController = req[abortControllerKey];
|
| if (abortController) {
|
| if (incoming.errored) {
|
| req[abortControllerKey].abort(incoming.errored.toString());
|
| } else if (!outgoing.writableFinished) {
|
| req[abortControllerKey].abort("Client connection prematurely closed.");
|
| }
|
| }
|
| if (!incomingEnded) {
|
| setTimeout(() => {
|
| if (!incomingEnded) {
|
| setTimeout(() => {
|
| drainIncoming(incoming);
|
| });
|
| }
|
| });
|
| }
|
| });
|
| res = fetchCallback(req, { incoming, outgoing });
|
| if (cacheKey in res) {
|
| return responseViaCache(res, outgoing);
|
| }
|
| } catch (e) {
|
| if (!res) {
|
| if (options.errorHandler) {
|
| res = await options.errorHandler(req ? e : toRequestError(e));
|
| if (!res) {
|
| return;
|
| }
|
| } else if (!req) {
|
| res = handleRequestError();
|
| } else {
|
| res = handleFetchError(e);
|
| }
|
| } else {
|
| return handleResponseError(e, outgoing);
|
| }
|
| }
|
| try {
|
| return await responseViaResponseObject(res, outgoing, options);
|
| } catch (e) {
|
| return handleResponseError(e, outgoing);
|
| }
|
| };
|
| };
|
|
|
|
|
| var handle = (app) => {
|
| return getRequestListener(app.fetch);
|
| };
|
|
|
| 0 && (module.exports = {
|
| handle
|
| });
|
|
|