'use strict'; var chunk3T7FP546_cjs = require('../chunk-3T7FP546.cjs'); var promises = require('fs/promises'); var https = require('https'); var path = require('path'); var url = require('url'); var http = require('http'); var http2 = require('http2'); var stream = require('stream'); var crypto = require('crypto'); var mime = require('hono/utils/mime'); var fs = require('fs'); var process$1 = require('process'); var html = require('hono/html'); var tools = require('@mastra/core/tools'); var serverAdapter = require('@mastra/server/server-adapter'); var util = require('util'); var buffer = require('buffer'); var bodyLimit = require('hono/body-limit'); var streaming = require('hono/streaming'); var auth = require('@mastra/server/auth'); var browserStream = require('@mastra/server/browser-stream'); var store = require('@mastra/server/a2a/store'); var hono = require('hono'); var compress = require('hono/compress'); var cors = require('hono/cors'); var logger = require('hono/logger'); var timeout = require('hono/timeout'); var httpException = require('hono/http-exception'); var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null; function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } }); } }); } n.default = e; return Object.freeze(n); } var https__namespace = /*#__PURE__*/_interopNamespace(https); var crypto__default = /*#__PURE__*/_interopDefault(crypto); var util__default = /*#__PURE__*/_interopDefault(util); 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 = /* @__PURE__ */ 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 ||= 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 = stream.Readable.toWeb(incoming); } } return new Request(url, init); }; var getRequestCache = /* @__PURE__ */ Symbol("getRequestCache"); var requestCache = /* @__PURE__ */ Symbol("requestCache"); var incomingKey = /* @__PURE__ */ Symbol("incomingKey"); var urlKey = /* @__PURE__ */ Symbol("urlKey"); var headersKey = /* @__PURE__ */ Symbol("headersKey"); var abortControllerKey = /* @__PURE__ */ Symbol("abortControllerKey"); var getAbortController = /* @__PURE__ */ 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, /* @__PURE__ */ 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] !== "/" && // short-circuit for performance. most requests are relative URL. (incomingUrl.startsWith("http://") || incomingUrl.startsWith("https://"))) { if (incoming instanceof 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 http2.Http2ServerRequest ? incoming.authority : incoming.headers.host) || defaultHostname; if (!host) { throw new RequestError("Missing host header"); } let scheme; if (incoming instanceof 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 = /* @__PURE__ */ Symbol("responseCache"); var getResponseCache = /* @__PURE__ */ Symbol("getResponseCache"); var cacheKey = /* @__PURE__ */ 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, /* @__PURE__ */ 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(stream2, writable) { if (stream2.locked) { throw new TypeError("ReadableStream is locked."); } else if (writable.destroyed) { return; } return writeFromReadableStreamDefaultReader(stream2.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"; if (typeof global.crypto === "undefined") { global.crypto = crypto__default.default; } var outgoingEnded = /* @__PURE__ */ Symbol("outgoingEnded"); var incomingDraining = /* @__PURE__ */ 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 http2.Http2ServerRequest) { try { incoming.stream?.close?.(http2.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 http2.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 createAdaptorServer = (options) => { const fetchCallback = options.fetch; const requestListener = getRequestListener(fetchCallback, { hostname: options.hostname, overrideGlobalObjects: options.overrideGlobalObjects, autoCleanupIncoming: options.autoCleanupIncoming }); const createServer2 = options.createServer || http.createServer; const server = createServer2(options.serverOptions || {}, requestListener); return server; }; var serve = (options, listeningListener) => { const server = createAdaptorServer(options); server.listen(options?.port ?? 3e3, options.hostname, () => { const serverInfo = server.address(); listeningListener && listeningListener(serverInfo); }); return server; }; var COMPRESSIBLE_CONTENT_TYPE_REGEX = /^\s*(?:text\/[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|wasm|x-httpd-php|x-javascript|x-ns-proxy-autoconfig|x-sh|x-tar|x-virtualbox-hdd|x-virtualbox-ova|x-virtualbox-ovf|x-virtualbox-vbox|x-virtualbox-vdi|x-virtualbox-vhd|x-virtualbox-vmdk|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml))(?:[;\s]|$)/i; var ENCODINGS = { br: ".br", zstd: ".zst", gzip: ".gz" }; var ENCODINGS_ORDERED_KEYS = Object.keys(ENCODINGS); var pr54206Applied = () => { const [major, minor] = process$1.versions.node.split(".").map((component) => parseInt(component)); return major >= 23 || major === 22 && minor >= 7 || major === 20 && minor >= 18; }; var useReadableToWeb = pr54206Applied(); var createStreamBody = (stream2) => { if (useReadableToWeb) { return stream.Readable.toWeb(stream2); } const body = new ReadableStream({ start(controller) { stream2.on("data", (chunk) => { controller.enqueue(chunk); }); stream2.on("error", (err) => { controller.error(err); }); stream2.on("end", () => { controller.close(); }); }, cancel() { stream2.destroy(); } }); return body; }; var getStats = (path) => { let stats; try { stats = fs.statSync(path); } catch { } return stats; }; var tryDecode = (str, decoder) => { try { return decoder(str); } catch { return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => { try { return decoder(match); } catch { return match; } }); } }; var tryDecodeURI = (str) => tryDecode(str, decodeURI); var serveStatic = (options = { root: "" }) => { const root = options.root || ""; const optionPath = options.path; if (root !== "" && !fs.existsSync(root)) { console.error(`serveStatic: root path '${root}' is not found, are you sure it's correct?`); } return async (c, next) => { if (c.finalized) { return next(); } let filename; if (optionPath) { filename = optionPath; } else { try { filename = tryDecodeURI(c.req.path); if (/(?:^|[\/\\])\.{1,2}(?:$|[\/\\])|[\/\\]{2,}/.test(filename)) { throw new Error(); } } catch { await options.onNotFound?.(c.req.path, c); return next(); } } let path$1 = path.join( root, !optionPath && options.rewriteRequestPath ? options.rewriteRequestPath(filename, c) : filename ); let stats = getStats(path$1); if (stats && stats.isDirectory()) { const indexFile = options.index ?? "index.html"; path$1 = path.join(path$1, indexFile); stats = getStats(path$1); } if (!stats) { await options.onNotFound?.(path$1, c); return next(); } const mimeType = mime.getMimeType(path$1); c.header("Content-Type", mimeType || "application/octet-stream"); if (options.precompressed && (!mimeType || COMPRESSIBLE_CONTENT_TYPE_REGEX.test(mimeType))) { const acceptEncodingSet = new Set( c.req.header("Accept-Encoding")?.split(",").map((encoding) => encoding.trim()) ); for (const encoding of ENCODINGS_ORDERED_KEYS) { if (!acceptEncodingSet.has(encoding)) { continue; } const precompressedStats = getStats(path$1 + ENCODINGS[encoding]); if (precompressedStats) { c.header("Content-Encoding", encoding); c.header("Vary", "Accept-Encoding", { append: true }); stats = precompressedStats; path$1 = path$1 + ENCODINGS[encoding]; break; } } } let result; const size = stats.size; const range = c.req.header("range") || ""; if (c.req.method == "HEAD" || c.req.method == "OPTIONS") { c.header("Content-Length", size.toString()); c.status(200); result = c.body(null); } else if (!range) { c.header("Content-Length", size.toString()); result = c.body(createStreamBody(fs.createReadStream(path$1)), 200); } else { c.header("Accept-Ranges", "bytes"); c.header("Date", stats.birthtime.toUTCString()); const parts = range.replace(/bytes=/, "").split("-", 2); const start = parseInt(parts[0], 10) || 0; let end = parseInt(parts[1], 10) || size - 1; if (size < end - start + 1) { end = size - 1; } const chunksize = end - start + 1; const stream2 = fs.createReadStream(path$1, { start, end }); c.header("Content-Length", chunksize.toString()); c.header("Content-Range", `bytes ${start}-${end}/${stats.size}`); result = c.body(createStreamBody(stream2), 206); } await options.onFound?.(path$1, c); return result; }; }; var RENDER_TYPE = { STRING_ARRAY: "string_array", STRING: "string", JSON_STRING: "json_string", RAW: "raw" }; var RENDER_TYPE_MAP = { configUrl: RENDER_TYPE.STRING, deepLinking: RENDER_TYPE.RAW, presets: RENDER_TYPE.STRING_ARRAY, plugins: RENDER_TYPE.STRING_ARRAY, spec: RENDER_TYPE.JSON_STRING, url: RENDER_TYPE.STRING, urls: RENDER_TYPE.JSON_STRING, layout: RENDER_TYPE.STRING, docExpansion: RENDER_TYPE.STRING, maxDisplayedTags: RENDER_TYPE.RAW, operationsSorter: RENDER_TYPE.RAW, requestInterceptor: RENDER_TYPE.RAW, responseInterceptor: RENDER_TYPE.RAW, persistAuthorization: RENDER_TYPE.RAW, defaultModelsExpandDepth: RENDER_TYPE.RAW, defaultModelExpandDepth: RENDER_TYPE.RAW, defaultModelRendering: RENDER_TYPE.STRING, displayRequestDuration: RENDER_TYPE.RAW, filter: RENDER_TYPE.RAW, showExtensions: RENDER_TYPE.RAW, showCommonExtensions: RENDER_TYPE.RAW, queryConfigEnabled: RENDER_TYPE.RAW, displayOperationId: RENDER_TYPE.RAW, tagsSorter: RENDER_TYPE.RAW, onComplete: RENDER_TYPE.RAW, syntaxHighlight: RENDER_TYPE.JSON_STRING, tryItOutEnabled: RENDER_TYPE.RAW, requestSnippetsEnabled: RENDER_TYPE.RAW, requestSnippets: RENDER_TYPE.JSON_STRING, oauth2RedirectUrl: RENDER_TYPE.STRING, showMutabledRequest: RENDER_TYPE.RAW, request: RENDER_TYPE.JSON_STRING, supportedSubmitMethods: RENDER_TYPE.JSON_STRING, validatorUrl: RENDER_TYPE.STRING, withCredentials: RENDER_TYPE.RAW, modelPropertyMacro: RENDER_TYPE.RAW, parameterMacro: RENDER_TYPE.RAW }; var renderSwaggerUIOptions = (options) => { return Object.entries(options).map(([k, v]) => { const key = k; if (!RENDER_TYPE_MAP[key] || v === void 0) return ""; switch (RENDER_TYPE_MAP[key]) { case RENDER_TYPE.STRING: return `${key}: '${v}'`; case RENDER_TYPE.STRING_ARRAY: if (!Array.isArray(v)) return ""; return `${key}: [${v.map((ve) => `${ve}`).join(",")}]`; case RENDER_TYPE.JSON_STRING: return `${key}: ${JSON.stringify(v)}`; case RENDER_TYPE.RAW: return `${key}: ${v}`; default: return ""; } }).filter((item) => item !== "").join(","); }; var remoteAssets = ({ version }) => { const url = `https://cdn.jsdelivr.net/npm/swagger-ui-dist${version !== void 0 ? `@${version}` : ""}`; return { css: [`${url}/swagger-ui.css`], js: [`${url}/swagger-ui-bundle.js`] }; }; var SwaggerUI = (options) => { const asset = remoteAssets({ version: options?.version }); delete options.version; if (options.manuallySwaggerUIHtml) return options.manuallySwaggerUIHtml(asset); const optionsStrings = renderSwaggerUIOptions(options); return `
${asset.css.map((url) => html.html``)} ${asset.js.map((url) => html.html`
`; }; var middleware = (options) => async (c) => { const title = options?.title ?? "SwaggerUI"; return c.html(` ${title} ${SwaggerUI(options)} `); }; var classRegExp = /^([A-Z][a-z0-9]*)+$/; var kTypes = [ "string", "function", "number", "object", // Accept 'Function' and 'Object' as alternative to the lower cased version. "Function", "Object", "boolean", "bigint", "symbol" ]; function determineSpecificType(value) { if (value == null) { return "" + value; } if (typeof value === "function" && value.name) { return `function ${value.name}`; } if (typeof value === "object") { if (value.constructor?.name) { return `an instance of ${value.constructor.name}`; } return `${util__default.default.inspect(value, { depth: -1 })}`; } let inspected = util__default.default.inspect(value, { colors: false }); if (inspected.length > 28) { inspected = `${inspected.slice(0, 25)}...`; } return `type ${typeof value} (${inspected})`; } var ERR_HTTP_BODY_NOT_ALLOWED = class extends Error { constructor() { super("Adding content for this request method or response status is not allowed."); } }; var ERR_HTTP_CONTENT_LENGTH_MISMATCH = class extends Error { constructor(actual, expected) { super(`Response body's content-length of ${actual} byte(s) does not match the content-length of ${expected} byte(s) set in header`); } }; var ERR_HTTP_HEADERS_SENT = class extends Error { constructor(arg) { super(`Cannot ${arg} headers after they are sent to the client`); } }; var ERR_INVALID_ARG_VALUE = class extends TypeError { constructor(name, value, reason = "is invalid") { let inspected = util__default.default.inspect(value); if (inspected.length > 128) { inspected = `${inspected.slice(0, 128)}...`; } const type = name.includes(".") ? "property" : "argument"; super(`The ${type} '${name}' ${reason}. Received ${inspected}`); } }; var ERR_INVALID_CHAR = class extends TypeError { constructor(name, field) { let msg = `Invalid character in ${name}`; if (field !== void 0) { msg += ` ["${field}"]`; } super(msg); } }; var ERR_HTTP_INVALID_HEADER_VALUE = class extends TypeError { constructor(value, name) { super(`Invalid value "${value}" for header "${name}"`); } }; var ERR_HTTP_INVALID_STATUS_CODE = class extends RangeError { originalStatusCode; constructor(originalStatusCode) { super(`Invalid status code: ${originalStatusCode}`); this.originalStatusCode = originalStatusCode; } }; var ERR_HTTP_TRAILER_INVALID = class extends Error { constructor() { super(`Trailers are invalid with this transfer encoding`); } }; var ERR_INVALID_ARG_TYPE = class extends TypeError { constructor(name, expected, actual) { if (!Array.isArray(expected)) { expected = [expected]; } let msg = "The "; if (name.endsWith(" argument")) { msg += `${name} `; } else { const type = name.includes(".") ? "property" : "argument"; msg += `"${name}" ${type} `; } msg += "must be "; const types = []; const instances = []; const other = []; for (const value of expected) { if (kTypes.includes(value)) { types.push(value.toLowerCase()); } else if (classRegExp.exec(value) !== null) { instances.push(value); } else { other.push(value); } } if (instances.length > 0) { const pos = types.indexOf("object"); if (pos !== -1) { types.splice(pos, 1); instances.push("Object"); } } if (types.length > 0) { if (types.length > 2) { const last = types.pop(); msg += `one of type ${types.join(", ")}, or ${last}`; } else if (types.length === 2) { msg += `one of type ${types[0]} or ${types[1]}`; } else { msg += `of type ${types[0]}`; } if (instances.length > 0 || other.length > 0) msg += " or "; } if (instances.length > 0) { if (instances.length > 2) { const last = instances.pop(); msg += `an instance of ${instances.join(", ")}, or ${last}`; } else { msg += `an instance of ${instances[0]}`; if (instances.length === 2) { msg += ` or ${instances[1]}`; } } if (other.length > 0) msg += " or "; } if (other.length > 0) { if (other.length > 2) { const last = other.pop(); msg += `one of ${other.join(", ")}, or ${last}`; } else if (other.length === 2) { msg += `one of ${other[0]} or ${other[1]}`; } else { if (other[0].toLowerCase() !== other[0]) msg += "an "; msg += `${other[0]}`; } } msg += `. Received ${determineSpecificType(actual)}`; super(msg); } }; var ERR_INVALID_HTTP_TOKEN = class extends TypeError { constructor(name, field) { super(`${name} must be a valid HTTP token ["${field}"]`); } }; var ERR_METHOD_NOT_IMPLEMENTED = class extends Error { constructor(methodName) { super(`The ${methodName} method is not implemented`); } }; var ERR_STREAM_ALREADY_FINISHED = class extends Error { constructor(methodName) { super(`Cannot call ${methodName} after a stream was finished`); } }; var ERR_STREAM_CANNOT_PIPE = class extends Error { constructor() { super(`Cannot pipe, not readable`); } }; var ERR_STREAM_DESTROYED = class extends Error { constructor(methodName) { super(`Cannot call ${methodName} after a stream was destroyed`); } }; var ERR_STREAM_NULL_VALUES = class extends TypeError { constructor() { super(`May not write null values to stream`); } }; var ERR_STREAM_WRITE_AFTER_END = class extends Error { constructor() { super(`write after end`); } }; // ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/fetch-to-node/2.1.0/75a085586b95f3a18a440f8655a7cb5c851846ab2c5e6ad2c4ae036e3bbaa05c/node_modules/fetch-to-node/dist/fetch-to-node/http-incoming.js var kHeaders = /* @__PURE__ */ Symbol("kHeaders"); var kHeadersDistinct = /* @__PURE__ */ Symbol("kHeadersDistinct"); var kHeadersCount = /* @__PURE__ */ Symbol("kHeadersCount"); var kTrailers = /* @__PURE__ */ Symbol("kTrailers"); var kTrailersDistinct = /* @__PURE__ */ Symbol("kTrailersDistinct"); var kTrailersCount = /* @__PURE__ */ Symbol("kTrailersCount"); var FetchIncomingMessage = class extends stream.Readable { get socket() { return null; } set socket(_val) { throw new ERR_METHOD_NOT_IMPLEMENTED("socket"); } httpVersionMajor; httpVersionMinor; httpVersion; complete = false; [kHeaders] = null; [kHeadersDistinct] = null; [kHeadersCount] = 0; rawHeaders = []; [kTrailers] = null; [kTrailersDistinct] = null; [kTrailersCount] = 0; rawTrailers = []; joinDuplicateHeaders = false; aborted = false; upgrade = false; // request (server) only url = ""; method; // TODO: Support ClientRequest // statusCode = null; // statusMessage = null; // client = socket; _consuming; _dumped; // The underlying ReadableStream _stream = null; constructor() { const streamOptions = {}; super(streamOptions); this._readableState.readingMore = true; this._consuming = false; this._dumped = false; } get connection() { return null; } set connection(_socket) { console.error("No support for IncomingMessage.connection"); } get headers() { if (!this[kHeaders]) { this[kHeaders] = {}; const src = this.rawHeaders; const dst = this[kHeaders]; for (let n = 0; n < this[kHeadersCount]; n += 2) { this._addHeaderLine(src[n], src[n + 1], dst); } } return this[kHeaders]; } set headers(val) { this[kHeaders] = val; } get headersDistinct() { if (!this[kHeadersDistinct]) { this[kHeadersDistinct] = {}; const src = this.rawHeaders; const dst = this[kHeadersDistinct]; for (let n = 0; n < this[kHeadersCount]; n += 2) { this._addHeaderLineDistinct(src[n], src[n + 1], dst); } } return this[kHeadersDistinct]; } set headersDistinct(val) { this[kHeadersDistinct] = val; } get trailers() { if (!this[kTrailers]) { this[kTrailers] = {}; const src = this.rawTrailers; const dst = this[kTrailers]; for (let n = 0; n < this[kTrailersCount]; n += 2) { this._addHeaderLine(src[n], src[n + 1], dst); } } return this[kTrailers]; } set trailers(val) { this[kTrailers] = val; } get trailersDistinct() { if (!this[kTrailersDistinct]) { this[kTrailersDistinct] = {}; const src = this.rawTrailers; const dst = this[kTrailersDistinct]; for (let n = 0; n < this[kTrailersCount]; n += 2) { this._addHeaderLineDistinct(src[n], src[n + 1], dst); } } return this[kTrailersDistinct]; } set trailersDistinct(val) { this[kTrailersDistinct] = val; } setTimeout(msecs, callback) { return this; } async _read(n) { if (!this._consuming) { this._readableState.readingMore = false; this._consuming = true; } if (this._stream == null) { this.complete = true; this.push(null); return; } const reader = this._stream.getReader(); try { const data = await reader.read(); if (data.done) { this.complete = true; this.push(null); } else { this.push(data.value); } } catch (e) { this.destroy(e); } finally { reader.releaseLock(); } } _destroy(err, cb) { if (!this.readableEnded || !this.complete) { this.aborted = true; this.emit("aborted"); } setTimeout(onError, 0, this, err, cb); } _addHeaderLines(headers, n) { if (headers?.length) { let dest; if (this.complete) { this.rawTrailers = headers; this[kTrailersCount] = n; dest = this[kTrailers]; } else { this.rawHeaders = headers; this[kHeadersCount] = n; dest = this[kHeaders]; } if (dest) { for (let i = 0; i < n; i += 2) { this._addHeaderLine(headers[i], headers[i + 1], dest); } } } } // Add the given (field, value) pair to the message // // Per RFC2616, section 4.2 it is acceptable to join multiple instances of the // same header with a ', ' if the header in question supports specification of // multiple values this way. The one exception to this is the Cookie header, // which has multiple values joined with a '; ' instead. If a header's values // cannot be joined in either of these ways, we declare the first instance the // winner and drop the second. Extended header fields (those beginning with // 'x-') are always joined. _addHeaderLine(field, value, dest) { field = matchKnownFields(field); const flag = field.charCodeAt(0); if (flag === 0 || flag === 2) { field = field.slice(1); if (typeof dest[field] === "string") { dest[field] += (flag === 0 ? ", " : "; ") + value; } else { dest[field] = value; } } else if (flag === 1) { if (dest["set-cookie"] !== void 0) { dest["set-cookie"].push(value); } else { dest["set-cookie"] = [value]; } } else if (this.joinDuplicateHeaders) { if (dest[field] === void 0) { dest[field] = value; } else { dest[field] += ", " + value; } } else if (dest[field] === void 0) { dest[field] = value; } } _addHeaderLineDistinct(field, value, dest) { field = field.toLowerCase(); if (!dest[field]) { dest[field] = [value]; } else { dest[field].push(value); } } // Call this instead of resume() if we want to just // dump all the data to /dev/null _dump() { if (!this._dumped) { this._dumped = true; this.removeAllListeners("data"); this.resume(); } } }; function matchKnownFields(field, lowercased = false) { switch (field.length) { case 3: if (field === "Age" || field === "age") return "age"; break; case 4: if (field === "Host" || field === "host") return "host"; if (field === "From" || field === "from") return "from"; if (field === "ETag" || field === "etag") return "etag"; if (field === "Date" || field === "date") return "\0date"; if (field === "Vary" || field === "vary") return "\0vary"; break; case 6: if (field === "Server" || field === "server") return "server"; if (field === "Cookie" || field === "cookie") return "cookie"; if (field === "Origin" || field === "origin") return "\0origin"; if (field === "Expect" || field === "expect") return "\0expect"; if (field === "Accept" || field === "accept") return "\0accept"; break; case 7: if (field === "Referer" || field === "referer") return "referer"; if (field === "Expires" || field === "expires") return "expires"; if (field === "Upgrade" || field === "upgrade") return "\0upgrade"; break; case 8: if (field === "Location" || field === "location") return "location"; if (field === "If-Match" || field === "if-match") return "\0if-match"; break; case 10: if (field === "User-Agent" || field === "user-agent") return "user-agent"; if (field === "Set-Cookie" || field === "set-cookie") return ""; if (field === "Connection" || field === "connection") return "\0connection"; break; case 11: if (field === "Retry-After" || field === "retry-after") return "retry-after"; break; case 12: if (field === "Content-Type" || field === "content-type") return "content-type"; if (field === "Max-Forwards" || field === "max-forwards") return "max-forwards"; break; case 13: if (field === "Authorization" || field === "authorization") return "authorization"; if (field === "Last-Modified" || field === "last-modified") return "last-modified"; if (field === "Cache-Control" || field === "cache-control") return "\0cache-control"; if (field === "If-None-Match" || field === "if-none-match") return "\0if-none-match"; break; case 14: if (field === "Content-Length" || field === "content-length") return "content-length"; break; case 15: if (field === "Accept-Encoding" || field === "accept-encoding") return "\0accept-encoding"; if (field === "Accept-Language" || field === "accept-language") return "\0accept-language"; if (field === "X-Forwarded-For" || field === "x-forwarded-for") return "\0x-forwarded-for"; break; case 16: if (field === "Content-Encoding" || field === "content-encoding") return "\0content-encoding"; if (field === "X-Forwarded-Host" || field === "x-forwarded-host") return "\0x-forwarded-host"; break; case 17: if (field === "If-Modified-Since" || field === "if-modified-since") return "if-modified-since"; if (field === "Transfer-Encoding" || field === "transfer-encoding") return "\0transfer-encoding"; if (field === "X-Forwarded-Proto" || field === "x-forwarded-proto") return "\0x-forwarded-proto"; break; case 19: if (field === "Proxy-Authorization" || field === "proxy-authorization") return "proxy-authorization"; if (field === "If-Unmodified-Since" || field === "if-unmodified-since") return "if-unmodified-since"; break; } if (lowercased) { return "\0" + field; } return matchKnownFields(field.toLowerCase(), true); } function onError(self, error, cb) { if (self.listenerCount("error") === 0) { cb(); } else { cb(error); } } // ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/fetch-to-node/2.1.0/75a085586b95f3a18a440f8655a7cb5c851846ab2c5e6ad2c4ae036e3bbaa05c/node_modules/fetch-to-node/dist/utils/types.js function validateString(value, name) { if (typeof value !== "string") throw new ERR_INVALID_ARG_TYPE(name, "string", value); } var linkValueRegExp = /^(?:<[^>]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/; function validateLinkHeaderFormat(value, name) { if (typeof value === "undefined" || !linkValueRegExp.exec(value)) { throw new ERR_INVALID_ARG_VALUE(name, value, 'must be an array or string of format "; rel=preload; as=style"'); } } function validateLinkHeaderValue(hints) { if (typeof hints === "string") { validateLinkHeaderFormat(hints, "hints"); return hints; } else if (Array.isArray(hints)) { const hintsLength = hints.length; let result = ""; if (hintsLength === 0) { return result; } for (let i = 0; i < hintsLength; i++) { const link = hints[i]; validateLinkHeaderFormat(link, "hints"); result += link; if (i !== hintsLength - 1) { result += ", "; } } return result; } throw new ERR_INVALID_ARG_VALUE("hints", hints, 'must be an array or string of format "; rel=preload; as=style"'); } function isUint8Array(value) { return value != null && value[Symbol.toStringTag] === "Uint8Array"; } // ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/fetch-to-node/2.1.0/75a085586b95f3a18a440f8655a7cb5c851846ab2c5e6ad2c4ae036e3bbaa05c/node_modules/fetch-to-node/dist/fetch-to-node/internal-http.js var kNeedDrain = /* @__PURE__ */ Symbol("kNeedDrain"); var kOutHeaders = /* @__PURE__ */ Symbol("kOutHeaders"); function utcDate() { return (/* @__PURE__ */ new Date()).toUTCString(); } // ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/fetch-to-node/2.1.0/75a085586b95f3a18a440f8655a7cb5c851846ab2c5e6ad2c4ae036e3bbaa05c/node_modules/fetch-to-node/dist/fetch-to-node/internal-streams-state.js function getDefaultHighWaterMark(objectMode) { return objectMode ? 16 : 64 * 1024; } // ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/fetch-to-node/2.1.0/75a085586b95f3a18a440f8655a7cb5c851846ab2c5e6ad2c4ae036e3bbaa05c/node_modules/fetch-to-node/dist/fetch-to-node/http-common.js var tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; function checkIsHttpToken(val) { return tokenRegExp.test(val); } var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; function checkInvalidHeaderChar(val) { return headerCharRegex.test(val); } var chunkExpression = /(?:^|\W)chunked(?:$|\W)/i; var kCorked = /* @__PURE__ */ Symbol("corked"); var kChunkedBuffer = /* @__PURE__ */ Symbol("kChunkedBuffer"); var kChunkedLength = /* @__PURE__ */ Symbol("kChunkedLength"); var kUniqueHeaders = /* @__PURE__ */ Symbol("kUniqueHeaders"); var kBytesWritten = /* @__PURE__ */ Symbol("kBytesWritten"); var kErrored = /* @__PURE__ */ Symbol("errored"); var kHighWaterMark = /* @__PURE__ */ Symbol("kHighWaterMark"); var kRejectNonStandardBodyWrites = /* @__PURE__ */ Symbol("kRejectNonStandardBodyWrites"); var nop = () => { }; var RE_CONN_CLOSE = /(?:^|\W)close(?:$|\W)/i; function isCookieField(s) { return s.length === 6 && s.toLowerCase() === "cookie"; } function isContentDispositionField(s) { return s.length === 19 && s.toLowerCase() === "content-disposition"; } var WrittenDataBuffer = class { [kCorked] = 0; [kHighWaterMark] = getDefaultHighWaterMark(); entries = []; onWrite; constructor(params = {}) { this.onWrite = params.onWrite; } write(data, encoding, callback) { this.entries.push({ data, length: data.length, encoding, callback, written: false }); this._flush(); return true; } cork() { this[kCorked]++; } uncork() { this[kCorked]--; this._flush(); } _flush() { if (this[kCorked] <= 0) { for (const [index, entry] of this.entries.entries()) { if (!entry.written) { entry.written = true; if (this.onWrite != null) { this.onWrite(index, entry); } if (entry.callback != null) { entry.callback.call(void 0); } } } } } get writableLength() { return this.entries.reduce((acc, entry) => { return acc + (entry.written && entry.length ? entry.length : 0); }, 0); } get writableHighWaterMark() { return this[kHighWaterMark]; } get writableCorked() { return this[kCorked]; } }; var FetchOutgoingMessage = class extends stream.Writable { req; outputData; outputSize; // Difference from Node.js - // `writtenHeaderBytes` is the number of bytes the header has taken. // Since Node.js writes both the headers and body into the same outgoing // stream, it helps to keep track of this so that we can skip that many bytes // from the beginning of the stream when providing the outgoing stream. writtenHeaderBytes = 0; _last; chunkedEncoding; shouldKeepAlive; maxRequestsOnConnectionReached; _defaultKeepAlive; useChunkedEncodingByDefault; sendDate; _removedConnection; _removedContLen; _removedTE; strictContentLength; [kBytesWritten]; _contentLength; _hasBody; _trailer; [kNeedDrain]; finished; _headerSent; [kCorked]; [kChunkedBuffer]; [kChunkedLength]; _closed; // Difference from Node.js - // In Node.js, this is a socket object. // [kSocket]: null; _header; [kOutHeaders]; _keepAliveTimeout; _maxRequestsPerSocket; _onPendingData; [kUniqueHeaders]; [kErrored]; [kHighWaterMark]; [kRejectNonStandardBodyWrites]; _writtenDataBuffer = new WrittenDataBuffer({ onWrite: this._onDataWritten.bind(this) }); constructor(req, options) { super(); this.req = req; this.outputData = []; this.outputSize = 0; this.destroyed = false; this._last = false; this.chunkedEncoding = false; this.shouldKeepAlive = true; this.maxRequestsOnConnectionReached = false; this._defaultKeepAlive = true; this.useChunkedEncodingByDefault = true; this.sendDate = false; this._removedConnection = false; this._removedContLen = false; this._removedTE = false; this.strictContentLength = false; this[kBytesWritten] = 0; this._contentLength = null; this._hasBody = true; this._trailer = ""; this[kNeedDrain] = false; this.finished = false; this._headerSent = false; this[kCorked] = 0; this[kChunkedBuffer] = []; this[kChunkedLength] = 0; this._closed = false; this._header = null; this[kOutHeaders] = null; this._keepAliveTimeout = 0; this._onPendingData = nop; this[kErrored] = null; this[kHighWaterMark] = options?.highWaterMark ?? getDefaultHighWaterMark(); this[kRejectNonStandardBodyWrites] = options?.rejectNonStandardBodyWrites ?? false; this[kUniqueHeaders] = null; } _renderHeaders() { if (this._header) { throw new ERR_HTTP_HEADERS_SENT("render"); } const headersMap = this[kOutHeaders]; const headers = {}; if (headersMap !== null) { const keys = Object.keys(headersMap); for (let i = 0, l = keys.length; i < l; i++) { const key = keys[i]; headers[headersMap[key][0]] = headersMap[key][1]; } } return headers; } cork() { this[kCorked]++; if (this._writtenDataBuffer != null) { this._writtenDataBuffer.cork(); } } uncork() { this[kCorked]--; if (this._writtenDataBuffer != null) { this._writtenDataBuffer.uncork(); } if (this[kCorked] || this[kChunkedBuffer].length === 0) { return; } const buf = this[kChunkedBuffer]; for (const { data, encoding, callback } of buf) { this._send(data ?? "", encoding, callback); } this[kChunkedBuffer].length = 0; this[kChunkedLength] = 0; } setTimeout(msecs, callback) { return this; } destroy(error) { if (this.destroyed) { return this; } this.destroyed = true; this[kErrored] = error; return this; } _send(data, encoding, callback, byteLength) { if (!this._headerSent) { const header = this._header; if (typeof data === "string" && (encoding === "utf8" || encoding === "latin1" || !encoding)) { data = header + data; } else { this.outputData.unshift({ data: header, encoding: "latin1", callback: void 0 }); this.outputSize += header.length; this._onPendingData(header.length); } this._headerSent = true; this.writtenHeaderBytes = header.length; const [statusLine, ...headerLines] = this._header.split("\r\n"); const STATUS_LINE_REGEXP = /^HTTP\/1\.1 (?\d+) (?.*)$/; const statusLineResult = STATUS_LINE_REGEXP.exec(statusLine); if (statusLineResult == null) { throw new Error("Unexpected! Status line was " + statusLine); } const { statusCode: statusCodeText, statusMessage } = statusLineResult.groups ?? {}; const statusCode = parseInt(statusCodeText, 10); const headers = []; for (const headerLine of headerLines) { if (headerLine !== "") { const pos = headerLine.indexOf(": "); const k = headerLine.slice(0, pos); const v = headerLine.slice(pos + 2); headers.push([k, v]); } } const event = { statusCode, statusMessage, headers }; this.emit("_headersSent", event); } return this._writeRaw(data, encoding, callback, byteLength); } _writeRaw(data, encoding, callback, size) { if (typeof encoding === "function") { callback = encoding; encoding = null; } if (this._writtenDataBuffer != null) { if (this.outputData.length) { this._flushOutput(this._writtenDataBuffer); } return this._writtenDataBuffer.write(data, encoding, callback); } this.outputData.push({ data, encoding, callback }); this.outputSize += data.length; this._onPendingData(data.length); return this.outputSize < this[kHighWaterMark]; } _onDataWritten(index, entry) { const event = { index, entry }; this.emit("_dataWritten", event); } _storeHeader(firstLine, headers) { const state = { connection: false, contLen: false, te: false, date: false, expect: false, trailer: false, header: firstLine }; if (headers) { if (headers === this[kOutHeaders]) { for (const key in headers) { const entry = headers[key]; processHeader(this, state, entry[0], entry[1], false); } } else if (Array.isArray(headers)) { if (headers.length && Array.isArray(headers[0])) { for (let i = 0; i < headers.length; i++) { const entry = headers[i]; processHeader(this, state, entry[0], entry[1], true); } } else { if (headers.length % 2 !== 0) { throw new ERR_INVALID_ARG_VALUE("headers", headers); } for (let n = 0; n < headers.length; n += 2) { processHeader(this, state, headers[n], headers[n + 1], true); } } } else { for (const key in headers) { if (headers.hasOwnProperty(key)) { const _headers = headers; processHeader(this, state, key, _headers[key], true); } } } } let { header } = state; if (this.sendDate && !state.date) { header += "Date: " + utcDate() + "\r\n"; } if (this.chunkedEncoding && (this.statusCode === 204 || this.statusCode === 304)) { this.chunkedEncoding = false; this.shouldKeepAlive = false; } if (this._removedConnection) { this._last = !this.shouldKeepAlive; } else if (!state.connection) { const shouldSendKeepAlive = this.shouldKeepAlive && (state.contLen || this.useChunkedEncodingByDefault); if (shouldSendKeepAlive && this.maxRequestsOnConnectionReached) { header += "Connection: close\r\n"; } else if (shouldSendKeepAlive) { header += "Connection: keep-alive\r\n"; if (this._keepAliveTimeout && this._defaultKeepAlive) { const timeoutSeconds = Math.floor(this._keepAliveTimeout / 1e3); let max = ""; if (this._maxRequestsPerSocket && ~~this._maxRequestsPerSocket > 0) { max = `, max=${this._maxRequestsPerSocket}`; } header += `Keep-Alive: timeout=${timeoutSeconds}${max}\r `; } } else { this._last = true; header += "Connection: close\r\n"; } } if (!state.contLen && !state.te) { if (!this._hasBody) { this.chunkedEncoding = false; } else if (!this.useChunkedEncodingByDefault) { this._last = true; } else if (!state.trailer && !this._removedContLen && typeof this._contentLength === "number") { header += "Content-Length: " + this._contentLength + "\r\n"; } else if (!this._removedTE) { header += "Transfer-Encoding: chunked\r\n"; this.chunkedEncoding = true; } else { this._last = true; } } if (this.chunkedEncoding !== true && state.trailer) { throw new ERR_HTTP_TRAILER_INVALID(); } this._header = header + "\r\n"; this._headerSent = false; if (state.expect) { this._send(""); } } get _headers() { console.warn("DEP0066: OutgoingMessage.prototype._headers is deprecated"); return this.getHeaders(); } set _headers(val) { console.warn("DEP0066: OutgoingMessage.prototype._headers is deprecated"); if (val == null) { this[kOutHeaders] = null; } else if (typeof val === "object") { const headers = this[kOutHeaders] = /* @__PURE__ */ Object.create(null); const keys = Object.keys(val); for (let i = 0; i < keys.length; ++i) { const name = keys[i]; headers[name.toLowerCase()] = [name, val[name]]; } } } get connection() { return null; } set connection(_socket) { console.error("No support for OutgoingMessage.connection"); } get socket() { return null; } set socket(_socket) { console.error("No support for OutgoingMessage.socket"); } get _headerNames() { console.warn("DEP0066: OutgoingMessage.prototype._headerNames is deprecated"); const headers = this[kOutHeaders]; if (headers !== null) { const out = /* @__PURE__ */ Object.create(null); const keys = Object.keys(headers); for (let i = 0; i < keys.length; ++i) { const key = keys[i]; const val = headers[key][0]; out[key] = val; } return out; } return null; } set _headerNames(val) { console.warn("DEP0066: OutgoingMessage.prototype._headerNames is deprecated"); if (typeof val === "object" && val !== null) { const headers = this[kOutHeaders]; if (!headers) return; const keys = Object.keys(val); for (let i = 0; i < keys.length; ++i) { const header = headers[keys[i]]; if (header) header[0] = val[keys[i]]; } } } setHeader(name, value) { if (this._header) { throw new ERR_HTTP_HEADERS_SENT("set"); } validateHeaderName(name); validateHeaderValue(name, value); let headers = this[kOutHeaders]; if (headers === null) { this[kOutHeaders] = headers = { __proto__: null }; } headers[name.toLowerCase()] = [name, value]; return this; } setHeaders(headers) { if (this._header) { throw new ERR_HTTP_HEADERS_SENT("set"); } if (!headers || Array.isArray(headers) || typeof headers.keys !== "function" || typeof headers.get !== "function") { throw new ERR_INVALID_ARG_TYPE("headers", ["Headers", "Map"], headers); } const cookies = []; for (const { 0: key, 1: value } of headers) { if (key === "set-cookie") { if (Array.isArray(value)) { cookies.push(...value); } else { cookies.push(value); } continue; } this.setHeader(key, value); } if (cookies.length) { this.setHeader("set-cookie", cookies); } return this; } appendHeader(name, value) { if (this._header) { throw new ERR_HTTP_HEADERS_SENT("append"); } validateHeaderName(name); validateHeaderValue(name, value); const field = name.toLowerCase(); const headers = this[kOutHeaders]; if (headers === null || !headers[field]) { return this.setHeader(name, value); } if (!Array.isArray(headers[field][1])) { headers[field][1] = [headers[field][1]]; } const existingValues = headers[field][1]; if (Array.isArray(value)) { for (let i = 0, length = value.length; i < length; i++) { existingValues.push(value[i]); } } else { existingValues.push(value); } return this; } getHeader(name) { validateString(name, "name"); const headers = this[kOutHeaders]; if (headers === null) { return; } const entry = headers[name.toLowerCase()]; return entry?.[1]; } getHeaderNames() { return this[kOutHeaders] !== null ? Object.keys(this[kOutHeaders]) : []; } getRawHeaderNames() { const headersMap = this[kOutHeaders]; if (headersMap === null) return []; const values = Object.values(headersMap); const headers = Array(values.length); for (let i = 0, l = values.length; i < l; i++) { headers[i] = values[i][0]; } return headers; } getHeaders() { const headers = this[kOutHeaders]; const ret = { __proto__: null }; if (headers) { const keys = Object.keys(headers); for (let i = 0; i < keys.length; ++i) { const key = keys[i]; const val = headers[key][1]; ret[key] = val; } } return ret; } hasHeader(name) { validateString(name, "name"); return this[kOutHeaders] !== null && !!this[kOutHeaders][name.toLowerCase()]; } removeHeader(name) { validateString(name, "name"); if (this._header) { throw new ERR_HTTP_HEADERS_SENT("remove"); } const key = name.toLowerCase(); switch (key) { case "connection": this._removedConnection = true; break; case "content-length": this._removedContLen = true; break; case "transfer-encoding": this._removedTE = true; break; case "date": this.sendDate = false; break; } if (this[kOutHeaders] !== null) { delete this[kOutHeaders][key]; } } _implicitHeader() { throw new ERR_METHOD_NOT_IMPLEMENTED("_implicitHeader()"); } get headersSent() { return !!this._header; } write(chunk, encoding, callback) { if (typeof encoding === "function") { callback = encoding; encoding = null; } const ret = write_(this, chunk, encoding, callback, false); if (!ret) { this[kNeedDrain] = true; } return ret; } addTrailers(headers) { this._trailer = ""; const isArray = Array.isArray(headers); const keys = isArray ? [...headers.keys()] : Object.keys(headers); for (let i = 0, l = keys.length; i < l; i++) { let field, value; if (isArray) { const _headers = headers; const key = keys[i]; field = _headers[key][0]; value = _headers[key][1]; } else { const _headers = headers; const key = keys[i]; field = key; value = _headers[key]; } validateHeaderName(field, "Trailer name"); if (Array.isArray(value) && value.length > 1 && (!this[kUniqueHeaders] || !this[kUniqueHeaders].has(field.toLowerCase()))) { for (let j = 0, l2 = value.length; j < l2; j++) { if (checkInvalidHeaderChar(value[j])) { throw new ERR_INVALID_CHAR("trailer content", field); } this._trailer += field + ": " + value[j] + "\r\n"; } } else { if (Array.isArray(value)) { value = value.join("; "); } if (checkInvalidHeaderChar(String(value))) { throw new ERR_INVALID_CHAR("trailer content", field); } this._trailer += field + ": " + value + "\r\n"; } } } end(chunk, encoding, callback) { if (typeof chunk === "function") { callback = chunk; chunk = null; encoding = null; } else if (typeof encoding === "function") { callback = encoding; encoding = null; } if (chunk) { if (this.finished) { onError2(this, new ERR_STREAM_WRITE_AFTER_END(), typeof callback !== "function" ? nop : callback); return this; } if (this._writtenDataBuffer != null) { this._writtenDataBuffer.cork(); } write_(this, chunk, encoding, null, true); } else if (this.finished) { if (typeof callback === "function") { if (!this.writableFinished) { this.on("finish", callback); } else { callback(new ERR_STREAM_ALREADY_FINISHED("end")); } } return this; } else if (!this._header) { if (this._writtenDataBuffer != null) { this._writtenDataBuffer.cork(); } this._contentLength = 0; this._implicitHeader(); } if (typeof callback === "function") this.once("finish", callback); if (strictContentLength(this) && this[kBytesWritten] !== this._contentLength) { throw new ERR_HTTP_CONTENT_LENGTH_MISMATCH(this[kBytesWritten], this._contentLength); } const finish = onFinish.bind(void 0, this); if (this._hasBody && this.chunkedEncoding) { this._send("", "latin1", finish); } else if (!this._headerSent || this.writableLength || chunk) { this._send("", "latin1", finish); } else { setTimeout(finish, 0); } if (this._writtenDataBuffer != null) { this._writtenDataBuffer.uncork(); } this[kCorked] = 1; this.uncork(); this.finished = true; if (this.outputData.length === 0 && this._writtenDataBuffer != null) { this._finish(); } return this; } _finish() { this.emit("prefinish"); } // No _flush() implementation? _flush() { if (this._writtenDataBuffer != null) { const ret = this._flushOutput(this._writtenDataBuffer); if (this.finished) { this._finish(); } else if (ret && this[kNeedDrain]) { this[kNeedDrain] = false; this.emit("drain"); } } } _flushOutput(dataBuffer) { while (this[kCorked]) { this[kCorked]--; dataBuffer.cork(); } const outputLength = this.outputData.length; if (outputLength <= 0) { return void 0; } const outputData = this.outputData; dataBuffer.cork(); let ret; for (let i = 0; i < outputLength; i++) { const { data, encoding, callback } = outputData[i]; outputData[i].data = null; ret = dataBuffer.write(data ?? "", encoding, callback); } dataBuffer.uncork(); this.outputData = []; this._onPendingData(-this.outputSize); this.outputSize = 0; return ret; } flushHeaders() { if (!this._header) { this._implicitHeader(); } this._send(""); } pipe(destination) { this.emit("error", new ERR_STREAM_CANNOT_PIPE()); return destination; } }; function processHeader(self, state, key, value, validate) { if (validate) { validateHeaderName(key); } if (isContentDispositionField(key) && self._contentLength) { if (Array.isArray(value)) { for (let i = 0; i < value.length; i++) { value[i] = String(buffer.Buffer.from(String(value[i]), "latin1")); } } else { value = String(buffer.Buffer.from(String(value), "latin1")); } } if (Array.isArray(value)) { if ((value.length < 2 || !isCookieField(key)) && (!self[kUniqueHeaders] || !self[kUniqueHeaders].has(key.toLowerCase()))) { for (let i = 0; i < value.length; i++) { storeHeader(self, state, key, value[i], validate); } return; } value = value.join("; "); } storeHeader(self, state, key, String(value), validate); } function storeHeader(self, state, key, value, validate) { if (validate) { validateHeaderValue(key, value); } state.header += key + ": " + value + "\r\n"; matchHeader(self, state, key, value); } function validateHeaderName(name, label) { if (typeof name !== "string" || !name || !checkIsHttpToken(name)) { throw new ERR_INVALID_HTTP_TOKEN(label || "Header name", name); } } function validateHeaderValue(name, value) { if (value === void 0) { throw new ERR_HTTP_INVALID_HEADER_VALUE(String(value), name); } if (checkInvalidHeaderChar(String(value))) { throw new ERR_INVALID_CHAR("header content", name); } } function matchHeader(self, state, field, value) { if (field.length < 4 || field.length > 17) return; field = field.toLowerCase(); switch (field) { case "connection": state.connection = true; self._removedConnection = false; if (RE_CONN_CLOSE.exec(value) !== null) self._last = true; else self.shouldKeepAlive = true; break; case "transfer-encoding": state.te = true; self._removedTE = false; if (chunkExpression.exec(value) !== null) self.chunkedEncoding = true; break; case "content-length": state.contLen = true; self._contentLength = +value; self._removedContLen = false; break; case "date": case "expect": case "trailer": state[field] = true; break; case "keep-alive": self._defaultKeepAlive = false; break; } } function onError2(msg, err, callback) { if (msg.destroyed) { return; } setTimeout(emitErrorNt, 0, msg, err, callback); } function emitErrorNt(msg, err, callback) { callback(err); if (typeof msg.emit === "function" && !msg.destroyed) { msg.emit("error", err); } } function strictContentLength(msg) { return msg.strictContentLength && msg._contentLength != null && msg._hasBody && !msg._removedContLen && !msg.chunkedEncoding && !msg.hasHeader("transfer-encoding"); } function write_(msg, chunk, encoding, callback, fromEnd) { if (typeof callback !== "function") { callback = nop; } if (chunk === null) { throw new ERR_STREAM_NULL_VALUES(); } else if (typeof chunk !== "string" && !isUint8Array(chunk)) { throw new ERR_INVALID_ARG_TYPE("chunk", ["string", "Buffer", "Uint8Array"], chunk); } let err = void 0; if (msg.finished) { err = new ERR_STREAM_WRITE_AFTER_END(); } else if (msg.destroyed) { err = new ERR_STREAM_DESTROYED("write"); } if (err) { if (!msg.destroyed) { onError2(msg, err, callback); } else { setTimeout(callback, 0, err); } return false; } let len = void 0; if (msg.strictContentLength) { len ??= typeof chunk === "string" ? buffer.Buffer.byteLength(chunk, encoding ?? void 0) : chunk.byteLength; if (strictContentLength(msg) && (fromEnd ? msg[kBytesWritten] + len !== msg._contentLength : msg[kBytesWritten] + len > (msg._contentLength ?? 0))) { throw new ERR_HTTP_CONTENT_LENGTH_MISMATCH(len + msg[kBytesWritten], msg._contentLength); } msg[kBytesWritten] += len; } if (!msg._header) { if (fromEnd) { len ??= typeof chunk === "string" ? buffer.Buffer.byteLength(chunk, encoding ?? void 0) : chunk.byteLength; msg._contentLength = len; } msg._implicitHeader(); } if (!msg._hasBody) { if (msg[kRejectNonStandardBodyWrites]) { throw new ERR_HTTP_BODY_NOT_ALLOWED(); } else { setTimeout(callback, 0); return true; } } if (!fromEnd && msg._writtenDataBuffer != null && !msg._writtenDataBuffer.writableCorked) { msg._writtenDataBuffer.cork(); setTimeout(connectionCorkNT, 0, msg._writtenDataBuffer); } let ret; if (msg.chunkedEncoding && chunk.length !== 0) { len ??= typeof chunk === "string" ? buffer.Buffer.byteLength(chunk, encoding ?? void 0) : chunk.byteLength; if (msg[kCorked] && msg._headerSent) { msg[kChunkedBuffer].push({ data: chunk, encoding, callback }); msg[kChunkedLength] += len; ret = msg[kChunkedLength] < msg[kHighWaterMark]; } else { ret = msg._send(chunk, encoding, callback, len); } } else { ret = msg._send(chunk, encoding, callback, len); } return ret; } function connectionCorkNT(dataBuffer) { dataBuffer.uncork(); } function onFinish(outmsg) { outmsg.emit("finish"); } Object.defineProperties(FetchOutgoingMessage.prototype, { errored: { get() { return this[kErrored]; } }, closed: { get() { return this._closed; } }, writableFinished: { get() { return this.finished && this.outputSize === 0 && (this._writtenDataBuffer == null || this._writtenDataBuffer.writableLength === 0); } }, writableObjectMode: { get() { return false; } }, writableLength: { get() { return this.outputSize + this[kChunkedLength] + (this._writtenDataBuffer != null ? this._writtenDataBuffer.writableLength : 0); } }, writableHighWaterMark: { get() { return this._writtenDataBuffer != null ? this._writtenDataBuffer.writableHighWaterMark : this[kHighWaterMark]; } }, writableCorked: { get() { return this[kCorked]; } }, writableEnded: { get() { return this.finished; } }, writableNeedDrain: { get() { return !this.destroyed && !this.finished && this[kNeedDrain]; } } }); var headerCharRegex2 = /[^\t\x20-\x7e\x80-\xff]/; function checkInvalidHeaderChar2(val) { return headerCharRegex2.test(val); } var STATUS_CODES = { 100: "Continue", // RFC 7231 6.2.1 101: "Switching Protocols", // RFC 7231 6.2.2 102: "Processing", // RFC 2518 10.1 (obsoleted by RFC 4918) 103: "Early Hints", // RFC 8297 2 200: "OK", // RFC 7231 6.3.1 201: "Created", // RFC 7231 6.3.2 202: "Accepted", // RFC 7231 6.3.3 203: "Non-Authoritative Information", // RFC 7231 6.3.4 204: "No Content", // RFC 7231 6.3.5 205: "Reset Content", // RFC 7231 6.3.6 206: "Partial Content", // RFC 7233 4.1 207: "Multi-Status", // RFC 4918 11.1 208: "Already Reported", // RFC 5842 7.1 226: "IM Used", // RFC 3229 10.4.1 300: "Multiple Choices", // RFC 7231 6.4.1 301: "Moved Permanently", // RFC 7231 6.4.2 302: "Found", // RFC 7231 6.4.3 303: "See Other", // RFC 7231 6.4.4 304: "Not Modified", // RFC 7232 4.1 305: "Use Proxy", // RFC 7231 6.4.5 307: "Temporary Redirect", // RFC 7231 6.4.7 308: "Permanent Redirect", // RFC 7238 3 400: "Bad Request", // RFC 7231 6.5.1 401: "Unauthorized", // RFC 7235 3.1 402: "Payment Required", // RFC 7231 6.5.2 403: "Forbidden", // RFC 7231 6.5.3 404: "Not Found", // RFC 7231 6.5.4 405: "Method Not Allowed", // RFC 7231 6.5.5 406: "Not Acceptable", // RFC 7231 6.5.6 407: "Proxy Authentication Required", // RFC 7235 3.2 408: "Request Timeout", // RFC 7231 6.5.7 409: "Conflict", // RFC 7231 6.5.8 410: "Gone", // RFC 7231 6.5.9 411: "Length Required", // RFC 7231 6.5.10 412: "Precondition Failed", // RFC 7232 4.2 413: "Payload Too Large", // RFC 7231 6.5.11 414: "URI Too Long", // RFC 7231 6.5.12 415: "Unsupported Media Type", // RFC 7231 6.5.13 416: "Range Not Satisfiable", // RFC 7233 4.4 417: "Expectation Failed", // RFC 7231 6.5.14 418: "I'm a Teapot", // RFC 7168 2.3.3 421: "Misdirected Request", // RFC 7540 9.1.2 422: "Unprocessable Entity", // RFC 4918 11.2 423: "Locked", // RFC 4918 11.3 424: "Failed Dependency", // RFC 4918 11.4 425: "Too Early", // RFC 8470 5.2 426: "Upgrade Required", // RFC 2817 and RFC 7231 6.5.15 428: "Precondition Required", // RFC 6585 3 429: "Too Many Requests", // RFC 6585 4 431: "Request Header Fields Too Large", // RFC 6585 5 451: "Unavailable For Legal Reasons", // RFC 7725 3 500: "Internal Server Error", // RFC 7231 6.6.1 501: "Not Implemented", // RFC 7231 6.6.2 502: "Bad Gateway", // RFC 7231 6.6.3 503: "Service Unavailable", // RFC 7231 6.6.4 504: "Gateway Timeout", // RFC 7231 6.6.5 505: "HTTP Version Not Supported", // RFC 7231 6.6.6 506: "Variant Also Negotiates", // RFC 2295 8.1 507: "Insufficient Storage", // RFC 4918 11.5 508: "Loop Detected", // RFC 5842 7.2 509: "Bandwidth Limit Exceeded", 510: "Not Extended", // RFC 2774 7 511: "Network Authentication Required" // RFC 6585 6 }; var FetchServerResponse = class _FetchServerResponse extends FetchOutgoingMessage { static encoder = new TextEncoder(); statusCode = 200; statusMessage; _sent100; _expect_continue; [kOutHeaders] = null; constructor(req, options) { super(req, options); if (req.method === "HEAD") { this._hasBody = false; } this.sendDate = true; this._sent100 = false; this._expect_continue = false; if (req.httpVersionMajor < 1 || req.httpVersionMinor < 1) { this.useChunkedEncodingByDefault = chunkExpression.exec(String(req.headers.te)) !== null; this.shouldKeepAlive = false; } this.fetchResponse = new Promise((resolve) => { let finished = false; this.on("finish", () => { finished = true; }); const initialDataChunks = []; const initialDataWrittenHandler = (e) => { if (finished) { return; } initialDataChunks[e.index] = this.dataFromDataWrittenEvent(e); }; this.on("_dataWritten", initialDataWrittenHandler); this.on("_headersSent", (e) => { this.off("_dataWritten", initialDataWrittenHandler); const { statusCode, statusMessage, headers } = e; resolve(this._toFetchResponse(statusCode, statusMessage, headers, initialDataChunks, finished)); }); }); } dataFromDataWrittenEvent(e) { const { index, entry } = e; let { data, encoding } = entry; if (index === 0) { if (typeof data !== "string") { console.error("First chunk should be string, not sure what happened."); throw new ERR_INVALID_ARG_TYPE("packet.data", ["string", "Buffer", "Uint8Array"], data); } data = data.slice(this.writtenHeaderBytes); } if (typeof data === "string") { if (encoding === void 0 || encoding === "utf8" || encoding === "utf-8") { data = _FetchServerResponse.encoder.encode(data); } else { data = buffer.Buffer.from(data, encoding ?? void 0); } } return data ?? buffer.Buffer.from([]); } _finish() { super._finish(); } assignSocket(socket) { throw new ERR_METHOD_NOT_IMPLEMENTED("assignSocket"); } detachSocket(socket) { throw new ERR_METHOD_NOT_IMPLEMENTED("detachSocket"); } writeContinue(callback) { this._writeRaw("HTTP/1.1 100 Continue\r\n\r\n", "ascii", callback); this._sent100 = true; } writeProcessing(callback) { this._writeRaw("HTTP/1.1 102 Processing\r\n\r\n", "ascii", callback); } writeEarlyHints(hints, callback) { let head = "HTTP/1.1 103 Early Hints\r\n"; if (hints.link === null || hints.link === void 0) { return; } const link = validateLinkHeaderValue(hints.link); if (link.length === 0) { return; } head += "Link: " + link + "\r\n"; for (const key of Object.keys(hints)) { if (key !== "link") { head += key + ": " + hints[key] + "\r\n"; } } head += "\r\n"; this._writeRaw(head, "ascii", callback); } _implicitHeader() { this.writeHead(this.statusCode); } writeHead(statusCode, reason, obj) { if (this._header) { throw new ERR_HTTP_HEADERS_SENT("write"); } const originalStatusCode = statusCode; statusCode |= 0; if (statusCode < 100 || statusCode > 999) { throw new ERR_HTTP_INVALID_STATUS_CODE(originalStatusCode); } if (typeof reason === "string") { this.statusMessage = reason; } else { this.statusMessage ||= STATUS_CODES[statusCode] || "unknown"; obj ??= reason; } this.statusCode = statusCode; let headers; if (this[kOutHeaders]) { let k; if (Array.isArray(obj)) { if (obj.length % 2 !== 0) { throw new ERR_INVALID_ARG_VALUE("headers", obj); } for (let n = 0; n < obj.length; n += 2) { k = obj[n + 0]; this.removeHeader(String(k)); } for (let n = 0; n < obj.length; n += 2) { k = obj[n]; if (k) { this.appendHeader(String(k), obj[n + 1]); } } } else if (obj) { const keys = Object.keys(obj); for (let i = 0; i < keys.length; i++) { k = keys[i]; if (k) { this.setHeader(k, obj[k]); } } } headers = this[kOutHeaders]; } else { headers = obj; } if (checkInvalidHeaderChar2(this.statusMessage)) { throw new ERR_INVALID_CHAR("statusMessage"); } const statusLine = `HTTP/1.1 ${statusCode} ${this.statusMessage}\r `; if (statusCode === 204 || statusCode === 304 || statusCode >= 100 && statusCode <= 199) { this._hasBody = false; } if (this._expect_continue && !this._sent100) { this.shouldKeepAlive = false; } const convertedHeaders = headers && !Array.isArray(headers) ? headers : headers; this._storeHeader(statusLine, convertedHeaders ?? null); return this; } // Docs-only deprecated: DEP0063 writeHeader = this.writeHead; fetchResponse; _toFetchResponse(status, statusText, sentHeaders, initialDataChunks, finished) { const headers = new Headers(); for (const [header, value] of sentHeaders) { headers.append(header, value); } const _this = this; let body = this._hasBody ? new ReadableStream({ start(controller) { for (const dataChunk of initialDataChunks) { controller.enqueue(dataChunk); } if (finished) { controller.close(); } else { _this.on("finish", () => { finished = true; controller.close(); }); _this.on("_dataWritten", (e) => { if (finished) { return; } const data = _this.dataFromDataWrittenEvent(e); controller.enqueue(data); }); } } }) : null; if (body != null && typeof FixedLengthStream !== "undefined") { const contentLength = parseInt(headers.get("content-length") ?? "", 10); if (contentLength >= 0) { body = body.pipeThrough(new FixedLengthStream(contentLength)); } } return new Response(body, { status, statusText, headers }); } }; function toReqRes(req, options) { const { createIncomingMessage = () => new FetchIncomingMessage(), createServerResponse = (incoming2) => new FetchServerResponse(incoming2), ctx } = {}; const incoming = createIncomingMessage(ctx); const serverResponse = createServerResponse(incoming, ctx); const reqUrl = new URL(req.url); const versionMajor = 1; const versionMinor = 1; incoming.httpVersionMajor = versionMajor; incoming.httpVersionMinor = versionMinor; incoming.httpVersion = `${versionMajor}.${versionMinor}`; incoming.url = reqUrl.pathname + reqUrl.search; incoming.upgrade = false; const headers = []; for (const [headerName, headerValue] of req.headers) { headers.push(headerName); headers.push(headerValue); } incoming._addHeaderLines(headers, headers.length); incoming.method = req.method; incoming._stream = req.body; return { req: incoming, res: serverResponse }; } function toFetchResponse(res) { if (!(res instanceof FetchServerResponse)) { throw new Error("toFetchResponse must be called on a ServerResponse generated by toReqRes"); } return res.fetchResponse; } async function setupBrowserStream(app, config) { let createNodeWebSocket; try { const mod = "@hono/node-ws"; const honoNodeWs = await import( /* @vite-ignore */ /* webpackIgnore: true */ mod ); createNodeWebSocket = honoNodeWs.createNodeWebSocket; } catch { return null; } const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app }); const registry = new browserStream.ViewerRegistry(); const rawPrefix = config.apiPrefix ?? "/api"; const trimmed = rawPrefix.endsWith("/") ? rawPrefix.slice(0, -1) : rawPrefix; const apiPrefix = trimmed || "/api"; app.get( "/browser/:agentId/stream", upgradeWebSocket((c) => { const agentId = c.req.param("agentId"); const threadId = c.req.query("threadId"); const viewerKey = threadId ? `${agentId}:${threadId}` : agentId; return { onOpen(_event, ws) { ws.send(JSON.stringify({ status: "connected" })); void registry.addViewer(viewerKey, ws, config.getToolset, agentId, threadId); }, onMessage(event, _ws) { const data = typeof event.data === "string" ? event.data : null; if (data) { void browserStream.handleInputMessage(data, config.getToolset, agentId, threadId); } }, onClose(_event, ws) { void registry.removeViewer(viewerKey, ws); }, onError(event, ws) { console.error("[BrowserStream] WebSocket error:", event); void registry.removeViewer(viewerKey, ws); } }; }) ); app.get(`${apiPrefix}/agents/:agentId/browser/session`, async (c) => { const agentId = c.req.param("agentId"); if (!agentId) { return c.json({ error: "Agent ID is required" }, 400); } const threadId = c.req.query("threadId"); const toolset = await config.getToolset(agentId); if (!toolset) { return c.json({ hasSession: false, screencastAvailable: true }); } const hasSession = threadId ? toolset.hasThreadSession(threadId) : false; return c.json({ hasSession, screencastAvailable: true }); }); app.post(`${apiPrefix}/agents/:agentId/browser/close`, async (c) => { const agentId = c.req.param("agentId"); if (!agentId) { return c.json({ error: "Agent ID is required" }, 400); } const toolset = await config.getToolset(agentId); if (!toolset) { return c.json({ error: "No browser session for this agent" }, 404); } try { let threadId; try { const body = await c.req.json(); threadId = body?.threadId; } catch { } const scope = toolset.getScope(); const viewerKey = threadId ? `${agentId}:${threadId}` : agentId; if (scope === "thread" && threadId) { await registry.closeBrowserSession(viewerKey); if ("closeThreadSession" in toolset && typeof toolset.closeThreadSession === "function") { await toolset.closeThreadSession(threadId); } } else { await registry.closeBrowserSession(viewerKey); await toolset.close(); } return c.json({ success: true }); } catch (error) { console.error(`[BrowserStream] Error closing browser for ${agentId}:`, error); return c.json({ error: "Failed to close browser" }, 500); } }); return { injectWebSocket, registry }; } var _hasPermissionPromise; function loadHasPermission() { if (!_hasPermissionPromise) { _hasPermissionPromise = import('@mastra/core/auth/ee').then((m) => m.hasPermission).catch(() => { console.error( "[@mastra/hono] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest" ); return void 0; }); } return _hasPermissionPromise; } var MastraServer = class extends serverAdapter.MastraServer { createContextMiddleware() { return async (c, next) => { const originalJson = c.req.json.bind(c.req); let jsonPromise; c.req.json = () => { if (!jsonPromise) { jsonPromise = originalJson().then((body) => { c.set("cachedBody", body); return body; }); } return jsonPromise; }; let bodyRequestContext; let paramsRequestContext; if (c.req.method === "POST" || c.req.method === "PUT") { const contentType = c.req.header("content-type"); const contentLength = c.req.header("content-length"); if (contentType?.includes("application/json") && contentLength !== "0") { try { const body = await c.req.raw.clone().json(); if (body.requestContext) { bodyRequestContext = body.requestContext; } } catch { } } } if (c.req.method === "GET") { try { const encodedRequestContext = c.req.query("requestContext"); if (encodedRequestContext) { try { paramsRequestContext = JSON.parse(encodedRequestContext); } catch { try { const json = Buffer.from(encodedRequestContext, "base64").toString("utf-8"); paramsRequestContext = JSON.parse(json); } catch { } } } } catch { } } const requestContext = this.mergeRequestContext({ paramsRequestContext, bodyRequestContext }); this.applyRequestMetadataToContext({ requestContext, getHeader: (name) => c.req.header(name) }); c.set("requestContext", requestContext); c.set("mastra", this.mastra); c.set("registeredTools", this.tools || {}); c.set("taskStore", this.taskStore); c.set("abortSignal", c.req.raw.signal); c.set("customRouteAuthConfig", this.customRouteAuthConfig); return next(); }; } async stream(route, res, result) { const streamFormat = route.streamFormat || "stream"; if (streamFormat === "sse") { res.header("Content-Type", "text/event-stream"); res.header("Cache-Control", "no-cache"); res.header("Connection", "keep-alive"); res.header("X-Accel-Buffering", "no"); } else { res.header("Content-Type", "text/plain"); } res.header("Transfer-Encoding", "chunked"); return streaming.stream( res, async (stream2) => { if (streamFormat === "sse" && route.sseFlushOnConnect) { await stream2.write(": connected\n\n"); } const readableStream = result instanceof ReadableStream ? result : result.fullStream; const reader = readableStream.getReader(); stream2.onAbort(() => { void reader.cancel("request aborted"); }); try { while (true) { const { done, value } = await reader.read(); if (done) break; if (value) { if (streamFormat === "sse" && typeof value === "string" && value.startsWith(":")) { await stream2.write(value); continue; } const shouldRedact = this.streamOptions?.redact ?? true; const outputValue = shouldRedact ? serverAdapter.redactStreamChunk(value) : value; if (streamFormat === "sse") { await stream2.write(`data: ${JSON.stringify(outputValue)} `); } else { await stream2.write(JSON.stringify(outputValue) + ""); } } } if (streamFormat === "sse") { await stream2.write("data: [DONE]\n\n"); } } catch (error) { this.mastra.getLogger()?.error("Error in stream processing", { error: error instanceof Error ? { message: error.message, stack: error.stack } : error }); } finally { await stream2.close(); } }, async (err) => { this.mastra.getLogger()?.error("Stream error callback", { error: err instanceof Error ? { message: err.message, stack: err.stack } : err }); } ); } async getParams(route, request) { const urlParams = request.param(); const queryParams = serverAdapter.normalizeQueryParams(request.queries()); let body; let bodyParseError; if (route.method === "POST" || route.method === "PUT" || route.method === "PATCH" || route.method === "DELETE") { const contentType = request.header("content-type") || ""; if (contentType.includes("multipart/form-data")) { try { const formData = await request.formData(); body = await this.parseFormData(formData); } catch (error) { this.mastra.getLogger()?.error("Failed to parse multipart form data", { error: error instanceof Error ? { message: error.message, stack: error.stack } : error }); if (error instanceof Error && error.message.toLowerCase().includes("size")) { throw error; } bodyParseError = { message: error instanceof Error ? error.message : "Failed to parse multipart form data" }; } } else if (contentType.includes("application/json")) { const clonedReq = request.raw.clone(); const bodyText = await clonedReq.text(); if (bodyText && bodyText.trim().length > 0) { try { body = JSON.parse(bodyText); } catch (error) { this.mastra.getLogger()?.error("Failed to parse JSON body", { error: error instanceof Error ? { message: error.message, stack: error.stack } : error }); bodyParseError = { message: error instanceof Error ? error.message : "Invalid JSON in request body" }; } } } } return { urlParams, queryParams, body, bodyParseError }; } /** * Parse FormData into a plain object, converting File objects to Buffers. */ async parseFormData(formData) { const result = {}; for (const [key, value] of formData.entries()) { if (value instanceof File) { const arrayBuffer = await value.arrayBuffer(); result[key] = Buffer.from(arrayBuffer); } else if (typeof value === "string") { try { result[key] = JSON.parse(value); } catch { result[key] = value; } } else { result[key] = value; } } return result; } async sendResponse(route, response, result, prefix) { const resolvedPrefix = prefix ?? this.prefix ?? ""; if (result && typeof result === "object" && "__refreshHeaders" in result) { const refreshHeaders = result.__refreshHeaders; for (const [key, value] of Object.entries(refreshHeaders)) { response.header(key, value); } delete result.__refreshHeaders; } if (route.responseType === "json") { return response.json(result, 200); } else if (route.responseType === "stream") { return this.stream(route, response, result); } else if (route.responseType === "datastream-response") { const fetchResponse = result; return fetchResponse; } else if (route.responseType === "mcp-http") { const { server, httpPath, mcpOptions: routeMcpOptions } = result; const { req, res } = toReqRes(response.req.raw); const options = { ...this.mcpOptions, ...routeMcpOptions }; server.startHTTP({ url: new URL(response.req.url), httpPath: `${resolvedPrefix}${httpPath}`, req, res, options: Object.keys(options).length > 0 ? options : void 0 }).catch((e) => { this.mastra.getLogger()?.error("[MCP HTTP] Error in background startHTTP:", { error: e instanceof Error ? { message: e.message, stack: e.stack } : e }); try { if (!res.headersSent) { res.writeHead(500, { "Content-Type": "application/json" }); res.end( JSON.stringify({ jsonrpc: "2.0", error: { code: -32603, message: "Internal server error" }, id: null }) ); } } catch { } }); return await toFetchResponse(res); } else if (route.responseType === "mcp-sse") { const { server, ssePath, messagePath } = result; try { return await server.startHonoSSE({ url: new URL(response.req.url), ssePath: `${resolvedPrefix}${ssePath}`, messagePath: `${resolvedPrefix}${messagePath}`, context: response }); } catch { return response.json({ error: "Error handling MCP SSE request" }, 500); } } else { return response.status(500); } } async registerRoute(app, route, { prefix: prefixParam } = {}) { const prefix = prefixParam ?? this.prefix ?? ""; const shouldApplyBodyLimit = this.bodyLimitOptions && ["POST", "PUT", "PATCH"].includes(route.method.toUpperCase()); const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize; const middlewares = []; if (shouldApplyBodyLimit && maxSize && this.bodyLimitOptions) { middlewares.push( bodyLimit.bodyLimit({ maxSize, onError: this.bodyLimitOptions.onError }) ); } app[route.method.toLowerCase()]( `${prefix}${route.path}`, ...middlewares, async (c) => { const authResult = await this.checkRouteAuth(route, { path: c.req.path, method: c.req.method, getHeader: (name) => c.req.header(name), getQuery: (name) => c.req.query(name), requestContext: c.get("requestContext"), request: c.req.raw, buildAuthorizeContext: () => c }); if (authResult) { if (authResult.headers) { for (const [key, value] of Object.entries(authResult.headers)) { c.header(key, value); } } if (authResult.error) { return c.json({ error: authResult.error }, authResult.status); } } const params = await this.getParams(route, c.req); if (params.bodyParseError) { return c.json( { error: "Invalid request body", issues: [{ field: "body", message: params.bodyParseError.message }] }, 400 ); } if (params.queryParams) { try { params.queryParams = await this.parseQueryParams(route, params.queryParams); } catch (error) { this.mastra.getLogger()?.error("Error parsing query params", { error: error instanceof Error ? { message: error.message, stack: error.stack } : error }); if (serverAdapter.isZodError(error)) { const { status, body } = this.resolveValidationError(route, error, "query"); return c.json(body, status); } return c.json( { error: "Invalid query parameters", issues: [{ field: "unknown", message: error instanceof Error ? error.message : "Unknown error" }] }, 400 ); } } if (params.body) { try { params.body = await this.parseBody(route, params.body); } catch (error) { this.mastra.getLogger()?.error("Error parsing body", { error: error instanceof Error ? { message: error.message, stack: error.stack } : error }); if (serverAdapter.isZodError(error)) { const { status, body } = this.resolveValidationError(route, error, "body"); return c.json(body, status); } return c.json( { error: "Invalid request body", issues: [{ field: "unknown", message: error instanceof Error ? error.message : "Unknown error" }] }, 400 ); } } if (params.urlParams) { try { params.urlParams = await this.parsePathParams(route, params.urlParams); } catch (error) { this.mastra.getLogger()?.error("Error parsing path params", { error: error instanceof Error ? { message: error.message, stack: error.stack } : error }); if (serverAdapter.isZodError(error)) { const { status, body } = this.resolveValidationError(route, error, "path"); return c.json(body, status); } return c.json( { error: "Invalid path parameters", issues: [{ field: "unknown", message: error instanceof Error ? error.message : "Unknown error" }] }, 400 ); } } const handlerParams = { ...params.urlParams, ...params.queryParams, ...typeof params.body === "object" ? params.body : {}, requestContext: c.get("requestContext"), mastra: this.mastra, registeredTools: c.get("registeredTools"), taskStore: c.get("taskStore"), abortSignal: c.get("abortSignal"), routePrefix: prefix, request: c.req.raw // Standard Request object with headers/cookies }; const requestContext = c.get("requestContext"); const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth; if (hasAuth) { const hasPermission = await loadHasPermission(); if (hasPermission) { const userPermissions = requestContext.get("mastra__userPermissions"); const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission, requestContext); if (permissionError) { return c.json( { error: permissionError.error, message: permissionError.message }, permissionError.status ); } } } const fgaError = await serverAdapter.checkRouteFGA(this.mastra, route, c.get("requestContext"), { ...params.urlParams, ...params.queryParams, ...typeof params.body === "object" ? params.body : {} }); if (fgaError) { return c.json({ error: fgaError.error, message: fgaError.message }, fgaError.status); } try { const result = await route.handler(handlerParams); return this.sendResponse(route, c, result, prefix); } catch (error) { this.mastra.getLogger()?.error("Error calling handler", { error: error instanceof Error ? { message: error.message, stack: error.stack } : error, path: route.path, method: route.method }); if (error && typeof error === "object") { if ("status" in error) { const status = error.status; let safeCause; try { const raw = error instanceof Error ? error.cause : void 0; if (raw && typeof raw === "object" && !Array.isArray(raw) && "failingItems" in raw && Array.isArray(raw.failingItems)) { safeCause = { failingItems: raw.failingItems }; } } catch { } return c.json( { error: error instanceof Error ? error.message : "Unknown error", ...safeCause ? { cause: safeCause } : {} }, status ); } if ("details" in error && error.details && typeof error.details === "object" && "status" in error.details) { const status = error.details.status; return c.json({ error: error instanceof Error ? error.message : "Unknown error" }, status); } } return c.json({ error: error instanceof Error ? error.message : "Unknown error" }, 500); } } ); } async registerCustomApiRoutes() { if (!await this.buildCustomRouteHandler()) return; const routes = this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes ?? []; for (const route of routes) { const serverRoute = { method: route.method, path: route.path, responseType: "json", handler: async () => { }, requiresAuth: route.requiresAuth, requiresPermission: route.requiresPermission, fga: route.fga }; const routeHandler = async (c) => { const authError = await this.checkRouteAuth(serverRoute, { path: c.req.path, method: c.req.method, getHeader: (name) => c.req.header(name), getQuery: (name) => c.req.query(name), requestContext: c.get("requestContext"), request: c.req.raw, buildAuthorizeContext: () => c }); if (authError) { if (authError.headers) { for (const [key, value] of Object.entries(authError.headers)) { c.header(key, value); } } if (authError.error) { return c.json({ error: authError.error }, authError.status); } } const requestContext = c.get("requestContext"); const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth; if (hasAuth) { const hasPermission = await loadHasPermission(); if (hasPermission) { const userPermissions = requestContext.get("mastra__userPermissions"); const permissionError = this.checkRoutePermission( serverRoute, userPermissions, hasPermission, requestContext ); if (permissionError) { return c.json( { error: permissionError.error, message: permissionError.message }, permissionError.status ); } } } let bodyParams = {}; const contentType = c.req.header("content-type"); if (contentType?.includes("application/json")) { try { const body = await c.req.raw.clone().json(); if (body && typeof body === "object" && !Array.isArray(body)) { bodyParams = body; } } catch { bodyParams = {}; } } else if (contentType?.includes("application/x-www-form-urlencoded") || contentType?.includes("multipart/form-data")) { try { bodyParams = Object.fromEntries(await c.req.raw.clone().formData()); } catch { bodyParams = {}; } } const fgaError = await serverAdapter.checkRouteFGA(this.mastra, serverRoute, c.get("requestContext"), { ...c.req.param(), ...Object.fromEntries(new URL(c.req.url).searchParams.entries()), ...bodyParams }); if (fgaError) { return c.json({ error: fgaError.error, message: fgaError.message }, fgaError.status); } const reqHeaders = {}; c.req.raw.headers.forEach((v, k) => { reqHeaders[k] = v; }); const response = await this.handleCustomRouteRequest( c.req.url, c.req.method, reqHeaders, c.req.raw.body, c.get("requestContext"), c.req.raw.signal ); if (!response) { return c.json({ error: "Not Found" }, 404); } return response; }; const method = route.method.toLowerCase(); this.app[method](route.path, routeHandler); } } registerContextMiddleware() { this.app.use("*", this.createContextMiddleware()); } registerAuthMiddleware() { } registerHttpLoggingMiddleware() { if (!this.httpLoggingConfig?.enabled) { return; } this.app.use("*", async (c, next) => { if (!this.shouldLogRequest(c.req.path)) { return next(); } const start = Date.now(); const method = c.req.method; const path = c.req.path; await next(); const duration = Date.now() - start; const status = c.res.status; const level = this.httpLoggingConfig?.level || "info"; const logData = { method, path, status, duration: `${duration}ms` }; if (this.httpLoggingConfig?.includeQueryParams) { logData.query = c.req.query(); } if (this.httpLoggingConfig?.includeHeaders) { const headers = Object.fromEntries(c.req.raw.headers.entries()); const redactHeaders = this.httpLoggingConfig.redactHeaders || []; redactHeaders.forEach((h) => { const key = h.toLowerCase(); if (headers[key] !== void 0) { headers[key] = "[REDACTED]"; } }); logData.headers = headers; } this.logger[level](`${method} ${path} ${status} ${duration}ms`, logData); }); } }; // ../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/hono-openapi/1.3.0/8a61fee136ec2c53792a18ac633ed1e210d9cd979e48c5121bb6b6f406f486d4/node_modules/hono-openapi/dist/index.js var uniqueSymbol = /* @__PURE__ */ Symbol("openapi"); function describeRoute(spec) { const middleware2 = async (_c, next) => { await next(); }; return Object.assign(middleware2, { [uniqueSymbol]: { spec } }); } // src/server/handlers/client.ts var clients = /* @__PURE__ */ new Set(); var hotReloadDisabled = false; function handleClientsRefresh(c) { const stream2 = new ReadableStream({ start(controller) { clients.add(controller); controller.enqueue("data: connected\n\n"); c.req.raw.signal.addEventListener("abort", () => { clients.delete(controller); }); } }); return new Response(stream2, { headers: { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", Connection: "keep-alive", "Access-Control-Allow-Origin": "*" } }); } function handleTriggerClientsRefresh(c) { clients.forEach((controller) => { try { controller.enqueue("data: refresh\n\n"); } catch { clients.delete(controller); } }); return c.json({ success: true, clients: clients.size }); } function isHotReloadDisabled() { return hotReloadDisabled; } function handleError(error, defaultMessage) { const apiError = error; throw new httpException.HTTPException(apiError.status || 500, { message: apiError.message || defaultMessage, cause: apiError.cause }); } function errorHandler(err, c, isDev) { if (err instanceof httpException.HTTPException) { if (isDev) { return c.json({ error: err.message, cause: err.cause, stack: err.stack }, err.status); } return c.json({ error: err.message }, err.status); } c.get("mastra").getLogger().error(err); return c.json({ error: "Internal Server Error" }, 500); } // src/server/handlers/health.ts async function healthHandler(c) { return c.json({ success: true }, 200); } // src/server/handlers/restart-active-runs.ts async function restartAllActiveWorkflowRunsHandler(c) { try { const mastra = c.get("mastra"); void mastra.restartAllActiveWorkflowRuns(); return c.json({ message: "Restarting all active workflow runs..." }); } catch (error) { return handleError(error, "Error restarting active workflow runs"); } } // src/server/handlers/root.ts async function rootHandler(c) { const baseUrl = new URL(c.req.url).origin; return c.html( /* html */ ` Mastra API

Welcome to the Mastra API

Discover all available endpoints through Swagger UI. You can also define your own API routes.

Browse Swagger UI
` ); } // src/server/welcome.ts function welcomeHtml(apiPrefix = "/api") { const prefix = "/" + apiPrefix.replace(/^\/+|\/+$/g, ""); const prefixNoSlash = prefix.slice(1); return ` Mastra Server

Mastra Server

Your server is running. Use the endpoints below to get started.

Quick Start

Check server health
curl 
List your agents
curl 
Chat with an agent
curl -X POST  \\
  -H 'Content-Type: application/json' \\
  -d '{"messages":[{"role":"user","content":"Hello"}]}'
Stream an agent response
curl -N -X POST  \\
  -H 'Content-Type: application/json' \\
  -d '{"messages":[{"role":"user","content":"Hello"}]}'

API Endpoints

GET ${prefix}/agents
List all agents
POST ${prefix}/agents/:id/generate
Generate a response
POST ${prefix}/agents/:id/stream
Stream a response
GET ${prefix}/workflows
List all workflows
POST ${prefix}/workflows/:id/start
Run a workflow
GET ${prefix}/tools
List all tools
POST ${prefix}/tools/:id/execute
Execute a tool
GET ${prefix}/memory/threads
List memory threads

Resources

`; } // src/server/index.ts var getStudioPath = () => { if (process.env.MASTRA_STUDIO_PATH) { return process.env.MASTRA_STUDIO_PATH; } let __dirname = "."; if ((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))) { const __filename = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))); __dirname = path.dirname(__filename); } const studioPath = process.env.MASTRA_STUDIO_PATH || path.join(__dirname, "studio"); return studioPath; }; var DEFAULT_CORS_ALLOW_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]; var DEFAULT_CORS_ALLOW_HEADERS = ["Content-Type", "Authorization", "x-mastra-client-type", "x-mastra-dev-playground"]; var DEFAULT_CORS_EXPOSE_HEADERS = ["Content-Length", "X-Requested-With"]; function getCorsConfig(serverCors, credentialsDefault) { const userCors = serverCors && typeof serverCors === "object" ? serverCors : void 0; const origin = userCors && "origin" in userCors && userCors.origin ? userCors.origin : credentialsDefault ? (requestOrigin) => requestOrigin || void 0 : "*"; const credentials = userCors && "credentials" in userCors ? userCors.credentials : credentialsDefault; return { origin, allowMethods: DEFAULT_CORS_ALLOW_METHODS, credentials, maxAge: 3600, ...userCors, allowHeaders: [...DEFAULT_CORS_ALLOW_HEADERS, ...userCors?.allowHeaders ?? []], exposeHeaders: [...DEFAULT_CORS_EXPOSE_HEADERS, ...userCors?.exposeHeaders ?? []] }; } function getRouteCorsConfig(apiRoutes, pathname, method) { const route = auth.findMatchingCustomRoute(pathname, method, apiRoutes)?.route; return route?.cors; } function getToolExports(tools$1) { try { return tools$1.reduce((acc, toolModule) => { Object.entries(toolModule).forEach(([key, tool]) => { if (tool instanceof tools.Tool) { acc[key] = tool; } }); return acc; }, {}); } catch (err) { console.error( `Failed to import tools reason: ${err.message} ${err.stack.split("\n").slice(1).join("\n")} `, err ); } } async function createHonoServer(mastra, options = { tools: {} }) { if (options.tools) { for (const [key, tool] of Object.entries(options.tools)) { try { mastra.addTool(tool, key); } catch { } } } const app = new hono.Hono(); const server = mastra.getServer(); const apiPrefix = server?.apiPrefix ?? "/api"; const a2aTaskStore = new store.InMemoryTaskStore(); const routes = server?.apiRoutes; const processedRoutes = routes?.map((route) => { if ("openapi" in route && route.openapi) { const existingMiddleware = route.middleware ? Array.isArray(route.middleware) ? route.middleware : [route.middleware] : []; return { ...route, middleware: [ describeRoute(route.openapi), ...existingMiddleware ] }; } return route; }); const customRouteAuthConfig = /* @__PURE__ */ new Map(); if (processedRoutes) { for (const route of processedRoutes) { const requiresAuth = route.requiresAuth !== false; const routeKey = `${route.method}:${route.path}`; customRouteAuthConfig.set(routeKey, requiresAuth); } } const customOnError = server?.onError; app.onError((err, c) => { if (customOnError) { return customOnError(err, c); } return errorHandler(err, c, options.isDev); }); const bodyLimitOptions = { maxSize: server?.bodySizeLimit ?? 4.5 * 1024 * 1024, // 4.5 MB, onError: () => ({ error: "Request body too large" }) }; const honoServerAdapter = new MastraServer({ app, mastra, tools: options.tools, taskStore: a2aTaskStore, bodyLimitOptions, openapiPath: options?.isDev || server?.build?.openAPIDocs ? "/openapi.json" : void 0, customRouteAuthConfig, customApiRoutes: processedRoutes, prefix: apiPrefix, mcpOptions: server?.mcpOptions }); honoServerAdapter.registerContextMiddleware(); const serverMiddleware = mastra.getServerMiddleware?.(); if (serverMiddleware && serverMiddleware.length > 0) { for (const m of serverMiddleware) { app.use(m.path, m.handler); } } const browserStreamSetup = await setupBrowserStream(app, { getToolset: async (agentId) => { try { const runtimeAgent = mastra.getAgentById(agentId); if (runtimeAgent) { return runtimeAgent.browser; } } catch { } try { const storedAgent = await mastra.getEditor?.()?.agent.getById(agentId); return storedAgent?.browser; } catch { return void 0; } }, apiPrefix }); if (!browserStreamSetup) { app.get( `${apiPrefix}/agents/:agentId/browser/session`, (c) => c.json({ hasSession: false, screencastAvailable: false }) ); } if (server?.cors === false) { app.use("*", timeout.timeout(server?.timeout ?? 3 * 60 * 1e3)); } else { const hasAuth = !!server?.auth; app.use("*", timeout.timeout(server?.timeout ?? 3 * 60 * 1e3), async (c, next) => { const pathname = new URL(c.req.url).pathname; const method = c.req.method === "OPTIONS" ? c.req.header("Access-Control-Request-Method") ?? c.req.method : c.req.method; const routeCors = getRouteCorsConfig(processedRoutes, pathname, method); const corsOptions = routeCors ? getCorsConfig(routeCors, false) : getCorsConfig(server?.cors, hasAuth); return cors.cors(corsOptions)(c, next); }); } app.get( "/health", describeRoute({ description: "Health check endpoint", tags: ["system"], responses: { 200: { description: "Service is healthy" } } }), healthHandler ); if (options?.isDev || server?.build?.swaggerUI) { app.get( apiPrefix, describeRoute({ description: "API Welcome Page", tags: ["system"], responses: { 200: { description: "Success" } } }), rootHandler ); } await honoServerAdapter.validateEELicense(); honoServerAdapter.registerAuthMiddleware(); if (server?.middleware) { const normalizedMiddlewares = Array.isArray(server.middleware) ? server.middleware : [server.middleware]; const middlewares = normalizedMiddlewares.map((middleware2) => { if (typeof middleware2 === "function") { return { path: "*", handler: middleware2 }; } return middleware2; }); for (const middleware2 of middlewares) { app.use(middleware2.path, middleware2.handler); } } await honoServerAdapter.registerCustomApiRoutes(); if (server?.build?.apiReqLogs) { app.use(logger.logger()); } await honoServerAdapter.registerRoutes(); if (options?.isDev || server?.build?.swaggerUI) { if (!options?.isDev && server?.build?.swaggerUI && !server?.build?.openAPIDocs) { const logger2 = mastra.getLogger(); logger2.warn( "Swagger UI is enabled but OpenAPI documentation is disabled. The Swagger UI will not function properly without the OpenAPI endpoint. Please enable openAPIDocs in your server.build configuration:\n server: { build: { swaggerUI: true, openAPIDocs: true } }" ); } app.get( "/swagger-ui", describeRoute({ hide: true }), middleware({ url: `${apiPrefix}/openapi.json` }) ); } if (options?.isDev) { app.post( "/__restart-active-workflow-runs", describeRoute({ hide: true }), restartAllActiveWorkflowRunsHandler ); } const serverOptions = mastra.getServer(); const studioBasePath = chunk3T7FP546_cjs.normalizeStudioBase(serverOptions?.studioBase ?? "/"); if (options?.studio) { app.get( `${studioBasePath}/refresh-events`, describeRoute({ hide: true }), handleClientsRefresh ); app.post( `${studioBasePath}/__refresh`, describeRoute({ hide: true }), handleTriggerClientsRefresh ); app.get( `${studioBasePath}/__hot-reload-status`, describeRoute({ hide: true }), (c) => { return c.json({ disabled: isHotReloadDisabled(), timestamp: (/* @__PURE__ */ new Date()).toISOString() }); } ); app.use(`${studioBasePath}/assets/*`, compress.compress()); const studioPath = getStudioPath(); app.use( `${studioBasePath}/assets/*`, serveStatic({ root: path.join(studioPath, "assets"), rewriteRequestPath: (path) => { let rewritten = path; if (studioBasePath && rewritten.startsWith(studioBasePath)) { rewritten = rewritten.slice(studioBasePath.length); } if (rewritten.startsWith("/assets")) { rewritten = rewritten.slice("/assets".length); } return rewritten; } }) ); } app.get("*", async (c, next) => { const requestPath = c.req.path; if (requestPath === apiPrefix || requestPath.startsWith(`${apiPrefix}/`) || requestPath.startsWith("/swagger-ui") || requestPath.startsWith("/openapi.json")) { return await next(); } if (requestPath.includes(".") && !requestPath.endsWith(".html")) { return await next(); } const isStudioRoute = studioBasePath === "" || requestPath === studioBasePath || requestPath.startsWith(`${studioBasePath}/`); if (options?.studio && isStudioRoute) { const studioPath = getStudioPath(); let indexHtml = await promises.readFile(path.join(studioPath, "index.html"), "utf-8"); const port = serverOptions?.port ?? (Number(process.env.PORT) || 4111); const hideCloudCta = process.env.MASTRA_HIDE_CLOUD_CTA === "true"; const bindHost = serverOptions?.host ?? process.env.MASTRA_HOST; const host = bindHost ?? "localhost"; const key = serverOptions?.https?.key ?? (process.env.MASTRA_HTTPS_KEY ? Buffer.from(process.env.MASTRA_HTTPS_KEY, "base64") : void 0); const cert = serverOptions?.https?.cert ?? (process.env.MASTRA_HTTPS_CERT ? Buffer.from(process.env.MASTRA_HTTPS_CERT, "base64") : void 0); const protocol = key && cert ? "https" : "http"; const studioHost = serverOptions?.studioHost ?? host; const studioProtocol = serverOptions?.studioProtocol ?? protocol; const studioPort = serverOptions?.studioPort ?? port; const cloudApiEndpoint = process.env.MASTRA_CLOUD_API_ENDPOINT || ""; const experimentalFeatures = process.env.EXPERIMENTAL_FEATURES === "true" ? "true" : "false"; const experimentalUI = process.env.MASTRA_EXPERIMENTAL_UI === "true" ? "true" : "false"; const templatesEnabled = process.env.MASTRA_TEMPLATES === "true" ? "true" : "false"; const agentSignals = process.env.MASTRA_AGENT_SIGNALS === "false" ? "false" : "true"; const requestContextPresets = process.env.MASTRA_REQUEST_CONTEXT_PRESETS || ""; const escapeForHtml = (json) => { return json.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(//g, "\\u003e").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029"); }; const autoDetectUrl = process.env.MASTRA_AUTO_DETECT_URL === "true"; indexHtml = chunk3T7FP546_cjs.injectStudioHtmlConfig(indexHtml, { host: `'${studioHost}'`, port: `'${studioPort}'`, protocol: `'${studioProtocol}'`, apiPrefix: `'${serverOptions?.apiPrefix ?? "/api"}'`, basePath: studioBasePath, hideCloudCta: `'${hideCloudCta}'`, cloudApiEndpoint: `'${cloudApiEndpoint}'`, experimentalFeatures: `'${experimentalFeatures}'`, templates: `'${templatesEnabled}'`, telemetryDisabled: `'${process.env.MASTRA_TELEMETRY_DISABLED ?? ""}'`, requestContextPresets: `'${escapeForHtml(requestContextPresets)}'`, experimentalUI: `'${experimentalUI}'`, agentSignals: `'${agentSignals}'`, autoDetectUrl: `'${autoDetectUrl}'` }); return c.newResponse(indexHtml, 200, { "Content-Type": "text/html" }); } return c.newResponse(welcomeHtml(apiPrefix), 200, { "Content-Type": "text/html" }); }); if (options?.studio) { const studioRootPath = getStudioPath(); const studioPath = studioBasePath ? `${studioBasePath}/*` : "*"; app.use( studioPath, serveStatic({ root: studioRootPath, rewriteRequestPath: (path) => { if (studioBasePath && path.startsWith(studioBasePath)) { return path.slice(studioBasePath.length); } return path; } }) ); } app.injectWebSocket = browserStreamSetup?.injectWebSocket; return app; } async function createNodeServer(mastra, options = { tools: {} }) { const app = await createHonoServer(mastra, options); const injectWebSocket = app.injectWebSocket; const serverOptions = mastra.getServer(); const apiPrefix = serverOptions?.apiPrefix ?? "/api"; const key = serverOptions?.https?.key ?? (process.env.MASTRA_HTTPS_KEY ? Buffer.from(process.env.MASTRA_HTTPS_KEY, "base64") : void 0); const cert = serverOptions?.https?.cert ?? (process.env.MASTRA_HTTPS_CERT ? Buffer.from(process.env.MASTRA_HTTPS_CERT, "base64") : void 0); const isHttpsEnabled = Boolean(key && cert); const bindHost = serverOptions?.host ?? process.env.MASTRA_HOST; const host = bindHost ?? "localhost"; const port = serverOptions?.port ?? (Number(process.env.PORT) || 4111); const protocol = isHttpsEnabled ? "https" : "http"; const studioHost = serverOptions?.studioHost ?? host; const studioProtocol = serverOptions?.studioProtocol ?? protocol; const studioPort = serverOptions?.studioPort ?? port; const server = serve( { fetch: app.fetch, port, hostname: bindHost, ...isHttpsEnabled ? { createServer: https__namespace.createServer, serverOptions: { key, cert } } : {} }, () => { const logger2 = mastra.getLogger(); logger2.info("Mastra API running", { url: `${protocol}://${host}:${port}${apiPrefix}` }); if (options?.studio) { const studioBasePath = chunk3T7FP546_cjs.normalizeStudioBase(serverOptions?.studioBase ?? "/"); const studioUrl = `${studioProtocol}://${studioHost}:${studioPort}${studioBasePath}`; logger2.info("Studio available", { url: studioUrl }); } if (process.send) { process.send({ type: "server-ready", port, host }); } } ); injectWebSocket?.(server); const workerLifecycle = mastra; if (typeof workerLifecycle.startWorkers === "function") { await workerLifecycle.startWorkers(); } else { await workerLifecycle.startEventEngine(); } void import('@mastra/core/telemetry').then(({ syncUsageTelemetry }) => syncUsageTelemetry(mastra)).catch(() => { }); const SHUTDOWN_TIMEOUT_MS = 5e3; let shuttingDown = false; const shutdown = async (signal) => { if (shuttingDown) { return; } shuttingDown = true; const logger2 = mastra.getLogger(); logger2.info("Shutting down Mastra server", { signal }); server.close(); const lifecycle = mastra; if (typeof lifecycle.shutdown === "function") { let timeout2; const timedOut = /* @__PURE__ */ Symbol("shutdown-timeout"); const timeoutPromise = new Promise((resolve) => { timeout2 = setTimeout(() => resolve(timedOut), SHUTDOWN_TIMEOUT_MS); }); try { const result = await Promise.race([lifecycle.shutdown(), timeoutPromise]); if (result === timedOut) { logger2.warn("Mastra shutdown timed out; forcing exit", { timeoutMs: SHUTDOWN_TIMEOUT_MS }); } } catch (error) { logger2.error("Error during Mastra shutdown", { error }); } finally { clearTimeout(timeout2); } } process.exit(0); }; process.once("SIGINT", () => void shutdown("SIGINT")); process.once("SIGTERM", () => void shutdown("SIGTERM")); return server; } exports.createHonoServer = createHonoServer; exports.createNodeServer = createNodeServer; exports.getToolExports = getToolExports; //# sourceMappingURL=index.cjs.map //# sourceMappingURL=index.cjs.map