無限ループ防止するutil
AIに雑に書かせた
code:js
/**
* 無限ループ検知機能を持つループ実行関数
* 実装ミスや考慮漏れによる無限ループを防ぐために用意している
* @param {() => Promise<boolean|void>} fn - 各イテレーションで実行する非同期関数。falseを返すとループを抜ける
* @param {{maxLoopsPerSecond?: number, timeWindowMs?: number}} options - オプション
* @returns {Promise<void>}
*/
async function loop(fn, options = {}) {
const { maxLoopsPerSecond = 100, timeWindowMs = 1000 } = options
/** @type {number[]} */
const loopTimes = []
while (true) {
const now = Date.now()
loopTimes.push(now)
// 時間ウィンドウより古いエントリを削除
while (loopTimes.length > 0 && now - loopTimes0 > timeWindowMs) {
loopTimes.shift()
}
// 指定された回数を超えたら無限ループと判定
if (loopTimes.length > maxLoopsPerSecond) {
console.error(
infinite loop detected: ${loopTimes.length} loops in ${timeWindowMs}ms
)
break
}
const shouldContinue = await fn()
if (shouldContinue === false) {
break
}
}
}
素朴にwhile(true)書くと事故って無限ループしがちなので
code:js
loop(async () => {
//なんか繰り返し処理
// やめる
if (hoge) return true
})