3
3
const ipns = require ( 'ipns' )
4
4
const { fromB58String } = require ( 'multihashes' )
5
5
const Record = require ( 'libp2p-record' ) . Record
6
+ const PeerId = require ( 'peer-id' )
6
7
const errcode = require ( 'err-code' )
7
8
8
9
const debug = require ( 'debug' )
@@ -12,13 +13,11 @@ log.error = debug('jsipfs:ipns:resolver:error')
12
13
const defaultMaximumRecursiveDepth = 32
13
14
14
15
class IpnsResolver {
15
- constructor ( routing , repo ) {
16
+ constructor ( routing ) {
16
17
this . _routing = routing
17
- this . _repo = repo
18
- this . _resolver = undefined // TODO Routing - add Router resolver
19
18
}
20
19
21
- resolve ( name , peerId , options , callback ) {
20
+ resolve ( name , options , callback ) {
22
21
if ( typeof options === 'function' ) {
23
22
callback = options
24
23
options = { }
@@ -33,7 +32,6 @@ class IpnsResolver {
33
32
34
33
options = options || { }
35
34
const recursive = options . recursive && options . recursive . toString ( ) === 'true'
36
- const local = ! ( options . local === false )
37
35
38
36
const nameSegments = name . split ( '/' )
39
37
@@ -53,20 +51,7 @@ class IpnsResolver {
53
51
depth = defaultMaximumRecursiveDepth
54
52
}
55
53
56
- // Get the intended resoulver function
57
- // TODO Routing - set default resolverFn
58
-
59
- let resolverFn
60
-
61
- if ( local ) {
62
- resolverFn = this . _resolveLocal
63
- }
64
-
65
- if ( ! resolverFn ) {
66
- return callback ( new Error ( 'not implemented yet' ) )
67
- }
68
-
69
- this . resolver ( key , depth , peerId , resolverFn , ( err , res ) => {
54
+ this . resolver ( key , depth , ( err , res ) => {
70
55
if ( err ) {
71
56
return callback ( err )
72
57
}
@@ -77,10 +62,7 @@ class IpnsResolver {
77
62
}
78
63
79
64
// Recursive resolver according to the specified depth
80
- resolver ( name , depth , peerId , resolverFn , callback ) {
81
- // bind resolver function
82
- this . _resolver = resolverFn
83
-
65
+ resolver ( name , depth , callback ) {
84
66
// Exceeded recursive maximum depth
85
67
if ( depth === 0 ) {
86
68
const errMsg = `could not resolve name (recursion limit of ${ defaultMaximumRecursiveDepth } exceeded)`
@@ -89,7 +71,7 @@ class IpnsResolver {
89
71
return callback ( errcode ( new Error ( errMsg ) , 'ERR_RESOLVE_RECURSION_LIMIT' ) )
90
72
}
91
73
92
- this . _resolver ( name , peerId , ( err , res ) => {
74
+ this . _resolveName ( name , ( err , res ) => {
93
75
if ( err ) {
94
76
return callback ( err )
95
77
}
@@ -102,30 +84,35 @@ class IpnsResolver {
102
84
}
103
85
104
86
// continue recursively until depth equals 0
105
- this . resolver ( nameSegments [ 2 ] , depth - 1 , peerId , resolverFn , callback )
87
+ this . resolver ( nameSegments [ 2 ] , depth - 1 , callback )
106
88
} )
107
89
}
108
90
109
- // resolve ipns entries locally using the datastore
110
- _resolveLocal ( name , peerId , callback ) {
111
- const { ipnsKey } = ipns . getIdKeys ( fromB58String ( name ) )
91
+ // resolve ipns entries from the provided routing
92
+ _resolveName ( name , callback ) {
93
+ const peerId = PeerId . createFromB58String ( name )
94
+ const { routingKey } = ipns . getIdKeys ( fromB58String ( name ) )
112
95
113
- this . _repo . datastore . get ( ipnsKey , ( err , dsVal ) => {
114
- if ( err ) {
115
- const errMsg = `local record requested was not found for ${ name } (${ ipnsKey } )`
96
+ // TODO DHT - get public key from routing?
97
+ // https://github.com/ipfs/go-ipfs/blob/master/namesys/routing.go#L70
98
+ // https://github.com/libp2p/go-libp2p-routing/blob/master/routing.go#L99
99
+
100
+ this . _routing . get ( routingKey . toBuffer ( ) , ( err , res ) => {
101
+ if ( err || ! res ) {
102
+ const errMsg = `record requested was not found for ${ name } (${ routingKey } ) in the network`
116
103
117
104
log . error ( errMsg )
118
- return callback ( errcode ( new Error ( errMsg ) , 'ERR_NO_LOCAL_RECORD_FOUND ' ) )
105
+ return callback ( errcode ( new Error ( errMsg ) , 'ERR_NO_NETWORK_RECORD_FOUND ' ) )
119
106
}
120
107
121
- if ( ! Buffer . isBuffer ( dsVal ) ) {
108
+ if ( ! Buffer . isBuffer ( res ) ) {
122
109
const errMsg = `found ipns record that we couldn't convert to a value`
123
110
124
111
log . error ( errMsg )
125
112
return callback ( errcode ( new Error ( errMsg ) , 'ERR_INVALID_RECORD_RECEIVED' ) )
126
113
}
127
114
128
- const record = Record . deserialize ( dsVal )
115
+ const record = Record . deserialize ( res )
129
116
const ipnsEntry = ipns . unmarshal ( record . value )
130
117
131
118
ipns . extractPublicKey ( peerId , ipnsEntry , ( err , pubKey ) => {
0 commit comments