@weifuwujs/weifuwu 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +605 -0
- package/dist/app.d.ts +122 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +484 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +506 -0
- package/dist/cli.js.map +1 -0
- package/dist/compose.d.ts +12 -0
- package/dist/compose.d.ts.map +1 -0
- package/dist/compose.js +29 -0
- package/dist/compose.js.map +1 -0
- package/dist/env.d.ts +12 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +46 -0
- package/dist/env.js.map +1 -0
- package/dist/group.d.ts +32 -0
- package/dist/group.d.ts.map +1 -0
- package/dist/group.js +66 -0
- package/dist/group.js.map +1 -0
- package/dist/helpers.d.ts +37 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +101 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/ioredis.d.ts +16 -0
- package/dist/ioredis.d.ts.map +1 -0
- package/dist/ioredis.js +42 -0
- package/dist/ioredis.js.map +1 -0
- package/dist/methods.d.ts +3 -0
- package/dist/methods.d.ts.map +1 -0
- package/dist/methods.js +10 -0
- package/dist/methods.js.map +1 -0
- package/dist/middleware/cors.d.ts +24 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +77 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/index.d.ts +7 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +4 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/logger.d.ts +27 -0
- package/dist/middleware/logger.d.ts.map +1 -0
- package/dist/middleware/logger.js +48 -0
- package/dist/middleware/logger.js.map +1 -0
- package/dist/middleware/static.d.ts +27 -0
- package/dist/middleware/static.d.ts.map +1 -0
- package/dist/middleware/static.js +150 -0
- package/dist/middleware/static.js.map +1 -0
- package/dist/node.d.ts +27 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +193 -0
- package/dist/node.js.map +1 -0
- package/dist/path.d.ts +9 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +31 -0
- package/dist/path.js.map +1 -0
- package/dist/postgres.d.ts +19 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/postgres.js +27 -0
- package/dist/postgres.js.map +1 -0
- package/dist/react-router.d.ts +31 -0
- package/dist/react-router.d.ts.map +1 -0
- package/dist/react-router.js +25 -0
- package/dist/react-router.js.map +1 -0
- package/dist/resources.d.ts +35 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +54 -0
- package/dist/resources.js.map +1 -0
- package/dist/router.d.ts +30 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +122 -0
- package/dist/router.js.map +1 -0
- package/dist/types.d.ts +124 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/vite.d.ts +21 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +101 -0
- package/dist/vite.js.map +1 -0
- package/dist/websocket/accept.d.ts +22 -0
- package/dist/websocket/accept.d.ts.map +1 -0
- package/dist/websocket/accept.js +104 -0
- package/dist/websocket/accept.js.map +1 -0
- package/dist/websocket/close-code.d.ts +22 -0
- package/dist/websocket/close-code.d.ts.map +1 -0
- package/dist/websocket/close-code.js +35 -0
- package/dist/websocket/close-code.js.map +1 -0
- package/dist/websocket/connection.d.ts +71 -0
- package/dist/websocket/connection.d.ts.map +1 -0
- package/dist/websocket/connection.js +287 -0
- package/dist/websocket/connection.js.map +1 -0
- package/dist/websocket/index.d.ts +7 -0
- package/dist/websocket/index.d.ts.map +1 -0
- package/dist/websocket/index.js +4 -0
- package/dist/websocket/index.js.map +1 -0
- package/dist/websocket/types.d.ts +66 -0
- package/dist/websocket/types.d.ts.map +1 -0
- package/dist/websocket/types.js +2 -0
- package/dist/websocket/types.js.map +1 -0
- package/docs/ai.md +175 -0
- package/docs/data.md +81 -0
- package/docs/migrating.md +116 -0
- package/docs/react-router.md +187 -0
- package/docs/styling.md +69 -0
- package/package.json +144 -0
- package/templates/react-router/_gitignore +3 -0
- package/templates/react-router/app/app.css +1 -0
- package/templates/react-router/app/context.ts +4 -0
- package/templates/react-router/app/root.tsx +50 -0
- package/templates/react-router/app/routes/home.tsx +17 -0
- package/templates/react-router/app/routes.ts +3 -0
- package/templates/react-router/app/server.ts +29 -0
- package/templates/react-router/package.json +29 -0
- package/templates/react-router/react-router.config.ts +5 -0
- package/templates/react-router/tsconfig.json +19 -0
- package/templates/react-router/vite.config.ts +6 -0
package/dist/app.d.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { type IncomingMessage, type RequestListener, type Server } from 'node:http';
|
|
2
|
+
import type { Duplex } from 'node:stream';
|
|
3
|
+
import { Group } from './group.ts';
|
|
4
|
+
import type { Context, ErrorHandler, Middleware, MountableApi, MountOptions, NotFoundHandler, OnRegistrar, RouteRegistrar } from './types.ts';
|
|
5
|
+
import type { WebSocketMiddleware, WsRegistrar } from './websocket/types.ts';
|
|
6
|
+
/**
|
|
7
|
+
* Fetch 风格的应用。
|
|
8
|
+
*
|
|
9
|
+
* - `app.fetch(request)` 是纯函数入口,可直接用于测试或部署到任何 Fetch 运行时
|
|
10
|
+
* - `app.listen(port)` 是 Node HTTP 适配层
|
|
11
|
+
*
|
|
12
|
+
* 泛型 `C` 会随着 `app.use(...)` 注入的数据不断累积,
|
|
13
|
+
* 从而让后续路由的 `ctx` 拥有完整类型。
|
|
14
|
+
*/
|
|
15
|
+
export declare class App<C extends Context = Context> {
|
|
16
|
+
#private;
|
|
17
|
+
/**
|
|
18
|
+
* 注册全局中间件,并把它注入的字段累积到上下文类型中。
|
|
19
|
+
*
|
|
20
|
+
* ```ts
|
|
21
|
+
* const auth: Middleware<Context, Context & { user: User }> =
|
|
22
|
+
* async (req, ctx, next) => next(req, { ...ctx, user: await verify(req) })
|
|
23
|
+
*
|
|
24
|
+
* const app = createApp().use(auth)
|
|
25
|
+
* app.get('/', (req, ctx) => json(ctx.user)) // ctx.user 有类型
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
use<Out extends Context>(middleware: Middleware<C, Out, any>): App<C & Out>;
|
|
29
|
+
/** 注册仅作用于某个路径前缀的中间件 */
|
|
30
|
+
use(prefix: string, ...middlewares: Array<Middleware<any, any, any>>): this;
|
|
31
|
+
/** 批量注册不改变上下文类型的中间件 */
|
|
32
|
+
use(...middlewares: Array<Middleware<any, any, any>>): this;
|
|
33
|
+
/**
|
|
34
|
+
* 注册进程关闭时的清理钩子。
|
|
35
|
+
*
|
|
36
|
+
* `app.close()` 会按后注册先执行的顺序运行;CLI 的 SIGINT / SIGTERM
|
|
37
|
+
* 会自动调用 `app.close()`。
|
|
38
|
+
*/
|
|
39
|
+
onClose(disposer: () => void | Promise<void>): this;
|
|
40
|
+
/**
|
|
41
|
+
* 关闭应用:按 LIFO 运行关闭钩子(含 `resource()` 资源)。
|
|
42
|
+
* 单个钩子失败只记录日志,不阻断其它;可重复调用(幂等)。
|
|
43
|
+
*
|
|
44
|
+
* **构造期绑定**:会被交给进程生命周期钩子,可能脱离实例调用或在 dev
|
|
45
|
+
* 双模块副本间传递(mandate 3.3 事故家族),因此不用原型方法。
|
|
46
|
+
*/
|
|
47
|
+
close: () => Promise<void>;
|
|
48
|
+
get: RouteRegistrar<C, '', this>;
|
|
49
|
+
post: RouteRegistrar<C, '', this>;
|
|
50
|
+
put: RouteRegistrar<C, '', this>;
|
|
51
|
+
patch: RouteRegistrar<C, '', this>;
|
|
52
|
+
delete: RouteRegistrar<C, '', this>;
|
|
53
|
+
head: RouteRegistrar<C, '', this>;
|
|
54
|
+
options: RouteRegistrar<C, '', this>;
|
|
55
|
+
/** 为同一路径注册所有标准方法 */
|
|
56
|
+
all: RouteRegistrar<C, '', this>;
|
|
57
|
+
/** 注册任意 HTTP 方法 */
|
|
58
|
+
on: OnRegistrar<C, '', this>;
|
|
59
|
+
/**
|
|
60
|
+
* 注册 WebSocket 路由。终端是每连接调用一次的工厂:
|
|
61
|
+
*
|
|
62
|
+
* ```ts
|
|
63
|
+
* app.ws('/chat/:room', async (socket, ctx) => {
|
|
64
|
+
* await join(ctx.params.room, socket) // 工厂体 = open 钩子
|
|
65
|
+
* const timer = setInterval(() => socket.ping(), 30_000)
|
|
66
|
+
* return {
|
|
67
|
+
* onMessage: (socket, message) => broadcast(ctx.params.room, message.data),
|
|
68
|
+
* onClose: () => { clearInterval(timer); leave(ctx.params.room, socket) },
|
|
69
|
+
* }
|
|
70
|
+
* })
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
ws: WsRegistrar<C, '', this>;
|
|
74
|
+
/** 注册全局 WebSocket 中间件(只作用于 upgrade 请求) */
|
|
75
|
+
wsUse(...middlewares: Array<WebSocketMiddleware<any, any>>): this;
|
|
76
|
+
/** 路由分组,统一添加前缀(前缀中的参数也会体现在 ctx.params 类型里) */
|
|
77
|
+
group<Prefix extends string>(prefix: Prefix, define: (group: Group<C, Prefix>) => void): this;
|
|
78
|
+
/** 覆盖默认 404 响应 */
|
|
79
|
+
notFound(handler: NotFoundHandler<C>): this;
|
|
80
|
+
/** 注册全局错误处理器 */
|
|
81
|
+
onError(handler: ErrorHandler<C>): this;
|
|
82
|
+
/**
|
|
83
|
+
* 挂载单源 API(`defineApi` / `defineResource` 的产物)。
|
|
84
|
+
*
|
|
85
|
+
* ```ts
|
|
86
|
+
* app.mount(api, { graphql: '/graphql' })
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
mount(api: MountableApi<C>, options?: MountOptions): this;
|
|
90
|
+
/** 纯 Fetch 入口:把一个 `Request` 变成 `Response`(构造期绑定:可脱离调用/跨副本安全) */
|
|
91
|
+
fetch: (request: Request) => Promise<Response>;
|
|
92
|
+
/**
|
|
93
|
+
* WebSocket 升级入口:匹配 ws 路由、运行 WS 中间件并完成握手。
|
|
94
|
+
*
|
|
95
|
+
* - 返回 `undefined` 表示已升级,socket 归连接接管
|
|
96
|
+
* - 返回 `Response` 表示拒绝升级(HTTP 响应写回原始 socket)
|
|
97
|
+
*
|
|
98
|
+
* 用构造期绑定的箭头函数而非原型方法:dev 下 app 经 Vite SSR 加载时,
|
|
99
|
+
* 框架模块可能存在两份副本(CLI bundle 与 SSR 运行时),原型方法读到
|
|
100
|
+
* 另一副本的 `this` 会触发私有字段 brand 错误
|
|
101
|
+
* (TypeError: Cannot read private member #wsRouter ...)。
|
|
102
|
+
*/
|
|
103
|
+
readonly upgrade: (request: Request, socket: Duplex, head?: Uint8Array, rawRequest?: IncomingMessage) => Promise<Response | undefined>;
|
|
104
|
+
/** 便捷方法:直接传入路径字符串发起内部请求(主要给测试用;构造期绑定) */
|
|
105
|
+
request: (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
106
|
+
/** 适配为 Node 的 `(req, res)` 处理函数 */
|
|
107
|
+
get handler(): RequestListener;
|
|
108
|
+
/** 把 HTTP + WebSocket 监听器挂到已有 server 上(构造期绑定:可脱离调用) */
|
|
109
|
+
attach: (server: Server) => Server;
|
|
110
|
+
/**
|
|
111
|
+
* 启动 Node HTTP Server(构造期绑定:可脱离调用)
|
|
112
|
+
*
|
|
113
|
+
* 重载签名保留在属性类型上:`listen(port, cb)` / `listen(port, hostname, cb)`。
|
|
114
|
+
*/
|
|
115
|
+
readonly listen: {
|
|
116
|
+
(port?: number, callback?: () => void): Server;
|
|
117
|
+
(port: number, hostname: string, callback?: () => void): Server;
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/** 创建应用 */
|
|
121
|
+
export declare function createApp<C extends Context = Context>(): App<C>;
|
|
122
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
import {} from 'node:http';
|
|
2
|
+
import { compose } from "./compose.js";
|
|
3
|
+
import { Group } from "./group.js";
|
|
4
|
+
import { HttpError } from "./helpers.js";
|
|
5
|
+
import { METHODS } from "./methods.js";
|
|
6
|
+
import { matchesPrefix, normalizePrefix } from "./path.js";
|
|
7
|
+
import { attachToServer, serve, toNodeHandler } from "./node.js";
|
|
8
|
+
import { Router } from "./router.js";
|
|
9
|
+
import { CLOSE_CODE } from "./websocket/close-code.js";
|
|
10
|
+
import { RESOURCE_DISPOSE } from "./resources.js";
|
|
11
|
+
import { acceptWebSocket, validateUpgradeRequest } from "./websocket/accept.js";
|
|
12
|
+
const defaultNotFound = () => new Response('Not Found', { status: 404 });
|
|
13
|
+
/**
|
|
14
|
+
* Fetch 风格的应用。
|
|
15
|
+
*
|
|
16
|
+
* - `app.fetch(request)` 是纯函数入口,可直接用于测试或部署到任何 Fetch 运行时
|
|
17
|
+
* - `app.listen(port)` 是 Node HTTP 适配层
|
|
18
|
+
*
|
|
19
|
+
* 泛型 `C` 会随着 `app.use(...)` 注入的数据不断累积,
|
|
20
|
+
* 从而让后续路由的 `ctx` 拥有完整类型。
|
|
21
|
+
*/
|
|
22
|
+
export class App {
|
|
23
|
+
#router = new Router();
|
|
24
|
+
#wsRouter = new Router();
|
|
25
|
+
#middlewares = [];
|
|
26
|
+
#wsMiddlewares = [];
|
|
27
|
+
#errorHandler = null;
|
|
28
|
+
#notFoundHandler = null;
|
|
29
|
+
#disposers = [];
|
|
30
|
+
#wsVoidWarned = new Set();
|
|
31
|
+
use(...args) {
|
|
32
|
+
if (typeof args[0] === 'string') {
|
|
33
|
+
const prefix = normalizePrefix(args[0]);
|
|
34
|
+
for (const middleware of args.slice(1)) {
|
|
35
|
+
this.#middlewares.push({ prefix, middleware });
|
|
36
|
+
this.#registerDispose(middleware);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
for (const middleware of args) {
|
|
41
|
+
this.#middlewares.push({ prefix: null, middleware });
|
|
42
|
+
this.#registerDispose(middleware);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
#registerDispose(middleware) {
|
|
48
|
+
const dispose = middleware[RESOURCE_DISPOSE];
|
|
49
|
+
if (typeof dispose === 'function')
|
|
50
|
+
this.#disposers.push(dispose);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 注册进程关闭时的清理钩子。
|
|
54
|
+
*
|
|
55
|
+
* `app.close()` 会按后注册先执行的顺序运行;CLI 的 SIGINT / SIGTERM
|
|
56
|
+
* 会自动调用 `app.close()`。
|
|
57
|
+
*/
|
|
58
|
+
onClose(disposer) {
|
|
59
|
+
this.#disposers.push(disposer);
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 关闭应用:按 LIFO 运行关闭钩子(含 `resource()` 资源)。
|
|
64
|
+
* 单个钩子失败只记录日志,不阻断其它;可重复调用(幂等)。
|
|
65
|
+
*
|
|
66
|
+
* **构造期绑定**:会被交给进程生命周期钩子,可能脱离实例调用或在 dev
|
|
67
|
+
* 双模块副本间传递(mandate 3.3 事故家族),因此不用原型方法。
|
|
68
|
+
*/
|
|
69
|
+
close = async () => {
|
|
70
|
+
const disposers = this.#disposers.splice(0).reverse();
|
|
71
|
+
for (const dispose of disposers) {
|
|
72
|
+
try {
|
|
73
|
+
await dispose();
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error(error);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
get = (path, ...handlers) => this.#route('GET', path, handlers);
|
|
81
|
+
post = (path, ...handlers) => this.#route('POST', path, handlers);
|
|
82
|
+
put = (path, ...handlers) => this.#route('PUT', path, handlers);
|
|
83
|
+
patch = (path, ...handlers) => this.#route('PATCH', path, handlers);
|
|
84
|
+
delete = (path, ...handlers) => this.#route('DELETE', path, handlers);
|
|
85
|
+
head = (path, ...handlers) => this.#route('HEAD', path, handlers);
|
|
86
|
+
options = (path, ...handlers) => this.#route('OPTIONS', path, handlers);
|
|
87
|
+
/** 为同一路径注册所有标准方法 */
|
|
88
|
+
all = (path, ...handlers) => {
|
|
89
|
+
for (const method of METHODS)
|
|
90
|
+
this.#route(method, path, handlers);
|
|
91
|
+
return this;
|
|
92
|
+
};
|
|
93
|
+
/** 注册任意 HTTP 方法 */
|
|
94
|
+
on = (method, path, ...handlers) => this.#route(method, path, handlers);
|
|
95
|
+
/**
|
|
96
|
+
* 注册 WebSocket 路由。终端是每连接调用一次的工厂:
|
|
97
|
+
*
|
|
98
|
+
* ```ts
|
|
99
|
+
* app.ws('/chat/:room', async (socket, ctx) => {
|
|
100
|
+
* await join(ctx.params.room, socket) // 工厂体 = open 钩子
|
|
101
|
+
* const timer = setInterval(() => socket.ping(), 30_000)
|
|
102
|
+
* return {
|
|
103
|
+
* onMessage: (socket, message) => broadcast(ctx.params.room, message.data),
|
|
104
|
+
* onClose: () => { clearInterval(timer); leave(ctx.params.room, socket) },
|
|
105
|
+
* }
|
|
106
|
+
* })
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
ws = (path, ...args) => {
|
|
110
|
+
const { options, middlewares, handler } = splitWsArgs(args);
|
|
111
|
+
this.#wsRouter.add({
|
|
112
|
+
method: 'GET',
|
|
113
|
+
path,
|
|
114
|
+
middlewares,
|
|
115
|
+
handler,
|
|
116
|
+
options,
|
|
117
|
+
});
|
|
118
|
+
return this;
|
|
119
|
+
};
|
|
120
|
+
/** 注册全局 WebSocket 中间件(只作用于 upgrade 请求) */
|
|
121
|
+
wsUse(...middlewares) {
|
|
122
|
+
this.#wsMiddlewares.push(...middlewares);
|
|
123
|
+
return this;
|
|
124
|
+
}
|
|
125
|
+
/** 路由分组,统一添加前缀(前缀中的参数也会体现在 ctx.params 类型里) */
|
|
126
|
+
group(prefix, define) {
|
|
127
|
+
define(new Group(this, normalizePrefix(prefix)));
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
|
+
/** 覆盖默认 404 响应 */
|
|
131
|
+
notFound(handler) {
|
|
132
|
+
this.#notFoundHandler = handler;
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
/** 注册全局错误处理器 */
|
|
136
|
+
onError(handler) {
|
|
137
|
+
this.#errorHandler = handler;
|
|
138
|
+
return this;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 挂载单源 API(`defineApi` / `defineResource` 的产物)。
|
|
142
|
+
*
|
|
143
|
+
* ```ts
|
|
144
|
+
* app.mount(api, { graphql: '/graphql' })
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
mount(api, options = {}) {
|
|
148
|
+
if (options.rest !== false) {
|
|
149
|
+
for (const route of api.routes()) {
|
|
150
|
+
this.#route(route.method, route.path, [route.handler]);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (typeof options.graphql === 'string') {
|
|
154
|
+
if (!api.graphqlHandler) {
|
|
155
|
+
throw new Error('This API does not provide a GraphQL handler');
|
|
156
|
+
}
|
|
157
|
+
const handler = api.graphqlHandler();
|
|
158
|
+
this.#route('GET', options.graphql, [handler]);
|
|
159
|
+
this.#route('POST', options.graphql, [handler]);
|
|
160
|
+
}
|
|
161
|
+
return this;
|
|
162
|
+
}
|
|
163
|
+
/** 纯 Fetch 入口:把一个 `Request` 变成 `Response`(构造期绑定:可脱离调用/跨副本安全) */
|
|
164
|
+
fetch = async (request) => {
|
|
165
|
+
const url = new URL(request.url);
|
|
166
|
+
const method = (request.method || 'GET').toUpperCase();
|
|
167
|
+
const ctx = {
|
|
168
|
+
params: {},
|
|
169
|
+
query: queryFromURL(url),
|
|
170
|
+
};
|
|
171
|
+
let routeEntry = null;
|
|
172
|
+
let allowed = [];
|
|
173
|
+
const result = this.#router.match(method, url.pathname);
|
|
174
|
+
if (result.type === 'match') {
|
|
175
|
+
routeEntry = result.entry;
|
|
176
|
+
Object.assign(ctx.params, result.params);
|
|
177
|
+
}
|
|
178
|
+
else if (result.type === 'method') {
|
|
179
|
+
allowed = result.allowed;
|
|
180
|
+
}
|
|
181
|
+
const chain = [];
|
|
182
|
+
for (const entry of this.#middlewares) {
|
|
183
|
+
if (entry.prefix === null) {
|
|
184
|
+
chain.push(entry.middleware);
|
|
185
|
+
}
|
|
186
|
+
else if (matchesPrefix(entry.prefix, url.pathname)) {
|
|
187
|
+
chain.push(scopeToPrefix(entry.prefix, entry.middleware));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
let handler;
|
|
191
|
+
if (routeEntry) {
|
|
192
|
+
chain.push(...routeEntry.middlewares);
|
|
193
|
+
handler = routeEntry.handler;
|
|
194
|
+
}
|
|
195
|
+
else if (allowed.length > 0) {
|
|
196
|
+
const allowHeader = allowed.join(', ');
|
|
197
|
+
handler =
|
|
198
|
+
method === 'OPTIONS'
|
|
199
|
+
? () => new Response(null, { status: 204, headers: { allow: allowHeader } })
|
|
200
|
+
: () => new Response('Method Not Allowed', {
|
|
201
|
+
status: 405,
|
|
202
|
+
headers: { allow: allowHeader },
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
handler = this.#notFoundHandler ?? defaultNotFound;
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
const response = await compose(chain, handler)(request, ctx);
|
|
210
|
+
if (response instanceof Response)
|
|
211
|
+
return response;
|
|
212
|
+
// 注册位接受任意 R 的中间件(同一实例可在 HTTP/WS 双端复用);
|
|
213
|
+
// HTTP 链的结果必须是 Response,否则给出可定位的错误而不是静默 TypeError。
|
|
214
|
+
throw new Error(`HTTP 中间件链必须返回 Response,实际收到 ${String(response)}` +
|
|
215
|
+
'(WS 专用中间件请注册到 app.wsUse / app.ws)');
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
const errorHandler = this.#errorHandler;
|
|
219
|
+
if (errorHandler) {
|
|
220
|
+
try {
|
|
221
|
+
const response = await errorHandler(error, request, ctx);
|
|
222
|
+
if (response)
|
|
223
|
+
return response;
|
|
224
|
+
}
|
|
225
|
+
catch (nested) {
|
|
226
|
+
console.error(nested);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (error instanceof HttpError)
|
|
230
|
+
return error.toResponse();
|
|
231
|
+
console.error(error);
|
|
232
|
+
return new Response('Internal Server Error', { status: 500 });
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
/**
|
|
236
|
+
* WebSocket 升级入口:匹配 ws 路由、运行 WS 中间件并完成握手。
|
|
237
|
+
*
|
|
238
|
+
* - 返回 `undefined` 表示已升级,socket 归连接接管
|
|
239
|
+
* - 返回 `Response` 表示拒绝升级(HTTP 响应写回原始 socket)
|
|
240
|
+
*
|
|
241
|
+
* 用构造期绑定的箭头函数而非原型方法:dev 下 app 经 Vite SSR 加载时,
|
|
242
|
+
* 框架模块可能存在两份副本(CLI bundle 与 SSR 运行时),原型方法读到
|
|
243
|
+
* 另一副本的 `this` 会触发私有字段 brand 错误
|
|
244
|
+
* (TypeError: Cannot read private member #wsRouter ...)。
|
|
245
|
+
*/
|
|
246
|
+
upgrade = async (request, socket, head, rawRequest) => {
|
|
247
|
+
const url = new URL(request.url);
|
|
248
|
+
const ctx = { params: {}, query: queryFromURL(url) };
|
|
249
|
+
const result = this.#wsRouter.match('GET', url.pathname);
|
|
250
|
+
const chain = [...this.#wsMiddlewares];
|
|
251
|
+
let route = null;
|
|
252
|
+
if (result.type === 'match') {
|
|
253
|
+
route = result.entry;
|
|
254
|
+
Object.assign(ctx.params, result.params);
|
|
255
|
+
chain.push(...route.middlewares);
|
|
256
|
+
}
|
|
257
|
+
const options = route?.options ?? {};
|
|
258
|
+
const handler = route?.handler;
|
|
259
|
+
const terminal = async (req, terminalCtx) => {
|
|
260
|
+
if (!handler)
|
|
261
|
+
return new Response('Not Found', { status: 404 });
|
|
262
|
+
const refusal = validateUpgradeRequest(req);
|
|
263
|
+
if (refusal)
|
|
264
|
+
return refusal;
|
|
265
|
+
const connection = acceptWebSocket(socket, req, { ...options, head, rawRequest });
|
|
266
|
+
// 工厂每连接调用一次,可以异步(查库/鉴权/加载房间)。结算前到达的消息由连接
|
|
267
|
+
// 缓冲(#early),布线在工厂返回后立即完成——不再依赖“同步注册监听器”。
|
|
268
|
+
let lifecycle;
|
|
269
|
+
try {
|
|
270
|
+
lifecycle = await handler(connection, terminalCtx);
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
await this.#failConnection(error, req, terminalCtx, null, connection, {
|
|
274
|
+
close: true,
|
|
275
|
+
viaOnError: false,
|
|
276
|
+
});
|
|
277
|
+
return undefined;
|
|
278
|
+
}
|
|
279
|
+
if (lifecycle) {
|
|
280
|
+
this.#wireLifecycle(connection, lifecycle, terminalCtx, req);
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
this.#warnIfUnconsumedWs(connection, route?.path ?? url.pathname);
|
|
284
|
+
}
|
|
285
|
+
connection.start();
|
|
286
|
+
return undefined;
|
|
287
|
+
};
|
|
288
|
+
try {
|
|
289
|
+
const result = await compose(chain, terminal)(request, ctx);
|
|
290
|
+
return result ?? undefined;
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
if (error instanceof HttpError)
|
|
294
|
+
return error.toResponse();
|
|
295
|
+
console.error(error);
|
|
296
|
+
return new Response('Internal Server Error', { status: 500 });
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
/**
|
|
300
|
+
* 接线连接生命周期:所有回调都在 `connection.start()` 之前注册,
|
|
301
|
+
* 消息按到达顺序串行 await,`onClose` 恰好一次。
|
|
302
|
+
*/
|
|
303
|
+
#wireLifecycle(connection, lifecycle, ctx, req) {
|
|
304
|
+
let queue = Promise.resolve();
|
|
305
|
+
const run = (task, options = {
|
|
306
|
+
close: true,
|
|
307
|
+
viaOnError: true,
|
|
308
|
+
}) => {
|
|
309
|
+
queue = queue
|
|
310
|
+
.then(task)
|
|
311
|
+
.catch((error) => this.#failConnection(error, req, ctx, lifecycle, connection, options))
|
|
312
|
+
// #failConnection 自身出错也不能让队列永久 reject
|
|
313
|
+
.catch((error) => console.error(error));
|
|
314
|
+
};
|
|
315
|
+
connection.on('message', (data, isBinary) => {
|
|
316
|
+
run(() => lifecycle.onMessage?.(connection, { data, binary: isBinary }, ctx));
|
|
317
|
+
});
|
|
318
|
+
connection.on('close', (code, reason) => {
|
|
319
|
+
run(() => lifecycle.onClose?.(connection, code, reason, ctx), {
|
|
320
|
+
close: false,
|
|
321
|
+
viaOnError: true,
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
connection.on('error', (error) => {
|
|
325
|
+
run(() => lifecycle.onError?.(connection, error, ctx), {
|
|
326
|
+
close: false,
|
|
327
|
+
viaOnError: false,
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* 连接级错误路由:`onError`(若有)→ `app.onError` → `console.error`;
|
|
333
|
+
* 业务回调抛出的错误默认以 1011 关闭连接。
|
|
334
|
+
*/
|
|
335
|
+
async #failConnection(error, req, ctx, lifecycle, connection, options) {
|
|
336
|
+
const failure = error instanceof Error ? error : new Error(String(error));
|
|
337
|
+
const onError = lifecycle?.onError;
|
|
338
|
+
if (options.viaOnError && onError) {
|
|
339
|
+
try {
|
|
340
|
+
await onError(connection, failure, ctx);
|
|
341
|
+
}
|
|
342
|
+
catch (nested) {
|
|
343
|
+
await this.#reportWsError(nested, req, ctx);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
await this.#reportWsError(failure, req, ctx);
|
|
348
|
+
}
|
|
349
|
+
if (options.close && connection.readyState === 'open') {
|
|
350
|
+
connection.close(CLOSE_CODE.INTERNAL_ERROR, 'Internal Server Error');
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
async #reportWsError(error, req, ctx) {
|
|
354
|
+
const errorHandler = this.#errorHandler;
|
|
355
|
+
if (errorHandler) {
|
|
356
|
+
try {
|
|
357
|
+
await errorHandler(error, req, ctx);
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
catch (nested) {
|
|
361
|
+
console.error(nested);
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
console.error(error);
|
|
366
|
+
}
|
|
367
|
+
/** dev 护栏:工厂忘了 return 生命周期对象时,消息会被静默丢弃 */
|
|
368
|
+
#warnIfUnconsumedWs(connection, path) {
|
|
369
|
+
if (isProduction())
|
|
370
|
+
return;
|
|
371
|
+
if (connection.hasMessageConsumer())
|
|
372
|
+
return;
|
|
373
|
+
if (this.#wsVoidWarned.has(path))
|
|
374
|
+
return;
|
|
375
|
+
this.#wsVoidWarned.add(path);
|
|
376
|
+
console.warn(`[weifuwu] app.ws('${path}') 的工厂返回了 void,且该连接没有消息消费者` +
|
|
377
|
+
'(onMessage / socket.on("message") / for await);收到的消息将被丢弃。' +
|
|
378
|
+
'若是有意的纯流式模式请忽略,否则请从工厂 return { onMessage, ... }。');
|
|
379
|
+
}
|
|
380
|
+
/** 便捷方法:直接传入路径字符串发起内部请求(主要给测试用;构造期绑定) */
|
|
381
|
+
request = (input, init) => {
|
|
382
|
+
if (input instanceof Request)
|
|
383
|
+
return this.fetch(input);
|
|
384
|
+
const url = typeof input === 'string' ? new URL(input, 'http://localhost') : input;
|
|
385
|
+
return this.fetch(new Request(url, init));
|
|
386
|
+
};
|
|
387
|
+
/** 适配为 Node 的 `(req, res)` 处理函数 */
|
|
388
|
+
get handler() {
|
|
389
|
+
return toNodeHandler(this);
|
|
390
|
+
}
|
|
391
|
+
/** 把 HTTP + WebSocket 监听器挂到已有 server 上(构造期绑定:可脱离调用) */
|
|
392
|
+
attach = (server) => {
|
|
393
|
+
return attachToServer(this, server);
|
|
394
|
+
};
|
|
395
|
+
/**
|
|
396
|
+
* 启动 Node HTTP Server(构造期绑定:可脱离调用)
|
|
397
|
+
*
|
|
398
|
+
* 重载签名保留在属性类型上:`listen(port, cb)` / `listen(port, hostname, cb)`。
|
|
399
|
+
*/
|
|
400
|
+
listen = (port = 3000, hostnameOrCallback, callback) => {
|
|
401
|
+
const hostname = typeof hostnameOrCallback === 'string' ? hostnameOrCallback : undefined;
|
|
402
|
+
const onListening = typeof hostnameOrCallback === 'function' ? hostnameOrCallback : callback;
|
|
403
|
+
const server = serve(this, { port, hostname });
|
|
404
|
+
if (onListening)
|
|
405
|
+
server.once('listening', onListening);
|
|
406
|
+
return server;
|
|
407
|
+
};
|
|
408
|
+
#route(method, path, handlers) {
|
|
409
|
+
const list = [...handlers];
|
|
410
|
+
const handler = list.pop();
|
|
411
|
+
if (!handler) {
|
|
412
|
+
throw new Error(`Route ${method} ${path} requires a handler`);
|
|
413
|
+
}
|
|
414
|
+
this.#router.add({
|
|
415
|
+
method,
|
|
416
|
+
path,
|
|
417
|
+
middlewares: list,
|
|
418
|
+
handler,
|
|
419
|
+
});
|
|
420
|
+
return this;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
function queryFromURL(url) {
|
|
424
|
+
const query = {};
|
|
425
|
+
for (const [key, value] of url.searchParams) {
|
|
426
|
+
if (!Object.prototype.hasOwnProperty.call(query, key))
|
|
427
|
+
query[key] = value;
|
|
428
|
+
}
|
|
429
|
+
return query;
|
|
430
|
+
}
|
|
431
|
+
function splitWsArgs(args) {
|
|
432
|
+
const list = [...args];
|
|
433
|
+
const handler = list.pop();
|
|
434
|
+
if (typeof handler !== 'function') {
|
|
435
|
+
// 工厂必须是函数:`(socket, ctx) => lifecycle | void`
|
|
436
|
+
throw new Error('WebSocket route requires a handler factory');
|
|
437
|
+
}
|
|
438
|
+
let options = {};
|
|
439
|
+
const first = list[0];
|
|
440
|
+
if (typeof first === 'object' && first !== null && !Array.isArray(first)) {
|
|
441
|
+
options = list.shift();
|
|
442
|
+
}
|
|
443
|
+
return {
|
|
444
|
+
options,
|
|
445
|
+
middlewares: list,
|
|
446
|
+
handler: handler,
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* 路径中间件(Express 风格):进入时把 URL 前缀去掉,
|
|
451
|
+
* 调用 `next()` 时再还原,从而让 `serveStatic` 这类中间件
|
|
452
|
+
* 可以像 `app.use('/assets', serveStatic('./public'))` 这样挂载。
|
|
453
|
+
*/
|
|
454
|
+
function scopeToPrefix(prefix, middleware) {
|
|
455
|
+
if (prefix === '/')
|
|
456
|
+
return middleware;
|
|
457
|
+
return (req, ctx, next) => {
|
|
458
|
+
const scoped = stripPrefix(req, prefix);
|
|
459
|
+
return middleware(scoped, ctx, (nextReq, nextCtx) => next(nextReq === scoped ? req : nextReq, nextCtx));
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
function stripPrefix(req, prefix) {
|
|
463
|
+
const url = new URL(req.url);
|
|
464
|
+
const rest = url.pathname.slice(prefix.length);
|
|
465
|
+
url.pathname = rest.startsWith('/') ? rest : `/${rest}`;
|
|
466
|
+
const init = {
|
|
467
|
+
method: req.method,
|
|
468
|
+
headers: req.headers,
|
|
469
|
+
body: req.body,
|
|
470
|
+
signal: req.signal,
|
|
471
|
+
};
|
|
472
|
+
if (req.body)
|
|
473
|
+
init.duplex = 'half';
|
|
474
|
+
return new Request(url, init);
|
|
475
|
+
}
|
|
476
|
+
/** 创建应用 */
|
|
477
|
+
export function createApp() {
|
|
478
|
+
return new App();
|
|
479
|
+
}
|
|
480
|
+
/** dev 护栏只在非生产环境生效 */
|
|
481
|
+
function isProduction() {
|
|
482
|
+
return typeof process !== 'undefined' && process.env?.NODE_ENV === 'production';
|
|
483
|
+
}
|
|
484
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|