diff --git a/.codegen.json b/.codegen.json index 7986f731..29c21a7b 100644 --- a/.codegen.json +++ b/.codegen.json @@ -1 +1 @@ -{ "engineHash": "ef31179", "specHash": "e95d6fa", "version": "1.1.0" } +{ "engineHash": "89557a9", "specHash": "e95d6fa", "version": "1.1.0" } diff --git a/package-lock.json b/package-lock.json index 4d94cd1f..d170597c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1444,9 +1444,9 @@ } }, "node_modules/@types/node": { - "version": "20.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", - "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -2135,9 +2135,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.816", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", - "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==", + "version": "1.4.818", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.818.tgz", + "integrity": "sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==", "dev": true }, "node_modules/emittery": { @@ -5752,9 +5752,9 @@ } }, "@types/node": { - "version": "20.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", - "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", "dev": true, "requires": { "undici-types": "~5.26.4" @@ -6240,9 +6240,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.816", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", - "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==", + "version": "1.4.818", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.818.tgz", + "integrity": "sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==", "dev": true }, "emittery": { diff --git a/src/internal/utils.ts b/src/internal/utils.ts index dff2417e..a9c343ef 100644 --- a/src/internal/utils.ts +++ b/src/internal/utils.ts @@ -196,35 +196,45 @@ export async function readByteStream(byteStream: Readable) { export async function* iterateChunks( stream: Readable, - chunkSize: number + chunkSize: number, + fileSize: number ): Iterator { let buffers: Buffer[] = []; let totalSize = 0; - for await (const data of stream) { - if (!Buffer.isBuffer(data)) { - throw new Error('Expecting a chunk of stream to be a Buffer'); - } - buffers.push(data); - totalSize += data.length; + let consumedSize = 0; + while (consumedSize < fileSize && !stream.readableEnded) { + for await (const data of stream) { + if (!Buffer.isBuffer(data)) { + throw new Error('Expecting a chunk of stream to be a Buffer'); + } + consumedSize += data.length; + buffers.push(data); + totalSize += data.length; - if (totalSize < chunkSize) { - continue; - } + if (totalSize < chunkSize) { + continue; + } - const buffer = Buffer.concat(buffers); + const buffer = Buffer.concat(buffers); - let start = 0; - while (totalSize >= chunkSize) { - yield generateByteStreamFromBuffer( - buffer.subarray(start, start + chunkSize) - ); - start += chunkSize; - totalSize -= chunkSize; - } + let start = 0; + while (totalSize >= chunkSize) { + yield generateByteStreamFromBuffer( + buffer.subarray(start, start + chunkSize) + ); + start += chunkSize; + totalSize -= chunkSize; + } - buffers = totalSize > 0 ? [buffer.subarray(start)] : []; + buffers = totalSize > 0 ? [buffer.subarray(start)] : []; + } } + if (consumedSize !== fileSize) { + throw new Error( + `Stream size ${consumedSize} does not match expected file size ${fileSize}` + ); + } if (totalSize > 0) { yield generateByteStreamFromBuffer(Buffer.concat(buffers)); } diff --git a/src/managers/chunkedUploads.generated.ts b/src/managers/chunkedUploads.generated.ts index e9114f36..0f557030 100644 --- a/src/managers/chunkedUploads.generated.ts +++ b/src/managers/chunkedUploads.generated.ts @@ -775,7 +775,7 @@ export class ChunkedUploadsManager { throw new Error('Assertion failed'); } const fileHash: Hash = new Hash({ algorithm: 'sha1' as HashName }); - const chunksIterator: Iterator = iterateChunks(file, partSize); + const chunksIterator: Iterator = iterateChunks(file, partSize, fileSize); const results: PartAccumulator = await reduceIterator( chunksIterator, this.reducer.bind(this), diff --git a/src/networking/fetch.ts b/src/networking/fetch.ts index a359edec..d1a85b6e 100644 --- a/src/networking/fetch.ts +++ b/src/networking/fetch.ts @@ -319,7 +319,8 @@ export async function fetch( url: resource, queryParams: params, headers: (requestInit.headers as { [key: string]: string }) ?? {}, - body: requestInit.body, + body: + typeof requestInit.body === 'string' ? requestInit.body : undefined, }, responseInfo: { statusCode: fetchResponse.status,