web-dc-api 0.1.4 → 0.1.6

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.
Files changed (148) hide show
  1. package/dist/cjs/index.js +1 -1
  2. package/dist/dc.min.js +1 -1
  3. package/dist/esm/index.js +1 -1
  4. package/dist/index.d.ts +934 -878
  5. package/package.json +4 -8
  6. package/dist/cjs/helia-core-B1Xqha7a.js +0 -1
  7. package/dist/cjs/helia-core-D8Uv1KjQ.js +0 -1
  8. package/dist/cjs/polkadot-api-7PhQf3ws.js +0 -1
  9. package/dist/cjs/polkadot-api-CtrJVWuZ.js +0 -1
  10. package/dist/esm/chunks/helia-core-BxMqyK2Y.js +0 -1
  11. package/dist/esm/chunks/helia-core-DMXRpcO-.js +0 -1
  12. package/dist/esm/chunks/polkadot-api-5Y9Bw8VT.js +0 -1
  13. package/dist/esm/chunks/polkadot-api-D69Ioun_.js +0 -1
  14. package/lib/common/blowfish/block.ts +0 -259
  15. package/lib/common/blowfish/cipher.ts +0 -144
  16. package/lib/common/blowfish/const.ts +0 -195
  17. package/lib/common/chain.ts +0 -469
  18. package/lib/common/commonclient.ts +0 -202
  19. package/lib/common/constants.ts +0 -55
  20. package/lib/common/dc-key/ed25519.ts +0 -343
  21. package/lib/common/dc-key/keyManager.ts +0 -424
  22. package/lib/common/dcapi.ts +0 -98
  23. package/lib/common/dcutil.ts +0 -627
  24. package/lib/common/define.ts +0 -70
  25. package/lib/common/error.ts +0 -67
  26. package/lib/common/grpc-dc.ts +0 -104
  27. package/lib/common/module-system.ts +0 -184
  28. package/lib/common/service-worker.ts +0 -234
  29. package/lib/common/types/types.ts +0 -344
  30. package/lib/dc.ts +0 -701
  31. package/lib/implements/account/client.ts +0 -185
  32. package/lib/implements/account/manager.ts +0 -683
  33. package/lib/implements/aiproxy/client.ts +0 -357
  34. package/lib/implements/aiproxy/manager.ts +0 -670
  35. package/lib/implements/cache/client.ts +0 -105
  36. package/lib/implements/cache/manager.ts +0 -127
  37. package/lib/implements/comment/client.ts +0 -982
  38. package/lib/implements/comment/manager.ts +0 -1151
  39. package/lib/implements/dc/client.ts +0 -51
  40. package/lib/implements/dc/manager.ts +0 -33
  41. package/lib/implements/file/client.ts +0 -253
  42. package/lib/implements/file/file-cache-manager.ts +0 -142
  43. package/lib/implements/file/manager.ts +0 -1240
  44. package/lib/implements/file/seekableFileStream.ts +0 -344
  45. package/lib/implements/file/streamwriter.ts +0 -322
  46. package/lib/implements/keyvalue/client.ts +0 -376
  47. package/lib/implements/keyvalue/manager.ts +0 -759
  48. package/lib/implements/message/client.ts +0 -250
  49. package/lib/implements/message/manager.ts +0 -215
  50. package/lib/implements/threaddb/cbor/coding.ts +0 -62
  51. package/lib/implements/threaddb/cbor/event.ts +0 -336
  52. package/lib/implements/threaddb/cbor/node.ts +0 -542
  53. package/lib/implements/threaddb/cbor/record.ts +0 -398
  54. package/lib/implements/threaddb/common/AsyncMutex.ts +0 -24
  55. package/lib/implements/threaddb/common/addrinfo.ts +0 -135
  56. package/lib/implements/threaddb/common/dispatcher.ts +0 -81
  57. package/lib/implements/threaddb/common/idbstore-adapter.ts +0 -260
  58. package/lib/implements/threaddb/common/json-patcher.ts +0 -204
  59. package/lib/implements/threaddb/common/key.ts +0 -290
  60. package/lib/implements/threaddb/common/level-adapter.ts +0 -235
  61. package/lib/implements/threaddb/common/lineReader.ts +0 -79
  62. package/lib/implements/threaddb/common/logstore.ts +0 -215
  63. package/lib/implements/threaddb/common/transformed-datastore.ts +0 -308
  64. package/lib/implements/threaddb/core/app.ts +0 -206
  65. package/lib/implements/threaddb/core/core.ts +0 -230
  66. package/lib/implements/threaddb/core/db.ts +0 -249
  67. package/lib/implements/threaddb/core/event.ts +0 -54
  68. package/lib/implements/threaddb/core/head.ts +0 -89
  69. package/lib/implements/threaddb/core/identity.ts +0 -171
  70. package/lib/implements/threaddb/core/logstore.ts +0 -137
  71. package/lib/implements/threaddb/core/options.ts +0 -14
  72. package/lib/implements/threaddb/core/record.ts +0 -54
  73. package/lib/implements/threaddb/db/collection.ts +0 -1910
  74. package/lib/implements/threaddb/db/db.ts +0 -698
  75. package/lib/implements/threaddb/db/json2Query.ts +0 -192
  76. package/lib/implements/threaddb/db/query.ts +0 -524
  77. package/lib/implements/threaddb/dbclient.ts +0 -543
  78. package/lib/implements/threaddb/dbmanager.ts +0 -1906
  79. package/lib/implements/threaddb/lsstoreds/addr_book.ts +0 -549
  80. package/lib/implements/threaddb/lsstoreds/cache.ts +0 -36
  81. package/lib/implements/threaddb/lsstoreds/cyclic_batch.ts +0 -87
  82. package/lib/implements/threaddb/lsstoreds/global.ts +0 -151
  83. package/lib/implements/threaddb/lsstoreds/headbook.ts +0 -373
  84. package/lib/implements/threaddb/lsstoreds/keybook.ts +0 -297
  85. package/lib/implements/threaddb/lsstoreds/logstore.ts +0 -29
  86. package/lib/implements/threaddb/lsstoreds/metadata.ts +0 -223
  87. package/lib/implements/threaddb/net/define.ts +0 -149
  88. package/lib/implements/threaddb/net/grpcClient.ts +0 -589
  89. package/lib/implements/threaddb/net/grpcserver.ts +0 -146
  90. package/lib/implements/threaddb/net/net.ts +0 -2047
  91. package/lib/implements/threaddb/pb/lstore.proto +0 -38
  92. package/lib/implements/threaddb/pb/lstore.ts +0 -393
  93. package/lib/implements/threaddb/pb/lstore_pb.d.ts +0 -433
  94. package/lib/implements/threaddb/pb/lstore_pb.js +0 -1085
  95. package/lib/implements/threaddb/pb/net.proto +0 -194
  96. package/lib/implements/threaddb/pb/net_pb.d.ts +0 -2349
  97. package/lib/implements/threaddb/pb/net_pb.js +0 -5525
  98. package/lib/implements/threaddb/pb/proto-custom-types.ts +0 -212
  99. package/lib/implements/util/client.ts +0 -72
  100. package/lib/implements/util/manager.ts +0 -146
  101. package/lib/implements/wallet/manager.ts +0 -671
  102. package/lib/index.ts +0 -57
  103. package/lib/interfaces/DCContext.ts +0 -51
  104. package/lib/interfaces/aiproxy-interface.ts +0 -145
  105. package/lib/interfaces/auth-interface.ts +0 -118
  106. package/lib/interfaces/cache-interface.ts +0 -22
  107. package/lib/interfaces/client-interface.ts +0 -11
  108. package/lib/interfaces/comment-interface.ts +0 -167
  109. package/lib/interfaces/components/news-component.ts +0 -0
  110. package/lib/interfaces/database-interface.ts +0 -169
  111. package/lib/interfaces/file-interface.ts +0 -120
  112. package/lib/interfaces/index.ts +0 -10
  113. package/lib/interfaces/keyvalue-interface.ts +0 -156
  114. package/lib/interfaces/message-interface.ts +0 -22
  115. package/lib/interfaces/util-interface.ts +0 -31
  116. package/lib/modules/aiproxy-module.ts +0 -246
  117. package/lib/modules/auth-module.ts +0 -753
  118. package/lib/modules/cache-module.ts +0 -99
  119. package/lib/modules/client-module.ts +0 -71
  120. package/lib/modules/comment-module.ts +0 -429
  121. package/lib/modules/components/news-components.ts +0 -390
  122. package/lib/modules/database-module.ts +0 -598
  123. package/lib/modules/file-module.ts +0 -291
  124. package/lib/modules/index.ts +0 -13
  125. package/lib/modules/keyvalue-module.ts +0 -379
  126. package/lib/modules/message-module.ts +0 -107
  127. package/lib/modules/util-module.ts +0 -148
  128. package/lib/polyfills/process-env-browser.ts +0 -1
  129. package/lib/proto/datasource.ts +0 -93
  130. package/lib/proto/dcnet.proto +0 -1601
  131. package/lib/proto/dcnet_proto.d.ts +0 -22857
  132. package/lib/proto/dcnet_proto.js +0 -55204
  133. package/lib/proto/dcnet_proto_sparse.js +0 -55166
  134. package/lib/proto/oidfetch.proto +0 -25
  135. package/lib/proto/oidfetch_proto.d.ts +0 -585
  136. package/lib/proto/oidfetch_proto.js +0 -1247
  137. package/lib/serverless/babel-browser.ts +0 -39
  138. package/lib/serverless/base_entity.ts +0 -78
  139. package/lib/serverless/base_repository.ts +0 -414
  140. package/lib/serverless/browser_schema_extractor.ts +0 -283
  141. package/lib/serverless/decorator_factory.ts +0 -322
  142. package/lib/util/BrowserLineReader.ts +0 -73
  143. package/lib/util/base64.ts +0 -105
  144. package/lib/util/bcrypt.ts +0 -206
  145. package/lib/util/curve25519Encryption.ts +0 -418
  146. package/lib/util/dccrypt.ts +0 -73
  147. package/lib/util/logger.ts +0 -104
  148. package/lib/util/utils.ts +0 -289
package/lib/dc.ts DELETED
@@ -1,701 +0,0 @@
1
- // dc.ts
2
- // 主 DC 类,基于模块系统重构
3
- import type { Multiaddr } from "@multiformats/multiaddr";
4
- import { ChainUtil } from "./common/chain";
5
- import type {
6
- DCConnectInfo,
7
- APPInfo,
8
- User,
9
- AccountInfo,
10
- Account,
11
- } from "./common/types/types";
12
- import { DcUtil } from "./common/dcutil";
13
- import { type HeliaLibp2p } from "helia";
14
- import { Libp2p } from "@libp2p/interface";
15
- import { dc_protocol, walletOrigin } from "./common/define";
16
- import { DCGrpcServer } from "./implements/threaddb/net/grpcserver";
17
- import { Ed25519PrivKey, Ed25519PubKey } from "./common/dc-key/ed25519";
18
- import { DCContext } from "../lib/interfaces/DCContext";
19
- import { createLogger, configureLogger, LogLevel } from "./util/logger";
20
- import { ModuleSystem, CoreModuleName, DCModule } from "./common/module-system";
21
- import {
22
- FileModule,
23
- AuthModule,
24
- CommentModule,
25
- DatabaseModule,
26
- MessageModule,
27
- KeyValueModule,
28
- ClientModule,
29
- CacheModule,
30
- AIProxyModule,
31
- UtilModule,
32
- } from "./modules";
33
- import { Client } from "./common/dcapi";
34
- import { ICollectionConfig, IDBInfo } from "./implements/threaddb/core/core";
35
-
36
- const logger = createLogger("DC");
37
-
38
- /**
39
- * DC主类,整合所有功能模块
40
- * 基于模块系统,更轻量级和可扩展
41
- */
42
- export class DC implements DCContext {
43
- // 核心属性
44
- blockChainAddr: string;
45
- backChainAddr: string;
46
- dcChain: ChainUtil;
47
- dcNodeClient!: HeliaLibp2p<Libp2p>;
48
- dcutil: DcUtil;
49
- privateKey: Ed25519PrivKey | undefined;
50
- publicKey: Ed25519PubKey | undefined;
51
- dbThreadId: string = ""; // 当前用户的去中心化数据库ID
52
- ethAddress: string = ""; // 以太坊格式的公钥,16进制字符串
53
-
54
- // 连接相关
55
- public connectedDc: DCConnectInfo = {};
56
- public AccountBackupDc: DCConnectInfo = {};
57
- public Identity: string = "";
58
- public Blockheight: number = 0;
59
- public grpcServer!: DCGrpcServer;
60
- public appInfo: APPInfo;
61
- public shouldReturnUserInfo: boolean = false;
62
- public accountInfo: AccountInfo; // 当前登录的账户信息
63
- public userInfo: Account | null = null;
64
- public dbManager: any;
65
- public swUrl: string = "";
66
- public swInited: boolean = false;
67
-
68
- // 模块系统
69
- private moduleSystem: ModuleSystem;
70
-
71
- // 状态标志
72
- private initialized: boolean = false;
73
-
74
- /**
75
- * 创建DC实例
76
- * @param options 配置选项
77
- */
78
- constructor(options: {
79
- wssUrl: string;
80
- backWssUrl: string;
81
- appInfo?: APPInfo;
82
- swUrl?: string;
83
- logLevel?: LogLevel;
84
- names?: string[];
85
- }) {
86
- this.blockChainAddr = options.wssUrl;
87
- this.backChainAddr = options.backWssUrl;
88
- this.swUrl = options.swUrl || "";
89
- this.dcChain = new ChainUtil();
90
- this.dcutil = new DcUtil(this.dcChain);
91
- // //todo 发布注释 remove
92
- // this.dcutil.defaultPeerId= "12D3KooWEGzh4AcbJrfZMfQb63wncBUpscMEEyiMemSWzEnjVCPf";
93
- // //todo remove end
94
- this.appInfo = options.appInfo || ({} as APPInfo);
95
- this.accountInfo = {} as AccountInfo;
96
-
97
- // 设置日志级别
98
- if (options.logLevel !== undefined) {
99
- configureLogger({ level: options.logLevel });
100
- }
101
-
102
- // 创建模块系统
103
- this.moduleSystem = new ModuleSystem(this);
104
-
105
- // 注册核心模块
106
- this.registerCoreModules(options.names || []);
107
- }
108
-
109
- /**
110
- * 注册核心模块
111
- */
112
- private registerCoreModules(names: string[] = []): void {
113
- if (names && names.length > 0) {
114
- // 注册自定义模块
115
- for (const name of names) {
116
- const module = this.moduleSystem.getModule(name);
117
- if (module) {
118
- this.moduleSystem.registerModule(module);
119
- } else {
120
- logger.warn(`模块 ${name} 不存在,跳过注册`);
121
- }
122
- }
123
- } else {
124
- // 注册核心功能模块
125
- this.moduleSystem.registerModule(new FileModule(this.swUrl || ""));
126
- this.moduleSystem.registerModule(new AuthModule());
127
- this.moduleSystem.registerModule(new CommentModule());
128
- this.moduleSystem.registerModule(new DatabaseModule());
129
- this.moduleSystem.registerModule(new MessageModule());
130
- this.moduleSystem.registerModule(new KeyValueModule());
131
- this.moduleSystem.registerModule(new ClientModule());
132
- this.moduleSystem.registerModule(new CacheModule());
133
- this.moduleSystem.registerModule(new AIProxyModule());
134
- this.moduleSystem.registerModule(new UtilModule());
135
- }
136
-
137
- logger.info("核心模块注册完成");
138
- }
139
-
140
- /**
141
- * 注册自定义模块
142
- * @param module 要注册的模块
143
- * @returns 是否注册成功
144
- */
145
- registerModule(module: DCModule): boolean {
146
- return this.moduleSystem.registerModule(module);
147
- }
148
-
149
- /**
150
- * 初始化DC实例
151
- * backStep 0-注册模块成功,1-链节点连接成功,2-节点连接成功,3-初始化模块成功,
152
- * @returns 是否成功初始化
153
- */
154
- init = async (
155
- backStep?: (step: number) => Promise<void>
156
- ): Promise<boolean> => {
157
- if (this.initialized) {
158
- logger.warn("DC已经初始化,跳过重复初始化");
159
- return true;
160
- }
161
- backStep && (await backStep(0));
162
-
163
- let createChain = false;
164
- try {
165
- // 尝试创建主链接
166
- logger.info("尝试连接主链: " + this.blockChainAddr);
167
- createChain = await this.dcChain.create(this.blockChainAddr);
168
-
169
- if (!createChain) {
170
- // 换个路径重新创建
171
- logger.info("主链连接失败,尝试备用链: " + this.backChainAddr);
172
- createChain = await this.dcChain.create(this.backChainAddr);
173
-
174
- if (!createChain) {
175
- logger.error("dcchainapi 初始化失败: 无法连接任何链");
176
- return false;
177
- }
178
- }
179
-
180
- backStep && (await backStep(1));
181
- // 链节点已连接
182
- logger.info("链节点连接成功");
183
-
184
- // 创建节点客户端
185
- this.dcNodeClient = await this.dcutil?._createHeliaNode();
186
- logger.info("Helia节点创建成功");
187
-
188
- // 启动GRPC服务器
189
- this.grpcServer = new DCGrpcServer(this.dcNodeClient.libp2p, dc_protocol);
190
- this.grpcServer.start();
191
- logger.info("GRPC服务器启动成功");
192
-
193
- // 获取默认dc节点地址
194
- let nodeAddr = await this.dcutil?.getDefaultDcNodeAddr();
195
- if (nodeAddr) {
196
- logger.info("获取DC节点地址成功: " + nodeAddr.toString());
197
-
198
- try {
199
- // 拨号连接到节点
200
- const connection = await this.dcNodeClient?.libp2p.dial(nodeAddr, {
201
- signal: AbortSignal.timeout(5000),
202
- });
203
- logger.info("连接到DC节点成功");
204
-
205
- this.connectedDc.nodeAddr = nodeAddr; // 当前地址
206
- this.connectedDc.client = await this.newDcClient(nodeAddr);
207
-
208
- backStep && (await backStep(2));
209
- // 初始化所有模块
210
- const modulesInitialized = await this.moduleSystem.initializeAll();
211
- if (!modulesInitialized) {
212
- logger.error("模块初始化失败");
213
- return false;
214
- }
215
- // 在这里设置初始化标志,确保后续模块方法可以正常访问
216
- this.initialized = true;
217
- backStep && (await backStep(3));
218
-
219
- // 设置默认私钥
220
- const seed = crypto.getRandomValues(new Uint8Array(32));
221
- this.privateKey = Ed25519PrivKey.fromSeed(seed);
222
- const pubKey = this.privateKey.publicKey;
223
- this.publicKey = pubKey;
224
-
225
- // 定时维系token
226
- if (this.auth) {
227
- // 判断是否是钱包连接
228
- const appOrigin =
229
- typeof window !== "undefined" ? window.location.origin : ""; //"http://localhost:3002"
230
- if (appOrigin.indexOf(walletOrigin) === -1) {
231
- this.auth.startDcPeerTokenKeepValidTask();
232
- }
233
- }
234
-
235
- backStep && (await backStep(4));
236
- return true;
237
- } catch (error) {
238
- logger.error("连接到DC节点失败:", error);
239
- return false;
240
- }
241
- } else {
242
- logger.error("获取DC节点地址失败");
243
- return false;
244
- }
245
- } catch (error) {
246
- logger.error("DC初始化失败:", error);
247
- return false;
248
- }
249
- };
250
-
251
- setAppInfo(appInfo: APPInfo): void {
252
- this.appInfo = appInfo;
253
- }
254
-
255
- setAccountInfo(accountInfo: AccountInfo): void {
256
- this.accountInfo = accountInfo;
257
- }
258
-
259
- setShouldReturnUserInfo(shouldReturnUserInfo: boolean): void {
260
- this.shouldReturnUserInfo = shouldReturnUserInfo;
261
- }
262
-
263
- /**
264
- * 获取当前用户的去中心数据库信息,如果用户数据库不存在,则会自动创建
265
- * @param collections 集合配置数组,定义数据库中的集合结构
266
- * @param reset 是否重置数据库,默认为false,如果为true,则会重置数据库,原来的数据会丢失,应该只在开发调试时使用
267
- * @returns 当前用户的数据库信息
268
- */
269
- async initUserDB(
270
- collections: ICollectionConfig[],
271
- verno?: number, //版本编码,当版本编码变化时,需要重构表结构
272
- reset?: boolean
273
- ): Promise<[IDBInfo | null, Error | null]> {
274
- const dbName = "user_threaddb";
275
- let userInfo: User | null = null;
276
- try {
277
- this.assertInitialized();
278
- if (!this.auth) {
279
- return [null, new Error("用户模块不存在")];
280
- }
281
- const [user, err] = await this.auth.refreshUserInfo();
282
- if (err) {
283
- return [null, err];
284
- }
285
- if (!user) {
286
- return [null, new Error("用户信息不存在")];
287
- }
288
- userInfo = user;
289
-
290
- if (!reset && userInfo && userInfo.dbConfig) {
291
- // 如果存在dbConfig,说明已经设置了应用数据库,进行解密
292
- try {
293
- const [dbConfig, err] = await this.auth.decryptWithWallet(
294
- userInfo.dbConfigRaw
295
- );
296
- if (err || !dbConfig) {
297
- console.error("解密dbConfig失败", err);
298
- return [null, err as unknown as Error];
299
- }
300
- const threadDBInfo = new TextDecoder().decode(dbConfig);
301
- const threadDBInfos = threadDBInfo ? threadDBInfo.split("|") : [];
302
- if (threadDBInfos && threadDBInfos.length >= 3) {
303
- const threadid = threadDBInfos[0] || "";
304
- const rk = threadDBInfos[1] || "";
305
- const sk = threadDBInfos[2] || "";
306
- const fid = threadDBInfos[3] || ""; //预加载记录文件ID
307
- const preCount = threadDBInfos[4] || 0; //预加载记录条数
308
- //判断本地是否存在数据库
309
- if (!this.db) {
310
- return [null, new Error("数据库模块不存在")];
311
- }
312
- const [dbinfo, error] = await this.db.getDBInfo(threadid);
313
- if (dbinfo != null && !error) {
314
- //本地数据库存在,检查是否需要表结构升级
315
- if (verno) {
316
- //获取本地localVersion
317
- const localVersion = await this.db.loadVerno(threadid);
318
- if (localVersion != verno) {
319
- //版本号不一致,需要升级表结构
320
- const err = await this.db.upgradeCollections(
321
- threadid,
322
- collections
323
- );
324
- if (err) {
325
- console.error("升级表结构失败", err);
326
- return [null, err];
327
- }
328
- // 更新本地版本号
329
- await this.db.saveVerno(threadid, verno);
330
- }
331
- // 需要升级表结构
332
- await this.db.upgradeCollections(threadid, collections);
333
- }
334
-
335
- this.db.refreshDBFromDC(threadid);
336
- //3秒后将本地数据库同步到DC
337
- setTimeout(() => {
338
- if (this.db) {
339
- this.db.syncDBToDC(threadid);
340
- }
341
- }, 5000);
342
- this.dbThreadId = dbinfo.id;
343
- return [dbinfo, null];
344
- } else if (threadid != "") {
345
- //本地数据库不存在,从DC同步
346
- await this.db.syncDbFromDC(
347
- threadid,
348
- dbName,
349
- "",
350
- rk,
351
- sk,
352
- true,
353
- collections
354
- );
355
- const [dbinfo, error] = await this.db.getDBInfo(threadid);
356
- if (dbinfo != null && !error) {
357
- this.dbThreadId = dbinfo.id;
358
- return [dbinfo, null]; //返回dbinfo;
359
- } else {
360
- // 获取DB失败
361
- return [null, error ? error : new Error("获取DB失败")];
362
- }
363
- }
364
- }
365
- } catch (error: any) {
366
- console.error("解密dbConfig失败", error);
367
- return [null, error];
368
- }
369
- }
370
- if (!this.util) {
371
- return [null, new Error("util模块不存在")];
372
- }
373
- if (!this.db) {
374
- return [null, new Error("数据库模块不存在")];
375
- }
376
- //数据库不存在,创建应用数据库
377
- const rk = this.util.createSymmetricKey();
378
- const sk = this.util.createSymmetricKey();
379
- // 初始化DB数据库结构
380
- const [threadId, newDBError] = await this.db.newDB(
381
- dbName,
382
- rk.toString(),
383
- sk.toString(),
384
- collections
385
- );
386
- if (newDBError || !threadId) {
387
- console.error("创建用户去中心化数据库失败", newDBError);
388
- return [null, newDBError];
389
- }
390
- if (threadId) {
391
- //数据库创建成功
392
- // 设置用户默认DB
393
- const setUserDefaultDBRes = await this.setUserDefaultDB(
394
- this,
395
- threadId,
396
- rk.toString(),
397
- sk.toString()
398
- );
399
- if (!setUserDefaultDBRes) {
400
- // 设置用户默认DB失败
401
- console.error("设置用户去中心DB失败");
402
- return [null, new Error("设置用户去中心DB失败")];
403
- }
404
- }
405
- if (!this.db) {
406
- return [null, new Error("数据库模块不存在")];
407
- }
408
- const [dbinfo, error] = await this.db.getDBInfo(threadId);
409
- if (dbinfo != null && !error) {
410
- this.dbThreadId = dbinfo.id;
411
- return [dbinfo, null]; //返回dbinfo;
412
- } else {
413
- this.dbThreadId = "";
414
- // 获取DB失败
415
- console.error("获取DB失败", error);
416
- return [null, error];
417
- }
418
- } catch (error: any) {
419
- console.error("初始化用户DB失败", error);
420
- return [null, error];
421
- }
422
- }
423
-
424
- // 设置用户DB
425
- private async setUserDefaultDB(
426
- dc: DC,
427
- DBthreadid: string,
428
- rk: string,
429
- sk: string,
430
- remark?: string
431
- ): Promise<boolean> {
432
- // 加到用户信息上
433
- try {
434
- if (!dc.auth) {
435
- return false;
436
- }
437
- await dc.auth.setUserDefaultDB(DBthreadid, rk, sk, remark || "");
438
- } catch (error) {
439
- console.error("设置用户默认DB失败", error);
440
- return false;
441
- }
442
- // 循环获取用户信息,是否存在db,true成功
443
- const res = await this.checkSetUserDefaultDB(dc);
444
- return res;
445
- }
446
-
447
- // 判断是否设置用户默认DB
448
- private async checkSetUserDefaultDB(dc: DC): Promise<boolean> {
449
- return new Promise(async (resolve) => {
450
- let intervalNum = 0; // 定时判断是否绑定成功
451
- // 初始化定时器
452
- let interval = setInterval(async () => {
453
- intervalNum++;
454
- if (intervalNum > 20) {
455
- // 超时停止定时任务
456
- interval ? clearInterval(interval) : "";
457
- intervalNum = 0;
458
- resolve(false);
459
- }
460
- // 获取用户信息,判断空间有效期是否延长
461
- if (dc.auth) {
462
- const [user, err] = await dc.auth.refreshUserInfo();
463
- if (!err && user && user.dbConfig) {
464
- // 绑定成功停止定时任务
465
- interval ? clearInterval(interval) : "";
466
- intervalNum = 0;
467
- resolve(true);
468
- }
469
- }
470
- }, 1000);
471
- });
472
- }
473
-
474
- /**
475
- * 关闭并清理资源
476
- */
477
- async shutdown(): Promise<void> {
478
- logger.info("开始关闭DC...");
479
-
480
- // 关闭所有模块
481
- await this.moduleSystem.shutdownAll();
482
-
483
- // 关闭GRPC服务器
484
- if (this.grpcServer) {
485
- this.grpcServer.stop();
486
- logger.info("GRPC服务器已停止");
487
- }
488
-
489
- // 关闭libp2p连接
490
- if (this.dcNodeClient && this.dcNodeClient.libp2p) {
491
- await this.dcNodeClient.libp2p.stop();
492
- logger.info("libp2p连接已关闭");
493
- }
494
-
495
- this.initialized = false;
496
- logger.info("DC已成功关闭");
497
- }
498
-
499
- /**
500
- * 退出并清理资源
501
- */
502
- async exit() {
503
- this.AccountBackupDc = {}; // 清理账号备份连接信息
504
- this.publicKey = undefined; // 清理公钥
505
- this.dbThreadId = ""; // 清理数据库ID
506
- this.ethAddress = ""; // 清理以太坊地址
507
-
508
- // 清空iframe的私钥公钥
509
- if (this.auth) {
510
- this.auth.exitLogin();
511
- }
512
- logger.info("DC已退出并清理资源");
513
- }
514
-
515
- /**
516
- * 签名方法
517
- * @param payload 需要签名的数据
518
- * @returns 签名结果
519
- */
520
- sign = async (payload: Uint8Array): Promise<Uint8Array> => {
521
- if (!this.auth) {
522
- return new Uint8Array();
523
- }
524
- const signature = this.auth.signWithWallet(payload);
525
- return signature;
526
- };
527
-
528
- setPublicKey(publicKey: Ed25519PubKey) {
529
- this.publicKey = publicKey;
530
- }
531
- /**
532
- * 获取公钥
533
- * @returns 公钥对象
534
- */
535
- getPublicKey(): Ed25519PubKey {
536
- if (!this.publicKey) {
537
- throw new Error("公钥未初始化");
538
- }
539
- return this.publicKey;
540
- }
541
-
542
- /**
543
- * 获取原始公钥数据
544
- * @returns 原始公钥字节数据
545
- */
546
- getPubkeyRaw(): Uint8Array {
547
- if (!this.publicKey) {
548
- throw new Error("公钥未初始化");
549
- }
550
- return this.publicKey.raw;
551
- }
552
-
553
- /**
554
- * 创建DC客户端
555
- * @param nodeAddr 节点地址
556
- * @returns DC客户端
557
- */
558
- private newDcClient = async (nodeAddr: Multiaddr) => {
559
- if (!nodeAddr) {
560
- return undefined;
561
- }
562
-
563
- try {
564
- const dcClient = new Client(
565
- this.dcNodeClient.libp2p,
566
- this.dcNodeClient.blockstore,
567
- nodeAddr,
568
- dc_protocol
569
- );
570
- return dcClient;
571
- } catch (error) {
572
- logger.error("创建DC客户端失败:", error);
573
- throw error;
574
- }
575
- };
576
-
577
- /**
578
- * 检查DC实例是否已初始化
579
- * @returns 是否已初始化
580
- */
581
- isInitialized(): boolean {
582
- return this.initialized;
583
- }
584
-
585
- /**
586
- * 获取已注册的模块列表
587
- */
588
- getRegisteredModules(): string[] {
589
- return this.moduleSystem.getRegisteredModules();
590
- }
591
-
592
- /**
593
- * 获取指定模块
594
- * @param moduleName 模块名称
595
- * @returns 模块实例
596
- */
597
- getModule<T extends DCModule>(moduleName: string): T | null {
598
- try {
599
- this.assertInitialized();
600
- const module = this.moduleSystem.getModule<T>(moduleName);
601
- if (!module) {
602
- throw new Error(`模块 ${moduleName} 不存在或未注册`);
603
- }
604
- return module;
605
- } catch (error) {
606
- return null;
607
- }
608
- }
609
-
610
- /**
611
- * 断言DC已初始化
612
- * @throws 如果DC未初始化则抛出错误
613
- */
614
- private assertInitialized(): void {
615
- if (!this.initialized) {
616
- throw new Error("DC未初始化,请先调用init()方法");
617
- }
618
- }
619
-
620
- // ========== 便捷访问核心模块的方法 ==========
621
-
622
- /**
623
- * 获取文件模块
624
- * @returns 文件模块实例
625
- */
626
- get file() {
627
- return this.getModule<FileModule>(CoreModuleName.FILE);
628
- }
629
-
630
- /**
631
- * 获取认证模块
632
- * @returns 认证模块实例
633
- */
634
- get auth() {
635
- return this.getModule<AuthModule>(CoreModuleName.AUTH);
636
- }
637
-
638
- /**
639
- * 获取评论模块
640
- * @returns 评论模块实例
641
- */
642
- get comment() {
643
- return this.getModule<CommentModule>(CoreModuleName.COMMENT);
644
- }
645
-
646
- /**
647
- * 获取数据库模块
648
- * @returns 数据库模块实例
649
- */
650
- get db() {
651
- return this.getModule<DatabaseModule>(CoreModuleName.DATABASE);
652
- }
653
-
654
- /**
655
- * 获取消息模块
656
- * @returns 消息模块实例
657
- */
658
- get message() {
659
- return this.getModule<MessageModule>(CoreModuleName.MESSAGE);
660
- }
661
-
662
- /**
663
- * 获取键值存储模块
664
- * @returns 键值存储模块实例
665
- */
666
- get keyValue() {
667
- return this.getModule<KeyValueModule>(CoreModuleName.KEYVALUE);
668
- }
669
-
670
- /**
671
- * client
672
- * @returns 客户端实例
673
- */
674
- get client() {
675
- return this.getModule<ClientModule>(CoreModuleName.CLIENT);
676
- }
677
-
678
- /**
679
- * 缓存模块
680
- * @returns 缓存模块实例
681
- */
682
- get cache() {
683
- return this.getModule<CacheModule>(CoreModuleName.CACHE);
684
- }
685
-
686
- /**
687
- * AI代理模块
688
- * @returns AI代理模块实例
689
- */
690
- get aiproxy() {
691
- return this.getModule<AIProxyModule>(CoreModuleName.AIPROXY);
692
- }
693
-
694
- /**
695
- * 工具模块
696
- * @returns 工具模块实例
697
- */
698
- get util() {
699
- return this.getModule<UtilModule>(CoreModuleName.UTIL);
700
- }
701
- }