(capsuleObj)
| 656 | function getDefaultFailedCapsules() { return { version: 1, failed_capsules: [] }; } |
| 657 | |
| 658 | function appendFailedCapsule(capsuleObj) { |
| 659 | if (!capsuleObj || typeof capsuleObj !== 'object') return; |
| 660 | ensureSchemaFields(capsuleObj); |
| 661 | return withFileLock(failedCapsulesPath(), () => { |
| 662 | const current = readJsonIfExists(failedCapsulesPath(), getDefaultFailedCapsules()); |
| 663 | let list = Array.isArray(current.failed_capsules) ? current.failed_capsules : []; |
| 664 | list.push(capsuleObj); |
| 665 | if (list.length > FAILED_CAPSULES_MAX) { |
| 666 | list = list.slice(list.length - FAILED_CAPSULES_TRIM_TO); |
| 667 | } |
| 668 | writeJsonAtomic(failedCapsulesPath(), { version: current.version || 1, failed_capsules: list }); |
| 669 | }); |
| 670 | } |
| 671 | |
| 672 | function readRecentFailedCapsules(limit) { |
| 673 | const n = Number.isFinite(Number(limit)) && Number(limit) > 0 ? Number(limit) : 50; |
no test coverage detected