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)
})
})