@cicctencent/agent-server 0.1.1 → 0.2.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 +93 -16
- package/dist/cjs/agent/agent-server.d.ts.map +1 -1
- package/dist/cjs/agent/agent-server.js +50 -15
- package/dist/cjs/agent/agent-server.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +23 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/service/cache.service.d.ts +69 -0
- package/dist/cjs/service/cache.service.d.ts.map +1 -0
- package/dist/cjs/service/cache.service.js +243 -0
- package/dist/cjs/service/cache.service.js.map +1 -0
- package/dist/cjs/service/engine-pool.d.ts +15 -2
- package/dist/cjs/service/engine-pool.d.ts.map +1 -1
- package/dist/cjs/service/engine-pool.js +15 -4
- package/dist/cjs/service/engine-pool.js.map +1 -1
- package/dist/cjs/spi/adapters.d.ts +163 -0
- package/dist/cjs/spi/adapters.d.ts.map +1 -0
- package/dist/cjs/spi/adapters.js +341 -0
- package/dist/cjs/spi/adapters.js.map +1 -0
- package/dist/cjs/spi/examples/typeorm-example.d.ts +208 -0
- package/dist/cjs/spi/examples/typeorm-example.d.ts.map +1 -0
- package/dist/cjs/spi/examples/typeorm-example.js +274 -0
- package/dist/cjs/spi/examples/typeorm-example.js.map +1 -0
- package/dist/cjs/spi/index.d.ts +194 -0
- package/dist/cjs/spi/index.d.ts.map +1 -0
- package/dist/cjs/spi/index.js +227 -0
- package/dist/cjs/spi/index.js.map +1 -0
- package/dist/cjs/spi/storage.d.ts +109 -0
- package/dist/cjs/spi/storage.d.ts.map +1 -0
- package/dist/cjs/spi/storage.js +344 -0
- package/dist/cjs/spi/storage.js.map +1 -0
- package/dist/cjs/spi/types.d.ts +317 -0
- package/dist/cjs/spi/types.d.ts.map +1 -0
- package/dist/cjs/spi/types.js +6 -0
- package/dist/cjs/spi/types.js.map +1 -0
- package/dist/cjs/types.d.ts +63 -8
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/agent/agent-server.d.ts.map +1 -1
- package/dist/esm/agent/agent-server.js +50 -15
- package/dist/esm/agent/agent-server.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/service/cache.service.d.ts +69 -0
- package/dist/esm/service/cache.service.d.ts.map +1 -0
- package/dist/esm/service/cache.service.js +237 -0
- package/dist/esm/service/cache.service.js.map +1 -0
- package/dist/esm/service/engine-pool.d.ts +15 -2
- package/dist/esm/service/engine-pool.d.ts.map +1 -1
- package/dist/esm/service/engine-pool.js +15 -4
- package/dist/esm/service/engine-pool.js.map +1 -1
- package/dist/esm/spi/adapters.d.ts +163 -0
- package/dist/esm/spi/adapters.d.ts.map +1 -0
- package/dist/esm/spi/adapters.js +329 -0
- package/dist/esm/spi/adapters.js.map +1 -0
- package/dist/esm/spi/examples/typeorm-example.d.ts +208 -0
- package/dist/esm/spi/examples/typeorm-example.d.ts.map +1 -0
- package/dist/esm/spi/examples/typeorm-example.js +315 -0
- package/dist/esm/spi/examples/typeorm-example.js.map +1 -0
- package/dist/esm/spi/index.d.ts +194 -0
- package/dist/esm/spi/index.d.ts.map +1 -0
- package/dist/esm/spi/index.js +215 -0
- package/dist/esm/spi/index.js.map +1 -0
- package/dist/esm/spi/storage.d.ts +109 -0
- package/dist/esm/spi/storage.d.ts.map +1 -0
- package/dist/esm/spi/storage.js +301 -0
- package/dist/esm/spi/storage.js.map +1 -0
- package/dist/esm/spi/types.d.ts +317 -0
- package/dist/esm/spi/types.d.ts.map +1 -0
- package/dist/esm/spi/types.js +5 -0
- package/dist/esm/spi/types.js.map +1 -0
- package/dist/esm/types.d.ts +63 -8
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// CacheService — TTL 缓存包装器(多进程/多实例场景)
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// 问题:上层 Web 项目多进程部署时,每次 getSettings() / getProfile() 都查 DB 会产生大量重复查询。
|
|
7
|
+
// 解决:在 Provider 之上加一层 TTL 缓存,减少 DB 压力;同时支持主动失效。
|
|
8
|
+
//
|
|
9
|
+
// 缓存策略:
|
|
10
|
+
// - TTL 到期自动过期,下次请求重新从底层 Provider 加载
|
|
11
|
+
// - 主动失效通过 invalidate() 清除指定 key 或全部
|
|
12
|
+
// - 跨进程失效通过 CacheInvalidationNotifier 实现(如 Redis pub/sub)
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.CachedAgentProfileProvider = exports.CachedSettingsProvider = exports.TTLCache = void 0;
|
|
15
|
+
/**
|
|
16
|
+
* 通用 TTL 缓存。
|
|
17
|
+
*
|
|
18
|
+
* - `ttl > 0`:启用缓存,过期后自动失效
|
|
19
|
+
* - `ttl === 0`:禁用缓存,get() 永远返回 null(每次直接查 Provider)
|
|
20
|
+
*/
|
|
21
|
+
class TTLCache {
|
|
22
|
+
cache = new Map();
|
|
23
|
+
ttl;
|
|
24
|
+
constructor(ttlMs = 60_000) {
|
|
25
|
+
this.ttl = ttlMs;
|
|
26
|
+
}
|
|
27
|
+
/** 是否启用缓存 */
|
|
28
|
+
get enabled() {
|
|
29
|
+
return this.ttl > 0;
|
|
30
|
+
}
|
|
31
|
+
/** 更新 TTL(不影响已缓存条目的过期时间) */
|
|
32
|
+
setTTL(ttlMs) {
|
|
33
|
+
this.ttl = ttlMs;
|
|
34
|
+
}
|
|
35
|
+
/** 获取缓存值(未命中或过期返回 null) */
|
|
36
|
+
get(key) {
|
|
37
|
+
if (!this.enabled)
|
|
38
|
+
return null;
|
|
39
|
+
const entry = this.cache.get(key);
|
|
40
|
+
if (!entry)
|
|
41
|
+
return null;
|
|
42
|
+
if (Date.now() > entry.expiresAt) {
|
|
43
|
+
this.cache.delete(key);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
return entry.value;
|
|
47
|
+
}
|
|
48
|
+
/** 设置缓存值 */
|
|
49
|
+
set(key, value) {
|
|
50
|
+
if (!this.enabled)
|
|
51
|
+
return;
|
|
52
|
+
this.cache.set(key, { value, expiresAt: Date.now() + this.ttl });
|
|
53
|
+
}
|
|
54
|
+
/** 清除指定 key 的缓存 */
|
|
55
|
+
invalidate(key) {
|
|
56
|
+
if (key !== undefined) {
|
|
57
|
+
this.cache.delete(key);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
this.cache.clear();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** 清除所有缓存 */
|
|
64
|
+
clear() {
|
|
65
|
+
this.cache.clear();
|
|
66
|
+
}
|
|
67
|
+
/** 清除已过期的条目 */
|
|
68
|
+
purgeExpired() {
|
|
69
|
+
const now = Date.now();
|
|
70
|
+
for (const [key, entry] of this.cache) {
|
|
71
|
+
if (now > entry.expiresAt) {
|
|
72
|
+
this.cache.delete(key);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** 缓存条目数量 */
|
|
77
|
+
get size() {
|
|
78
|
+
return this.cache.size;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.TTLCache = TTLCache;
|
|
82
|
+
// ============================================================
|
|
83
|
+
// CachedSettingsProvider — Settings 缓存包装器
|
|
84
|
+
// ============================================================
|
|
85
|
+
/**
|
|
86
|
+
* 包装 SettingsProvider,增加 TTL 缓存。
|
|
87
|
+
*
|
|
88
|
+
* 多进程部署时,每个进程独立缓存 Settings,TTL 到期后重新从底层 Provider 加载。
|
|
89
|
+
* 主动失效通过 `invalidate()` 清除缓存,上层可通过 `CacheInvalidationNotifier` 跨进程通知。
|
|
90
|
+
*/
|
|
91
|
+
class CachedSettingsProvider {
|
|
92
|
+
cache;
|
|
93
|
+
delegate;
|
|
94
|
+
constructor(delegate, ttlMs = 60_000) {
|
|
95
|
+
this.delegate = delegate;
|
|
96
|
+
this.cache = new TTLCache(ttlMs);
|
|
97
|
+
}
|
|
98
|
+
getSettings() {
|
|
99
|
+
const cached = this.cache.get('settings');
|
|
100
|
+
if (cached)
|
|
101
|
+
return cached;
|
|
102
|
+
const value = this.delegate.getSettings();
|
|
103
|
+
this.cache.set('settings', value);
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
updateSettings(updates) {
|
|
107
|
+
const value = this.delegate.updateSettings(updates);
|
|
108
|
+
// 更新后立即刷新缓存
|
|
109
|
+
this.cache.set('settings', value);
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
112
|
+
resetSettings() {
|
|
113
|
+
if (this.delegate.resetSettings) {
|
|
114
|
+
const value = this.delegate.resetSettings();
|
|
115
|
+
this.cache.set('settings', value);
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
this.cache.invalidate('settings');
|
|
119
|
+
return this.getSettings();
|
|
120
|
+
}
|
|
121
|
+
/** 清除缓存 */
|
|
122
|
+
invalidate() {
|
|
123
|
+
this.cache.invalidate('settings');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.CachedSettingsProvider = CachedSettingsProvider;
|
|
127
|
+
// ============================================================
|
|
128
|
+
// CachedAgentProfileProvider — Profile 缓存包装器
|
|
129
|
+
// ============================================================
|
|
130
|
+
/**
|
|
131
|
+
* 包装 AgentProfileProvider,增加 TTL 缓存。
|
|
132
|
+
*
|
|
133
|
+
* 多进程部署时,每个进程独立缓存 Profile,TTL 到期后重新从底层 Provider 加载。
|
|
134
|
+
* 主动失效通过 `invalidate(profileId?)` 清除指定或全部 Profile 缓存。
|
|
135
|
+
*/
|
|
136
|
+
class CachedAgentProfileProvider {
|
|
137
|
+
cache;
|
|
138
|
+
listCache;
|
|
139
|
+
defaultCache;
|
|
140
|
+
delegate;
|
|
141
|
+
constructor(delegate, ttlMs = 60_000) {
|
|
142
|
+
this.delegate = delegate;
|
|
143
|
+
this.cache = new TTLCache(ttlMs);
|
|
144
|
+
this.listCache = new TTLCache(ttlMs);
|
|
145
|
+
this.defaultCache = new TTLCache(ttlMs);
|
|
146
|
+
}
|
|
147
|
+
listProfiles() {
|
|
148
|
+
const cached = this.listCache.get('list');
|
|
149
|
+
if (cached)
|
|
150
|
+
return cached;
|
|
151
|
+
const result = this.delegate.listProfiles();
|
|
152
|
+
if (result instanceof Promise) {
|
|
153
|
+
return result.then(value => {
|
|
154
|
+
this.listCache.set('list', value);
|
|
155
|
+
// 同时缓存每个 profile
|
|
156
|
+
for (const p of value)
|
|
157
|
+
this.cache.set(`profile:${p.id}`, p);
|
|
158
|
+
return value;
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
this.listCache.set('list', result);
|
|
162
|
+
for (const p of result)
|
|
163
|
+
this.cache.set(`profile:${p.id}`, p);
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
getProfile(id) {
|
|
167
|
+
const cacheKey = `profile:${id}`;
|
|
168
|
+
const cached = this.cache.get(cacheKey);
|
|
169
|
+
if (cached)
|
|
170
|
+
return cached;
|
|
171
|
+
const result = this.delegate.getProfile(id);
|
|
172
|
+
if (result instanceof Promise) {
|
|
173
|
+
return result.then(value => {
|
|
174
|
+
if (value)
|
|
175
|
+
this.cache.set(cacheKey, value);
|
|
176
|
+
return value;
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
if (result)
|
|
180
|
+
this.cache.set(cacheKey, result);
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
getDefaultProfile() {
|
|
184
|
+
const cached = this.defaultCache.get('default');
|
|
185
|
+
if (cached !== null)
|
|
186
|
+
return cached;
|
|
187
|
+
const result = this.delegate.getDefaultProfile();
|
|
188
|
+
if (result instanceof Promise) {
|
|
189
|
+
return result.then(value => {
|
|
190
|
+
this.defaultCache.set('default', value);
|
|
191
|
+
return value;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
this.defaultCache.set('default', result);
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
createProfile(data) {
|
|
198
|
+
const result = this.delegate.createProfile(data);
|
|
199
|
+
// 创建后清除列表缓存和默认缓存
|
|
200
|
+
this.listCache.invalidate('list');
|
|
201
|
+
this.defaultCache.invalidate('default');
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
updateProfile(id, data) {
|
|
205
|
+
const result = this.delegate.updateProfile(id, data);
|
|
206
|
+
// 更新后清除该 profile 缓存 + 列表缓存
|
|
207
|
+
this.cache.invalidate(`profile:${id}`);
|
|
208
|
+
this.listCache.invalidate('list');
|
|
209
|
+
if (result instanceof Promise) {
|
|
210
|
+
return result.then(value => {
|
|
211
|
+
if (value)
|
|
212
|
+
this.cache.set(`profile:${id}`, value);
|
|
213
|
+
return value;
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
if (result)
|
|
217
|
+
this.cache.set(`profile:${id}`, result);
|
|
218
|
+
return result;
|
|
219
|
+
}
|
|
220
|
+
deleteProfile(id) {
|
|
221
|
+
const result = this.delegate.deleteProfile(id);
|
|
222
|
+
this.cache.invalidate(`profile:${id}`);
|
|
223
|
+
this.listCache.invalidate('list');
|
|
224
|
+
this.defaultCache.invalidate('default');
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* 清除缓存。
|
|
229
|
+
* @param profileId 指定 profileId 时仅清除该 profile;不指定时清除全部
|
|
230
|
+
*/
|
|
231
|
+
invalidate(profileId) {
|
|
232
|
+
if (profileId !== undefined) {
|
|
233
|
+
this.cache.invalidate(`profile:${profileId}`);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
this.cache.clear();
|
|
237
|
+
this.listCache.clear();
|
|
238
|
+
this.defaultCache.clear();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
exports.CachedAgentProfileProvider = CachedAgentProfileProvider;
|
|
243
|
+
//# sourceMappingURL=cache.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.service.js","sourceRoot":"","sources":["../../../src/service/cache.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import { EnginePool } from '@cicctencent/agent-core';
|
|
2
2
|
export { EnginePool } from '@cicctencent/agent-core';
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
/** EnginePool 初始化配置 */
|
|
4
|
+
export interface EnginePoolConfig {
|
|
5
|
+
/** TTL(ms),默认 5 分钟 */
|
|
6
|
+
ttl?: number;
|
|
7
|
+
/** 最大缓存数量,默认 10 */
|
|
8
|
+
maxSize?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 获取全局 Engine 池单例。
|
|
12
|
+
*
|
|
13
|
+
* 首次调用时按 config 创建;后续调用忽略 config(已创建的池不会被覆盖)。
|
|
14
|
+
* 如需重新创建,请先调用 `resetEnginePool()`。
|
|
15
|
+
*/
|
|
16
|
+
export declare function getEnginePool(config?: EnginePoolConfig): EnginePool;
|
|
17
|
+
/** 重置全局池(测试用 / 配置变更后重建) */
|
|
5
18
|
export declare function resetEnginePool(): void;
|
|
6
19
|
//# sourceMappingURL=engine-pool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-pool.d.ts","sourceRoot":"","sources":["../../../src/service/engine-pool.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"engine-pool.d.ts","sourceRoot":"","sources":["../../../src/service/engine-pool.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,uBAAuB;AACvB,MAAM,WAAW,gBAAgB;IAC/B,sBAAsB;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,UAAU,CAOnE;AAED,2BAA2B;AAC3B,wBAAgB,eAAe,IAAI,IAAI,CAKtC"}
|
|
@@ -11,14 +11,25 @@ var agent_core_2 = require("@cicctencent/agent-core");
|
|
|
11
11
|
Object.defineProperty(exports, "EnginePool", { enumerable: true, get: function () { return agent_core_2.EnginePool; } });
|
|
12
12
|
/** 全局 Engine 池单例 */
|
|
13
13
|
let globalPool = null;
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* 获取全局 Engine 池单例。
|
|
16
|
+
*
|
|
17
|
+
* 首次调用时按 config 创建;后续调用忽略 config(已创建的池不会被覆盖)。
|
|
18
|
+
* 如需重新创建,请先调用 `resetEnginePool()`。
|
|
19
|
+
*/
|
|
20
|
+
function getEnginePool(config) {
|
|
15
21
|
if (!globalPool) {
|
|
16
|
-
|
|
22
|
+
const ttl = config?.ttl ?? 5 * 60_000;
|
|
23
|
+
const maxSize = config?.maxSize ?? 10;
|
|
24
|
+
globalPool = new agent_core_1.EnginePool(ttl, maxSize);
|
|
17
25
|
}
|
|
18
26
|
return globalPool;
|
|
19
27
|
}
|
|
20
|
-
/**
|
|
28
|
+
/** 重置全局池(测试用 / 配置变更后重建) */
|
|
21
29
|
function resetEnginePool() {
|
|
22
|
-
globalPool
|
|
30
|
+
if (globalPool) {
|
|
31
|
+
globalPool.clear();
|
|
32
|
+
globalPool = null;
|
|
33
|
+
}
|
|
23
34
|
}
|
|
24
35
|
//# sourceMappingURL=engine-pool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-pool.js","sourceRoot":"","sources":["../../../src/service/engine-pool.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,gDAAgD;AAChD,+DAA+D;;;
|
|
1
|
+
{"version":3,"file":"engine-pool.js","sourceRoot":"","sources":["../../../src/service/engine-pool.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,gDAAgD;AAChD,+DAA+D;;;AAuB/D,sCAOC;AAGD,0CAKC;AApCD,wDAAqD;AAErD,sDAAqD;AAA5C,wGAAA,UAAU,OAAA;AAUnB,oBAAoB;AACpB,IAAI,UAAU,GAAsB,IAAI,CAAC;AAEzC;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,MAAyB;IACrD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;QACtC,UAAU,GAAG,IAAI,uBAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,2BAA2B;AAC3B,SAAgB,eAAe;IAC7B,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ## 设计原则
|
|
3
|
+
*
|
|
4
|
+
* agent-server 核心只定义**接口**(能力契约),不依赖具体框架。
|
|
5
|
+
*
|
|
6
|
+
* 以下适配器实现是**可选参考实现**,业务层可以:
|
|
7
|
+
* 1. 直接使用(如果满足需求)
|
|
8
|
+
* 2. 参考实现自己定制(如果有特殊需求)
|
|
9
|
+
* 3. 完全自己实现(如果框架不同)
|
|
10
|
+
*
|
|
11
|
+
* ### 使用示例
|
|
12
|
+
*
|
|
13
|
+
* ```typescript
|
|
14
|
+
* // 方式 1:直接使用提供的适配器
|
|
15
|
+
* import { KoaSSEAdapter } from '@cicctencent/agent-server';
|
|
16
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
17
|
+
*
|
|
18
|
+
* // 方式 2:继承并扩展
|
|
19
|
+
* class MySSEAdapter extends KoaSSEAdapter {
|
|
20
|
+
* write(data: string) {
|
|
21
|
+
* // 添加自定义逻辑(如日志、监控)
|
|
22
|
+
* console.log('[SSE]', data.length, 'bytes');
|
|
23
|
+
* super.write(data);
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* // 方式 3:完全自己实现
|
|
28
|
+
* class CustomSSEAdapter implements SSEResponseAdapter {
|
|
29
|
+
* // 完全自定义实现
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
import type { SSEResponseAdapter, RequestContextAdapter } from './types.js';
|
|
34
|
+
/**
|
|
35
|
+
* Express SSE 适配器(参考实现)
|
|
36
|
+
*
|
|
37
|
+
* 业务层可以:
|
|
38
|
+
* - 直接使用
|
|
39
|
+
* - 继承扩展
|
|
40
|
+
* - 参考 implementation 自己实现
|
|
41
|
+
*/
|
|
42
|
+
export declare class ExpressSSEAdapter implements SSEResponseAdapter {
|
|
43
|
+
private res;
|
|
44
|
+
constructor(res: any);
|
|
45
|
+
write(data: string): void;
|
|
46
|
+
end(): void;
|
|
47
|
+
get writableEnded(): boolean;
|
|
48
|
+
setHeader(name: string, value: string | number): void;
|
|
49
|
+
flushHeaders(): void;
|
|
50
|
+
status(code: number): void;
|
|
51
|
+
json(data: unknown): void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Koa/MidwayJS SSE 适配器(参考实现)
|
|
55
|
+
*/
|
|
56
|
+
export declare class KoaSSEAdapter implements SSEResponseAdapter {
|
|
57
|
+
private ctx;
|
|
58
|
+
constructor(ctx: any);
|
|
59
|
+
write(data: string): void;
|
|
60
|
+
end(): void;
|
|
61
|
+
get writableEnded(): boolean;
|
|
62
|
+
setHeader(name: string, value: string | number): void;
|
|
63
|
+
flushHeaders(): void;
|
|
64
|
+
status(code: number): void;
|
|
65
|
+
json(data: unknown): void;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Fastify SSE 适配器(参考实现)
|
|
69
|
+
*/
|
|
70
|
+
export declare class FastifySSEAdapter implements SSEResponseAdapter {
|
|
71
|
+
private reply;
|
|
72
|
+
constructor(reply: any);
|
|
73
|
+
write(data: string): void;
|
|
74
|
+
end(): void;
|
|
75
|
+
get writableEnded(): boolean;
|
|
76
|
+
setHeader(name: string, value: string | number): void;
|
|
77
|
+
flushHeaders(): void;
|
|
78
|
+
status(code: number): void;
|
|
79
|
+
json(data: unknown): void;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 原生 HTTP SSE 适配器
|
|
83
|
+
*/
|
|
84
|
+
export declare class NativeHttpSSEAdapter implements SSEResponseAdapter {
|
|
85
|
+
private res;
|
|
86
|
+
constructor(res: any);
|
|
87
|
+
write(data: string): void;
|
|
88
|
+
end(): void;
|
|
89
|
+
get writableEnded(): boolean;
|
|
90
|
+
setHeader(name: string, value: string | number): void;
|
|
91
|
+
flushHeaders(): void;
|
|
92
|
+
status(code: number): void;
|
|
93
|
+
json(data: unknown): void;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 自动检测框架类型并创建适配器
|
|
97
|
+
*
|
|
98
|
+
* ⚠️ 注意:此函数是便捷工具,但建议业务层显式创建适配器:
|
|
99
|
+
*
|
|
100
|
+
* ```typescript
|
|
101
|
+
* // 推荐:显式创建(更可控)
|
|
102
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
103
|
+
*
|
|
104
|
+
* // 不推荐:自动检测(可能误判)
|
|
105
|
+
* const adapter = adaptSSE(ctx);
|
|
106
|
+
* ```
|
|
107
|
+
*
|
|
108
|
+
* 自动检测可能存在的问题:
|
|
109
|
+
* - 框架版本差异导致误判
|
|
110
|
+
* - 自定义响应对象无法识别
|
|
111
|
+
* - 难以调试
|
|
112
|
+
*/
|
|
113
|
+
export declare function adaptSSE(res: unknown): SSEResponseAdapter;
|
|
114
|
+
/**
|
|
115
|
+
* Express 请求上下文适配器
|
|
116
|
+
*/
|
|
117
|
+
export declare class ExpressRequestAdapter implements RequestContextAdapter {
|
|
118
|
+
private req;
|
|
119
|
+
constructor(req: any);
|
|
120
|
+
getUserId(): string | number | undefined;
|
|
121
|
+
getWorkspaceId(): number | string | undefined;
|
|
122
|
+
getHeader(name: string): string | undefined;
|
|
123
|
+
hasPermission(permission: string): boolean;
|
|
124
|
+
getRawRequest(): unknown;
|
|
125
|
+
getRawResponse(): unknown;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Koa/MidwayJS 请求上下文适配器
|
|
129
|
+
*/
|
|
130
|
+
export declare class KoaRequestAdapter implements RequestContextAdapter {
|
|
131
|
+
private ctx;
|
|
132
|
+
constructor(ctx: any);
|
|
133
|
+
getUserId(): string | number | undefined;
|
|
134
|
+
getWorkspaceId(): number | string | undefined;
|
|
135
|
+
getHeader(name: string): string | undefined;
|
|
136
|
+
hasPermission(permission: string): boolean;
|
|
137
|
+
getRawRequest(): unknown;
|
|
138
|
+
getRawResponse(): unknown;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 自动检测框架类型并创建请求适配器
|
|
142
|
+
*/
|
|
143
|
+
export declare function adaptRequest(req: unknown): RequestContextAdapter;
|
|
144
|
+
/**
|
|
145
|
+
* 自定义 SSE 适配器示例
|
|
146
|
+
* 应用层可参考此实现创建自己的适配器
|
|
147
|
+
*/
|
|
148
|
+
export declare class CustomSSEAdapter implements SSEResponseAdapter {
|
|
149
|
+
private onWrite;
|
|
150
|
+
private onEnd;
|
|
151
|
+
private onFlush?;
|
|
152
|
+
private _writableEnded;
|
|
153
|
+
private headers;
|
|
154
|
+
constructor(onWrite: (data: string) => void, onEnd: () => void, onFlush?: () => void);
|
|
155
|
+
write(data: string): void;
|
|
156
|
+
end(): void;
|
|
157
|
+
get writableEnded(): boolean;
|
|
158
|
+
setHeader(name: string, value: string | number): void;
|
|
159
|
+
flushHeaders(): void;
|
|
160
|
+
/** 获取已设置的响应头 */
|
|
161
|
+
getHeaders(): Record<string, string>;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../../src/spi/adapters.ts"],"names":[],"mappings":"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"}
|