@@ -175,20 +175,41 @@ func (s *Service) checkAndAddPeers(ctx context.Context, peers pb.Peers) {
175175 wg := sync.WaitGroup {}
176176
177177 addPeer := func (newPeer * pb.BzzAddress , multiUnderlay ma.Multiaddr ) {
178- wsProto := false
179- ma .ForEach (multiUnderlay , func (c ma.Component ) bool {
180- if c .Protocol ().Name == "ws" {
181- wsProto = true
182- return false
178+ parts := ma .Split (multiUnderlay )
179+
180+ var baseParts []ma.Component
181+ var p2pID string
182+
183+ for _ , c := range parts {
184+ switch c .Protocol ().Name {
185+ case "ws" , "wss" :
186+ continue // skip if already present
187+ case "p2p" :
188+ p2pID = c .Value ()
189+ default :
190+ baseParts = append (baseParts , c )
183191 }
184- return true
185- })
192+ }
186193
187- if ! wsProto {
188- s .logger .Debug ("skipping non-websocket peer" , "peer_address" , hex .EncodeToString (newPeer .Overlay ), "underlay" , multiUnderlay )
189- return
194+ baseAddr , _ := ma .NewMultiaddr ("" )
195+ for _ , c := range baseParts {
196+ componentStr := "/" + c .Protocol ().Name + "/" + c .Value ()
197+ component , err := ma .NewMultiaddr (componentStr )
198+ if err != nil {
199+ s .logger .Error (errors .New ("invalid multiaddr component" ), "component" , componentStr , "error" , err )
200+ return
201+ }
202+ baseAddr = baseAddr .Encapsulate (component )
203+ }
204+
205+ // Add /ws and /p2p
206+ baseAddr = baseAddr .Encapsulate (ma .StringCast ("/ws" ))
207+ if p2pID != "" {
208+ baseAddr = baseAddr .Encapsulate (ma .StringCast ("/p2p/" + p2pID ))
190209 }
191210
211+ s .logger .Debug ("rewritten multiaddr to use websocket" , "peer_address" , hex .EncodeToString (newPeer .Overlay ), "ws_underlay" , baseAddr .String ())
212+
192213 err := s .sem .Acquire (ctx , 1 )
193214 if err != nil {
194215 return
@@ -206,15 +227,15 @@ func (s *Service) checkAndAddPeers(ctx context.Context, peers pb.Peers) {
206227 defer cancel ()
207228
208229 // check if the underlay is usable by doing a raw ping using libp2p
209- if _ , err := s .streamer .Ping (ctx , multiUnderlay ); err != nil {
230+ if _ , err := s .streamer .Ping (ctx , baseAddr ); err != nil {
210231
211- s .logger .Debug ("unreachable peer underlay" , "peer_address" , hex .EncodeToString (newPeer .Overlay ), "underlay" , multiUnderlay )
232+ s .logger .Debug ("unreachable peer underlay" , "peer_address" , hex .EncodeToString (newPeer .Overlay ), "underlay" , multiUnderlay , "error" , err )
212233 return
213234 }
214235
215236 bzzAddress := bzz.Address {
216237 Overlay : swarm .NewAddress (newPeer .Overlay ),
217- Underlay : multiUnderlay ,
238+ Underlay : baseAddr ,
218239 Signature : newPeer .Signature ,
219240 Nonce : newPeer .Nonce ,
220241 }
0 commit comments