@cicctencent/agent-server 0.1.1 → 0.1.2
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/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/spi/adapters.d.ts +111 -0
- package/dist/cjs/spi/adapters.d.ts.map +1 -0
- package/dist/cjs/spi/adapters.js +285 -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 +110 -0
- package/dist/cjs/spi/index.d.ts.map +1 -0
- package/dist/cjs/spi/index.js +143 -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/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/spi/adapters.d.ts +111 -0
- package/dist/esm/spi/adapters.d.ts.map +1 -0
- package/dist/esm/spi/adapters.js +273 -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 +110 -0
- package/dist/esm/spi/index.d.ts.map +1 -0
- package/dist/esm/spi/index.js +131 -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/package.json +1 -1
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// SPI 模块导出
|
|
4
|
+
// ============================================================
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CustomSSEAdapter = exports.adaptRequest = exports.KoaRequestAdapter = exports.ExpressRequestAdapter = exports.adaptSSE = exports.NativeHttpSSEAdapter = exports.FastifySSEAdapter = exports.KoaSSEAdapter = exports.ExpressSSEAdapter = exports.createInMemoryStorage = exports.createJsonFileStorage = exports.DatabaseListStorage = exports.InMemoryListStorage = exports.InMemoryKVStorage = exports.JsonFileListStorage = exports.JsonFileKVStorage = void 0;
|
|
7
|
+
// ---- 存储适配器 ----
|
|
8
|
+
var storage_ts_1 = require("./storage.js");
|
|
9
|
+
// JSON 文件存储
|
|
10
|
+
Object.defineProperty(exports, "JsonFileKVStorage", { enumerable: true, get: function () { return storage_ts_1.JsonFileKVStorage; } });
|
|
11
|
+
Object.defineProperty(exports, "JsonFileListStorage", { enumerable: true, get: function () { return storage_ts_1.JsonFileListStorage; } });
|
|
12
|
+
// 内存存储
|
|
13
|
+
Object.defineProperty(exports, "InMemoryKVStorage", { enumerable: true, get: function () { return storage_ts_1.InMemoryKVStorage; } });
|
|
14
|
+
Object.defineProperty(exports, "InMemoryListStorage", { enumerable: true, get: function () { return storage_ts_1.InMemoryListStorage; } });
|
|
15
|
+
// 数据库存储基类
|
|
16
|
+
Object.defineProperty(exports, "DatabaseListStorage", { enumerable: true, get: function () { return storage_ts_1.DatabaseListStorage; } });
|
|
17
|
+
// 工厂函数
|
|
18
|
+
Object.defineProperty(exports, "createJsonFileStorage", { enumerable: true, get: function () { return storage_ts_1.createJsonFileStorage; } });
|
|
19
|
+
Object.defineProperty(exports, "createInMemoryStorage", { enumerable: true, get: function () { return storage_ts_1.createInMemoryStorage; } });
|
|
20
|
+
// ---- 框架适配器 ----
|
|
21
|
+
var adapters_ts_1 = require("./adapters.js");
|
|
22
|
+
// SSE 适配器
|
|
23
|
+
Object.defineProperty(exports, "ExpressSSEAdapter", { enumerable: true, get: function () { return adapters_ts_1.ExpressSSEAdapter; } });
|
|
24
|
+
Object.defineProperty(exports, "KoaSSEAdapter", { enumerable: true, get: function () { return adapters_ts_1.KoaSSEAdapter; } });
|
|
25
|
+
Object.defineProperty(exports, "FastifySSEAdapter", { enumerable: true, get: function () { return adapters_ts_1.FastifySSEAdapter; } });
|
|
26
|
+
Object.defineProperty(exports, "NativeHttpSSEAdapter", { enumerable: true, get: function () { return adapters_ts_1.NativeHttpSSEAdapter; } });
|
|
27
|
+
Object.defineProperty(exports, "adaptSSE", { enumerable: true, get: function () { return adapters_ts_1.adaptSSE; } });
|
|
28
|
+
// 请求适配器
|
|
29
|
+
Object.defineProperty(exports, "ExpressRequestAdapter", { enumerable: true, get: function () { return adapters_ts_1.ExpressRequestAdapter; } });
|
|
30
|
+
Object.defineProperty(exports, "KoaRequestAdapter", { enumerable: true, get: function () { return adapters_ts_1.KoaRequestAdapter; } });
|
|
31
|
+
Object.defineProperty(exports, "adaptRequest", { enumerable: true, get: function () { return adapters_ts_1.adaptRequest; } });
|
|
32
|
+
// 自定义适配器示例
|
|
33
|
+
Object.defineProperty(exports, "CustomSSEAdapter", { enumerable: true, get: function () { return adapters_ts_1.CustomSSEAdapter; } });
|
|
34
|
+
// ============================================================
|
|
35
|
+
// SPI 使用指南
|
|
36
|
+
// ============================================================
|
|
37
|
+
/**
|
|
38
|
+
* ## SPI 使用示例
|
|
39
|
+
*
|
|
40
|
+
* ### 1. 使用默认 JSON 文件存储
|
|
41
|
+
*
|
|
42
|
+
* ```typescript
|
|
43
|
+
* import { createAgentServer } from '@cicctencent/agent-server';
|
|
44
|
+
*
|
|
45
|
+
* const server = createAgentServer({
|
|
46
|
+
* llmProvider: myProvider,
|
|
47
|
+
* dataDir: './data', // 使用默认 JSON 文件存储
|
|
48
|
+
* });
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* ### 2. 自定义存储(数据库)
|
|
52
|
+
*
|
|
53
|
+
* ```typescript
|
|
54
|
+
* import { createAgentServer, DatabaseListStorage, type ChatStoreProvider } from '@cicctencent/agent-server';
|
|
55
|
+
*
|
|
56
|
+
* // 实现数据库存储
|
|
57
|
+
* class TypeORMThreadStorage extends DatabaseListStorage<ThreadEntity> {
|
|
58
|
+
* constructor(private repository: Repository<ThreadEntity>) {
|
|
59
|
+
* super();
|
|
60
|
+
* }
|
|
61
|
+
* async list() { return this.repository.find(); }
|
|
62
|
+
* async findById(id) { return this.repository.findOne({ where: { id } }); }
|
|
63
|
+
* async add(entity) { return this.repository.save(entity); }
|
|
64
|
+
* // ...
|
|
65
|
+
* }
|
|
66
|
+
*
|
|
67
|
+
* // 实现 ChatStoreProvider
|
|
68
|
+
* class TypeORMChatStoreProvider implements ChatStoreProvider {
|
|
69
|
+
* constructor(private threadRepo: Repository<ThreadEntity>, private msgRepo: Repository<MessageEntity>) {}
|
|
70
|
+
* getThreads() { return this.threadRepo.find(); }
|
|
71
|
+
* // ...
|
|
72
|
+
* }
|
|
73
|
+
*
|
|
74
|
+
* const server = createAgentServer({
|
|
75
|
+
* llmProvider: myProvider,
|
|
76
|
+
* chatStoreProvider: new TypeORMChatStoreProvider(threadRepo, msgRepo),
|
|
77
|
+
* });
|
|
78
|
+
* ```
|
|
79
|
+
*
|
|
80
|
+
* ### 3. 自定义框架适配(MidwayJS)
|
|
81
|
+
*
|
|
82
|
+
* ```typescript
|
|
83
|
+
* import { createAgentServer, KoaSSEAdapter } from '@cicctencent/agent-server';
|
|
84
|
+
*
|
|
85
|
+
* @Provide()
|
|
86
|
+
* @Scope(ScopeEnum.Singleton)
|
|
87
|
+
* export class AgentService {
|
|
88
|
+
* private server: AgentServer;
|
|
89
|
+
*
|
|
90
|
+
* @Init()
|
|
91
|
+
* async init() {
|
|
92
|
+
* this.server = createAgentServer({
|
|
93
|
+
* llmProvider: await this.createProvider(),
|
|
94
|
+
* // 使用 Koa 适配器
|
|
95
|
+
* createSSEResponseAdapter: (ctx) => new KoaSSEAdapter(ctx),
|
|
96
|
+
* });
|
|
97
|
+
* }
|
|
98
|
+
*
|
|
99
|
+
* @Get('/chat/stream')
|
|
100
|
+
* async chatStream(@Ctx() ctx: Context) {
|
|
101
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
102
|
+
* await this.server.runAgentStream(adapter, { content: ctx.query.message });
|
|
103
|
+
* }
|
|
104
|
+
* }
|
|
105
|
+
* ```
|
|
106
|
+
*
|
|
107
|
+
* ### 4. 自定义 Prompt 构建
|
|
108
|
+
*
|
|
109
|
+
* ```typescript
|
|
110
|
+
* import { createAgentServer, type PromptBuilderProvider } from '@cicctencent/agent-server';
|
|
111
|
+
*
|
|
112
|
+
* class CustomPromptBuilder implements PromptBuilderProvider {
|
|
113
|
+
* buildDefaultPrompt(profile, tools, memory) {
|
|
114
|
+
* // 自定义 Prompt 构建逻辑
|
|
115
|
+
* return `你是一个专业的 BI 分析助手...\n${memory || ''}`;
|
|
116
|
+
* }
|
|
117
|
+
* // ...
|
|
118
|
+
* }
|
|
119
|
+
*
|
|
120
|
+
* const server = createAgentServer({
|
|
121
|
+
* llmProvider: myProvider,
|
|
122
|
+
* promptBuilder: new CustomPromptBuilder(),
|
|
123
|
+
* });
|
|
124
|
+
* ```
|
|
125
|
+
*
|
|
126
|
+
* ### 5. 组件级使用(不使用工厂)
|
|
127
|
+
*
|
|
128
|
+
* ```typescript
|
|
129
|
+
* import { MemoryService, writeSSE, createBuiltinTools, KoaSSEAdapter } from '@cicctencent/agent-server';
|
|
130
|
+
*
|
|
131
|
+
* // 只使用需要的组件,不依赖 createAgentServer
|
|
132
|
+
* const memoryService = new MemoryService('./data');
|
|
133
|
+
* const tools = createBuiltinTools();
|
|
134
|
+
*
|
|
135
|
+
* // 在 MidwayJS 中使用 SSE
|
|
136
|
+
* @Get('/stream')
|
|
137
|
+
* async stream(@Ctx() ctx: Context) {
|
|
138
|
+
* const adapter = new KoaSSEAdapter(ctx);
|
|
139
|
+
* writeSSE(adapter, 'start', { message: 'Hello' });
|
|
140
|
+
* }
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/spi/index.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,WAAW;AACX,+DAA+D;;;AAgC/D,kBAAkB;AAClB,2CAYsB;AAXpB,YAAY;AACZ,+GAAA,iBAAiB,OAAA;AACjB,iHAAA,mBAAmB,OAAA;AACnB,OAAO;AACP,+GAAA,iBAAiB,OAAA;AACjB,iHAAA,mBAAmB,OAAA;AACnB,UAAU;AACV,iHAAA,mBAAmB,OAAA;AACnB,OAAO;AACP,mHAAA,qBAAqB,OAAA;AACrB,mHAAA,qBAAqB,OAAA;AAGvB,kBAAkB;AAClB,6CAauB;AAZrB,UAAU;AACV,gHAAA,iBAAiB,OAAA;AACjB,4GAAA,aAAa,OAAA;AACb,gHAAA,iBAAiB,OAAA;AACjB,mHAAA,oBAAoB,OAAA;AACpB,uGAAA,QAAQ,OAAA;AACR,QAAQ;AACR,oHAAA,qBAAqB,OAAA;AACrB,gHAAA,iBAAiB,OAAA;AACjB,2GAAA,YAAY,OAAA;AACZ,WAAW;AACX,+GAAA,gBAAgB,OAAA;AAGlB,+DAA+D;AAC/D,WAAW;AACX,+DAA+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyGG"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { KVStorageAdapter, ListStorageAdapter, QueryOptions } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* JSON 文件键值存储
|
|
4
|
+
* 适用于小型应用、本地开发
|
|
5
|
+
*/
|
|
6
|
+
export declare class JsonFileKVStorage implements KVStorageAdapter {
|
|
7
|
+
private filePath;
|
|
8
|
+
private cache;
|
|
9
|
+
constructor(filePath: string);
|
|
10
|
+
private load;
|
|
11
|
+
private save;
|
|
12
|
+
get<T>(key: string): Promise<T | null>;
|
|
13
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
14
|
+
delete(key: string): Promise<void>;
|
|
15
|
+
exists(key: string): Promise<boolean>;
|
|
16
|
+
keys(prefix?: string): Promise<string[]>;
|
|
17
|
+
/** 清除缓存(用于重新加载) */
|
|
18
|
+
clearCache(): void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* JSON 文件列表存储
|
|
22
|
+
* 支持实体 CRUD 操作
|
|
23
|
+
*/
|
|
24
|
+
export declare class JsonFileListStorage<T extends {
|
|
25
|
+
id: number | string;
|
|
26
|
+
}> implements ListStorageAdapter<T> {
|
|
27
|
+
private filePath;
|
|
28
|
+
private data;
|
|
29
|
+
constructor(filePath: string);
|
|
30
|
+
private load;
|
|
31
|
+
private save;
|
|
32
|
+
list(): Promise<T[]>;
|
|
33
|
+
findById(id: number | string): Promise<T | null>;
|
|
34
|
+
add(entity: T): Promise<T>;
|
|
35
|
+
update(id: number | string, data: Partial<T>): Promise<T | null>;
|
|
36
|
+
remove(id: number | string): Promise<boolean>;
|
|
37
|
+
batch(operations: Array<{
|
|
38
|
+
type: 'add' | 'update' | 'delete';
|
|
39
|
+
data: T | Partial<T>;
|
|
40
|
+
id?: number | string;
|
|
41
|
+
}>): Promise<void>;
|
|
42
|
+
/** 获取最大 ID */
|
|
43
|
+
maxId(): number;
|
|
44
|
+
/** 清除缓存 */
|
|
45
|
+
clearCache(): void;
|
|
46
|
+
/** 获取文件路径 */
|
|
47
|
+
getPath(): string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 内存键值存储
|
|
51
|
+
* 适用于测试、临时数据
|
|
52
|
+
*/
|
|
53
|
+
export declare class InMemoryKVStorage implements KVStorageAdapter {
|
|
54
|
+
private data;
|
|
55
|
+
get<T>(key: string): Promise<T | null>;
|
|
56
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
57
|
+
delete(key: string): Promise<void>;
|
|
58
|
+
exists(key: string): Promise<boolean>;
|
|
59
|
+
keys(prefix?: string): Promise<string[]>;
|
|
60
|
+
/** 清空所有数据 */
|
|
61
|
+
clear(): void;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 内存列表存储
|
|
65
|
+
*/
|
|
66
|
+
export declare class InMemoryListStorage<T extends {
|
|
67
|
+
id: number | string;
|
|
68
|
+
}> implements ListStorageAdapter<T> {
|
|
69
|
+
private data;
|
|
70
|
+
list(): Promise<T[]>;
|
|
71
|
+
findById(id: number | string): Promise<T | null>;
|
|
72
|
+
add(entity: T): Promise<T>;
|
|
73
|
+
update(id: number | string, data: Partial<T>): Promise<T | null>;
|
|
74
|
+
remove(id: number | string): Promise<boolean>;
|
|
75
|
+
/** 清空所有数据 */
|
|
76
|
+
clear(): void;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 数据库存储基类
|
|
80
|
+
* 应用层继承并实现具体的数据库操作(TypeORM / Prisma / Sequelize 等)
|
|
81
|
+
*/
|
|
82
|
+
export declare abstract class DatabaseListStorage<T extends {
|
|
83
|
+
id: number | string;
|
|
84
|
+
}> implements ListStorageAdapter<T> {
|
|
85
|
+
abstract list(): Promise<T[]>;
|
|
86
|
+
abstract findById(id: number | string): Promise<T | null>;
|
|
87
|
+
abstract add(entity: T): Promise<T>;
|
|
88
|
+
abstract update(id: number | string, data: Partial<T>): Promise<T | null>;
|
|
89
|
+
abstract remove(id: number | string): Promise<boolean>;
|
|
90
|
+
/** 扩展:带查询条件的列表 */
|
|
91
|
+
query(options: QueryOptions): Promise<{
|
|
92
|
+
items: T[];
|
|
93
|
+
total: number;
|
|
94
|
+
hasMore: boolean;
|
|
95
|
+
}>;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 创建 JSON 文件存储
|
|
99
|
+
*/
|
|
100
|
+
export declare function createJsonFileStorage(filePath: string, type: 'kv' | 'list'): KVStorageAdapter | ListStorageAdapter<{
|
|
101
|
+
id: number | string;
|
|
102
|
+
}>;
|
|
103
|
+
/**
|
|
104
|
+
* 创建内存存储
|
|
105
|
+
*/
|
|
106
|
+
export declare function createInMemoryStorage(type: 'kv' | 'list'): KVStorageAdapter | ListStorageAdapter<{
|
|
107
|
+
id: number | string;
|
|
108
|
+
}>;
|
|
109
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/spi/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// 存储适配器实现 — 应用层可替换底层存储
|
|
4
|
+
// ============================================================
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.DatabaseListStorage = exports.InMemoryListStorage = exports.InMemoryKVStorage = exports.JsonFileListStorage = exports.JsonFileKVStorage = void 0;
|
|
40
|
+
exports.createJsonFileStorage = createJsonFileStorage;
|
|
41
|
+
exports.createInMemoryStorage = createInMemoryStorage;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
// ============================================================
|
|
45
|
+
// JSON 文件存储(默认实现)
|
|
46
|
+
// ============================================================
|
|
47
|
+
/**
|
|
48
|
+
* JSON 文件键值存储
|
|
49
|
+
* 适用于小型应用、本地开发
|
|
50
|
+
*/
|
|
51
|
+
class JsonFileKVStorage {
|
|
52
|
+
filePath;
|
|
53
|
+
cache = null;
|
|
54
|
+
constructor(filePath) {
|
|
55
|
+
this.filePath = filePath;
|
|
56
|
+
}
|
|
57
|
+
load() {
|
|
58
|
+
if (this.cache)
|
|
59
|
+
return this.cache;
|
|
60
|
+
try {
|
|
61
|
+
if (fs.existsSync(this.filePath)) {
|
|
62
|
+
const data = JSON.parse(fs.readFileSync(this.filePath, 'utf-8'));
|
|
63
|
+
this.cache = new Map(Object.entries(data));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.cache = new Map();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
this.cache = new Map();
|
|
71
|
+
}
|
|
72
|
+
return this.cache;
|
|
73
|
+
}
|
|
74
|
+
save() {
|
|
75
|
+
if (!this.cache)
|
|
76
|
+
return;
|
|
77
|
+
const dir = path.dirname(this.filePath);
|
|
78
|
+
if (!fs.existsSync(dir))
|
|
79
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
80
|
+
fs.writeFileSync(this.filePath, JSON.stringify(Object.fromEntries(this.cache), null, 2));
|
|
81
|
+
}
|
|
82
|
+
async get(key) {
|
|
83
|
+
const data = this.load();
|
|
84
|
+
return data.get(key) ?? null;
|
|
85
|
+
}
|
|
86
|
+
async set(key, value) {
|
|
87
|
+
this.load().set(key, value);
|
|
88
|
+
this.save();
|
|
89
|
+
}
|
|
90
|
+
async delete(key) {
|
|
91
|
+
this.load().delete(key);
|
|
92
|
+
this.save();
|
|
93
|
+
}
|
|
94
|
+
async exists(key) {
|
|
95
|
+
return this.load().has(key);
|
|
96
|
+
}
|
|
97
|
+
async keys(prefix) {
|
|
98
|
+
const allKeys = Array.from(this.load().keys());
|
|
99
|
+
if (prefix)
|
|
100
|
+
return allKeys.filter(k => k.startsWith(prefix));
|
|
101
|
+
return allKeys;
|
|
102
|
+
}
|
|
103
|
+
/** 清除缓存(用于重新加载) */
|
|
104
|
+
clearCache() {
|
|
105
|
+
this.cache = null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.JsonFileKVStorage = JsonFileKVStorage;
|
|
109
|
+
/**
|
|
110
|
+
* JSON 文件列表存储
|
|
111
|
+
* 支持实体 CRUD 操作
|
|
112
|
+
*/
|
|
113
|
+
class JsonFileListStorage {
|
|
114
|
+
filePath;
|
|
115
|
+
data = null;
|
|
116
|
+
constructor(filePath) {
|
|
117
|
+
this.filePath = filePath;
|
|
118
|
+
}
|
|
119
|
+
load() {
|
|
120
|
+
if (this.data)
|
|
121
|
+
return this.data;
|
|
122
|
+
try {
|
|
123
|
+
if (fs.existsSync(this.filePath)) {
|
|
124
|
+
this.data = JSON.parse(fs.readFileSync(this.filePath, 'utf-8'));
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
this.data = [];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
this.data = [];
|
|
132
|
+
}
|
|
133
|
+
return this.data;
|
|
134
|
+
}
|
|
135
|
+
save() {
|
|
136
|
+
if (!this.data)
|
|
137
|
+
return;
|
|
138
|
+
const dir = path.dirname(this.filePath);
|
|
139
|
+
if (!fs.existsSync(dir))
|
|
140
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
141
|
+
fs.writeFileSync(this.filePath, JSON.stringify(this.data, null, 2));
|
|
142
|
+
}
|
|
143
|
+
async list() {
|
|
144
|
+
return [...this.load()];
|
|
145
|
+
}
|
|
146
|
+
async findById(id) {
|
|
147
|
+
const item = this.load().find(item => item.id === id);
|
|
148
|
+
return item ?? null;
|
|
149
|
+
}
|
|
150
|
+
async add(entity) {
|
|
151
|
+
this.load().push(entity);
|
|
152
|
+
this.save();
|
|
153
|
+
return entity;
|
|
154
|
+
}
|
|
155
|
+
async update(id, data) {
|
|
156
|
+
const items = this.load();
|
|
157
|
+
const idx = items.findIndex(item => item.id === id);
|
|
158
|
+
if (idx === -1)
|
|
159
|
+
return null;
|
|
160
|
+
items[idx] = { ...items[idx], ...data };
|
|
161
|
+
this.save();
|
|
162
|
+
return items[idx];
|
|
163
|
+
}
|
|
164
|
+
async remove(id) {
|
|
165
|
+
const items = this.load();
|
|
166
|
+
const idx = items.findIndex(item => item.id === id);
|
|
167
|
+
if (idx === -1)
|
|
168
|
+
return false;
|
|
169
|
+
items.splice(idx, 1);
|
|
170
|
+
this.save();
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
async batch(operations) {
|
|
174
|
+
const items = this.load();
|
|
175
|
+
for (const op of operations) {
|
|
176
|
+
if (op.type === 'add') {
|
|
177
|
+
items.push(op.data);
|
|
178
|
+
}
|
|
179
|
+
else if (op.type === 'update' && op.id) {
|
|
180
|
+
const idx = items.findIndex(item => item.id === op.id);
|
|
181
|
+
if (idx !== -1)
|
|
182
|
+
items[idx] = { ...items[idx], ...op.data };
|
|
183
|
+
}
|
|
184
|
+
else if (op.type === 'delete' && op.id) {
|
|
185
|
+
const idx = items.findIndex(item => item.id === op.id);
|
|
186
|
+
if (idx !== -1)
|
|
187
|
+
items.splice(idx, 1);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
this.save();
|
|
191
|
+
}
|
|
192
|
+
/** 获取最大 ID */
|
|
193
|
+
maxId() {
|
|
194
|
+
const items = this.load();
|
|
195
|
+
if (items.length === 0)
|
|
196
|
+
return 0;
|
|
197
|
+
const ids = items.map(item => typeof item.id === 'number' ? item.id : parseInt(String(item.id), 10) || 0);
|
|
198
|
+
return Math.max(...ids);
|
|
199
|
+
}
|
|
200
|
+
/** 清除缓存 */
|
|
201
|
+
clearCache() {
|
|
202
|
+
this.data = null;
|
|
203
|
+
}
|
|
204
|
+
/** 获取文件路径 */
|
|
205
|
+
getPath() {
|
|
206
|
+
return this.filePath;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
exports.JsonFileListStorage = JsonFileListStorage;
|
|
210
|
+
// ============================================================
|
|
211
|
+
// 内存存储(测试用)
|
|
212
|
+
// ============================================================
|
|
213
|
+
/**
|
|
214
|
+
* 内存键值存储
|
|
215
|
+
* 适用于测试、临时数据
|
|
216
|
+
*/
|
|
217
|
+
class InMemoryKVStorage {
|
|
218
|
+
data = new Map();
|
|
219
|
+
async get(key) {
|
|
220
|
+
return this.data.get(key) ?? null;
|
|
221
|
+
}
|
|
222
|
+
async set(key, value) {
|
|
223
|
+
this.data.set(key, value);
|
|
224
|
+
}
|
|
225
|
+
async delete(key) {
|
|
226
|
+
this.data.delete(key);
|
|
227
|
+
}
|
|
228
|
+
async exists(key) {
|
|
229
|
+
return this.data.has(key);
|
|
230
|
+
}
|
|
231
|
+
async keys(prefix) {
|
|
232
|
+
const allKeys = Array.from(this.data.keys());
|
|
233
|
+
if (prefix)
|
|
234
|
+
return allKeys.filter(k => k.startsWith(prefix));
|
|
235
|
+
return allKeys;
|
|
236
|
+
}
|
|
237
|
+
/** 清空所有数据 */
|
|
238
|
+
clear() {
|
|
239
|
+
this.data.clear();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
exports.InMemoryKVStorage = InMemoryKVStorage;
|
|
243
|
+
/**
|
|
244
|
+
* 内存列表存储
|
|
245
|
+
*/
|
|
246
|
+
class InMemoryListStorage {
|
|
247
|
+
data = [];
|
|
248
|
+
async list() {
|
|
249
|
+
return [...this.data];
|
|
250
|
+
}
|
|
251
|
+
async findById(id) {
|
|
252
|
+
const item = this.data.find(item => item.id === id);
|
|
253
|
+
return item ?? null;
|
|
254
|
+
}
|
|
255
|
+
async add(entity) {
|
|
256
|
+
this.data.push(entity);
|
|
257
|
+
return entity;
|
|
258
|
+
}
|
|
259
|
+
async update(id, data) {
|
|
260
|
+
const idx = this.data.findIndex(item => item.id === id);
|
|
261
|
+
if (idx === -1)
|
|
262
|
+
return null;
|
|
263
|
+
this.data[idx] = { ...this.data[idx], ...data };
|
|
264
|
+
return this.data[idx];
|
|
265
|
+
}
|
|
266
|
+
async remove(id) {
|
|
267
|
+
const idx = this.data.findIndex(item => item.id === id);
|
|
268
|
+
if (idx === -1)
|
|
269
|
+
return false;
|
|
270
|
+
this.data.splice(idx, 1);
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
/** 清空所有数据 */
|
|
274
|
+
clear() {
|
|
275
|
+
this.data = [];
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
exports.InMemoryListStorage = InMemoryListStorage;
|
|
279
|
+
// ============================================================
|
|
280
|
+
// 数据库存储抽象(应用层实现)
|
|
281
|
+
// ============================================================
|
|
282
|
+
/**
|
|
283
|
+
* 数据库存储基类
|
|
284
|
+
* 应用层继承并实现具体的数据库操作(TypeORM / Prisma / Sequelize 等)
|
|
285
|
+
*/
|
|
286
|
+
class DatabaseListStorage {
|
|
287
|
+
/** 扩展:带查询条件的列表 */
|
|
288
|
+
async query(options) {
|
|
289
|
+
const all = await this.list();
|
|
290
|
+
let filtered = all;
|
|
291
|
+
// 应用过滤器
|
|
292
|
+
if (options.filter) {
|
|
293
|
+
filtered = filtered.filter(item => {
|
|
294
|
+
for (const [key, value] of Object.entries(options.filter)) {
|
|
295
|
+
if (item[key] !== value)
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
return true;
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
// 排序
|
|
302
|
+
if (options.orderBy) {
|
|
303
|
+
filtered.sort((a, b) => {
|
|
304
|
+
const aVal = a[options.orderBy];
|
|
305
|
+
const bVal = b[options.orderBy];
|
|
306
|
+
if (aVal < bVal)
|
|
307
|
+
return options.orderDirection === 'desc' ? 1 : -1;
|
|
308
|
+
if (aVal > bVal)
|
|
309
|
+
return options.orderDirection === 'desc' ? -1 : 1;
|
|
310
|
+
return 0;
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
// 分页
|
|
314
|
+
const total = filtered.length;
|
|
315
|
+
const offset = options.offset ?? 0;
|
|
316
|
+
const limit = options.limit ?? 50;
|
|
317
|
+
const items = filtered.slice(offset, offset + limit);
|
|
318
|
+
const hasMore = offset + items.length < total;
|
|
319
|
+
return { items, total, hasMore };
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
exports.DatabaseListStorage = DatabaseListStorage;
|
|
323
|
+
// ============================================================
|
|
324
|
+
// 存储工厂函数
|
|
325
|
+
// ============================================================
|
|
326
|
+
/**
|
|
327
|
+
* 创建 JSON 文件存储
|
|
328
|
+
*/
|
|
329
|
+
function createJsonFileStorage(filePath, type) {
|
|
330
|
+
if (type === 'kv') {
|
|
331
|
+
return new JsonFileKVStorage(filePath);
|
|
332
|
+
}
|
|
333
|
+
return new JsonFileListStorage(filePath);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* 创建内存存储
|
|
337
|
+
*/
|
|
338
|
+
function createInMemoryStorage(type) {
|
|
339
|
+
if (type === 'kv') {
|
|
340
|
+
return new InMemoryKVStorage();
|
|
341
|
+
}
|
|
342
|
+
return new InMemoryListStorage();
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/spi/storage.ts"],"names":[],"mappings":"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"}
|