diff --git a/package-lock.json b/package-lock.json index ecab6ab1..867fdd33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1961,14 +1961,6 @@ } } }, - "node_modules/@shopify/semaphore": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@shopify/semaphore/-/semaphore-3.1.0.tgz", - "integrity": "sha512-LxonkiWEu12FbZhuOMhsdocpxCqm7By8C/2U9QgNuEoXUx2iMrlXjJv3p93RwfNC6TrdlNRo17gRer1z1309VQ==", - "engines": { - "node": ">=18.12.0" - } - }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -3078,6 +3070,15 @@ "dev": true, "license": "MIT" }, + "node_modules/async-mutex": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/async-retry": { "version": "1.3.3", "dev": true, @@ -6201,8 +6202,8 @@ "license": "MIT", "dependencies": { "@aws-sdk/client-s3": "^3.758.0", - "@shopify/semaphore": "^3.1.0", "@tus/utils": "^0.7.0", + "async-mutex": "^0.5.0", "debug": "^4.3.4", "multistream": "^4.1.0" }, diff --git a/packages/s3-store/package.json b/packages/s3-store/package.json index ba034d2a..6e4efe07 100644 --- a/packages/s3-store/package.json +++ b/packages/s3-store/package.json @@ -22,8 +22,8 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.758.0", - "@shopify/semaphore": "^3.1.0", "@tus/utils": "^0.7.0", + "async-mutex": "^0.5.0", "debug": "^4.3.4", "multistream": "^4.1.0" }, diff --git a/packages/s3-store/src/index.ts b/packages/s3-store/src/index.ts index 9e63d68a..68f7b956 100644 --- a/packages/s3-store/src/index.ts +++ b/packages/s3-store/src/index.ts @@ -17,7 +17,7 @@ import { MemoryKvStore, } from '@tus/utils' -import {Semaphore, type Permit} from '@shopify/semaphore' +import {Semaphore} from 'async-mutex' import MultiStream from 'multistream' import crypto from 'node:crypto' import path from 'node:path' @@ -369,14 +369,15 @@ export class S3Store extends DataStore { const promises: Promise[] = [] let pendingChunkFilepath: string | null = null let bytesUploaded = 0 - let permit: Permit | undefined + let releasePermit: (() => void) | undefined const splitterStream = new StreamSplitter({ chunkSize: this.calcOptimalPartSize(size), directory: os.tmpdir(), }) .on('beforeChunkStarted', async () => { - permit = await this.partUploadSemaphore.acquire() + const [, release] = await this.partUploadSemaphore.acquire() + releasePermit = release }) .on('chunkStarted', (filepath) => { pendingChunkFilepath = filepath @@ -384,7 +385,7 @@ export class S3Store extends DataStore { .on('chunkFinished', ({path, size: partSize}) => { pendingChunkFilepath = null - const acquiredPermit = permit + const acquiredRelease = releasePermit const partNumber = currentPartNumber++ offset += partSize @@ -415,9 +416,7 @@ export class S3Store extends DataStore { fsProm.rm(path).catch(() => { /* ignore */ }) - acquiredPermit?.release().catch(() => { - /* ignore */ - }) + acquiredRelease?.() } }) @@ -430,9 +429,7 @@ export class S3Store extends DataStore { promises.push(deferred) }) .on('chunkError', () => { - permit?.release().catch(() => { - /* ignore */ - }) + releasePermit?.() }) try {