@mastra/elysia 0.1.11-alpha.0 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -652,7 +652,8 @@ var MastraServer = class extends _mastra_server_server_adapter.MastraServer {
652
652
  const result = await route.handler(handlerParams);
653
653
  return this.sendResponse(route, ctx, result, prefix);
654
654
  } catch (error) {
655
- this.mastra.getLogger()?.error("Error calling handler", {
655
+ const logLevel = (error && typeof error === "object" ? error.status ?? error.details?.status : void 0) === 501 ? "warn" : "error";
656
+ this.mastra.getLogger()?.[logLevel]("Error calling handler", {
656
657
  error: error instanceof Error ? {
657
658
  message: error.message,
658
659
  stack: error.stack
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["RequestContext","SERVER_ROUTES","MastraServerBase","request"],"sources":["../src/auth-middleware.ts","../src/helper.ts","../src/index.ts"],"sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\n\nexport interface ElysiaAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nexport function createAuthMiddleware({\n mastra,\n requiresAuth = true,\n}: ElysiaAuthMiddlewareOptions): (ctx: any) => Promise<globalThis.Response | void> {\n return async (ctx: any) => {\n if (!requiresAuth) {\n return;\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n return;\n }\n\n ctx.requestContext ??= new RequestContext();\n ctx.mastra ??= mastra;\n\n const url = new URL(ctx.request.url);\n const path = url.pathname;\n const method = ctx.request.method;\n const customRouteAuthConfig = new Map<string, boolean>(ctx.customRouteAuthConfig ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = ctx.request.headers.get('authorization');\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token && ctx.query?.apiKey) {\n token = ctx.query.apiKey;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => ctx.request.headers.get(name) || undefined,\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext: ctx.requestContext,\n rawRequest: ctx.request,\n token,\n buildAuthorizeContext: () => ctx,\n });\n\n if (result.action === 'error') {\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n };\n}\n","import {\n generateOpenAPIDocument,\n convertCustomRoutesToOpenAPIPaths,\n SERVER_ROUTES,\n} from '@mastra/server/server-adapter';\nimport type { MastraServer } from './index';\n\n/**\n * OpenAPI documentation cache to avoid regenerating on each call.\n * Uses WeakMap to prevent cache collisions between server instances.\n */\nconst openapiDocCache = new WeakMap<\n MastraServer,\n {\n paths: Record<string, any>;\n components?: Record<string, any>;\n info: { title: string; version: string; description?: string };\n }\n>();\n\n/**\n * Get OpenAPI documentation from a MastraServer instance, formatted for Elysia's openapi plugin.\n *\n * This function:\n * - Extracts all Mastra routes with their Zod schemas\n * - Converts them to OpenAPI 3.1.0 format\n * - Merges custom routes if registered\n * - Applies the configured route prefix to all paths\n * - Caches the result for performance\n *\n * @param server - The MastraServer instance (must be initialized with init())\n * @param options - Optional configuration for OpenAPI metadata\n * @returns OpenAPI documentation with paths, components, and info\n *\n * @example\n * ```typescript\n * import { getMastraOpenAPIDoc } from '@mastra/elysia';\n *\n * const srv = new MastraServer({ mastra, app, prefix: '/api' });\n * await srv.init();\n *\n * const openAPIDoc = getMastraOpenAPIDoc(srv, {\n * title: 'My Mastra API',\n * version: '1.0.0',\n * description: 'API with weather agent'\n * });\n *\n * app.use(openapi({\n * documentation: {\n * info: openAPIDoc.info,\n * paths: openAPIDoc.paths,\n * components: openAPIDoc.components\n * }\n * }));\n * ```\n */\nexport function getMastraOpenAPIDoc(\n server: MastraServer,\n options?: {\n title?: string;\n version?: string;\n description?: string;\n clearCache?: boolean;\n },\n): {\n paths: Record<string, any>;\n components?: Record<string, any>;\n info: { title: string; version: string; description?: string };\n} {\n // Clear cache if requested\n if (options?.clearCache) {\n openapiDocCache.delete(server);\n }\n\n // Return cached result if available\n const cached = openapiDocCache.get(server);\n if (cached) {\n // Merge custom info if provided\n if (options) {\n return {\n ...cached,\n info: {\n ...cached.info,\n ...(options.title && { title: options.title }),\n ...(options.version && { version: options.version }),\n ...(options.description && { description: options.description }),\n },\n };\n }\n return cached;\n }\n\n // Generate complete OpenAPI spec from Mastra's route definitions\n const openApiSpec = generateOpenAPIDocument(SERVER_ROUTES, {\n title: options?.title || 'Mastra API',\n version: options?.version || '1.0.0',\n description: options?.description || 'Mastra Server API',\n });\n\n // Merge custom API routes if present\n const customApiRoutes = (server as any).customApiRoutes;\n if (customApiRoutes && customApiRoutes.length > 0) {\n const customPaths = convertCustomRoutesToOpenAPIPaths(customApiRoutes);\n openApiSpec.paths = { ...openApiSpec.paths, ...customPaths };\n }\n\n let paths = openApiSpec.paths || {};\n\n // Apply prefix transformation if configured\n const prefix = (server as any).prefix;\n if (prefix && prefix !== '/') {\n const prefixedPaths: Record<string, any> = {};\n for (const [path, pathItem] of Object.entries(paths)) {\n // Combine prefix with path, ensuring no double slashes\n const prefixedPath = `${prefix}${path}`.replace(/\\/+/g, '/');\n prefixedPaths[prefixedPath] = pathItem;\n }\n paths = prefixedPaths;\n }\n\n const result = {\n paths,\n components: openApiSpec.components,\n info: openApiSpec.info,\n };\n\n // Cache the result\n openapiDocCache.set(server, result);\n\n return result;\n}\n\n/**\n * Clear the OpenAPI documentation cache.\n * Call this if routes are added dynamically after initialization.\n *\n * `@param` server - The MastraServer instance to clear cache for.\n * Note: WeakMap does not support clearing all entries. Pass the specific server instance whose cache should be invalidated.\n */\nexport function clearMastraOpenAPICache(server?: MastraServer): void {\n if (server) {\n openapiDocCache.delete(server);\n }\n // Cannot clear all entries in WeakMap - they will be garbage collected when servers are released\n}\n","import type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { InMemoryTaskStore } from '@mastra/server/a2a/store';\nimport { findMatchingCustomRoute, isProtectedCustomRoute } from '@mastra/server/auth';\nimport type { MCPHttpTransportResult, MCPSseTransportResult } from '@mastra/server/handlers/mcp';\nimport type { ParsedRequestParams, ServerRoute } from '@mastra/server/server-adapter';\nimport {\n MastraServer as MastraServerBase,\n checkRouteFGA,\n getCustomHTTPExceptionResponse,\n isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n serializeStreamChunk,\n} from '@mastra/server/server-adapter';\nimport type { AnyElysia, MaybePromise } from 'elysia';\nimport type Elysia from 'elysia';\nimport { toReqRes, toFetchResponse } from 'fetch-to-node';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { ElysiaAuthMiddlewareOptions } from './auth-middleware';\n\n// Export helper functions for OpenAPI integration\nexport { getMastraOpenAPIDoc, clearMastraOpenAPICache } from './helper';\n\n/**\n * Normalizes route path parameters to position-based names (:p0, :p1, ...)\n * to avoid Elysia router conflicts when different routes use different\n * parameter names at the same path segment position (e.g. :agentId vs\n * :storedAgentId under /stored/agents/...).\n * Returns the normalized path and the original parameter names in order.\n */\nfunction normalizeRouteParams(path: string): { normalizedPath: string; paramNames: string[] } {\n const paramNames: string[] = [];\n const normalizedPath = path.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, paramName: string) => {\n paramNames.push(paramName);\n return `:p${paramNames.length - 1}`;\n });\n return { normalizedPath, paramNames };\n}\n\n/**\n * Remaps Elysia's parsed params from position-based names (p0, p1, ...)\n * back to the original parameter names expected by the route handler.\n */\nfunction remapParams(rawParams: Record<string, string>, paramNames: string[]): Record<string, string> {\n if (paramNames.length === 0) return rawParams;\n const result: Record<string, string> = {};\n paramNames.forEach((paramName, i) => {\n const key = `p${i}`;\n if (key in rawParams) {\n result[paramName] = rawParams[key] as string;\n }\n });\n return result;\n}\n\nasync function createForwardRequest(ctx: any): Promise<Request> {\n const request = ctx.request as Request;\n const method = request.method;\n\n if (method === 'GET' || method === 'HEAD') {\n return request;\n }\n\n const headers = new Headers(request.headers);\n let body: any;\n\n if (ctx.body !== undefined) {\n if (typeof ctx.body === 'string' || ctx.body instanceof FormData || ctx.body instanceof Blob) {\n body = ctx.body;\n } else {\n body = JSON.stringify(ctx.body);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n }\n } else if (!request.bodyUsed) {\n const bodyBuffer = await request.clone().arrayBuffer();\n if (bodyBuffer.byteLength > 0) {\n body = bodyBuffer;\n }\n }\n\n headers.delete('content-length');\n\n return new Request(request.url, {\n method,\n headers,\n body,\n signal: request.signal,\n ...(body ? { duplex: 'half' as const } : {}),\n } as RequestInit);\n}\n\nfunction createSafeReadableStream(body: ReadableStream<Uint8Array> | null): ReadableStream<Uint8Array> | null {\n if (!body) return null;\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const reader = body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n controller.enqueue(value);\n }\n } catch {\n // Preserve chunks already sent before upstream stream errors.\n } finally {\n controller.close();\n reader.releaseLock();\n }\n },\n });\n}\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\nlet _hasPermissionPromise: Promise<HasPermissionFn | undefined> | undefined;\nfunction loadHasPermission(): Promise<HasPermissionFn | undefined> {\n if (!_hasPermissionPromise) {\n _hasPermissionPromise = import('@mastra/core/auth/ee')\n .then(m => m.hasPermission)\n .catch(() => {\n console.error(\n '[@mastra/elysia] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _hasPermissionPromise;\n}\n\n// Export type definitions for Elysia app configuration\nexport interface ElysiaContext {\n mastra: Mastra;\n requestContext: RequestContext;\n registeredTools: ToolsInput;\n abortSignal: AbortSignal;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n}\n\n/**\n * Minimal interface representing what MastraServer needs from an Elysia app.\n * This allows any Elysia app instance to be passed without strict generic matching.\n */\nexport interface ElysiaApp {\n use(instance: MaybePromise<AnyElysia>): ElysiaApp;\n derive(callback: (context: any) => any | Promise<any>): ElysiaApp;\n get(path: string, handler: any, options?: any): ElysiaApp;\n post(path: string, handler: any, options?: any): ElysiaApp;\n put(path: string, handler: any, options?: any): ElysiaApp;\n delete(path: string, handler: any, options?: any): ElysiaApp;\n patch(path: string, handler: any, options?: any): ElysiaApp;\n all(path: string, handler: any, options?: any): ElysiaApp;\n onAfterHandle(handler: (context: any) => any): ElysiaApp;\n onError(handler: (context: any) => any): ElysiaApp;\n}\n\nexport class MastraServer extends MastraServerBase<Elysia, Request, Response> {\n createContextMiddleware() {\n return async (ctx: any) => {\n // Parse request context from request body and query params\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT/PATCH)\n if (ctx.request.method === 'POST' || ctx.request.method === 'PUT' || ctx.request.method === 'PATCH') {\n const contentType = ctx.request.headers.get('content-type');\n if (contentType?.includes('application/json')) {\n try {\n const body = (ctx.body ?? (await ctx.request.clone().json())) as { requestContext?: Record<string, any> };\n if (body.requestContext) {\n bodyRequestContext = body.requestContext;\n }\n } catch {\n // Body parsing failed, continue without body\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (ctx.request.method === 'GET') {\n try {\n // Elysia pre-parses query params into ctx.query\n const encodedRequestContext = ctx.query?.requestContext;\n if (encodedRequestContext) {\n // Try JSON first\n try {\n paramsRequestContext = JSON.parse(encodedRequestContext);\n } catch {\n // Fallback to base64(JSON)\n try {\n const json = Buffer.from(encodedRequestContext, 'base64').toString('utf-8');\n paramsRequestContext = JSON.parse(json);\n } catch {\n // ignore if still invalid\n }\n }\n }\n } catch {\n // ignore query parsing errors\n }\n }\n\n const requestContext = this.mergeRequestContext({ paramsRequestContext, bodyRequestContext });\n this.applyRequestMetadataToContext({\n requestContext,\n getHeader: (name: string) => ctx.request.headers.get(name) || undefined,\n });\n\n // Add relevant contexts to Elysia context\n return {\n requestContext,\n mastra: this.mastra,\n registeredTools: this.tools || {},\n taskStore: this.taskStore,\n abortSignal: ctx.request.signal,\n customRouteAuthConfig: this.customRouteAuthConfig,\n };\n };\n }\n\n async stream(route: ServerRoute, _res: Response, result: { fullStream: ReadableStream }): Promise<any> {\n const streamFormat = route.streamFormat || 'stream';\n const encoder = new TextEncoder();\n\n const headers: Record<string, string> =\n streamFormat === 'sse'\n ? {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n }\n : {\n 'Content-Type': 'text/plain',\n };\n\n const stream = new ReadableStream({\n start: async controller => {\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n try {\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n controller.enqueue(encoder.encode(': connected\\n\\n'));\n }\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n // SSE comment passthrough — strings starting with ':' are written as-is\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n controller.enqueue(encoder.encode(value));\n continue;\n }\n\n // Optionally redact sensitive data (system prompts, tool definitions, API keys) before sending to the client\n const shouldRedact = this.streamOptions?.redact ?? true;\n const outputValue = shouldRedact ? redactStreamChunk(value) : value;\n // A chunk that can't be serialized must not kill the stream — skip it and keep streaming\n const serialized = serializeStreamChunk(outputValue);\n if (!serialized.ok) {\n this.mastra.getLogger()?.error('Failed to serialize stream chunk, skipping', {\n path: route.path,\n chunkType: (outputValue as { type?: string })?.type,\n error: serialized.error.message,\n });\n continue;\n }\n if (streamFormat === 'sse') {\n controller.enqueue(encoder.encode(`data: ${serialized.json}\\n\\n`));\n } else {\n controller.enqueue(encoder.encode(serialized.json + '\\x1E'));\n }\n }\n }\n\n if (streamFormat === 'sse') {\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'));\n }\n controller.close();\n } catch (error) {\n this.mastra.getLogger()?.error('Error in stream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n controller.error(error);\n } finally {\n await reader.cancel();\n }\n },\n });\n\n return new Response(stream, { headers });\n }\n\n async getParams(route: ServerRoute, request: Request): Promise<ParsedRequestParams> {\n const url = new URL(request.url);\n\n // URL params - extract from request context if available (Elysia stores params in ctx)\n // Params may be normalized (p0, p1, ...) — remap back to original names from route path\n const { paramNames } = normalizeRouteParams(route.path);\n const rawUrlParams: Record<string, string> = (request as any).params || (request as any).ctx?.params || {};\n const urlParams = paramNames.length > 0 ? remapParams(rawUrlParams, paramNames) : rawUrlParams;\n\n // Query params - parse from URL\n const queryParams = normalizeQueryParams(Object.fromEntries(url.searchParams));\n\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const contentType = request.headers.get('content-type') || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const formData = await request.formData();\n body = await this.parseFormData(formData);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Re-throw size limit errors\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else if (contentType.includes('application/json')) {\n const clonedReq = request.clone();\n const bodyText = await clonedReq.text();\n\n if (bodyText && bodyText.trim().length > 0) {\n try {\n body = JSON.parse(bodyText);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse JSON body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Invalid JSON in request body',\n };\n }\n }\n }\n }\n\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse FormData into a plain object, converting File objects to Buffers.\n * Handles both native FormData and Elysia's pre-parsed object format.\n */\n private async parseFormData(data: FormData | Record<string, unknown>): Promise<Record<string, unknown>> {\n const result: Record<string, unknown> = {};\n\n // Handle native FormData\n if (data instanceof FormData) {\n for (const [key, value] of data.entries()) {\n if (value instanceof File) {\n const arrayBuffer = await value.arrayBuffer();\n result[key] = Buffer.from(arrayBuffer);\n } else if (typeof value === 'string') {\n // Try to parse JSON strings (like 'options')\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n // Handle Elysia's pre-parsed object format\n for (const [key, value] of Object.entries(data)) {\n if (value && typeof value === 'object' && 'arrayBuffer' in value && typeof value.arrayBuffer === 'function') {\n const arrayBuffer = await value.arrayBuffer();\n result[key] = Buffer.from(arrayBuffer);\n } else if (typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n async sendResponse(route: ServerRoute, response: Response, result: unknown, prefix?: string): Promise<any> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n const refreshHeaders: Record<string, string> = {};\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const headers = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(headers)) {\n refreshHeaders[key] = value;\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n return new Response(JSON.stringify(result), {\n status: 200,\n headers: { 'Content-Type': 'application/json', ...refreshHeaders },\n });\n } else if (route.responseType === 'stream') {\n return this.stream(route, response, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n const fetchResponse = result as globalThis.Response;\n const headers = new Headers(fetchResponse.headers);\n headers.delete('Transfer-Encoding');\n return new Response(createSafeReadableStream(fetchResponse.body), {\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n headers,\n });\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n\n const request = response as any; // Elysia context\n const forwardRequest = await createForwardRequest(request);\n const { req, res } = toReqRes(forwardRequest);\n\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n // Do NOT await startHTTP — let it run in the background so SSE\n // notifications stream to the client as they are written.\n // toFetchResponse resolves when headers are sent, not when the body finishes.\n server\n .startHTTP({\n url: new URL(forwardRequest.url),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req,\n res,\n options: Object.keys(options).length > 0 ? options : undefined,\n })\n .catch((e: unknown) => {\n this.mastra.getLogger()?.error('[MCP HTTP] Error in background startHTTP:', {\n error: e instanceof Error ? { message: e.message, stack: e.stack } : e,\n });\n });\n\n const mcpResponse = await toFetchResponse(res);\n const headers = new Headers(mcpResponse.headers);\n headers.delete('Transfer-Encoding');\n return new Response(createSafeReadableStream(mcpResponse.body), {\n status: mcpResponse.status,\n statusText: mcpResponse.statusText,\n headers,\n });\n } else if (route.responseType === 'mcp-sse') {\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n const request = response as any; // Elysia context\n const forwardRequest = await createForwardRequest(request);\n const { req, res } = toReqRes(forwardRequest);\n\n server\n .startSSE({\n url: new URL(forwardRequest.url),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n req,\n res,\n })\n .catch((e: unknown) => {\n this.mastra.getLogger()?.error('[MCP SSE] Error in background startSSE:', {\n error: e instanceof Error ? { message: e.message, stack: e.stack } : e,\n });\n });\n\n const sseResponse = await toFetchResponse(res);\n const headers = new Headers(sseResponse.headers);\n headers.delete('Transfer-Encoding');\n return new Response(createSafeReadableStream(sseResponse.body), {\n status: sseResponse.status,\n statusText: sseResponse.statusText,\n headers,\n });\n } else {\n return new Response(null, { status: 500 });\n }\n }\n\n async registerRoute(\n app: ElysiaApp,\n route: ServerRoute,\n { prefix: prefixParam }: { prefix?: string } = {},\n ): Promise<void> {\n const prefix = prefixParam ?? this.prefix ?? '';\n const fullPath = `${prefix}${route.path}`;\n const { normalizedPath, paramNames } = normalizeRouteParams(fullPath);\n\n const handler = async (ctx: any) => {\n // Check route-level authentication/authorization\n const authError = await this.checkRouteAuth(route, {\n path: ctx.request.url ? new URL(ctx.request.url).pathname : ctx.path,\n method: ctx.request.method,\n getHeader: (name: string) => ctx.request.headers.get(name) || undefined,\n getQuery: (name: string) => ctx.query?.[name],\n requestContext: ctx.requestContext,\n request: ctx.request,\n buildAuthorizeContext: () => ctx,\n });\n\n if (authError) {\n return new Response(JSON.stringify({ error: authError.error }), {\n status: authError.status,\n headers: { 'Content-Type': 'application/json', ...authError.headers },\n });\n }\n\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = ctx.requestContext.get('userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission);\n if (permissionError) {\n return new Response(JSON.stringify({ error: permissionError.error, message: permissionError.message }), {\n status: permissionError.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n }\n\n // Extract params - remap from normalized param names back to original\n const rawParams = ctx.params || {};\n const urlParams = paramNames.length > 0 ? remapParams(rawParams, paramNames) : rawParams;\n const queryParams = normalizeQueryParams(ctx.query || {});\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n const contentLength = ctx.request.headers.get('content-length');\n const contentType = ctx.request.headers.get('content-type') || '';\n const exceedsDeclaredLimit =\n maxSize !== undefined && contentLength !== null && parseInt(contentLength, 10) > maxSize;\n // Elysia may populate ctx.body before this handler, so this is a\n // post-parse safeguard when Content-Length is unavailable.\n const exceedsStreamedJsonLimit =\n maxSize !== undefined &&\n contentLength === null &&\n contentType.includes('application/json') &&\n ctx.body !== undefined &&\n new TextEncoder().encode(JSON.stringify(ctx.body)).byteLength > maxSize;\n if (exceedsDeclaredLimit || exceedsStreamedJsonLimit) {\n let errorResponse: unknown = { error: 'Request body too large' };\n if (route.maxBodySize === undefined && this.bodyLimitOptions) {\n try {\n errorResponse = this.bodyLimitOptions.onError(errorResponse);\n } catch {\n // Fall back to the default error response.\n }\n }\n return new Response(JSON.stringify(errorResponse), {\n status: 413,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (contentType.includes('multipart/form-data')) {\n try {\n // Elysia pre-parses multipart form data\n body = ctx.body ? await this.parseFormData(ctx.body) : undefined;\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else if (contentType.includes('application/json')) {\n // Elysia pre-parses JSON body\n body = ctx.body;\n\n // Validate that body is valid JSON if provided\n if (body === undefined && contentType.includes('application/json')) {\n const bodyText = await ctx.request.clone().text();\n if (bodyText && bodyText.trim().length > 0) {\n try {\n body = JSON.parse(bodyText);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse JSON body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Invalid JSON in request body',\n };\n }\n }\n }\n }\n }\n\n const params = { urlParams, queryParams, body, bodyParseError };\n\n // Return 400 Bad Request if body parsing failed\n if (params.bodyParseError) {\n return new Response(\n JSON.stringify({\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n\n if (params.queryParams) {\n try {\n params.queryParams = await this.parseQueryParams(route, params.queryParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing query params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'query');\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(\n JSON.stringify({\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n\n if (params.body !== undefined || route.bodySchema) {\n try {\n params.body = await this.parseBody(route, params.body);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'body');\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(\n JSON.stringify({\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n\n // Parse path params through pathParamSchema for type coercion (e.g., z.coerce.number())\n if (params.urlParams) {\n try {\n params.urlParams = await this.parsePathParams(route, params.urlParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing path params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'path');\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(\n JSON.stringify({\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n\n const fgaError = await checkRouteFGA(this.mastra, route, ctx.requestContext, {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n return new Response(JSON.stringify({ error: fgaError.error, message: fgaError.message }), {\n status: fgaError.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: ctx.requestContext,\n mastra: ctx.mastra,\n registeredTools: ctx.registeredTools,\n taskStore: ctx.taskStore,\n abortSignal: ctx.abortSignal,\n routePrefix: prefix,\n request: ctx.request,\n };\n\n try {\n const result = await route.handler(handlerParams);\n return this.sendResponse(route, ctx as any, result, prefix);\n } catch (error) {\n this.mastra.getLogger()?.error('Error calling handler', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n path: route.path,\n method: route.method,\n });\n\n const customResponse = getCustomHTTPExceptionResponse(error);\n if (customResponse) {\n return customResponse;\n }\n\n // Check if it's an error with a status code\n if (error && typeof error === 'object') {\n if ('status' in error) {\n const status = (error as any).status;\n return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n if ('details' in error && error.details && typeof error.details === 'object' && 'status' in error.details) {\n const status = (error.details as any).status;\n return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n };\n\n // Register the route using Elysia's method chaining\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';\n app[method](normalizedPath, handler);\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n const routes = await this.registerSchemaApiRoutes();\n if (!(await this.buildCustomRouteHandler(routes))) return;\n\n for (const route of routes) {\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';\n const { normalizedPath: customNormalizedPath } = normalizeRouteParams(route.path);\n (this.app as ElysiaApp)[method](customNormalizedPath, async (ctx: any) => {\n const path = new URL(ctx.request.url).pathname;\n const requestMethod = ctx.request.method;\n const matchedRoute = findMatchingCustomRoute(\n path,\n requestMethod,\n this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes,\n );\n const shouldRunCustomRouteAuth = isProtectedCustomRoute(path, requestMethod, this.customRouteAuthConfig);\n const shouldRunCustomRouteFGA = !!matchedRoute?.route.fga;\n\n if (shouldRunCustomRouteAuth || shouldRunCustomRouteFGA) {\n const serverRoute: ServerRoute = {\n method: (matchedRoute?.route.method ?? requestMethod) as any,\n path: matchedRoute?.route.path ?? path,\n responseType: 'json',\n handler: async () => {},\n requiresAuth: matchedRoute?.route.requiresAuth,\n requiresPermission: matchedRoute?.route.requiresPermission,\n fga: matchedRoute?.route.fga,\n };\n\n if (shouldRunCustomRouteAuth) {\n const authError = await this.checkRouteAuth(serverRoute, {\n path,\n method: requestMethod,\n getHeader: (name: string) => ctx.request.headers.get(name) || undefined,\n getQuery: (name: string) => ctx.query?.[name],\n requestContext: ctx.requestContext,\n request: ctx.request,\n buildAuthorizeContext: () => ctx,\n });\n\n if (authError) {\n return new Response(JSON.stringify({ error: authError.error }), {\n status: authError.status,\n headers: { 'Content-Type': 'application/json', ...authError.headers },\n });\n }\n\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = ctx.requestContext.get('userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(serverRoute, userPermissions, hasPermission);\n if (permissionError) {\n return new Response(\n JSON.stringify({ error: permissionError.error, message: permissionError.message }),\n {\n status: permissionError.status,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n }\n }\n\n const fgaError = await checkRouteFGA(this.mastra, serverRoute, ctx.requestContext, {\n ...(matchedRoute?.params ?? {}),\n ...(ctx.query as Record<string, string>),\n ...(typeof ctx.body === 'object' && ctx.body !== null ? ctx.body : {}),\n });\n if (fgaError) {\n return new Response(JSON.stringify({ error: fgaError.error, message: fgaError.message }), {\n status: fgaError.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n const headers: Record<string, string | string[] | undefined> = {};\n ctx.request.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n const response = await this.handleCustomRouteRequest(\n ctx.request.url,\n ctx.request.method,\n headers,\n ctx.body,\n ctx.requestContext,\n ctx.request.signal,\n );\n\n if (!response) {\n return new Response(JSON.stringify({ error: 'Not Found' }), {\n status: 404,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n return response;\n });\n }\n }\n\n registerContextMiddleware(): void {\n this.app.derive(this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n\n // Register global error handler to catch Elysia body parsing errors\n // and return structured JSON responses instead of plain text \"Bad Request\"\n this.app.onError((ctx: any) => {\n const error = ctx.error;\n const status = error?.status ?? error?.code ?? 500;\n const message = error?.message ?? 'Internal server error';\n\n // Body parsing / validation errors from Elysia are 400s\n const httpStatus = typeof status === 'number' && status >= 400 && status < 500 ? status : 500;\n\n return new Response(\n JSON.stringify({\n error: httpStatus < 500 ? message : 'Internal server error',\n ...(httpStatus < 500 ? { issues: [] } : {}),\n }),\n {\n status: httpStatus,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n });\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n this.app.derive(async (ctx: any) => {\n const path = new URL(ctx.request.url).pathname;\n if (!this.shouldLogRequest(path)) {\n return {};\n }\n\n return {\n httpLogStart: Date.now(),\n };\n });\n\n this.app.onAfterHandle((ctx: any) => {\n const path = new URL(ctx.request.url).pathname;\n if (!this.shouldLogRequest(path)) {\n return;\n }\n\n const duration = Date.now() - (ctx.httpLogStart ?? Date.now());\n const method = ctx.request.method;\n const status = ctx.response?.status ?? ctx.set?.status ?? 200;\n const level = this.httpLoggingConfig?.level || 'info';\n\n const logData: Record<string, any> = {\n method,\n path,\n status,\n duration: `${duration}ms`,\n };\n\n if (this.httpLoggingConfig?.includeQueryParams) {\n logData.query = ctx.query || {};\n }\n\n if (this.httpLoggingConfig?.includeHeaders) {\n const headers = Object.fromEntries(ctx.request.headers.entries());\n const redactHeaders = this.httpLoggingConfig.redactHeaders || [];\n redactHeaders.forEach(h => {\n const key = h.toLowerCase();\n if (headers[key] !== undefined) {\n headers[key] = '[REDACTED]';\n }\n });\n logData.headers = headers;\n }\n\n this.logger[level](`${method} ${path} ${status} ${duration}ms`, logData);\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["RequestContext","SERVER_ROUTES","MastraServerBase","request"],"sources":["../src/auth-middleware.ts","../src/helper.ts","../src/index.ts"],"sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\n\nexport interface ElysiaAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nexport function createAuthMiddleware({\n mastra,\n requiresAuth = true,\n}: ElysiaAuthMiddlewareOptions): (ctx: any) => Promise<globalThis.Response | void> {\n return async (ctx: any) => {\n if (!requiresAuth) {\n return;\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n return;\n }\n\n ctx.requestContext ??= new RequestContext();\n ctx.mastra ??= mastra;\n\n const url = new URL(ctx.request.url);\n const path = url.pathname;\n const method = ctx.request.method;\n const customRouteAuthConfig = new Map<string, boolean>(ctx.customRouteAuthConfig ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = ctx.request.headers.get('authorization');\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token && ctx.query?.apiKey) {\n token = ctx.query.apiKey;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => ctx.request.headers.get(name) || undefined,\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext: ctx.requestContext,\n rawRequest: ctx.request,\n token,\n buildAuthorizeContext: () => ctx,\n });\n\n if (result.action === 'error') {\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n };\n}\n","import {\n generateOpenAPIDocument,\n convertCustomRoutesToOpenAPIPaths,\n SERVER_ROUTES,\n} from '@mastra/server/server-adapter';\nimport type { MastraServer } from './index';\n\n/**\n * OpenAPI documentation cache to avoid regenerating on each call.\n * Uses WeakMap to prevent cache collisions between server instances.\n */\nconst openapiDocCache = new WeakMap<\n MastraServer,\n {\n paths: Record<string, any>;\n components?: Record<string, any>;\n info: { title: string; version: string; description?: string };\n }\n>();\n\n/**\n * Get OpenAPI documentation from a MastraServer instance, formatted for Elysia's openapi plugin.\n *\n * This function:\n * - Extracts all Mastra routes with their Zod schemas\n * - Converts them to OpenAPI 3.1.0 format\n * - Merges custom routes if registered\n * - Applies the configured route prefix to all paths\n * - Caches the result for performance\n *\n * @param server - The MastraServer instance (must be initialized with init())\n * @param options - Optional configuration for OpenAPI metadata\n * @returns OpenAPI documentation with paths, components, and info\n *\n * @example\n * ```typescript\n * import { getMastraOpenAPIDoc } from '@mastra/elysia';\n *\n * const srv = new MastraServer({ mastra, app, prefix: '/api' });\n * await srv.init();\n *\n * const openAPIDoc = getMastraOpenAPIDoc(srv, {\n * title: 'My Mastra API',\n * version: '1.0.0',\n * description: 'API with weather agent'\n * });\n *\n * app.use(openapi({\n * documentation: {\n * info: openAPIDoc.info,\n * paths: openAPIDoc.paths,\n * components: openAPIDoc.components\n * }\n * }));\n * ```\n */\nexport function getMastraOpenAPIDoc(\n server: MastraServer,\n options?: {\n title?: string;\n version?: string;\n description?: string;\n clearCache?: boolean;\n },\n): {\n paths: Record<string, any>;\n components?: Record<string, any>;\n info: { title: string; version: string; description?: string };\n} {\n // Clear cache if requested\n if (options?.clearCache) {\n openapiDocCache.delete(server);\n }\n\n // Return cached result if available\n const cached = openapiDocCache.get(server);\n if (cached) {\n // Merge custom info if provided\n if (options) {\n return {\n ...cached,\n info: {\n ...cached.info,\n ...(options.title && { title: options.title }),\n ...(options.version && { version: options.version }),\n ...(options.description && { description: options.description }),\n },\n };\n }\n return cached;\n }\n\n // Generate complete OpenAPI spec from Mastra's route definitions\n const openApiSpec = generateOpenAPIDocument(SERVER_ROUTES, {\n title: options?.title || 'Mastra API',\n version: options?.version || '1.0.0',\n description: options?.description || 'Mastra Server API',\n });\n\n // Merge custom API routes if present\n const customApiRoutes = (server as any).customApiRoutes;\n if (customApiRoutes && customApiRoutes.length > 0) {\n const customPaths = convertCustomRoutesToOpenAPIPaths(customApiRoutes);\n openApiSpec.paths = { ...openApiSpec.paths, ...customPaths };\n }\n\n let paths = openApiSpec.paths || {};\n\n // Apply prefix transformation if configured\n const prefix = (server as any).prefix;\n if (prefix && prefix !== '/') {\n const prefixedPaths: Record<string, any> = {};\n for (const [path, pathItem] of Object.entries(paths)) {\n // Combine prefix with path, ensuring no double slashes\n const prefixedPath = `${prefix}${path}`.replace(/\\/+/g, '/');\n prefixedPaths[prefixedPath] = pathItem;\n }\n paths = prefixedPaths;\n }\n\n const result = {\n paths,\n components: openApiSpec.components,\n info: openApiSpec.info,\n };\n\n // Cache the result\n openapiDocCache.set(server, result);\n\n return result;\n}\n\n/**\n * Clear the OpenAPI documentation cache.\n * Call this if routes are added dynamically after initialization.\n *\n * `@param` server - The MastraServer instance to clear cache for.\n * Note: WeakMap does not support clearing all entries. Pass the specific server instance whose cache should be invalidated.\n */\nexport function clearMastraOpenAPICache(server?: MastraServer): void {\n if (server) {\n openapiDocCache.delete(server);\n }\n // Cannot clear all entries in WeakMap - they will be garbage collected when servers are released\n}\n","import type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { InMemoryTaskStore } from '@mastra/server/a2a/store';\nimport { findMatchingCustomRoute, isProtectedCustomRoute } from '@mastra/server/auth';\nimport type { MCPHttpTransportResult, MCPSseTransportResult } from '@mastra/server/handlers/mcp';\nimport type { ParsedRequestParams, ServerRoute } from '@mastra/server/server-adapter';\nimport {\n MastraServer as MastraServerBase,\n checkRouteFGA,\n getCustomHTTPExceptionResponse,\n isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n serializeStreamChunk,\n} from '@mastra/server/server-adapter';\nimport type { AnyElysia, MaybePromise } from 'elysia';\nimport type Elysia from 'elysia';\nimport { toReqRes, toFetchResponse } from 'fetch-to-node';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { ElysiaAuthMiddlewareOptions } from './auth-middleware';\n\n// Export helper functions for OpenAPI integration\nexport { getMastraOpenAPIDoc, clearMastraOpenAPICache } from './helper';\n\n/**\n * Normalizes route path parameters to position-based names (:p0, :p1, ...)\n * to avoid Elysia router conflicts when different routes use different\n * parameter names at the same path segment position (e.g. :agentId vs\n * :storedAgentId under /stored/agents/...).\n * Returns the normalized path and the original parameter names in order.\n */\nfunction normalizeRouteParams(path: string): { normalizedPath: string; paramNames: string[] } {\n const paramNames: string[] = [];\n const normalizedPath = path.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, paramName: string) => {\n paramNames.push(paramName);\n return `:p${paramNames.length - 1}`;\n });\n return { normalizedPath, paramNames };\n}\n\n/**\n * Remaps Elysia's parsed params from position-based names (p0, p1, ...)\n * back to the original parameter names expected by the route handler.\n */\nfunction remapParams(rawParams: Record<string, string>, paramNames: string[]): Record<string, string> {\n if (paramNames.length === 0) return rawParams;\n const result: Record<string, string> = {};\n paramNames.forEach((paramName, i) => {\n const key = `p${i}`;\n if (key in rawParams) {\n result[paramName] = rawParams[key] as string;\n }\n });\n return result;\n}\n\nasync function createForwardRequest(ctx: any): Promise<Request> {\n const request = ctx.request as Request;\n const method = request.method;\n\n if (method === 'GET' || method === 'HEAD') {\n return request;\n }\n\n const headers = new Headers(request.headers);\n let body: any;\n\n if (ctx.body !== undefined) {\n if (typeof ctx.body === 'string' || ctx.body instanceof FormData || ctx.body instanceof Blob) {\n body = ctx.body;\n } else {\n body = JSON.stringify(ctx.body);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n }\n } else if (!request.bodyUsed) {\n const bodyBuffer = await request.clone().arrayBuffer();\n if (bodyBuffer.byteLength > 0) {\n body = bodyBuffer;\n }\n }\n\n headers.delete('content-length');\n\n return new Request(request.url, {\n method,\n headers,\n body,\n signal: request.signal,\n ...(body ? { duplex: 'half' as const } : {}),\n } as RequestInit);\n}\n\nfunction createSafeReadableStream(body: ReadableStream<Uint8Array> | null): ReadableStream<Uint8Array> | null {\n if (!body) return null;\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const reader = body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n controller.enqueue(value);\n }\n } catch {\n // Preserve chunks already sent before upstream stream errors.\n } finally {\n controller.close();\n reader.releaseLock();\n }\n },\n });\n}\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\nlet _hasPermissionPromise: Promise<HasPermissionFn | undefined> | undefined;\nfunction loadHasPermission(): Promise<HasPermissionFn | undefined> {\n if (!_hasPermissionPromise) {\n _hasPermissionPromise = import('@mastra/core/auth/ee')\n .then(m => m.hasPermission)\n .catch(() => {\n console.error(\n '[@mastra/elysia] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _hasPermissionPromise;\n}\n\n// Export type definitions for Elysia app configuration\nexport interface ElysiaContext {\n mastra: Mastra;\n requestContext: RequestContext;\n registeredTools: ToolsInput;\n abortSignal: AbortSignal;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n}\n\n/**\n * Minimal interface representing what MastraServer needs from an Elysia app.\n * This allows any Elysia app instance to be passed without strict generic matching.\n */\nexport interface ElysiaApp {\n use(instance: MaybePromise<AnyElysia>): ElysiaApp;\n derive(callback: (context: any) => any | Promise<any>): ElysiaApp;\n get(path: string, handler: any, options?: any): ElysiaApp;\n post(path: string, handler: any, options?: any): ElysiaApp;\n put(path: string, handler: any, options?: any): ElysiaApp;\n delete(path: string, handler: any, options?: any): ElysiaApp;\n patch(path: string, handler: any, options?: any): ElysiaApp;\n all(path: string, handler: any, options?: any): ElysiaApp;\n onAfterHandle(handler: (context: any) => any): ElysiaApp;\n onError(handler: (context: any) => any): ElysiaApp;\n}\n\nexport class MastraServer extends MastraServerBase<Elysia, Request, Response> {\n createContextMiddleware() {\n return async (ctx: any) => {\n // Parse request context from request body and query params\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT/PATCH)\n if (ctx.request.method === 'POST' || ctx.request.method === 'PUT' || ctx.request.method === 'PATCH') {\n const contentType = ctx.request.headers.get('content-type');\n if (contentType?.includes('application/json')) {\n try {\n const body = (ctx.body ?? (await ctx.request.clone().json())) as { requestContext?: Record<string, any> };\n if (body.requestContext) {\n bodyRequestContext = body.requestContext;\n }\n } catch {\n // Body parsing failed, continue without body\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (ctx.request.method === 'GET') {\n try {\n // Elysia pre-parses query params into ctx.query\n const encodedRequestContext = ctx.query?.requestContext;\n if (encodedRequestContext) {\n // Try JSON first\n try {\n paramsRequestContext = JSON.parse(encodedRequestContext);\n } catch {\n // Fallback to base64(JSON)\n try {\n const json = Buffer.from(encodedRequestContext, 'base64').toString('utf-8');\n paramsRequestContext = JSON.parse(json);\n } catch {\n // ignore if still invalid\n }\n }\n }\n } catch {\n // ignore query parsing errors\n }\n }\n\n const requestContext = this.mergeRequestContext({ paramsRequestContext, bodyRequestContext });\n this.applyRequestMetadataToContext({\n requestContext,\n getHeader: (name: string) => ctx.request.headers.get(name) || undefined,\n });\n\n // Add relevant contexts to Elysia context\n return {\n requestContext,\n mastra: this.mastra,\n registeredTools: this.tools || {},\n taskStore: this.taskStore,\n abortSignal: ctx.request.signal,\n customRouteAuthConfig: this.customRouteAuthConfig,\n };\n };\n }\n\n async stream(route: ServerRoute, _res: Response, result: { fullStream: ReadableStream }): Promise<any> {\n const streamFormat = route.streamFormat || 'stream';\n const encoder = new TextEncoder();\n\n const headers: Record<string, string> =\n streamFormat === 'sse'\n ? {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n }\n : {\n 'Content-Type': 'text/plain',\n };\n\n const stream = new ReadableStream({\n start: async controller => {\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n try {\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n controller.enqueue(encoder.encode(': connected\\n\\n'));\n }\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n // SSE comment passthrough — strings starting with ':' are written as-is\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n controller.enqueue(encoder.encode(value));\n continue;\n }\n\n // Optionally redact sensitive data (system prompts, tool definitions, API keys) before sending to the client\n const shouldRedact = this.streamOptions?.redact ?? true;\n const outputValue = shouldRedact ? redactStreamChunk(value) : value;\n // A chunk that can't be serialized must not kill the stream — skip it and keep streaming\n const serialized = serializeStreamChunk(outputValue);\n if (!serialized.ok) {\n this.mastra.getLogger()?.error('Failed to serialize stream chunk, skipping', {\n path: route.path,\n chunkType: (outputValue as { type?: string })?.type,\n error: serialized.error.message,\n });\n continue;\n }\n if (streamFormat === 'sse') {\n controller.enqueue(encoder.encode(`data: ${serialized.json}\\n\\n`));\n } else {\n controller.enqueue(encoder.encode(serialized.json + '\\x1E'));\n }\n }\n }\n\n if (streamFormat === 'sse') {\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'));\n }\n controller.close();\n } catch (error) {\n this.mastra.getLogger()?.error('Error in stream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n controller.error(error);\n } finally {\n await reader.cancel();\n }\n },\n });\n\n return new Response(stream, { headers });\n }\n\n async getParams(route: ServerRoute, request: Request): Promise<ParsedRequestParams> {\n const url = new URL(request.url);\n\n // URL params - extract from request context if available (Elysia stores params in ctx)\n // Params may be normalized (p0, p1, ...) — remap back to original names from route path\n const { paramNames } = normalizeRouteParams(route.path);\n const rawUrlParams: Record<string, string> = (request as any).params || (request as any).ctx?.params || {};\n const urlParams = paramNames.length > 0 ? remapParams(rawUrlParams, paramNames) : rawUrlParams;\n\n // Query params - parse from URL\n const queryParams = normalizeQueryParams(Object.fromEntries(url.searchParams));\n\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const contentType = request.headers.get('content-type') || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const formData = await request.formData();\n body = await this.parseFormData(formData);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Re-throw size limit errors\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else if (contentType.includes('application/json')) {\n const clonedReq = request.clone();\n const bodyText = await clonedReq.text();\n\n if (bodyText && bodyText.trim().length > 0) {\n try {\n body = JSON.parse(bodyText);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse JSON body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Invalid JSON in request body',\n };\n }\n }\n }\n }\n\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse FormData into a plain object, converting File objects to Buffers.\n * Handles both native FormData and Elysia's pre-parsed object format.\n */\n private async parseFormData(data: FormData | Record<string, unknown>): Promise<Record<string, unknown>> {\n const result: Record<string, unknown> = {};\n\n // Handle native FormData\n if (data instanceof FormData) {\n for (const [key, value] of data.entries()) {\n if (value instanceof File) {\n const arrayBuffer = await value.arrayBuffer();\n result[key] = Buffer.from(arrayBuffer);\n } else if (typeof value === 'string') {\n // Try to parse JSON strings (like 'options')\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n // Handle Elysia's pre-parsed object format\n for (const [key, value] of Object.entries(data)) {\n if (value && typeof value === 'object' && 'arrayBuffer' in value && typeof value.arrayBuffer === 'function') {\n const arrayBuffer = await value.arrayBuffer();\n result[key] = Buffer.from(arrayBuffer);\n } else if (typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n async sendResponse(route: ServerRoute, response: Response, result: unknown, prefix?: string): Promise<any> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n const refreshHeaders: Record<string, string> = {};\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const headers = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(headers)) {\n refreshHeaders[key] = value;\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n return new Response(JSON.stringify(result), {\n status: 200,\n headers: { 'Content-Type': 'application/json', ...refreshHeaders },\n });\n } else if (route.responseType === 'stream') {\n return this.stream(route, response, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n const fetchResponse = result as globalThis.Response;\n const headers = new Headers(fetchResponse.headers);\n headers.delete('Transfer-Encoding');\n return new Response(createSafeReadableStream(fetchResponse.body), {\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n headers,\n });\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n\n const request = response as any; // Elysia context\n const forwardRequest = await createForwardRequest(request);\n const { req, res } = toReqRes(forwardRequest);\n\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n // Do NOT await startHTTP — let it run in the background so SSE\n // notifications stream to the client as they are written.\n // toFetchResponse resolves when headers are sent, not when the body finishes.\n server\n .startHTTP({\n url: new URL(forwardRequest.url),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req,\n res,\n options: Object.keys(options).length > 0 ? options : undefined,\n })\n .catch((e: unknown) => {\n this.mastra.getLogger()?.error('[MCP HTTP] Error in background startHTTP:', {\n error: e instanceof Error ? { message: e.message, stack: e.stack } : e,\n });\n });\n\n const mcpResponse = await toFetchResponse(res);\n const headers = new Headers(mcpResponse.headers);\n headers.delete('Transfer-Encoding');\n return new Response(createSafeReadableStream(mcpResponse.body), {\n status: mcpResponse.status,\n statusText: mcpResponse.statusText,\n headers,\n });\n } else if (route.responseType === 'mcp-sse') {\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n const request = response as any; // Elysia context\n const forwardRequest = await createForwardRequest(request);\n const { req, res } = toReqRes(forwardRequest);\n\n server\n .startSSE({\n url: new URL(forwardRequest.url),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n req,\n res,\n })\n .catch((e: unknown) => {\n this.mastra.getLogger()?.error('[MCP SSE] Error in background startSSE:', {\n error: e instanceof Error ? { message: e.message, stack: e.stack } : e,\n });\n });\n\n const sseResponse = await toFetchResponse(res);\n const headers = new Headers(sseResponse.headers);\n headers.delete('Transfer-Encoding');\n return new Response(createSafeReadableStream(sseResponse.body), {\n status: sseResponse.status,\n statusText: sseResponse.statusText,\n headers,\n });\n } else {\n return new Response(null, { status: 500 });\n }\n }\n\n async registerRoute(\n app: ElysiaApp,\n route: ServerRoute,\n { prefix: prefixParam }: { prefix?: string } = {},\n ): Promise<void> {\n const prefix = prefixParam ?? this.prefix ?? '';\n const fullPath = `${prefix}${route.path}`;\n const { normalizedPath, paramNames } = normalizeRouteParams(fullPath);\n\n const handler = async (ctx: any) => {\n // Check route-level authentication/authorization\n const authError = await this.checkRouteAuth(route, {\n path: ctx.request.url ? new URL(ctx.request.url).pathname : ctx.path,\n method: ctx.request.method,\n getHeader: (name: string) => ctx.request.headers.get(name) || undefined,\n getQuery: (name: string) => ctx.query?.[name],\n requestContext: ctx.requestContext,\n request: ctx.request,\n buildAuthorizeContext: () => ctx,\n });\n\n if (authError) {\n return new Response(JSON.stringify({ error: authError.error }), {\n status: authError.status,\n headers: { 'Content-Type': 'application/json', ...authError.headers },\n });\n }\n\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = ctx.requestContext.get('userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission);\n if (permissionError) {\n return new Response(JSON.stringify({ error: permissionError.error, message: permissionError.message }), {\n status: permissionError.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n }\n\n // Extract params - remap from normalized param names back to original\n const rawParams = ctx.params || {};\n const urlParams = paramNames.length > 0 ? remapParams(rawParams, paramNames) : rawParams;\n const queryParams = normalizeQueryParams(ctx.query || {});\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n const contentLength = ctx.request.headers.get('content-length');\n const contentType = ctx.request.headers.get('content-type') || '';\n const exceedsDeclaredLimit =\n maxSize !== undefined && contentLength !== null && parseInt(contentLength, 10) > maxSize;\n // Elysia may populate ctx.body before this handler, so this is a\n // post-parse safeguard when Content-Length is unavailable.\n const exceedsStreamedJsonLimit =\n maxSize !== undefined &&\n contentLength === null &&\n contentType.includes('application/json') &&\n ctx.body !== undefined &&\n new TextEncoder().encode(JSON.stringify(ctx.body)).byteLength > maxSize;\n if (exceedsDeclaredLimit || exceedsStreamedJsonLimit) {\n let errorResponse: unknown = { error: 'Request body too large' };\n if (route.maxBodySize === undefined && this.bodyLimitOptions) {\n try {\n errorResponse = this.bodyLimitOptions.onError(errorResponse);\n } catch {\n // Fall back to the default error response.\n }\n }\n return new Response(JSON.stringify(errorResponse), {\n status: 413,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (contentType.includes('multipart/form-data')) {\n try {\n // Elysia pre-parses multipart form data\n body = ctx.body ? await this.parseFormData(ctx.body) : undefined;\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else if (contentType.includes('application/json')) {\n // Elysia pre-parses JSON body\n body = ctx.body;\n\n // Validate that body is valid JSON if provided\n if (body === undefined && contentType.includes('application/json')) {\n const bodyText = await ctx.request.clone().text();\n if (bodyText && bodyText.trim().length > 0) {\n try {\n body = JSON.parse(bodyText);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse JSON body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Invalid JSON in request body',\n };\n }\n }\n }\n }\n }\n\n const params = { urlParams, queryParams, body, bodyParseError };\n\n // Return 400 Bad Request if body parsing failed\n if (params.bodyParseError) {\n return new Response(\n JSON.stringify({\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n\n if (params.queryParams) {\n try {\n params.queryParams = await this.parseQueryParams(route, params.queryParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing query params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'query');\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(\n JSON.stringify({\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n\n if (params.body !== undefined || route.bodySchema) {\n try {\n params.body = await this.parseBody(route, params.body);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'body');\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(\n JSON.stringify({\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n\n // Parse path params through pathParamSchema for type coercion (e.g., z.coerce.number())\n if (params.urlParams) {\n try {\n params.urlParams = await this.parsePathParams(route, params.urlParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing path params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'path');\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(\n JSON.stringify({\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n\n const fgaError = await checkRouteFGA(this.mastra, route, ctx.requestContext, {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n return new Response(JSON.stringify({ error: fgaError.error, message: fgaError.message }), {\n status: fgaError.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: ctx.requestContext,\n mastra: ctx.mastra,\n registeredTools: ctx.registeredTools,\n taskStore: ctx.taskStore,\n abortSignal: ctx.abortSignal,\n routePrefix: prefix,\n request: ctx.request,\n };\n\n try {\n const result = await route.handler(handlerParams);\n return this.sendResponse(route, ctx as any, result, prefix);\n } catch (error) {\n const httpStatus =\n error && typeof error === 'object' ? ((error as any).status ?? (error as any).details?.status) : undefined;\n // 501 means an optional capability isn't provided by the configured storage or core: expected, not a server fault.\n const logLevel = httpStatus === 501 ? 'warn' : 'error';\n this.mastra.getLogger()?.[logLevel]('Error calling handler', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n path: route.path,\n method: route.method,\n });\n\n const customResponse = getCustomHTTPExceptionResponse(error);\n if (customResponse) {\n return customResponse;\n }\n\n // Check if it's an error with a status code\n if (error && typeof error === 'object') {\n if ('status' in error) {\n const status = (error as any).status;\n return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n if ('details' in error && error.details && typeof error.details === 'object' && 'status' in error.details) {\n const status = (error.details as any).status;\n return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n };\n\n // Register the route using Elysia's method chaining\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';\n app[method](normalizedPath, handler);\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n const routes = await this.registerSchemaApiRoutes();\n if (!(await this.buildCustomRouteHandler(routes))) return;\n\n for (const route of routes) {\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';\n const { normalizedPath: customNormalizedPath } = normalizeRouteParams(route.path);\n (this.app as ElysiaApp)[method](customNormalizedPath, async (ctx: any) => {\n const path = new URL(ctx.request.url).pathname;\n const requestMethod = ctx.request.method;\n const matchedRoute = findMatchingCustomRoute(\n path,\n requestMethod,\n this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes,\n );\n const shouldRunCustomRouteAuth = isProtectedCustomRoute(path, requestMethod, this.customRouteAuthConfig);\n const shouldRunCustomRouteFGA = !!matchedRoute?.route.fga;\n\n if (shouldRunCustomRouteAuth || shouldRunCustomRouteFGA) {\n const serverRoute: ServerRoute = {\n method: (matchedRoute?.route.method ?? requestMethod) as any,\n path: matchedRoute?.route.path ?? path,\n responseType: 'json',\n handler: async () => {},\n requiresAuth: matchedRoute?.route.requiresAuth,\n requiresPermission: matchedRoute?.route.requiresPermission,\n fga: matchedRoute?.route.fga,\n };\n\n if (shouldRunCustomRouteAuth) {\n const authError = await this.checkRouteAuth(serverRoute, {\n path,\n method: requestMethod,\n getHeader: (name: string) => ctx.request.headers.get(name) || undefined,\n getQuery: (name: string) => ctx.query?.[name],\n requestContext: ctx.requestContext,\n request: ctx.request,\n buildAuthorizeContext: () => ctx,\n });\n\n if (authError) {\n return new Response(JSON.stringify({ error: authError.error }), {\n status: authError.status,\n headers: { 'Content-Type': 'application/json', ...authError.headers },\n });\n }\n\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = ctx.requestContext.get('userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(serverRoute, userPermissions, hasPermission);\n if (permissionError) {\n return new Response(\n JSON.stringify({ error: permissionError.error, message: permissionError.message }),\n {\n status: permissionError.status,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n }\n }\n\n const fgaError = await checkRouteFGA(this.mastra, serverRoute, ctx.requestContext, {\n ...(matchedRoute?.params ?? {}),\n ...(ctx.query as Record<string, string>),\n ...(typeof ctx.body === 'object' && ctx.body !== null ? ctx.body : {}),\n });\n if (fgaError) {\n return new Response(JSON.stringify({ error: fgaError.error, message: fgaError.message }), {\n status: fgaError.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n const headers: Record<string, string | string[] | undefined> = {};\n ctx.request.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n const response = await this.handleCustomRouteRequest(\n ctx.request.url,\n ctx.request.method,\n headers,\n ctx.body,\n ctx.requestContext,\n ctx.request.signal,\n );\n\n if (!response) {\n return new Response(JSON.stringify({ error: 'Not Found' }), {\n status: 404,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n return response;\n });\n }\n }\n\n registerContextMiddleware(): void {\n this.app.derive(this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n\n // Register global error handler to catch Elysia body parsing errors\n // and return structured JSON responses instead of plain text \"Bad Request\"\n this.app.onError((ctx: any) => {\n const error = ctx.error;\n const status = error?.status ?? error?.code ?? 500;\n const message = error?.message ?? 'Internal server error';\n\n // Body parsing / validation errors from Elysia are 400s\n const httpStatus = typeof status === 'number' && status >= 400 && status < 500 ? status : 500;\n\n return new Response(\n JSON.stringify({\n error: httpStatus < 500 ? message : 'Internal server error',\n ...(httpStatus < 500 ? { issues: [] } : {}),\n }),\n {\n status: httpStatus,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n });\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n this.app.derive(async (ctx: any) => {\n const path = new URL(ctx.request.url).pathname;\n if (!this.shouldLogRequest(path)) {\n return {};\n }\n\n return {\n httpLogStart: Date.now(),\n };\n });\n\n this.app.onAfterHandle((ctx: any) => {\n const path = new URL(ctx.request.url).pathname;\n if (!this.shouldLogRequest(path)) {\n return;\n }\n\n const duration = Date.now() - (ctx.httpLogStart ?? Date.now());\n const method = ctx.request.method;\n const status = ctx.response?.status ?? ctx.set?.status ?? 200;\n const level = this.httpLoggingConfig?.level || 'info';\n\n const logData: Record<string, any> = {\n method,\n path,\n status,\n duration: `${duration}ms`,\n };\n\n if (this.httpLoggingConfig?.includeQueryParams) {\n logData.query = ctx.query || {};\n }\n\n if (this.httpLoggingConfig?.includeHeaders) {\n const headers = Object.fromEntries(ctx.request.headers.entries());\n const redactHeaders = this.httpLoggingConfig.redactHeaders || [];\n redactHeaders.forEach(h => {\n const key = h.toLowerCase();\n if (headers[key] !== undefined) {\n headers[key] = '[REDACTED]';\n }\n });\n logData.headers = headers;\n }\n\n this.logger[level](`${method} ${path} ${status} ${duration}ms`, logData);\n });\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -651,7 +651,8 @@ var MastraServer = class extends MastraServer$1 {
651
651
  const result = await route.handler(handlerParams);
652
652
  return this.sendResponse(route, ctx, result, prefix);
653
653
  } catch (error) {
654
- this.mastra.getLogger()?.error("Error calling handler", {
654
+ const logLevel = (error && typeof error === "object" ? error.status ?? error.details?.status : void 0) === 501 ? "warn" : "error";
655
+ this.mastra.getLogger()?.[logLevel]("Error calling handler", {
655
656
  error: error instanceof Error ? {
656
657
  message: error.message,
657
658
  stack: error.stack
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["MastraServerBase","request"],"sources":["../src/auth-middleware.ts","../src/helper.ts","../src/index.ts"],"sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\n\nexport interface ElysiaAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nexport function createAuthMiddleware({\n mastra,\n requiresAuth = true,\n}: ElysiaAuthMiddlewareOptions): (ctx: any) => Promise<globalThis.Response | void> {\n return async (ctx: any) => {\n if (!requiresAuth) {\n return;\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n return;\n }\n\n ctx.requestContext ??= new RequestContext();\n ctx.mastra ??= mastra;\n\n const url = new URL(ctx.request.url);\n const path = url.pathname;\n const method = ctx.request.method;\n const customRouteAuthConfig = new Map<string, boolean>(ctx.customRouteAuthConfig ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = ctx.request.headers.get('authorization');\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token && ctx.query?.apiKey) {\n token = ctx.query.apiKey;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => ctx.request.headers.get(name) || undefined,\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext: ctx.requestContext,\n rawRequest: ctx.request,\n token,\n buildAuthorizeContext: () => ctx,\n });\n\n if (result.action === 'error') {\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n };\n}\n","import {\n generateOpenAPIDocument,\n convertCustomRoutesToOpenAPIPaths,\n SERVER_ROUTES,\n} from '@mastra/server/server-adapter';\nimport type { MastraServer } from './index';\n\n/**\n * OpenAPI documentation cache to avoid regenerating on each call.\n * Uses WeakMap to prevent cache collisions between server instances.\n */\nconst openapiDocCache = new WeakMap<\n MastraServer,\n {\n paths: Record<string, any>;\n components?: Record<string, any>;\n info: { title: string; version: string; description?: string };\n }\n>();\n\n/**\n * Get OpenAPI documentation from a MastraServer instance, formatted for Elysia's openapi plugin.\n *\n * This function:\n * - Extracts all Mastra routes with their Zod schemas\n * - Converts them to OpenAPI 3.1.0 format\n * - Merges custom routes if registered\n * - Applies the configured route prefix to all paths\n * - Caches the result for performance\n *\n * @param server - The MastraServer instance (must be initialized with init())\n * @param options - Optional configuration for OpenAPI metadata\n * @returns OpenAPI documentation with paths, components, and info\n *\n * @example\n * ```typescript\n * import { getMastraOpenAPIDoc } from '@mastra/elysia';\n *\n * const srv = new MastraServer({ mastra, app, prefix: '/api' });\n * await srv.init();\n *\n * const openAPIDoc = getMastraOpenAPIDoc(srv, {\n * title: 'My Mastra API',\n * version: '1.0.0',\n * description: 'API with weather agent'\n * });\n *\n * app.use(openapi({\n * documentation: {\n * info: openAPIDoc.info,\n * paths: openAPIDoc.paths,\n * components: openAPIDoc.components\n * }\n * }));\n * ```\n */\nexport function getMastraOpenAPIDoc(\n server: MastraServer,\n options?: {\n title?: string;\n version?: string;\n description?: string;\n clearCache?: boolean;\n },\n): {\n paths: Record<string, any>;\n components?: Record<string, any>;\n info: { title: string; version: string; description?: string };\n} {\n // Clear cache if requested\n if (options?.clearCache) {\n openapiDocCache.delete(server);\n }\n\n // Return cached result if available\n const cached = openapiDocCache.get(server);\n if (cached) {\n // Merge custom info if provided\n if (options) {\n return {\n ...cached,\n info: {\n ...cached.info,\n ...(options.title && { title: options.title }),\n ...(options.version && { version: options.version }),\n ...(options.description && { description: options.description }),\n },\n };\n }\n return cached;\n }\n\n // Generate complete OpenAPI spec from Mastra's route definitions\n const openApiSpec = generateOpenAPIDocument(SERVER_ROUTES, {\n title: options?.title || 'Mastra API',\n version: options?.version || '1.0.0',\n description: options?.description || 'Mastra Server API',\n });\n\n // Merge custom API routes if present\n const customApiRoutes = (server as any).customApiRoutes;\n if (customApiRoutes && customApiRoutes.length > 0) {\n const customPaths = convertCustomRoutesToOpenAPIPaths(customApiRoutes);\n openApiSpec.paths = { ...openApiSpec.paths, ...customPaths };\n }\n\n let paths = openApiSpec.paths || {};\n\n // Apply prefix transformation if configured\n const prefix = (server as any).prefix;\n if (prefix && prefix !== '/') {\n const prefixedPaths: Record<string, any> = {};\n for (const [path, pathItem] of Object.entries(paths)) {\n // Combine prefix with path, ensuring no double slashes\n const prefixedPath = `${prefix}${path}`.replace(/\\/+/g, '/');\n prefixedPaths[prefixedPath] = pathItem;\n }\n paths = prefixedPaths;\n }\n\n const result = {\n paths,\n components: openApiSpec.components,\n info: openApiSpec.info,\n };\n\n // Cache the result\n openapiDocCache.set(server, result);\n\n return result;\n}\n\n/**\n * Clear the OpenAPI documentation cache.\n * Call this if routes are added dynamically after initialization.\n *\n * `@param` server - The MastraServer instance to clear cache for.\n * Note: WeakMap does not support clearing all entries. Pass the specific server instance whose cache should be invalidated.\n */\nexport function clearMastraOpenAPICache(server?: MastraServer): void {\n if (server) {\n openapiDocCache.delete(server);\n }\n // Cannot clear all entries in WeakMap - they will be garbage collected when servers are released\n}\n","import type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { InMemoryTaskStore } from '@mastra/server/a2a/store';\nimport { findMatchingCustomRoute, isProtectedCustomRoute } from '@mastra/server/auth';\nimport type { MCPHttpTransportResult, MCPSseTransportResult } from '@mastra/server/handlers/mcp';\nimport type { ParsedRequestParams, ServerRoute } from '@mastra/server/server-adapter';\nimport {\n MastraServer as MastraServerBase,\n checkRouteFGA,\n getCustomHTTPExceptionResponse,\n isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n serializeStreamChunk,\n} from '@mastra/server/server-adapter';\nimport type { AnyElysia, MaybePromise } from 'elysia';\nimport type Elysia from 'elysia';\nimport { toReqRes, toFetchResponse } from 'fetch-to-node';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { ElysiaAuthMiddlewareOptions } from './auth-middleware';\n\n// Export helper functions for OpenAPI integration\nexport { getMastraOpenAPIDoc, clearMastraOpenAPICache } from './helper';\n\n/**\n * Normalizes route path parameters to position-based names (:p0, :p1, ...)\n * to avoid Elysia router conflicts when different routes use different\n * parameter names at the same path segment position (e.g. :agentId vs\n * :storedAgentId under /stored/agents/...).\n * Returns the normalized path and the original parameter names in order.\n */\nfunction normalizeRouteParams(path: string): { normalizedPath: string; paramNames: string[] } {\n const paramNames: string[] = [];\n const normalizedPath = path.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, paramName: string) => {\n paramNames.push(paramName);\n return `:p${paramNames.length - 1}`;\n });\n return { normalizedPath, paramNames };\n}\n\n/**\n * Remaps Elysia's parsed params from position-based names (p0, p1, ...)\n * back to the original parameter names expected by the route handler.\n */\nfunction remapParams(rawParams: Record<string, string>, paramNames: string[]): Record<string, string> {\n if (paramNames.length === 0) return rawParams;\n const result: Record<string, string> = {};\n paramNames.forEach((paramName, i) => {\n const key = `p${i}`;\n if (key in rawParams) {\n result[paramName] = rawParams[key] as string;\n }\n });\n return result;\n}\n\nasync function createForwardRequest(ctx: any): Promise<Request> {\n const request = ctx.request as Request;\n const method = request.method;\n\n if (method === 'GET' || method === 'HEAD') {\n return request;\n }\n\n const headers = new Headers(request.headers);\n let body: any;\n\n if (ctx.body !== undefined) {\n if (typeof ctx.body === 'string' || ctx.body instanceof FormData || ctx.body instanceof Blob) {\n body = ctx.body;\n } else {\n body = JSON.stringify(ctx.body);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n }\n } else if (!request.bodyUsed) {\n const bodyBuffer = await request.clone().arrayBuffer();\n if (bodyBuffer.byteLength > 0) {\n body = bodyBuffer;\n }\n }\n\n headers.delete('content-length');\n\n return new Request(request.url, {\n method,\n headers,\n body,\n signal: request.signal,\n ...(body ? { duplex: 'half' as const } : {}),\n } as RequestInit);\n}\n\nfunction createSafeReadableStream(body: ReadableStream<Uint8Array> | null): ReadableStream<Uint8Array> | null {\n if (!body) return null;\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const reader = body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n controller.enqueue(value);\n }\n } catch {\n // Preserve chunks already sent before upstream stream errors.\n } finally {\n controller.close();\n reader.releaseLock();\n }\n },\n });\n}\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\nlet _hasPermissionPromise: Promise<HasPermissionFn | undefined> | undefined;\nfunction loadHasPermission(): Promise<HasPermissionFn | undefined> {\n if (!_hasPermissionPromise) {\n _hasPermissionPromise = import('@mastra/core/auth/ee')\n .then(m => m.hasPermission)\n .catch(() => {\n console.error(\n '[@mastra/elysia] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _hasPermissionPromise;\n}\n\n// Export type definitions for Elysia app configuration\nexport interface ElysiaContext {\n mastra: Mastra;\n requestContext: RequestContext;\n registeredTools: ToolsInput;\n abortSignal: AbortSignal;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n}\n\n/**\n * Minimal interface representing what MastraServer needs from an Elysia app.\n * This allows any Elysia app instance to be passed without strict generic matching.\n */\nexport interface ElysiaApp {\n use(instance: MaybePromise<AnyElysia>): ElysiaApp;\n derive(callback: (context: any) => any | Promise<any>): ElysiaApp;\n get(path: string, handler: any, options?: any): ElysiaApp;\n post(path: string, handler: any, options?: any): ElysiaApp;\n put(path: string, handler: any, options?: any): ElysiaApp;\n delete(path: string, handler: any, options?: any): ElysiaApp;\n patch(path: string, handler: any, options?: any): ElysiaApp;\n all(path: string, handler: any, options?: any): ElysiaApp;\n onAfterHandle(handler: (context: any) => any): ElysiaApp;\n onError(handler: (context: any) => any): ElysiaApp;\n}\n\nexport class MastraServer extends MastraServerBase<Elysia, Request, Response> {\n createContextMiddleware() {\n return async (ctx: any) => {\n // Parse request context from request body and query params\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT/PATCH)\n if (ctx.request.method === 'POST' || ctx.request.method === 'PUT' || ctx.request.method === 'PATCH') {\n const contentType = ctx.request.headers.get('content-type');\n if (contentType?.includes('application/json')) {\n try {\n const body = (ctx.body ?? (await ctx.request.clone().json())) as { requestContext?: Record<string, any> };\n if (body.requestContext) {\n bodyRequestContext = body.requestContext;\n }\n } catch {\n // Body parsing failed, continue without body\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (ctx.request.method === 'GET') {\n try {\n // Elysia pre-parses query params into ctx.query\n const encodedRequestContext = ctx.query?.requestContext;\n if (encodedRequestContext) {\n // Try JSON first\n try {\n paramsRequestContext = JSON.parse(encodedRequestContext);\n } catch {\n // Fallback to base64(JSON)\n try {\n const json = Buffer.from(encodedRequestContext, 'base64').toString('utf-8');\n paramsRequestContext = JSON.parse(json);\n } catch {\n // ignore if still invalid\n }\n }\n }\n } catch {\n // ignore query parsing errors\n }\n }\n\n const requestContext = this.mergeRequestContext({ paramsRequestContext, bodyRequestContext });\n this.applyRequestMetadataToContext({\n requestContext,\n getHeader: (name: string) => ctx.request.headers.get(name) || undefined,\n });\n\n // Add relevant contexts to Elysia context\n return {\n requestContext,\n mastra: this.mastra,\n registeredTools: this.tools || {},\n taskStore: this.taskStore,\n abortSignal: ctx.request.signal,\n customRouteAuthConfig: this.customRouteAuthConfig,\n };\n };\n }\n\n async stream(route: ServerRoute, _res: Response, result: { fullStream: ReadableStream }): Promise<any> {\n const streamFormat = route.streamFormat || 'stream';\n const encoder = new TextEncoder();\n\n const headers: Record<string, string> =\n streamFormat === 'sse'\n ? {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n }\n : {\n 'Content-Type': 'text/plain',\n };\n\n const stream = new ReadableStream({\n start: async controller => {\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n try {\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n controller.enqueue(encoder.encode(': connected\\n\\n'));\n }\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n // SSE comment passthrough — strings starting with ':' are written as-is\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n controller.enqueue(encoder.encode(value));\n continue;\n }\n\n // Optionally redact sensitive data (system prompts, tool definitions, API keys) before sending to the client\n const shouldRedact = this.streamOptions?.redact ?? true;\n const outputValue = shouldRedact ? redactStreamChunk(value) : value;\n // A chunk that can't be serialized must not kill the stream — skip it and keep streaming\n const serialized = serializeStreamChunk(outputValue);\n if (!serialized.ok) {\n this.mastra.getLogger()?.error('Failed to serialize stream chunk, skipping', {\n path: route.path,\n chunkType: (outputValue as { type?: string })?.type,\n error: serialized.error.message,\n });\n continue;\n }\n if (streamFormat === 'sse') {\n controller.enqueue(encoder.encode(`data: ${serialized.json}\\n\\n`));\n } else {\n controller.enqueue(encoder.encode(serialized.json + '\\x1E'));\n }\n }\n }\n\n if (streamFormat === 'sse') {\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'));\n }\n controller.close();\n } catch (error) {\n this.mastra.getLogger()?.error('Error in stream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n controller.error(error);\n } finally {\n await reader.cancel();\n }\n },\n });\n\n return new Response(stream, { headers });\n }\n\n async getParams(route: ServerRoute, request: Request): Promise<ParsedRequestParams> {\n const url = new URL(request.url);\n\n // URL params - extract from request context if available (Elysia stores params in ctx)\n // Params may be normalized (p0, p1, ...) — remap back to original names from route path\n const { paramNames } = normalizeRouteParams(route.path);\n const rawUrlParams: Record<string, string> = (request as any).params || (request as any).ctx?.params || {};\n const urlParams = paramNames.length > 0 ? remapParams(rawUrlParams, paramNames) : rawUrlParams;\n\n // Query params - parse from URL\n const queryParams = normalizeQueryParams(Object.fromEntries(url.searchParams));\n\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const contentType = request.headers.get('content-type') || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const formData = await request.formData();\n body = await this.parseFormData(formData);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Re-throw size limit errors\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else if (contentType.includes('application/json')) {\n const clonedReq = request.clone();\n const bodyText = await clonedReq.text();\n\n if (bodyText && bodyText.trim().length > 0) {\n try {\n body = JSON.parse(bodyText);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse JSON body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Invalid JSON in request body',\n };\n }\n }\n }\n }\n\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse FormData into a plain object, converting File objects to Buffers.\n * Handles both native FormData and Elysia's pre-parsed object format.\n */\n private async parseFormData(data: FormData | Record<string, unknown>): Promise<Record<string, unknown>> {\n const result: Record<string, unknown> = {};\n\n // Handle native FormData\n if (data instanceof FormData) {\n for (const [key, value] of data.entries()) {\n if (value instanceof File) {\n const arrayBuffer = await value.arrayBuffer();\n result[key] = Buffer.from(arrayBuffer);\n } else if (typeof value === 'string') {\n // Try to parse JSON strings (like 'options')\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n // Handle Elysia's pre-parsed object format\n for (const [key, value] of Object.entries(data)) {\n if (value && typeof value === 'object' && 'arrayBuffer' in value && typeof value.arrayBuffer === 'function') {\n const arrayBuffer = await value.arrayBuffer();\n result[key] = Buffer.from(arrayBuffer);\n } else if (typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n async sendResponse(route: ServerRoute, response: Response, result: unknown, prefix?: string): Promise<any> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n const refreshHeaders: Record<string, string> = {};\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const headers = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(headers)) {\n refreshHeaders[key] = value;\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n return new Response(JSON.stringify(result), {\n status: 200,\n headers: { 'Content-Type': 'application/json', ...refreshHeaders },\n });\n } else if (route.responseType === 'stream') {\n return this.stream(route, response, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n const fetchResponse = result as globalThis.Response;\n const headers = new Headers(fetchResponse.headers);\n headers.delete('Transfer-Encoding');\n return new Response(createSafeReadableStream(fetchResponse.body), {\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n headers,\n });\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n\n const request = response as any; // Elysia context\n const forwardRequest = await createForwardRequest(request);\n const { req, res } = toReqRes(forwardRequest);\n\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n // Do NOT await startHTTP — let it run in the background so SSE\n // notifications stream to the client as they are written.\n // toFetchResponse resolves when headers are sent, not when the body finishes.\n server\n .startHTTP({\n url: new URL(forwardRequest.url),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req,\n res,\n options: Object.keys(options).length > 0 ? options : undefined,\n })\n .catch((e: unknown) => {\n this.mastra.getLogger()?.error('[MCP HTTP] Error in background startHTTP:', {\n error: e instanceof Error ? { message: e.message, stack: e.stack } : e,\n });\n });\n\n const mcpResponse = await toFetchResponse(res);\n const headers = new Headers(mcpResponse.headers);\n headers.delete('Transfer-Encoding');\n return new Response(createSafeReadableStream(mcpResponse.body), {\n status: mcpResponse.status,\n statusText: mcpResponse.statusText,\n headers,\n });\n } else if (route.responseType === 'mcp-sse') {\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n const request = response as any; // Elysia context\n const forwardRequest = await createForwardRequest(request);\n const { req, res } = toReqRes(forwardRequest);\n\n server\n .startSSE({\n url: new URL(forwardRequest.url),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n req,\n res,\n })\n .catch((e: unknown) => {\n this.mastra.getLogger()?.error('[MCP SSE] Error in background startSSE:', {\n error: e instanceof Error ? { message: e.message, stack: e.stack } : e,\n });\n });\n\n const sseResponse = await toFetchResponse(res);\n const headers = new Headers(sseResponse.headers);\n headers.delete('Transfer-Encoding');\n return new Response(createSafeReadableStream(sseResponse.body), {\n status: sseResponse.status,\n statusText: sseResponse.statusText,\n headers,\n });\n } else {\n return new Response(null, { status: 500 });\n }\n }\n\n async registerRoute(\n app: ElysiaApp,\n route: ServerRoute,\n { prefix: prefixParam }: { prefix?: string } = {},\n ): Promise<void> {\n const prefix = prefixParam ?? this.prefix ?? '';\n const fullPath = `${prefix}${route.path}`;\n const { normalizedPath, paramNames } = normalizeRouteParams(fullPath);\n\n const handler = async (ctx: any) => {\n // Check route-level authentication/authorization\n const authError = await this.checkRouteAuth(route, {\n path: ctx.request.url ? new URL(ctx.request.url).pathname : ctx.path,\n method: ctx.request.method,\n getHeader: (name: string) => ctx.request.headers.get(name) || undefined,\n getQuery: (name: string) => ctx.query?.[name],\n requestContext: ctx.requestContext,\n request: ctx.request,\n buildAuthorizeContext: () => ctx,\n });\n\n if (authError) {\n return new Response(JSON.stringify({ error: authError.error }), {\n status: authError.status,\n headers: { 'Content-Type': 'application/json', ...authError.headers },\n });\n }\n\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = ctx.requestContext.get('userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission);\n if (permissionError) {\n return new Response(JSON.stringify({ error: permissionError.error, message: permissionError.message }), {\n status: permissionError.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n }\n\n // Extract params - remap from normalized param names back to original\n const rawParams = ctx.params || {};\n const urlParams = paramNames.length > 0 ? remapParams(rawParams, paramNames) : rawParams;\n const queryParams = normalizeQueryParams(ctx.query || {});\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n const contentLength = ctx.request.headers.get('content-length');\n const contentType = ctx.request.headers.get('content-type') || '';\n const exceedsDeclaredLimit =\n maxSize !== undefined && contentLength !== null && parseInt(contentLength, 10) > maxSize;\n // Elysia may populate ctx.body before this handler, so this is a\n // post-parse safeguard when Content-Length is unavailable.\n const exceedsStreamedJsonLimit =\n maxSize !== undefined &&\n contentLength === null &&\n contentType.includes('application/json') &&\n ctx.body !== undefined &&\n new TextEncoder().encode(JSON.stringify(ctx.body)).byteLength > maxSize;\n if (exceedsDeclaredLimit || exceedsStreamedJsonLimit) {\n let errorResponse: unknown = { error: 'Request body too large' };\n if (route.maxBodySize === undefined && this.bodyLimitOptions) {\n try {\n errorResponse = this.bodyLimitOptions.onError(errorResponse);\n } catch {\n // Fall back to the default error response.\n }\n }\n return new Response(JSON.stringify(errorResponse), {\n status: 413,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (contentType.includes('multipart/form-data')) {\n try {\n // Elysia pre-parses multipart form data\n body = ctx.body ? await this.parseFormData(ctx.body) : undefined;\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else if (contentType.includes('application/json')) {\n // Elysia pre-parses JSON body\n body = ctx.body;\n\n // Validate that body is valid JSON if provided\n if (body === undefined && contentType.includes('application/json')) {\n const bodyText = await ctx.request.clone().text();\n if (bodyText && bodyText.trim().length > 0) {\n try {\n body = JSON.parse(bodyText);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse JSON body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Invalid JSON in request body',\n };\n }\n }\n }\n }\n }\n\n const params = { urlParams, queryParams, body, bodyParseError };\n\n // Return 400 Bad Request if body parsing failed\n if (params.bodyParseError) {\n return new Response(\n JSON.stringify({\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n\n if (params.queryParams) {\n try {\n params.queryParams = await this.parseQueryParams(route, params.queryParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing query params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'query');\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(\n JSON.stringify({\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n\n if (params.body !== undefined || route.bodySchema) {\n try {\n params.body = await this.parseBody(route, params.body);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'body');\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(\n JSON.stringify({\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n\n // Parse path params through pathParamSchema for type coercion (e.g., z.coerce.number())\n if (params.urlParams) {\n try {\n params.urlParams = await this.parsePathParams(route, params.urlParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing path params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'path');\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(\n JSON.stringify({\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n\n const fgaError = await checkRouteFGA(this.mastra, route, ctx.requestContext, {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n return new Response(JSON.stringify({ error: fgaError.error, message: fgaError.message }), {\n status: fgaError.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: ctx.requestContext,\n mastra: ctx.mastra,\n registeredTools: ctx.registeredTools,\n taskStore: ctx.taskStore,\n abortSignal: ctx.abortSignal,\n routePrefix: prefix,\n request: ctx.request,\n };\n\n try {\n const result = await route.handler(handlerParams);\n return this.sendResponse(route, ctx as any, result, prefix);\n } catch (error) {\n this.mastra.getLogger()?.error('Error calling handler', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n path: route.path,\n method: route.method,\n });\n\n const customResponse = getCustomHTTPExceptionResponse(error);\n if (customResponse) {\n return customResponse;\n }\n\n // Check if it's an error with a status code\n if (error && typeof error === 'object') {\n if ('status' in error) {\n const status = (error as any).status;\n return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n if ('details' in error && error.details && typeof error.details === 'object' && 'status' in error.details) {\n const status = (error.details as any).status;\n return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n };\n\n // Register the route using Elysia's method chaining\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';\n app[method](normalizedPath, handler);\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n const routes = await this.registerSchemaApiRoutes();\n if (!(await this.buildCustomRouteHandler(routes))) return;\n\n for (const route of routes) {\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';\n const { normalizedPath: customNormalizedPath } = normalizeRouteParams(route.path);\n (this.app as ElysiaApp)[method](customNormalizedPath, async (ctx: any) => {\n const path = new URL(ctx.request.url).pathname;\n const requestMethod = ctx.request.method;\n const matchedRoute = findMatchingCustomRoute(\n path,\n requestMethod,\n this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes,\n );\n const shouldRunCustomRouteAuth = isProtectedCustomRoute(path, requestMethod, this.customRouteAuthConfig);\n const shouldRunCustomRouteFGA = !!matchedRoute?.route.fga;\n\n if (shouldRunCustomRouteAuth || shouldRunCustomRouteFGA) {\n const serverRoute: ServerRoute = {\n method: (matchedRoute?.route.method ?? requestMethod) as any,\n path: matchedRoute?.route.path ?? path,\n responseType: 'json',\n handler: async () => {},\n requiresAuth: matchedRoute?.route.requiresAuth,\n requiresPermission: matchedRoute?.route.requiresPermission,\n fga: matchedRoute?.route.fga,\n };\n\n if (shouldRunCustomRouteAuth) {\n const authError = await this.checkRouteAuth(serverRoute, {\n path,\n method: requestMethod,\n getHeader: (name: string) => ctx.request.headers.get(name) || undefined,\n getQuery: (name: string) => ctx.query?.[name],\n requestContext: ctx.requestContext,\n request: ctx.request,\n buildAuthorizeContext: () => ctx,\n });\n\n if (authError) {\n return new Response(JSON.stringify({ error: authError.error }), {\n status: authError.status,\n headers: { 'Content-Type': 'application/json', ...authError.headers },\n });\n }\n\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = ctx.requestContext.get('userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(serverRoute, userPermissions, hasPermission);\n if (permissionError) {\n return new Response(\n JSON.stringify({ error: permissionError.error, message: permissionError.message }),\n {\n status: permissionError.status,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n }\n }\n\n const fgaError = await checkRouteFGA(this.mastra, serverRoute, ctx.requestContext, {\n ...(matchedRoute?.params ?? {}),\n ...(ctx.query as Record<string, string>),\n ...(typeof ctx.body === 'object' && ctx.body !== null ? ctx.body : {}),\n });\n if (fgaError) {\n return new Response(JSON.stringify({ error: fgaError.error, message: fgaError.message }), {\n status: fgaError.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n const headers: Record<string, string | string[] | undefined> = {};\n ctx.request.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n const response = await this.handleCustomRouteRequest(\n ctx.request.url,\n ctx.request.method,\n headers,\n ctx.body,\n ctx.requestContext,\n ctx.request.signal,\n );\n\n if (!response) {\n return new Response(JSON.stringify({ error: 'Not Found' }), {\n status: 404,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n return response;\n });\n }\n }\n\n registerContextMiddleware(): void {\n this.app.derive(this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n\n // Register global error handler to catch Elysia body parsing errors\n // and return structured JSON responses instead of plain text \"Bad Request\"\n this.app.onError((ctx: any) => {\n const error = ctx.error;\n const status = error?.status ?? error?.code ?? 500;\n const message = error?.message ?? 'Internal server error';\n\n // Body parsing / validation errors from Elysia are 400s\n const httpStatus = typeof status === 'number' && status >= 400 && status < 500 ? status : 500;\n\n return new Response(\n JSON.stringify({\n error: httpStatus < 500 ? message : 'Internal server error',\n ...(httpStatus < 500 ? { issues: [] } : {}),\n }),\n {\n status: httpStatus,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n });\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n this.app.derive(async (ctx: any) => {\n const path = new URL(ctx.request.url).pathname;\n if (!this.shouldLogRequest(path)) {\n return {};\n }\n\n return {\n httpLogStart: Date.now(),\n };\n });\n\n this.app.onAfterHandle((ctx: any) => {\n const path = new URL(ctx.request.url).pathname;\n if (!this.shouldLogRequest(path)) {\n return;\n }\n\n const duration = Date.now() - (ctx.httpLogStart ?? Date.now());\n const method = ctx.request.method;\n const status = ctx.response?.status ?? ctx.set?.status ?? 200;\n const level = this.httpLoggingConfig?.level || 'info';\n\n const logData: Record<string, any> = {\n method,\n path,\n status,\n duration: `${duration}ms`,\n };\n\n if (this.httpLoggingConfig?.includeQueryParams) {\n logData.query = ctx.query || {};\n }\n\n if (this.httpLoggingConfig?.includeHeaders) {\n const headers = Object.fromEntries(ctx.request.headers.entries());\n const redactHeaders = this.httpLoggingConfig.redactHeaders || [];\n redactHeaders.forEach(h => {\n const key = h.toLowerCase();\n if (headers[key] !== undefined) {\n headers[key] = '[REDACTED]';\n }\n });\n logData.headers = headers;\n }\n\n this.logger[level](`${method} ${path} ${status} ${duration}ms`, logData);\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["MastraServerBase","request"],"sources":["../src/auth-middleware.ts","../src/helper.ts","../src/index.ts"],"sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\n\nexport interface ElysiaAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nexport function createAuthMiddleware({\n mastra,\n requiresAuth = true,\n}: ElysiaAuthMiddlewareOptions): (ctx: any) => Promise<globalThis.Response | void> {\n return async (ctx: any) => {\n if (!requiresAuth) {\n return;\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n return;\n }\n\n ctx.requestContext ??= new RequestContext();\n ctx.mastra ??= mastra;\n\n const url = new URL(ctx.request.url);\n const path = url.pathname;\n const method = ctx.request.method;\n const customRouteAuthConfig = new Map<string, boolean>(ctx.customRouteAuthConfig ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = ctx.request.headers.get('authorization');\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token && ctx.query?.apiKey) {\n token = ctx.query.apiKey;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => ctx.request.headers.get(name) || undefined,\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext: ctx.requestContext,\n rawRequest: ctx.request,\n token,\n buildAuthorizeContext: () => ctx,\n });\n\n if (result.action === 'error') {\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n };\n}\n","import {\n generateOpenAPIDocument,\n convertCustomRoutesToOpenAPIPaths,\n SERVER_ROUTES,\n} from '@mastra/server/server-adapter';\nimport type { MastraServer } from './index';\n\n/**\n * OpenAPI documentation cache to avoid regenerating on each call.\n * Uses WeakMap to prevent cache collisions between server instances.\n */\nconst openapiDocCache = new WeakMap<\n MastraServer,\n {\n paths: Record<string, any>;\n components?: Record<string, any>;\n info: { title: string; version: string; description?: string };\n }\n>();\n\n/**\n * Get OpenAPI documentation from a MastraServer instance, formatted for Elysia's openapi plugin.\n *\n * This function:\n * - Extracts all Mastra routes with their Zod schemas\n * - Converts them to OpenAPI 3.1.0 format\n * - Merges custom routes if registered\n * - Applies the configured route prefix to all paths\n * - Caches the result for performance\n *\n * @param server - The MastraServer instance (must be initialized with init())\n * @param options - Optional configuration for OpenAPI metadata\n * @returns OpenAPI documentation with paths, components, and info\n *\n * @example\n * ```typescript\n * import { getMastraOpenAPIDoc } from '@mastra/elysia';\n *\n * const srv = new MastraServer({ mastra, app, prefix: '/api' });\n * await srv.init();\n *\n * const openAPIDoc = getMastraOpenAPIDoc(srv, {\n * title: 'My Mastra API',\n * version: '1.0.0',\n * description: 'API with weather agent'\n * });\n *\n * app.use(openapi({\n * documentation: {\n * info: openAPIDoc.info,\n * paths: openAPIDoc.paths,\n * components: openAPIDoc.components\n * }\n * }));\n * ```\n */\nexport function getMastraOpenAPIDoc(\n server: MastraServer,\n options?: {\n title?: string;\n version?: string;\n description?: string;\n clearCache?: boolean;\n },\n): {\n paths: Record<string, any>;\n components?: Record<string, any>;\n info: { title: string; version: string; description?: string };\n} {\n // Clear cache if requested\n if (options?.clearCache) {\n openapiDocCache.delete(server);\n }\n\n // Return cached result if available\n const cached = openapiDocCache.get(server);\n if (cached) {\n // Merge custom info if provided\n if (options) {\n return {\n ...cached,\n info: {\n ...cached.info,\n ...(options.title && { title: options.title }),\n ...(options.version && { version: options.version }),\n ...(options.description && { description: options.description }),\n },\n };\n }\n return cached;\n }\n\n // Generate complete OpenAPI spec from Mastra's route definitions\n const openApiSpec = generateOpenAPIDocument(SERVER_ROUTES, {\n title: options?.title || 'Mastra API',\n version: options?.version || '1.0.0',\n description: options?.description || 'Mastra Server API',\n });\n\n // Merge custom API routes if present\n const customApiRoutes = (server as any).customApiRoutes;\n if (customApiRoutes && customApiRoutes.length > 0) {\n const customPaths = convertCustomRoutesToOpenAPIPaths(customApiRoutes);\n openApiSpec.paths = { ...openApiSpec.paths, ...customPaths };\n }\n\n let paths = openApiSpec.paths || {};\n\n // Apply prefix transformation if configured\n const prefix = (server as any).prefix;\n if (prefix && prefix !== '/') {\n const prefixedPaths: Record<string, any> = {};\n for (const [path, pathItem] of Object.entries(paths)) {\n // Combine prefix with path, ensuring no double slashes\n const prefixedPath = `${prefix}${path}`.replace(/\\/+/g, '/');\n prefixedPaths[prefixedPath] = pathItem;\n }\n paths = prefixedPaths;\n }\n\n const result = {\n paths,\n components: openApiSpec.components,\n info: openApiSpec.info,\n };\n\n // Cache the result\n openapiDocCache.set(server, result);\n\n return result;\n}\n\n/**\n * Clear the OpenAPI documentation cache.\n * Call this if routes are added dynamically after initialization.\n *\n * `@param` server - The MastraServer instance to clear cache for.\n * Note: WeakMap does not support clearing all entries. Pass the specific server instance whose cache should be invalidated.\n */\nexport function clearMastraOpenAPICache(server?: MastraServer): void {\n if (server) {\n openapiDocCache.delete(server);\n }\n // Cannot clear all entries in WeakMap - they will be garbage collected when servers are released\n}\n","import type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { InMemoryTaskStore } from '@mastra/server/a2a/store';\nimport { findMatchingCustomRoute, isProtectedCustomRoute } from '@mastra/server/auth';\nimport type { MCPHttpTransportResult, MCPSseTransportResult } from '@mastra/server/handlers/mcp';\nimport type { ParsedRequestParams, ServerRoute } from '@mastra/server/server-adapter';\nimport {\n MastraServer as MastraServerBase,\n checkRouteFGA,\n getCustomHTTPExceptionResponse,\n isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n serializeStreamChunk,\n} from '@mastra/server/server-adapter';\nimport type { AnyElysia, MaybePromise } from 'elysia';\nimport type Elysia from 'elysia';\nimport { toReqRes, toFetchResponse } from 'fetch-to-node';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { ElysiaAuthMiddlewareOptions } from './auth-middleware';\n\n// Export helper functions for OpenAPI integration\nexport { getMastraOpenAPIDoc, clearMastraOpenAPICache } from './helper';\n\n/**\n * Normalizes route path parameters to position-based names (:p0, :p1, ...)\n * to avoid Elysia router conflicts when different routes use different\n * parameter names at the same path segment position (e.g. :agentId vs\n * :storedAgentId under /stored/agents/...).\n * Returns the normalized path and the original parameter names in order.\n */\nfunction normalizeRouteParams(path: string): { normalizedPath: string; paramNames: string[] } {\n const paramNames: string[] = [];\n const normalizedPath = path.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, paramName: string) => {\n paramNames.push(paramName);\n return `:p${paramNames.length - 1}`;\n });\n return { normalizedPath, paramNames };\n}\n\n/**\n * Remaps Elysia's parsed params from position-based names (p0, p1, ...)\n * back to the original parameter names expected by the route handler.\n */\nfunction remapParams(rawParams: Record<string, string>, paramNames: string[]): Record<string, string> {\n if (paramNames.length === 0) return rawParams;\n const result: Record<string, string> = {};\n paramNames.forEach((paramName, i) => {\n const key = `p${i}`;\n if (key in rawParams) {\n result[paramName] = rawParams[key] as string;\n }\n });\n return result;\n}\n\nasync function createForwardRequest(ctx: any): Promise<Request> {\n const request = ctx.request as Request;\n const method = request.method;\n\n if (method === 'GET' || method === 'HEAD') {\n return request;\n }\n\n const headers = new Headers(request.headers);\n let body: any;\n\n if (ctx.body !== undefined) {\n if (typeof ctx.body === 'string' || ctx.body instanceof FormData || ctx.body instanceof Blob) {\n body = ctx.body;\n } else {\n body = JSON.stringify(ctx.body);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n }\n } else if (!request.bodyUsed) {\n const bodyBuffer = await request.clone().arrayBuffer();\n if (bodyBuffer.byteLength > 0) {\n body = bodyBuffer;\n }\n }\n\n headers.delete('content-length');\n\n return new Request(request.url, {\n method,\n headers,\n body,\n signal: request.signal,\n ...(body ? { duplex: 'half' as const } : {}),\n } as RequestInit);\n}\n\nfunction createSafeReadableStream(body: ReadableStream<Uint8Array> | null): ReadableStream<Uint8Array> | null {\n if (!body) return null;\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const reader = body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n controller.enqueue(value);\n }\n } catch {\n // Preserve chunks already sent before upstream stream errors.\n } finally {\n controller.close();\n reader.releaseLock();\n }\n },\n });\n}\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\nlet _hasPermissionPromise: Promise<HasPermissionFn | undefined> | undefined;\nfunction loadHasPermission(): Promise<HasPermissionFn | undefined> {\n if (!_hasPermissionPromise) {\n _hasPermissionPromise = import('@mastra/core/auth/ee')\n .then(m => m.hasPermission)\n .catch(() => {\n console.error(\n '[@mastra/elysia] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _hasPermissionPromise;\n}\n\n// Export type definitions for Elysia app configuration\nexport interface ElysiaContext {\n mastra: Mastra;\n requestContext: RequestContext;\n registeredTools: ToolsInput;\n abortSignal: AbortSignal;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n}\n\n/**\n * Minimal interface representing what MastraServer needs from an Elysia app.\n * This allows any Elysia app instance to be passed without strict generic matching.\n */\nexport interface ElysiaApp {\n use(instance: MaybePromise<AnyElysia>): ElysiaApp;\n derive(callback: (context: any) => any | Promise<any>): ElysiaApp;\n get(path: string, handler: any, options?: any): ElysiaApp;\n post(path: string, handler: any, options?: any): ElysiaApp;\n put(path: string, handler: any, options?: any): ElysiaApp;\n delete(path: string, handler: any, options?: any): ElysiaApp;\n patch(path: string, handler: any, options?: any): ElysiaApp;\n all(path: string, handler: any, options?: any): ElysiaApp;\n onAfterHandle(handler: (context: any) => any): ElysiaApp;\n onError(handler: (context: any) => any): ElysiaApp;\n}\n\nexport class MastraServer extends MastraServerBase<Elysia, Request, Response> {\n createContextMiddleware() {\n return async (ctx: any) => {\n // Parse request context from request body and query params\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT/PATCH)\n if (ctx.request.method === 'POST' || ctx.request.method === 'PUT' || ctx.request.method === 'PATCH') {\n const contentType = ctx.request.headers.get('content-type');\n if (contentType?.includes('application/json')) {\n try {\n const body = (ctx.body ?? (await ctx.request.clone().json())) as { requestContext?: Record<string, any> };\n if (body.requestContext) {\n bodyRequestContext = body.requestContext;\n }\n } catch {\n // Body parsing failed, continue without body\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (ctx.request.method === 'GET') {\n try {\n // Elysia pre-parses query params into ctx.query\n const encodedRequestContext = ctx.query?.requestContext;\n if (encodedRequestContext) {\n // Try JSON first\n try {\n paramsRequestContext = JSON.parse(encodedRequestContext);\n } catch {\n // Fallback to base64(JSON)\n try {\n const json = Buffer.from(encodedRequestContext, 'base64').toString('utf-8');\n paramsRequestContext = JSON.parse(json);\n } catch {\n // ignore if still invalid\n }\n }\n }\n } catch {\n // ignore query parsing errors\n }\n }\n\n const requestContext = this.mergeRequestContext({ paramsRequestContext, bodyRequestContext });\n this.applyRequestMetadataToContext({\n requestContext,\n getHeader: (name: string) => ctx.request.headers.get(name) || undefined,\n });\n\n // Add relevant contexts to Elysia context\n return {\n requestContext,\n mastra: this.mastra,\n registeredTools: this.tools || {},\n taskStore: this.taskStore,\n abortSignal: ctx.request.signal,\n customRouteAuthConfig: this.customRouteAuthConfig,\n };\n };\n }\n\n async stream(route: ServerRoute, _res: Response, result: { fullStream: ReadableStream }): Promise<any> {\n const streamFormat = route.streamFormat || 'stream';\n const encoder = new TextEncoder();\n\n const headers: Record<string, string> =\n streamFormat === 'sse'\n ? {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n }\n : {\n 'Content-Type': 'text/plain',\n };\n\n const stream = new ReadableStream({\n start: async controller => {\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n try {\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n controller.enqueue(encoder.encode(': connected\\n\\n'));\n }\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n // SSE comment passthrough — strings starting with ':' are written as-is\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n controller.enqueue(encoder.encode(value));\n continue;\n }\n\n // Optionally redact sensitive data (system prompts, tool definitions, API keys) before sending to the client\n const shouldRedact = this.streamOptions?.redact ?? true;\n const outputValue = shouldRedact ? redactStreamChunk(value) : value;\n // A chunk that can't be serialized must not kill the stream — skip it and keep streaming\n const serialized = serializeStreamChunk(outputValue);\n if (!serialized.ok) {\n this.mastra.getLogger()?.error('Failed to serialize stream chunk, skipping', {\n path: route.path,\n chunkType: (outputValue as { type?: string })?.type,\n error: serialized.error.message,\n });\n continue;\n }\n if (streamFormat === 'sse') {\n controller.enqueue(encoder.encode(`data: ${serialized.json}\\n\\n`));\n } else {\n controller.enqueue(encoder.encode(serialized.json + '\\x1E'));\n }\n }\n }\n\n if (streamFormat === 'sse') {\n controller.enqueue(encoder.encode('data: [DONE]\\n\\n'));\n }\n controller.close();\n } catch (error) {\n this.mastra.getLogger()?.error('Error in stream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n controller.error(error);\n } finally {\n await reader.cancel();\n }\n },\n });\n\n return new Response(stream, { headers });\n }\n\n async getParams(route: ServerRoute, request: Request): Promise<ParsedRequestParams> {\n const url = new URL(request.url);\n\n // URL params - extract from request context if available (Elysia stores params in ctx)\n // Params may be normalized (p0, p1, ...) — remap back to original names from route path\n const { paramNames } = normalizeRouteParams(route.path);\n const rawUrlParams: Record<string, string> = (request as any).params || (request as any).ctx?.params || {};\n const urlParams = paramNames.length > 0 ? remapParams(rawUrlParams, paramNames) : rawUrlParams;\n\n // Query params - parse from URL\n const queryParams = normalizeQueryParams(Object.fromEntries(url.searchParams));\n\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const contentType = request.headers.get('content-type') || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const formData = await request.formData();\n body = await this.parseFormData(formData);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Re-throw size limit errors\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else if (contentType.includes('application/json')) {\n const clonedReq = request.clone();\n const bodyText = await clonedReq.text();\n\n if (bodyText && bodyText.trim().length > 0) {\n try {\n body = JSON.parse(bodyText);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse JSON body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Invalid JSON in request body',\n };\n }\n }\n }\n }\n\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse FormData into a plain object, converting File objects to Buffers.\n * Handles both native FormData and Elysia's pre-parsed object format.\n */\n private async parseFormData(data: FormData | Record<string, unknown>): Promise<Record<string, unknown>> {\n const result: Record<string, unknown> = {};\n\n // Handle native FormData\n if (data instanceof FormData) {\n for (const [key, value] of data.entries()) {\n if (value instanceof File) {\n const arrayBuffer = await value.arrayBuffer();\n result[key] = Buffer.from(arrayBuffer);\n } else if (typeof value === 'string') {\n // Try to parse JSON strings (like 'options')\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n // Handle Elysia's pre-parsed object format\n for (const [key, value] of Object.entries(data)) {\n if (value && typeof value === 'object' && 'arrayBuffer' in value && typeof value.arrayBuffer === 'function') {\n const arrayBuffer = await value.arrayBuffer();\n result[key] = Buffer.from(arrayBuffer);\n } else if (typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n async sendResponse(route: ServerRoute, response: Response, result: unknown, prefix?: string): Promise<any> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n const refreshHeaders: Record<string, string> = {};\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const headers = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(headers)) {\n refreshHeaders[key] = value;\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n return new Response(JSON.stringify(result), {\n status: 200,\n headers: { 'Content-Type': 'application/json', ...refreshHeaders },\n });\n } else if (route.responseType === 'stream') {\n return this.stream(route, response, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n const fetchResponse = result as globalThis.Response;\n const headers = new Headers(fetchResponse.headers);\n headers.delete('Transfer-Encoding');\n return new Response(createSafeReadableStream(fetchResponse.body), {\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n headers,\n });\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n\n const request = response as any; // Elysia context\n const forwardRequest = await createForwardRequest(request);\n const { req, res } = toReqRes(forwardRequest);\n\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n // Do NOT await startHTTP — let it run in the background so SSE\n // notifications stream to the client as they are written.\n // toFetchResponse resolves when headers are sent, not when the body finishes.\n server\n .startHTTP({\n url: new URL(forwardRequest.url),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req,\n res,\n options: Object.keys(options).length > 0 ? options : undefined,\n })\n .catch((e: unknown) => {\n this.mastra.getLogger()?.error('[MCP HTTP] Error in background startHTTP:', {\n error: e instanceof Error ? { message: e.message, stack: e.stack } : e,\n });\n });\n\n const mcpResponse = await toFetchResponse(res);\n const headers = new Headers(mcpResponse.headers);\n headers.delete('Transfer-Encoding');\n return new Response(createSafeReadableStream(mcpResponse.body), {\n status: mcpResponse.status,\n statusText: mcpResponse.statusText,\n headers,\n });\n } else if (route.responseType === 'mcp-sse') {\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n const request = response as any; // Elysia context\n const forwardRequest = await createForwardRequest(request);\n const { req, res } = toReqRes(forwardRequest);\n\n server\n .startSSE({\n url: new URL(forwardRequest.url),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n req,\n res,\n })\n .catch((e: unknown) => {\n this.mastra.getLogger()?.error('[MCP SSE] Error in background startSSE:', {\n error: e instanceof Error ? { message: e.message, stack: e.stack } : e,\n });\n });\n\n const sseResponse = await toFetchResponse(res);\n const headers = new Headers(sseResponse.headers);\n headers.delete('Transfer-Encoding');\n return new Response(createSafeReadableStream(sseResponse.body), {\n status: sseResponse.status,\n statusText: sseResponse.statusText,\n headers,\n });\n } else {\n return new Response(null, { status: 500 });\n }\n }\n\n async registerRoute(\n app: ElysiaApp,\n route: ServerRoute,\n { prefix: prefixParam }: { prefix?: string } = {},\n ): Promise<void> {\n const prefix = prefixParam ?? this.prefix ?? '';\n const fullPath = `${prefix}${route.path}`;\n const { normalizedPath, paramNames } = normalizeRouteParams(fullPath);\n\n const handler = async (ctx: any) => {\n // Check route-level authentication/authorization\n const authError = await this.checkRouteAuth(route, {\n path: ctx.request.url ? new URL(ctx.request.url).pathname : ctx.path,\n method: ctx.request.method,\n getHeader: (name: string) => ctx.request.headers.get(name) || undefined,\n getQuery: (name: string) => ctx.query?.[name],\n requestContext: ctx.requestContext,\n request: ctx.request,\n buildAuthorizeContext: () => ctx,\n });\n\n if (authError) {\n return new Response(JSON.stringify({ error: authError.error }), {\n status: authError.status,\n headers: { 'Content-Type': 'application/json', ...authError.headers },\n });\n }\n\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = ctx.requestContext.get('userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission);\n if (permissionError) {\n return new Response(JSON.stringify({ error: permissionError.error, message: permissionError.message }), {\n status: permissionError.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n }\n\n // Extract params - remap from normalized param names back to original\n const rawParams = ctx.params || {};\n const urlParams = paramNames.length > 0 ? remapParams(rawParams, paramNames) : rawParams;\n const queryParams = normalizeQueryParams(ctx.query || {});\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n const contentLength = ctx.request.headers.get('content-length');\n const contentType = ctx.request.headers.get('content-type') || '';\n const exceedsDeclaredLimit =\n maxSize !== undefined && contentLength !== null && parseInt(contentLength, 10) > maxSize;\n // Elysia may populate ctx.body before this handler, so this is a\n // post-parse safeguard when Content-Length is unavailable.\n const exceedsStreamedJsonLimit =\n maxSize !== undefined &&\n contentLength === null &&\n contentType.includes('application/json') &&\n ctx.body !== undefined &&\n new TextEncoder().encode(JSON.stringify(ctx.body)).byteLength > maxSize;\n if (exceedsDeclaredLimit || exceedsStreamedJsonLimit) {\n let errorResponse: unknown = { error: 'Request body too large' };\n if (route.maxBodySize === undefined && this.bodyLimitOptions) {\n try {\n errorResponse = this.bodyLimitOptions.onError(errorResponse);\n } catch {\n // Fall back to the default error response.\n }\n }\n return new Response(JSON.stringify(errorResponse), {\n status: 413,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n if (contentType.includes('multipart/form-data')) {\n try {\n // Elysia pre-parses multipart form data\n body = ctx.body ? await this.parseFormData(ctx.body) : undefined;\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else if (contentType.includes('application/json')) {\n // Elysia pre-parses JSON body\n body = ctx.body;\n\n // Validate that body is valid JSON if provided\n if (body === undefined && contentType.includes('application/json')) {\n const bodyText = await ctx.request.clone().text();\n if (bodyText && bodyText.trim().length > 0) {\n try {\n body = JSON.parse(bodyText);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse JSON body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Invalid JSON in request body',\n };\n }\n }\n }\n }\n }\n\n const params = { urlParams, queryParams, body, bodyParseError };\n\n // Return 400 Bad Request if body parsing failed\n if (params.bodyParseError) {\n return new Response(\n JSON.stringify({\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n\n if (params.queryParams) {\n try {\n params.queryParams = await this.parseQueryParams(route, params.queryParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing query params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'query');\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(\n JSON.stringify({\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n\n if (params.body !== undefined || route.bodySchema) {\n try {\n params.body = await this.parseBody(route, params.body);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'body');\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(\n JSON.stringify({\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n\n // Parse path params through pathParamSchema for type coercion (e.g., z.coerce.number())\n if (params.urlParams) {\n try {\n params.urlParams = await this.parsePathParams(route, params.urlParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing path params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'path');\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(\n JSON.stringify({\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n }),\n {\n status: 400,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n\n const fgaError = await checkRouteFGA(this.mastra, route, ctx.requestContext, {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n return new Response(JSON.stringify({ error: fgaError.error, message: fgaError.message }), {\n status: fgaError.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: ctx.requestContext,\n mastra: ctx.mastra,\n registeredTools: ctx.registeredTools,\n taskStore: ctx.taskStore,\n abortSignal: ctx.abortSignal,\n routePrefix: prefix,\n request: ctx.request,\n };\n\n try {\n const result = await route.handler(handlerParams);\n return this.sendResponse(route, ctx as any, result, prefix);\n } catch (error) {\n const httpStatus =\n error && typeof error === 'object' ? ((error as any).status ?? (error as any).details?.status) : undefined;\n // 501 means an optional capability isn't provided by the configured storage or core: expected, not a server fault.\n const logLevel = httpStatus === 501 ? 'warn' : 'error';\n this.mastra.getLogger()?.[logLevel]('Error calling handler', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n path: route.path,\n method: route.method,\n });\n\n const customResponse = getCustomHTTPExceptionResponse(error);\n if (customResponse) {\n return customResponse;\n }\n\n // Check if it's an error with a status code\n if (error && typeof error === 'object') {\n if ('status' in error) {\n const status = (error as any).status;\n return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n if ('details' in error && error.details && typeof error.details === 'object' && 'status' in error.details) {\n const status = (error.details as any).status;\n return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n return new Response(JSON.stringify({ error: error instanceof Error ? error.message : 'Unknown error' }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n };\n\n // Register the route using Elysia's method chaining\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';\n app[method](normalizedPath, handler);\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n const routes = await this.registerSchemaApiRoutes();\n if (!(await this.buildCustomRouteHandler(routes))) return;\n\n for (const route of routes) {\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';\n const { normalizedPath: customNormalizedPath } = normalizeRouteParams(route.path);\n (this.app as ElysiaApp)[method](customNormalizedPath, async (ctx: any) => {\n const path = new URL(ctx.request.url).pathname;\n const requestMethod = ctx.request.method;\n const matchedRoute = findMatchingCustomRoute(\n path,\n requestMethod,\n this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes,\n );\n const shouldRunCustomRouteAuth = isProtectedCustomRoute(path, requestMethod, this.customRouteAuthConfig);\n const shouldRunCustomRouteFGA = !!matchedRoute?.route.fga;\n\n if (shouldRunCustomRouteAuth || shouldRunCustomRouteFGA) {\n const serverRoute: ServerRoute = {\n method: (matchedRoute?.route.method ?? requestMethod) as any,\n path: matchedRoute?.route.path ?? path,\n responseType: 'json',\n handler: async () => {},\n requiresAuth: matchedRoute?.route.requiresAuth,\n requiresPermission: matchedRoute?.route.requiresPermission,\n fga: matchedRoute?.route.fga,\n };\n\n if (shouldRunCustomRouteAuth) {\n const authError = await this.checkRouteAuth(serverRoute, {\n path,\n method: requestMethod,\n getHeader: (name: string) => ctx.request.headers.get(name) || undefined,\n getQuery: (name: string) => ctx.query?.[name],\n requestContext: ctx.requestContext,\n request: ctx.request,\n buildAuthorizeContext: () => ctx,\n });\n\n if (authError) {\n return new Response(JSON.stringify({ error: authError.error }), {\n status: authError.status,\n headers: { 'Content-Type': 'application/json', ...authError.headers },\n });\n }\n\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = ctx.requestContext.get('userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(serverRoute, userPermissions, hasPermission);\n if (permissionError) {\n return new Response(\n JSON.stringify({ error: permissionError.error, message: permissionError.message }),\n {\n status: permissionError.status,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n }\n }\n }\n }\n\n const fgaError = await checkRouteFGA(this.mastra, serverRoute, ctx.requestContext, {\n ...(matchedRoute?.params ?? {}),\n ...(ctx.query as Record<string, string>),\n ...(typeof ctx.body === 'object' && ctx.body !== null ? ctx.body : {}),\n });\n if (fgaError) {\n return new Response(JSON.stringify({ error: fgaError.error, message: fgaError.message }), {\n status: fgaError.status,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n\n const headers: Record<string, string | string[] | undefined> = {};\n ctx.request.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n const response = await this.handleCustomRouteRequest(\n ctx.request.url,\n ctx.request.method,\n headers,\n ctx.body,\n ctx.requestContext,\n ctx.request.signal,\n );\n\n if (!response) {\n return new Response(JSON.stringify({ error: 'Not Found' }), {\n status: 404,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n return response;\n });\n }\n }\n\n registerContextMiddleware(): void {\n this.app.derive(this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n\n // Register global error handler to catch Elysia body parsing errors\n // and return structured JSON responses instead of plain text \"Bad Request\"\n this.app.onError((ctx: any) => {\n const error = ctx.error;\n const status = error?.status ?? error?.code ?? 500;\n const message = error?.message ?? 'Internal server error';\n\n // Body parsing / validation errors from Elysia are 400s\n const httpStatus = typeof status === 'number' && status >= 400 && status < 500 ? status : 500;\n\n return new Response(\n JSON.stringify({\n error: httpStatus < 500 ? message : 'Internal server error',\n ...(httpStatus < 500 ? { issues: [] } : {}),\n }),\n {\n status: httpStatus,\n headers: { 'Content-Type': 'application/json' },\n },\n );\n });\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n this.app.derive(async (ctx: any) => {\n const path = new URL(ctx.request.url).pathname;\n if (!this.shouldLogRequest(path)) {\n return {};\n }\n\n return {\n httpLogStart: Date.now(),\n };\n });\n\n this.app.onAfterHandle((ctx: any) => {\n const path = new URL(ctx.request.url).pathname;\n if (!this.shouldLogRequest(path)) {\n return;\n }\n\n const duration = Date.now() - (ctx.httpLogStart ?? Date.now());\n const method = ctx.request.method;\n const status = ctx.response?.status ?? ctx.set?.status ?? 200;\n const level = this.httpLoggingConfig?.level || 'info';\n\n const logData: Record<string, any> = {\n method,\n path,\n status,\n duration: `${duration}ms`,\n };\n\n if (this.httpLoggingConfig?.includeQueryParams) {\n logData.query = ctx.query || {};\n }\n\n if (this.httpLoggingConfig?.includeHeaders) {\n const headers = Object.fromEntries(ctx.request.headers.entries());\n const redactHeaders = this.httpLoggingConfig.redactHeaders || [];\n redactHeaders.forEach(h => {\n const key = h.toLowerCase();\n if (headers[key] !== undefined) {\n headers[key] = '[REDACTED]';\n }\n });\n logData.headers = headers;\n }\n\n this.logger[level](`${method} ${path} ${status} ${duration}ms`, logData);\n });\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/elysia",
3
- "version": "0.1.11-alpha.0",
3
+ "version": "0.1.11",
4
4
  "description": "Mastra Elysia adapter for the server",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -21,7 +21,7 @@
21
21
  "license": "Apache-2.0",
22
22
  "dependencies": {
23
23
  "fetch-to-node": "^2.1.0",
24
- "@mastra/server": "1.71.0-alpha.0"
24
+ "@mastra/server": "1.71.0"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@ai-sdk/openai": "^2.0.62",
@@ -37,14 +37,14 @@
37
37
  "typescript": "^7.0.2",
38
38
  "vitest": "4.1.11",
39
39
  "zod": "^4.6.4",
40
- "@internal/lint": "0.0.136",
40
+ "@internal/lint": "0.0.137",
41
+ "@internal/storage-test-utils": "0.0.133",
41
42
  "@mastra/server-adapters-test-suite": "0.1.0",
42
- "@internal/types-builder": "0.0.111",
43
- "@internal/storage-test-utils": "0.0.132",
44
- "@mastra/libsql": "1.23.2",
45
- "@mastra/memory": "1.32.0",
46
- "@mastra/observability": "1.18.0",
47
- "@mastra/core": "1.71.0-alpha.0"
43
+ "@internal/types-builder": "0.0.112",
44
+ "@mastra/libsql": "1.23.3",
45
+ "@mastra/core": "1.71.0",
46
+ "@mastra/memory": "1.32.1",
47
+ "@mastra/observability": "1.18.1"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "@mastra/core": ">=1.58.0-0 <2.0.0-0",