aboutsummaryrefslogtreecommitdiff
path: root/cmd/dendrite-demo-pinecone/conn
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2021-05-06 12:00:42 +0100
committerGitHub <noreply@github.com>2021-05-06 12:00:42 +0100
commit1002e87b60659291af964c6d07c3a9057a3ed9b7 (patch)
tree81ca40385ac4072826e05d46c0d0a1562f13fa4e /cmd/dendrite-demo-pinecone/conn
parent464b908bd0c13854b3f6b9a17467f39e0608dc08 (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.go91
-rw-r--r--cmd/dendrite-demo-pinecone/conn/ws.go81
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)
+}