@@ -4,27 +4,25 @@ import { Readable } from "stream";
4
4
import { DEFAULT } from "../upload/defaults" ;
5
5
import { DataPart } from "./yield-chunk" ;
6
6
7
- interface StreamChunk {
8
- Body : Buffer ;
9
- ended : boolean ;
10
- }
11
-
12
7
export async function * chunkFromReadable ( reader : Readable , chunkSize : number ) : AsyncGenerator < DataPart , void , unknown > {
13
8
let partNumber = DEFAULT . MIN_PART_NUMBER ;
14
9
let oldBuffer = Buffer . from ( "" ) ;
15
10
while ( partNumber < DEFAULT . MAX_PART_NUMBER ) {
16
- reader . resume ( ) ;
17
- const result = await _chunkFromStream ( reader , chunkSize , oldBuffer ) ;
18
- reader . pause ( ) ;
11
+ let currentBuffer = oldBuffer ;
12
+ if ( reader . readable ) {
13
+ reader . resume ( ) ;
14
+ currentBuffer = await _chunkFromStream ( reader , chunkSize , oldBuffer ) ;
15
+ reader . pause ( ) ;
16
+ }
19
17
20
18
yield {
21
- Body : result . Body . slice ( 0 , chunkSize ) ,
19
+ Body : currentBuffer . slice ( 0 , chunkSize ) ,
22
20
PartNumber : partNumber ,
23
21
} ;
24
- oldBuffer = result . Body . slice ( chunkSize ) as Buffer ;
22
+ oldBuffer = currentBuffer . slice ( chunkSize ) as Buffer ;
25
23
partNumber += 1 ;
26
24
27
- if ( result . ended && oldBuffer . length == 0 ) {
25
+ if ( ! reader . readable && oldBuffer . length == 0 ) {
28
26
return ;
29
27
}
30
28
}
@@ -33,7 +31,11 @@ export async function* chunkFromReadable(reader: Readable, chunkSize: number): A
33
31
}
34
32
}
35
33
36
- function _chunkFromStream ( stream : Readable , chunkSize : number , oldBuffer : Buffer ) : Promise < StreamChunk > {
34
+ function _chunkFromStream ( stream : Readable , chunkSize : number , oldBuffer : Buffer ) : Promise < Buffer > {
35
+ if ( ! stream . readable ) {
36
+ return Promise . resolve ( oldBuffer ) ;
37
+ }
38
+
37
39
let currentChunk = oldBuffer ;
38
40
return new Promise ( ( resolve , reject ) => {
39
41
const cleanupListeners = ( ) => {
@@ -44,12 +46,9 @@ function _chunkFromStream(stream: Readable, chunkSize: number, oldBuffer: Buffer
44
46
45
47
stream . on ( "data" , ( chunk ) => {
46
48
currentChunk = Buffer . concat ( [ currentChunk , Buffer . from ( chunk ) ] ) ;
47
- if ( currentChunk . length >= chunkSize ) {
49
+ if ( currentChunk . length >= chunkSize || ! stream . readable ) {
48
50
cleanupListeners ( ) ;
49
- resolve ( {
50
- Body : currentChunk ,
51
- ended : false ,
52
- } ) ;
51
+ resolve ( currentChunk ) ;
53
52
}
54
53
} ) ;
55
54
stream . on ( "error" , ( err ) => {
@@ -58,10 +57,7 @@ function _chunkFromStream(stream: Readable, chunkSize: number, oldBuffer: Buffer
58
57
} ) ;
59
58
stream . on ( "end" , ( ) => {
60
59
cleanupListeners ( ) ;
61
- resolve ( {
62
- Body : currentChunk ,
63
- ended : true ,
64
- } ) ;
60
+ resolve ( currentChunk ) ;
65
61
} ) ;
66
62
} ) ;
67
63
}
0 commit comments