📦 theajack / sener

📄 middleware.ts · 96 lines
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,
}