import {ResponseFactory} from './ResponseFactory' import {Request} from '../lifecycle/Request' import {ErrorWithContext, UniversalPath} from '../../util' import {Logging} from '../../service/Logging' /** * Helper function that creates a FileResponseFactory for the given path. * @param path */ export function file(path: UniversalPath): FileResponseFactory { return new FileResponseFactory(path) } /** * HTTP response factory that sends a file referenced by a given UniversalPath. */ export class FileResponseFactory extends ResponseFactory { constructor( /** The file to be sent. */ public readonly path: UniversalPath, ) { super() } public async write(request: Request): Promise { if ( !(await this.path.isFile()) ) { throw new ErrorWithContext(`Cannot write non-file resource as response: ${this.path}`, { path: this.path, }) } request.make(Logging).debug(`Setting Content-Type of ${this.path} to ${this.path.contentType}...`) request.response.setHeader('Content-Type', this.path.contentType || 'application/octet-stream') request.response.setHeader('Content-Length', String(await this.path.sizeInBytes())) request.response.body = await this.path.readStream() return request } }