|
|
|
|
@@ -91,6 +91,8 @@ export type RouterHandler<TEnv = any, TCtx = any, TReq = any> = {
|
|
|
|
|
* @property {string} [allowOrigin="*"] Access-Control-Allow-Origin (default: `*`)
|
|
|
|
|
* @property {string} [allowMethods="*"] Access-Control-Allow-Methods (default: `*`)
|
|
|
|
|
* @property {string} [allowHeaders="*"] Access-Control-Allow-Headers (default: `*`)
|
|
|
|
|
* @property {boolean} [allowCredentials="true"] Access-Control-Allow-Credentials (default: undefined)
|
|
|
|
|
* @property {string} [vary="origin"] vary (default: undefined)
|
|
|
|
|
* @property {number} [maxAge=86400] Access-Control-Max-Age (default: `86400`)
|
|
|
|
|
* @property {number} [optionsSuccessStatus=204] Return status code for OPTIONS request (default: `204`)
|
|
|
|
|
*/
|
|
|
|
|
@@ -98,6 +100,8 @@ export type RouterCorsConfig = {
|
|
|
|
|
allowOrigin?: string
|
|
|
|
|
allowMethods?: string
|
|
|
|
|
allowHeaders?: string
|
|
|
|
|
allowCredentials?: boolean
|
|
|
|
|
vary?: string
|
|
|
|
|
maxAge?: number
|
|
|
|
|
optionsSuccessStatus?: number
|
|
|
|
|
}
|
|
|
|
|
@@ -150,14 +154,6 @@ export class Router<TEnv = any, TCtx = any, TReq = any> {
|
|
|
|
|
*/
|
|
|
|
|
protected corsConfig: RouterCorsConfig = {}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Buffer
|
|
|
|
|
*
|
|
|
|
|
* @protected
|
|
|
|
|
* @type {RouterBuffer}
|
|
|
|
|
*/
|
|
|
|
|
protected buffer: RouterBuffer = {}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* CORS enabled
|
|
|
|
|
*
|
|
|
|
|
@@ -312,6 +308,8 @@ export class Router<TEnv = any, TCtx = any, TReq = any> {
|
|
|
|
|
allowOrigin: config?.allowOrigin ?? '*',
|
|
|
|
|
allowMethods: config?.allowMethods ?? '*',
|
|
|
|
|
allowHeaders: config?.allowHeaders ?? '*',
|
|
|
|
|
allowCredentials: config?.allowCredentials ?? undefined,
|
|
|
|
|
vary: config?.vary ?? undefined,
|
|
|
|
|
maxAge: config?.maxAge ?? 86400,
|
|
|
|
|
optionsSuccessStatus: config?.optionsSuccessStatus ?? 204
|
|
|
|
|
}
|
|
|
|
|
@@ -325,6 +323,10 @@ export class Router<TEnv = any, TCtx = any, TReq = any> {
|
|
|
|
|
headers.set('Access-Control-Allow-Methods', this.corsConfig.allowMethods)
|
|
|
|
|
if (this.corsConfig.allowHeaders && !headers.has('Access-Control-Allow-Headers'))
|
|
|
|
|
headers.set('Access-Control-Allow-Headers', this.corsConfig.allowHeaders)
|
|
|
|
|
if (this.corsConfig.allowCredentials && !headers.has('Access-Control-Allow-Credentials'))
|
|
|
|
|
headers.set('Access-Control-Allow-Credentials', this.corsConfig.allowCredentials.toString())
|
|
|
|
|
if (this.corsConfig.vary && !headers.has('vary'))
|
|
|
|
|
headers.set('vary', this.corsConfig.vary.toString())
|
|
|
|
|
if (this.corsConfig.maxAge && !headers.has('Access-Control-Max-Age'))
|
|
|
|
|
headers.set('Access-Control-Max-Age', this.corsConfig.maxAge.toString())
|
|
|
|
|
return headers
|
|
|
|
|
@@ -400,6 +402,7 @@ export class Router<TEnv = any, TCtx = any, TReq = any> {
|
|
|
|
|
* @returns {Promise<Response>}
|
|
|
|
|
*/
|
|
|
|
|
public async handle(request: Request, env: TEnv, ctx?: ExecutionContext, extCtx?: TCtx, extReq?: TReq): Promise<Response> {
|
|
|
|
|
const buffer: RouterBuffer = {};
|
|
|
|
|
const req = {
|
|
|
|
|
...(extReq ?? {}),
|
|
|
|
|
method: request.method,
|
|
|
|
|
@@ -409,11 +412,11 @@ export class Router<TEnv = any, TCtx = any, TReq = any> {
|
|
|
|
|
raw: request,
|
|
|
|
|
params: {},
|
|
|
|
|
query: {},
|
|
|
|
|
arrayBuffer: async (): Promise<ArrayBuffer> => this.buffer.arrayBuffer ? this.buffer.arrayBuffer : this.buffer.arrayBuffer = await request.arrayBuffer(),
|
|
|
|
|
text: async (): Promise<string> => this.buffer.text ? this.buffer.text : this.buffer.text = await request.text(),
|
|
|
|
|
json: async <T>(): Promise<T> => this.buffer.json ? this.buffer.json : this.buffer.json = await request.json<T>(),
|
|
|
|
|
formData: async (): Promise<FormData> => this.buffer.formData ? this.buffer.formData : this.buffer.formData = await request.formData(),
|
|
|
|
|
blob: async (): Promise<Blob> => this.buffer.blob ? this.buffer.blob : this.buffer.blob = await request.blob(),
|
|
|
|
|
arrayBuffer: async (): Promise<ArrayBuffer> => buffer.arrayBuffer ? buffer.arrayBuffer : buffer.arrayBuffer = await request.arrayBuffer(),
|
|
|
|
|
text: async (): Promise<string> => buffer.text ? buffer.text : buffer.text = await request.text(),
|
|
|
|
|
json: async <T>(): Promise<T> => buffer.json ? buffer.json : buffer.json = await request.json<T>(),
|
|
|
|
|
formData: async (): Promise<FormData> => buffer.formData ? buffer.formData : buffer.formData = await request.formData(),
|
|
|
|
|
blob: async (): Promise<Blob> => buffer.blob ? buffer.blob : buffer.blob = await request.blob(),
|
|
|
|
|
bearer: () => request.headers.get('Authorization')?.replace(/^(B|b)earer /, '').trim()
|
|
|
|
|
} as RouterRequest<TReq>
|
|
|
|
|
|
|
|
|
|
|