@@ -19,103 +19,94 @@ const header = (status = 200, statusText = 'OK', headers = {}) => ({
19
19
headers
20
20
} )
21
21
22
- const response = ( ipfsNode , ipfsPath ) => {
22
+ const response = async ( ipfsNode , ipfsPath ) => {
23
23
// handle hash resolve error (simple hash, test for directory now)
24
- const handleResolveError = ( node , path , error ) => {
24
+ const handleResolveError = async ( node , path , error ) => {
25
25
if ( error ) {
26
26
const errorString = error . toString ( )
27
27
28
- return new Promise ( ( resolve , reject ) => {
29
- // switch case with true feels so wrong.
30
- switch ( true ) {
31
- case ( errorString . includes ( 'dag node is a directory' ) ) :
32
- resolver . directory ( node , path , error . cid )
33
- . then ( ( content ) => {
34
- // dir render
35
- if ( typeof content === 'string' ) {
36
- resolve ( new Response ( content , header ( 200 , 'OK' , { 'Content-Type' : 'text/html' } ) ) )
37
- }
38
-
39
- // redirect to dir entry point (index)
40
- resolve ( Response . redirect ( pathUtils . joinURLParts ( path , content [ 0 ] . Name ) ) )
41
- } )
42
- . catch ( ( error ) => {
43
- log ( error )
44
- resolve ( new Response ( errorString , header ( 500 , error . toString ( ) ) ) )
45
- } )
46
- break
47
- case errorString . startsWith ( 'Error: no link named' ) :
48
- resolve ( new Response ( errorString , header ( 404 , errorString ) ) )
49
- break
50
- case errorString . startsWith ( 'Error: multihash length inconsistent' ) :
51
- case errorString . startsWith ( 'Error: Non-base58 character' ) :
52
- resolve ( new Response ( errorString , header ( 400 , errorString ) ) )
53
- break
54
- default :
55
- log ( error )
56
- resolve ( new Response ( errorString , header ( 500 , errorString ) ) )
28
+ if ( errorString . includes ( 'dag node is a directory' ) ) {
29
+ try {
30
+ const content = await resolver . directory ( node , path , error . cid )
31
+ // dir render
32
+ if ( typeof content === 'string' ) {
33
+ return new Response ( content , header ( 200 , 'OK' , { 'Content-Type' : 'text/html' } ) )
34
+ }
35
+
36
+ // redirect to dir entry point (index)
37
+ return Response . redirect ( pathUtils . joinURLParts ( path , content [ 0 ] . Name ) )
38
+ } catch ( error ) {
39
+ log ( error )
40
+ return new Response ( errorString , header ( 500 , error . toString ( ) ) )
57
41
}
58
- } )
42
+ }
43
+
44
+ if ( errorString . startsWith ( 'Error: no link named' ) ) {
45
+ return new Response ( errorString , header ( 404 , errorString ) )
46
+ }
47
+
48
+ if ( errorString . startsWith ( 'Error: multihash length inconsistent' ) || errorString . startsWith ( 'Error: Non-base58 character' ) ) {
49
+ return new Response ( errorString , header ( 400 , errorString ) )
50
+ }
51
+
52
+ log ( error )
53
+ return new Response ( errorString , header ( 500 , errorString ) )
59
54
}
60
55
}
61
56
62
- return new Promise ( ( resolve , reject ) => {
63
- // remove trailing slash for files if needed
64
- if ( ipfsPath . endsWith ( '/' ) ) {
65
- resolve ( Response . redirect ( pathUtils . removeTrailingSlash ( ipfsPath ) ) )
66
- }
57
+ // remove trailing slash for files if needed
58
+ if ( ipfsPath . endsWith ( '/' ) ) {
59
+ return Response . redirect ( pathUtils . removeTrailingSlash ( ipfsPath ) )
60
+ }
67
61
68
- resolver . cid ( ipfsNode , ipfsPath )
69
- . then ( ( resolvedData ) => {
70
- const readableStream = ipfsNode . catReadableStream ( resolvedData . cid )
71
- const responseStream = new stream . PassThrough ( { highWaterMark : 1 } )
72
- readableStream . pipe ( responseStream )
62
+ try {
63
+ const resolvedData = await resolver . cid ( ipfsNode , ipfsPath )
73
64
74
- readableStream . once ( 'error' , ( error ) => {
75
- if ( error ) {
76
- log ( error )
77
- resolve ( new Response ( error . toString ( ) , header ( 500 , 'Error fetching the file' ) ) )
78
- }
79
- } )
80
-
81
- // return only after first chunk being checked
82
- let contentTypeDetected = false
83
- readableStream . on ( 'data' , ( chunk ) => {
84
- // check mime on first chunk
85
- if ( contentTypeDetected ) {
86
- return
87
- }
65
+ const readableStream = ipfsNode . catReadableStream ( resolvedData . cid )
66
+ const responseStream = new stream . PassThrough ( { highWaterMark : 1 } )
67
+ readableStream . pipe ( responseStream )
88
68
89
- contentTypeDetected = true
90
- // return Response with mime type
91
- const contentType = detectContentType ( ipfsPath , chunk )
92
-
93
- if ( typeof Blob === 'undefined' ) {
94
- if ( contentType ) {
95
- resolve ( new Response ( responseStream , header ( 200 , 'OK' , { 'Content-Type' : contentType } ) ) )
96
- } else {
97
- resolve ( new Response ( responseStream , header ( ) ) )
98
- }
99
- } else {
100
- toBlob ( responseStream , ( err , blob ) => {
101
- if ( err ) {
102
- resolve ( new Response ( err . toString ( ) , header ( 500 , 'Error fetching the file' ) ) )
103
- }
104
-
105
- if ( contentType ) {
106
- resolve ( new Response ( blob , header ( 200 , 'OK' , { 'Content-Type' : contentType } ) ) )
107
- } else {
108
- resolve ( new Response ( blob , header ( ) ) )
109
- }
110
- } )
111
- }
112
- } )
69
+ return new Promise ( ( resolve , reject ) => {
70
+ readableStream . once ( 'error' , ( error ) => {
71
+ if ( error ) {
72
+ log ( error )
73
+ return resolve ( new Response ( error . toString ( ) , header ( 500 , 'Error fetching the file' ) ) )
74
+ }
113
75
} )
114
- . catch ( ( error ) => {
115
- log ( error )
116
- resolve ( handleResolveError ( ipfsNode , ipfsPath , error ) )
76
+
77
+ // return only after first chunk being checked
78
+ let contentTypeDetected = false
79
+ readableStream . on ( 'data' , async ( chunk ) => {
80
+ // check mime on first chunk
81
+ if ( contentTypeDetected ) {
82
+ return
83
+ }
84
+
85
+ contentTypeDetected = true
86
+ // return Response with mime type
87
+ const contentType = detectContentType ( ipfsPath , chunk )
88
+
89
+ if ( typeof Blob === 'undefined' ) {
90
+ return contentType
91
+ ? resolve ( new Response ( responseStream , header ( 200 , 'OK' , { 'Content-Type' : contentType } ) ) )
92
+ : resolve ( new Response ( responseStream , header ( ) ) )
93
+ }
94
+
95
+ try {
96
+ const blob = await toBlob ( responseStream )
97
+
98
+ return contentType
99
+ ? resolve ( new Response ( blob , header ( 200 , 'OK' , { 'Content-Type' : contentType } ) ) )
100
+ : resolve ( new Response ( blob , header ( ) ) )
101
+ } catch ( err ) {
102
+ return resolve ( new Response ( err . toString ( ) , header ( 500 , 'Error fetching the file' ) ) )
103
+ }
117
104
} )
118
- } )
105
+ } )
106
+ } catch ( error ) {
107
+ log ( error )
108
+ return handleResolveError ( ipfsNode , ipfsPath , error )
109
+ }
119
110
}
120
111
121
112
module . exports = {
0 commit comments