diff --git a/.changeset/silver-students-invent.md b/.changeset/silver-students-invent.md new file mode 100644 index 00000000..4d7cafca --- /dev/null +++ b/.changeset/silver-students-invent.md @@ -0,0 +1,5 @@ +--- +"@tus/server": patch +--- + +Don't use AbortSignal.any to fix memory leak in older Node.js versions and to not break version support. diff --git a/packages/server/src/lockers/MemoryLocker.ts b/packages/server/src/lockers/MemoryLocker.ts index 393e0a89..5bfb6956 100644 --- a/packages/server/src/lockers/MemoryLocker.ts +++ b/packages/server/src/lockers/MemoryLocker.ts @@ -51,18 +51,23 @@ class MemoryLock implements Lock { async lock(stopSignal: AbortSignal, requestRelease: RequestRelease): Promise { const abortController = new AbortController() + const onAbort = () => { + abortController.abort() + } + stopSignal.addEventListener('abort', onAbort) - const abortSignal = AbortSignal.any([stopSignal, abortController.signal]) - - const lock = await Promise.race([ - this.waitTimeout(abortSignal), - this.acquireLock(this.id, requestRelease, abortSignal), - ]) - - abortController.abort() + try { + const lock = await Promise.race([ + this.waitTimeout(abortController.signal), + this.acquireLock(this.id, requestRelease, abortController.signal), + ]) - if (!lock) { - throw ERRORS.ERR_LOCK_TIMEOUT + if (!lock) { + throw ERRORS.ERR_LOCK_TIMEOUT + } + } finally { + stopSignal.removeEventListener('abort', onAbort) + abortController.abort() } }