Skip to content

Commit b01e7cd

Browse files
committed
disco: Peermap to Server
1 parent 307e441 commit b01e7cd

File tree

6 files changed

+30
-54
lines changed

6 files changed

+30
-54
lines changed

cmd/pgcli/vpn/vpn.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -278,11 +278,7 @@ func (v *P2PVPN) listenPacketConn(ctx context.Context) (c *p2p.PacketConn, err e
278278
if err != nil {
279279
return
280280
}
281-
peermapURL, err := url.Parse(v.Config.Server)
282-
if err != nil {
283-
return
284-
}
285-
peermap, err := disco.NewPeermap(peermapURL, secretStore)
281+
peermap, err := disco.NewServer(v.Config.Server, secretStore)
286282
if err != nil {
287283
return
288284
}

disco/peermap.go disco/server.go

+12-26
Original file line numberDiff line numberDiff line change
@@ -10,43 +10,29 @@ import (
1010
"time"
1111
)
1212

13-
type Peermap struct {
14-
store SecretStore
15-
server *url.URL
13+
type Server struct {
14+
Secret SecretStore
15+
URL string
1616
}
1717

18-
func NewPeermap(server *url.URL, store SecretStore) (*Peermap, error) {
18+
func NewServer(serverURL string, store SecretStore) (*Server, error) {
1919
if store == nil {
2020
return nil, errors.New("secret store is required")
2121
}
22-
if server == nil {
23-
return nil, errors.New("peermap server is required")
22+
23+
server, err := url.Parse(serverURL)
24+
if err != nil {
25+
return nil, err
2426
}
2527
if !slices.Contains([]string{"https", "wss", "http", "ws"}, server.Scheme) {
26-
return nil, fmt.Errorf("invalid peermap server %s", server.String())
28+
return nil, fmt.Errorf("unsupport server protocol: %s", server.String())
2729
}
28-
return &Peermap{
29-
store: store,
30-
server: server,
30+
return &Server{
31+
Secret: store,
32+
URL: serverURL,
3133
}, nil
3234
}
3335

34-
func NewPeermapURL(serverURL string, store SecretStore) (*Peermap, error) {
35-
sURL, err := url.Parse(serverURL)
36-
if err != nil {
37-
return nil, fmt.Errorf("invalid peermap url: %w", err)
38-
}
39-
return NewPeermap(sURL, store)
40-
}
41-
42-
func (s *Peermap) SecretStore() SecretStore {
43-
return s.store
44-
}
45-
46-
func (s *Peermap) String() string {
47-
return s.server.String()
48-
}
49-
5036
type SecretStore interface {
5137
NetworkSecret() (NetworkSecret, error)
5238
UpdateNetworkSecret(NetworkSecret) error

disco/ws/ws.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ws
22

33
import (
4+
"cmp"
45
"context"
56
"encoding/base64"
67
"encoding/json"
@@ -29,7 +30,7 @@ var (
2930

3031
type WSConn struct {
3132
rawConn atomic.Pointer[websocket.Conn]
32-
server *disco.Peermap
33+
server *disco.Server
3334
connectedServer string
3435
peerID disco.PeerID
3536
metadata url.Values
@@ -197,7 +198,7 @@ func (c *WSConn) Unregister(ctr disco.Controller) {
197198
}
198199

199200
func (c *WSConn) dial(ctx context.Context, server string) error {
200-
networkSecret, err := c.server.SecretStore().NetworkSecret()
201+
networkSecret, err := cmp.Or[disco.SecretStore](c.server.Secret, &disco.NetworkSecret{}).NetworkSecret()
201202
if err != nil {
202203
return fmt.Errorf("get network secret failed: %w", err)
203204
}
@@ -207,7 +208,7 @@ func (c *WSConn) dial(ctx context.Context, server string) error {
207208
handshake.Set("X-Nonce", disco.NewNonce())
208209
handshake.Set("X-Metadata", c.metadata.Encode())
209210
if server == "" {
210-
server = c.server.String()
211+
server = c.server.URL
211212
}
212213
peermap, err := url.Parse(server)
213214
if err != nil {
@@ -474,7 +475,7 @@ func (c *WSConn) writeWS(messageType int, data []byte) error {
474475

475476
func (c *WSConn) updateNetworkSecret(secret disco.NetworkSecret) {
476477
for i := 0; i < 5; i++ {
477-
if err := c.server.SecretStore().UpdateNetworkSecret(secret); err != nil {
478+
if err := c.server.Secret.UpdateNetworkSecret(secret); err != nil {
478479
slog.Error("[WS] NetworkSecretUpdate", "err", err)
479480
time.Sleep(time.Second)
480481
continue
@@ -484,7 +485,7 @@ func (c *WSConn) updateNetworkSecret(secret disco.NetworkSecret) {
484485
slog.Error("[WS] NetworkSecretUpdate give up", "secret", secret)
485486
}
486487

487-
func DialPeermap(ctx context.Context, server *disco.Peermap, peerID disco.PeerID, metadata url.Values) (*WSConn, error) {
488+
func DialPeermap(ctx context.Context, server *disco.Server, peerID disco.PeerID, metadata url.Values) (*WSConn, error) {
488489
wsConn := &WSConn{
489490
server: server,
490491
peerID: peerID,

fileshare/common.go

+1-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"io"
77
"net"
8-
"net/url"
98

109
"github.com/sigcn/pg/disco"
1110
"github.com/sigcn/pg/p2p"
@@ -18,12 +17,8 @@ type PublicNetwork struct {
1817
}
1918

2019
func (pn *PublicNetwork) ListenPacket(udpPort int) (net.PacketConn, error) {
21-
pmapURL, err := url.Parse(pn.Server)
22-
if err != nil {
23-
return nil, fmt.Errorf("invalid peermap URL: %w", err)
24-
}
2520
network := cmp.Or(pn.Name, "pubnet")
26-
pmap, err := disco.NewPeermap(pmapURL, &disco.NetworkSecret{Network: network, Secret: network})
21+
pmap, err := disco.NewServer(pn.Server, &disco.NetworkSecret{Network: network, Secret: network})
2722
if err != nil {
2823
return nil, fmt.Errorf("create peermap failed: %w", err)
2924
}

p2p/README.md

+8-10
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# p2p library
22

33
### Example
4+
45
### Peer1 (act as echo server)
6+
57
```go
6-
peermapURL := "wss://synf.in/pg"
8+
serverURL := "wss://synf.in/pg"
79

810
intent, err := network.JoinOIDC(oidc.ProviderGoogle, peermapURL)
911
if err != nil {
@@ -15,19 +17,14 @@ if err != nil {
1517
panic(err)
1618
}
1719

18-
pmServer, err := peer.NewPeermapURL(peermapURL, networkSecret)
19-
if err != nil {
20-
panic(err)
21-
}
22-
2320
// peerID is a unique string (less than 256bytes)
24-
packetConn, err := p2p.ListenPacket(pmServer, p2p.ListenPeerID("uniqueString"))
21+
packetConn, err := p2p.ListenPacket(disco.NewServer(serverURL, networkSecret), p2p.ListenPeerID("uniqueString"))
2522
if err != nil {
2623
panic(err)
2724
}
2825

2926
// unreliability echo server
30-
buf := make([]byte, 1024)
27+
buf := make([]byte, 1024)
3128
for {
3229
n, peerID, err := packetConn.ReadFrom(buf)
3330
if err != nil {
@@ -41,11 +38,12 @@ for {
4138
}
4239
```
4340

44-
### Peer2
41+
### Peer2
42+
4543
```go
4644
...
4745

48-
packetConn, err := p2p.ListenPacket(pmServer)
46+
packetConn, err := p2p.ListenPacket(disco.NewServer(serverURL, networkSecret))
4947
if err != nil {
5048
panic(err)
5149
}

p2p/conn.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -388,12 +388,12 @@ func (c *PacketConn) runControlEventLoop() {
388388
}
389389

390390
// ListenPacket same as ListenPacketContext, but no context required
391-
func ListenPacket(peermap *disco.Peermap, opts ...Option) (*PacketConn, error) {
391+
func ListenPacket(peermap *disco.Server, opts ...Option) (*PacketConn, error) {
392392
return ListenPacketContext(context.Background(), peermap, opts...)
393393
}
394394

395395
// ListenPacketContext listen the p2p network for read/write packets
396-
func ListenPacketContext(ctx context.Context, peermap *disco.Peermap, opts ...Option) (*PacketConn, error) {
396+
func ListenPacketContext(ctx context.Context, peermap *disco.Server, opts ...Option) (*PacketConn, error) {
397397
id := make([]byte, 16)
398398
rand.Read(id)
399399
cfg := Config{

0 commit comments

Comments
 (0)