///
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;
}