1717import * as trpcExpress from '@trpc/server/adapters/express' ;
1818import * as bodyParser from 'body-parser' ;
1919import * as clc from 'colorette' ;
20+ import cors from 'cors' ;
2021import express , { type ErrorRequestHandler } from 'express' ;
2122import type { Server } from 'http' ;
2223import os from 'os' ;
@@ -49,6 +50,15 @@ export function startServer(manager: RuntimeManager, port: number) {
4950 let server : Server ;
5051 const app = express ( ) ;
5152
53+ // Allow all origins and expose trace ID header
54+ app . use (
55+ cors ( {
56+ origin : '*' ,
57+ allowedHeaders : [ 'Content-Type' ] ,
58+ exposedHeaders : [ 'X-Genkit-Trace-Id' ] ,
59+ } )
60+ ) ;
61+
5262 // Download UI assets from public GCS bucket and serve locally
5363 downloadAndExtractUiAssets ( {
5464 fileUrl : UI_ASSETS_ZIP_GCS_PATH ,
@@ -60,21 +70,6 @@ export function startServer(manager: RuntimeManager, port: number) {
6070 // tRPC doesn't support simple streaming mutations (https://github.com/trpc/trpc/issues/4477).
6171 // Don't want a separate WebSocket server for subscriptions - https://trpc.io/docs/subscriptions.
6272 // TODO: migrate to streamingMutation when it becomes available in tRPC.
63- app . options ( '/api/streamAction' , async ( req , res ) => {
64- res . setHeader ( 'Access-Control-Allow-Origin' , '*' ) ;
65- res . setHeader ( 'Access-Control-Allow-Headers' , 'Content-Type' ) ;
66- res . setHeader ( 'Access-Control-Expose-Headers' , 'X-Genkit-Trace-Id' ) ;
67- res . status ( 200 ) . send ( '' ) ;
68- } ) ;
69-
70- // Plain HTTP runAction endpoint (non-streaming)
71- app . options ( '/api/runAction' , async ( req , res ) => {
72- res . setHeader ( 'Access-Control-Allow-Origin' , '*' ) ;
73- res . setHeader ( 'Access-Control-Allow-Headers' , 'Content-Type' ) ;
74- res . setHeader ( 'Access-Control-Expose-Headers' , 'X-Genkit-Trace-Id' ) ;
75- res . status ( 200 ) . send ( '' ) ;
76- } ) ;
77-
7873 app . post (
7974 '/api/runAction' ,
8075 bodyParser . json ( { limit : MAX_PAYLOAD_SIZE } ) ,
@@ -90,8 +85,6 @@ export function startServer(manager: RuntimeManager, port: number) {
9085 // This is the first place headers are sent, so no check needed
9186 res . setHeader ( 'X-Genkit-Trace-Id' , traceId ) ;
9287 res . setHeader ( 'Content-Type' , 'application/json' ) ;
93- res . setHeader ( 'Access-Control-Allow-Origin' , '*' ) ;
94- res . setHeader ( 'Access-Control-Expose-Headers' , 'X-Genkit-Trace-Id' ) ;
9588 res . statusCode = 200 ;
9689 res . flushHeaders ( ) ;
9790 }
@@ -106,7 +99,6 @@ export function startServer(manager: RuntimeManager, port: number) {
10699 if ( ! res . headersSent ) {
107100 res . writeHead ( 500 , {
108101 'Content-Type' : 'application/json' ,
109- 'Access-Control-Allow-Origin' : '*' ,
110102 } ) ;
111103 }
112104 res . end ( JSON . stringify ( { error : error . data } ) ) ;
@@ -121,8 +113,6 @@ export function startServer(manager: RuntimeManager, port: number) {
121113 const { key, input, context } = req . body ;
122114
123115 // Set streaming headers immediately
124- res . setHeader ( 'Access-Control-Allow-Origin' , '*' ) ;
125- res . setHeader ( 'Access-Control-Expose-Headers' , 'X-Genkit-Trace-Id' ) ;
126116 res . setHeader ( 'Content-Type' , 'text/plain' ) ;
127117 res . setHeader ( 'Transfer-Encoding' , 'chunked' ) ;
128118 res . statusCode = 200 ;
@@ -147,12 +137,6 @@ export function startServer(manager: RuntimeManager, port: number) {
147137 }
148138 ) ;
149139
150- app . options ( '/api/streamTrace' , async ( req , res ) => {
151- res . setHeader ( 'Access-Control-Allow-Origin' , '*' ) ;
152- res . setHeader ( 'Access-Control-Expose-Headers' , 'X-Genkit-Trace-Id' ) ;
153- res . status ( 200 ) . send ( '' ) ;
154- } ) ;
155-
156140 app . post (
157141 '/api/streamTrace' ,
158142 bodyParser . json ( { limit : MAX_PAYLOAD_SIZE } ) ,
@@ -165,9 +149,6 @@ export function startServer(manager: RuntimeManager, port: number) {
165149 }
166150
167151 // Set streaming headers immediately
168- res . setHeader ( 'Access-Control-Allow-Origin' , '*' ) ;
169- res . setHeader ( 'Access-Control-Allow-Headers' , 'Content-Type' ) ;
170- res . setHeader ( 'Access-Control-Expose-Headers' , 'X-Genkit-Trace-Id' ) ;
171152 res . setHeader ( 'Content-Type' , 'text/plain' ) ;
172153 res . setHeader ( 'Transfer-Encoding' , 'chunked' ) ;
173154 res . setHeader ( 'X-Genkit-Trace-Id' , traceId ) ;
@@ -185,7 +166,6 @@ export function startServer(manager: RuntimeManager, port: number) {
185166 if ( ! res . headersSent ) {
186167 res . writeHead ( 500 , {
187168 'Content-Type' : 'application/json' ,
188- 'Access-Control-Allow-Origin' : '*' ,
189169 } ) ;
190170 }
191171 res . write (
@@ -211,12 +191,6 @@ export function startServer(manager: RuntimeManager, port: number) {
211191 // Endpoints for CLI control
212192 app . use (
213193 API_BASE_PATH ,
214- ( req , res , next ) => {
215- res . setHeader ( 'Access-Control-Allow-Origin' , '*' ) ;
216- res . setHeader ( 'Access-Control-Allow-Headers' , 'Content-Type' ) ;
217- if ( req . method === 'OPTIONS' ) res . send ( '' ) ;
218- else next ( ) ;
219- } ,
220194 trpcExpress . createExpressMiddleware ( {
221195 router : TOOLS_SERVER_ROUTER ( manager ) ,
222196 maxBodySize : MAX_PAYLOAD_SIZE ,
0 commit comments