1
1
'use strict'
2
2
3
3
const promisify = require ( 'promisify-es6' )
4
- const streamToValue = require ( '../utils/stream-to-value' )
4
+ const streamToValueWithTransformer = require ( '../utils/stream-to-value-with-transformer' )
5
+
6
+ const multiaddr = require ( 'multiaddr' )
7
+ const PeerId = require ( 'peer-id' )
8
+ const PeerInfo = require ( 'peer-info' )
9
+ const errcode = require ( 'err-code' )
5
10
6
11
module . exports = ( send ) => {
7
12
return promisify ( ( peerId , opts , callback ) => {
@@ -17,10 +22,41 @@ module.exports = (send) => {
17
22
opts = { }
18
23
}
19
24
20
- send . andTransform ( {
25
+ const handleResult = ( res , callback ) => {
26
+ // Inconsistent return values in the browser
27
+ if ( Array . isArray ( res ) ) {
28
+ res = res [ 0 ]
29
+ }
30
+
31
+ // Type 2 keys
32
+ if ( res . Type !== 2 ) {
33
+ const errMsg = `key was not found (type 2)`
34
+
35
+ return callback ( errcode ( new Error ( errMsg ) , 'ERR_KEY_TYPE_2_NOT_FOUND' ) )
36
+ }
37
+
38
+ const responseReceived = res . Responses [ 0 ]
39
+ const peerInfo = new PeerInfo ( PeerId . createFromB58String ( responseReceived . ID ) )
40
+
41
+ responseReceived . Addrs . forEach ( ( addr ) => {
42
+ const ma = multiaddr ( addr )
43
+
44
+ peerInfo . multiaddrs . add ( ma )
45
+ } )
46
+
47
+ callback ( null , peerInfo )
48
+ }
49
+
50
+ send ( {
21
51
path : 'dht/findpeer' ,
22
52
args : peerId ,
23
53
qs : opts
24
- } , streamToValue , callback )
54
+ } , ( err , result ) => {
55
+ if ( err ) {
56
+ return callback ( err )
57
+ }
58
+
59
+ streamToValueWithTransformer ( result , handleResult , callback )
60
+ } )
25
61
} )
26
62
}
0 commit comments