#453·sphere

[HIGH] SphereProvider.initialize() 不是可重入的: StrictMode/IPFS 切换会泄露第二个活动的 Sphere 实例

作者: KruGoL创建于 2026年7月23日更新于 2026年7月23日
标签bug

摘要

initialize() 没有生成计数器或取消标志,且安装效果的清理仅会销毁 sphereRef.current (在初始化正在执行时仍为空)。两次重叠的 initialize() 调用都会传递 if (sphereRef.current) await destroy(),都会构建新的提供者包 (每个都有自己的 Nostr 传输 + IndexedDB 连接),都会运行 Sphere.init 直到完成。setSphere 竞争的失败者永远不会被销毁 - 一个僵尸钱包仍然订阅了具有真实身份的中继,继续处理 transfer:incoming/message:dm,写入相同的 IndexedDB,并且 (钱包 API 模式) 保持在相同设备 ID 下的第二个会话。应用程序运行在 <StrictMode> 下,因此在开发中,每次加载时都会发生这种情况; ConnectPage/IframeAgent 守护 StrictMode,但 SphereProvider 不会。

内容来源: unicity-sphere/sphere