1
1
import type { PeerId } from "@libp2p/interface/peer-id" ;
2
- import type {
3
- IMetadata ,
4
- Libp2p ,
5
- MetadataQueryParams ,
6
- ShardInfo
7
- } from "@waku/interfaces" ;
2
+ import { IncomingStreamData } from "@libp2p/interface/stream-handler" ;
3
+ import type { IMetadata , Libp2p , ShardInfo } from "@waku/interfaces" ;
4
+ import { proto_metadata } from "@waku/proto" ;
8
5
import { Logger } from "@waku/utils" ;
9
6
import all from "it-all" ;
10
7
import * as lp from "it-length-prefixed" ;
@@ -13,31 +10,32 @@ import { Uint8ArrayList } from "uint8arraylist";
13
10
14
11
import { BaseProtocol } from "../base_protocol.js" ;
15
12
16
- import { MetadataRpc } from "./rpc.js" ;
17
-
18
13
const log = new Logger ( "metadata" ) ;
19
14
20
15
export const MetadataCodec = "/vac/waku/metadata/1.0.0" ;
21
16
22
17
class Metadata extends BaseProtocol {
23
- constructor ( libp2p : Libp2p ) {
18
+ private readonly shardInfo : ShardInfo ;
19
+ constructor ( shardInfo : ShardInfo , libp2p : Libp2p ) {
24
20
super ( MetadataCodec , libp2p . components ) ;
21
+ this . shardInfo = shardInfo ;
22
+ void libp2p . handle ( MetadataCodec , ( streamData ) => {
23
+ void this . onRequest ( streamData ) ;
24
+ } ) ;
25
25
}
26
26
27
27
/**
28
- * Make a metadata query to a peer
28
+ * Handle an incoming metadata request
29
29
*/
30
- async query ( params : MetadataQueryParams , peerId : PeerId ) : Promise < ShardInfo > {
31
- const rpcQuery = MetadataRpc . createRequest ( params . clusterId , params . shards ) ;
32
-
33
- const peer = await this . getPeer ( peerId ) ;
34
-
35
- const stream = await this . getStream ( peer ) ;
30
+ private async onRequest ( streamData : IncomingStreamData ) : Promise < void > {
31
+ const encodedRpcQuery = proto_metadata . WakuMetadataRequest . encode (
32
+ this . shardInfo
33
+ ) ;
36
34
37
35
const res = await pipe (
38
- [ rpcQuery . encode ( ) ] ,
36
+ [ encodedRpcQuery ] ,
39
37
lp . encode ,
40
- stream ,
38
+ streamData . stream ,
41
39
lp . decode ,
42
40
async ( source ) => await all ( source )
43
41
) ;
@@ -48,23 +46,57 @@ class Metadata extends BaseProtocol {
48
46
bytes . append ( chunk ) ;
49
47
} ) ;
50
48
51
- const { response } = MetadataRpc . decode ( bytes ) ;
52
- if ( ! response ) {
53
- throw new Error ( "No response in query" ) ;
49
+ const shardInfoRes = proto_metadata . WakuMetadataResponse . decode ( bytes ) ;
50
+ if ( ! shardInfoRes ) {
51
+ throw new Error ( "WakuMetadata response is undefined" ) ;
52
+ }
53
+ if ( ! shardInfoRes . clusterId ) {
54
+ throw new Error ( "WakuMetadata response clusterId is undefined" ) ;
54
55
}
55
-
56
- const { shards, clusterId } = response ;
57
- return {
58
- cluster : clusterId ,
59
- indexList : shards
60
- } as ShardInfo ;
61
56
} catch ( e ) {
62
57
log . error ( `Error decoding response: ${ e } ` ) ;
63
58
throw e ;
64
59
}
65
60
}
61
+
62
+ /**
63
+ * Make a metadata query to a peer
64
+ */
65
+ async query ( peerId : PeerId ) : Promise < ShardInfo > {
66
+ const request = proto_metadata . WakuMetadataRequest . encode ( this . shardInfo ) ;
67
+
68
+ try {
69
+ const peer = await this . getPeer ( peerId ) ;
70
+
71
+ const stream = await this . getStream ( peer ) ;
72
+
73
+ const res = await pipe (
74
+ [ request ] ,
75
+ lp . encode ,
76
+ stream ,
77
+ lp . decode ,
78
+ async ( source ) => await all ( source )
79
+ ) ;
80
+
81
+ const bytes = new Uint8ArrayList ( ) ;
82
+ res . forEach ( ( chunk ) => {
83
+ bytes . append ( chunk ) ;
84
+ } ) ;
85
+ const response = proto_metadata . WakuMetadataResponse . decode ( bytes ) ;
86
+ if ( ! response ) {
87
+ throw new Error ( "Error decoding metadata response" ) ;
88
+ }
89
+
90
+ return response as ShardInfo ;
91
+ } catch ( err ) {
92
+ log . error ( "Error decoding metadata response" , err ) ;
93
+ throw err ;
94
+ }
95
+ }
66
96
}
67
97
68
- export function wakuMetadata ( ) : ( libp2p : Libp2p ) => IMetadata {
69
- return ( libp2p : Libp2p ) => new Metadata ( libp2p ) ;
98
+ export function wakuMetadata (
99
+ shardInfo : ShardInfo
100
+ ) : ( libp2p : Libp2p ) => IMetadata {
101
+ return ( libp2p : Libp2p ) => new Metadata ( shardInfo , libp2p ) ;
70
102
}
0 commit comments