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」的處理方式?謝謝。
Bug:
resetRegistration()callsWeakSet.clear()— method doesn't exist問題描述
index.ts中的resetRegistration()函數(第 4018 行)呼叫了WeakSet.clear():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 的事實。影響評估
預計處理方式
方案(推薦):將
const改為let,讓resetRegistration()可以重建 WeakSet理由:WeakSet 無法 clear(也無法枚舉或刪除特定元素),重建是唯一有效方式。將
const改為let不影響現有功能(_registeredApis在初始化後只會被.add()),但讓測試重置成為可能。替代方案:維持現狀(不修)
resetRegistration()從未被呼叫,死程式碼不影響生產環境。但問題會一直存在。請確認是否同意「將
const _registeredApis改為let」的處理方式?謝謝。