mirror of
https://github.com/sigcn/pg.git
synced 2025-11-02 05:32:33 +08:00
2c6c056dfae0da5b47d90ca10e21a4332f29c3ba
PeerGuard
Another p2p network library in Go
Get Started
Deploy the peermap server
1. Run the pgserve daemon
$ pgserve -l 127.0.0.1:9987 --secret-key 5172554832d76672d1959a5ac63c5ab9 \
--stun stun.qq.com:3478 --stun stun.miwifi.com:3478
2. Wrap pgserve as an https server
$ caddy reverse-proxy --from https://synf.in/pg --to 127.0.0.1:9987
Follow the steps below to run VPN nodes in different physical networks
1. Generate a private network secret
$ pgcli secret --secret-key 5172554832d76672d1959a5ac63c5ab9 > ~/.peerguard_network_secret.json
2. Run a VPN daemon
# pgcli vpn -s wss://synf.in/pg --ipv4 100.64.0.1/24 --ipv6 fd00::1/64
P2P programming example
Peer1 (act as echo server)
peermap := p2p.Peermap("wss://synf.in/pg")
intent, err := network.JoinOIDC(oidc.ProviderGoogle, peermap)
if err != nil {
panic(err)
}
fmt.Println(intent.AuthURL()) // https://synf.in/oidc/google?state=5G68CtYnMRMdrtrRF
networkSecret, err := intent.Wait(context.TODO())
if err != nil {
panic(err)
}
packetConn, err := p2p.ListenPacket(
&networkSecret,
peermap,
p2p.ListenPeerID("uniqueString"), // any unique string (less than 256bytes)
)
if err != nil {
panic(err)
}
// unreliability echo server
buf := make([]byte, 1024)
for {
n, peerID, err := packetConn.ReadFrom(buf)
if err != nil {
panic(err)
}
fmt.Println("Echo packet to", peerID, string(buf[:n]))
_, err = packetConn.WriteTo(peerID, buf[:n])
if err != nil {
panic(err)
}
}
Peer2
...
packetConn, err := p2p.ListenPacket(&networkSecret, peermap)
if err != nil {
panic(err)
}
defer packetConn.Close()
// "uniqueString" is above echo server's address
_, err := packetConn.WriteTo(peer.PeerID("uniqueString"), []byte("hello"))
if err != nil {
panic(err)
}
packetConn.SetReadDeadline(time.Now().Add(time.Second))
buf := make([]byte, 1024)
n, peerID, err := packetConn.ReadFrom(buf)
if err !=nil {
panic(err)
}
fmt.Println(peerID, ":", string(buf[:n])) // uniqueString : hello
Languages
Go
93.1%
Vue
3.1%
JavaScript
1.8%
CSS
0.9%
Makefile
0.9%
Other
0.2%