@@ -4,42 +4,32 @@ const debug = require('debug')
44const log = debug ( 'exporter' )
55log . err = debug ( 'exporter:error' )
66const UnixFS = require ( 'ipfs-unixfs' )
7+ const series = require ( 'run-series' )
78const async = require ( 'async' )
8- const events = require ( 'events' )
99const Readable = require ( 'readable-stream' ) . Readable
1010const pathj = require ( 'path' )
11+ const util = require ( 'util' )
1112
12- exports = module . exports = exporter
13+ exports = module . exports = Exporter
1314
14- function exporter ( hash , dagService , options , callback ) {
15- if ( typeof options === 'function' ) {
16- callback = options
17- options = { }
15+ util . inherits ( Exporter , Readable )
16+
17+ function Exporter ( hash , dagService , options ) {
18+ if ( ! ( this instanceof Exporter ) ) {
19+ return new Exporter ( hash , dagService , options )
1820 }
1921
20- const ee = new events . EventEmitter ( )
21- dagService . get ( hash , ( err , fetchedNode ) => {
22- if ( err ) {
23- if ( callback ) {
24- return callback ( err )
25- }
26- return
27- }
28- const data = UnixFS . unmarshal ( fetchedNode . data )
29- const type = data . type
30- if ( type === 'directory' ) {
31- dirExporter ( fetchedNode , hash , callback )
32- }
33- if ( type === 'file' ) {
34- fileExporter ( fetchedNode , hash , false , callback )
35- }
36- } )
37- return ee
22+ Readable . call ( this , { objectMode : true } )
3823
39- function fileExporter ( node , name , dir , callback ) {
24+ this . options = options || { }
25+
26+ this . _read = ( n ) => { }
27+
28+ let fileExporter = ( node , name , callback ) => {
4029 let init
4130
42- if ( typeof dir === 'function' ) { callback = dir ; dir = { } }
31+ if ( ! callback ) { callback = function noop ( ) { } }
32+
4333 var rs = new Readable ( )
4434 if ( node . links . length === 0 ) {
4535 const unmarshaledData = UnixFS . unmarshal ( node . data )
@@ -52,10 +42,8 @@ function exporter (hash, dagService, options, callback) {
5242 rs . push ( unmarshaledData . data )
5343 rs . push ( null )
5444 }
55- ee . emit ( 'file' , { stream : rs , path : name , dir : dir } )
56- if ( callback ) {
57- callback ( )
58- }
45+ this . push ( { stream : rs , path : name } )
46+ callback ( )
5947 return
6048 } else {
6149 init = false
@@ -64,36 +52,40 @@ function exporter (hash, dagService, options, callback) {
6452 return
6553 }
6654 init = true
67- async . forEachSeries ( node . links , ( link , callback ) => {
68- dagService . get ( link . hash , ( err , res ) => {
69- if ( err ) {
70- callback ( err )
71- }
72- var unmarshaledData = UnixFS . unmarshal ( res . data )
73- rs . push ( unmarshaledData . data )
74- callback ( )
75- } )
76- } , ( err ) => {
55+
56+ const array = node . links . map ( ( link ) => {
57+ return ( cb ) => {
58+ dagService . get ( link . hash , ( err , res ) => {
59+ if ( err ) {
60+ cb ( err )
61+ }
62+ var unmarshaledData = UnixFS . unmarshal ( res . data )
63+ rs . push ( unmarshaledData . data )
64+ cb ( )
65+ } )
66+ }
67+ } )
68+ series ( array , ( err , res ) => {
7769 if ( err ) {
78- if ( callback ) {
79- return callback ( err )
80- }
70+ callback ( )
8171 return
8272 }
8373 rs . push ( null )
84- if ( callback ) {
85- callback ( )
86- }
74+ callback ( )
8775 return
8876 } )
8977 }
90- ee . emit ( 'file' , { stream : rs , path : name , dir : dir } )
78+ this . push ( { stream : rs , path : name } )
79+ callback ( )
80+ return
9181 }
9282 }
9383
94- function dirExporter ( node , name , callback ) {
84+ let dirExporter = ( node , name , callback ) => {
9585 let init
9686
87+ if ( ! callback ) { callback = function noop ( ) { } }
88+
9789 var rs = new Readable ( )
9890 if ( node . links . length === 0 ) {
9991 init = false
@@ -105,10 +97,8 @@ function exporter (hash, dagService, options, callback) {
10597 rs . push ( node . data )
10698 rs . push ( null )
10799 }
108- ee . emit ( 'file' , { stream : rs , path : name } )
109- if ( callback ) {
110- callback ( )
111- }
100+ this . push ( { stream : null , path : name } )
101+ callback ( )
112102 return
113103 } else {
114104 async . forEachSeries ( node . links , ( link , callback ) => {
@@ -127,16 +117,30 @@ function exporter (hash, dagService, options, callback) {
127117 } )
128118 } , ( err ) => {
129119 if ( err ) {
130- if ( callback ) {
131- return callback ( err )
132- }
133- return
134- }
135- if ( callback ) {
136120 callback ( )
121+ return
137122 }
123+ callback ( )
138124 return
139125 } )
140126 }
141127 }
128+
129+ dagService . get ( hash , ( err , fetchedNode ) => {
130+ if ( err ) {
131+ this . emit ( 'error' , err )
132+ return
133+ }
134+ const data = UnixFS . unmarshal ( fetchedNode . data )
135+ const type = data . type
136+
137+ if ( type === 'directory' ) {
138+ dirExporter ( fetchedNode , hash )
139+ }
140+ if ( type === 'file' ) {
141+ fileExporter ( fetchedNode , hash )
142+ }
143+ } )
144+
145+ return this
142146}
0 commit comments