f2e-server3
Version:
f2e-server 3.0
171 lines (161 loc) • 6.16 kB
text/typescript
import { AppOptions, HttpRequest, HttpResponse, TemplatedApp } from 'uWebSockets.js'
import { MiddlewareCreater, MiddlewareEvents, MiddlewareReference } from './middlewares/interface';
import { MemoryTree } from './memory-tree';
import { TryFilesItem } from './middlewares/try_files/interface';
import { LiveReloadConfig } from './middlewares/livereload/interface';
import { ProxyItem } from './middlewares/proxy/interface';
import { EsbuildConfig } from './middlewares/esbuild/interface';
import { LessConfig } from './middlewares/less/interface';
import { HttpHeaders } from './utils/resp';
import { AuthConfig } from './middlewares/auth/interface';
import { PostCssConfig } from './middlewares/postcss/interface';
import { AliasConfig } from './middlewares/alias/interface';
import { IncludeConfig } from './middlewares/include/interface';
export type ConfigMode = "dev" | "build" | "prod";
export const ModeOptions = ["dev", "build", "prod"] as const;
export interface APIContext {
req: HttpRequest,
resp: HttpResponse,
pathname: string,
location: URL,
method: string,
/** 请求头信息 */
headers: HttpHeaders,
store: MemoryTree.Store | undefined,
body?: Buffer,
/** 需要添加的响应头信息 */
responseHeaders?: HttpHeaders,
}
/** 启动服务器相关配置 */
export interface ServerConfig {
/** 项目根路径: 默认为process.cwd() */
root?: string;
/**
* 默认 2850,
* 当配置端口为443的时候自动转化为 https 服务 并需要配置 app_options */
port?: number;
/**
* 指定host访问生效
* 未指定时,只要是访问端口符合就可以,相当于nginx的 servername: _
*/
host?: string
/**
* 主动设置ssl 模式, 默认为 false,优先级高于 port:443
* 配置 uWebSockets.js 的 app_options, ssl服务需要配置
*/
ssl?: false | AppOptions;
/**
* 服务器 gzip 模式,默认为false
*/
gzip?: boolean;
/**
* 运行时 是否对资源进行 gzip 压缩, gzip开启后生效
* 可以根据文件路径、文件大小给出结果
* @default function (pathname, size) { return isText(pathname) && size > 4096 }
* @param {string} pathname 资源路径名
* @param {number} size 资源大小
* @return {boolean}
*/
gzip_filter?: (pathname: string, size: number) => boolean;
/**
* 运行时 是否对资源进行 cache-control
* 可以根据文件路径、文件大小给出结果, html文件作为入口文件,通常不需要缓存
* @default function (pathname, size) { return !/\.html?$/.test(pathname) }
* @param {string} pathname 资源路径名
* @param {number} size 资源大小
* @return {boolean}
*/
cache_filter?: (pathname: string, size: number) => boolean;
/**
* 基础服务启动后执行
*/
onServerCreate?: (app: TemplatedApp, conf: F2EConfigResult) => void;
/** 映射文件后缀名到指定MIME */
mimeTypes?: { [key: string]: string };
/** 流数据分片大小
* @default 1024 * 1024 * 10
*/
range_size?: number;
/**
* 添加统一响应头
*/
headers?: HttpHeaders;
/** 默认404页面 */
page_404?: string;
/** 默认服务端错误页面 */
page_50x?: string;
/** 未设置try_files展示目录页面 */
page_dir?: string | false;
/**
* 中间件 try_files 配置
* 参考Nginx配置 `try_files` 而产生的功能
* 1. 类型为`string`时, 所有未能找到资源的情况都转发到这个 `pathname`
* 2. 类型为`{test, exec}[]`, 依次循环匹配`test`, 进行转发
* @default false
* @suggest "index.html"
*/
try_files?: false | string | TryFilesItem | (string | TryFilesItem)[];
/**
* 中间件 livereload 配置
* @default false
* mode = 'dev' 时: livereload = {
prefix: 'server-sent-bit',
heartBeatTimeout: 100000
}
*/
livereload?: false | LiveReloadConfig;
/**
* 代理配置
*/
proxies?: ProxyItem[];
/**
* 中间件 esbuild配置
* @default
* {
* esbuildrc: "./esbuildrc.js",
* build_external: true
* }
*/
esbuild?: false | EsbuildConfig;
/**
* less配置
* @default false
*/
less?: false | LessConfig;
/** auth登录认证配置 */
auth?: false | AuthConfig;
/**
* 索引资源配置
* 将原始资源映射到指定路径out
* 原始路径支持绝对路径和相对路径,以及http(s)协议URL
* 只在资源构建之前加载一次, 配置不当,可能被其他构建结果覆盖
*/
alias?: false | AliasConfig;
/** 支持postcss 以及 tailwindcss 配置 */
postcss?: false | PostCssConfig;
/**
* 资源包含配置
* 需要指定 资源包含的入口文件
* 支持在HTML中的资源包含的类型:`<f2e:include file="header.htm"/>`
* 同时支持自定义在其他资源中包含
* @default false
*/
include?: false | IncludeConfig;
}
export interface F2EConfig extends ServerConfig, Partial<MemoryTree.Options>, Partial<MiddlewareEvents> {
/**
* dev模式下 开启服务器,开启资源动态编译,开启监听文件修改刷新页面
* build模式下 关闭服务器,开启资源动态编译并压缩
* prod模式下 开启服务器,开启服务器资源缓存,关闭编译 【默认:prod模式】
*/
mode?: ConfigMode;
/** 中间件配置支持函数式或引用式 */
middlewares?: (MiddlewareCreater | MiddlewareReference)[];
/** 系统版本更新标识文件, 默认 package-lock.json */
hash_file?: string;
}
/** 通过计算得到配置 */
export type F2EConfigResult = Omit<Required<F2EConfig>, keyof MiddlewareEvents | 'middlewares'> & {
/** 系统依赖包hash */
system_hash: string;
}