UNPKG

blade

Version:
374 lines (371 loc) • 12.5 kB
import "../../../../hooks-BCUm8YC_.js"; import { t as worker_default } from "../../../../worker-lG_uM79p.js"; import "../../../../utils-BIjILkWh.js"; import "../../../../context-BBeH3CVO.js"; import "../../../../wrap-client-DyCFsAJ7.js"; import "../../../../history-BUMLb0yy.js"; import "../../../../remote-storage-CThzVgzV.js"; import "../../../../utils-BeDKhSpT.js"; import "../../../../dist-C7NzDGd9.js"; import "../../../../serialize-error-CkyRja0C.js"; import "../../../../hono-base-CcsMHh-r.js"; import "../../../../context-CKkJKjoo.js"; import "../../../../html-BHm7adlz.js"; import "../../../../utils-FoLYJor_.js"; import "../../../../encode-CtR4F3wv.js"; import { Readable } from "node:stream"; import { Http2ServerRequest } from "node:http2"; import crypto from "node:crypto"; //#region ../../node_modules/@hono/node-server/dist/vercel.mjs 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 = globalThis.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 newRequestFromIncoming = (method, url, incoming, abortController) => { 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]); } const init = { method, headers: headerRecord, 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 init.body = 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 abortControllerKey = Symbol("abortControllerKey"); var requestPrototype = { get method() { return this[incomingKey].method || "GET"; }, get url() { return this[urlKey]; }, [Symbol("getAbortController")]() { this[getRequestCache](); return this[abortControllerKey]; }, [getRequestCache]() { this[abortControllerKey] ||= new AbortController(); return this[requestCache] ||= newRequestFromIncoming(this.method, this[urlKey], this[incomingKey], this[abortControllerKey]); } }; [ "body", "bodyUsed", "cache", "credentials", "destination", "headers", "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.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 Http2ServerRequest) throw new RequestError("Absolute URL for :path is not allowed in HTTP/2"); try { req[urlKey] = new URL(incomingUrl).href; } catch (e) { throw new RequestError("Invalid absolute URL", { cause: e }); } return req; } const host = (incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host) || defaultHostname; if (!host) throw new RequestError("Missing host header"); let scheme; if (incoming instanceof 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 = globalThis.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) { headers ||= init?.headers || { "content-type": "text/plain; charset=UTF-8" }; this[cacheKey] = [ init?.status || 200, body, headers ]; } } get headers() { const cache = this[cacheKey]; if (cache) { if (!(cache[2] instanceof Headers)) cache[2] = new Headers(cache[2]); 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.setPrototypeOf(Response2, GlobalResponse); Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype); function writeFromReadableStream(stream, writable) { if (stream.locked) throw new TypeError("ReadableStream is locked."); else if (writable.destroyed) { stream.cancel(); return; } const reader = stream.getReader(); writable.on("close", cancel); writable.on("error", cancel); reader.read().then(flow, cancel); return reader.closed.finally(() => { writable.off("close", cancel); writable.off("error", cancel); }); function cancel(error) { reader.cancel(error).catch(() => {}); if (error) writable.destroy(error); } function onDrain() { reader.read().then(flow, cancel); } function flow({ done, value }) { try { if (done) writable.end(); else if (!writable.write(value)) writable.once("drain", onDrain); else return reader.read().then(flow, cancel); } catch (e) { cancel(e); } } } 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 webFetch = globalThis.fetch; if (typeof globalThis.crypto === "undefined") globalThis.crypto = crypto; globalThis.fetch = (info, init) => { init = { compress: false, ...init }; return webFetch(info, init); }; var regBuffer = /^no$/i; var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i; 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]; if (header instanceof Headers) header = buildOutgoingHttpHeaders(header); 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); return writeFromReadableStream(body, outgoing)?.catch((e) => handleResponseError(e, outgoing)); } }; var responseViaResponseObject = async (res, outgoing, options = {}) => { if (res instanceof Promise) 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 { "transfer-encoding": transferEncoding, "content-encoding": contentEncoding, "content-length": contentLength, "x-accel-buffering": accelBuffering, "content-type": contentType } = resHeaderRecord; if (transferEncoding || contentEncoding || contentLength || accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) { outgoing.writeHead(res.status, resHeaderRecord); flushHeaders(outgoing); await writeFromReadableStream(res.body, outgoing); } else { const buffer = await res.arrayBuffer(); resHeaderRecord["content-length"] = buffer.byteLength; outgoing.writeHead(res.status, resHeaderRecord); outgoing.end(new Uint8Array(buffer)); } } else if (resHeaderRecord[X_ALREADY_SENT]) {} else { outgoing.writeHead(res.status, resHeaderRecord); outgoing.end(); } }; var getRequestListener = (fetchCallback, options = {}) => { if (options.overrideGlobalObjects !== false && globalThis.Request !== Request) { Object.defineProperty(globalThis, "Request", { value: Request }); Object.defineProperty(globalThis, "Response", { value: Response2 }); } return async (incoming, outgoing) => { let res, req; try { req = newRequest(incoming, options.hostname); outgoing.on("close", () => { if (!req[abortControllerKey]) return; if (incoming.errored) req[abortControllerKey].abort(incoming.errored.toString()); else if (!outgoing.writableFinished) req[abortControllerKey].abort("Client connection prematurely closed."); }); 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); }; //#endregion //#region private/server/worker/providers/vercel.ts var vercel_default = handle(worker_default); //#endregion export { vercel_default as default };