11'use strict'
22
33const 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' )
510
611module . exports = ( send ) => {
712 return promisify ( ( peerId , opts , callback ) => {
@@ -17,10 +22,41 @@ module.exports = (send) => {
1722 opts = { }
1823 }
1924
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 ( {
2151 path : 'dht/findpeer' ,
2252 args : peerId ,
2353 qs : opts
24- } , streamToValue , callback )
54+ } , ( err , result ) => {
55+ if ( err ) {
56+ return callback ( err )
57+ }
58+
59+ streamToValueWithTransformer ( result , handleResult , callback )
60+ } )
2561 } )
2662}
0 commit comments