@@ -6,6 +6,22 @@ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
6
6
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
7
7
import { streamResponse } from '../../utils/stream-response.js'
8
8
import pushable from 'it-pushable'
9
+ import { base64url } from 'multiformats/bases/base64'
10
+
11
+ const preDecodeTopicFromHttpRpc = {
12
+ assign : 'topic' ,
13
+ /**
14
+ * @param {import('../../types').Request } request
15
+ * @param {import('@hapi/hapi').ResponseToolkit } _h
16
+ */
17
+ method : async ( request , _h ) => {
18
+ try {
19
+ return uint8ArrayToString ( base64url . decode ( request . query . topic ) )
20
+ } catch ( /** @type {any } */ err ) {
21
+ throw Boom . boomify ( err , { message : `Failed to decode topic from HTTP RPC form ${ request . query . topic } ` } )
22
+ }
23
+ }
24
+ }
9
25
10
26
export const subscribeResource = {
11
27
options : {
@@ -24,7 +40,8 @@ export const subscribeResource = {
24
40
override : true ,
25
41
ignoreUndefined : true
26
42
} )
27
- }
43
+ } ,
44
+ pre : [ preDecodeTopicFromHttpRpc ]
28
45
} ,
29
46
/**
30
47
* @param {import('../../types').Request } request
@@ -40,8 +57,8 @@ export const subscribeResource = {
40
57
ipfs
41
58
}
42
59
} ,
43
- query : {
44
- topic
60
+ pre : {
61
+ topic // decoded version created by preDecodeTopicFromHttpRpc
45
62
}
46
63
} = request
47
64
@@ -56,13 +73,11 @@ export const subscribeResource = {
56
73
* @type {import('ipfs-core-types/src/pubsub').MessageHandlerFn }
57
74
*/
58
75
const handler = ( msg ) => {
59
- // TODO: data, seqno and topicIDs in multibase
60
- // TODO: from should use canonical toString from peerid libp2p lib
61
76
output . push ( {
62
- from : uint8ArrayToString ( uint8ArrayFromString ( msg . from , 'base58btc' ) , 'base64pad' ) ,
63
- data : uint8ArrayToString ( msg . data , 'base64pad' ) ,
64
- seqno : uint8ArrayToString ( msg . seqno , 'base64pad' ) ,
65
- topicIDs : msg . topicIDs
77
+ from : msg . from , // TODO: switch to PeerId.parse(msg.from).toString() when go-ipfs defaults to CIDv1
78
+ data : base64url . encode ( msg . data ) ,
79
+ seqno : base64url . encode ( msg . seqno ) ,
80
+ topicIDs : msg . topicIDs . map ( t => base64url . encode ( uint8ArrayFromString ( t ) ) )
66
81
} )
67
82
}
68
83
@@ -92,7 +107,7 @@ export const publishResource = {
92
107
parse : false ,
93
108
output : 'stream'
94
109
} ,
95
- pre : [ {
110
+ pre : [ preDecodeTopicFromHttpRpc , {
96
111
assign : 'data' ,
97
112
/**
98
113
* @param {import('../../types').Request } request
@@ -149,16 +164,15 @@ export const publishResource = {
149
164
}
150
165
} ,
151
166
pre : {
167
+ topic,
152
168
data
153
169
} ,
154
170
query : {
155
- topic,
156
171
timeout
157
172
}
158
173
} = request
159
174
160
175
try {
161
- // TODO: unwrap topic from multibase?
162
176
await ipfs . pubsub . publish ( topic , data , {
163
177
signal,
164
178
timeout
@@ -212,8 +226,7 @@ export const lsResource = {
212
226
throw Boom . boomify ( err , { message : 'Failed to list subscriptions' } )
213
227
}
214
228
215
- // TODO: multibase topic names in Strings array
216
- return h . response ( { Strings : subscriptions } )
229
+ return h . response ( { Strings : subscriptions . map ( s => base64url . encode ( uint8ArrayFromString ( s ) ) ) } )
217
230
}
218
231
}
219
232
@@ -232,7 +245,8 @@ export const peersResource = {
232
245
override : true ,
233
246
ignoreUndefined : true
234
247
} )
235
- }
248
+ } ,
249
+ pre : [ preDecodeTopicFromHttpRpc ]
236
250
} ,
237
251
/**
238
252
* @param {import('../../types').Request } request
@@ -248,15 +262,16 @@ export const peersResource = {
248
262
ipfs
249
263
}
250
264
} ,
265
+ pre : {
266
+ topic
267
+ } ,
251
268
query : {
252
- topic,
253
269
timeout
254
270
}
255
271
} = request
256
272
257
273
let peers
258
274
try {
259
- // TODO: unwrap topic from multibase
260
275
peers = await ipfs . pubsub . peers ( topic , {
261
276
signal,
262
277
timeout
0 commit comments