diff --git a/dist/Deferred.js b/dist/Deferred.js index dd5334d6e42b0881f411fca56688e639cd49c176..ea200a80d6186f07a29d0d231ff1f038433bfec3 100644 --- a/dist/Deferred.js +++ b/dist/Deferred.js @@ -81,8 +81,12 @@ const _await = self => internalEffect.callback(resume => { self.resumes ??= []; self.resumes.push(resume); return internalEffect.sync(() => { + // Completion resumes every waiter and clears the array, so a cleanup + // that runs after completion (an interrupt racing the resume) has + // nothing to unregister. + if (!self.resumes) return; const index = self.resumes.indexOf(resume); - self.resumes.splice(index, 1); + if (index >= 0) self.resumes.splice(index, 1); }); }); export { diff --git a/src/Deferred.ts b/src/Deferred.ts index f6d37948bfbe690a7998b06c562e434e1b8ae084..da91e4dc0fd32e534fbc72f7beb0514e67e4ce74 100644 --- a/src/Deferred.ts +++ b/src/Deferred.ts @@ -188,8 +188,12 @@ const _await = (self: Deferred): Effect => self.resumes ??= [] self.resumes.push(resume) return internalEffect.sync(() => { - const index = self.resumes!.indexOf(resume) - self.resumes!.splice(index, 1) + // Completion resumes every waiter and clears the array, so a cleanup + // that runs after completion (an interrupt racing the resume) has + // nothing to unregister. + if (!self.resumes) return + const index = self.resumes.indexOf(resume) + if (index >= 0) self.resumes.splice(index, 1) }) })