11const fs = require ( 'fs' )
22const path = require ( 'path' )
33const zlib = require ( 'zlib' )
4+ const { pipeline } = require ( 'readable-stream' )
45
56const mimeTypes = require ( './helpers/mime-types' )
67const accepts = require ( './helpers/accepts' )
@@ -24,7 +25,7 @@ const resolveFile = (file, indexFile = '') => {
2425
2526const destroy = ( dataTransfer ) => {
2627 if ( dataTransfer . readable && ! dataTransfer . readable . destroyed ) dataTransfer . readable . destroy ( )
27- if ( dataTransfer . writable && ! dataTransfer . writable . destroyed ) dataTransfer . writable . destroy ( )
28+ if ( dataTransfer . transform && ! dataTransfer . transform . destroyed ) dataTransfer . transform . destroy ( )
2829}
2930
3031const StaticFiles = ( options = { } ) => {
@@ -39,9 +40,10 @@ const StaticFiles = (options = {}) => {
3940 return async ( req , res ) => {
4041 const dataTransfer = {
4142 readable : null ,
42- writable : null
43+ transform : null
4344 }
44- res . on ( 'abort' , ( ) => destroy ( dataTransfer ) )
45+
46+ res . once ( 'abort' , ( ) => destroy ( dataTransfer ) )
4547
4648 if ( req . method !== 'GET' && req . method !== 'HEAD' ) return res . status ( 405 ) . header ( 'Allow' , 'GET, HEAD' ) . vary ( 'Accept-Encoding' ) . send ( )
4749
@@ -115,6 +117,8 @@ const StaticFiles = (options = {}) => {
115117 end
116118 } )
117119
120+ dataTransfer . readable . once ( 'end' , ( ) => ! dataTransfer . readable . destroyed && dataTransfer . readable . destroy ( ) )
121+
118122 res
119123 . header ( 'Content-Type' , mimeType )
120124 . header ( 'Last-Modified' , timeUTC )
@@ -123,15 +127,13 @@ const StaticFiles = (options = {}) => {
123127 if ( compression ) {
124128 res . header ( 'Content-Encoding' , compression )
125129
126- dataTransfer . writable = zlib . createGzip ( )
130+ dataTransfer . transform = zlib . createGzip ( )
127131
128- dataTransfer . writable . once ( 'end' , ( ) => ! dataTransfer . writable . destroyed && dataTransfer . writable . destroy ( ) )
132+ dataTransfer . transform . once ( 'end' , ( ) => ! dataTransfer . transform . destroyed && dataTransfer . transform . destroy ( ) )
129133
130- dataTransfer . readable
131- . pipe ( dataTransfer . writable )
132- . pipe ( res )
134+ pipeline ( dataTransfer . readable , dataTransfer . transform , res , ( error ) => res . throw ( error ) )
133135 } else {
134- return res . stream ( dataTransfer . readable , size )
136+ res . stream ( dataTransfer . readable , size )
135137 }
136138 } catch ( ex ) {
137139 if ( ex . status && ex . status === 404 ) return res . master_context . handlers . get ( 'on_not_found' ) ( req , res )
0 commit comments