@@ -9,7 +9,6 @@ const mime = require('mime-types')
9
9
const { PassThrough } = require ( 'readable-stream' )
10
10
const Boom = require ( 'boom' )
11
11
const Ammo = require ( '@hapi/ammo' ) // HTTP Range processing utilities
12
- const peek = require ( 'buffer-peek-stream' )
13
12
14
13
const multibase = require ( 'multibase' )
15
14
const { resolver } = require ( 'ipfs-http-response' )
@@ -32,9 +31,9 @@ function detectContentType (path, chunk) {
32
31
return mime . contentType ( mimeType )
33
32
}
34
33
35
- // Enable streaming of compressed payload
34
+ // Thin stream Transform wrapper to enable streaming of compressed payload
36
35
// https://github.com/hapijs/hapi/issues/3599
37
- class ResponseStream extends PassThrough {
36
+ class HttpResponseStream extends PassThrough {
38
37
_read ( size ) {
39
38
super . _read ( size )
40
39
if ( this . _compressor ) {
@@ -148,24 +147,24 @@ module.exports = {
148
147
}
149
148
}
150
149
151
- const rawStream = ipfs . catReadableStream ( data . cid , catOptions )
152
- const responseStream = new ResponseStream ( )
153
-
154
- // Pass-through Content-Type sniffing over initial bytes
155
- const { peekedStream, contentType } = await new Promise ( ( resolve , reject ) => {
156
- const peekBytes = fileType . minimumBytes
157
- peek ( rawStream , peekBytes , ( err , streamHead , peekedStream ) => {
158
- if ( err ) {
159
- log . error ( err )
160
- return reject ( err )
161
- }
162
- resolve ( { peekedStream, contentType : detectContentType ( ipfsPath , streamHead ) } )
150
+ // Set/Sniff Content-Type
151
+ let contentType
152
+ if ( request . headers . range && catOptions . length ) {
153
+ // Range request always returns opaque byte stream
154
+ contentType = 'application/octet-stream'
155
+ } else {
156
+ // When returning full file we analyze the file head to tell its content-type
157
+ const fileHead = await ipfs . cat ( data . cid , {
158
+ offset : 0 ,
159
+ length : fileType . minimumBytes
163
160
} )
164
- } )
165
-
166
- peekedStream . pipe ( responseStream )
161
+ contentType = detectContentType ( ipfsPath , fileHead )
162
+ }
167
163
168
- const res = h . response ( responseStream ) . code ( rangeResponse ? 206 : 200 )
164
+ // We pass a compressable httpStream to Hapijs to enable streaming responses
165
+ const rawStream = ipfs . catReadableStream ( data . cid , catOptions )
166
+ const httpStream = rawStream . pipe ( new HttpResponseStream ( ) )
167
+ const res = h . response ( httpStream ) . code ( rangeResponse ? 206 : 200 )
169
168
170
169
// Etag maps directly to an identifier for a specific version of a resource
171
170
// and enables smart client-side caching thanks to If-None-Match
0 commit comments