@@ -13,18 +13,20 @@ async function read (cache, integrity, opts = {}) {
1313 const { size } = opts
1414 const { stat, cpath, sri } = await withContentSri ( cache , integrity , async ( cpath , sri ) => {
1515 // get size
16- const stat = await fs . stat ( cpath )
16+ const stat = size ? { size } : await fs . stat ( cpath )
1717 return { stat, cpath, sri }
1818 } )
19- if ( typeof size === 'number' && stat . size !== size ) {
20- throw sizeError ( size , stat . size )
21- }
2219
2320 if ( stat . size > MAX_SINGLE_READ_SIZE ) {
2421 return readPipeline ( cpath , stat . size , sri , new Pipeline ( ) ) . concat ( )
2522 }
2623
2724 const data = await fs . readFile ( cpath , { encoding : null } )
25+
26+ if ( stat . size !== data . length ) {
27+ throw sizeError ( stat . size , data . length )
28+ }
29+
2830 if ( ! ssri . checkData ( data , sri ) ) {
2931 throw integrityError ( sri , cpath )
3032 }
@@ -55,13 +57,10 @@ function readStream (cache, integrity, opts = {}) {
5557 // Set all this up to run on the stream and then just return the stream
5658 Promise . resolve ( ) . then ( async ( ) => {
5759 const { stat, cpath, sri } = await withContentSri ( cache , integrity , async ( cpath , sri ) => {
58- // just stat to ensure it exists
59- const stat = await fs . stat ( cpath )
60+ // get size
61+ const stat = size ? { size } : await fs . stat ( cpath )
6062 return { stat, cpath, sri }
6163 } )
62- if ( typeof size === 'number' && size !== stat . size ) {
63- return stream . emit ( 'error' , sizeError ( size , stat . size ) )
64- }
6564
6665 return readPipeline ( cpath , stat . size , sri , stream )
6766 } ) . catch ( err => stream . emit ( 'error' , err ) )
0 commit comments