dynapm 1.0.13 → 1.0.14
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/CHANGELOG.md +32 -13
- package/CLAUDE.md +8 -16
- package/README.md +18 -22
- package/README_zh.md +19 -16
- package/TASK.md +53 -0
- package/dist/src/core/admin-api.d.ts +4 -0
- package/dist/src/core/gateway.d.ts +12 -16
- package/dist/src/index.js +650 -614
- package/package.json +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -5,26 +5,45 @@
|
|
|
5
5
|
格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
|
|
6
6
|
版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
7
7
|
|
|
8
|
+
## [1.0.14] - 2026-03-20
|
|
9
|
+
|
|
10
|
+
### 🔴 Bug 修复
|
|
11
|
+
- **按需启动 POST 请求体丢失(严重)**: uWS 的 onData 回调中 ArrayBuffer 是借用语义,`Buffer.from(ab)` 底层数据被后续回调覆盖。改用 `Buffer.alloc + copy` 确保数据复制
|
|
12
|
+
- **并发按需启动返回 502**: 多个请求同时到达离线服务时,只有第一个触发启动,其他请求等待启动完成后再代理
|
|
13
|
+
- **transfer-encoding 头冲突**: forwardProxyRequest 中过滤 transfer-encoding 头,避免与 content-length 冲突导致后端 400
|
|
14
|
+
- **后端崩溃自动恢复**: 检测到后端不可达(ECONNREFUSED)时,自动将非 proxyOnly 服务状态重置为 offline
|
|
15
|
+
- **端口路由并发启动**: handlePortBindingRequest 补全 starting/stopping 状态处理,与 hostname 路由保持一致
|
|
16
|
+
|
|
17
|
+
### 🔒 安全加固
|
|
18
|
+
- 请求体大小限制 10MB,防止 DoS 攻击
|
|
19
|
+
- WebSocket 消息队列限制 1000 条,防止内存泄漏
|
|
20
|
+
- CRLF 注入防护:请求头值中的 `\r\n` 被清理
|
|
21
|
+
- 端口路由 WebSocket close handler 补充后端连接清理
|
|
22
|
+
|
|
23
|
+
### 🚀 性能优化
|
|
24
|
+
- **去除 undici,恢复原生 http 模块**: 吞吐量从 4,523 提升至 **5,942 req/s(+31%)**,延迟从 10.6ms 降至 **10.3ms**
|
|
25
|
+
- 预编译 CRLF 正则,避免热路径重复创建
|
|
26
|
+
- Set 替代内联条件判断,优化请求头跳过逻辑
|
|
27
|
+
|
|
28
|
+
### 🧪 测试(81 个用例全部通过)
|
|
29
|
+
- test-proxy-comprehensive.ts: 23 个综合代理测试
|
|
30
|
+
- test-edge-cases.ts: 15 个极端场景测试
|
|
31
|
+
- test-gateway-robustness.ts: 13 个健壮性测试
|
|
32
|
+
- test-admin-api-lifecycle.ts: 12 个管理 API 生命周期测试
|
|
33
|
+
- test-port-route-start.ts: 9 个端口路由按需启动测试
|
|
34
|
+
- test-security-stability.ts: 9 个安全与稳定性深度测试
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
8
38
|
## [1.0.13] - 2026-02-10
|
|
9
39
|
|
|
10
40
|
### 🚀 性能优化
|
|
11
|
-
-
|
|
12
|
-
- 吞吐量提升 **28.2%**:4345 → 5571 req/s
|
|
13
|
-
- 延迟保持 11.4ms(无退化)
|
|
14
|
-
- 使用 `undici.request()` API 实现流式转发
|
|
15
|
-
- 避免了 `undici.stream()` + Writable stream 的包装开销
|
|
41
|
+
- 使用 undici 替代原生 http 模块(已在 v1.0.14 回退,原生 http 性能更优)
|
|
16
42
|
|
|
17
43
|
### 🔧 改进
|
|
18
|
-
-
|
|
19
|
-
- 清理 RouteMapping 中的冗余字段(isHttps、httpModule、httpAgent)
|
|
44
|
+
- 清理 RouteMapping 中的冗余字段
|
|
20
45
|
- 代码更简洁,维护性更好
|
|
21
46
|
|
|
22
|
-
### 📚 技术细节
|
|
23
|
-
- undici 的 `request()` API 比 `stream()` API 更适合代理场景
|
|
24
|
-
- `stream()` 适用于消费响应(写入文件、解析 JSON)
|
|
25
|
-
- `request()` 返回 Readable stream,可以手动控制流式转发
|
|
26
|
-
- 完全保持流式处理,客户端延迟无增加
|
|
27
|
-
|
|
28
47
|
---
|
|
29
48
|
|
|
30
49
|
## [1.0.12] - 2026-02-10
|
package/CLAUDE.md
CHANGED
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
# DynaPM - Claude Code 项目配置
|
|
2
2
|
|
|
3
|
-
DynaPM
|
|
3
|
+
DynaPM 是一个智能网关(类似nginx)/进程管理工具(类似pm2),通过按需启动(请求到达时通过查找配置判断请求属于哪个程序,然后网关转发请求,当程序还未启动会执行启动命令等待就绪后再实际转发)和闲置自动停止的方式,帮助用户在资源受限的服务器上运行成千上万个低频访问+少量高频访问的服务。
|
|
4
4
|
|
|
5
5
|
**核心特性:**
|
|
6
|
-
- ⚡
|
|
7
|
-
- 🚀
|
|
6
|
+
- ⚡ 极速冷启动
|
|
7
|
+
- 🚀 双向流式转发代理实现极低的请求延迟:将请求体流式给代理服务,将代理服务的响应流式给请求者 所以不需要缓冲请求或者响应,唯一的需要缓冲的时机就是请求到达网关,但是需要被网关唤起的程序还没有启动成功的时候
|
|
8
8
|
- 🌐 支持 SSE 和 WebSocket
|
|
9
|
-
- 🎛️
|
|
10
|
-
- 🔄
|
|
9
|
+
- 🎛️ 基于bash的通用服务管理(可用于管理PM2、Docker、systemd 等任意服务)
|
|
10
|
+
- 🔄 闲置自动回收资源
|
|
11
11
|
|
|
12
12
|
## 技术栈
|
|
13
13
|
|
|
14
14
|
- **运行时**: Node.js 22+
|
|
15
|
-
- **Web 框架**: uWebSockets.js
|
|
16
|
-
- **日志**: Pino
|
|
15
|
+
- **Web 框架**: uWebSockets.js(最佳性能)
|
|
16
|
+
- **日志**: Pino
|
|
17
17
|
- **配置**: c12(支持 TypeScript)
|
|
18
|
-
- **构建**: rslib
|
|
19
18
|
- **包管理**: pnpm
|
|
20
19
|
- **测试**: tsx + 自定义测试套件
|
|
21
20
|
|
|
@@ -37,8 +36,6 @@ DynaPM/
|
|
|
37
36
|
│ ├── test-all.ts # 完整测试套件(12个测试)
|
|
38
37
|
│ ├── server-*.ts # 测试服务器
|
|
39
38
|
│ └── benchmark.js # 性能测试
|
|
40
|
-
├── docs/
|
|
41
|
-
│ └── NPM_OIDC_SETUP.md # npm OIDC 发布配置指南
|
|
42
39
|
├── .github/workflows/
|
|
43
40
|
│ └── release.yml # 自动发布到 npm
|
|
44
41
|
├── CHANGELOG.md # 版本更新日志
|
|
@@ -49,12 +46,7 @@ DynaPM/
|
|
|
49
46
|
|
|
50
47
|
## 开发指南
|
|
51
48
|
|
|
52
|
-
### 快速开始
|
|
53
|
-
|
|
54
49
|
```bash
|
|
55
|
-
# 安装依赖
|
|
56
|
-
pnpm install
|
|
57
|
-
|
|
58
50
|
# 运行测试
|
|
59
51
|
pnpm test
|
|
60
52
|
|
|
@@ -67,4 +59,4 @@ pnpm benchmark
|
|
|
67
59
|
|
|
68
60
|
### 发布新版本
|
|
69
61
|
|
|
70
|
-
流程 : CHANGELOG → commit
|
|
62
|
+
流程 : CHANGELOG → commit →更新 npm version (git add tag) →git push (github actions 会通过 oicd 发包 npm )
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
> **Dynamic Process Manager** - A lightweight, universal service management system with serverless-like features.
|
|
6
6
|
|
|
7
|
-
[](https://www.npmjs.com/package/dynapm) ](https://www.npmjs.com/package/dynapm)  
|
|
8
8
|
|
|
9
9
|
DynaPM is a **lightweight alternative** to complex container orchestration platforms (like Knative, Sablier) for private deployments. It helps you manage hundreds of low-frequency services on resource-constrained servers by starting them on-demand and stopping them when idle.
|
|
10
10
|
|
|
@@ -57,7 +57,7 @@ You have many side projects or internal tools that:
|
|
|
57
57
|
|
|
58
58
|
- **DynaPM overhead**: Only **25ms** (startup command: 8ms + port wait: 17ms)
|
|
59
59
|
- **Instant retry**: Zero-delay polling, forward immediately when port is ready
|
|
60
|
-
- **Total cold start**: ~
|
|
60
|
+
- **Total cold start**: ~185ms (including service boot time, e.g., ~160ms for Node.js apps)
|
|
61
61
|
|
|
62
62
|
### 🚀 **Stream Proxying**
|
|
63
63
|
|
|
@@ -147,9 +147,9 @@ Configure ANY service using bash commands - no limits:
|
|
|
147
147
|
```
|
|
148
148
|
Test Environment: Node.js HTTP Server (autocannon benchmark)
|
|
149
149
|
|
|
150
|
-
✅ Cold start: ~
|
|
151
|
-
✅ Stream proxy: Avg
|
|
152
|
-
✅ Throughput:
|
|
150
|
+
✅ Cold start: ~185ms (DynaPM: 25ms + service boot: 160ms)
|
|
151
|
+
✅ Stream proxy: Avg 10.3ms (range: 9-12ms)
|
|
152
|
+
✅ Throughput: 5,942 req/s (multi-service, 150 concurrent)
|
|
153
153
|
✅ Load test: Low latency even under high concurrency
|
|
154
154
|
✅ Memory overhead: ~50MB (Node.js runtime)
|
|
155
155
|
✅ Bundle size: 21.7KB (minified)
|
|
@@ -245,7 +245,7 @@ pnpm test
|
|
|
245
245
|
|
|
246
246
|
### Test Coverage
|
|
247
247
|
|
|
248
|
-
The automated tests validate
|
|
248
|
+
The automated tests validate 81 test cases across 6 test suites:
|
|
249
249
|
|
|
250
250
|
1. ✅ **On-demand start** - Services auto-start when offline
|
|
251
251
|
2. ✅ **Hot start** - Direct proxy when service is running
|
|
@@ -259,6 +259,9 @@ The automated tests validate 12 core functionalities:
|
|
|
259
259
|
10. ✅ **SSE streaming** - Server-Sent Events proxy support
|
|
260
260
|
11. ✅ **WebSocket** - WebSocket bidirectional communication support
|
|
261
261
|
12. ✅ **Long connections** - Active connections prevent premature shutdown
|
|
262
|
+
13. ✅ **Concurrent startup** - Multiple requests to offline service
|
|
263
|
+
14. ✅ **Security hardening** - Body size limits, CRLF injection protection
|
|
264
|
+
15. ✅ **Port routing** - Direct port-based proxy and on-demand start
|
|
262
265
|
|
|
263
266
|
### Test Output Example
|
|
264
267
|
|
|
@@ -426,8 +429,8 @@ Test: Total time from offline to first accessible request
|
|
|
426
429
|
|
|
427
430
|
Results:
|
|
428
431
|
├─ DynaPM overhead: 25ms (startup command: 8ms + TCP port wait: 17ms)
|
|
429
|
-
├─ Service boot:
|
|
430
|
-
└─ Total cold start:
|
|
432
|
+
├─ Service boot: 160ms (Node.js application)
|
|
433
|
+
└─ Total cold start: 185ms
|
|
431
434
|
```
|
|
432
435
|
|
|
433
436
|
### Stream Proxy Performance
|
|
@@ -436,30 +439,23 @@ Results:
|
|
|
436
439
|
Test: Single request latency when service is running
|
|
437
440
|
|
|
438
441
|
Results:
|
|
439
|
-
├─ Average latency:
|
|
440
|
-
├─ Min latency:
|
|
442
|
+
├─ Average latency: 10.3ms
|
|
443
|
+
├─ Min latency: 9ms
|
|
441
444
|
├─ Max latency: 12ms
|
|
442
|
-
└─ Latency range:
|
|
445
|
+
└─ Latency range: 9-12ms
|
|
443
446
|
```
|
|
444
447
|
|
|
445
448
|
### Throughput Performance
|
|
446
449
|
|
|
447
450
|
```
|
|
448
|
-
Test: Multi-service benchmark (3 services ×
|
|
451
|
+
Test: Multi-service benchmark (3 services × 50 concurrent, 5 seconds)
|
|
449
452
|
|
|
450
453
|
Results:
|
|
451
|
-
├─ Total requests:
|
|
452
|
-
├─ Average throughput:
|
|
453
|
-
├─ Per-service:
|
|
454
|
+
├─ Total requests: 29,710 requests
|
|
455
|
+
├─ Average throughput: 5,942 req/s
|
|
456
|
+
├─ Per-service: ~1,980 req/s
|
|
454
457
|
├─ Errors: 0
|
|
455
458
|
└─ Test duration: 5 seconds
|
|
456
|
-
|
|
457
|
-
Test: Single service benchmark (50 concurrent, 5 seconds)
|
|
458
|
-
|
|
459
|
-
Results:
|
|
460
|
-
├─ Requests/sec: 4,225+ req/s
|
|
461
|
-
├─ Average latency: ~23ms
|
|
462
|
-
└─ Total requests: 21k requests
|
|
463
459
|
```
|
|
464
460
|
|
|
465
461
|
### Resource Usage
|
package/README_zh.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
> **动态进程管理器** - 具有类 serverless 特性的轻量级通用服务管理系统
|
|
6
6
|
|
|
7
|
-
[](https://www.npmjs.com/package/dynapm) ](https://www.npmjs.com/package/dynapm)  
|
|
8
8
|
|
|
9
9
|
DynaPM 是**复杂容器编排平台(如 Knative、Sablier)的轻量级替代方案**,专为私有化部署设计。它通过按需启动和闲置自动停止的方式,帮助你在资源受限的服务器上管理数百个低频访问的服务。
|
|
10
10
|
|
|
@@ -57,7 +57,7 @@ DynaPM 是**复杂容器编排平台(如 Knative、Sablier)的轻量级替
|
|
|
57
57
|
|
|
58
58
|
- **DynaPM 开销**:仅 **25ms**(启动命令 8ms + 端口等待 17ms)
|
|
59
59
|
- **失败立即重试**:无延迟轮询,端口可用即刻转发
|
|
60
|
-
- **总冷启动**:~
|
|
60
|
+
- **总冷启动**:~185ms(包括服务本身启动时间,如 Node.js 应用 ~160ms)
|
|
61
61
|
|
|
62
62
|
### 🚀 **流式代理**
|
|
63
63
|
|
|
@@ -146,9 +146,9 @@ DynaPM 原生支持现代实时通信协议:
|
|
|
146
146
|
```
|
|
147
147
|
测试环境:Node.js HTTP 服务器 (autocannon 压测)
|
|
148
148
|
|
|
149
|
-
✅ 冷启动时间: ~
|
|
150
|
-
✅ 流式代理延迟: 平均
|
|
151
|
-
✅ 吞吐量:
|
|
149
|
+
✅ 冷启动时间: ~185ms (DynaPM: 25ms + 服务启动: 160ms)
|
|
150
|
+
✅ 流式代理延迟: 平均 10.3ms (范围: 9-12ms)
|
|
151
|
+
✅ 吞吐量: 5,942 req/s (多服务, 150 并发)
|
|
152
152
|
✅ 压测延迟: 高并发下保持低延迟
|
|
153
153
|
✅ 内存开销: ~50MB (Node.js 运行时)
|
|
154
154
|
✅ 代码体积: 21.7KB (压缩后)
|
|
@@ -244,7 +244,7 @@ pnpm test
|
|
|
244
244
|
|
|
245
245
|
### 测试覆盖场景
|
|
246
246
|
|
|
247
|
-
自动化测试会验证以下
|
|
247
|
+
自动化测试会验证以下 81 个测试用例(6 个测试套件):
|
|
248
248
|
|
|
249
249
|
1. ✅ **按需启动** - 服务离线时自动启动
|
|
250
250
|
2. ✅ **热启动** - 服务运行时直接代理,无需重新启动
|
|
@@ -258,6 +258,9 @@ pnpm test
|
|
|
258
258
|
10. ✅ **SSE 流式传输** - Server-Sent Events 代理支持
|
|
259
259
|
11. ✅ **WebSocket** - WebSocket 双向通信支持
|
|
260
260
|
12. ✅ **长连接代理** - 活跃连接阻止服务被提前关闭
|
|
261
|
+
13. ✅ **并发启动** - 多个请求同时到达离线服务
|
|
262
|
+
14. ✅ **安全加固** - 请求体大小限制、CRLF 注入防护
|
|
263
|
+
15. ✅ **端口路由** - 端口直连代理和按需启动
|
|
261
264
|
|
|
262
265
|
### 测试输出示例
|
|
263
266
|
|
|
@@ -424,8 +427,8 @@ npm install -g autocannon
|
|
|
424
427
|
|
|
425
428
|
结果:
|
|
426
429
|
├─ DynaPM 开销: 25ms (启动命令 8ms + TCP 端口等待 17ms)
|
|
427
|
-
├─ 服务启动时间:
|
|
428
|
-
└─ 总冷启动时间:
|
|
430
|
+
├─ 服务启动时间: 160ms (Node.js 应用)
|
|
431
|
+
└─ 总冷启动时间: 185ms
|
|
429
432
|
```
|
|
430
433
|
|
|
431
434
|
### 流式代理性能
|
|
@@ -434,22 +437,22 @@ npm install -g autocannon
|
|
|
434
437
|
测试:服务运行时的单次请求延迟
|
|
435
438
|
|
|
436
439
|
结果:
|
|
437
|
-
├─ 平均延迟:
|
|
438
|
-
├─ 最小延迟:
|
|
440
|
+
├─ 平均延迟: 10.3ms
|
|
441
|
+
├─ 最小延迟: 9ms
|
|
439
442
|
├─ 最大延迟: 12ms
|
|
440
|
-
└─ 延迟范围:
|
|
443
|
+
└─ 延迟范围: 9-12ms
|
|
441
444
|
```
|
|
442
445
|
|
|
443
446
|
### 吞吐量性能
|
|
444
447
|
|
|
445
448
|
```
|
|
446
|
-
|
|
449
|
+
测试:多服务混合压测 (3 服务 × 50 并发, 5 秒)
|
|
447
450
|
|
|
448
451
|
结果:
|
|
449
|
-
├─ 请求数/秒:
|
|
450
|
-
├─ 平均延迟:
|
|
451
|
-
├─ 总请求数:
|
|
452
|
-
└─ 测试时长:
|
|
452
|
+
├─ 请求数/秒: 5,942 req/s
|
|
453
|
+
├─ 平均延迟: ~10ms
|
|
454
|
+
├─ 总请求数: 29,710 requests
|
|
455
|
+
└─ 测试时长: 5 秒
|
|
453
456
|
```
|
|
454
457
|
|
|
455
458
|
### 资源占用
|
package/TASK.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
具有类 serverless 特性的轻量级通用服务管理系统:dynapm
|
|
2
|
+
## dynapm 开发
|
|
3
|
+
|
|
4
|
+
/loop 先检查 TASK.md 中是否有未完成的任务请逐项完成并在充分test验证再继续下一项,如果没有则请请完善当前项目:测试更多代理场景,确保网关程序没有问题,监测并优化程序性能,修改完毕后需要使用 pilot 进行实际运行测试,请自我完善,不要询问我任何事情,也不要切换其他模式(例如 plan mode)
|
|
5
|
+
作为网关的测试一定要非常严谨,测试各种可能的情况以及极端情况。
|
|
6
|
+
所有文件使用 ts,需要临时运行的使用 node --experimental-strip-types -e xxx.ts 来执行
|
|
7
|
+
|
|
8
|
+
## TASKS
|
|
9
|
+
|
|
10
|
+
[x] 充分测试当前的代理功能是否正确
|
|
11
|
+
[x] 创建一个实用的dynam能力演示程序:实现一个运行ts/js的 serveless host(并不属于 dynapm,但是可以被 dynapm 运行,然后请求又可以被这个 serveless host 路由到 对应的 ts文件去执行):支持用户通过网站访问并编写 ts 上传执行和测试执行
|
|
12
|
+
|
|
13
|
+
## 已完成的工作
|
|
14
|
+
|
|
15
|
+
### 2026-03-20
|
|
16
|
+
|
|
17
|
+
#### 网关 Bug 修复
|
|
18
|
+
- **并发按需启动修复**: 多个请求同时到达离线服务时,只有第一个触发启动,其他请求等待启动完成后再代理(之前返回 502)
|
|
19
|
+
- **后端崩溃自动恢复**: 当 handleDirectProxy 检测到后端不可达(ECONNREFUSED),自动将非 proxyOnly 服务状态重置为 offline,后续请求可重新触发按需启动
|
|
20
|
+
- **端口路由并发启动修复**: handlePortBindingRequest 补全 starting/stopping 状态处理,与 hostname 路由保持一致
|
|
21
|
+
- **echo-server 支持命令行端口参数**: `parseInt(process.argv[2] || '3099')`,允许不同测试配置使用不同端口
|
|
22
|
+
- **按需启动 POST 请求体丢失修复(严重)**: uWS 的 onData 回调中 ArrayBuffer 是借用语义,`Buffer.from(ab)` 底层数据被后续回调覆盖。改用 `Buffer.alloc + copy` 确保数据复制
|
|
23
|
+
- **transfer-encoding 头冲突修复**: forwardProxyRequest 中过滤 transfer-encoding 头,避免与 content-length 冲突导致后端 400
|
|
24
|
+
- **请求体大小限制(10MB)**: collectRequestBody 超过限制时截断,防止 DoS 攻击
|
|
25
|
+
- **WebSocket 消息队列限制(1000)**: 防止后端未连接时消息无限堆积导致内存泄漏
|
|
26
|
+
- **端口路由 WebSocket close 清理**: 端口路由的 close handler 补充后端 WebSocket 关闭逻辑
|
|
27
|
+
|
|
28
|
+
#### 性能优化
|
|
29
|
+
- **预编译 CRLF 正则**: `GatewayConstants.CRLF_REGEX` 避免热路径中重复创建正则对象
|
|
30
|
+
- **Set 替代内联条件**: `GatewayConstants.SKIP_REQUEST_HEADERS` 使用 Set.has() 替代重复 toLowerCase + 条件判断
|
|
31
|
+
|
|
32
|
+
#### 测试覆盖(81 个测试全部通过)
|
|
33
|
+
- **test-proxy-comprehensive.ts**: 23 个综合代理测试
|
|
34
|
+
- **test-edge-cases.ts**: 15 个极端场景测试
|
|
35
|
+
- **test-gateway-robustness.ts**: 13 个健壮性测试
|
|
36
|
+
- **test-port-route-start.ts**: 9 个端口路由按需启动测试
|
|
37
|
+
- **test-admin-api-lifecycle.ts**: 12 个管理 API 生命周期测试
|
|
38
|
+
- **test-security-stability.ts**: 9 个安全与稳定性深度测试
|
|
39
|
+
- 端口路由并发按需启动(10个同时请求)
|
|
40
|
+
- 端口路由多种 HTTP 方法(GET/POST/PUT/DELETE/OPTIONS/PATCH)
|
|
41
|
+
- 端口路由查询参数转发(含中文编码)
|
|
42
|
+
- 端口路由大请求体转发(100KB)
|
|
43
|
+
- 端口路由流式响应(20 chunks)
|
|
44
|
+
- 端口路由状态码透传(200/201/400/404/500)
|
|
45
|
+
- 端口路由 CRLF 注入防护
|
|
46
|
+
- 端口路由后端崩溃恢复
|
|
47
|
+
- 端口路由闲置后重新按需启动
|
|
48
|
+
|
|
49
|
+
#### Serverless Host 演示
|
|
50
|
+
- test/services/serverless-host.ts: 轻量级 TypeScript Serverless 运行时
|
|
51
|
+
- Web 管理界面编写/上传/执行/删除函数
|
|
52
|
+
- 使用 Node --experimental-strip-types 直接加载 TS 函数
|
|
53
|
+
- 已添加到 dynapm.config.ts 作为 serverless-host 服务
|
|
@@ -17,6 +17,8 @@ export declare class Gateway {
|
|
|
17
17
|
private logging;
|
|
18
18
|
/** 管理 API 处理器 */
|
|
19
19
|
private adminApi;
|
|
20
|
+
/** 服务启动 Promise 追踪:serviceName -> 启动完成 Promise */
|
|
21
|
+
private startingPromises;
|
|
20
22
|
constructor(config: DynaPMConfig, logger: Logger);
|
|
21
23
|
/**
|
|
22
24
|
* 初始化服务映射和端口绑定
|
|
@@ -24,12 +26,6 @@ export declare class Gateway {
|
|
|
24
26
|
private initServices;
|
|
25
27
|
/**
|
|
26
28
|
* 初始化闲置检查器
|
|
27
|
-
* 定期检查并停止闲置的服务
|
|
28
|
-
*
|
|
29
|
-
* 注意:
|
|
30
|
-
* - 纯代理模式(proxyOnly)不会被停止
|
|
31
|
-
* - 只有当服务没有活动连接且超过闲置时间时才会停止
|
|
32
|
-
* - 这样可以避免 SSE/WebSocket 长连接被意外断开
|
|
33
29
|
*/
|
|
34
30
|
private initIdleChecker;
|
|
35
31
|
/**
|
|
@@ -37,7 +33,7 @@ export declare class Gateway {
|
|
|
37
33
|
*/
|
|
38
34
|
private checkIdleService;
|
|
39
35
|
/**
|
|
40
|
-
*
|
|
36
|
+
* 处理端口绑定请求
|
|
41
37
|
*/
|
|
42
38
|
private handlePortBindingRequest;
|
|
43
39
|
/**
|
|
@@ -52,24 +48,25 @@ export declare class Gateway {
|
|
|
52
48
|
* 处理需要等待服务停止完成的场景
|
|
53
49
|
*/
|
|
54
50
|
private handleServiceWithWait;
|
|
51
|
+
/**
|
|
52
|
+
* 处理服务正在启动中的场景
|
|
53
|
+
* 等待启动 Promise 完成后,如果成功则直接代理,如果失败则返回 503
|
|
54
|
+
*/
|
|
55
|
+
private handleServiceWithStartPromise;
|
|
55
56
|
/**
|
|
56
57
|
* 处理需要启动服务的场景
|
|
57
58
|
*/
|
|
58
59
|
private handleServiceStart;
|
|
59
60
|
/**
|
|
60
61
|
* 处理直接代理场景(服务已在线)
|
|
62
|
+
* 双向流式转发:请求体边收边发,响应体边收边回
|
|
61
63
|
*/
|
|
62
64
|
private handleDirectProxy;
|
|
63
65
|
/**
|
|
64
|
-
*
|
|
66
|
+
* 发起代理请求并流式转发响应(用于服务启动/等待场景)
|
|
65
67
|
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* @param path - 请求路径(包含查询字符串)
|
|
69
|
-
* @param startTime - 请求开始时间(用于日志)
|
|
70
|
-
* @param method - HTTP 方法
|
|
71
|
-
* @param headers - 请求头
|
|
72
|
-
* @param body - 请求体
|
|
68
|
+
* 仅在服务需要启动或等待停止时使用,此时请求体已缓冲为 Buffer。
|
|
69
|
+
* 响应体保持流式转发。
|
|
73
70
|
*/
|
|
74
71
|
private forwardProxyRequest;
|
|
75
72
|
/**
|
|
@@ -86,7 +83,6 @@ export declare class Gateway {
|
|
|
86
83
|
private createPortBindingListener;
|
|
87
84
|
/**
|
|
88
85
|
* 清理所有正在运行的服务
|
|
89
|
-
* 在网关退出时调用
|
|
90
86
|
*/
|
|
91
87
|
cleanup(): Promise<void>;
|
|
92
88
|
}
|