@mastra/express 1.3.30-alpha.2 → 1.3.30-alpha.4

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/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @mastra/express
2
2
 
3
+ ## 1.3.30-alpha.4
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated to support dual auth system. Adapters now check for both `studio.auth` and `server.auth` when gating RBAC, and route requests to the correct auth provider based on the `x-mastra-client-type` header. ([#17722](https://github.com/mastra-ai/mastra/pull/17722))
8
+
9
+ - Updated dependencies [[`575f815`](https://github.com/mastra-ai/mastra/commit/575f815c5c3567b71c0b83cbb7fa98c8253a9d9c), [`306909a`](https://github.com/mastra-ai/mastra/commit/306909a693de77d709b38706e2673c9547d24a28), [`5191af8`](https://github.com/mastra-ai/mastra/commit/5191af80c799eea25357c545fc05d91b3883531d), [`43bd3d4`](https://github.com/mastra-ai/mastra/commit/43bd3d421987463fdf35386a45199c49499ed069), [`e6fa79e`](https://github.com/mastra-ai/mastra/commit/e6fa79ec72a2ddffdd25e85270398951e9d552a4), [`e6fa79e`](https://github.com/mastra-ai/mastra/commit/e6fa79ec72a2ddffdd25e85270398951e9d552a4), [`904bcdf`](https://github.com/mastra-ai/mastra/commit/904bcdf7b8004aa7be823f9f70ca63580e47e470), [`7f5ee1d`](https://github.com/mastra-ai/mastra/commit/7f5ee1dca46daee8d2817f2ebe49e6335da81956), [`1e9aab5`](https://github.com/mastra-ai/mastra/commit/1e9aab50ff11e6e88fde4d7cbf512c44a9fe8d61), [`3abfa15`](https://github.com/mastra-ai/mastra/commit/3abfa158881ad3b187f69392cc64fe3a5aeed5c3), [`bf8eb6d`](https://github.com/mastra-ai/mastra/commit/bf8eb6d0ec213a403eb9265a594ad283c44ab3dc), [`493a328`](https://github.com/mastra-ai/mastra/commit/493a328f4346a1deeb9f1e2e44c8f2a3a4d7591b), [`029a414`](https://github.com/mastra-ai/mastra/commit/029a4141719793bd3e898a39eb5a0466a55f5f3a), [`b147b29`](https://github.com/mastra-ai/mastra/commit/b147b2907f0cd1aa812efe6d6e3f58d22e66fc88), [`d371ac1`](https://github.com/mastra-ai/mastra/commit/d371ac1d9820afaaf7cfdbc380a475946a994d8f), [`cf182b7`](https://github.com/mastra-ai/mastra/commit/cf182b7fb495767946d9840ef29f19cfa906f31f), [`983aa20`](https://github.com/mastra-ai/mastra/commit/983aa20f65c57cd893ef1ffd5ae4c07bb6e1d345), [`a049c2a`](https://github.com/mastra-ai/mastra/commit/a049c2a9dfb41d0ee2e7a28874a88cd64fd5669f), [`b147b29`](https://github.com/mastra-ai/mastra/commit/b147b2907f0cd1aa812efe6d6e3f58d22e66fc88), [`2a96528`](https://github.com/mastra-ai/mastra/commit/2a9652848dfa3c5a2426f952e9d93554c26fd90f), [`2656d9c`](https://github.com/mastra-ai/mastra/commit/2656d9c2976d4f3354253bfbbbf9b88a1b2bbf34), [`0d062e5`](https://github.com/mastra-ai/mastra/commit/0d062e538a23ed54e15a42cb9e9f1dff2d27d946), [`63e3fe1`](https://github.com/mastra-ai/mastra/commit/63e3fe13cc1ea96f91d7c68aea92f400faf9e4da), [`1d4ce8d`](https://github.com/mastra-ai/mastra/commit/1d4ce8daaa54511f325c1b609d31b8e54009d677), [`8c68372`](https://github.com/mastra-ai/mastra/commit/8c68372e85fe0b066ec12c58bd29ffb93e54c552)]:
10
+ - @mastra/core@1.42.0-alpha.4
11
+ - @mastra/server@1.42.0-alpha.4
12
+
13
+ ## 1.3.30-alpha.3
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies [[`34839c1`](https://github.com/mastra-ai/mastra/commit/34839c1910b6964bf59ed0cee58844efebbb684e), [`053735a`](https://github.com/mastra-ai/mastra/commit/053735a75c2c18e23ce34d9468007efa4a45f4c4), [`34839c1`](https://github.com/mastra-ai/mastra/commit/34839c1910b6964bf59ed0cee58844efebbb684e), [`34839c1`](https://github.com/mastra-ai/mastra/commit/34839c1910b6964bf59ed0cee58844efebbb684e), [`a952852`](https://github.com/mastra-ai/mastra/commit/a952852c971a21fb646cd907c75fcf4443cdc963)]:
18
+ - @mastra/server@1.42.0-alpha.3
19
+ - @mastra/core@1.42.0-alpha.3
20
+
3
21
  ## 1.3.30-alpha.2
4
22
 
5
23
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -476,7 +476,8 @@ var MastraServer = class extends serverAdapter.MastraServer {
476
476
  registeredTools: res.locals.registeredTools,
477
477
  taskStore: res.locals.taskStore,
478
478
  abortSignal: res.locals.abortSignal,
479
- routePrefix: prefix
479
+ routePrefix: prefix,
480
+ request: toWebRequest2(req)
480
481
  };
481
482
  const authConfig = this.mastra.getServer()?.auth;
482
483
  if (authConfig) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth-middleware.ts","../src/index.ts"],"names":["requestContext","RequestContext","coreAuthMiddleware","toWebRequest","MastraServerBase","redactStreamChunk","normalizeQueryParams","busboy","Busboy","isZodError","checkRouteFGA","findMatchingCustomRoute","isProtectedCustomRoute"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\nimport type { NextFunction, Request, Response } from 'express';\n\nexport interface ExpressAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nfunction toWebRequest(req: Request): globalThis.Request {\n const protocol = req.protocol || 'http';\n const host = req.get('host') || 'localhost';\n const url = `${protocol}://${host}${req.originalUrl || req.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (!value) continue;\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n\n return new globalThis.Request(url, {\n method: req.method,\n headers,\n });\n}\n\nexport function createAuthMiddleware({\n mastra,\n requiresAuth = true,\n}: ExpressAuthMiddlewareOptions): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n return async (req: Request, res: Response, next: NextFunction) => {\n if (!requiresAuth) {\n next();\n return;\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n next();\n return;\n }\n\n const requestContext = res.locals.requestContext ?? new RequestContext();\n res.locals.requestContext = requestContext;\n res.locals.mastra = res.locals.mastra ?? mastra;\n\n const path = String(req.path || '/');\n const method = String(req.method || 'GET');\n const customRouteAuthConfig = new Map<string, boolean>(res.locals.customRouteAuthConfig ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = req.headers.authorization;\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token && req.query.apiKey) {\n token = (req.query.apiKey as string) || null;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => req.headers[name.toLowerCase()] as string | undefined,\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext,\n rawRequest: toWebRequest(req),\n token,\n buildAuthorizeContext: () => toWebRequest(req),\n });\n\n if (result.action === 'next') {\n next();\n return;\n }\n\n res.status(result.status).json(result.body);\n };\n}\n","import { Busboy } from '@fastify/busboy';\nimport 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 isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n} from '@mastra/server/server-adapter';\nimport type { Application, NextFunction, Request, Response } from 'express';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { ExpressAuthMiddlewareOptions } from './auth-middleware';\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\ntype AuthErrorWithHeaders = { status: number; error: string; headers?: Record<string, string> };\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/express] 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/**\n * Convert Express request to Web API Request for cookie-based auth providers.\n */\nfunction toWebRequest(req: Request): globalThis.Request {\n const protocol = req.protocol || 'http';\n const host = req.get('host') || 'localhost';\n const url = `${protocol}://${host}${req.originalUrl || req.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n }\n\n return new globalThis.Request(url, {\n method: req.method,\n headers,\n });\n}\n\n// Extend Express types to include Mastra context\ndeclare global {\n namespace Express {\n interface Locals {\n mastra: Mastra;\n requestContext: RequestContext;\n abortSignal: AbortSignal;\n registeredTools: ToolsInput;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n }\n }\n}\n\nexport class MastraServer extends MastraServerBase<Application, Request, Response> {\n createContextMiddleware(): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n return async (req: Request, res: Response, next: NextFunction) => {\n // Parse request context from request body and add to context\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT)\n if (req.method === 'POST' || req.method === 'PUT') {\n const contentType = req.headers['content-type'];\n if (contentType?.includes('application/json') && req.body) {\n if (req.body.requestContext) {\n bodyRequestContext = req.body.requestContext;\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (req.method === 'GET') {\n try {\n const encodedRequestContext = req.query.requestContext;\n if (typeof encodedRequestContext === 'string') {\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 => req.get(name),\n });\n\n // Set context in res.locals\n res.locals.requestContext = requestContext;\n res.locals.mastra = this.mastra;\n res.locals.registeredTools = this.tools || {};\n if (this.taskStore) {\n res.locals.taskStore = this.taskStore;\n }\n res.locals.customRouteAuthConfig = this.customRouteAuthConfig;\n const controller = new AbortController();\n // Use res.on('close') instead of req.on('close') because the request's 'close' event\n // fires when the request body is fully consumed (e.g., after express.json() parses it),\n // NOT when the client disconnects. The response's 'close' event fires when the underlying\n // connection is actually closed, which is the correct signal for stream cleanup.\n res.on('close', () => {\n // Only abort if the response wasn't successfully completed\n if (!res.writableFinished) {\n controller.abort();\n }\n });\n res.locals.abortSignal = controller.signal;\n next();\n };\n }\n async stream(route: ServerRoute, res: Response, result: { fullStream: ReadableStream }): Promise<void> {\n const streamFormat = route.streamFormat || 'stream';\n\n if (streamFormat === 'sse') {\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n } else {\n res.setHeader('Content-Type', 'text/plain');\n }\n res.setHeader('Transfer-Encoding', 'chunked');\n res.flushHeaders();\n\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n res.write(': connected\\n\\n');\n }\n\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n res.write(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 if (streamFormat === 'sse') {\n res.write(`data: ${JSON.stringify(outputValue)}\\n\\n`);\n } else {\n res.write(JSON.stringify(outputValue) + '\\x1E');\n }\n }\n }\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 } finally {\n res.end();\n }\n }\n\n async getParams(route: ServerRoute, request: Request): Promise<ParsedRequestParams> {\n const urlParams = request.params as Record<string, string>;\n // Express's req.query can contain string | string[] | ParsedQs | ParsedQs[]\n const queryParams = normalizeQueryParams(request.query as Record<string, unknown>);\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['content-type'] || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const maxFileSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n body = await this.parseMultipartFormData(request, maxFileSize);\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, let others fall through to validation\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 {\n body = request.body;\n }\n }\n\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse multipart/form-data using @fastify/busboy.\n * Converts file uploads to Buffers and parses JSON field values.\n *\n * @param request - The Express request object\n * @param maxFileSize - Optional maximum file size in bytes\n */\n private parseMultipartFormData(request: Request, maxFileSize?: number): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const result: Record<string, unknown> = {};\n\n const busboy = new Busboy({\n headers: {\n 'content-type': request.headers['content-type'] as string,\n },\n limits: maxFileSize ? { fileSize: maxFileSize } : undefined,\n });\n\n busboy.on('file', (fieldname: string, file: NodeJS.ReadableStream) => {\n const chunks: Buffer[] = [];\n let limitExceeded = false;\n\n file.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n file.on('limit', () => {\n limitExceeded = true;\n reject(new Error(`File size limit exceeded${maxFileSize ? ` (max: ${maxFileSize} bytes)` : ''}`));\n });\n\n file.on('end', () => {\n if (!limitExceeded) {\n result[fieldname] = Buffer.concat(chunks);\n }\n });\n });\n\n busboy.on('field', (fieldname: string, value: string) => {\n // Try to parse JSON strings (like 'options')\n try {\n result[fieldname] = JSON.parse(value);\n } catch {\n result[fieldname] = value;\n }\n });\n\n busboy.on('finish', () => {\n resolve(result);\n });\n\n busboy.on('error', (error: Error) => {\n reject(error);\n });\n\n request.pipe(busboy);\n });\n }\n\n async sendResponse(\n route: ServerRoute,\n response: Response,\n result: unknown,\n request?: Request,\n prefix?: string,\n ): Promise<void> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const refreshHeaders = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(refreshHeaders)) {\n response.setHeader(key, value);\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n response.json(result);\n } else if (route.responseType === 'stream') {\n await this.stream(route, response, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n // Handle AI SDK Response objects - pipe Response.body to Express response\n const fetchResponse = result as globalThis.Response;\n fetchResponse.headers.forEach((value, key) => response.setHeader(key, value));\n response.status(fetchResponse.status);\n if (fetchResponse.body) {\n const reader = fetchResponse.body.getReader();\n\n const onResError = (err: unknown) => {\n this.mastra.getLogger()?.error('Error writing datastream response', {\n error: err instanceof Error ? { message: err.message, stack: err.stack } : err,\n });\n void reader.cancel('response write error');\n };\n response.once('error', onResError);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n response.write(value);\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in datastream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n response.off('error', onResError);\n response.end();\n }\n } else {\n response.end();\n }\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport - request is required\n if (!request) {\n response.status(500).json({ error: 'Request object required for MCP transport' });\n return;\n }\n\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n\n try {\n // Merge class-level mcpOptions with route-specific options (route takes precedence)\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n await server.startHTTP({\n url: new URL(request.url, `http://${request.headers.host}`),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req: request,\n res: response,\n options: Object.keys(options).length > 0 ? options : undefined,\n });\n // Response handled by startHTTP\n } catch {\n if (!response.headersSent) {\n response.status(500).json({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n });\n }\n }\n } else if (route.responseType === 'mcp-sse') {\n // MCP SSE transport - request is required\n if (!request) {\n response.status(500).json({ error: 'Request object required for MCP transport' });\n return;\n }\n\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n\n try {\n await server.startSSE({\n url: new URL(request.url, `http://${request.headers.host}`),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n req: request,\n res: response,\n });\n // Response handled by startSSE\n } catch {\n if (!response.headersSent) {\n response.status(500).json({ error: 'Error handling MCP SSE request' });\n }\n }\n } else {\n response.sendStatus(500);\n }\n }\n\n async registerRoute(\n app: Application,\n route: ServerRoute,\n { prefix: prefixParam }: { prefix?: string } = {},\n ): Promise<void> {\n // Default prefix to this.prefix if not provided, or empty string\n const prefix = prefixParam ?? this.prefix ?? '';\n\n // Determine if body limits should be applied\n const shouldApplyBodyLimit = this.bodyLimitOptions && ['POST', 'PUT', 'PATCH'].includes(route.method.toUpperCase());\n\n // Get the body size limit for this route (route-specific or default)\n const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n\n // Create middleware array\n const middlewares: Array<(req: Request, res: Response, next: NextFunction) => void> = [];\n\n // Add body limit middleware if needed\n if (shouldApplyBodyLimit && maxSize && this.bodyLimitOptions) {\n const bodyLimitMiddleware = (req: Request, res: Response, next: NextFunction) => {\n const contentLength = req.headers['content-length'];\n if (contentLength && parseInt(contentLength, 10) > maxSize) {\n try {\n const errorResponse = this.bodyLimitOptions!.onError({ error: 'Request body too large' });\n return res.status(413).json(errorResponse);\n } catch {\n return res.status(413).json({ error: 'Request body too large' });\n }\n }\n next();\n };\n middlewares.push(bodyLimitMiddleware);\n }\n\n app[route.method.toLowerCase() as keyof Application](\n `${prefix}${route.path}`,\n ...middlewares,\n async (req: Request, res: Response) => {\n // Check route-level authentication/authorization\n const authError = await this.checkRouteAuth(route, {\n path: String(req.path || '/'),\n method: String(req.method || 'GET'),\n getHeader: name => req.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => req.query[name] as string | undefined,\n requestContext: res.locals.requestContext,\n request: toWebRequest(req),\n buildAuthorizeContext: () => toWebRequest(req),\n });\n\n if (authError) {\n const authResult = authError as AuthErrorWithHeaders;\n // Apply any refresh headers (e.g. Set-Cookie from transparent session refresh)\n if (authResult.headers) {\n for (const [key, value] of Object.entries(authResult.headers)) {\n res.setHeader(key, value);\n }\n }\n\n // If this is an auth error (not just a success-with-headers), return error response\n if (authResult.error) {\n return res.status(authResult.status).json({ error: authResult.error });\n }\n }\n\n const params = await this.getParams(route, req);\n\n // Return 400 Bad Request if body parsing failed (e.g., malformed multipart data)\n if (params.bodyParseError) {\n return res.status(400).json({\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\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 res.status(status).json(body);\n }\n return res.status(400).json({\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n });\n }\n }\n\n if (params.body) {\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 res.status(status).json(body);\n }\n return res.status(400).json({\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\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 res.status(status).json(body);\n }\n return res.status(400).json({\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n });\n }\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: res.locals.requestContext,\n mastra: this.mastra,\n registeredTools: res.locals.registeredTools,\n taskStore: res.locals.taskStore,\n abortSignal: res.locals.abortSignal,\n routePrefix: prefix,\n };\n\n // Check route permission requirement (EE feature)\n // Uses convention-based permission derivation: permissions are auto-derived\n // from route path/method unless explicitly set or route is public\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = res.locals.requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission);\n\n if (permissionError) {\n return res.status(permissionError.status).json({\n error: permissionError.error,\n message: permissionError.message,\n });\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, route, res.locals.requestContext, {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n return res.status(fgaError.status).json({ error: fgaError.error, message: fgaError.message });\n }\n\n try {\n const result = await route.handler(handlerParams);\n await this.sendResponse(route, res, result, req, 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 // Check if it's an HTTPException or MastraError with a status code\n let status = 500;\n if (error && typeof error === 'object') {\n // Check for direct status property (HTTPException)\n if ('status' in error) {\n status = (error as any).status;\n }\n // Check for MastraError with status in details\n else if (\n 'details' in error &&\n error.details &&\n typeof error.details === 'object' &&\n 'status' in error.details\n ) {\n status = (error.details as any).status;\n }\n }\n res.status(status).json({ error: error instanceof Error ? error.message : 'Unknown error' });\n }\n },\n );\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n if (!(await this.buildCustomRouteHandler())) return;\n\n this.app.use(async (req: Request, res: Response, next: NextFunction) => {\n // Check if this request matches a protected custom route and run auth\n const path = String(req.path || '/');\n const method = String(req.method || 'GET');\n const matchedRoute = findMatchingCustomRoute(\n path,\n method,\n this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes,\n );\n const shouldRunCustomRouteAuth = isProtectedCustomRoute(path, method, this.customRouteAuthConfig);\n const shouldRunCustomRouteFGA = !!matchedRoute?.route.fga;\n\n if (shouldRunCustomRouteAuth || shouldRunCustomRouteFGA) {\n const serverRoute: ServerRoute = {\n method: (matchedRoute?.route.method ?? method) 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,\n getHeader: name => req.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => req.query[name] as string | undefined,\n requestContext: res.locals.requestContext,\n request: toWebRequest(req),\n buildAuthorizeContext: () => toWebRequest(req),\n });\n\n if (authError) {\n const authResult = authError as AuthErrorWithHeaders;\n if (authResult.headers) {\n for (const [key, value] of Object.entries(authResult.headers)) {\n res.setHeader(key, value);\n }\n }\n if (authResult.error) {\n return res.status(authResult.status).json({ error: authResult.error });\n }\n }\n\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = res.locals.requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(serverRoute, userPermissions, hasPermission);\n if (permissionError) {\n return res.status(permissionError.status).json({\n error: permissionError.error,\n message: permissionError.message,\n });\n }\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, serverRoute, res.locals.requestContext, {\n ...(matchedRoute?.params ?? {}),\n ...(req.query as Record<string, string>),\n ...(typeof req.body === 'object' && req.body !== null ? req.body : {}),\n });\n if (fgaError) {\n return res.status(fgaError.status).json({ error: fgaError.error, message: fgaError.message });\n }\n }\n\n const response = await this.handleCustomRouteRequest(\n `${req.protocol}://${req.get('host') || 'localhost'}${req.originalUrl}`,\n req.method,\n req.headers as Record<string, string | string[] | undefined>,\n req.body,\n res.locals.requestContext,\n res.locals.abortSignal,\n );\n if (!response) return next();\n await this.writeCustomRouteResponse(response, res, res.locals.abortSignal);\n });\n }\n\n registerContextMiddleware(): void {\n this.app.use(this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n this.app.use((req, res, next) => {\n if (!this.shouldLogRequest(req.path)) {\n return next();\n }\n\n const start = Date.now();\n const method = req.method;\n const path = req.path;\n\n res.on('finish', () => {\n const duration = Date.now() - start;\n const status = res.statusCode;\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 = req.query;\n }\n\n if (this.httpLoggingConfig?.includeHeaders) {\n const headers = { ...req.headers };\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 next();\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/auth-middleware.ts","../src/index.ts"],"names":["requestContext","RequestContext","coreAuthMiddleware","toWebRequest","MastraServerBase","redactStreamChunk","normalizeQueryParams","busboy","Busboy","isZodError","checkRouteFGA","findMatchingCustomRoute","isProtectedCustomRoute"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\nimport type { NextFunction, Request, Response } from 'express';\n\nexport interface ExpressAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nfunction toWebRequest(req: Request): globalThis.Request {\n const protocol = req.protocol || 'http';\n const host = req.get('host') || 'localhost';\n const url = `${protocol}://${host}${req.originalUrl || req.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (!value) continue;\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n\n return new globalThis.Request(url, {\n method: req.method,\n headers,\n });\n}\n\nexport function createAuthMiddleware({\n mastra,\n requiresAuth = true,\n}: ExpressAuthMiddlewareOptions): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n return async (req: Request, res: Response, next: NextFunction) => {\n if (!requiresAuth) {\n next();\n return;\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n next();\n return;\n }\n\n const requestContext = res.locals.requestContext ?? new RequestContext();\n res.locals.requestContext = requestContext;\n res.locals.mastra = res.locals.mastra ?? mastra;\n\n const path = String(req.path || '/');\n const method = String(req.method || 'GET');\n const customRouteAuthConfig = new Map<string, boolean>(res.locals.customRouteAuthConfig ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = req.headers.authorization;\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token && req.query.apiKey) {\n token = (req.query.apiKey as string) || null;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => req.headers[name.toLowerCase()] as string | undefined,\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext,\n rawRequest: toWebRequest(req),\n token,\n buildAuthorizeContext: () => toWebRequest(req),\n });\n\n if (result.action === 'next') {\n next();\n return;\n }\n\n res.status(result.status).json(result.body);\n };\n}\n","import { Busboy } from '@fastify/busboy';\nimport 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 isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n} from '@mastra/server/server-adapter';\nimport type { Application, NextFunction, Request, Response } from 'express';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { ExpressAuthMiddlewareOptions } from './auth-middleware';\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\ntype AuthErrorWithHeaders = { status: number; error: string; headers?: Record<string, string> };\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/express] 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/**\n * Convert Express request to Web API Request for cookie-based auth providers.\n */\nfunction toWebRequest(req: Request): globalThis.Request {\n const protocol = req.protocol || 'http';\n const host = req.get('host') || 'localhost';\n const url = `${protocol}://${host}${req.originalUrl || req.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n }\n\n return new globalThis.Request(url, {\n method: req.method,\n headers,\n });\n}\n\n// Extend Express types to include Mastra context\ndeclare global {\n namespace Express {\n interface Locals {\n mastra: Mastra;\n requestContext: RequestContext;\n abortSignal: AbortSignal;\n registeredTools: ToolsInput;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n }\n }\n}\n\nexport class MastraServer extends MastraServerBase<Application, Request, Response> {\n createContextMiddleware(): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n return async (req: Request, res: Response, next: NextFunction) => {\n // Parse request context from request body and add to context\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT)\n if (req.method === 'POST' || req.method === 'PUT') {\n const contentType = req.headers['content-type'];\n if (contentType?.includes('application/json') && req.body) {\n if (req.body.requestContext) {\n bodyRequestContext = req.body.requestContext;\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (req.method === 'GET') {\n try {\n const encodedRequestContext = req.query.requestContext;\n if (typeof encodedRequestContext === 'string') {\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 => req.get(name),\n });\n\n // Set context in res.locals\n res.locals.requestContext = requestContext;\n res.locals.mastra = this.mastra;\n res.locals.registeredTools = this.tools || {};\n if (this.taskStore) {\n res.locals.taskStore = this.taskStore;\n }\n res.locals.customRouteAuthConfig = this.customRouteAuthConfig;\n const controller = new AbortController();\n // Use res.on('close') instead of req.on('close') because the request's 'close' event\n // fires when the request body is fully consumed (e.g., after express.json() parses it),\n // NOT when the client disconnects. The response's 'close' event fires when the underlying\n // connection is actually closed, which is the correct signal for stream cleanup.\n res.on('close', () => {\n // Only abort if the response wasn't successfully completed\n if (!res.writableFinished) {\n controller.abort();\n }\n });\n res.locals.abortSignal = controller.signal;\n next();\n };\n }\n async stream(route: ServerRoute, res: Response, result: { fullStream: ReadableStream }): Promise<void> {\n const streamFormat = route.streamFormat || 'stream';\n\n if (streamFormat === 'sse') {\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n } else {\n res.setHeader('Content-Type', 'text/plain');\n }\n res.setHeader('Transfer-Encoding', 'chunked');\n res.flushHeaders();\n\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n res.write(': connected\\n\\n');\n }\n\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n res.write(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 if (streamFormat === 'sse') {\n res.write(`data: ${JSON.stringify(outputValue)}\\n\\n`);\n } else {\n res.write(JSON.stringify(outputValue) + '\\x1E');\n }\n }\n }\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 } finally {\n res.end();\n }\n }\n\n async getParams(route: ServerRoute, request: Request): Promise<ParsedRequestParams> {\n const urlParams = request.params as Record<string, string>;\n // Express's req.query can contain string | string[] | ParsedQs | ParsedQs[]\n const queryParams = normalizeQueryParams(request.query as Record<string, unknown>);\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['content-type'] || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const maxFileSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n body = await this.parseMultipartFormData(request, maxFileSize);\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, let others fall through to validation\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 {\n body = request.body;\n }\n }\n\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse multipart/form-data using @fastify/busboy.\n * Converts file uploads to Buffers and parses JSON field values.\n *\n * @param request - The Express request object\n * @param maxFileSize - Optional maximum file size in bytes\n */\n private parseMultipartFormData(request: Request, maxFileSize?: number): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const result: Record<string, unknown> = {};\n\n const busboy = new Busboy({\n headers: {\n 'content-type': request.headers['content-type'] as string,\n },\n limits: maxFileSize ? { fileSize: maxFileSize } : undefined,\n });\n\n busboy.on('file', (fieldname: string, file: NodeJS.ReadableStream) => {\n const chunks: Buffer[] = [];\n let limitExceeded = false;\n\n file.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n file.on('limit', () => {\n limitExceeded = true;\n reject(new Error(`File size limit exceeded${maxFileSize ? ` (max: ${maxFileSize} bytes)` : ''}`));\n });\n\n file.on('end', () => {\n if (!limitExceeded) {\n result[fieldname] = Buffer.concat(chunks);\n }\n });\n });\n\n busboy.on('field', (fieldname: string, value: string) => {\n // Try to parse JSON strings (like 'options')\n try {\n result[fieldname] = JSON.parse(value);\n } catch {\n result[fieldname] = value;\n }\n });\n\n busboy.on('finish', () => {\n resolve(result);\n });\n\n busboy.on('error', (error: Error) => {\n reject(error);\n });\n\n request.pipe(busboy);\n });\n }\n\n async sendResponse(\n route: ServerRoute,\n response: Response,\n result: unknown,\n request?: Request,\n prefix?: string,\n ): Promise<void> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const refreshHeaders = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(refreshHeaders)) {\n response.setHeader(key, value);\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n response.json(result);\n } else if (route.responseType === 'stream') {\n await this.stream(route, response, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n // Handle AI SDK Response objects - pipe Response.body to Express response\n const fetchResponse = result as globalThis.Response;\n fetchResponse.headers.forEach((value, key) => response.setHeader(key, value));\n response.status(fetchResponse.status);\n if (fetchResponse.body) {\n const reader = fetchResponse.body.getReader();\n\n const onResError = (err: unknown) => {\n this.mastra.getLogger()?.error('Error writing datastream response', {\n error: err instanceof Error ? { message: err.message, stack: err.stack } : err,\n });\n void reader.cancel('response write error');\n };\n response.once('error', onResError);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n response.write(value);\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in datastream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n response.off('error', onResError);\n response.end();\n }\n } else {\n response.end();\n }\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport - request is required\n if (!request) {\n response.status(500).json({ error: 'Request object required for MCP transport' });\n return;\n }\n\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n\n try {\n // Merge class-level mcpOptions with route-specific options (route takes precedence)\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n await server.startHTTP({\n url: new URL(request.url, `http://${request.headers.host}`),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req: request,\n res: response,\n options: Object.keys(options).length > 0 ? options : undefined,\n });\n // Response handled by startHTTP\n } catch {\n if (!response.headersSent) {\n response.status(500).json({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n });\n }\n }\n } else if (route.responseType === 'mcp-sse') {\n // MCP SSE transport - request is required\n if (!request) {\n response.status(500).json({ error: 'Request object required for MCP transport' });\n return;\n }\n\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n\n try {\n await server.startSSE({\n url: new URL(request.url, `http://${request.headers.host}`),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n req: request,\n res: response,\n });\n // Response handled by startSSE\n } catch {\n if (!response.headersSent) {\n response.status(500).json({ error: 'Error handling MCP SSE request' });\n }\n }\n } else {\n response.sendStatus(500);\n }\n }\n\n async registerRoute(\n app: Application,\n route: ServerRoute,\n { prefix: prefixParam }: { prefix?: string } = {},\n ): Promise<void> {\n // Default prefix to this.prefix if not provided, or empty string\n const prefix = prefixParam ?? this.prefix ?? '';\n\n // Determine if body limits should be applied\n const shouldApplyBodyLimit = this.bodyLimitOptions && ['POST', 'PUT', 'PATCH'].includes(route.method.toUpperCase());\n\n // Get the body size limit for this route (route-specific or default)\n const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n\n // Create middleware array\n const middlewares: Array<(req: Request, res: Response, next: NextFunction) => void> = [];\n\n // Add body limit middleware if needed\n if (shouldApplyBodyLimit && maxSize && this.bodyLimitOptions) {\n const bodyLimitMiddleware = (req: Request, res: Response, next: NextFunction) => {\n const contentLength = req.headers['content-length'];\n if (contentLength && parseInt(contentLength, 10) > maxSize) {\n try {\n const errorResponse = this.bodyLimitOptions!.onError({ error: 'Request body too large' });\n return res.status(413).json(errorResponse);\n } catch {\n return res.status(413).json({ error: 'Request body too large' });\n }\n }\n next();\n };\n middlewares.push(bodyLimitMiddleware);\n }\n\n app[route.method.toLowerCase() as keyof Application](\n `${prefix}${route.path}`,\n ...middlewares,\n async (req: Request, res: Response) => {\n // Check route-level authentication/authorization\n const authError = await this.checkRouteAuth(route, {\n path: String(req.path || '/'),\n method: String(req.method || 'GET'),\n getHeader: name => req.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => req.query[name] as string | undefined,\n requestContext: res.locals.requestContext,\n request: toWebRequest(req),\n buildAuthorizeContext: () => toWebRequest(req),\n });\n\n if (authError) {\n const authResult = authError as AuthErrorWithHeaders;\n // Apply any refresh headers (e.g. Set-Cookie from transparent session refresh)\n if (authResult.headers) {\n for (const [key, value] of Object.entries(authResult.headers)) {\n res.setHeader(key, value);\n }\n }\n\n // If this is an auth error (not just a success-with-headers), return error response\n if (authResult.error) {\n return res.status(authResult.status).json({ error: authResult.error });\n }\n }\n\n const params = await this.getParams(route, req);\n\n // Return 400 Bad Request if body parsing failed (e.g., malformed multipart data)\n if (params.bodyParseError) {\n return res.status(400).json({\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\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 res.status(status).json(body);\n }\n return res.status(400).json({\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n });\n }\n }\n\n if (params.body) {\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 res.status(status).json(body);\n }\n return res.status(400).json({\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\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 res.status(status).json(body);\n }\n return res.status(400).json({\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n });\n }\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: res.locals.requestContext,\n mastra: this.mastra,\n registeredTools: res.locals.registeredTools,\n taskStore: res.locals.taskStore,\n abortSignal: res.locals.abortSignal,\n routePrefix: prefix,\n request: toWebRequest(req),\n };\n\n // Check route permission requirement (EE feature)\n // Uses convention-based permission derivation: permissions are auto-derived\n // from route path/method unless explicitly set or route is public\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = res.locals.requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission);\n\n if (permissionError) {\n return res.status(permissionError.status).json({\n error: permissionError.error,\n message: permissionError.message,\n });\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, route, res.locals.requestContext, {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n return res.status(fgaError.status).json({ error: fgaError.error, message: fgaError.message });\n }\n\n try {\n const result = await route.handler(handlerParams);\n await this.sendResponse(route, res, result, req, 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 // Check if it's an HTTPException or MastraError with a status code\n let status = 500;\n if (error && typeof error === 'object') {\n // Check for direct status property (HTTPException)\n if ('status' in error) {\n status = (error as any).status;\n }\n // Check for MastraError with status in details\n else if (\n 'details' in error &&\n error.details &&\n typeof error.details === 'object' &&\n 'status' in error.details\n ) {\n status = (error.details as any).status;\n }\n }\n res.status(status).json({ error: error instanceof Error ? error.message : 'Unknown error' });\n }\n },\n );\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n if (!(await this.buildCustomRouteHandler())) return;\n\n this.app.use(async (req: Request, res: Response, next: NextFunction) => {\n // Check if this request matches a protected custom route and run auth\n const path = String(req.path || '/');\n const method = String(req.method || 'GET');\n const matchedRoute = findMatchingCustomRoute(\n path,\n method,\n this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes,\n );\n const shouldRunCustomRouteAuth = isProtectedCustomRoute(path, method, this.customRouteAuthConfig);\n const shouldRunCustomRouteFGA = !!matchedRoute?.route.fga;\n\n if (shouldRunCustomRouteAuth || shouldRunCustomRouteFGA) {\n const serverRoute: ServerRoute = {\n method: (matchedRoute?.route.method ?? method) 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,\n getHeader: name => req.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => req.query[name] as string | undefined,\n requestContext: res.locals.requestContext,\n request: toWebRequest(req),\n buildAuthorizeContext: () => toWebRequest(req),\n });\n\n if (authError) {\n const authResult = authError as AuthErrorWithHeaders;\n if (authResult.headers) {\n for (const [key, value] of Object.entries(authResult.headers)) {\n res.setHeader(key, value);\n }\n }\n if (authResult.error) {\n return res.status(authResult.status).json({ error: authResult.error });\n }\n }\n\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = res.locals.requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(serverRoute, userPermissions, hasPermission);\n if (permissionError) {\n return res.status(permissionError.status).json({\n error: permissionError.error,\n message: permissionError.message,\n });\n }\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, serverRoute, res.locals.requestContext, {\n ...(matchedRoute?.params ?? {}),\n ...(req.query as Record<string, string>),\n ...(typeof req.body === 'object' && req.body !== null ? req.body : {}),\n });\n if (fgaError) {\n return res.status(fgaError.status).json({ error: fgaError.error, message: fgaError.message });\n }\n }\n\n const response = await this.handleCustomRouteRequest(\n `${req.protocol}://${req.get('host') || 'localhost'}${req.originalUrl}`,\n req.method,\n req.headers as Record<string, string | string[] | undefined>,\n req.body,\n res.locals.requestContext,\n res.locals.abortSignal,\n );\n if (!response) return next();\n await this.writeCustomRouteResponse(response, res, res.locals.abortSignal);\n });\n }\n\n registerContextMiddleware(): void {\n this.app.use(this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n this.app.use((req, res, next) => {\n if (!this.shouldLogRequest(req.path)) {\n return next();\n }\n\n const start = Date.now();\n const method = req.method;\n const path = req.path;\n\n res.on('finish', () => {\n const duration = Date.now() - start;\n const status = res.statusCode;\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 = req.query;\n }\n\n if (this.httpLoggingConfig?.includeHeaders) {\n const headers = { ...req.headers };\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 next();\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACtF,OAAO,EACL,YAAY,IAAI,gBAAgB,EAKjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AA6CtE,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,MAAM;YACd,MAAM,EAAE,MAAM,CAAC;YACf,cAAc,EAAE,cAAc,CAAC;YAC/B,WAAW,EAAE,WAAW,CAAC;YACzB,eAAe,EAAE,UAAU,CAAC;YAC5B,SAAS,EAAE,iBAAiB,CAAC;YAC7B,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAC9C;KACF;CACF;AAED,qBAAa,YAAa,SAAQ,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;IAChF,uBAAuB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC;IAoEvF,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;QAAE,UAAU,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmDhG,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkCnF;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAoDxB,YAAY,CAChB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IA2GV,aAAa,CACjB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,WAAW,EAClB,EAAE,MAAM,EAAE,WAAW,EAAE,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAChD,OAAO,CAAC,IAAI,CAAC;IAsMV,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAyF9C,yBAAyB,IAAI,IAAI;IAIjC,sBAAsB,IAAI,IAAI;IAK9B,6BAA6B,IAAI,IAAI;CAgDtC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACtF,OAAO,EACL,YAAY,IAAI,gBAAgB,EAKjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AA6CtE,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,MAAM;YACd,MAAM,EAAE,MAAM,CAAC;YACf,cAAc,EAAE,cAAc,CAAC;YAC/B,WAAW,EAAE,WAAW,CAAC;YACzB,eAAe,EAAE,UAAU,CAAC;YAC5B,SAAS,EAAE,iBAAiB,CAAC;YAC7B,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAC9C;KACF;CACF;AAED,qBAAa,YAAa,SAAQ,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;IAChF,uBAAuB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC;IAoEvF,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;QAAE,UAAU,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmDhG,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkCnF;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAoDxB,YAAY,CAChB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IA2GV,aAAa,CACjB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,WAAW,EAClB,EAAE,MAAM,EAAE,WAAW,EAAE,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAChD,OAAO,CAAC,IAAI,CAAC;IAuMV,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAyF9C,yBAAyB,IAAI,IAAI;IAIjC,sBAAsB,IAAI,IAAI;IAK9B,6BAA6B,IAAI,IAAI;CAgDtC"}
package/dist/index.js CHANGED
@@ -474,7 +474,8 @@ var MastraServer = class extends MastraServer$1 {
474
474
  registeredTools: res.locals.registeredTools,
475
475
  taskStore: res.locals.taskStore,
476
476
  abortSignal: res.locals.abortSignal,
477
- routePrefix: prefix
477
+ routePrefix: prefix,
478
+ request: toWebRequest2(req)
478
479
  };
479
480
  const authConfig = this.mastra.getServer()?.auth;
480
481
  if (authConfig) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth-middleware.ts","../src/index.ts"],"names":["toWebRequest","MastraServerBase"],"mappings":"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","file":"index.js","sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\nimport type { NextFunction, Request, Response } from 'express';\n\nexport interface ExpressAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nfunction toWebRequest(req: Request): globalThis.Request {\n const protocol = req.protocol || 'http';\n const host = req.get('host') || 'localhost';\n const url = `${protocol}://${host}${req.originalUrl || req.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (!value) continue;\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n\n return new globalThis.Request(url, {\n method: req.method,\n headers,\n });\n}\n\nexport function createAuthMiddleware({\n mastra,\n requiresAuth = true,\n}: ExpressAuthMiddlewareOptions): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n return async (req: Request, res: Response, next: NextFunction) => {\n if (!requiresAuth) {\n next();\n return;\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n next();\n return;\n }\n\n const requestContext = res.locals.requestContext ?? new RequestContext();\n res.locals.requestContext = requestContext;\n res.locals.mastra = res.locals.mastra ?? mastra;\n\n const path = String(req.path || '/');\n const method = String(req.method || 'GET');\n const customRouteAuthConfig = new Map<string, boolean>(res.locals.customRouteAuthConfig ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = req.headers.authorization;\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token && req.query.apiKey) {\n token = (req.query.apiKey as string) || null;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => req.headers[name.toLowerCase()] as string | undefined,\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext,\n rawRequest: toWebRequest(req),\n token,\n buildAuthorizeContext: () => toWebRequest(req),\n });\n\n if (result.action === 'next') {\n next();\n return;\n }\n\n res.status(result.status).json(result.body);\n };\n}\n","import { Busboy } from '@fastify/busboy';\nimport 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 isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n} from '@mastra/server/server-adapter';\nimport type { Application, NextFunction, Request, Response } from 'express';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { ExpressAuthMiddlewareOptions } from './auth-middleware';\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\ntype AuthErrorWithHeaders = { status: number; error: string; headers?: Record<string, string> };\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/express] 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/**\n * Convert Express request to Web API Request for cookie-based auth providers.\n */\nfunction toWebRequest(req: Request): globalThis.Request {\n const protocol = req.protocol || 'http';\n const host = req.get('host') || 'localhost';\n const url = `${protocol}://${host}${req.originalUrl || req.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n }\n\n return new globalThis.Request(url, {\n method: req.method,\n headers,\n });\n}\n\n// Extend Express types to include Mastra context\ndeclare global {\n namespace Express {\n interface Locals {\n mastra: Mastra;\n requestContext: RequestContext;\n abortSignal: AbortSignal;\n registeredTools: ToolsInput;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n }\n }\n}\n\nexport class MastraServer extends MastraServerBase<Application, Request, Response> {\n createContextMiddleware(): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n return async (req: Request, res: Response, next: NextFunction) => {\n // Parse request context from request body and add to context\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT)\n if (req.method === 'POST' || req.method === 'PUT') {\n const contentType = req.headers['content-type'];\n if (contentType?.includes('application/json') && req.body) {\n if (req.body.requestContext) {\n bodyRequestContext = req.body.requestContext;\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (req.method === 'GET') {\n try {\n const encodedRequestContext = req.query.requestContext;\n if (typeof encodedRequestContext === 'string') {\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 => req.get(name),\n });\n\n // Set context in res.locals\n res.locals.requestContext = requestContext;\n res.locals.mastra = this.mastra;\n res.locals.registeredTools = this.tools || {};\n if (this.taskStore) {\n res.locals.taskStore = this.taskStore;\n }\n res.locals.customRouteAuthConfig = this.customRouteAuthConfig;\n const controller = new AbortController();\n // Use res.on('close') instead of req.on('close') because the request's 'close' event\n // fires when the request body is fully consumed (e.g., after express.json() parses it),\n // NOT when the client disconnects. The response's 'close' event fires when the underlying\n // connection is actually closed, which is the correct signal for stream cleanup.\n res.on('close', () => {\n // Only abort if the response wasn't successfully completed\n if (!res.writableFinished) {\n controller.abort();\n }\n });\n res.locals.abortSignal = controller.signal;\n next();\n };\n }\n async stream(route: ServerRoute, res: Response, result: { fullStream: ReadableStream }): Promise<void> {\n const streamFormat = route.streamFormat || 'stream';\n\n if (streamFormat === 'sse') {\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n } else {\n res.setHeader('Content-Type', 'text/plain');\n }\n res.setHeader('Transfer-Encoding', 'chunked');\n res.flushHeaders();\n\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n res.write(': connected\\n\\n');\n }\n\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n res.write(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 if (streamFormat === 'sse') {\n res.write(`data: ${JSON.stringify(outputValue)}\\n\\n`);\n } else {\n res.write(JSON.stringify(outputValue) + '\\x1E');\n }\n }\n }\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 } finally {\n res.end();\n }\n }\n\n async getParams(route: ServerRoute, request: Request): Promise<ParsedRequestParams> {\n const urlParams = request.params as Record<string, string>;\n // Express's req.query can contain string | string[] | ParsedQs | ParsedQs[]\n const queryParams = normalizeQueryParams(request.query as Record<string, unknown>);\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['content-type'] || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const maxFileSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n body = await this.parseMultipartFormData(request, maxFileSize);\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, let others fall through to validation\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 {\n body = request.body;\n }\n }\n\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse multipart/form-data using @fastify/busboy.\n * Converts file uploads to Buffers and parses JSON field values.\n *\n * @param request - The Express request object\n * @param maxFileSize - Optional maximum file size in bytes\n */\n private parseMultipartFormData(request: Request, maxFileSize?: number): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const result: Record<string, unknown> = {};\n\n const busboy = new Busboy({\n headers: {\n 'content-type': request.headers['content-type'] as string,\n },\n limits: maxFileSize ? { fileSize: maxFileSize } : undefined,\n });\n\n busboy.on('file', (fieldname: string, file: NodeJS.ReadableStream) => {\n const chunks: Buffer[] = [];\n let limitExceeded = false;\n\n file.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n file.on('limit', () => {\n limitExceeded = true;\n reject(new Error(`File size limit exceeded${maxFileSize ? ` (max: ${maxFileSize} bytes)` : ''}`));\n });\n\n file.on('end', () => {\n if (!limitExceeded) {\n result[fieldname] = Buffer.concat(chunks);\n }\n });\n });\n\n busboy.on('field', (fieldname: string, value: string) => {\n // Try to parse JSON strings (like 'options')\n try {\n result[fieldname] = JSON.parse(value);\n } catch {\n result[fieldname] = value;\n }\n });\n\n busboy.on('finish', () => {\n resolve(result);\n });\n\n busboy.on('error', (error: Error) => {\n reject(error);\n });\n\n request.pipe(busboy);\n });\n }\n\n async sendResponse(\n route: ServerRoute,\n response: Response,\n result: unknown,\n request?: Request,\n prefix?: string,\n ): Promise<void> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const refreshHeaders = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(refreshHeaders)) {\n response.setHeader(key, value);\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n response.json(result);\n } else if (route.responseType === 'stream') {\n await this.stream(route, response, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n // Handle AI SDK Response objects - pipe Response.body to Express response\n const fetchResponse = result as globalThis.Response;\n fetchResponse.headers.forEach((value, key) => response.setHeader(key, value));\n response.status(fetchResponse.status);\n if (fetchResponse.body) {\n const reader = fetchResponse.body.getReader();\n\n const onResError = (err: unknown) => {\n this.mastra.getLogger()?.error('Error writing datastream response', {\n error: err instanceof Error ? { message: err.message, stack: err.stack } : err,\n });\n void reader.cancel('response write error');\n };\n response.once('error', onResError);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n response.write(value);\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in datastream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n response.off('error', onResError);\n response.end();\n }\n } else {\n response.end();\n }\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport - request is required\n if (!request) {\n response.status(500).json({ error: 'Request object required for MCP transport' });\n return;\n }\n\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n\n try {\n // Merge class-level mcpOptions with route-specific options (route takes precedence)\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n await server.startHTTP({\n url: new URL(request.url, `http://${request.headers.host}`),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req: request,\n res: response,\n options: Object.keys(options).length > 0 ? options : undefined,\n });\n // Response handled by startHTTP\n } catch {\n if (!response.headersSent) {\n response.status(500).json({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n });\n }\n }\n } else if (route.responseType === 'mcp-sse') {\n // MCP SSE transport - request is required\n if (!request) {\n response.status(500).json({ error: 'Request object required for MCP transport' });\n return;\n }\n\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n\n try {\n await server.startSSE({\n url: new URL(request.url, `http://${request.headers.host}`),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n req: request,\n res: response,\n });\n // Response handled by startSSE\n } catch {\n if (!response.headersSent) {\n response.status(500).json({ error: 'Error handling MCP SSE request' });\n }\n }\n } else {\n response.sendStatus(500);\n }\n }\n\n async registerRoute(\n app: Application,\n route: ServerRoute,\n { prefix: prefixParam }: { prefix?: string } = {},\n ): Promise<void> {\n // Default prefix to this.prefix if not provided, or empty string\n const prefix = prefixParam ?? this.prefix ?? '';\n\n // Determine if body limits should be applied\n const shouldApplyBodyLimit = this.bodyLimitOptions && ['POST', 'PUT', 'PATCH'].includes(route.method.toUpperCase());\n\n // Get the body size limit for this route (route-specific or default)\n const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n\n // Create middleware array\n const middlewares: Array<(req: Request, res: Response, next: NextFunction) => void> = [];\n\n // Add body limit middleware if needed\n if (shouldApplyBodyLimit && maxSize && this.bodyLimitOptions) {\n const bodyLimitMiddleware = (req: Request, res: Response, next: NextFunction) => {\n const contentLength = req.headers['content-length'];\n if (contentLength && parseInt(contentLength, 10) > maxSize) {\n try {\n const errorResponse = this.bodyLimitOptions!.onError({ error: 'Request body too large' });\n return res.status(413).json(errorResponse);\n } catch {\n return res.status(413).json({ error: 'Request body too large' });\n }\n }\n next();\n };\n middlewares.push(bodyLimitMiddleware);\n }\n\n app[route.method.toLowerCase() as keyof Application](\n `${prefix}${route.path}`,\n ...middlewares,\n async (req: Request, res: Response) => {\n // Check route-level authentication/authorization\n const authError = await this.checkRouteAuth(route, {\n path: String(req.path || '/'),\n method: String(req.method || 'GET'),\n getHeader: name => req.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => req.query[name] as string | undefined,\n requestContext: res.locals.requestContext,\n request: toWebRequest(req),\n buildAuthorizeContext: () => toWebRequest(req),\n });\n\n if (authError) {\n const authResult = authError as AuthErrorWithHeaders;\n // Apply any refresh headers (e.g. Set-Cookie from transparent session refresh)\n if (authResult.headers) {\n for (const [key, value] of Object.entries(authResult.headers)) {\n res.setHeader(key, value);\n }\n }\n\n // If this is an auth error (not just a success-with-headers), return error response\n if (authResult.error) {\n return res.status(authResult.status).json({ error: authResult.error });\n }\n }\n\n const params = await this.getParams(route, req);\n\n // Return 400 Bad Request if body parsing failed (e.g., malformed multipart data)\n if (params.bodyParseError) {\n return res.status(400).json({\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\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 res.status(status).json(body);\n }\n return res.status(400).json({\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n });\n }\n }\n\n if (params.body) {\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 res.status(status).json(body);\n }\n return res.status(400).json({\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\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 res.status(status).json(body);\n }\n return res.status(400).json({\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n });\n }\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: res.locals.requestContext,\n mastra: this.mastra,\n registeredTools: res.locals.registeredTools,\n taskStore: res.locals.taskStore,\n abortSignal: res.locals.abortSignal,\n routePrefix: prefix,\n };\n\n // Check route permission requirement (EE feature)\n // Uses convention-based permission derivation: permissions are auto-derived\n // from route path/method unless explicitly set or route is public\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = res.locals.requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission);\n\n if (permissionError) {\n return res.status(permissionError.status).json({\n error: permissionError.error,\n message: permissionError.message,\n });\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, route, res.locals.requestContext, {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n return res.status(fgaError.status).json({ error: fgaError.error, message: fgaError.message });\n }\n\n try {\n const result = await route.handler(handlerParams);\n await this.sendResponse(route, res, result, req, 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 // Check if it's an HTTPException or MastraError with a status code\n let status = 500;\n if (error && typeof error === 'object') {\n // Check for direct status property (HTTPException)\n if ('status' in error) {\n status = (error as any).status;\n }\n // Check for MastraError with status in details\n else if (\n 'details' in error &&\n error.details &&\n typeof error.details === 'object' &&\n 'status' in error.details\n ) {\n status = (error.details as any).status;\n }\n }\n res.status(status).json({ error: error instanceof Error ? error.message : 'Unknown error' });\n }\n },\n );\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n if (!(await this.buildCustomRouteHandler())) return;\n\n this.app.use(async (req: Request, res: Response, next: NextFunction) => {\n // Check if this request matches a protected custom route and run auth\n const path = String(req.path || '/');\n const method = String(req.method || 'GET');\n const matchedRoute = findMatchingCustomRoute(\n path,\n method,\n this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes,\n );\n const shouldRunCustomRouteAuth = isProtectedCustomRoute(path, method, this.customRouteAuthConfig);\n const shouldRunCustomRouteFGA = !!matchedRoute?.route.fga;\n\n if (shouldRunCustomRouteAuth || shouldRunCustomRouteFGA) {\n const serverRoute: ServerRoute = {\n method: (matchedRoute?.route.method ?? method) 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,\n getHeader: name => req.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => req.query[name] as string | undefined,\n requestContext: res.locals.requestContext,\n request: toWebRequest(req),\n buildAuthorizeContext: () => toWebRequest(req),\n });\n\n if (authError) {\n const authResult = authError as AuthErrorWithHeaders;\n if (authResult.headers) {\n for (const [key, value] of Object.entries(authResult.headers)) {\n res.setHeader(key, value);\n }\n }\n if (authResult.error) {\n return res.status(authResult.status).json({ error: authResult.error });\n }\n }\n\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = res.locals.requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(serverRoute, userPermissions, hasPermission);\n if (permissionError) {\n return res.status(permissionError.status).json({\n error: permissionError.error,\n message: permissionError.message,\n });\n }\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, serverRoute, res.locals.requestContext, {\n ...(matchedRoute?.params ?? {}),\n ...(req.query as Record<string, string>),\n ...(typeof req.body === 'object' && req.body !== null ? req.body : {}),\n });\n if (fgaError) {\n return res.status(fgaError.status).json({ error: fgaError.error, message: fgaError.message });\n }\n }\n\n const response = await this.handleCustomRouteRequest(\n `${req.protocol}://${req.get('host') || 'localhost'}${req.originalUrl}`,\n req.method,\n req.headers as Record<string, string | string[] | undefined>,\n req.body,\n res.locals.requestContext,\n res.locals.abortSignal,\n );\n if (!response) return next();\n await this.writeCustomRouteResponse(response, res, res.locals.abortSignal);\n });\n }\n\n registerContextMiddleware(): void {\n this.app.use(this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n this.app.use((req, res, next) => {\n if (!this.shouldLogRequest(req.path)) {\n return next();\n }\n\n const start = Date.now();\n const method = req.method;\n const path = req.path;\n\n res.on('finish', () => {\n const duration = Date.now() - start;\n const status = res.statusCode;\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 = req.query;\n }\n\n if (this.httpLoggingConfig?.includeHeaders) {\n const headers = { ...req.headers };\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 next();\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/auth-middleware.ts","../src/index.ts"],"names":["toWebRequest","MastraServerBase"],"mappings":"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","file":"index.js","sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\nimport type { NextFunction, Request, Response } from 'express';\n\nexport interface ExpressAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nfunction toWebRequest(req: Request): globalThis.Request {\n const protocol = req.protocol || 'http';\n const host = req.get('host') || 'localhost';\n const url = `${protocol}://${host}${req.originalUrl || req.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (!value) continue;\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n\n return new globalThis.Request(url, {\n method: req.method,\n headers,\n });\n}\n\nexport function createAuthMiddleware({\n mastra,\n requiresAuth = true,\n}: ExpressAuthMiddlewareOptions): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n return async (req: Request, res: Response, next: NextFunction) => {\n if (!requiresAuth) {\n next();\n return;\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n next();\n return;\n }\n\n const requestContext = res.locals.requestContext ?? new RequestContext();\n res.locals.requestContext = requestContext;\n res.locals.mastra = res.locals.mastra ?? mastra;\n\n const path = String(req.path || '/');\n const method = String(req.method || 'GET');\n const customRouteAuthConfig = new Map<string, boolean>(res.locals.customRouteAuthConfig ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = req.headers.authorization;\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token && req.query.apiKey) {\n token = (req.query.apiKey as string) || null;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => req.headers[name.toLowerCase()] as string | undefined,\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext,\n rawRequest: toWebRequest(req),\n token,\n buildAuthorizeContext: () => toWebRequest(req),\n });\n\n if (result.action === 'next') {\n next();\n return;\n }\n\n res.status(result.status).json(result.body);\n };\n}\n","import { Busboy } from '@fastify/busboy';\nimport 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 isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n} from '@mastra/server/server-adapter';\nimport type { Application, NextFunction, Request, Response } from 'express';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { ExpressAuthMiddlewareOptions } from './auth-middleware';\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\ntype AuthErrorWithHeaders = { status: number; error: string; headers?: Record<string, string> };\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/express] 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/**\n * Convert Express request to Web API Request for cookie-based auth providers.\n */\nfunction toWebRequest(req: Request): globalThis.Request {\n const protocol = req.protocol || 'http';\n const host = req.get('host') || 'localhost';\n const url = `${protocol}://${host}${req.originalUrl || req.url}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value) {\n if (Array.isArray(value)) {\n value.forEach(v => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n }\n\n return new globalThis.Request(url, {\n method: req.method,\n headers,\n });\n}\n\n// Extend Express types to include Mastra context\ndeclare global {\n namespace Express {\n interface Locals {\n mastra: Mastra;\n requestContext: RequestContext;\n abortSignal: AbortSignal;\n registeredTools: ToolsInput;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n }\n }\n}\n\nexport class MastraServer extends MastraServerBase<Application, Request, Response> {\n createContextMiddleware(): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n return async (req: Request, res: Response, next: NextFunction) => {\n // Parse request context from request body and add to context\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT)\n if (req.method === 'POST' || req.method === 'PUT') {\n const contentType = req.headers['content-type'];\n if (contentType?.includes('application/json') && req.body) {\n if (req.body.requestContext) {\n bodyRequestContext = req.body.requestContext;\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (req.method === 'GET') {\n try {\n const encodedRequestContext = req.query.requestContext;\n if (typeof encodedRequestContext === 'string') {\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 => req.get(name),\n });\n\n // Set context in res.locals\n res.locals.requestContext = requestContext;\n res.locals.mastra = this.mastra;\n res.locals.registeredTools = this.tools || {};\n if (this.taskStore) {\n res.locals.taskStore = this.taskStore;\n }\n res.locals.customRouteAuthConfig = this.customRouteAuthConfig;\n const controller = new AbortController();\n // Use res.on('close') instead of req.on('close') because the request's 'close' event\n // fires when the request body is fully consumed (e.g., after express.json() parses it),\n // NOT when the client disconnects. The response's 'close' event fires when the underlying\n // connection is actually closed, which is the correct signal for stream cleanup.\n res.on('close', () => {\n // Only abort if the response wasn't successfully completed\n if (!res.writableFinished) {\n controller.abort();\n }\n });\n res.locals.abortSignal = controller.signal;\n next();\n };\n }\n async stream(route: ServerRoute, res: Response, result: { fullStream: ReadableStream }): Promise<void> {\n const streamFormat = route.streamFormat || 'stream';\n\n if (streamFormat === 'sse') {\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no');\n } else {\n res.setHeader('Content-Type', 'text/plain');\n }\n res.setHeader('Transfer-Encoding', 'chunked');\n res.flushHeaders();\n\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n res.write(': connected\\n\\n');\n }\n\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n res.write(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 if (streamFormat === 'sse') {\n res.write(`data: ${JSON.stringify(outputValue)}\\n\\n`);\n } else {\n res.write(JSON.stringify(outputValue) + '\\x1E');\n }\n }\n }\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 } finally {\n res.end();\n }\n }\n\n async getParams(route: ServerRoute, request: Request): Promise<ParsedRequestParams> {\n const urlParams = request.params as Record<string, string>;\n // Express's req.query can contain string | string[] | ParsedQs | ParsedQs[]\n const queryParams = normalizeQueryParams(request.query as Record<string, unknown>);\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['content-type'] || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const maxFileSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n body = await this.parseMultipartFormData(request, maxFileSize);\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, let others fall through to validation\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 {\n body = request.body;\n }\n }\n\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse multipart/form-data using @fastify/busboy.\n * Converts file uploads to Buffers and parses JSON field values.\n *\n * @param request - The Express request object\n * @param maxFileSize - Optional maximum file size in bytes\n */\n private parseMultipartFormData(request: Request, maxFileSize?: number): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n const result: Record<string, unknown> = {};\n\n const busboy = new Busboy({\n headers: {\n 'content-type': request.headers['content-type'] as string,\n },\n limits: maxFileSize ? { fileSize: maxFileSize } : undefined,\n });\n\n busboy.on('file', (fieldname: string, file: NodeJS.ReadableStream) => {\n const chunks: Buffer[] = [];\n let limitExceeded = false;\n\n file.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n });\n\n file.on('limit', () => {\n limitExceeded = true;\n reject(new Error(`File size limit exceeded${maxFileSize ? ` (max: ${maxFileSize} bytes)` : ''}`));\n });\n\n file.on('end', () => {\n if (!limitExceeded) {\n result[fieldname] = Buffer.concat(chunks);\n }\n });\n });\n\n busboy.on('field', (fieldname: string, value: string) => {\n // Try to parse JSON strings (like 'options')\n try {\n result[fieldname] = JSON.parse(value);\n } catch {\n result[fieldname] = value;\n }\n });\n\n busboy.on('finish', () => {\n resolve(result);\n });\n\n busboy.on('error', (error: Error) => {\n reject(error);\n });\n\n request.pipe(busboy);\n });\n }\n\n async sendResponse(\n route: ServerRoute,\n response: Response,\n result: unknown,\n request?: Request,\n prefix?: string,\n ): Promise<void> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const refreshHeaders = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(refreshHeaders)) {\n response.setHeader(key, value);\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n response.json(result);\n } else if (route.responseType === 'stream') {\n await this.stream(route, response, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n // Handle AI SDK Response objects - pipe Response.body to Express response\n const fetchResponse = result as globalThis.Response;\n fetchResponse.headers.forEach((value, key) => response.setHeader(key, value));\n response.status(fetchResponse.status);\n if (fetchResponse.body) {\n const reader = fetchResponse.body.getReader();\n\n const onResError = (err: unknown) => {\n this.mastra.getLogger()?.error('Error writing datastream response', {\n error: err instanceof Error ? { message: err.message, stack: err.stack } : err,\n });\n void reader.cancel('response write error');\n };\n response.once('error', onResError);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n response.write(value);\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in datastream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n response.off('error', onResError);\n response.end();\n }\n } else {\n response.end();\n }\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport - request is required\n if (!request) {\n response.status(500).json({ error: 'Request object required for MCP transport' });\n return;\n }\n\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n\n try {\n // Merge class-level mcpOptions with route-specific options (route takes precedence)\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n await server.startHTTP({\n url: new URL(request.url, `http://${request.headers.host}`),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req: request,\n res: response,\n options: Object.keys(options).length > 0 ? options : undefined,\n });\n // Response handled by startHTTP\n } catch {\n if (!response.headersSent) {\n response.status(500).json({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n });\n }\n }\n } else if (route.responseType === 'mcp-sse') {\n // MCP SSE transport - request is required\n if (!request) {\n response.status(500).json({ error: 'Request object required for MCP transport' });\n return;\n }\n\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n\n try {\n await server.startSSE({\n url: new URL(request.url, `http://${request.headers.host}`),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n req: request,\n res: response,\n });\n // Response handled by startSSE\n } catch {\n if (!response.headersSent) {\n response.status(500).json({ error: 'Error handling MCP SSE request' });\n }\n }\n } else {\n response.sendStatus(500);\n }\n }\n\n async registerRoute(\n app: Application,\n route: ServerRoute,\n { prefix: prefixParam }: { prefix?: string } = {},\n ): Promise<void> {\n // Default prefix to this.prefix if not provided, or empty string\n const prefix = prefixParam ?? this.prefix ?? '';\n\n // Determine if body limits should be applied\n const shouldApplyBodyLimit = this.bodyLimitOptions && ['POST', 'PUT', 'PATCH'].includes(route.method.toUpperCase());\n\n // Get the body size limit for this route (route-specific or default)\n const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n\n // Create middleware array\n const middlewares: Array<(req: Request, res: Response, next: NextFunction) => void> = [];\n\n // Add body limit middleware if needed\n if (shouldApplyBodyLimit && maxSize && this.bodyLimitOptions) {\n const bodyLimitMiddleware = (req: Request, res: Response, next: NextFunction) => {\n const contentLength = req.headers['content-length'];\n if (contentLength && parseInt(contentLength, 10) > maxSize) {\n try {\n const errorResponse = this.bodyLimitOptions!.onError({ error: 'Request body too large' });\n return res.status(413).json(errorResponse);\n } catch {\n return res.status(413).json({ error: 'Request body too large' });\n }\n }\n next();\n };\n middlewares.push(bodyLimitMiddleware);\n }\n\n app[route.method.toLowerCase() as keyof Application](\n `${prefix}${route.path}`,\n ...middlewares,\n async (req: Request, res: Response) => {\n // Check route-level authentication/authorization\n const authError = await this.checkRouteAuth(route, {\n path: String(req.path || '/'),\n method: String(req.method || 'GET'),\n getHeader: name => req.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => req.query[name] as string | undefined,\n requestContext: res.locals.requestContext,\n request: toWebRequest(req),\n buildAuthorizeContext: () => toWebRequest(req),\n });\n\n if (authError) {\n const authResult = authError as AuthErrorWithHeaders;\n // Apply any refresh headers (e.g. Set-Cookie from transparent session refresh)\n if (authResult.headers) {\n for (const [key, value] of Object.entries(authResult.headers)) {\n res.setHeader(key, value);\n }\n }\n\n // If this is an auth error (not just a success-with-headers), return error response\n if (authResult.error) {\n return res.status(authResult.status).json({ error: authResult.error });\n }\n }\n\n const params = await this.getParams(route, req);\n\n // Return 400 Bad Request if body parsing failed (e.g., malformed multipart data)\n if (params.bodyParseError) {\n return res.status(400).json({\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\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 res.status(status).json(body);\n }\n return res.status(400).json({\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n });\n }\n }\n\n if (params.body) {\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 res.status(status).json(body);\n }\n return res.status(400).json({\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\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 res.status(status).json(body);\n }\n return res.status(400).json({\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n });\n }\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: res.locals.requestContext,\n mastra: this.mastra,\n registeredTools: res.locals.registeredTools,\n taskStore: res.locals.taskStore,\n abortSignal: res.locals.abortSignal,\n routePrefix: prefix,\n request: toWebRequest(req),\n };\n\n // Check route permission requirement (EE feature)\n // Uses convention-based permission derivation: permissions are auto-derived\n // from route path/method unless explicitly set or route is public\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = res.locals.requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission);\n\n if (permissionError) {\n return res.status(permissionError.status).json({\n error: permissionError.error,\n message: permissionError.message,\n });\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, route, res.locals.requestContext, {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n return res.status(fgaError.status).json({ error: fgaError.error, message: fgaError.message });\n }\n\n try {\n const result = await route.handler(handlerParams);\n await this.sendResponse(route, res, result, req, 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 // Check if it's an HTTPException or MastraError with a status code\n let status = 500;\n if (error && typeof error === 'object') {\n // Check for direct status property (HTTPException)\n if ('status' in error) {\n status = (error as any).status;\n }\n // Check for MastraError with status in details\n else if (\n 'details' in error &&\n error.details &&\n typeof error.details === 'object' &&\n 'status' in error.details\n ) {\n status = (error.details as any).status;\n }\n }\n res.status(status).json({ error: error instanceof Error ? error.message : 'Unknown error' });\n }\n },\n );\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n if (!(await this.buildCustomRouteHandler())) return;\n\n this.app.use(async (req: Request, res: Response, next: NextFunction) => {\n // Check if this request matches a protected custom route and run auth\n const path = String(req.path || '/');\n const method = String(req.method || 'GET');\n const matchedRoute = findMatchingCustomRoute(\n path,\n method,\n this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes,\n );\n const shouldRunCustomRouteAuth = isProtectedCustomRoute(path, method, this.customRouteAuthConfig);\n const shouldRunCustomRouteFGA = !!matchedRoute?.route.fga;\n\n if (shouldRunCustomRouteAuth || shouldRunCustomRouteFGA) {\n const serverRoute: ServerRoute = {\n method: (matchedRoute?.route.method ?? method) 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,\n getHeader: name => req.headers[name.toLowerCase()] as string | undefined,\n getQuery: name => req.query[name] as string | undefined,\n requestContext: res.locals.requestContext,\n request: toWebRequest(req),\n buildAuthorizeContext: () => toWebRequest(req),\n });\n\n if (authError) {\n const authResult = authError as AuthErrorWithHeaders;\n if (authResult.headers) {\n for (const [key, value] of Object.entries(authResult.headers)) {\n res.setHeader(key, value);\n }\n }\n if (authResult.error) {\n return res.status(authResult.status).json({ error: authResult.error });\n }\n }\n\n const authConfig = this.mastra.getServer()?.auth;\n if (authConfig) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = res.locals.requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(serverRoute, userPermissions, hasPermission);\n if (permissionError) {\n return res.status(permissionError.status).json({\n error: permissionError.error,\n message: permissionError.message,\n });\n }\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, serverRoute, res.locals.requestContext, {\n ...(matchedRoute?.params ?? {}),\n ...(req.query as Record<string, string>),\n ...(typeof req.body === 'object' && req.body !== null ? req.body : {}),\n });\n if (fgaError) {\n return res.status(fgaError.status).json({ error: fgaError.error, message: fgaError.message });\n }\n }\n\n const response = await this.handleCustomRouteRequest(\n `${req.protocol}://${req.get('host') || 'localhost'}${req.originalUrl}`,\n req.method,\n req.headers as Record<string, string | string[] | undefined>,\n req.body,\n res.locals.requestContext,\n res.locals.abortSignal,\n );\n if (!response) return next();\n await this.writeCustomRouteResponse(response, res, res.locals.abortSignal);\n });\n }\n\n registerContextMiddleware(): void {\n this.app.use(this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n this.app.use((req, res, next) => {\n if (!this.shouldLogRequest(req.path)) {\n return next();\n }\n\n const start = Date.now();\n const method = req.method;\n const path = req.path;\n\n res.on('finish', () => {\n const duration = Date.now() - start;\n const status = res.statusCode;\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 = req.query;\n }\n\n if (this.httpLoggingConfig?.includeHeaders) {\n const headers = { ...req.headers };\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 next();\n });\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/express",
3
- "version": "1.3.30-alpha.2",
3
+ "version": "1.3.30-alpha.4",
4
4
  "description": "Mastra Express 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
  "@fastify/busboy": "^3.2.0",
24
- "@mastra/server": "1.42.0-alpha.2"
24
+ "@mastra/server": "1.42.0-alpha.4"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@ai-sdk/openai": "^2.0.106",
@@ -38,14 +38,14 @@
38
38
  "vitest": "4.1.5",
39
39
  "zod": "^4.4.3",
40
40
  "@internal/lint": "0.0.103",
41
- "@internal/server-adapter-test-utils": "0.0.24",
42
41
  "@internal/storage-test-utils": "0.0.99",
43
- "@mastra/core": "1.42.0-alpha.2",
44
- "@mastra/evals": "1.2.4",
45
- "@mastra/libsql": "1.12.1",
46
- "@mastra/memory": "1.20.2",
42
+ "@internal/types-builder": "0.0.78",
43
+ "@mastra/evals": "1.3.0-alpha.0",
44
+ "@mastra/libsql": "1.13.0-alpha.0",
45
+ "@mastra/memory": "1.20.3-alpha.0",
46
+ "@mastra/core": "1.42.0-alpha.4",
47
47
  "@mastra/observability": "1.14.1",
48
- "@internal/types-builder": "0.0.78"
48
+ "@internal/server-adapter-test-utils": "0.0.24"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "@mastra/core": ">=1.34.0-0 <2.0.0-0",