AI agents: the machine-readable documentation index for this site is at https://docs.ckbccc.com/llms.txt. Append ".md" to any documentation page URL to fetch its canonical Markdown source, which is preferred over rendered HTML for retrieval, indexing, question answering, and code generation.

Product-specific agent operating guidance (read before generating CKB/CCC code): https://docs.ckbccc.com/skill.md

迁移到 Connector 2.0

将 Connector 和 Connector React 迁移到显式资源所有权语义。

Edit on GitHub

只需阅读与你的集成方式相关的章节。仅使用 ccc.Provider 的 React 应用通常 只需处理第 1、5 节;直接使用 Web Component 的应用还需处理第 2–4 节。

1. 向 setClient 传入 Owner

将所有传给 useCcc().setClient 的裸 Client 改为 Owner<Client>

原因: 裸 Client 无法表达由谁释放资源,setClient(new Client()) 这类临时 实例因此可能泄漏。

-setClient(new ccc.ClientPublicMainnet());
+setClient(ccc.ClientPublicMainnet.open());

Provider 会消费该 Owner,并在替换 Client 或卸载时释放它。传入后不要继续复用 或释放该 Owner。如果 Client 必须继续由调用方持有,请改为通过 defaultClientclientOptions 传入裸 Client。

2. 在 Connector 外持有 Web Component Client

在应用中创建 Client Owner,并在挂载元素前将借用值赋给 connector.client

原因: Web Component 可能因 DOM 移动而暂时脱离文档,其生命周期不能作为 可靠的最终释放边界。

const clientOwner = ccc.ClientPublicTestnet.open();
connector.client = clientOwner.value;
document.body.append(connector);

// 应用最终清理时:
await clientOwner.dispose();

3. 应用 select-client 请求

监听 select-client,并决定是否更新受控的 connector.client

原因: 网络和费率变化是一项请求;是否应用它,应由持有 Client 的应用决定。

connector.addEventListener("select-client", (event) => {
  connector.client = (event as ccc.SelectClientEvent).client;
});

4. 用带所有权的连接事件替代 willUpdate

删除 ConnectorWillUpdateEvent 和 React onWillUpdate 监听。直接使用 Web Component 时,将每个 ConnectorConnectionEvent.connectionOwner 移入应用 状态。连接替换或清空时释放上一个 Owner,并在应用最终清理时释放最后一个 Owner。

原因: willUpdate 只能表示渲染生命周期发生变化,既不能转移 signer 所有权,也无法区分连接、替换和清空。

let connectionOwner: ccc.Owner<ccc.ConnectorConnection> | undefined;

connector.addEventListener("connection", (event) => {
  event.stopPropagation();
  const next = (event as ccc.ConnectorConnectionEvent).connectionOwner?.map(
    (connection) => connection,
  );
  const previous = connectionOwner;
  connectionOwner = next;
  void previous?.dispose();
});

Owner 为空表示清空连接。connector.disconnect() 也使用这条路径,因此释放上一 个 Owner 才会关闭 signer。ccc.Provider 已自动完成以上处理。

5. 删除无效属性

<ccc-connector><ccc.Provider> 中删除 preferredNetworks

原因: 该兼容属性此前已经被忽略,不需要替代配置。

6. 检查 Client 切换行为

验证连接、替换、断开、切换 Client 和最终卸载。

原因: 带 wallet 与 signer 查找名称的选择可以由 signers controller 重新 发现。Khie 这类没有查找名称的直接连接无法通过该方式刷新,会在 Client 变化时 被清空,需要在新 Client 上重新连接。

Last updated on

On this page