1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96/*
* @Author: chenzhongsheng
* @Date: 2023-02-20 16:17:44
* @Description: Coding something
*/
import {
IPromiseMayBe, IJson
} from './common';
import { IHttpInfo } from './sener.d';
import { ServerResponse, IncomingMessage } from 'http';
import { ISenerHelper, ISenerEnv } from 'sener-extend';
export type IResponse = ServerResponse & {
req: IncomingMessage;
}
export interface IHelperFunc {
response404: (errorMessage?: string, header?: IJson<string>) => ISenerResponse; // 构造404响应
responseJson: (data: IJson, statusCode?: number, header?: IJson<string>) => ISenerResponse; // 构造json响应
responseText: (text: string, statusCode?: number, header?: IJson<string>) => ISenerResponse; // 构造文本响应
responseHtml: (html: string, header?: IJson<string>) => ISenerResponse; // 构造html响应
// alias
html: (html: string, header?: IJson<string>) => ISenerResponse; // 构造html响应
responseData: (data: Partial<ISenerResponse>) => ISenerResponse; // 构造通用响应
markReturned: () => void; // 标记为已提前返回响应
}
export interface IMiddleWareDataBase extends IHttpInfo, ISenerHelper, IHelperFunc {
request: IncomingMessage;
response: IResponse;
env: ISenerEnv & IJson;
responded: boolean;
redirect: (url: string, query?: IJson, header?: IJson) => void,
isOptions: boolean; // 是否是 options method
returned: boolean;
}
export type IHookReturn = Partial<ISenerContext>|void;
export interface ISenerResponse<T = any> {
data: T,
statusCode?: number,
headers?: IJson<string>;
success?: boolean;
}
export interface ISenerContext extends
Required<ISenerResponse>,
IMiddleWareDataBase,
IJson {
}
export type IMiddleWareHook = (
ctx: ISenerContext
) => IPromiseMayBe<IHookReturn>;
export type IMiddleHookNames = 'init' | 'enter' | 'leave';
export type IMiddleWareResponseReturn = IPromiseMayBe<Partial<ISenerResponse>|void>;
export interface IMiddleWare {
dir?: string;
name?: string;
acceptOptions?: boolean;
acceptResponded?: boolean;
acceptReturned?: boolean;
// enter?: IMiddleWareHook;
init?: IMiddleWareHook;
enter?: IMiddleWareHook;
leave?: (ctx: ISenerContext) => IPromiseMayBe<void>;
helper?(): Record<string, any>;
}
export class MiddleWare implements IMiddleWare {
dir?: string;
name: string = '';
acceptOptions: boolean = false;
acceptResponded: boolean = false;
acceptReturned: boolean = false;
// // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars, @typescript-eslint/no-empty-function
// enter (ctx: ISenerContext): IPromiseMayBe<IHookReturn> {};
// eslint-disable-next-line
init (ctx: ISenerContext): IHookReturn {};
// eslint-disable-next-line
enter (ctx: ISenerContext): IHookReturn {};
// eslint-disable-next-line
leave (ctx: ISenerContext): IPromiseMayBe<void> {};
// @ts-ignore
helper (): Record<string, any>|void {}
}
export interface IServerSendData extends ISenerResponse {
response: IResponse,
}