@@ -82,6 +82,11 @@ export type LoadedServerEntry = {
8282 * When `true`, no valid entry point could be located.
8383 */
8484 notFound ?: boolean ;
85+
86+ /**
87+ * The original srvx server instance if the module used the loader API to export a server directly.
88+ */
89+ srvxServer ?: Server ;
8590} ;
8691
8792export async function loadServerEntry ( opts : LoadOptions ) : Promise < LoadedServerEntry > {
@@ -114,13 +119,13 @@ export async function loadServerEntry(opts: LoadOptions): Promise<LoadedServerEn
114119 // Import the user file
115120 let mod : any ;
116121 let interceptedNodeHandler : NodeHttpHandler | undefined ;
117- let interceptedFetchHandler : ServerHandler | undefined ;
122+ let interceptedServer : Server | undefined ;
118123 try {
119124 if ( opts . interceptHttpListen !== false ) {
120125 const loaded = await interceptListen ( ( ) => import ( url ) ) ;
121126 mod = loaded . res ;
122127 interceptedNodeHandler = loaded . listenHandler ;
123- interceptedFetchHandler = loaded . fetchHandler ;
128+ interceptedServer = loaded . server ;
124129 } else {
125130 mod = await import ( url ) ;
126131 }
@@ -145,7 +150,7 @@ export async function loadServerEntry(opts: LoadOptions): Promise<LoadedServerEn
145150 mod = ( await opts ?. onLoad ?.( mod ) ) || mod ;
146151
147152 let fetchHandler =
148- mod ?. fetch || mod ?. default ?. fetch || mod ?. default ?. default ?. fetch || interceptedFetchHandler ;
153+ mod ?. fetch || mod ?. default ?. fetch || mod ?. default ?. default ?. fetch || interceptedServer ?. fetch ;
149154 if ( ! fetchHandler && typeof mod ?. default === "function" && mod . default . length < 2 ) {
150155 fetchHandler = mod . default ;
151156 }
@@ -167,6 +172,7 @@ export async function loadServerEntry(opts: LoadOptions): Promise<LoadedServerEn
167172 nodeCompat,
168173 url,
169174 fetch : fetchHandler ,
175+ srvxServer : interceptedServer ,
170176 } ;
171177}
172178
@@ -175,16 +181,20 @@ let _interceptQueue: Promise<unknown> = Promise.resolve();
175181
176182async function interceptListen < T = unknown > (
177183 cb : ( ) => T | Promise < T > ,
178- ) : Promise < { res ?: T ; listenHandler ?: NodeHttpHandler ; fetchHandler ?: ServerHandler } > {
184+ ) : Promise < {
185+ res ?: T ;
186+ listenHandler ?: NodeHttpHandler ;
187+ server ?: Server ;
188+ } > {
179189 // Chain onto the queue to ensure sequential execution
180190 const result = _interceptQueue . then ( async ( ) => {
181191 const originalListen = nodeHTTP . Server . prototype . listen ;
182192 let res : T ;
183193 let listenHandler : NodeHttpHandler | undefined ;
184- let fetchHandler : ServerHandler | undefined ;
194+ let server : Server | undefined ;
185195
186- ( globalThis as any ) . __srvxLoader__ = ( handler : ServerHandler ) => {
187- fetchHandler = handler ;
196+ ( globalThis as any ) . __srvxLoader__ = ( obj : { server ?: Server } ) => {
197+ server = obj . server ;
188198 } ;
189199
190200 try {
@@ -226,7 +236,7 @@ async function interceptListen<T = unknown>(
226236 nodeHTTP . Server . prototype . listen = originalListen ;
227237 delete ( globalThis as any ) . __srvxLoader__ ;
228238 }
229- return { res, listenHandler, fetchHandler } ;
239+ return { res, listenHandler, server } ;
230240 } ) ;
231241
232242 // Update queue to point to this operation (swallow errors for queue chaining)
0 commit comments