Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: optimize localDB getAllRecords performance #6342

Open
wants to merge 4 commits into
base: x
Choose a base branch
from

Conversation

sidmorizon
Copy link
Contributor

@sidmorizon sidmorizon commented Dec 13, 2024

Summary by CodeRabbit

  • 新功能

    • TokenListView 组件中添加了可选属性 emptyAccountView,允许在没有代币时自定义视图。
    • ServiceAccount 类中,getAllWallets 方法更新为返回包含钱包和所有设备的对象。
    • ServiceAppCleanup 类中,cleanup 方法新增参数 indexedAccountsRemoved,增强清理功能。
    • HomePageView 组件中引入了 networkUtils,并使用 useMemo 优化了 emptyAccountView 的渲染逻辑。
    • TokenListContainer 组件中添加了 useIntl 钩子以支持国际化。
  • Bug 修复

    • 更新 ManageAccountActivity 组件以优化钱包数据获取逻辑。
  • 文档

    • 更新了多个组件和服务的类型定义,增强类型安全性。
  • 样式

    • GlobalJotaiReady 组件中引入 startTransition 函数以改善状态更新性能。

Copy link

codesandbox bot commented Dec 13, 2024

Review or Edit in CodeSandbox

Open the branch in Web EditorVS CodeInsiders

Open Preview

Copy link
Contributor

coderabbitai bot commented Dec 13, 2024

总览

代码变更概述

这次代码更新涉及多个包和组件,主要集中在以下几个关键领域:

  1. 数据库和缓存管理
  2. 状态管理优化
  3. 通知和账户服务增强
  4. 性能和错误处理改进

主要变更亮点

  • 引入了更精细的缓存机制
  • 优化了账户和设备数据检索流程
  • 改进了状态更新和转换处理
  • 增强了错误追踪和日志记录能力

详细变更

数据库和缓存管理

文件: LocalDbBase.ts

  • 移除了原有的 getAllWallets 方法
  • 新增 getAllDevicesgetAllWallets 方法
  • 实现了缓存机制,提高数据检索性能

文件: LocalDbBaseContainer.ts

  • 引入 dbAllRecordsCache,支持记录缓存
  • 改进了缓存清理逻辑

状态管理优化

文件: jotaiStorage.ts

  • 更新 atomWithStorage 函数签名
  • 引入深度比较机制
  • 改进promise处理逻辑

通知和账户服务

文件: ServiceNotification.ts

  • 优化通知钱包处理
  • 引入性能工具 perfUtils
  • 改进状态更新机制

错误处理与性能

文件: errorUtils.ts

  • 新增 getCurrentCallStack 函数
  • 提供更详细的错误追踪能力

文件: dbPerfMonitor.ts

  • 增强数据库调用日志记录
  • 添加阈值警告机制

技术亮点

  1. 缓存策略更加智能
  2. 状态管理更加高效
  3. 错误追踪更加精确
  4. 代码类型安全性提升

潜在影响

  • 性能可能会有显著提升
  • 错误诊断将更加容易
  • 代码维护性增强

建议

开发团队应:

  • 仔细测试新的缓存和状态管理机制
  • 验证错误处理逻辑
  • 监控性能指标

Tip

CodeRabbit's docstrings feature is now available as part of our Early Access Program! Simply use the command @coderabbitai generate docstrings to have CodeRabbit automatically generate docstrings for your pull request. We would love to hear your feedback on Discord.


🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary or Summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@sidmorizon sidmorizon marked this pull request as ready for review December 25, 2024 01:56
@sidmorizon sidmorizon enabled auto-merge (squash) December 25, 2024 01:56
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 20

🔭 Outside diff range comments (4)
packages/kit-bg/src/services/ServiceAccountSelector.ts (1)

Line range hint 2682-2685: 提高可读性:拆分或命名变量。
短小的解构语句可理解,但反复跨行拼接可读性一般。考虑直接在同一行解构或通过清晰命名来增强可读性。

packages/kit-bg/src/dbs/local/indexed/IndexedDBAgent.ts (3)

Line range hint 311-353: 建议优化大数据集的处理性能

当前实现在处理大数据集时可能存在性能问题:

  1. 没有ID时会执行全表扫描
  2. 默认情况下没有分页限制
  3. 大数据集可能导致内存问题

建议添加以下优化:

 async txGetAllRecords<T extends ELocalDBStoreNames>(
   params: ILocalDBTxGetAllRecordsParams<T>,
 ): Promise<ILocalDBTxGetAllRecordsResult<T>> {
-  const { tx: paramsTx, name, ids, limit, offset } = params;
+  const { 
+    tx: paramsTx, 
+    name, 
+    ids, 
+    limit = 1000, // 添加默认限制
+    offset = 0 
+  } = params;

   dbPerfMonitor.logLocalDbCall(`txGetAllRecords`, name, [
     `ids_count=${ids ? ids?.length?.toString() : 'ALL'}`,
   ]);

同时建议添加批处理功能,避免一次性加载过多数据:

async function* batchGetAllRecords<T extends ELocalDBStoreNames>(
  params: ILocalDBTxGetAllRecordsParams<T>,
  batchSize: number = 1000
): AsyncGenerator<ILocalDBRecord<T>[], void, unknown> {
  let currentOffset = 0;
  while (true) {
    const { records } = await this.txGetAllRecords({
      ...params,
      limit: batchSize,
      offset: currentOffset
    });
    if (records.length === 0) break;
    yield records;
    if (records.length < batchSize) break;
    currentOffset += batchSize;
  }
}

Line range hint 324-353: 建议优化索引使用策略

当前代码仅对 SignedMessage 表的 createdAt 索引进行了特殊处理。建议扩展这个模式到其他表,提高查询性能。

- if (indexStore.indexNames.contains('createdAt')) {
+ // 根据表的特点选择合适的索引
+ const indexName = this.getOptimalIndexForStore(name);
+ if (indexName && indexStore.indexNames.contains(indexName)) {

Line range hint 311-353: 建议添加性能监控指标

为了更好地监控性能问题,建议添加更多的性能指标。

 async txGetAllRecords<T extends ELocalDBStoreNames>(
   params: ILocalDBTxGetAllRecordsParams<T>,
 ): Promise<ILocalDBTxGetAllRecordsResult<T>> {
   const { tx: paramsTx, name, ids, limit, offset } = params;
+  const startTime = performance.now();
   dbPerfMonitor.logLocalDbCall(`txGetAllRecords`, name, [
     `ids_count=${ids ? ids?.length?.toString() : 'ALL'}`,
   ]);
   // ... existing code ...
+  const endTime = performance.now();
+  dbPerfMonitor.logPerformanceMetric(`txGetAllRecords_${name}`, endTime - startTime);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4f1eff6 and 3cd61ec.

📒 Files selected for processing (31)
  • apps/desktop/App.tsx (1 hunks)
  • development/spellCheckerSkipWords.js (1 hunks)
  • packages/kit-bg/src/dbs/local/LocalDbBase.ts (6 hunks)
  • packages/kit-bg/src/dbs/local/LocalDbBaseContainer.ts (4 hunks)
  • packages/kit-bg/src/dbs/local/indexed/IndexedDBAgent.ts (1 hunks)
  • packages/kit-bg/src/dbs/local/indexed/LocalDbIndexed.ts (1 hunks)
  • packages/kit-bg/src/dbs/local/realm/LocalDbRealm.ts (1 hunks)
  • packages/kit-bg/src/dbs/local/types.ts (1 hunks)
  • packages/kit-bg/src/services/ServiceAccount/ServiceAccount.ts (7 hunks)
  • packages/kit-bg/src/services/ServiceAccountSelector.ts (1 hunks)
  • packages/kit-bg/src/services/ServiceAllNetwork/ServiceAllNetwork.ts (1 hunks)
  • packages/kit-bg/src/services/ServiceAppCleanup/ServiceAppCleanup.ts (4 hunks)
  • packages/kit-bg/src/services/ServiceNotification/ServiceNotification.ts (15 hunks)
  • packages/kit-bg/src/services/ServiceToken.ts (0 hunks)
  • packages/kit-bg/src/states/jotai/atomNames.ts (1 hunks)
  • packages/kit-bg/src/states/jotai/jotaiStorage.ts (5 hunks)
  • packages/kit-bg/src/states/jotai/utils/index.ts (7 hunks)
  • packages/kit-bg/src/states/jotai/utils/jotaiVerify.ts (1 hunks)
  • packages/kit-bg/src/states/jotai/utils/wrapAtomPro.ts (2 hunks)
  • packages/kit/src/components/GlobalJotaiReady/GlobalJotaiReady.tsx (2 hunks)
  • packages/kit/src/components/RenameDialog/index.tsx (1 hunks)
  • packages/kit/src/components/TokenListView/index.tsx (4 hunks)
  • packages/kit/src/states/jotai/contexts/accountSelector/atoms.ts (0 hunks)
  • packages/kit/src/views/Home/pages/HomePageView.tsx (4 hunks)
  • packages/kit/src/views/Home/pages/TokenListContainer.tsx (8 hunks)
  • packages/kit/src/views/Setting/pages/Notifications/ManageAccountActivity.tsx (1 hunks)
  • packages/shared/src/errors/utils/errorUtils.ts (3 hunks)
  • packages/shared/src/utils/cacheUtils.ts (2 hunks)
  • packages/shared/src/utils/debug/dbPerfMonitor.ts (4 hunks)
  • packages/shared/src/utils/debug/perfUtils.ts (2 hunks)
  • packages/shared/src/utils/promiseUtils.ts (1 hunks)
💤 Files with no reviewable changes (2)
  • packages/kit-bg/src/services/ServiceToken.ts
  • packages/kit/src/states/jotai/contexts/accountSelector/atoms.ts
🧰 Additional context used
🪛 Biome (1.9.4)
packages/kit-bg/src/states/jotai/utils/jotaiVerify.ts

[error] 6-7: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 11-11: This is an unexpected use of the debugger statement.

Unsafe fix: Remove debugger statement

(lint/suspicious/noDebugger)

packages/shared/src/utils/debug/dbPerfMonitor.ts

[error] 311-311: Reassigning a function parameter is confusing.

The parameter is declared here:

Use a local variable instead.

(lint/style/noParameterAssign)

packages/kit-bg/src/states/jotai/jotaiStorage.ts

[error] 180-180: Reassigning a function parameter is confusing.

The parameter is declared here:

Use a local variable instead.

(lint/style/noParameterAssign)

packages/kit-bg/src/services/ServiceAppCleanup/ServiceAppCleanup.ts

[error] 111-111: Reassigning a function parameter is confusing.

The parameter is declared here:

Use a local variable instead.

(lint/style/noParameterAssign)

packages/kit-bg/src/dbs/local/LocalDbBase.ts

[error] 2736-2736: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 2754-2754: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 2797-2797: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 2815-2815: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

🔇 Additional comments (89)
packages/kit/src/views/Home/pages/HomePageView.tsx (3)

138-154: 封装逻辑简洁清晰。
emptyAccountView 提升了可读性,并且依赖数组也合适。保留这种封装风格比内联好。


200-200: 保持代码结构一致。
此处使用 emptyAccountView 让布局更干净,和上面保持一致即可。


226-226: 依赖管理恰当。
emptyAccountView 放进依赖数组是正确操作。确保更新后渲染能触发重新计算。

packages/kit/src/components/GlobalJotaiReady/GlobalJotaiReady.tsx (2)

1-1: 导入 startTransition 很好。让状态切换更顺畅,性能更佳。


11-13: 使用 startTransition 包裹 setIsReady 为异步更新提供更好体验。

packages/kit/src/components/TokenListView/index.tsx (3)

68-68: 声明 emptyAccountView 属性能让组件渲染逻辑更灵活。


95-95: 从 props 中解构 emptyAccountView,增强可读性。


225-227: 检测到 emptyAccountView 时,直接返回自定义空视图,简洁好用。

packages/kit/src/views/Home/pages/TokenListContainer.tsx (9)

6-6: 引入 useIntl 方便国际化,增加易用性。


11-11: 新增 Stack 等组件导入,一目了然,无问题。


60-60: EmptyAccount 提示空账户,组合清晰,易扩展。


69-72: 增加 useAllNetworksStateStateAtom 等,用于管理全网状态,逻辑更完善。


86-86: 从 activeAccount 拿到 accountName,有助于更灵活显示账号信息。


99-99: intl = useIntl() 搭配 formatMessage 统一语言资源,可读性强。


1249-1260: 为 AddDBAccountsToWallet 注册监听器,触发全网刷新。记得及时卸载,避免内存泄漏。


1370-1377: isAllNetworkEmptyAccount 逻辑判断简洁。返回可直接判断是否为空账号。


1396-1413: emptyAccountView 配合 isAllNetworkEmptyAccount,可自定义空视图,友好且灵活。

packages/kit-bg/src/services/ServiceAppCleanup/ServiceAppCleanup.ts (4)

11-11: 导入新增类型看起来没问题。
没有发现明显风险,这里可以继续保持。


51-56: 新增参数使清理逻辑更灵活。
默认值与类型优雅衔接,看起来不错,避免了空值异常的风险。


69-69: 调用时显式传入参数可读性更高。
确保所有调用方也已同步更新,尤其是调用 cleanupIndexedAccounts 的地方。


107-107: 新方法的签名设计合理。
与参数模式保持一致。

packages/shared/src/errors/utils/errorUtils.ts (3)

1-1: 移除不必要的导入,保持代码简洁。
看起来你已不再使用 isPlainObject,请确认没有遗漏相关引用。


184-192: 注意性能开销与异常处理。
getCurrentCallStack() 通过抛出错误再捕获来获取堆栈,逻辑简单易懂,但频繁调用可能增加性能负担。请考虑调用频率与潜在的敏感信息泄露风险。


202-202: 新增导出函数已就绪。
getCurrentCallStack 添加到默认导出,对外部使用很方便,无明显问题。

packages/shared/src/utils/debug/dbPerfMonitor.ts (5)

4-4: 正确导入 errorUtils 库。
这样可直接使用 getCurrentCallStack,整合错误位置信息,增强调试。


38-39: 更新调试规则支持更多场景。
你在 shouldLocalDbDebuggerRule 加入/修改了多条键值,便于细分哪些操作引发调试。此处设计清晰,便于排查性能瓶颈。

Also applies to: 41-41, 44-44, 49-49


313-317: 新增计数逻辑有助跟踪调用频率。
localDb.txGetAllRecords 专门进行统计可更高效定位性能瓶颈,建议结合日志做进一步监控。


431-431: 阈值提醒有必要,保证性能预警。
当访问频次超出 toastWarningSize 时及时提醒开发者,并重置统计,避免日志泛滥。


436-436: 触发 toast 时机明确。
在阈值超出后立刻调用 toastWarningAndReset,能保证高频访问被及时发现。

packages/kit-bg/src/states/jotai/utils/wrapAtomPro.ts (4)

9-9: 导入校验工具很实用
此处引入 jotaiVerify 能提升对 Promise 的防护,逻辑清晰无误。


53-54: 保证传入值非 Promise 的思路很清晰
update 做非 Promise 校验,有效防止意外异步逻辑干扰。


55-73: 谨慎处理上一个值与新值的混合类型
这里通过判断 update 是否函数,再用 await 处理原值的 Promise 状态,逻辑衔接自然。注意不要让 promise 未完成就被覆盖,当前实现已妥善应对。


74-74: 最后一道非 Promise 校验
再一次确保 nextValue 非 Promise,提高安全性。实现简单易懂,值得保留。

packages/kit-bg/src/states/jotai/jotaiStorage.ts (11)

4-4: lodash 函数的导入
使用 isEqual 等函数能简化深度比较,写法更直观。


11-11: 引入 createPromiseTarget 非常灵活
此工具有助于管理异步逻辑,避免回调嵌套。


Line range hint 69-80: 函数签名修改为引用 IAtomNameKeys
以更严谨的方式传入参数类型,利于维护和阅读。


91-91: 保持一致的函数重载设计
atomWithStorage 提供多个重载签名,让调用端更有弹性。


114-115: 对 update 值进行非 Promise 校验
通过 jotaiVerify 手段,能避免不小心传入异步结果导致混乱。


116-137: 详细处理函数式更新与 Promise 值
这里先判断 update 是否函数,再处理旧值。并且对 Promise 进行 await 后再校验,有效防止异步错乱。


142-144: merge 函数很好用
通过 merge({}, initialValue, nextValue) 保持默认值合并,逻辑简洁。


145-156: 深度比对保证数据没实质变化时跳过更新
这种判断可避免无必要写入,减少存储成本及触发的副作用。


158-160: 原子状态一次性写入简洁可靠
此处存储后再 setItem,有序保持数据与存储一致。


184-219: 异步 flow 安排得当
这里依次判断 Promise,再次校验。多层合并与更新都按序进行,一看便知。


221-226: 最后的返回保证线程安全
p.ready 同步外部逻辑,利于可靠性。无明显缺陷。

packages/kit-bg/src/services/ServiceNotification/ServiceNotification.ts (14)

17-17: 性能优化工具引入
可更方便检测渲染瓶颈或重复更新,推荐继续在重要逻辑上使用。


216-221: 使用 perfUtils 构建新值
配合 Jotai 状态合并,确保只在必要时更新,避免多余重渲染。


428-433: 同样利用 perfUtils 做新值构建
操作的抽象统一,代码风格保持一致,不易出错。


484-497: 为 fixAccountActivityNotificationSettings 做前置校验
确保 notificationWallets 存在后再继续,减少重复查询。流程通畅。


511-561: 过滤可用网络并获取账户对象
抓住 account.impl 匹配网络,用 try-catch 保持函数安全,对无效情况也能容错。


580-607: buildSyncAccounts 提供灵活获取模式
支持全量或指定 accountIds,并顺带清理过时数据,逻辑井然有序。


617-619: 延迟提交追加账户
采用 debounce 合理分批提交,同步效率稳定高日常值得依赖。


655-665: 重置后立即更新注册时间
登记完后写入 lastRegisterTime,一目了然,严谨细致。


680-684: 新方法更灵活获取 wallets & accounts
参数化方式让上层传入已有数据,减少重复请求。


700-703: 精确查找 wallet 名称
扫描 notificationWallets 避免重复循环,代码简单不冗长。


723-731: 按照最大可用账户数做修正
监控数量,自动禁用多余账户,保持用户体验也能防止系统负担。


811-811: 遍历所有钱包与隐藏钱包
以相同逻辑批量更新,简明易懂,处理漏掉场景的风险更低。


827-832: 记录更新时间到 Jotai 状态
成功保存后给数据打时间戳,看起来直观易懂。


924-929: 异常时重置 lastRegisterTime
若注册失败,将其置空能提醒系统或用户后续重试。

packages/kit-bg/src/dbs/local/realm/LocalDbRealm.ts (1)

7-7: reset 前不再传参
你简化了 clearStoreCachedData() 调用,实际清理逻辑由内部统一处理,易维护。

packages/kit-bg/src/dbs/local/indexed/LocalDbIndexed.ts (1)

9-9: 清理数据范围更广,建议检查兼容性。
调用 clearStoreCachedData() 不传参会清理所有缓存。请确保这符合预期,不会意外清空其他关键数据。

apps/desktop/App.tsx (1)

15-15: 改用 KitProvider,可能影响全局错误捕获。
你注释掉了 withSentryHOC,需要确认是否还需保留 Sentry 或有相应替换方案。

packages/kit-bg/src/states/jotai/utils/jotaiVerify.ts (1)

16-18: 导出结构清晰,便于使用。
该写法简洁明了,让人更易理解。

packages/kit-bg/src/states/jotai/atomNames.ts (1)

42-49: 类型定义很明确。
建议确保所有枚举值都能在 IAtomNameKeys 中对应。这样能避免拼写或引用错误,增强安全性。

packages/kit-bg/src/dbs/local/LocalDbBaseContainer.ts (8)

2-2: 引入新依赖。
memoizee 结合 cacheUtils 提升缓存效率。确保只在需要场景使用,避免缓存占用过多内存。


8-11: 类型声明清晰。
声明了新的数据库实体类型,方便维护和快速查找,增强可读性。


113-115: 有条件清缓存。
clearStoreCachedDataIfMatch 针对指定 store,逻辑更精确。避免无关 store 数据被清。


119-123: 缓存清理方法统一。
clearStoreCachedData 同时清理多处缓存,减少冗余操作。建议在文档说明用途。


141-141: 更新记录后自动清缓存。
保障数据一致性,逻辑合理。避免旧缓存误导读操作。


150-150: 新增记录前检查缓存。
同上,统一的清缓存策略,保持一致性。


158-158: 删除记录后同步清缓存。
操作链完整严谨,减少出错概率。与其他方法保持一致。


166-166: 清空指定表缓存。
安全可靠,逻辑连贯,与数据库操作融为一体。

packages/kit/src/components/RenameDialog/index.tsx (1)

40-40: 解构获取accounts。
语义更明确,简化了赋值过程。请确保后续使用不会有字段丢失。

packages/shared/src/utils/debug/perfUtils.ts (2)

209-214: 实现逻辑清晰,无多余操作,可读性很好。


220-220: 统一导出函数是个好做法,有助于可读性和维护性。

packages/kit-bg/src/states/jotai/utils/index.ts (7)

15-15: 引入新类型 IAtomNameKeys,增强了对 storageName 的类型约束,减少了潜在的使用错误。


50-50: 使用 IAtomNameKeys 替代 string,更符合类型安全需求。


65-65: mandatory 的 storageName 同样切换到 IAtomNameKeys,类型定义更精确。


83-83: 让 storageName 可选时也指向 IAtomNameKeys,代码一致性更高。


100-100: 可写原子时的 storageName 参数也跟随切换,整体统一且便于维护。


116-116: 读写原子皆用 IAtomNameKeys,不再混用 string,避免发生错用。


128-128: 构造器里再度声明 storageName?: IAtomNameKeys,与前面定义保持一致。

development/spellCheckerSkipWords.js (1)

23-23: 增加 “ttl” 让拼写检查器跳过,更贴合需求。

packages/kit-bg/src/services/ServiceAllNetwork/ServiceAllNetwork.ts (1)

109-114: 从异步调用结果中直接解构出 accounts,不再直接赋值给 dbAccounts,逻辑更直观也利于扩展。

packages/kit-bg/src/dbs/local/types.ts (1)

208-208: 空行可读性尚可,无需额外处理。
这里仅是代码排版上的变动,可以忽略。

packages/kit/src/views/Setting/pages/Notifications/ManageAccountActivity.tsx (1)

750-752: 调用新方法时,请留意错误处理。
如果接口 getNotificationWalletsWithAccounts 返回空或异常,需要提示用户或处理回退逻辑,以免引起空数组后续操作出错。

packages/kit-bg/src/services/ServiceAccount/ServiceAccount.ts (3)

171-171: 新增缓存清理调用会影响全局缓存。
确保上层流程对清缓存有足够判断,避免误删缓存影响性能或其他功能。


1759-1788: 可读性警示:条件分支多,层次较深。
建议拆分为数个小函数或精简分支,以免后期难维护。也可加适当注释,解释关键逻辑。


1805-1822: getAllWallets 新增可选参数后,留意向后兼容。
有些调用可能不需要补充信息。如果外部忘记传参,是否会影响行为?需确保默认值正确。

packages/kit-bg/src/dbs/local/indexed/IndexedDBAgent.ts (1)

312-312: 日志格式更改清晰明了

新的日志格式能更好地区分是获取全部记录还是特定ID的记录,这对性能监控很有帮助。

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 17

🔭 Outside diff range comments (1)
packages/kit-bg/src/dbs/local/indexed/IndexedDBAgent.ts (1)

Line range hint 313-386: 建议:优化数据获取性能

当前实现可以通过以下方式优化性能:

  1. 添加缓存机制,减少频繁访问的数据库查询
  2. 对多个ID的查询使用批量获取替代并行单条获取
  3. 为常用查询字段添加索引,类似 createdAt 索引

示例优化代码:

 if (ids) {
-  results = await Promise.all(ids.map((id) => store.get(id)));
+  // 批量获取替代并行单条获取
+  const BATCH_SIZE = 100;
+  results = [];
+  for (let i = 0; i < ids.length; i += BATCH_SIZE) {
+    const batch = ids.slice(i, i + BATCH_SIZE);
+    const batchResults = await store.getAll(
+      IDBKeyRange.bound(batch[0], batch[batch.length - 1])
+    );
+    results.push(...batchResults);
+  }
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2bfc8fa and 73ac31c.

📒 Files selected for processing (31)
  • apps/desktop/App.tsx (1 hunks)
  • development/spellCheckerSkipWords.js (1 hunks)
  • packages/kit-bg/src/dbs/local/LocalDbBase.ts (6 hunks)
  • packages/kit-bg/src/dbs/local/LocalDbBaseContainer.ts (4 hunks)
  • packages/kit-bg/src/dbs/local/indexed/IndexedDBAgent.ts (1 hunks)
  • packages/kit-bg/src/dbs/local/indexed/LocalDbIndexed.ts (1 hunks)
  • packages/kit-bg/src/dbs/local/realm/LocalDbRealm.ts (1 hunks)
  • packages/kit-bg/src/dbs/local/types.ts (1 hunks)
  • packages/kit-bg/src/services/ServiceAccount/ServiceAccount.ts (7 hunks)
  • packages/kit-bg/src/services/ServiceAccountSelector.ts (1 hunks)
  • packages/kit-bg/src/services/ServiceAllNetwork/ServiceAllNetwork.ts (1 hunks)
  • packages/kit-bg/src/services/ServiceAppCleanup/ServiceAppCleanup.ts (4 hunks)
  • packages/kit-bg/src/services/ServiceNotification/ServiceNotification.ts (15 hunks)
  • packages/kit-bg/src/services/ServiceToken.ts (0 hunks)
  • packages/kit-bg/src/states/jotai/atomNames.ts (1 hunks)
  • packages/kit-bg/src/states/jotai/jotaiStorage.ts (5 hunks)
  • packages/kit-bg/src/states/jotai/utils/index.ts (7 hunks)
  • packages/kit-bg/src/states/jotai/utils/jotaiVerify.ts (1 hunks)
  • packages/kit-bg/src/states/jotai/utils/wrapAtomPro.ts (2 hunks)
  • packages/kit/src/components/GlobalJotaiReady/GlobalJotaiReady.tsx (2 hunks)
  • packages/kit/src/components/RenameDialog/index.tsx (1 hunks)
  • packages/kit/src/components/TokenListView/index.tsx (4 hunks)
  • packages/kit/src/states/jotai/contexts/accountSelector/atoms.ts (0 hunks)
  • packages/kit/src/views/Home/pages/HomePageView.tsx (4 hunks)
  • packages/kit/src/views/Home/pages/TokenListContainer.tsx (8 hunks)
  • packages/kit/src/views/Setting/pages/Notifications/ManageAccountActivity.tsx (1 hunks)
  • packages/shared/src/errors/utils/errorUtils.ts (3 hunks)
  • packages/shared/src/utils/cacheUtils.ts (2 hunks)
  • packages/shared/src/utils/debug/dbPerfMonitor.ts (4 hunks)
  • packages/shared/src/utils/debug/perfUtils.ts (2 hunks)
  • packages/shared/src/utils/promiseUtils.ts (1 hunks)
💤 Files with no reviewable changes (2)
  • packages/kit-bg/src/services/ServiceToken.ts
  • packages/kit/src/states/jotai/contexts/accountSelector/atoms.ts
🧰 Additional context used
🪛 Biome (1.9.4)
packages/kit-bg/src/states/jotai/utils/jotaiVerify.ts

[error] 6-7: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 11-11: This is an unexpected use of the debugger statement.

Unsafe fix: Remove debugger statement

(lint/suspicious/noDebugger)

packages/shared/src/utils/debug/dbPerfMonitor.ts

[error] 311-311: Reassigning a function parameter is confusing.

The parameter is declared here:

Use a local variable instead.

(lint/style/noParameterAssign)

packages/kit-bg/src/dbs/local/LocalDbBase.ts

[error] 2736-2736: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 2754-2754: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 2797-2797: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 2815-2815: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

packages/kit-bg/src/services/ServiceAppCleanup/ServiceAppCleanup.ts

[error] 111-111: Reassigning a function parameter is confusing.

The parameter is declared here:

Use a local variable instead.

(lint/style/noParameterAssign)

packages/kit-bg/src/states/jotai/jotaiStorage.ts

[error] 180-180: Reassigning a function parameter is confusing.

The parameter is declared here:

Use a local variable instead.

(lint/style/noParameterAssign)

🔇 Additional comments (79)
packages/kit-bg/src/dbs/local/realm/LocalDbRealm.ts (1)

7-7: 已确认要清空全部缓存?
请再次确认是否需要清空所有 Store 的缓存,而不仅仅是原先指定的 Store。若只需清理特定部分,建议保留原有的参数。

packages/kit-bg/src/dbs/local/indexed/LocalDbIndexed.ts (1)

9-9: 清除所有缓存会影响其他Store吗?
全面清空缓存或许会带来额外的开销与风险。请确认是否确实需要覆盖整个缓存范围。

packages/kit/src/views/Home/pages/HomePageView.tsx (4)

15-15: 可能是多余的引入。

networkUtils 似乎没有实际用到。可以考虑删除这条引入以保持代码整洁。


138-154: 这个新 memo 写得不错。

useMemo 包裹组件能提高性能,减少不必要的渲染。依赖项设置也正确。


200-200: 渲染空账户视图很直观。

这里使用 emptyAccountView 显得清晰易读,从逻辑中分离空状态视图,有助于维护。


226-226: 依赖项管理得当。

在依赖数组中包含 emptyAccountView,确保更新逻辑同步,有效避免潜在渲染问题。

packages/shared/src/utils/promiseUtils.ts (1)

158-163: 🧹 Nitpick (assertive)

方法内用 setTimeout 延迟执行很灵活。但要注意频繁调用时可能堆积过多延时任务。可视场景优化或取消重复延时。

packages/kit/src/components/GlobalJotaiReady/GlobalJotaiReady.tsx (2)

1-1: 引入 startTransition 很好。
有助于优化并发渲染,保持页面交互流畅。


11-13: 使用 startTransition 包裹 setIsReady 是不错的做法。
这样可减少主线程阻塞,平滑更新 UI。

packages/kit/src/components/TokenListView/index.tsx (3)

68-68: 新增 emptyAccountView 属性很灵活。
让空账户场景可自定义渲染内容。


95-95: 通过 props 解构 emptyAccountView,便于灵活传入。
这种模式易读且易拓展。


225-227: 在空列表时立即返回 emptyAccountView。
逻辑清晰,避免赘余渲染。

packages/kit/src/views/Home/pages/TokenListContainer.tsx (9)

6-6: 引入 useIntl
为接下来本地化文本做准备。


11-11: 引入 Stack 等组件
便于简化布局管理。


60-60: 导入 EmptyAccount
有助于直观展示空账户提示界面。


69-72: 引入读取全网状态的 hooks
扩展多网络场景的兼容性。


86-86: 在 activeAccount 中新增 accountName
加强对账户人性化展示。


99-99: 使用 useIntl 实现多语言支持
能让 UI 更好地本地化。


1249-1260: 在 Effect 中监听 AddDBAccountsToWallet
自动刷新全网账户,保证数据一致。


1370-1377: 计算 isAllNetworkEmptyAccount
便于判断多网络场景下是否无可见账户。


1396-1413: 渲染空账户视图时用 EmptyAccount
配合 accountName、network 提示更人性化。

packages/kit-bg/src/dbs/local/indexed/IndexedDBAgent.ts (2)

312-312: 日志格式改进更清晰!

新的日志格式有以下优点:

  • 使用 key-value 格式,便于解析
  • 明确显示 'ALL' 而不是空字符串
  • 命名更准确,使用 ids_count 替代 records

312-312: 注意:PR目标与代码更改不符

PR标题为"优化localDB getAllRecords性能",但实际更改仅涉及日志格式。建议:

  1. 更新PR标题以反映实际更改
  2. 或添加真正的性能优化改进
packages/shared/src/utils/debug/perfUtils.ts (2)

1-1: 导入语句检查完毕
已正确导入 isEqual 和 isNil,没发现问题。


209-214: 函数逻辑简明
对比旧值和新值后再决定返回哪个,很高效,且易读。

packages/kit-bg/src/services/ServiceNotification/ServiceNotification.ts (12)

17-17: 导入 perfUtils 用于性能追踪,很好。

这行导入能帮助减少无效状态更新。


216-221: 更新 lastReceivedTime 的方式简洁。

建议检查 Atom 更新是否会有并发冲突,如无则可放心使用。


428-433: 同步 badge 状态时建议确认异常处理。

如果设置失败,请确认是否有重试或错误提示。


484-497: 函数命名清晰,可读性高。

逻辑流程简单易懂,无明显问题。


511-561: 多重条件过滤和循环嵌套要注意性能。

大规模数据下,可能造成效率瓶颈。可考虑分段处理或批量查询。


617-619: debounce 缓存有助减轻频繁请求。

做法合理,降低重复注册开销。


680-684: getNotificationWalletsWithAccounts 接口清晰。

参数统一传入,逻辑干净,没有明显缺陷。


723-727: 引入 notificationWallets 参数灵活度高。

这样写法拆分逻辑清晰,易于单测。


811-811: for 语句写法简练。

无多余逻辑,可读性不错。


827-832: 更新 lastSettingsUpdateTime 时序要注意。

如果外部依赖此数据,可考虑队列写法防止时序混乱。


1019-1024: 合并 EVM 网路后去重处理不错。

uniqBy 合理防止重复。


1118-1123: 注册后再更新状态很好。

逻辑清晰,没发现漏洞。

packages/kit-bg/src/dbs/local/LocalDbBase.ts (4)

2731-2736: 可选链建议与历史评论重复。

此处可用 cacheKey?.length 以简化写法。

🧰 Tools
🪛 Biome (1.9.4)

[error] 2736-2736: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


2754-2754: 重复可选链建议。

可用 allWalletsInCache?.length。逻辑不变,可读性更好。

🧰 Tools
🪛 Biome (1.9.4)

[error] 2754-2754: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


2797-2797: 相同可选链优化。

allIndexedAccountsInCache?.length 取代手动判空,更简洁。

🧰 Tools
🪛 Biome (1.9.4)

[error] 2797-2797: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


2815-2815: 继续可选链简化。

allDbAccountsInCache?.length 使用可读性较佳。

🧰 Tools
🪛 Biome (1.9.4)

[error] 2815-2815: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

apps/desktop/App.tsx (1)

15-15: 注释掉默认导出可能影响错误监控。

请确认是否需要保留 Sentry 包装,或者后续在别处处理。

packages/kit-bg/src/services/ServiceAppCleanup/ServiceAppCleanup.ts (2)

51-56: 新增 indexedAccountsRemoved 参数可读性好。

能方便在一次调用里清理多种数据类型,逻辑统一。


107-115: 🧹 Nitpick (assertive)

cleanupIndexedAccounts 重复给参数赋值可迷惑读者。

使用临时变量替代,对可维护性更佳。

- if (!indexedAccountsRemoved) {
-   ({ indexedAccountsRemoved } = ...);
- }
+ let list = indexedAccountsRemoved;
+ if (!list) {
+   ({ indexedAccountsRemoved: list } = ...);
+ }

Likely invalid or redundant comment.

🧰 Tools
🪛 Biome (1.9.4)

[error] 111-111: Reassigning a function parameter is confusing.

The parameter is declared here:

Use a local variable instead.

(lint/style/noParameterAssign)

packages/kit-bg/src/dbs/local/LocalDbBaseContainer.ts (6)

2-2: 使用复合导入方式好。

减少重复 import,整合与 cacheUtils 相关的引用挺好。


8-11: 新增类型定义,让调用更严谨。

更好地约束数据库字段,值得保留。


141-141: 更新操作后清除缓存,避免脏读。

做法很好,防止更新与读取冲突。


150-150: 清除缓存保证插入后数据一致。

逻辑简洁,可避免潜在不一致。


158-158: 删除记录也要清除缓存,思路一致。

操作后缓存清理避免了旧数据残留。


166-166: clearStoreCachedDataIfMatch 可避免盲目清理。

提升性能,符合需求。

packages/kit/src/components/RenameDialog/index.tsx (1)

40-40: 提取对象的用法很清晰。
这能避免直接对函数返回结果进行混淆,便于后续维护。

packages/shared/src/errors/utils/errorUtils.ts (1)

184-192: 新增 getCurrentCallStack 对调试很有帮助。
整体实现简单明了,抛出异常再捕获可快速获取堆栈。

packages/shared/src/utils/debug/dbPerfMonitor.ts (5)

4-4: 引入 errorUtils 有助于记录更详细的错误信息。
实现逻辑无冲突。


38-49: 新增多条规则,阈值设为 999。
看起来是为高频操作提供追踪,暂未发现问题。


310-312: 避免直接给函数参数赋值。
重复之前的建议,该问题仍在。请创建新变量来保存新参数值。

-function logLocalDbCall(method: string, table: string, params: any[]) {
-  params = [...params, errorUtils.getCurrentCallStack()];
+function logLocalDbCall(method: string, table: string, originParams: any[]) {
+  const newParams = [...originParams, errorUtils.getCurrentCallStack()];
🧰 Tools
🪛 Biome (1.9.4)

[error] 311-311: Reassigning a function parameter is confusing.

The parameter is declared here:

Use a local variable instead.

(lint/style/noParameterAssign)


313-317: txGetAllRecords 计数的逻辑正常。
可正确更新统计信息,无需额外修改。


431-431: 在超出 toastWarningSize 时触发警告逻辑合理。
可在调用过多时及时提醒开发者。

Also applies to: 436-436

packages/kit-bg/src/services/ServiceAllNetwork/ServiceAllNetwork.ts (1)

109-114: 通过解构获取 accounts
写法直观,建议同时捕获空返回情形并做相应处理。

packages/kit-bg/src/dbs/local/types.ts (1)

203-206: 建议确认初始化与使用场景。
这几个新增字段若不常用,或调用方没有显式赋值,可能会产生 undefined。最好在逻辑中做默认处理,或仅在需要时才定义。

packages/kit-bg/src/services/ServiceAccountSelector.ts (1)

327-333: 请确认异常分支的逻辑。
目前在 try 的失败分支里,依然把 canCreateAddress 设为 true。若 getMockedAllNetworkAccount 出错,是否确认也要允许创建地址?可能要额外日志或区分错误类型。

packages/kit-bg/src/services/ServiceAccount/ServiceAccount.ts (6)

171-171: 清理缓存实现看起来不错。
调用 localDb.clearStoreCachedData() 后续若有异步流程,建议考虑是否要等待返回,或添加错误捕获。


1701-1701: 结构赋值表达清晰。
不过 accounts 可能与上文重名,适度重构便于阅读。


1798-1801: 确认使用场景。
返回字段很丰富,是否前端都需要?如果并未使用,可精简,减少潜在维护成本。


1805-1823: 支持返回 allDevices 很灵活。
示例实现可读性不错,且 refillWalletInfo 逻辑清晰,暂时看无明显问题。


1836-1843: 返回结构简单明了。
将本地查询结果直接返回,代码清晰易读,没发现明显缺陷。


2682-2685: 拆分逻辑清晰。
这里直接解构 { accounts },随后再处理,流程更简洁。不需要特别修改。

packages/shared/src/utils/cacheUtils.ts (1)

2-2: 需要配置 LRUCache 参数

引入 LRUCache 时,建议设置合适的缓存配置参数,如 maxSize 和 TTL,以防止内存泄漏。

development/spellCheckerSkipWords.js (1)

23-23: 添加 'ttl' 到拼写检查白名单符合规范

添加位置保持了数组的字母顺序,且 'ttl' 作为技术术语添加到白名单是合适的。

packages/kit-bg/src/states/jotai/utils/wrapAtomPro.ts (1)

9-10: 导入依赖很清晰,有助于统一验证逻辑。
模块拆分合理,可读性好。

packages/kit-bg/src/states/jotai/jotaiStorage.ts (4)

4-17: 增加 isEqual、isString、merge 等导入,能简化后续逻辑。
建议信息日志内多注明上下文,比如存储名称,以便后期排查。


Line range hint 69-91: 对 atomWithStorage 的多重重载声明更严谨。
参数类型从 string 改为 IAtomNameKeys,提高可维护性,减少输入错误风险。


142-161: 深度合并和深度比较逻辑有助于避免重复写入。
当合并对象非常大时,merge 开销也会变大,可根据数据规模评估性能影响。若数据量大,或可考虑更轻量的合并方式。


180-180: 重复给回调参数赋值,易迷惑阅读者。
用一个新变量来承接 await 结果会更清晰。

🧰 Tools
🪛 Biome (1.9.4)

[error] 180-180: Reassigning a function parameter is confusing.

The parameter is declared here:

Use a local variable instead.

(lint/style/noParameterAssign)

packages/kit-bg/src/states/jotai/utils/jotaiVerify.ts (3)

1-14: ensureNotPromise() 补充了对值类型的断言,增强了健壮性。
导出默认对象时清晰点明了此工具方法,用法直观。

Also applies to: 16-18

🧰 Tools
🪛 Biome (1.9.4)

[error] 6-7: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 11-11: This is an unexpected use of the debugger statement.

Unsafe fix: Remove debugger statement

(lint/suspicious/noDebugger)


11-11: 🛠️ Refactor suggestion

debugger 会阻塞生产环境。
建议删除或注释,以免影响用户。

-    debugger;

Likely invalid or redundant comment.

🧰 Tools
🪛 Biome (1.9.4)

[error] 11-11: This is an unexpected use of the debugger statement.

Unsafe fix: Remove debugger statement

(lint/suspicious/noDebugger)


6-7: 🧹 Nitpick (assertive)

可选链能让代码更简洁。

-if (
-  valueLikePromise &&
-  valueLikePromise.orig &&
-  valueLikePromise.value &&
-  valueLikePromise.status
-) {
+if (valueLikePromise?.orig && valueLikePromise?.value && valueLikePromise?.status) {

Likely invalid or redundant comment.

🧰 Tools
🪛 Biome (1.9.4)

[error] 6-7: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

packages/kit-bg/src/states/jotai/atomNames.ts (1)

42-49: IAtomNameKeys 类型与 atomsConfig 搭配,让配置更灵活。
在后续扩展时,可把 deepCompare 等属性集中到更完整的类型中,便于统一管理。

packages/kit-bg/src/states/jotai/utils/index.ts (2)

15-15: 新增 IAtomNameKeys 引入,避免字符串硬编码。
统一的枚举有利于减少拼写失误。


Line range hint 50-128: 为 crossAtomBuilder 添加 storageName?: IAtomNameKeys 参数,类型更严格。
在多个重载中使用同一个类型定义,减少了维护成本。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants