( response: ReadStream | File | Blob, set?: Context['set'] )
| 10 | } from 'elysia/adapter/utils' |
| 11 | |
| 12 | export const handleFile = ( |
| 13 | response: ReadStream | File | Blob, |
| 14 | set?: Context['set'] |
| 15 | ): Response => { |
| 16 | if (response instanceof Promise) |
| 17 | return response.then((res) => handleFile(res, set)) as any |
| 18 | |
| 19 | // @ts-ignore |
| 20 | const size = response.size |
| 21 | const immutable = |
| 22 | set && |
| 23 | (set.status === 206 || |
| 24 | set.status === 304 || |
| 25 | set.status === 412 || |
| 26 | set.status === 416) |
| 27 | |
| 28 | const defaultHeader = immutable |
| 29 | ? { |
| 30 | 'transfer-encoding': 'chunked' |
| 31 | } |
| 32 | : ({ |
| 33 | 'accept-ranges': 'bytes', |
| 34 | 'content-range': size |
| 35 | ? `bytes 0-${size - 1}/${size}` |
| 36 | : undefined, |
| 37 | 'transfer-encoding': 'chunked' |
| 38 | } as any) |
| 39 | |
| 40 | if (!set && !size) return new Response(response as Blob) |
| 41 | |
| 42 | if (!set) |
| 43 | return new Response(response as Blob, { |
| 44 | headers: defaultHeader |
| 45 | }) |
| 46 | |
| 47 | if (set.headers instanceof Headers) { |
| 48 | let setHeaders: Record<string, any> = defaultHeader |
| 49 | |
| 50 | setHeaders = {} |
| 51 | // @ts-ignore |
| 52 | for (const [key, value] of set.headers.entries()) |
| 53 | if (key in set.headers) setHeaders[key] = value |
| 54 | |
| 55 | if (immutable) { |
| 56 | delete set.headers['content-length'] |
| 57 | delete set.headers['accept-ranges'] |
| 58 | } |
| 59 | |
| 60 | return new Response(response as Blob, { |
| 61 | status: set.status as number, |
| 62 | headers: setHeaders |
| 63 | }) |
| 64 | } |
| 65 | |
| 66 | if (isNotEmpty(set.headers)) |
| 67 | return new Response(response as Blob, { |
| 68 | status: set.status as number, |
| 69 | headers: Object.assign(defaultHeader, set.headers) |
no outgoing calls
no test coverage detected