import {createLogger} from "@gongt/ts-stl-library/debug/create-logger"; import {LOG_LEVEL} from "@gongt/ts-stl-library/debug/levels"; import {Readable} from "stream"; import {RequestContext} from "./base/context"; import {ExpressHandler} from "./base/handler"; import {ResponseInterface} from "./base/response-wrapper"; export type AvailableResponseType = string|Buffer|Readable; export class DownloadHandler extends ExpressHandler> { protected mimeType: string = 'application/octet-stream'; protected instanceContext(req, res) { res.header('Content-Type', this.mimeType); return new DownloadRequestContext(req, res); } public setMimeType(mime: string) { this.mimeType = mime; } } export class DownloadRequestContext extends RequestContext { protected createResponseWrapper(): DownloadWrapper { return new DownloadWrapper(this.res); } } const debugSill = createLogger(LOG_LEVEL.SILLY, 'response'); export class DownloadWrapper extends ResponseInterface { protected responseContent: AvailableResponseType; protected asyncResolve(ret: AvailableResponseType): void { this.responseContent = ret; } protected _send() { const ret = this.responseContent; if (ret instanceof Readable) { debugSill(' with a stream'); ret.pipe(this.response); } else if (ret instanceof Buffer || typeof ret === 'string') { debugSill(' with a buffer | string'); this.response.send(ret); } else { debugSill(' empty, invalid'); this.fatalError(new Error('empty response, or response type not known.')); } } }