From b01e7cd34edb7c682d122d0a91bf07950e208eab Mon Sep 17 00:00:00 2001 From: rkonfj Date: Mon, 25 Nov 2024 21:19:38 +0800 Subject: [PATCH] disco: Peermap to Server --- cmd/pgcli/vpn/vpn.go | 6 +----- disco/{peermap.go => server.go} | 38 +++++++++++---------------------- disco/ws/ws.go | 11 +++++----- fileshare/common.go | 7 +----- p2p/README.md | 18 +++++++--------- p2p/conn.go | 4 ++-- 6 files changed, 30 insertions(+), 54 deletions(-) rename disco/{peermap.go => server.go} (71%) diff --git a/cmd/pgcli/vpn/vpn.go b/cmd/pgcli/vpn/vpn.go index 7d5983f..1502182 100644 --- a/cmd/pgcli/vpn/vpn.go +++ b/cmd/pgcli/vpn/vpn.go @@ -278,11 +278,7 @@ func (v *P2PVPN) listenPacketConn(ctx context.Context) (c *p2p.PacketConn, err e if err != nil { return } - peermapURL, err := url.Parse(v.Config.Server) - if err != nil { - return - } - peermap, err := disco.NewPeermap(peermapURL, secretStore) + peermap, err := disco.NewServer(v.Config.Server, secretStore) if err != nil { return } diff --git a/disco/peermap.go b/disco/server.go similarity index 71% rename from disco/peermap.go rename to disco/server.go index 28a4992..ca0f021 100644 --- a/disco/peermap.go +++ b/disco/server.go @@ -10,43 +10,29 @@ import ( "time" ) -type Peermap struct { - store SecretStore - server *url.URL +type Server struct { + Secret SecretStore + URL string } -func NewPeermap(server *url.URL, store SecretStore) (*Peermap, error) { +func NewServer(serverURL string, store SecretStore) (*Server, error) { if store == nil { return nil, errors.New("secret store is required") } - if server == nil { - return nil, errors.New("peermap server is required") + + server, err := url.Parse(serverURL) + if err != nil { + return nil, err } if !slices.Contains([]string{"https", "wss", "http", "ws"}, server.Scheme) { - return nil, fmt.Errorf("invalid peermap server %s", server.String()) + return nil, fmt.Errorf("unsupport server protocol: %s", server.String()) } - return &Peermap{ - store: store, - server: server, + return &Server{ + Secret: store, + URL: serverURL, }, nil } -func NewPeermapURL(serverURL string, store SecretStore) (*Peermap, error) { - sURL, err := url.Parse(serverURL) - if err != nil { - return nil, fmt.Errorf("invalid peermap url: %w", err) - } - return NewPeermap(sURL, store) -} - -func (s *Peermap) SecretStore() SecretStore { - return s.store -} - -func (s *Peermap) String() string { - return s.server.String() -} - type SecretStore interface { NetworkSecret() (NetworkSecret, error) UpdateNetworkSecret(NetworkSecret) error diff --git a/disco/ws/ws.go b/disco/ws/ws.go index 89fa48b..8b57f84 100644 --- a/disco/ws/ws.go +++ b/disco/ws/ws.go @@ -1,6 +1,7 @@ package ws import ( + "cmp" "context" "encoding/base64" "encoding/json" @@ -29,7 +30,7 @@ var ( type WSConn struct { rawConn atomic.Pointer[websocket.Conn] - server *disco.Peermap + server *disco.Server connectedServer string peerID disco.PeerID metadata url.Values @@ -197,7 +198,7 @@ func (c *WSConn) Unregister(ctr disco.Controller) { } func (c *WSConn) dial(ctx context.Context, server string) error { - networkSecret, err := c.server.SecretStore().NetworkSecret() + networkSecret, err := cmp.Or[disco.SecretStore](c.server.Secret, &disco.NetworkSecret{}).NetworkSecret() if err != nil { return fmt.Errorf("get network secret failed: %w", err) } @@ -207,7 +208,7 @@ func (c *WSConn) dial(ctx context.Context, server string) error { handshake.Set("X-Nonce", disco.NewNonce()) handshake.Set("X-Metadata", c.metadata.Encode()) if server == "" { - server = c.server.String() + server = c.server.URL } peermap, err := url.Parse(server) if err != nil { @@ -474,7 +475,7 @@ func (c *WSConn) writeWS(messageType int, data []byte) error { func (c *WSConn) updateNetworkSecret(secret disco.NetworkSecret) { for i := 0; i < 5; i++ { - if err := c.server.SecretStore().UpdateNetworkSecret(secret); err != nil { + if err := c.server.Secret.UpdateNetworkSecret(secret); err != nil { slog.Error("[WS] NetworkSecretUpdate", "err", err) time.Sleep(time.Second) continue @@ -484,7 +485,7 @@ func (c *WSConn) updateNetworkSecret(secret disco.NetworkSecret) { slog.Error("[WS] NetworkSecretUpdate give up", "secret", secret) } -func DialPeermap(ctx context.Context, server *disco.Peermap, peerID disco.PeerID, metadata url.Values) (*WSConn, error) { +func DialPeermap(ctx context.Context, server *disco.Server, peerID disco.PeerID, metadata url.Values) (*WSConn, error) { wsConn := &WSConn{ server: server, peerID: peerID, diff --git a/fileshare/common.go b/fileshare/common.go index ebc4a1b..91ec780 100644 --- a/fileshare/common.go +++ b/fileshare/common.go @@ -5,7 +5,6 @@ import ( "fmt" "io" "net" - "net/url" "github.com/sigcn/pg/disco" "github.com/sigcn/pg/p2p" @@ -18,12 +17,8 @@ type PublicNetwork struct { } func (pn *PublicNetwork) ListenPacket(udpPort int) (net.PacketConn, error) { - pmapURL, err := url.Parse(pn.Server) - if err != nil { - return nil, fmt.Errorf("invalid peermap URL: %w", err) - } network := cmp.Or(pn.Name, "pubnet") - pmap, err := disco.NewPeermap(pmapURL, &disco.NetworkSecret{Network: network, Secret: network}) + pmap, err := disco.NewServer(pn.Server, &disco.NetworkSecret{Network: network, Secret: network}) if err != nil { return nil, fmt.Errorf("create peermap failed: %w", err) } diff --git a/p2p/README.md b/p2p/README.md index ff9ce9b..0667c15 100644 --- a/p2p/README.md +++ b/p2p/README.md @@ -1,9 +1,11 @@ # p2p library ### Example + ### Peer1 (act as echo server) + ```go -peermapURL := "wss://synf.in/pg" +serverURL := "wss://synf.in/pg" intent, err := network.JoinOIDC(oidc.ProviderGoogle, peermapURL) if err != nil { @@ -15,19 +17,14 @@ if err != nil { panic(err) } -pmServer, err := peer.NewPeermapURL(peermapURL, networkSecret) -if err != nil { - panic(err) -} - // peerID is a unique string (less than 256bytes) -packetConn, err := p2p.ListenPacket(pmServer, p2p.ListenPeerID("uniqueString")) +packetConn, err := p2p.ListenPacket(disco.NewServer(serverURL, networkSecret), p2p.ListenPeerID("uniqueString")) if err != nil { panic(err) } // unreliability echo server -buf := make([]byte, 1024) +buf := make([]byte, 1024) for { n, peerID, err := packetConn.ReadFrom(buf) if err != nil { @@ -41,11 +38,12 @@ for { } ``` -### Peer2 +### Peer2 + ```go ... -packetConn, err := p2p.ListenPacket(pmServer) +packetConn, err := p2p.ListenPacket(disco.NewServer(serverURL, networkSecret)) if err != nil { panic(err) } diff --git a/p2p/conn.go b/p2p/conn.go index 28b3680..0fb7c7d 100644 --- a/p2p/conn.go +++ b/p2p/conn.go @@ -388,12 +388,12 @@ func (c *PacketConn) runControlEventLoop() { } // ListenPacket same as ListenPacketContext, but no context required -func ListenPacket(peermap *disco.Peermap, opts ...Option) (*PacketConn, error) { +func ListenPacket(peermap *disco.Server, opts ...Option) (*PacketConn, error) { return ListenPacketContext(context.Background(), peermap, opts...) } // ListenPacketContext listen the p2p network for read/write packets -func ListenPacketContext(ctx context.Context, peermap *disco.Peermap, opts ...Option) (*PacketConn, error) { +func ListenPacketContext(ctx context.Context, peermap *disco.Server, opts ...Option) (*PacketConn, error) { id := make([]byte, 16) rand.Read(id) cfg := Config{