@@ -4,42 +4,32 @@ const debug = require('debug')
4
4
const log = debug ( 'exporter' )
5
5
log . err = debug ( 'exporter:error' )
6
6
const UnixFS = require ( 'ipfs-unixfs' )
7
+ const series = require ( 'run-series' )
7
8
const async = require ( 'async' )
8
- const events = require ( 'events' )
9
9
const Readable = require ( 'readable-stream' ) . Readable
10
10
const pathj = require ( 'path' )
11
+ const util = require ( 'util' )
11
12
12
- exports = module . exports = exporter
13
+ exports = module . exports = Exporter
13
14
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 )
18
20
}
19
21
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 } )
38
23
39
- function fileExporter ( node , name , dir , callback ) {
24
+ this . options = options || { }
25
+
26
+ this . _read = ( n ) => { }
27
+
28
+ let fileExporter = ( node , name , callback ) => {
40
29
let init
41
30
42
- if ( typeof dir === 'function' ) { callback = dir ; dir = { } }
31
+ if ( ! callback ) { callback = function noop ( ) { } }
32
+
43
33
var rs = new Readable ( )
44
34
if ( node . links . length === 0 ) {
45
35
const unmarshaledData = UnixFS . unmarshal ( node . data )
@@ -52,10 +42,8 @@ function exporter (hash, dagService, options, callback) {
52
42
rs . push ( unmarshaledData . data )
53
43
rs . push ( null )
54
44
}
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 ( )
59
47
return
60
48
} else {
61
49
init = false
@@ -64,36 +52,40 @@ function exporter (hash, dagService, options, callback) {
64
52
return
65
53
}
66
54
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 ) => {
77
69
if ( err ) {
78
- if ( callback ) {
79
- return callback ( err )
80
- }
70
+ callback ( )
81
71
return
82
72
}
83
73
rs . push ( null )
84
- if ( callback ) {
85
- callback ( )
86
- }
74
+ callback ( )
87
75
return
88
76
} )
89
77
}
90
- ee . emit ( 'file' , { stream : rs , path : name , dir : dir } )
78
+ this . push ( { stream : rs , path : name } )
79
+ callback ( )
80
+ return
91
81
}
92
82
}
93
83
94
- function dirExporter ( node , name , callback ) {
84
+ let dirExporter = ( node , name , callback ) => {
95
85
let init
96
86
87
+ if ( ! callback ) { callback = function noop ( ) { } }
88
+
97
89
var rs = new Readable ( )
98
90
if ( node . links . length === 0 ) {
99
91
init = false
@@ -105,10 +97,8 @@ function exporter (hash, dagService, options, callback) {
105
97
rs . push ( node . data )
106
98
rs . push ( null )
107
99
}
108
- ee . emit ( 'file' , { stream : rs , path : name } )
109
- if ( callback ) {
110
- callback ( )
111
- }
100
+ this . push ( { stream : null , path : name } )
101
+ callback ( )
112
102
return
113
103
} else {
114
104
async . forEachSeries ( node . links , ( link , callback ) => {
@@ -127,16 +117,30 @@ function exporter (hash, dagService, options, callback) {
127
117
} )
128
118
} , ( err ) => {
129
119
if ( err ) {
130
- if ( callback ) {
131
- return callback ( err )
132
- }
133
- return
134
- }
135
- if ( callback ) {
136
120
callback ( )
121
+ return
137
122
}
123
+ callback ( )
138
124
return
139
125
} )
140
126
}
141
127
}
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
142
146
}
0 commit comments