/// import { FileSystem } from "tutils/fileSystem"; import { HTTPRequest, HTTPResponse, HTTPServer, HTTPServerOptions } from "tutils/httpServer"; import { Matcher, Pattern } from "tutils/matcher"; /** 表示一个 Web 服务器,提供静态文件、目录浏览、自定义路由等功能 */ export declare class WebServer extends HTTPServer { /** * 初始化新的服务器 * @param options 附加选项 */ constructor(options?: WebServerOptions); /** * 替换设置的重写地址中的变量 * @param url 用户设置的地址 * @param path 请求路径 * @param baseDir 基路径 */ protected formatURL(url: string, path: string, baseDir?: string | null): string; /** 获取当前服务器的根地址,如果服务器未在监听则返回 `undefined` */ get url(): string; /** 获取配置的服务器主机地址 */ readonly hostname?: string; /** 获取配置的服务器端口 */ readonly port?: number; /** 获取允许的最大连接数 */ readonly backlog?: number; /** 获取服务根地址 */ readonly rootPath: string; /** 判断是否在启动时打开浏览器 */ readonly open: boolean | string; /** 获取启动时打开的地址 */ readonly openURL: string; /** 启动服务器 */ start(): Promise; /** * 关闭服务器 * @returns 如果服务器已成功关闭,返回 `true`,如果服务器未启动,返回 `false` */ close(): any; /** 响应请求的路由规则 */ readonly routers: { /** 匹配请求的匹配器 */ matcher: Matcher; /** * 自定义处理请求 * @param request 当前的请求对象 * @param response 当前的响应对象 * @param server 当前的服务器对象 */ process(request: HTTPRequest, response: HTTPResponse, server: WebServer): void | Promise; /** 是否终止后续路由 */ break?: boolean; }[]; /** * 处理客户端请求 * @param request 当前的请求对象 * @param response 当前的响应对象 */ processRequest(request: HTTPRequest, response: HTTPResponse): Promise; /** 获取当前服务器的根文件夹 */ readonly rootDir: string; /** * 获取请求地址对应的本地物理路径,如果无法映射则返回空 * @param path 请求的地址 */ mapPath(path: string): string; /** * 默认路由 * @param request 当前的请求对象 * @param response 当前的响应对象 */ defaultRouter(request: HTTPRequest, response: HTTPResponse): Promise; /** 在每个请求中附加的请求头内容 */ readonly headers?: { [name: string]: string; }; /** 获取使用的文件系统 */ readonly fs: FileSystem; /** 获取所有自定义扩展名(含点)到 MIME 类型的映射表 */ readonly mimeTypes?: { [ext: string]: string | false; }; /** 判断是否自动列出文件 */ readonly directoryList: boolean; /** 获取默认首页 */ readonly defaultPages: string[]; /** * 响应一个静态文件或文件夹 * @param request 当前的请求对象 * @param response 当前的响应对象 * @param path 本地文件或文件夹路径 */ writeStatic(request: HTTPRequest, response: HTTPResponse, path: string): Promise; /** * 响应一个文件 * @param request 当前的请求对象 * @param response 当前的响应对象 * @param path 文件或文件夹路径 * @param etag 文件最后修改戳 */ writeFile(request: HTTPRequest, response: HTTPResponse, path: string, etag?: string): Promise; /** * 响应一个文件列表 * @param request 当前的请求对象 * @param response 当前的响应对象 * @param entries 所有文件夹和文件项 * @param entries[].name 文件夹或文件名 * @param entries[].dir 该项是否是文件夹 * @param entries[].modified 最后修改时间 * @param entries[].size 文件的大小 * @param entries[].title 文件的提示 * @param rootDir 是否是根目录 */ writeDir(request: HTTPRequest, response: HTTPResponse, entries: { name: string; isDir?: boolean; modified?: Date; size?: number; title?: string; }[], rootDir?: boolean): void; /** * 格式化时间为可读格式 * @param date 要格式化的时间 * @param now 服务器的当前时间 */ protected formatDate(date: Date, now: Date): string; /** * 响应一个静态数据 * @param request 当前的请求对象 * @param response 当前的响应对象 * @param content 要响应的内容 * @param mimeType 要响应的 MIME 类型 * @param etag 缓存内容的标签,如果客户端传递了相同的标签则使用客户端缓存 */ writeContent(request: HTTPRequest, response: HTTPResponse, content: string | Buffer, mimeType?: string, etag?: string): void; /** * 响应一个服务端 JS * @param request 当前的请求对象 * @param response 当前的响应对象 * @param path 要执行的 JS 代码路径 * @param context 代码中可使用的全局变量 * @param end 是否结束请求 */ writeServerJS(request: HTTPRequest, response: HTTPResponse, path: string, context?: { [key: string]: any; }, end?: boolean): Promise; /** * 响应一个 EJS 模板(仅支持 `<% %>`、`<%= %>` 和 `<%# %>` 语法) * @param request 当前的请求对象 * @param response 当前的响应对象 * @param path 要响应的错误或 HTTP 错误码 * @param context 模板中可使用的全局变量 * @param end 是否结束请求 */ writeEJS(request: HTTPRequest, response: HTTPResponse, path: string, context?: { [key: string]: any; }, end?: boolean): Promise; /** * 响应一个代理服务器 * @param request 当前的请求对象 * @param response 当前的响应对象 * @param url 实际请求的地址 */ writeProxy(request: HTTPRequest, response: HTTPResponse, url: string): Promise; /** * 响应一个错误 * @param request 当前的请求对象 * @param response 当前的响应对象 * @param error 要响应的错误或 HTTP 错误码 */ writeError(request: HTTPRequest, response: HTTPResponse, error: NodeJS.ErrnoException | number): void; } /** 表示 Web 服务器的附加选项 */ export interface WebServerOptions extends HTTPServerOptions { /** 服务器的根地址或端口 */ url?: string | number; /** 是否在首次启动时打开浏览器 */ open?: boolean | string; /** 首次启动时打开的地址 */ openURL?: string; /** 附加的响应头内容 */ headers?: { [name: string]: string; }; /** 响应请求的路由规则 */ routers?: WebServerRouter[]; /** * 当前服务器的根目录 * @default process.cwd() */ rootDir?: string; /** * 是否自动列出文件 * @default false */ directoryList?: boolean; /** * 默认首页 * @default this.directoryList ? [] : ["index.html", "index.htm"] */ defaultPages?: string[]; /** 所有自定义扩展名(含点)到 MIME 类型的映射表 */ mimeTypes?: { [ext: string]: string | false; }; /** 使用的文件系统 */ fs?: FileSystem; } /** 表示一个服务器路由规则 */ export interface WebServerRouter { /** 指定哪些请求可以使用此路由,可以是通配符或正则表达式等 */ match?: Pattern; /** 指定额外排除的请求,可以是通配符或正则表达式等 */ exclude?: Pattern; /** * 重写请求的地址,如果是字符串,则其中以下标记会被替换: * - ``: 请求的路径,等价于 `/` * - ``: 请求的文件夹路径 * - ``: 请求的文件名(不含文件夹和扩展名部分) * - ``: 请求的扩展名(含点) * - ``: 随机整数,默认为 8 位,如果要自定义为 n 位,使用如 `` * - ``: 当前时间,默认为用户本地可读格式,如果要自定义格式,使用如 `` * @param request 当前的请求对象 * @param response 当前的响应对象 * @param server 当前的服务器对象 */ rewrite?: string | ((request: HTTPRequest, response: HTTPResponse, server: WebServer) => string); /** * 响应静态文件,如果是字符串,则其中以下标记会被替换: * - ``: 请求的路径,等价于 `/` * - ``: 请求的文件夹路径 * - ``: 请求的文件名(不含文件夹和扩展名部分) * - ``: 请求的扩展名(含点) * - ``: 随机整数,默认为 8 位,如果要自定义为 n 位,使用如 `` * - ``: 当前时间,默认为用户本地可读格式,如果要自定义格式,使用如 `` * @param request 当前的请求对象 * @param response 当前的响应对象 * @param server 当前的服务器对象 */ static?: string | ((request: HTTPRequest, response: HTTPResponse, server: WebServer) => string); /** * 代理的请求地址,如果是字符串,则其中以下标记会被替换: * - ``: 请求的路径,等价于 `/` * - ``: 请求的文件夹路径 * - ``: 请求的文件名(不含文件夹和扩展名部分) * - ``: 请求的扩展名(含点) * - ``: 随机整数,默认为 8 位,如果要自定义为 n 位,使用如 `` * - ``: 当前时间,默认为用户本地可读格式,如果要自定义格式,使用如 `` * @param request 当前的请求对象 * @param response 当前的响应对象 * @param server 当前的服务器对象 */ proxy?: string | ((request: HTTPRequest, response: HTTPResponse, server: WebServer) => string); /** * 自定义处理请求 * @param request 当前的请求对象 * @param response 当前的响应对象 * @param server 当前的服务器对象 */ process?(request: HTTPRequest, response: HTTPResponse, server: WebServer): void | Promise; /** 是否终止后续路由 */ break?: boolean; }