web-dc-api 0.1.5 → 0.1.7
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.js +1 -1
- package/dist/dc.min.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/index.d.ts +934 -878
- package/package.json +4 -8
- package/dist/cjs/helia-core-B1Xqha7a.js +0 -1
- package/dist/cjs/helia-core-D8Uv1KjQ.js +0 -1
- package/dist/cjs/polkadot-api-7PhQf3ws.js +0 -1
- package/dist/cjs/polkadot-api-CtrJVWuZ.js +0 -1
- package/dist/esm/chunks/helia-core-BxMqyK2Y.js +0 -1
- package/dist/esm/chunks/helia-core-DMXRpcO-.js +0 -1
- package/dist/esm/chunks/polkadot-api-5Y9Bw8VT.js +0 -1
- package/dist/esm/chunks/polkadot-api-D69Ioun_.js +0 -1
- package/lib/common/blowfish/block.ts +0 -259
- package/lib/common/blowfish/cipher.ts +0 -144
- package/lib/common/blowfish/const.ts +0 -195
- package/lib/common/chain.ts +0 -469
- package/lib/common/commonclient.ts +0 -202
- package/lib/common/constants.ts +0 -55
- package/lib/common/dc-key/ed25519.ts +0 -343
- package/lib/common/dc-key/keyManager.ts +0 -424
- package/lib/common/dcapi.ts +0 -98
- package/lib/common/dcutil.ts +0 -627
- package/lib/common/define.ts +0 -70
- package/lib/common/error.ts +0 -67
- package/lib/common/grpc-dc.ts +0 -104
- package/lib/common/module-system.ts +0 -184
- package/lib/common/service-worker.ts +0 -234
- package/lib/common/types/types.ts +0 -344
- package/lib/dc.ts +0 -701
- package/lib/implements/account/client.ts +0 -185
- package/lib/implements/account/manager.ts +0 -683
- package/lib/implements/aiproxy/client.ts +0 -357
- package/lib/implements/aiproxy/manager.ts +0 -670
- package/lib/implements/cache/client.ts +0 -105
- package/lib/implements/cache/manager.ts +0 -127
- package/lib/implements/comment/client.ts +0 -982
- package/lib/implements/comment/manager.ts +0 -1151
- package/lib/implements/dc/client.ts +0 -51
- package/lib/implements/dc/manager.ts +0 -33
- package/lib/implements/file/client.ts +0 -253
- package/lib/implements/file/file-cache-manager.ts +0 -142
- package/lib/implements/file/manager.ts +0 -1240
- package/lib/implements/file/seekableFileStream.ts +0 -344
- package/lib/implements/file/streamwriter.ts +0 -322
- package/lib/implements/keyvalue/client.ts +0 -376
- package/lib/implements/keyvalue/manager.ts +0 -759
- package/lib/implements/message/client.ts +0 -250
- package/lib/implements/message/manager.ts +0 -215
- package/lib/implements/threaddb/cbor/coding.ts +0 -62
- package/lib/implements/threaddb/cbor/event.ts +0 -336
- package/lib/implements/threaddb/cbor/node.ts +0 -542
- package/lib/implements/threaddb/cbor/record.ts +0 -398
- package/lib/implements/threaddb/common/AsyncMutex.ts +0 -24
- package/lib/implements/threaddb/common/addrinfo.ts +0 -135
- package/lib/implements/threaddb/common/dispatcher.ts +0 -81
- package/lib/implements/threaddb/common/idbstore-adapter.ts +0 -260
- package/lib/implements/threaddb/common/json-patcher.ts +0 -204
- package/lib/implements/threaddb/common/key.ts +0 -290
- package/lib/implements/threaddb/common/level-adapter.ts +0 -235
- package/lib/implements/threaddb/common/lineReader.ts +0 -79
- package/lib/implements/threaddb/common/logstore.ts +0 -215
- package/lib/implements/threaddb/common/transformed-datastore.ts +0 -308
- package/lib/implements/threaddb/core/app.ts +0 -206
- package/lib/implements/threaddb/core/core.ts +0 -230
- package/lib/implements/threaddb/core/db.ts +0 -249
- package/lib/implements/threaddb/core/event.ts +0 -54
- package/lib/implements/threaddb/core/head.ts +0 -89
- package/lib/implements/threaddb/core/identity.ts +0 -171
- package/lib/implements/threaddb/core/logstore.ts +0 -137
- package/lib/implements/threaddb/core/options.ts +0 -14
- package/lib/implements/threaddb/core/record.ts +0 -54
- package/lib/implements/threaddb/db/collection.ts +0 -1910
- package/lib/implements/threaddb/db/db.ts +0 -698
- package/lib/implements/threaddb/db/json2Query.ts +0 -192
- package/lib/implements/threaddb/db/query.ts +0 -524
- package/lib/implements/threaddb/dbclient.ts +0 -543
- package/lib/implements/threaddb/dbmanager.ts +0 -1906
- package/lib/implements/threaddb/lsstoreds/addr_book.ts +0 -549
- package/lib/implements/threaddb/lsstoreds/cache.ts +0 -36
- package/lib/implements/threaddb/lsstoreds/cyclic_batch.ts +0 -87
- package/lib/implements/threaddb/lsstoreds/global.ts +0 -151
- package/lib/implements/threaddb/lsstoreds/headbook.ts +0 -373
- package/lib/implements/threaddb/lsstoreds/keybook.ts +0 -297
- package/lib/implements/threaddb/lsstoreds/logstore.ts +0 -29
- package/lib/implements/threaddb/lsstoreds/metadata.ts +0 -223
- package/lib/implements/threaddb/net/define.ts +0 -149
- package/lib/implements/threaddb/net/grpcClient.ts +0 -589
- package/lib/implements/threaddb/net/grpcserver.ts +0 -146
- package/lib/implements/threaddb/net/net.ts +0 -2047
- package/lib/implements/threaddb/pb/lstore.proto +0 -38
- package/lib/implements/threaddb/pb/lstore.ts +0 -393
- package/lib/implements/threaddb/pb/lstore_pb.d.ts +0 -433
- package/lib/implements/threaddb/pb/lstore_pb.js +0 -1085
- package/lib/implements/threaddb/pb/net.proto +0 -194
- package/lib/implements/threaddb/pb/net_pb.d.ts +0 -2349
- package/lib/implements/threaddb/pb/net_pb.js +0 -5525
- package/lib/implements/threaddb/pb/proto-custom-types.ts +0 -212
- package/lib/implements/util/client.ts +0 -72
- package/lib/implements/util/manager.ts +0 -146
- package/lib/implements/wallet/manager.ts +0 -671
- package/lib/index.ts +0 -57
- package/lib/interfaces/DCContext.ts +0 -51
- package/lib/interfaces/aiproxy-interface.ts +0 -145
- package/lib/interfaces/auth-interface.ts +0 -118
- package/lib/interfaces/cache-interface.ts +0 -22
- package/lib/interfaces/client-interface.ts +0 -11
- package/lib/interfaces/comment-interface.ts +0 -167
- package/lib/interfaces/components/news-component.ts +0 -0
- package/lib/interfaces/database-interface.ts +0 -169
- package/lib/interfaces/file-interface.ts +0 -120
- package/lib/interfaces/index.ts +0 -10
- package/lib/interfaces/keyvalue-interface.ts +0 -156
- package/lib/interfaces/message-interface.ts +0 -22
- package/lib/interfaces/util-interface.ts +0 -31
- package/lib/modules/aiproxy-module.ts +0 -246
- package/lib/modules/auth-module.ts +0 -753
- package/lib/modules/cache-module.ts +0 -99
- package/lib/modules/client-module.ts +0 -71
- package/lib/modules/comment-module.ts +0 -429
- package/lib/modules/components/news-components.ts +0 -390
- package/lib/modules/database-module.ts +0 -598
- package/lib/modules/file-module.ts +0 -291
- package/lib/modules/index.ts +0 -13
- package/lib/modules/keyvalue-module.ts +0 -379
- package/lib/modules/message-module.ts +0 -107
- package/lib/modules/util-module.ts +0 -148
- package/lib/polyfills/process-env-browser.ts +0 -1
- package/lib/proto/datasource.ts +0 -93
- package/lib/proto/dcnet.proto +0 -1601
- package/lib/proto/dcnet_proto.d.ts +0 -22857
- package/lib/proto/dcnet_proto.js +0 -55204
- package/lib/proto/dcnet_proto_sparse.js +0 -55166
- package/lib/proto/oidfetch.proto +0 -25
- package/lib/proto/oidfetch_proto.d.ts +0 -585
- package/lib/proto/oidfetch_proto.js +0 -1247
- package/lib/serverless/babel-browser.ts +0 -39
- package/lib/serverless/base_entity.ts +0 -78
- package/lib/serverless/base_repository.ts +0 -414
- package/lib/serverless/browser_schema_extractor.ts +0 -283
- package/lib/serverless/decorator_factory.ts +0 -322
- package/lib/util/BrowserLineReader.ts +0 -73
- package/lib/util/base64.ts +0 -105
- package/lib/util/bcrypt.ts +0 -206
- package/lib/util/curve25519Encryption.ts +0 -418
- package/lib/util/dccrypt.ts +0 -73
- package/lib/util/logger.ts +0 -104
- package/lib/util/utils.ts +0 -289
|
@@ -1,598 +0,0 @@
|
|
|
1
|
-
// modules/database-module.ts
|
|
2
|
-
// 数据库功能模块
|
|
3
|
-
|
|
4
|
-
import { IDatabaseOperations } from "../interfaces/database-interface";
|
|
5
|
-
import { DCContext } from "../../lib/interfaces/DCContext";
|
|
6
|
-
import { DCModule, CoreModuleName } from "../common/module-system";
|
|
7
|
-
import { createLogger } from "../util/logger";
|
|
8
|
-
import { createTxnDatastore } from "../implements/threaddb/common/idbstore-adapter";
|
|
9
|
-
import { newKeyBook } from "../implements/threaddb/lsstoreds/keybook";
|
|
10
|
-
import { newAddrBook } from "../implements/threaddb/lsstoreds/addr_book";
|
|
11
|
-
import { newHeadBook } from "../implements/threaddb/lsstoreds/headbook";
|
|
12
|
-
import { newThreadMetadata } from "../implements/threaddb/lsstoreds/metadata";
|
|
13
|
-
import { newLogstore } from "../implements/threaddb/common/logstore";
|
|
14
|
-
import { dagCbor } from "@helia/dag-cbor";
|
|
15
|
-
import { DB as ThreadDb } from '../implements/threaddb/db/db';
|
|
16
|
-
import { Network } from "../implements/threaddb/net/net";
|
|
17
|
-
import { createContext, DBManager } from "../implements/threaddb/dbmanager";
|
|
18
|
-
import { ICollectionConfig, IDBInfo, ManagedOptions } from "../implements/threaddb/core/core";
|
|
19
|
-
import ThreadID from "@textile/threads-id";
|
|
20
|
-
|
|
21
|
-
const logger = createLogger('DatabaseModule');
|
|
22
|
-
const storagePrefix = "dc-";
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* 数据库模块
|
|
26
|
-
* 提供数据库操作功能
|
|
27
|
-
*/
|
|
28
|
-
export class DatabaseModule implements DCModule, IDatabaseOperations {
|
|
29
|
-
readonly moduleName = CoreModuleName.DATABASE;
|
|
30
|
-
private context!: DCContext;
|
|
31
|
-
private initialized: boolean = false;
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* 初始化数据库模块
|
|
35
|
-
* @param context DC上下文
|
|
36
|
-
* @returns 是否初始化成功
|
|
37
|
-
*/
|
|
38
|
-
async initialize(context: DCContext): Promise<boolean> {
|
|
39
|
-
try {
|
|
40
|
-
this.context = context;
|
|
41
|
-
// 数据库模块可以按需初始化,所以这里不立即创建DBManager
|
|
42
|
-
this.initialized = true;
|
|
43
|
-
return true;
|
|
44
|
-
} catch (error) {
|
|
45
|
-
logger.error("数据库模块初始化失败:", error);
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* 关闭数据库模块
|
|
52
|
-
*/
|
|
53
|
-
async shutdown(): Promise<void> {
|
|
54
|
-
// 在这里可以添加关闭数据库连接等清理工作
|
|
55
|
-
this.initialized = false;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* 初始化数据库管理器
|
|
62
|
-
*/
|
|
63
|
-
async initDBManager(): Promise<Error | null> {
|
|
64
|
-
|
|
65
|
-
try {
|
|
66
|
-
this.assertInitialized();
|
|
67
|
-
|
|
68
|
-
if (this.context.dbManager) {
|
|
69
|
-
return null; // 已经初始化过
|
|
70
|
-
}
|
|
71
|
-
const tdatastore = await createTxnDatastore(this.context.appInfo?.appName);
|
|
72
|
-
const keyBook = await newKeyBook(tdatastore);
|
|
73
|
-
const addrBook = await newAddrBook(tdatastore);
|
|
74
|
-
const headBook = newHeadBook(tdatastore);
|
|
75
|
-
const threadMetadata = newThreadMetadata(tdatastore);
|
|
76
|
-
const logstore = newLogstore(keyBook, addrBook, headBook, threadMetadata);
|
|
77
|
-
const dagService = dagCbor(this.context.dcNodeClient);
|
|
78
|
-
|
|
79
|
-
if (!this.context.publicKey) {
|
|
80
|
-
throw new Error("公钥未初始化");
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const net = new Network(
|
|
84
|
-
this.context.dcutil,
|
|
85
|
-
this.context.dcChain,
|
|
86
|
-
this.context.dcNodeClient.libp2p,
|
|
87
|
-
this.context.grpcServer,
|
|
88
|
-
logstore,
|
|
89
|
-
this.context.dcNodeClient.blockstore,
|
|
90
|
-
dagService,
|
|
91
|
-
this.context
|
|
92
|
-
);
|
|
93
|
-
|
|
94
|
-
const dbmanager = new DBManager(
|
|
95
|
-
tdatastore,
|
|
96
|
-
net,
|
|
97
|
-
this.context.dcutil,
|
|
98
|
-
this.context.connectedDc,
|
|
99
|
-
{},
|
|
100
|
-
this.context.dcChain,
|
|
101
|
-
storagePrefix,
|
|
102
|
-
this.context
|
|
103
|
-
);
|
|
104
|
-
await dbmanager.loadDbs();// 加载现有数据库
|
|
105
|
-
this.context.dbManager = dbmanager;
|
|
106
|
-
logger.info("数据库管理器初始化成功");
|
|
107
|
-
return null;
|
|
108
|
-
} catch (error) {
|
|
109
|
-
logger.error("初始化数据库管理器失败:", error);
|
|
110
|
-
return error as Error;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* 创建新数据库
|
|
119
|
-
* @param name 数据库名称
|
|
120
|
-
* @param b32Rk 读取密钥
|
|
121
|
-
* @param b32Sk 写入密钥
|
|
122
|
-
* @param jsonCollections 集合配置
|
|
123
|
-
* @returns 线程ID
|
|
124
|
-
*/
|
|
125
|
-
async newDB(
|
|
126
|
-
name: string,
|
|
127
|
-
b32Rk: string,
|
|
128
|
-
b32Sk: string,
|
|
129
|
-
jsonCollections: ICollectionConfig[]
|
|
130
|
-
): Promise<[string| null, Error | null]> {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
try {
|
|
134
|
-
this.assertInitialized();
|
|
135
|
-
await this.initDBManager();
|
|
136
|
-
|
|
137
|
-
if (!this.context.dbManager) {
|
|
138
|
-
throw new Error("数据库管理器未初始化");
|
|
139
|
-
}
|
|
140
|
-
// 创建数据库
|
|
141
|
-
const [threadId, err] = await this.context.dbManager.newDB(name, b32Rk, b32Sk, jsonCollections);
|
|
142
|
-
if (err) {
|
|
143
|
-
logger.error("创建数据库失败:", err);
|
|
144
|
-
throw err;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
logger.info(`创建数据库 ${name} 成功,线程ID: ${threadId}`);
|
|
148
|
-
return [threadId, null] ; // 返回threadId;
|
|
149
|
-
} catch (error) {
|
|
150
|
-
logger.error(`创建数据库 ${name} 失败:`, error);
|
|
151
|
-
return [null, error instanceof Error ? error : new Error(String(error))];
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
async loadVerno(threadId : string): Promise<number> {
|
|
156
|
-
try {
|
|
157
|
-
this.assertInitialized();
|
|
158
|
-
await this.initDBManager();
|
|
159
|
-
|
|
160
|
-
if (!this.context.dbManager) {
|
|
161
|
-
throw new Error("数据库管理器未初始化");
|
|
162
|
-
}
|
|
163
|
-
const tID = ThreadID.fromString(threadId);
|
|
164
|
-
const db = await this.context.dbManager.getDB(tID);
|
|
165
|
-
|
|
166
|
-
if (!db) {
|
|
167
|
-
logger.error(`数据库信息为空`);
|
|
168
|
-
return 0; // 返回默认版本号
|
|
169
|
-
}
|
|
170
|
-
const verno = await db.loadVerno();
|
|
171
|
-
return verno;
|
|
172
|
-
} catch (error) {
|
|
173
|
-
logger.error(`加载数据库版本号失败:`, error);
|
|
174
|
-
return 0;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
async saveVerno(threadId: string, verno: number): Promise<number> {
|
|
179
|
-
try {
|
|
180
|
-
this.assertInitialized();
|
|
181
|
-
await this.initDBManager();
|
|
182
|
-
|
|
183
|
-
if (!this.context.dbManager) {
|
|
184
|
-
throw new Error("数据库管理器未初始化");
|
|
185
|
-
}
|
|
186
|
-
const tID = ThreadID.fromString(threadId);
|
|
187
|
-
const db = await this.context.dbManager.getDB(tID);
|
|
188
|
-
|
|
189
|
-
if (!db) {
|
|
190
|
-
logger.error(`数据库信息为空`);
|
|
191
|
-
return -1; //
|
|
192
|
-
}
|
|
193
|
-
await db.saveVerno(verno);
|
|
194
|
-
return 0;
|
|
195
|
-
} catch (error) {
|
|
196
|
-
logger.error(`加载数据库版本号失败:`, error);
|
|
197
|
-
return -1;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* 从DC同步数据库
|
|
205
|
-
* @param threadid 线程ID
|
|
206
|
-
* @param dbname 数据库名称
|
|
207
|
-
* @param dbAddr 数据库地址
|
|
208
|
-
* @param b32Rk 读取密钥
|
|
209
|
-
* @param b32Sk 写入密钥
|
|
210
|
-
* @param block 是否阻塞
|
|
211
|
-
* @param collectionInfos 集合配置
|
|
212
|
-
*/
|
|
213
|
-
async syncDbFromDC(
|
|
214
|
-
threadid: string,
|
|
215
|
-
dbname: string,
|
|
216
|
-
dbAddr: string,
|
|
217
|
-
b32Rk: string,
|
|
218
|
-
b32Sk: string,
|
|
219
|
-
block: boolean,
|
|
220
|
-
collectionInfos: ICollectionConfig[]
|
|
221
|
-
): Promise<Error|null> {
|
|
222
|
-
|
|
223
|
-
try {
|
|
224
|
-
this.assertInitialized();
|
|
225
|
-
await this.initDBManager();
|
|
226
|
-
|
|
227
|
-
if (!this.context.dbManager) {
|
|
228
|
-
throw new Error("数据库管理器未初始化");
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const ctx = createContext(60000);
|
|
232
|
-
await this.context.dbManager.syncDBFromDC(
|
|
233
|
-
ctx,
|
|
234
|
-
threadid,
|
|
235
|
-
dbname,
|
|
236
|
-
dbAddr,
|
|
237
|
-
b32Rk,
|
|
238
|
-
b32Sk,
|
|
239
|
-
block,
|
|
240
|
-
collectionInfos
|
|
241
|
-
);
|
|
242
|
-
|
|
243
|
-
logger.info(`从DC同步数据库 ${dbname} 成功`);
|
|
244
|
-
return null;
|
|
245
|
-
} catch (error) {
|
|
246
|
-
logger.error(`从DC同步数据库 ${dbname} 失败:`, error);
|
|
247
|
-
return error instanceof Error ? error : new Error(String(error));
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* 刷新数据库
|
|
255
|
-
* @param threadid 数据库ID
|
|
256
|
-
* @returns 错误信息或null
|
|
257
|
-
*/
|
|
258
|
-
async refreshDBFromDC(threadid: string, verno?: number): Promise<Error | null> {
|
|
259
|
-
|
|
260
|
-
try {
|
|
261
|
-
this.assertInitialized();
|
|
262
|
-
await this.initDBManager();
|
|
263
|
-
|
|
264
|
-
if (!this.context.dbManager) {
|
|
265
|
-
throw new Error("数据库管理器未初始化");
|
|
266
|
-
}
|
|
267
|
-
await this.context.dbManager.refreshDBFromDC(threadid);
|
|
268
|
-
return null;
|
|
269
|
-
} catch (error) {
|
|
270
|
-
logger.error(`刷新数据库 ${threadid} 失败:`, error);
|
|
271
|
-
return error as Error;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* 同步数据库到DC
|
|
278
|
-
* @param tId 线程ID
|
|
279
|
-
* @returns 错误信息或null
|
|
280
|
-
*/
|
|
281
|
-
async syncDBToDC(tId: string): Promise<Error | null> {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
try {
|
|
285
|
-
this.assertInitialized();
|
|
286
|
-
await this.initDBManager();
|
|
287
|
-
|
|
288
|
-
if (!this.context.dbManager) {
|
|
289
|
-
throw new Error("数据库管理器未初始化");
|
|
290
|
-
}
|
|
291
|
-
await this.context.dbManager.syncDBToDC(tId);
|
|
292
|
-
logger.info(`同步数据库 ${tId} 到DC成功`);
|
|
293
|
-
return null;
|
|
294
|
-
} catch (error) {
|
|
295
|
-
logger.error(`同步数据库 ${tId} 到DC失败:`, error);
|
|
296
|
-
return error as Error;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* 升级集合结构
|
|
305
|
-
* @param threadId 线程ID
|
|
306
|
-
* @param collections 集合配置列表
|
|
307
|
-
* @returns 错误信息或null
|
|
308
|
-
*/
|
|
309
|
-
async upgradeCollections(threadId: string, collections: ICollectionConfig[]): Promise<Error | null> {
|
|
310
|
-
try {
|
|
311
|
-
this.assertInitialized();
|
|
312
|
-
await this.initDBManager();
|
|
313
|
-
|
|
314
|
-
if (!this.context.dbManager) {
|
|
315
|
-
throw new Error("数据库管理器未初始化");
|
|
316
|
-
}
|
|
317
|
-
await this.context.dbManager.upgradeCollections(threadId, collections);
|
|
318
|
-
return null;
|
|
319
|
-
} catch (error) {
|
|
320
|
-
return error as Error;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* 关闭数据库管理器
|
|
326
|
-
*/
|
|
327
|
-
async close(): Promise<Error | null> {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
try {
|
|
331
|
-
this.assertInitialized();
|
|
332
|
-
if (!this.context.dbManager) {
|
|
333
|
-
throw new Error("数据库管理器未初始化");
|
|
334
|
-
}
|
|
335
|
-
await this.context.dbManager.close();
|
|
336
|
-
logger.info("数据库管理器关闭成功");
|
|
337
|
-
return null;
|
|
338
|
-
} catch (error) {
|
|
339
|
-
logger.error("关闭数据库管理器失败:", error);
|
|
340
|
-
return error instanceof Error ? error : new Error(String(error));
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
/**
|
|
349
|
-
* 获取数据库信息
|
|
350
|
-
* @param id threaddbID
|
|
351
|
-
* @returns 数据库信息字符串,或错误
|
|
352
|
-
*/
|
|
353
|
-
async getDBInfo(id: string): Promise<[IDBInfo|null, Error|null]> {
|
|
354
|
-
try{
|
|
355
|
-
if (!id || id.length == 0) {
|
|
356
|
-
return [null, new Error("数据库ID不能为空")];
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
this.assertInitialized();
|
|
360
|
-
await this.initDBManager();
|
|
361
|
-
|
|
362
|
-
if (!this.context.dbManager) {
|
|
363
|
-
return [null, new Error("数据库管理器未初始化")];
|
|
364
|
-
}
|
|
365
|
-
const tid = ThreadID.fromString(id);
|
|
366
|
-
const [dbInfo, err] = await this.context.dbManager.getDBInfo(tid);
|
|
367
|
-
return [dbInfo, err];
|
|
368
|
-
} catch (error) {
|
|
369
|
-
logger.error(`获取数据库信息失败:`, error);
|
|
370
|
-
return [null, error instanceof Error ? error : new Error(String(error))];
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/**
|
|
375
|
-
* Create creates new instances of objects in a collection
|
|
376
|
-
* @param threadId Thread ID string
|
|
377
|
-
* @param collectionName Collection name
|
|
378
|
-
* @param jsonInstance JSON string representing the instance
|
|
379
|
-
* @returns Promise resolving to the created instance ID
|
|
380
|
-
* @throws Error if creation fails
|
|
381
|
-
*/
|
|
382
|
-
async create(threadId: string, collectionName: string, jsonInstance: string): Promise<[string|null, Error|null]> {
|
|
383
|
-
|
|
384
|
-
try {
|
|
385
|
-
this.assertInitialized();
|
|
386
|
-
await this.initDBManager();
|
|
387
|
-
|
|
388
|
-
if (!this.context.dbManager) {
|
|
389
|
-
throw new Error("数据库管理器未初始化");
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
const instanceId = await this.context.dbManager.create(threadId, collectionName, jsonInstance);
|
|
393
|
-
logger.info(`创建实例成功,ID: ${instanceId}`);
|
|
394
|
-
return [instanceId, null];
|
|
395
|
-
} catch (error) {
|
|
396
|
-
logger.error(`创建实例失败:`, error);
|
|
397
|
-
return [null, error instanceof Error ? error : new Error(String(error))];
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
/**
|
|
403
|
-
* Delete deletes an instance by ID
|
|
404
|
-
* @param threadId Thread ID string
|
|
405
|
-
* @param collectionName Collection name
|
|
406
|
-
* @param instanceID Instance ID to delete
|
|
407
|
-
* @throws Error if deletion fails
|
|
408
|
-
*/
|
|
409
|
-
async delete(threadId: string, collectionName: string, instanceID: string): Promise<Error | null> {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
try {
|
|
413
|
-
this.assertInitialized();
|
|
414
|
-
await this.initDBManager();
|
|
415
|
-
|
|
416
|
-
if (!this.context.dbManager) {
|
|
417
|
-
throw new Error("数据库管理器未初始化");
|
|
418
|
-
}
|
|
419
|
-
await this.context.dbManager.delete(threadId, collectionName, instanceID);
|
|
420
|
-
logger.info(`删除实例成功,ID: ${instanceID}`);
|
|
421
|
-
return null;
|
|
422
|
-
} catch (error) {
|
|
423
|
-
logger.error(`删除实例失败:`, error);
|
|
424
|
-
return error instanceof Error ? error : new Error(String(error));
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
/**
|
|
431
|
-
* Save updates an existing instance
|
|
432
|
-
* @param threadId Thread ID string
|
|
433
|
-
* @param collectionName Collection name
|
|
434
|
-
* @param instance JSON string representing the instance
|
|
435
|
-
* @throws Error if update fails
|
|
436
|
-
*/
|
|
437
|
-
async save(threadId: string, collectionName: string, instance: string): Promise<Error | null> {
|
|
438
|
-
|
|
439
|
-
try {
|
|
440
|
-
this.assertInitialized();
|
|
441
|
-
await this.initDBManager();
|
|
442
|
-
|
|
443
|
-
if (!this.context.dbManager) {
|
|
444
|
-
throw new Error("数据库管理器未初始化");
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
await this.context.dbManager.save(threadId, collectionName, instance);
|
|
448
|
-
logger.info(`更新实例成功`);
|
|
449
|
-
return null;
|
|
450
|
-
} catch (error) {
|
|
451
|
-
logger.error(`更新实例失败:`, error);
|
|
452
|
-
return error instanceof Error ? error : new Error(String(error));
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
/**
|
|
458
|
-
* DeleteMany deletes multiple instances by their IDs
|
|
459
|
-
* @param threadId Thread ID string
|
|
460
|
-
* @param collectionName Collection name
|
|
461
|
-
* @param instanceIDs Comma-separated or JSON array of instance IDs
|
|
462
|
-
* @throws Error if deletion fails
|
|
463
|
-
*/
|
|
464
|
-
async deleteMany(threadId: string, collectionName: string, instanceIDs: string): Promise<Error | null> {
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
try {
|
|
468
|
-
this.assertInitialized();
|
|
469
|
-
await this.initDBManager();
|
|
470
|
-
|
|
471
|
-
if (!this.context.dbManager) {
|
|
472
|
-
throw new Error("数据库管理器未初始化");
|
|
473
|
-
}
|
|
474
|
-
await this.context.dbManager.deleteMany(threadId, collectionName, instanceIDs);
|
|
475
|
-
logger.info(`删除多个实例成功`);
|
|
476
|
-
return null;
|
|
477
|
-
} catch (error) {
|
|
478
|
-
logger.error(`删除多个实例失败:`, error);
|
|
479
|
-
return error instanceof Error ? error : new Error(String(error));
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
/**
|
|
485
|
-
* Has checks if the specified instance exists
|
|
486
|
-
* @param threadId Thread ID string
|
|
487
|
-
* @param collectionName Collection name
|
|
488
|
-
* @param instanceID Instance ID to check
|
|
489
|
-
* @returns Promise resolving to a boolean indicating if instance exists
|
|
490
|
-
*/
|
|
491
|
-
async has(threadId: string, collectionName: string, instanceID: string): Promise<boolean> {
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
try {
|
|
495
|
-
this.assertInitialized();
|
|
496
|
-
await this.initDBManager();
|
|
497
|
-
|
|
498
|
-
if (!this.context.dbManager) {
|
|
499
|
-
throw new Error("数据库管理器未初始化");
|
|
500
|
-
}
|
|
501
|
-
return await this.context.dbManager.has(threadId, collectionName, instanceID);
|
|
502
|
-
} catch (error) {
|
|
503
|
-
logger.error(`检查实例是否存在失败:`, error);
|
|
504
|
-
return false;
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
/**
|
|
510
|
-
* Find finds instances by query
|
|
511
|
-
* @param threadId Thread ID string
|
|
512
|
-
* @param collectionName Collection name
|
|
513
|
-
* @param queryString JSON string representing the query
|
|
514
|
-
* @returns Promise resolving to a JSON string with found instances
|
|
515
|
-
* @throws Error if query fails
|
|
516
|
-
*/
|
|
517
|
-
async find(threadId: string, collectionName: string, queryString?: string): Promise<[string|null, Error|null]> {
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
try {
|
|
521
|
-
this.assertInitialized();
|
|
522
|
-
await this.initDBManager();
|
|
523
|
-
|
|
524
|
-
if (!this.context.dbManager) {
|
|
525
|
-
throw new Error("数据库管理器未初始化");
|
|
526
|
-
}
|
|
527
|
-
const results = await this.context.dbManager.find(threadId, collectionName, queryString);
|
|
528
|
-
return [results, null];
|
|
529
|
-
} catch (error) {
|
|
530
|
-
logger.error(`查询实例失败:`, error);
|
|
531
|
-
return [null, error instanceof Error ? error : new Error(String(error))];
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
/**
|
|
537
|
-
* FindByID finds an instance by ID
|
|
538
|
-
* @param threadId Thread ID string
|
|
539
|
-
* @param collectionName Collection name
|
|
540
|
-
* @param instanceID Instance ID to find
|
|
541
|
-
* @returns Promise resolving to a JSON string with found instance
|
|
542
|
-
* @throws Error if query fails
|
|
543
|
-
*/
|
|
544
|
-
async findByID(threadId: string, collectionName: string, instanceID: string): Promise<[string|null, Error|null]> {
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
try {
|
|
548
|
-
this.assertInitialized();
|
|
549
|
-
await this.initDBManager();
|
|
550
|
-
|
|
551
|
-
if (!this.context.dbManager) {
|
|
552
|
-
throw new Error("数据库管理器未初始化");
|
|
553
|
-
}
|
|
554
|
-
const result = await this.context.dbManager.findByID(threadId, collectionName, instanceID);
|
|
555
|
-
return [result, null];
|
|
556
|
-
} catch (error) {
|
|
557
|
-
logger.error(`通过ID查询实例失败:`, error);
|
|
558
|
-
return [null, error instanceof Error ? error : new Error(String(error))];
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
/**
|
|
564
|
-
* ModifiedSince returns instance IDs modified since the given time
|
|
565
|
-
* @param threadId Thread ID string
|
|
566
|
-
* @param collectionName Collection name
|
|
567
|
-
* @param time Unix timestamp in milliseconds
|
|
568
|
-
* @returns Promise resolving to a JSON string with instance IDs
|
|
569
|
-
* @throws Error if query fails
|
|
570
|
-
*/
|
|
571
|
-
async modifiedSince(threadId: string, collectionName: string, time: number): Promise<[string|null, Error|null]> {
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
try {
|
|
575
|
-
this.assertInitialized();
|
|
576
|
-
await this.initDBManager();
|
|
577
|
-
|
|
578
|
-
if (!this.context.dbManager) {
|
|
579
|
-
throw new Error("数据库管理器未初始化");
|
|
580
|
-
}
|
|
581
|
-
const results = await this.context.dbManager.modifiedSince(threadId, collectionName, time);
|
|
582
|
-
return [results, null];
|
|
583
|
-
} catch (error) {
|
|
584
|
-
logger.error(`查询修改时间大于指定时间的实例ID失败:`, error);
|
|
585
|
-
return [null, error instanceof Error ? error : new Error(String(error))];
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
/**
|
|
591
|
-
* 断言模块已初始化
|
|
592
|
-
*/
|
|
593
|
-
private assertInitialized(): void {
|
|
594
|
-
if (!this.initialized) {
|
|
595
|
-
throw new Error("数据库模块未初始化");
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
}
|