2
2
3
3
const multipart = require ( 'ipfs-multipart' )
4
4
const debug = require ( 'debug' )
5
- const tar = require ( 'tar-stream ' )
5
+ const tar = require ( 'it-tar ' )
6
6
const log = debug ( 'ipfs:http-api:files' )
7
7
log . error = debug ( 'ipfs:http-api:files:error' )
8
8
const toIterable = require ( 'stream-to-it' )
@@ -11,16 +11,20 @@ const Boom = require('@hapi/boom')
11
11
const { PassThrough } = require ( 'stream' )
12
12
const multibase = require ( 'multibase' )
13
13
const isIpfs = require ( 'is-ipfs' )
14
- const { promisify } = require ( 'util' )
15
14
const { cidToString } = require ( '../../../utils/cid' )
16
15
const { Format } = require ( '../../../core/components/refs' )
17
16
const pipe = require ( 'it-pipe' )
18
17
const all = require ( 'it-all' )
19
- const concat = require ( 'it-concat' )
20
18
const ndjson = require ( 'iterable-ndjson' )
21
19
const { map } = require ( 'streaming-iterables' )
22
20
const streamResponse = require ( '../../utils/stream-response' )
23
21
22
+ const toBuffer = async function * ( source ) {
23
+ for await ( const chunk of source ) {
24
+ yield chunk . slice ( )
25
+ }
26
+ }
27
+
24
28
function numberFromQuery ( query , key ) {
25
29
if ( query && query [ key ] !== undefined ) {
26
30
const value = parseInt ( query [ key ] , 10 )
@@ -86,32 +90,24 @@ exports.get = {
86
90
const { ipfs } = request . server . app
87
91
const { key } = request . pre . args
88
92
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
+ }
91
100
92
- const streamFiles = async ( ) => {
93
- try {
94
- for await ( const file of ipfs . get ( key ) ) {
95
101
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 ) }
98
103
} else {
99
- pack . entry ( { name : file . path , type : 'directory' } )
104
+ yield { header : { ... header , type : 'directory' } }
100
105
}
101
106
}
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
+ ) )
115
111
}
116
112
}
117
113
0 commit comments