@@ -3,6 +3,11 @@ import type { ReadStream } from 'fs'
33
44import { isNotEmpty } from 'elysia/utils'
55import type { Context } from 'elysia/context'
6+ import {
7+ createStreamHandler ,
8+ responseToSetHeaders ,
9+ streamResponse
10+ } from 'elysia/adapter/utils'
611
712export const handleFile = (
813 response : ReadStream | File | Blob ,
@@ -69,3 +74,40 @@ export const handleFile = (
6974 headers : defaultHeader
7075 } )
7176}
77+
78+ interface CreateHandlerParameter {
79+ mapResponse (
80+ response : unknown ,
81+ set : Context [ 'set' ] ,
82+ request ?: Request
83+ ) : Response
84+ mapCompactResponse ( response : unknown , request ?: Request ) : Response
85+ }
86+
87+ export const createResponseHandler = ( handler : CreateHandlerParameter ) => {
88+ const handleStream = createStreamHandler ( handler )
89+
90+ return ( response : Response , set : Context [ 'set' ] , request ?: Request ) => {
91+ const newResponse = new Response ( response . body , {
92+ headers : Object . assign (
93+ // @ts -ignore
94+ Object . fromEntries ( response . headers . entries ( ) ) ,
95+ set . headers
96+ ) ,
97+ status : response . status ?? set . status
98+ } )
99+
100+ if (
101+ ! ( newResponse as Response ) . headers . has ( 'content-length' ) &&
102+ ( newResponse as Response ) . headers . get ( 'transfer-encoding' ) ===
103+ 'chunked'
104+ )
105+ return handleStream (
106+ streamResponse ( newResponse as Response ) ,
107+ responseToSetHeaders ( newResponse as Response , set ) ,
108+ request
109+ ) as any
110+
111+ return newResponse
112+ }
113+ }
0 commit comments