Skip to content

Bug: resetRegistration() calls WeakSet.clear() — method doesn't exist  #528

@jlin53882

Description

@jlin53882

Bug: resetRegistration() calls WeakSet.clear() — method doesn't exist

問題描述

index.ts 中的 resetRegistration() 函數(第 4018 行)呼叫了 WeakSet.clear()

export function resetRegistration() {
  _registeredApis.clear();  // ❌ WeakSet.prototype 上沒有 clear() 方法
  _initialized = false;
}

WeakSet 的標準 API 只有:

  • WeakSet.prototype.add(value)
  • WeakSet.prototype.delete(value)
  • WeakSet.prototype.has(value)

clear() 不存在。 呼叫 _registeredApis.clear() 會在 runtime 拋 TypeError: w.clear is not a function

發現經過

在 review PR #522 時,reviewer 指出 resetRegistration() 內呼叫 _registeredApis.clear() 的行為。我驗證了 WeakSet 標準 API,確認 clear() 確實不存在。

背景

此問題起源於 PR #365(commit 96ef2dd)的設計。當初引入 WeakSet 追蹤 per-instance registration 時,resetRegistration() 是用於測試環境重置。PR description 甚至說「resetRegistration() uses .clear() for explicit reset」,但從未被注意到這個方法並不存在。

實測:resetRegistration() / _resetInitialized() 在全專案程式碼中從未被呼叫過(搜遍全部 .ts + .mjs 零結果),屬於死程式碼。但這不改變它是 bug 的事實。

影響評估

維度 評估
目前影響 低(死程式碼,無人被觸發)
未來影響 中(若有人真的呼叫,runtime 直接失敗)
測試影響 低(測試環境可透過模組重新載入重建 WeakSet)

預計處理方式

方案(推薦):將 const 改為 let,讓 resetRegistration() 可以重建 WeakSet

// 改動:
// const _registeredApis = new WeakSet<OpenClawPluginApi>();
// ↓
let _registeredApis = new WeakSet<OpenClawPluginApi>();

export function resetRegistration() {
  _registeredApis = new WeakSet<OpenClawPluginApi>();  // 重建,而非 clear()
  _initialized = false;
}

理由:WeakSet 無法 clear(也無法枚舉或刪除特定元素),重建是唯一有效方式。將 const 改為 let 不影響現有功能(_registeredApis 在初始化後只會被 .add()),但讓測試重置成為可能。

替代方案:維持現狀(不修)

resetRegistration() 從未被呼叫,死程式碼不影響生產環境。但問題會一直存在。


請確認是否同意「將 const _registeredApis 改為 let」的處理方式?謝謝。

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions