blade
Version:
React at the edge.
374 lines (371 loc) • 12.5 kB
JavaScript
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 };