|
import mime from 'mime'; |
|
import _ from 'lodash'; |
|
|
|
import Body from './Body.ts'; |
|
import util from '../util.ts'; |
|
|
|
export interface ResponseOptions { |
|
statusCode?: number; |
|
type?: string; |
|
headers?: Record<string, any>; |
|
redirect?: string; |
|
body?: any; |
|
size?: number; |
|
time?: number; |
|
} |
|
|
|
export default class Response { |
|
|
|
|
|
statusCode: number; |
|
|
|
type: string; |
|
|
|
headers: Record<string, any>; |
|
|
|
redirect: string; |
|
|
|
body: any; |
|
|
|
size: number; |
|
|
|
time: number; |
|
|
|
constructor(body: any, options: ResponseOptions = {}) { |
|
const { statusCode, type, headers, redirect, size, time } = options; |
|
this.statusCode = Number(_.defaultTo(statusCode, Body.isInstance(body) ? body.statusCode : undefined)) |
|
this.type = type; |
|
this.headers = headers; |
|
this.redirect = redirect; |
|
this.size = size; |
|
this.time = Number(_.defaultTo(time, util.timestamp())); |
|
this.body = body; |
|
} |
|
|
|
injectTo(ctx) { |
|
this.redirect && ctx.redirect(this.redirect); |
|
this.statusCode && (ctx.status = this.statusCode); |
|
this.type && (ctx.type = mime.getType(this.type) || this.type); |
|
const headers = this.headers || {}; |
|
if(this.size && !headers["Content-Length"] && !headers["content-length"]) |
|
headers["Content-Length"] = this.size; |
|
ctx.set(headers); |
|
if(Body.isInstance(this.body)) |
|
ctx.body = this.body.toObject(); |
|
else |
|
ctx.body = this.body; |
|
} |
|
|
|
static isInstance(value) { |
|
return value instanceof Response; |
|
} |
|
|
|
} |