matrix-capnproto-fed

What if Matrix was written using Cap'n'proto and a RPC federation API?
git clone git://archive.git.mtrnord.blog/MTRNord/matrix-capnproto-fed.git
Log | Files | Refs | README | LICENSE

main.go (3052B)


      1 package main
      2 
      3 import (
      4 	"context"
      5 	"log"
      6 	"net"
      7 	"time"
      8 
      9 	"capnproto.org/go/capnp/v3/flowcontrol"
     10 	"capnproto.org/go/capnp/v3/rpc"
     11 	"github.com/MTRNord/matrix_protobuf_fed/cmds/client/helpers"
     12 	protocol "github.com/MTRNord/matrix_protobuf_fed/proto/federation/v1"
     13 )
     14 
     15 // This implements a dummy server for testing purposes of the rough api design especially around signatures
     16 
     17 func main() {
     18 	log.Println("Connecting to server on port localhost:8449")
     19 
     20 	conn, err := net.Dial("tcp", "localhost:8449")
     21 	if err != nil {
     22 		log.Fatalln("Failed to connect to server:", err)
     23 	}
     24 	defer conn.Close()
     25 
     26 	log.Println("Connected to server on port localhost:8449")
     27 	log.Println("Creating rpc client...")
     28 
     29 	rpc_conn := rpc.NewConn(rpc.NewStreamTransport(conn), nil)
     30 	defer rpc_conn.Close()
     31 
     32 	log.Println("Created rpc connection...")
     33 
     34 	client := protocol.MatrixFederation(rpc_conn.Bootstrap(context.TODO()))
     35 	defer client.Release()
     36 
     37 	log.Println("Created client...")
     38 
     39 	timeoutCtx, cancel := context.WithTimeout(context.TODO(), time.Second*10)
     40 	defer cancel()
     41 	err = printServerVersion(timeoutCtx, client)
     42 	if err != nil {
     43 		log.Println("Failed to print server version:", err)
     44 	}
     45 
     46 	timeoutCtx, cancel = context.WithTimeout(context.TODO(), time.Second*10)
     47 	defer cancel()
     48 	err = printServerKeys(timeoutCtx, client)
     49 	if err != nil {
     50 		log.Println("Failed to print server version:", err)
     51 	}
     52 
     53 	timeoutCtx, cancel = context.WithTimeout(context.TODO(), time.Second*10)
     54 	defer cancel()
     55 	err = printServerVersion(timeoutCtx, client)
     56 	if err != nil {
     57 		log.Println("Failed to print server version:", err)
     58 	}
     59 }
     60 
     61 func printServerKeys(ctx context.Context, client protocol.MatrixFederation) error {
     62 	callback := helpers.NewKeyStreamCallback()
     63 	callback_client := protocol.StreamCallback_ServerToClient(callback)
     64 	defer callback_client.Release()
     65 	callback_client.SetFlowLimiter(flowcontrol.NewFixedLimiter(1 << 17))
     66 	keys_future, release := client.GetKeys(ctx, func(p protocol.MatrixFederation_getKeys_Params) error {
     67 		log.Println("Sending getKeys request...")
     68 
     69 		return p.SetCallback(callback_client)
     70 	})
     71 	defer release()
     72 
     73 	log.Println("Sent getKeys request...")
     74 	_, err := keys_future.Struct()
     75 	if err != nil {
     76 		log.Fatalln(err)
     77 	}
     78 
     79 	return nil
     80 }
     81 
     82 func printServerVersion(ctx context.Context, client protocol.MatrixFederation) error {
     83 	version_future, release := client.GetVersion(ctx, func(p protocol.MatrixFederation_getVersion_Params) error {
     84 		log.Println("Sending getVersion request...")
     85 		return nil
     86 	})
     87 	defer release()
     88 
     89 	log.Println("Sent getVersion request...")
     90 
     91 	version_struct, err := version_future.Struct()
     92 	if err != nil {
     93 		return err
     94 	}
     95 	if !version_struct.HasServerVersion() {
     96 		log.Fatalln("No server version")
     97 	}
     98 
     99 	server_version, err := version_struct.ServerVersion()
    100 	if err != nil {
    101 		return err
    102 	}
    103 
    104 	name, err := server_version.Name()
    105 	if err != nil {
    106 		return err
    107 	}
    108 
    109 	version, err := server_version.Version()
    110 	if err != nil {
    111 		return err
    112 	}
    113 
    114 	log.Println("Server name:", helpers.QuoteString(name), "version:", helpers.QuoteString(version))
    115 	return nil
    116 }