diff options
author | Neil Alexander <neilalexander@users.noreply.github.com> | 2021-05-06 12:00:42 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-06 12:00:42 +0100 |
commit | 1002e87b60659291af964c6d07c3a9057a3ed9b7 (patch) | |
tree | 81ca40385ac4072826e05d46c0d0a1562f13fa4e /cmd/dendrite-demo-pinecone/conn | |
parent | 464b908bd0c13854b3f6b9a17467f39e0608dc08 (diff) |
Pinecone P2P demo (#1856)
* Pinecone demo
* Enable multicast, fix HTTP routing
* Fix multicast import
* Fix build
* Update Pinecone demo
* Fix the keys
* Tweaks
* Pinecone room directory support (early)
* Fix gobind-pinecone
* Add pinecone listener
* Fix public key value
* Use AuthenticatedConnect for dial
* Fix gobind-pinecone
* Stop panics
* Give fsAPI to keyserver
* Pinecone demo fixes
* Update gobind build scripts
* Account creation
* Tweaks
* Setup tweaks
* API tweaks
* API tweaks
* API tweaks
* Port mutex
* Re-enable multicast
* Add ReadCopy
* Update quic-go, fixes
* Shutdowns fixed for iOS
* Update build script
* Add WebSocket support
* Bug fixes
* Netconn context
* Fix WebSocket connectivity
* Fixes to gobind API
* Strip frameworks
* Configurability updates
* Update go.mod
* Update go.mod/go.sum
* Update go.mod/go.sum
* Update go.mod/go.sum
* Try to stay connected tto static peer
* Update gobind-pinecone
* Update go.mod/go.sum
* Test uTP+TLS
* Use HTTP/2
* Don't use HTTP/2
* Update go.mod/go.sum
* Attempt to reconnect to the static peer if it drops
* Stay connected to static peers more stickily
* Retry room directory lookups if they fail
* NewQUIC -> NewSessions
* Storage updates
* Don't return immediately when there's nothing to sync
* Updates
* Try to reconnect to static peer more
* Update go.mod/go.sum
* Require Go 1.14
* Update go.mod/go.sum
* Update go.mod/go.sum
Diffstat (limited to 'cmd/dendrite-demo-pinecone/conn')
-rw-r--r-- | cmd/dendrite-demo-pinecone/conn/client.go | 91 | ||||
-rw-r--r-- | cmd/dendrite-demo-pinecone/conn/ws.go | 81 |
2 files changed, 172 insertions, 0 deletions
diff --git a/cmd/dendrite-demo-pinecone/conn/client.go b/cmd/dendrite-demo-pinecone/conn/client.go new file mode 100644 index 00000000..bf23085d --- /dev/null +++ b/cmd/dendrite-demo-pinecone/conn/client.go @@ -0,0 +1,91 @@ +package conn + +import ( + "fmt" + "net" + "net/http" + "strings" + + "github.com/gorilla/websocket" + "github.com/matrix-org/dendrite/setup" + "github.com/matrix-org/gomatrixserverlib" + + pineconeRouter "github.com/matrix-org/pinecone/router" + pineconeSessions "github.com/matrix-org/pinecone/sessions" +) + +func ConnectToPeer(pRouter *pineconeRouter.Router, peer string) error { + var parent net.Conn + if strings.HasPrefix(peer, "ws://") || strings.HasPrefix(peer, "wss://") { + c, _, err := websocket.DefaultDialer.Dial(peer, nil) + if err != nil { + return fmt.Errorf("websocket.DefaultDialer.Dial: %w", err) + } + parent = WrapWebSocketConn(c) + } else { + var err error + parent, err = net.Dial("tcp", peer) + if err != nil { + return fmt.Errorf("net.Dial: %w", err) + } + } + if parent == nil { + return fmt.Errorf("failed to wrap connection") + } + _, err := pRouter.AuthenticatedConnect(parent, "static", pineconeRouter.PeerTypeRemote) + return err +} + +type RoundTripper struct { + inner *http.Transport +} + +func (y *RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + req.URL.Scheme = "http" + return y.inner.RoundTrip(req) +} + +func CreateClient( + base *setup.BaseDendrite, s *pineconeSessions.Sessions, +) *gomatrixserverlib.Client { + tr := &http.Transport{} + tr.RegisterProtocol( + "matrix", &RoundTripper{ + inner: &http.Transport{ + MaxIdleConns: 100, + MaxIdleConnsPerHost: 5, + Dial: s.Dial, + DialContext: s.DialContext, + DialTLS: s.DialTLS, + DialTLSContext: s.DialTLSContext, + }, + }, + ) + return gomatrixserverlib.NewClient( + gomatrixserverlib.WithTransport(tr), + ) +} + +func CreateFederationClient( + base *setup.BaseDendrite, s *pineconeSessions.Sessions, +) *gomatrixserverlib.FederationClient { + tr := &http.Transport{} + tr.RegisterProtocol( + "matrix", &RoundTripper{ + inner: &http.Transport{ + MaxIdleConns: 100, + MaxIdleConnsPerHost: 5, + Dial: s.Dial, + DialContext: s.DialContext, + DialTLS: s.DialTLS, + DialTLSContext: s.DialTLSContext, + }, + }, + ) + return gomatrixserverlib.NewFederationClient( + base.Cfg.Global.ServerName, + base.Cfg.Global.KeyID, + base.Cfg.Global.PrivateKey, + gomatrixserverlib.WithTransport(tr), + ) +} diff --git a/cmd/dendrite-demo-pinecone/conn/ws.go b/cmd/dendrite-demo-pinecone/conn/ws.go new file mode 100644 index 00000000..ef403e29 --- /dev/null +++ b/cmd/dendrite-demo-pinecone/conn/ws.go @@ -0,0 +1,81 @@ +package conn + +import ( + "io" + "net" + "time" + + "github.com/gorilla/websocket" +) + +func WrapWebSocketConn(c *websocket.Conn) *WebSocketConn { + return &WebSocketConn{c: c} +} + +type WebSocketConn struct { + r io.Reader + c *websocket.Conn +} + +func (c *WebSocketConn) Write(p []byte) (int, error) { + err := c.c.WriteMessage(websocket.BinaryMessage, p) + if err != nil { + return 0, err + } + return len(p), nil +} + +func (c *WebSocketConn) Read(p []byte) (int, error) { + for { + if c.r == nil { + // Advance to next message. + var err error + _, c.r, err = c.c.NextReader() + if err != nil { + return 0, err + } + } + n, err := c.r.Read(p) + if err == io.EOF { + // At end of message. + c.r = nil + if n > 0 { + return n, nil + } else { + // No data read, continue to next message. + continue + } + } + return n, err + } +} + +func (c *WebSocketConn) Close() error { + return c.c.Close() +} + +func (c *WebSocketConn) LocalAddr() net.Addr { + return c.c.LocalAddr() +} + +func (c *WebSocketConn) RemoteAddr() net.Addr { + return c.c.RemoteAddr() +} + +func (c *WebSocketConn) SetDeadline(t time.Time) error { + if err := c.SetReadDeadline(t); err != nil { + return err + } + if err := c.SetWriteDeadline(t); err != nil { + return err + } + return nil +} + +func (c *WebSocketConn) SetReadDeadline(t time.Time) error { + return c.c.SetReadDeadline(t) +} + +func (c *WebSocketConn) SetWriteDeadline(t time.Time) error { + return c.c.SetWriteDeadline(t) +} |