22
33const multipart = require ( 'ipfs-multipart' )
44const debug = require ( 'debug' )
5- const tar = require ( 'tar-stream ' )
5+ const tar = require ( 'it-tar ' )
66const log = debug ( 'ipfs:http-api:files' )
77log . error = debug ( 'ipfs:http-api:files:error' )
88const toIterable = require ( 'stream-to-it' )
@@ -11,16 +11,20 @@ const Boom = require('@hapi/boom')
1111const { PassThrough } = require ( 'stream' )
1212const multibase = require ( 'multibase' )
1313const isIpfs = require ( 'is-ipfs' )
14- const { promisify } = require ( 'util' )
1514const { cidToString } = require ( '../../../utils/cid' )
1615const { Format } = require ( '../../../core/components/refs' )
1716const pipe = require ( 'it-pipe' )
1817const all = require ( 'it-all' )
19- const concat = require ( 'it-concat' )
2018const ndjson = require ( 'iterable-ndjson' )
2119const { map } = require ( 'streaming-iterables' )
2220const streamResponse = require ( '../../utils/stream-response' )
2321
22+ const toBuffer = async function * ( source ) {
23+ for await ( const chunk of source ) {
24+ yield chunk . slice ( )
25+ }
26+ }
27+
2428function numberFromQuery ( query , key ) {
2529 if ( query && query [ key ] !== undefined ) {
2630 const value = parseInt ( query [ key ] , 10 )
@@ -86,32 +90,24 @@ exports.get = {
8690 const { ipfs } = request . server . app
8791 const { key } = request . pre . args
8892
89- const pack = tar . pack ( )
90- pack . entry = promisify ( pack . entry . bind ( pack ) )
93+ return streamResponse ( request , h , ( ) => pipe (
94+ ipfs . get ( key ) ,
95+ async function * ( source ) {
96+ for await ( const file of source ) {
97+ const header = {
98+ name : file . path
99+ }
91100
92- const streamFiles = async ( ) => {
93- try {
94- for await ( const file of ipfs . get ( key ) ) {
95101 if ( file . content ) {
96- const content = await concat ( file . content )
97- pack . entry ( { name : file . path , size : file . size } , content . slice ( ) )
102+ yield { header : { ...header , size : file . size } , body : toBuffer ( file . content ) }
98103 } else {
99- pack . entry ( { name : file . path , type : 'directory' } )
104+ yield { header : { ... header , type : 'directory' } }
100105 }
101106 }
102- pack . finalize ( )
103- } catch ( err ) {
104- log . error ( err )
105- pack . emit ( 'error' , err )
106- pack . destroy ( )
107- }
108- }
109-
110- streamFiles ( )
111-
112- // reply must be called right away so that tar-stream offloads its content
113- // otherwise it will block in large files
114- return h . response ( pack ) . header ( 'X-Stream-Output' , '1' )
107+ } ,
108+ tar . pack ( ) ,
109+ toBuffer
110+ ) )
115111 }
116112}
117113
0 commit comments