From 8552b676cb0292cf2f57483205360d0dcc54b404 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 14 Jul 2022 00:22:28 +0300 Subject: [PATCH 01/40] grpc server and test client implementation --- Makefile | 4 + cmd/client/client.go | 62 ++++ cmd/node/node.go | 13 +- config/grpc.go | 3 + etc/config.yml | 5 +- etc/x509/cert.pem | 30 ++ etc/x509/key.pem | 52 +++ go.mod | 8 +- go.sum | 30 ++ service/server/server.go | 90 +++++ syncproto/commands.pb.go | 607 +++++++++++++++++++++++++++++++++ syncproto/proto/commands.proto | 14 + syncproto/proto/service.proto | 9 + syncproto/service.pb.go | 153 +++++++++ 14 files changed, 1074 insertions(+), 6 deletions(-) create mode 100644 cmd/client/client.go create mode 100644 etc/x509/cert.pem create mode 100644 etc/x509/key.pem create mode 100644 service/server/server.go create mode 100644 syncproto/commands.pb.go create mode 100644 syncproto/proto/commands.proto create mode 100644 syncproto/proto/service.proto create mode 100644 syncproto/service.pb.go diff --git a/Makefile b/Makefile index f5234926..7fc14153 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,10 @@ protos-go: $(eval PKGMAP := $$(P_TIMESTAMP),$$(P_STRUCT),$$(P_THREAD)) GOGO_NO_UNDERSCORE=1 GOGO_EXPORT_ONEOF_INTERFACE=1 protoc --gogofaster_out=$(PKGMAP):./thread/pb thread/pb/protos/*.*; mv thread/pb/thread/pb/protos/*.go thread/pb; rm -rf thread/pb/thread +protos: + GOGO_NO_UNDERSCORE=1 GOGO_EXPORT_ONEOF_INTERFACE=1 protoc --gogofaster_out=plugins=grpc:. syncproto/proto/*.proto; mv syncproto/proto/*.go syncproto + + build: @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) go build -o bin/anytype-node -ldflags "$(FLAGS)" cmd/node/node.go \ No newline at end of file diff --git a/cmd/client/client.go b/cmd/client/client.go new file mode 100644 index 00000000..71b0d4d2 --- /dev/null +++ b/cmd/client/client.go @@ -0,0 +1,62 @@ +package main + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" + "log" + "time" +) + +// req/rep 1000000 req for 1m56.663998462s (8571 per sec) +// stream 1000000 req for 1m25.54958362s (11689 per sec) + +func main() { + + conf, err := config.NewFromFile("etc/config.yml") + if err != nil { + panic(err) + } + + var opts []grpc.DialOption + if conf.GrpcServer.TLS { + creds, err := credentials.NewClientTLSFromFile(conf.GrpcServer.TLSCertFile, "127.0.0.1") + if err != nil { + log.Fatalf("Failed to create TLS credentials %v", err) + } + opts = append(opts, grpc.WithTransportCredentials(creds)) + } else { + opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) + } + + conn, err := grpc.Dial(conf.GrpcServer.ListenAddrs[0], opts...) + if err != nil { + log.Fatalf("fail to dial: %v", err) + } + defer conn.Close() + client := syncproto.NewAnytypeSyncClient(conn) + stream, err := client.Ping(context.TODO()) + if err != nil { + panic(err) + } + st := time.Now() + n := 1000000 + for i := 0; i < n; i++ { + if err = stream.Send(&syncproto.PingRequest{ + Seq: int64(i), + }); err != nil { + panic(err) + } + _, err := stream.Recv() + if err != nil { + panic(err) + } + } + dur := time.Since(st) + fmt.Printf("%d req for %v (%d per sec)\n", n, dur, int(float64(n)/dur.Seconds())) + +} diff --git a/cmd/node/node.go b/cmd/node/node.go index 089f20a9..161daa88 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -7,7 +7,10 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/server" "go.uber.org/zap" + "net/http" + _ "net/http/pprof" "os" "os/signal" "syscall" @@ -34,6 +37,12 @@ func main() { return } + if debug, ok := os.LookupEnv("ANYPROF"); ok && debug != "" { + go func() { + http.ListenAndServe(debug, nil) + }() + } + // create app ctx := context.Background() a := new(app.App) @@ -50,7 +59,7 @@ func main() { // start app if err := a.Start(ctx); err != nil { - log.Error("can't start app", zap.Error(err)) + log.Fatal("can't start app", zap.Error(err)) } log.Info("app started", zap.String("version", a.Version())) @@ -71,5 +80,5 @@ func main() { } func Bootstrap(a *app.App) { - //a.Register(mycomponent.New()) + a.Register(server.New()) } diff --git a/config/grpc.go b/config/grpc.go index 01b797fa..6a4fc426 100644 --- a/config/grpc.go +++ b/config/grpc.go @@ -2,4 +2,7 @@ package config type GrpcServer struct { ListenAddrs []string `yaml:"listenAddrs"` + TLS bool `yaml:"tls"` + TLSCertFile string `yaml:"tlsCertFile"` + TLSKeyFile string `yaml:"tlsKeyFile"` } diff --git a/etc/config.yml b/etc/config.yml index 8c2938fb..281c7d71 100644 --- a/etc/config.yml +++ b/etc/config.yml @@ -3,4 +3,7 @@ anytype: grpcServer: listenAddrs: - - ":443" \ No newline at end of file + - "127.0.0.1:4430" + tls: false + tlsKeyFile: "etc/x509/key.pem" + tlsCertFile: "etc/x509/cert.pem" diff --git a/etc/x509/cert.pem b/etc/x509/cert.pem new file mode 100644 index 00000000..0ddaa01e --- /dev/null +++ b/etc/x509/cert.pem @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFJTCCAw2gAwIBAgIUNiBcO8wV6YezcDQ+cLpZe/iXbGYwDQYJKoZIhvcNAQEL +BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMDcxMzE5NDgwNFoXDTMyMDcx +MDE5NDgwNFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEAt+6cVBVkEe9I3CRmPuAqZGnLq48DTXaRH7xz6u4ld7tU +cpDaXw+aURRYKGfYIvcfQav/i+mYUxTQDFbfN8SULis/DckTqeBEaGgUbJJZ6w73 +kkB8BuCiIjh3W9hyUHr+WbdF9wU8K1G6GmjimBJ+qlBBewQm0kzqosVwjQVWarN4 +aEhgiyjnLF9XVYQZRVqGxKzP/MssEU7YjSPPfBEsmi6pAqiDYuZ3+sVlKuDrki0d +r1XOcV/dcSJa4NRazxiWME+GJQ/x7gA2GlC5FbQyhrOs1sNWaBsaWQGl4oHB90T7 +b0GxKOTqI7oCMho+Ajt7eB4zN0fqeCw0nwFyzok3f/GKFk0vLnecFt+gCLyMyS6X +Dqf/DAlvoP41UeFI/rheOwc0UcZbU0HZ2zYrzOYR4eHMHSYKma2DHvIyOYZIV0Uw +tkyOFnoEQGSXK3TMOb7oWyrs4gl+5euPEDKqDuP28xBr4GsFbNq7/7Kd9rKwXb3L +iyy3kot2Vf5QqDFGdyOLDFFKF7MgMrUiEX8onW+fSmjooqUq7ZyLAs8W0uim4moQ +52t7CGUuglaTHYMi2rfoAS5qPXT76jiwu7H351Psca6EIY4V+dIiElvbYryhTNsV +4eDdWGJoZUyGACUhPdfO9l7Wp2+Yy/HGfPWm6mKX8VPHO4llYvwgGzm6Is/pFmUC +AwEAAaNvMG0wHQYDVR0OBBYEFKl07s6kNnGmJN/ASYQTml5UkK0AMB8GA1UdIwQY +MBaAFKl07s6kNnGmJN/ASYQTml5UkK0AMA8GA1UdEwEB/wQFMAMBAf8wGgYDVR0R +BBMwEYIJbG9jYWxob3N0hwR/AAABMA0GCSqGSIb3DQEBCwUAA4ICAQBs5JmRhddd +KuyhkSWd6T/HqAQISgP72ZUAr3gt2j34GLrhDYcvKFZwcoJFCFjG3pVmvJCORVGO +x2TYt2ntsmIyFCZlGE/TpLxbSgsykoUVBnc8ySDnTQTDJr6S7AyWQsznSD6j1/FA +a9E8ZrsyopqIn2eZy9/Asgy1qeJVO4F1kIq+19HUDR2z1rXqVSycOQEJkF84Kgvd ++nDJQ5W3EdamYuDQOhTOeEFfZy1HyM3APhR9JyFHHnZ2D3vsoys/LIWolBJPOq6B +o5JjXgLrA1e12TVXlnTqZ3986vGOyjfut7o2NPO1Se5OeGr6XFwO1nhIJ4gj8OTv +2XuBcslLXI5+6UIsXtFHXAfH7eYErkBCQGiwjYj0V8Kb4M7UZ0seqjK+gMKfvM4Z +hAPlKP2AUNYS7TNyqW3t8SA0c52ASdAezzh/OklCO5vyzxQT4wXTQt5Bub83m9uY +Jnrv6Kg5UPQMrTpo9usJ2zAyj+qkk8KubKOA7grtblmCTvyJFDwyiWZkr0nuvNTV +BsKis/DbJ2hneF+2D/B2pGKxyEP1LCIV/JDTUGX3F8ljTgSihZay/ZZnPUZpbCa0 +czodlAQk4wkGxJWSH6SSkq4dD+JnBQpufBMLa1qShfUn+N1N02yiDPq9XxJytoOR ++vHqqrPS0PcTk1x2Og0xLn6kN+MH0+jRNQ== +-----END CERTIFICATE----- diff --git a/etc/x509/key.pem b/etc/x509/key.pem new file mode 100644 index 00000000..84d64a5e --- /dev/null +++ b/etc/x509/key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC37pxUFWQR70jc +JGY+4CpkacurjwNNdpEfvHPq7iV3u1RykNpfD5pRFFgoZ9gi9x9Bq/+L6ZhTFNAM +Vt83xJQuKz8NyROp4ERoaBRsklnrDveSQHwG4KIiOHdb2HJQev5Zt0X3BTwrUboa +aOKYEn6qUEF7BCbSTOqixXCNBVZqs3hoSGCLKOcsX1dVhBlFWobErM/8yywRTtiN +I898ESyaLqkCqINi5nf6xWUq4OuSLR2vVc5xX91xIlrg1FrPGJYwT4YlD/HuADYa +ULkVtDKGs6zWw1ZoGxpZAaXigcH3RPtvQbEo5OojugIyGj4CO3t4HjM3R+p4LDSf +AXLOiTd/8YoWTS8ud5wW36AIvIzJLpcOp/8MCW+g/jVR4Uj+uF47BzRRxltTQdnb +NivM5hHh4cwdJgqZrYMe8jI5hkhXRTC2TI4WegRAZJcrdMw5vuhbKuziCX7l648Q +MqoO4/bzEGvgawVs2rv/sp32srBdvcuLLLeSi3ZV/lCoMUZ3I4sMUUoXsyAytSIR +fyidb59KaOiipSrtnIsCzxbS6KbiahDna3sIZS6CVpMdgyLat+gBLmo9dPvqOLC7 +sffnU+xxroQhjhX50iISW9tivKFM2xXh4N1YYmhlTIYAJSE91872Xtanb5jL8cZ8 +9abqYpfxU8c7iWVi/CAbOboiz+kWZQIDAQABAoICAAcytJX6z1N/WonY99Jime4b +kM+qNV4g8317NcseHkPBBkVEg3NAbFDbe7a7F6OIqcW7ajEKx34K3Lh65tnrHMRw +x1MuCRG3F95BInl8Qb4X9BraYLAxNs8hiBRFVHXvVkhjCn8oCoqEdITHkYSThrb6 +FJHwn+dPgMg1c1nleVQMKXxlRrfzdhaPtZ6AYK/M4uTMAYi6V8Nmo0VkvyAzGNyA +0nbq6tdiPxRGiNbEfhuWneiIcl+P+Z3NkyJk1RfxNaF230BQjy55/iQKADBIAMky +O2OdOeKxmtacYKZMXy+i2LcqKjl4OeyDgUX+LmqOct7IycbSTuv8iOOnHhvUlWIg +nFYHx2i/t5mHp0kPjHUzqu40HaRKPpGxAzzSL/W2WNuSFzbZB6SMTGIxG77hGkUh +saoOSLRDL7DhEvvZ5cvhVM0l2mrufak0sUR7K/TooheQ+0A6bU+pZW1kzfwt4ICI +BlGZt6rw7dSEDMButhfMkWPCIowULrtevB9pOULfvwGcpslMNN6KiAl8mjR6OwJB +7AdWCCCC52p240OKe8N4eBoPr6T44LoBsKFpCI2Ztd8IG3LP6AGJueWFLrmPj1J+ +WePs5WX5IGfHSHJondm1BWS1nwkdSZQUaeL/POi0YbaAlgndpZAbpkfxjcLuB7Wd +5iOqiIkrGCjVyFTXBipxAoIBAQDE0amd/TrSPwcdLLkhGZswSgGatlenqw/DLswy +30Vu6NzZ2dRHKk1eX3GApgBtYmkP4n3Jadaxl8OXGCw+mPv9fBHgVrmcwt9CCTNL +uwKvGtEpvXH2LgcmFTEL8CnKoM7ZlXDAlGSPf46pOU8HG8nOqOywkIaoiiLAPZHZ +Y3FMLs7s0UEDYSM0EWHr6/po8VQLSnyN5NDcUhn6dsNgjS4p9W90lHHK24J7dqGh +ye4vWslzB5K47JitYKzpo3+dOUpu1/jo9uwzDsUw7SON7CKtKgldwrzvZGiRBhVW +j+cLHdRdCNz2gF/aI2JwgkW1HC+0X3RQs+H99g+yWNDYbyGVAoIBAQDvPPbql0kz +FzdpInbtBY7Z4V0ZRveeWDMln04qtEuifHzme0K03itACcxAhWAwAV8fCjZJdmkc +nQVJ/0i05IFSXiFAKpuhyA9TkPiwxYwlFpvKDk2lhAQ0yR7ig8wCYs1ZA6PKWwHl +Zd7FJKAjTkHey/KAagA1ya8XTBeIDiIQKriMVU9DdJ+4tEFqZLq9EUd/QHJkrxaV +jwmwcc26oE8XAFdFdZtqqvKjhpO4OjFN8C9TIX70krrzTSN2FTK1Y5IVSanzkYEB +Ovy/gedWzq9evuGRoKKNxYqYUXy/p6DiD36OMHZveGssPCkI4NIdPLVo1L6YXuMS +pLl2PswHmI2RAoIBAAiMCk+gFZPXxNlRfeCgGgsoy5UKYhgX56FUQO3coElGt4CG +Yx+MCLwWbPlnPBGD+ogED+5VOEuSCZ5gIFu/jQHfB2+0lG7oT4WwnJenUWCFS5wC +bBaCvTC8LtsT3Ny9yv3L7Y+PYiaRJYLXyETIwiTFVTH9tLtQ9F1gzxqfpOXoCnhi +Re59o2e5cYUrRD6WbE3pOCt5SlCnCBXGXoms19penC5129MxYSM3baF3AW7xBFqI +c6iwLZkp35htzzbmrALQQjDruCondAzB349kN8VJVArMUCQdOiVCHF8b9K6Y5wX7 +Qo052e/BJZ85KQnKZY/xrT1r8l5y9w+Jp9geS1kCggEBAJxp34XBI7qjkzbJsbeF +yr/o+FVucLa2M7qFTTXeaxTxDzghnptiJiTYQxJsIVdBjk9c/eFJ6a8reinHHmIm +g+a2ZEbvlJFRm7OnNPFeNyKIhZK1h06P4bAhTnAKe3eT4W4xUwUaO0MgN2XtbEWp +BKgF76bFpx2Dn1Y8CaaKlvq6863MmOYhecvpDlvhP7YddgFcwW3Si5F803jo7vj1 +lsATGPvwyIwU+E6xziLE6TdrsYVIgRimVlR8OpMZiO3PC9OfNd5pY07KojUTWY0H +1OC9K/1qaN0IKnUr0cP8dNNYDgYo6UY4FNn2+10yoC09Y94GOhak8xFdYWRN6leN +BgECggEAbS7bbv1gIB8toaAWBXxEnLtAU0Ob8e7uD2JYKZqe6NaC+ZX5NTLn+QSG +Y4SkBORGw+v1BIw7Rdk6jlEPpYWncQigQ6YbhqerL39+lmatXoSbQBcMRsjPP0gF +yuOb48ff/uXJhlnbVBJHXMfOW8LDFXL3bgMS2HpWnr5Buu7zGB4ERHg91+tuczNL +qEa85pyvY974arF/53T7Kmzdd/fx7I6RZeZpBGWKqwuZSJTMYL7V/LyKyfU8CTP1 +nz86BQIF1Cr8UXyOUI33UZMFwIXb62HRDXAfij7Ew33rj803l4cedNluXHSx/kNH +3XcrP5qofkzfgz1calZv6phIGJdHLQ== +-----END PRIVATE KEY----- diff --git a/go.mod b/go.mod index ff3c2334..c0d0602f 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/gogo/googleapis v1.3.1 // indirect github.com/gogo/status v1.1.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/golang/protobuf v1.4.3 // indirect + github.com/golang/protobuf v1.5.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.2.1 // indirect github.com/ipfs/go-cid v0.0.7 // indirect github.com/klauspost/cpuid/v2 v2.0.4 // indirect @@ -49,10 +49,12 @@ require ( go.uber.org/zap v1.21.0 // indirect golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect + golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6 // indirect golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect + golang.org/x/text v0.3.6 // indirect google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect - google.golang.org/grpc v1.33.2 // indirect - google.golang.org/protobuf v1.25.0 // indirect + google.golang.org/grpc v1.48.0 // indirect + google.golang.org/protobuf v1.27.1 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect ) diff --git a/go.sum b/go.sum index c650950f..01e832d4 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,7 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/anytypeio/go-threads v1.1.0-rc1.0.20220223104843-a67245cee80e h1:u6UT0oqGybURAWvKw0p7BPnqoVqC+wEvOOz5K+ESBZE= github.com/anytypeio/go-threads v1.1.0-rc1.0.20220223104843-a67245cee80e/go.mod h1:O7G/oTjIZfQmB6ZoeU42IdRxWEY9D+HZuLzF6wMk4jI= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -83,6 +84,11 @@ github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wX github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -131,6 +137,8 @@ github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4s github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg= @@ -225,6 +233,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -237,6 +248,9 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -267,6 +281,7 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.2.1/go.mod h1:EaizFBKfUKtMIF5iaD github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= @@ -910,6 +925,7 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -1040,6 +1056,7 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1147,6 +1164,7 @@ golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -1159,6 +1177,7 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1220,6 +1239,7 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1296,6 +1316,7 @@ google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -1315,8 +1336,12 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1327,6 +1352,10 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1347,6 +1376,7 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/service/server/server.go b/service/server/server.go new file mode 100644 index 00000000..4c10bee2 --- /dev/null +++ b/service/server/server.go @@ -0,0 +1,90 @@ +package server + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + "io" + "net" + "time" +) + +var log = logger.NewNamed("server") + +const CName = "server" + +func New() *Server { + return &Server{} +} + +type Server struct { + config config.GrpcServer + grpcServer *grpc.Server +} + +func (s *Server) Init(ctx context.Context, a *app.App) (err error) { + s.config = a.MustComponent(config.CName).(*config.Config).GrpcServer + return nil +} + +func (s *Server) Name() (name string) { + return CName +} + +func (s *Server) Run(ctx context.Context) (err error) { + lis, err := net.Listen("tcp", s.config.ListenAddrs[0]) + if err != nil { + return err + } + var opts []grpc.ServerOption + if s.config.TLS { + creds, err := credentials.NewServerTLSFromFile(s.config.TLSCertFile, s.config.TLSKeyFile) + if err != nil { + return err + } + opts = []grpc.ServerOption{grpc.Creds(creds)} + } + s.grpcServer = grpc.NewServer(opts...) + + syncproto.RegisterAnytypeSyncServer(s.grpcServer, s) + + var errCh = make(chan error) + go func() { + errCh <- s.grpcServer.Serve(lis) + }() + select { + case <-time.After(time.Second / 4): + case err = <-errCh: + } + + log.Sugar().Infof("server started at: %v", s.config.ListenAddrs[0]) + return +} + +func (s *Server) Ping(stream syncproto.AnytypeSync_PingServer) error { + for { + in, err := stream.Recv() + if err == io.EOF { + return nil + } + if err != nil { + return err + } + if err := stream.Send(&syncproto.PingResponse{ + Seq: in.Seq, + }); err != nil { + return err + } + } +} + +func (s *Server) Close(ctx context.Context) (err error) { + if s.grpcServer != nil { + s.grpcServer.GracefulStop() + } + return +} diff --git a/syncproto/commands.pb.go b/syncproto/commands.pb.go new file mode 100644 index 00000000..8f97a2db --- /dev/null +++ b/syncproto/commands.pb.go @@ -0,0 +1,607 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: syncproto/proto/commands.proto + +package syncproto + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type Ping struct { +} + +func (m *Ping) Reset() { *m = Ping{} } +func (m *Ping) String() string { return proto.CompactTextString(m) } +func (*Ping) ProtoMessage() {} +func (*Ping) Descriptor() ([]byte, []int) { + return fileDescriptor_51e5c75c191fcbfb, []int{0} +} +func (m *Ping) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Ping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Ping.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Ping) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ping.Merge(m, src) +} +func (m *Ping) XXX_Size() int { + return m.Size() +} +func (m *Ping) XXX_DiscardUnknown() { + xxx_messageInfo_Ping.DiscardUnknown(m) +} + +var xxx_messageInfo_Ping proto.InternalMessageInfo + +type PingRequest struct { + Seq int64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"` +} + +func (m *PingRequest) Reset() { *m = PingRequest{} } +func (m *PingRequest) String() string { return proto.CompactTextString(m) } +func (*PingRequest) ProtoMessage() {} +func (*PingRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_51e5c75c191fcbfb, []int{0, 0} +} +func (m *PingRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PingRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PingRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PingRequest.Merge(m, src) +} +func (m *PingRequest) XXX_Size() int { + return m.Size() +} +func (m *PingRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PingRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PingRequest proto.InternalMessageInfo + +func (m *PingRequest) GetSeq() int64 { + if m != nil { + return m.Seq + } + return 0 +} + +type PingResponse struct { + Seq int64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +} + +func (m *PingResponse) Reset() { *m = PingResponse{} } +func (m *PingResponse) String() string { return proto.CompactTextString(m) } +func (*PingResponse) ProtoMessage() {} +func (*PingResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_51e5c75c191fcbfb, []int{0, 1} +} +func (m *PingResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PingResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PingResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_PingResponse.Merge(m, src) +} +func (m *PingResponse) XXX_Size() int { + return m.Size() +} +func (m *PingResponse) XXX_DiscardUnknown() { + xxx_messageInfo_PingResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_PingResponse proto.InternalMessageInfo + +func (m *PingResponse) GetSeq() int64 { + if m != nil { + return m.Seq + } + return 0 +} + +func (m *PingResponse) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func init() { + proto.RegisterType((*Ping)(nil), "anytype.Ping") + proto.RegisterType((*PingRequest)(nil), "anytype.Ping.Request") + proto.RegisterType((*PingResponse)(nil), "anytype.Ping.Response") +} + +func init() { proto.RegisterFile("syncproto/proto/commands.proto", fileDescriptor_51e5c75c191fcbfb) } + +var fileDescriptor_51e5c75c191fcbfb = []byte{ + // 161 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2b, 0xae, 0xcc, 0x4b, + 0x2e, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x87, 0x90, 0xc9, 0xf9, 0xb9, 0xb9, 0x89, 0x79, 0x29, 0xc5, + 0x7a, 0x60, 0xae, 0x10, 0x7b, 0x62, 0x5e, 0x65, 0x49, 0x65, 0x41, 0xaa, 0x52, 0x3c, 0x17, 0x4b, + 0x40, 0x66, 0x5e, 0xba, 0x94, 0x34, 0x17, 0x7b, 0x50, 0x6a, 0x61, 0x69, 0x6a, 0x71, 0x89, 0x90, + 0x00, 0x17, 0x73, 0x71, 0x6a, 0xa1, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x73, 0x10, 0x88, 0x29, 0x65, + 0xc5, 0xc5, 0x11, 0x94, 0x5a, 0x5c, 0x90, 0x9f, 0x57, 0x9c, 0x8a, 0x29, 0x2b, 0x24, 0xc3, 0xc5, + 0x59, 0x92, 0x99, 0x9b, 0x5a, 0x5c, 0x92, 0x98, 0x5b, 0x20, 0xc1, 0x04, 0x16, 0x47, 0x08, 0x38, + 0x29, 0x9f, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, + 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x14, 0x27, 0xdc, 0x8d, 0x49, + 0x6c, 0x60, 0xca, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0xd5, 0x15, 0xa0, 0x65, 0xb7, 0x00, 0x00, + 0x00, +} + +func (m *Ping) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Ping) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Ping) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *PingRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PingRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PingRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Seq != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Seq)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *PingResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PingResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PingResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Timestamp != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x10 + } + if m.Seq != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Seq)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintCommands(dAtA []byte, offset int, v uint64) int { + offset -= sovCommands(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Ping) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *PingRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Seq != 0 { + n += 1 + sovCommands(uint64(m.Seq)) + } + return n +} + +func (m *PingResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Seq != 0 { + n += 1 + sovCommands(uint64(m.Seq)) + } + if m.Timestamp != 0 { + n += 1 + sovCommands(uint64(m.Timestamp)) + } + return n +} + +func sovCommands(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozCommands(x uint64) (n int) { + return sovCommands(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Ping) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Ping: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ping: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PingRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Seq", wireType) + } + m.Seq = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Seq |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PingResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Seq", wireType) + } + m.Seq = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Seq |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipCommands(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowCommands + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowCommands + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowCommands + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthCommands + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupCommands + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthCommands + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthCommands = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowCommands = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupCommands = fmt.Errorf("proto: unexpected end of group") +) diff --git a/syncproto/proto/commands.proto b/syncproto/proto/commands.proto new file mode 100644 index 00000000..2eb5bf86 --- /dev/null +++ b/syncproto/proto/commands.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; +package anytype; +option go_package = "syncproto"; + + +message Ping { + message Request { + int64 seq = 1; + } + message Response { + int64 seq = 1; + int64 timestamp = 2; + } +} \ No newline at end of file diff --git a/syncproto/proto/service.proto b/syncproto/proto/service.proto new file mode 100644 index 00000000..5e261219 --- /dev/null +++ b/syncproto/proto/service.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; +package anytype; +option go_package = "syncproto"; + +import "syncproto/proto/commands.proto"; + +service AnytypeSync { + rpc Ping(stream anytype.Ping.Request) returns (stream anytype.Ping.Response); +} \ No newline at end of file diff --git a/syncproto/service.pb.go b/syncproto/service.pb.go new file mode 100644 index 00000000..40de73a9 --- /dev/null +++ b/syncproto/service.pb.go @@ -0,0 +1,153 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: syncproto/proto/service.proto + +package syncproto + +import ( + context "context" + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +func init() { proto.RegisterFile("syncproto/proto/service.proto", fileDescriptor_bc194c2299f43729) } + +var fileDescriptor_bc194c2299f43729 = []byte{ + // 156 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2d, 0xae, 0xcc, 0x4b, + 0x2e, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x87, 0x90, 0xc5, 0xa9, 0x45, 0x65, 0x99, 0xc9, 0xa9, 0x7a, + 0x60, 0x9e, 0x10, 0x7b, 0x62, 0x5e, 0x65, 0x49, 0x65, 0x41, 0xaa, 0x94, 0x1c, 0xba, 0xba, 0xe4, + 0xfc, 0xdc, 0xdc, 0xc4, 0xbc, 0x94, 0x62, 0x88, 0x42, 0x23, 0x0f, 0x2e, 0x6e, 0x47, 0x88, 0xd2, + 0xe0, 0xca, 0xbc, 0x64, 0x21, 0x4b, 0x2e, 0x96, 0x80, 0xcc, 0xbc, 0x74, 0x21, 0x51, 0x3d, 0xa8, + 0x01, 0x7a, 0x20, 0xae, 0x5e, 0x50, 0x6a, 0x61, 0x69, 0x6a, 0x71, 0x89, 0x94, 0x18, 0xba, 0x70, + 0x71, 0x41, 0x7e, 0x5e, 0x71, 0xaa, 0x06, 0xa3, 0x01, 0xa3, 0x93, 0xf2, 0x89, 0x47, 0x72, 0x8c, + 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, + 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0x71, 0xc2, 0xdd, 0x90, 0xc4, 0x06, 0xa6, 0x8c, 0x01, 0x01, + 0x00, 0x00, 0xff, 0xff, 0x4d, 0x33, 0xde, 0xf8, 0xbf, 0x00, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// AnytypeSyncClient is the client API for AnytypeSync service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type AnytypeSyncClient interface { + Ping(ctx context.Context, opts ...grpc.CallOption) (AnytypeSync_PingClient, error) +} + +type anytypeSyncClient struct { + cc *grpc.ClientConn +} + +func NewAnytypeSyncClient(cc *grpc.ClientConn) AnytypeSyncClient { + return &anytypeSyncClient{cc} +} + +func (c *anytypeSyncClient) Ping(ctx context.Context, opts ...grpc.CallOption) (AnytypeSync_PingClient, error) { + stream, err := c.cc.NewStream(ctx, &_AnytypeSync_serviceDesc.Streams[0], "/anytype.AnytypeSync/Ping", opts...) + if err != nil { + return nil, err + } + x := &anytypeSyncPingClient{stream} + return x, nil +} + +type AnytypeSync_PingClient interface { + Send(*PingRequest) error + Recv() (*PingResponse, error) + grpc.ClientStream +} + +type anytypeSyncPingClient struct { + grpc.ClientStream +} + +func (x *anytypeSyncPingClient) Send(m *PingRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *anytypeSyncPingClient) Recv() (*PingResponse, error) { + m := new(PingResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// AnytypeSyncServer is the server API for AnytypeSync service. +type AnytypeSyncServer interface { + Ping(AnytypeSync_PingServer) error +} + +// UnimplementedAnytypeSyncServer can be embedded to have forward compatible implementations. +type UnimplementedAnytypeSyncServer struct { +} + +func (*UnimplementedAnytypeSyncServer) Ping(srv AnytypeSync_PingServer) error { + return status.Errorf(codes.Unimplemented, "method Ping not implemented") +} + +func RegisterAnytypeSyncServer(s *grpc.Server, srv AnytypeSyncServer) { + s.RegisterService(&_AnytypeSync_serviceDesc, srv) +} + +func _AnytypeSync_Ping_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(AnytypeSyncServer).Ping(&anytypeSyncPingServer{stream}) +} + +type AnytypeSync_PingServer interface { + Send(*PingResponse) error + Recv() (*PingRequest, error) + grpc.ServerStream +} + +type anytypeSyncPingServer struct { + grpc.ServerStream +} + +func (x *anytypeSyncPingServer) Send(m *PingResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *anytypeSyncPingServer) Recv() (*PingRequest, error) { + m := new(PingRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +var _AnytypeSync_serviceDesc = grpc.ServiceDesc{ + ServiceName: "anytype.AnytypeSync", + HandlerType: (*AnytypeSyncServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "Ping", + Handler: _AnytypeSync_Ping_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "syncproto/proto/service.proto", +} From abc6f68062a865a3081372c02043208529403ec1 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 14 Jul 2022 14:28:37 +0200 Subject: [PATCH 02/40] WIP pubsub and sync logic --- service/sync/pubsub.go | 13 ++++++++++++ service/sync/service.go | 44 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 service/sync/pubsub.go create mode 100644 service/sync/service.go diff --git a/service/sync/pubsub.go b/service/sync/pubsub.go new file mode 100644 index 00000000..b85c8e65 --- /dev/null +++ b/service/sync/pubsub.go @@ -0,0 +1,13 @@ +package sync + +type PubSubPayload struct { +} + +type PubSub interface { + Send(msg *PubSubPayload) error + Listen(chan *PubSubPayload) error +} + +func NewPubSub(topic string) PubSub { + return nil +} diff --git a/service/sync/service.go b/service/sync/service.go new file mode 100644 index 00000000..e26d54eb --- /dev/null +++ b/service/sync/service.go @@ -0,0 +1,44 @@ +package sync + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" +) + +type service struct { + pubSub PubSub +} + +const CName = "SyncService" + +func (s *service) Init(ctx context.Context, a *app.App) (err error) { + return nil +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Run(ctx context.Context) (err error) { + ch := make(chan *PubSubPayload) + err = s.pubSub.Listen(ch) + if err != nil { + return + } + return nil +} + +func (s *service) Close(ctx context.Context) (err error) { + return nil +} + +func (s *service) listen(ctx context.Context, ch chan *PubSubPayload) { + for { + select { + case <-ctx.Done(): + return + case payload := <-ch: + // TODO: get object from object service and try to perform sync + } + } +} From cbfaf7fd9156354d7065a7cabd5176c3baedd25e Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 14 Jul 2022 16:59:01 +0300 Subject: [PATCH 03/40] drpc experiment --- cmd/client/client.go | 61 +++++++++++++- cmd/node/node.go | 1 + etc/config.yml | 1 + go.mod | 2 + go.sum | 4 + service/server/drpc.go | 99 ++++++++++++++++++++++ syncproto/proto/commands.proto | 2 +- syncproto/proto/service.proto | 2 +- syncproto/service_drpc.pb.go | 146 +++++++++++++++++++++++++++++++++ 9 files changed, 314 insertions(+), 4 deletions(-) create mode 100644 service/server/drpc.go create mode 100644 syncproto/service_drpc.pb.go diff --git a/cmd/client/client.go b/cmd/client/client.go index 71b0d4d2..0f9cce60 100644 --- a/cmd/client/client.go +++ b/cmd/client/client.go @@ -9,6 +9,9 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" "log" + "net" + "storj.io/drpc" + "storj.io/drpc/drpcconn" "time" ) @@ -21,7 +24,11 @@ func main() { if err != nil { panic(err) } + benchGrpc(conf) + benchDrpc(conf) +} +func benchGrpc(conf *config.Config) { var opts []grpc.DialOption if conf.GrpcServer.TLS { creds, err := credentials.NewClientTLSFromFile(conf.GrpcServer.TLSCertFile, "127.0.0.1") @@ -39,12 +46,15 @@ func main() { } defer conn.Close() client := syncproto.NewAnytypeSyncClient(conn) + stream, err := client.Ping(context.TODO()) if err != nil { panic(err) } + st := time.Now() - n := 1000000 + n := 100000 + for i := 0; i < n; i++ { if err = stream.Send(&syncproto.PingRequest{ Seq: int64(i), @@ -58,5 +68,52 @@ func main() { } dur := time.Since(st) fmt.Printf("%d req for %v (%d per sec)\n", n, dur, int(float64(n)/dur.Seconds())) - +} + +func benchDrpc(conf *config.Config) { + rawconn, err := net.Dial("tcp", conf.GrpcServer.ListenAddrs[1]) + if err != nil { + panic(err) + } + conn := drpcconn.New(rawconn) + defer conn.Close() + client := syncproto.NewDRPCAnytypeSyncClient(conn) + + stream, err := client.Ping(context.TODO()) + if err != nil { + panic(err) + } + + st := time.Now() + n := 100000 + + for i := 0; i < n; i++ { + if err = stream.MsgSend(&syncproto.PingRequest{ + Seq: int64(i), + }, enc{}); err != nil { + panic(err) + } + msg := &syncproto.PingResponse{} + err := stream.MsgRecv(msg, enc{}) + if err != nil { + panic(err) + } + } + dur := time.Since(st) + fmt.Printf("%d req for %v (%d per sec)\n", n, dur, int(float64(n)/dur.Seconds())) +} + +type enc struct { +} + +func (e enc) Marshal(msg drpc.Message) ([]byte, error) { + return msg.(interface { + Marshal() ([]byte, error) + }).Marshal() +} + +func (e enc) Unmarshal(buf []byte, msg drpc.Message) error { + return msg.(interface { + Unmarshal(buf []byte) error + }).Unmarshal(buf) } diff --git a/cmd/node/node.go b/cmd/node/node.go index 161daa88..a6700e75 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -81,4 +81,5 @@ func main() { func Bootstrap(a *app.App) { a.Register(server.New()) + a.Register(server.NewDRPC()) } diff --git a/etc/config.yml b/etc/config.yml index 281c7d71..245199a3 100644 --- a/etc/config.yml +++ b/etc/config.yml @@ -4,6 +4,7 @@ anytype: grpcServer: listenAddrs: - "127.0.0.1:4430" + - "127.0.0.1:4431" tls: false tlsKeyFile: "etc/x509/key.pem" tlsCertFile: "etc/x509/cert.pem" diff --git a/go.mod b/go.mod index c0d0602f..c06a0cc1 100644 --- a/go.mod +++ b/go.mod @@ -44,6 +44,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/sirupsen/logrus v1.6.0 // indirect github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect + github.com/zeebo/errs v1.2.2 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.8.0 // indirect go.uber.org/zap v1.21.0 // indirect @@ -56,6 +57,7 @@ require ( google.golang.org/grpc v1.48.0 // indirect google.golang.org/protobuf v1.27.1 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect + storj.io/drpc v0.0.32 // indirect ) replace github.com/textileio/go-threads => github.com/anytypeio/go-threads v1.1.0-rc1.0.20220223104843-a67245cee80e diff --git a/go.sum b/go.sum index 01e832d4..e9440306 100644 --- a/go.sum +++ b/go.sum @@ -1044,6 +1044,8 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1: github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zeebo/errs v1.2.2 h1:5NFypMTuSdoySVTqlNs1dEoU21QVamMQJxW/Fii5O7g= +github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.mongodb.org/mongo-driver v1.4.0/go.mod h1:llVBH2pkj9HywK0Dtdt6lDikOjFLbceHVu/Rc0iMKLs= @@ -1398,3 +1400,5 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +storj.io/drpc v0.0.32 h1:5p5ZwsK/VOgapaCu+oxaPVwO6UwIs+iwdMiD50+R4PI= +storj.io/drpc v0.0.32/go.mod h1:6rcOyR/QQkSTX/9L5ZGtlZaE2PtXTTZl8d+ulSeeYEg= diff --git a/service/server/drpc.go b/service/server/drpc.go new file mode 100644 index 00000000..479392e6 --- /dev/null +++ b/service/server/drpc.go @@ -0,0 +1,99 @@ +package server + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "io" + "net" + "storj.io/drpc" + "storj.io/drpc/drpcmux" + "storj.io/drpc/drpcserver" + "time" +) + +const CNameDRPC = "serverDrpc" + +func NewDRPC() *ServerDrpc { + return &ServerDrpc{} +} + +type ServerDrpc struct { + config config.GrpcServer + grpcServerDrpc *drpcserver.Server + cancel func() +} + +func (s *ServerDrpc) Init(ctx context.Context, a *app.App) (err error) { + s.config = a.MustComponent(config.CName).(*config.Config).GrpcServer + return nil +} + +func (s *ServerDrpc) Name() (name string) { + return CNameDRPC +} + +func (s *ServerDrpc) Run(ctx context.Context) (err error) { + m := drpcmux.New() + lis, err := net.Listen("tcp", s.config.ListenAddrs[1]) + if err != nil { + return err + } + err = syncproto.DRPCRegisterAnytypeSync(m, s) + if err != nil { + return err + } + ctx, s.cancel = context.WithCancel(ctx) + s.grpcServerDrpc = drpcserver.New(m) + var errCh = make(chan error) + go func() { + errCh <- s.grpcServerDrpc.Serve(ctx, lis) + }() + select { + case <-time.After(time.Second / 4): + case err = <-errCh: + } + log.Sugar().Infof("drpc server started at: %v", s.config.ListenAddrs[1]) + return +} + +func (s *ServerDrpc) Ping(stream syncproto.DRPCAnytypeSync_PingStream) error { + for { + var in = &syncproto.PingRequest{} + err := stream.MsgRecv(in, enc{}) + if err == io.EOF { + return nil + } + if err != nil { + return err + } + if err := stream.MsgSend(&syncproto.PingResponse{ + Seq: in.Seq, + }, enc{}); err != nil { + return err + } + } +} + +func (s *ServerDrpc) Close(ctx context.Context) (err error) { + if s.cancel != nil { + s.cancel() + } + return +} + +type enc struct { +} + +func (e enc) Marshal(msg drpc.Message) ([]byte, error) { + return msg.(interface { + Marshal() ([]byte, error) + }).Marshal() +} + +func (e enc) Unmarshal(buf []byte, msg drpc.Message) error { + return msg.(interface { + Unmarshal(buf []byte) error + }).Unmarshal(buf) +} diff --git a/syncproto/proto/commands.proto b/syncproto/proto/commands.proto index 2eb5bf86..73a5366c 100644 --- a/syncproto/proto/commands.proto +++ b/syncproto/proto/commands.proto @@ -1,6 +1,6 @@ syntax = "proto3"; package anytype; -option go_package = "syncproto"; +option go_package = "/syncproto"; message Ping { diff --git a/syncproto/proto/service.proto b/syncproto/proto/service.proto index 5e261219..fc0a35ff 100644 --- a/syncproto/proto/service.proto +++ b/syncproto/proto/service.proto @@ -1,6 +1,6 @@ syntax = "proto3"; package anytype; -option go_package = "syncproto"; +option go_package = "/syncproto"; import "syncproto/proto/commands.proto"; diff --git a/syncproto/service_drpc.pb.go b/syncproto/service_drpc.pb.go new file mode 100644 index 00000000..694868b4 --- /dev/null +++ b/syncproto/service_drpc.pb.go @@ -0,0 +1,146 @@ +// Code generated by protoc-gen-go-drpc. DO NOT EDIT. +// protoc-gen-go-drpc version: v0.0.32 +// source: syncproto/proto/service.proto + +package syncproto + +import ( + context "context" + errors "errors" + protojson "google.golang.org/protobuf/encoding/protojson" + proto "google.golang.org/protobuf/proto" + drpc "storj.io/drpc" + drpcerr "storj.io/drpc/drpcerr" +) + +type drpcEncoding_File_syncproto_proto_service_proto struct{} + +func (drpcEncoding_File_syncproto_proto_service_proto) Marshal(msg drpc.Message) ([]byte, error) { + return proto.Marshal(msg.(proto.Message)) +} + +func (drpcEncoding_File_syncproto_proto_service_proto) MarshalAppend(buf []byte, msg drpc.Message) ([]byte, error) { + return proto.MarshalOptions{}.MarshalAppend(buf, msg.(proto.Message)) +} + +func (drpcEncoding_File_syncproto_proto_service_proto) Unmarshal(buf []byte, msg drpc.Message) error { + return proto.Unmarshal(buf, msg.(proto.Message)) +} + +func (drpcEncoding_File_syncproto_proto_service_proto) JSONMarshal(msg drpc.Message) ([]byte, error) { + return protojson.Marshal(msg.(proto.Message)) +} + +func (drpcEncoding_File_syncproto_proto_service_proto) JSONUnmarshal(buf []byte, msg drpc.Message) error { + return protojson.Unmarshal(buf, msg.(proto.Message)) +} + +type DRPCAnytypeSyncClient interface { + DRPCConn() drpc.Conn + + Ping(ctx context.Context) (DRPCAnytypeSync_PingClient, error) +} + +type drpcAnytypeSyncClient struct { + cc drpc.Conn +} + +func NewDRPCAnytypeSyncClient(cc drpc.Conn) DRPCAnytypeSyncClient { + return &drpcAnytypeSyncClient{cc} +} + +func (c *drpcAnytypeSyncClient) DRPCConn() drpc.Conn { return c.cc } + +func (c *drpcAnytypeSyncClient) Ping(ctx context.Context) (DRPCAnytypeSync_PingClient, error) { + stream, err := c.cc.NewStream(ctx, "/anytype.AnytypeSync/Ping", drpcEncoding_File_syncproto_proto_service_proto{}) + if err != nil { + return nil, err + } + x := &drpcAnytypeSync_PingClient{stream} + return x, nil +} + +type DRPCAnytypeSync_PingClient interface { + drpc.Stream + Send(*PingRequest) error + Recv() (*PingResponse, error) +} + +type drpcAnytypeSync_PingClient struct { + drpc.Stream +} + +func (x *drpcAnytypeSync_PingClient) Send(m *PingRequest) error { + return x.MsgSend(m, drpcEncoding_File_syncproto_proto_service_proto{}) +} + +func (x *drpcAnytypeSync_PingClient) Recv() (*PingResponse, error) { + m := new(PingResponse) + if err := x.MsgRecv(m, drpcEncoding_File_syncproto_proto_service_proto{}); err != nil { + return nil, err + } + return m, nil +} + +func (x *drpcAnytypeSync_PingClient) RecvMsg(m *PingResponse) error { + return x.MsgRecv(m, drpcEncoding_File_syncproto_proto_service_proto{}) +} + +type DRPCAnytypeSyncServer interface { + Ping(DRPCAnytypeSync_PingStream) error +} + +type DRPCAnytypeSyncUnimplementedServer struct{} + +func (s *DRPCAnytypeSyncUnimplementedServer) Ping(DRPCAnytypeSync_PingStream) error { + return drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) +} + +type DRPCAnytypeSyncDescription struct{} + +func (DRPCAnytypeSyncDescription) NumMethods() int { return 1 } + +func (DRPCAnytypeSyncDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) { + switch n { + case 0: + return "/anytype.AnytypeSync/Ping", drpcEncoding_File_syncproto_proto_service_proto{}, + func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { + return nil, srv.(DRPCAnytypeSyncServer). + Ping( + &drpcAnytypeSync_PingStream{in1.(drpc.Stream)}, + ) + }, DRPCAnytypeSyncServer.Ping, true + default: + return "", nil, nil, nil, false + } +} + +func DRPCRegisterAnytypeSync(mux drpc.Mux, impl DRPCAnytypeSyncServer) error { + return mux.Register(impl, DRPCAnytypeSyncDescription{}) +} + +type DRPCAnytypeSync_PingStream interface { + drpc.Stream + Send(*PingResponse) error + Recv() (*PingRequest, error) +} + +type drpcAnytypeSync_PingStream struct { + drpc.Stream +} + +func (x *drpcAnytypeSync_PingStream) Send(m *PingResponse) error { + return x.MsgSend(m, drpcEncoding_File_syncproto_proto_service_proto{}) +} + +func (x *drpcAnytypeSync_PingStream) Recv() (*PingRequest, error) { + m := new(PingRequest) + if err := x.MsgRecv(m, drpcEncoding_File_syncproto_proto_service_proto{}); err != nil { + return nil, err + } + return m, nil +} + +func (x *drpcAnytypeSync_PingStream) RecvMsg(m *PingRequest) error { + return x.MsgRecv(m, drpcEncoding_File_syncproto_proto_service_proto{}) +} From 6c4c4f1e9db4b77d45e5d48b7c1c8b850307971f Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 14 Jul 2022 21:07:34 +0200 Subject: [PATCH 04/40] Add account reading from file logic --- cmd/node/node.go | 15 +++- etc/account.yaml | 2 + pkg/acl/acltree/acltree.go | 6 ++ pkg/acl/acltree/acltree_test.go | 31 +++++-- pkg/acl/acltree/acltreestorage.go | 2 +- .../plaintextdocument/document_test.go | 4 +- .../testutils/treestoragebuilder/keychain.go | 2 +- pkg/acl/treestorage/provider.go | 39 +++++++++ pkg/acl/treestorage/{models.go => storage.go} | 0 service/account/service.go | 82 +++++++++++++++++++ service/treecache/service.go | 44 ++++++++++ util/keys/asymmetric/signingkey/ed25519.go | 6 +- util/keys/decoder.go | 38 +++++++++ util/keys/key.go | 7 ++ 14 files changed, 263 insertions(+), 15 deletions(-) create mode 100644 etc/account.yaml create mode 100644 pkg/acl/treestorage/provider.go rename pkg/acl/treestorage/{models.go => storage.go} (100%) create mode 100644 service/account/service.go create mode 100644 service/treecache/service.go create mode 100644 util/keys/decoder.go diff --git a/cmd/node/node.go b/cmd/node/node.go index 089f20a9..157d29a5 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -7,6 +7,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "go.uber.org/zap" "os" "os/signal" @@ -17,9 +18,10 @@ import ( var log = logger.NewNamed("main") var ( - flagConfigFile = flag.String("c", "etc/config.yml", "path to config file") - flagVersion = flag.Bool("v", false, "show version and exit") - flagHelp = flag.Bool("h", false, "show help and exit") + flagConfigFile = flag.String("c", "etc/config.yml", "path to config file") + flagAccountFile = flag.String("a", "etc/account.yaml", "path to account file") + flagVersion = flag.Bool("v", false, "show version and exit") + flagHelp = flag.Bool("h", false, "show help and exit") ) func main() { @@ -44,8 +46,15 @@ func main() { log.Fatal("can't open config file", zap.Error(err)) } + // open account file with node's keys + acc, err := account.NewFromFile(*flagAccountFile) + if err != nil { + log.Fatal("can't open account file", zap.Error(err)) + } + // bootstrap components a.Register(conf) + a.Register(acc) Bootstrap(a) // start app diff --git a/etc/account.yaml b/etc/account.yaml new file mode 100644 index 00000000..5a9a0330 --- /dev/null +++ b/etc/account.yaml @@ -0,0 +1,2 @@ +signingKey: 3iT1Ue7xNejwKhZ4L8SJCKZw7RLaMy5Vh9fkWFD43ZDTg5kRV3zGPuKCzWL8d2k57EMrFCk39ddknzRVhVFC6fgi77iA +encryptionKey: 51HYzTYh5uokpYWp8EyPeTJRm6AYe2ZoZBPCLUzMR3kMijkKvEJ4bjGBdU3MxgHo4e3Dg1AFnapEZPMMHp4d3hyMB6469ZWHeGPUWh94jhB7WiRL9BtydyazQHqZQhfihK2qaTw9wgx4pq7XnydCrYS1SiQLVCGCitCLH79cHSXZNn3hrNYCz9Z3GQHX12hSKA55uzKyumZiwiiddDQ3Ufzs49hPhNuRU1QtyDYETGNCFafA2MyDv86KbdeXSgQFcghDz97A1KL2FsvfjpMBawok5NKKPmd2P1PR6cZXb1UTHRaMbAGpDuEjQNu74TsFbQQoBEahWYBgSy8Mg92JuaTjeGhLFDh5QsVF89Xj7qYK7T6CRTKuuJEgCyDYL9zbsqnZg7tXESGfazhcCYdUXXZVq3N11NDkEWz7SrNCdLscPKgqcFidBFRdVUqM2v8kGbeXQQCGTGSDsUi9yweB8xrpBdLRhJzJmKrN9xsUT8UeVjdBA4hKc8DKdV9oSxpkcJMMiCuL7EPYBA9uRMXzzeJw3HnZvFemv5QLqcPKc55q5oZp364xDwV86PMokVVGGCu67kuurertyFGKDWsfyRje7g9dy4o1t9D3pTuVmNH5Jjhb432kq38AEx8ndpAzvYPLpni44mBWutreYMg6ASDMYa19NkSRLrvjMHfF8uoP7VLitpyeWsx7mfjsQS5qms3xpTJRDJYjHN1ZPEYdxBCXPjofYyFExHH4kc27gejLMwhKMnTkGuEdnvaBSvJLwq6BUM3NsMMnqZcXFDMwarSbi67F8KyFspmYJ2jsJfEiAHzkSk65ZnppccxQjCAJgniMDQh9NwcuSG3n1Mt4VvW1B7sNrcWdFhTVnZFjBodarLJJfNYXeJDweZgwAs9Y1Ce1BbJQok1u31aJmY9ATnhKS2Bb3eDDf2kvG8q6DDcUiM5HHNqdMZbrt9jevNfR59B19C5j92DNAsCvcTmnWrSfPyphAWjJD5yTZRNdMYL1XaywncrhouSXUS7Crfpsm1yPnRQDYu6LB26vgnc35cLSNYqyX2oXfh3o4WyC2SPPCJ7LP5T8ff34hsKo78GZtc7mGreHuxieYCnJ3kYEW5WpVJ4TqQLTrnqzF2WL244V5pmUHQVF4q4ztzrG5edZS4Ah6Kq389UkU4Qo7srjMQ5KJnDpUAvJmdqdWJWftbqB5qMhRekHS3MXbgDrDL6JrpR2PcLLPPKhQHatPdhKnwgg7NABzTAxNqgb99LjsPFDhPDiK4BpWX7RbvjWm4WSZmozcRvJz75w2t3y4zvhBfNTgu8iZjE1bTL8wLpBrFMZesK5waspBP9N7uYaBKwRfb8VoUNoLWJtERwH592vqHKyg9B1mBHeH3YCQLu9NcS4qUsa5tSKmn24q9i9yBkoeVP1bFiDy3JxHUyQcaCwVgE2kWZApDw6w2T8FUp5ftWDCLb2ewGjj52cRNXb4pjgRuyLZdSa7wgn6SsQdhuAiTaKECmaEpZMoKFL9JRD9iTcAq1HNJBzP8hnaeF88UNdz8TBLr7d5Bnujpcr9mqQSj28JrRzxLNJQfWo6sWLao8LpaRzdP8QNUcv3SDMiLT9Vdb31iFvSesUzi6YG5XY95ceA7xJRzW \ No newline at end of file diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index 2b7ae436..ed14f446 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -36,6 +36,8 @@ type ACLTree interface { Iterate(func(change *Change) bool) IterateFrom(string, func(change *Change) bool) HasChange(string) bool + + Close() error } type aclTree struct { @@ -347,3 +349,7 @@ func (a *aclTree) Root() *Change { defer a.RUnlock() return a.fullTree.Root() } + +func (a *aclTree) Close() error { + return nil +} diff --git a/pkg/acl/acltree/acltree_test.go b/pkg/acl/acltree/acltree_test.go index 0f87c53c..f8313df4 100644 --- a/pkg/acl/acltree/acltree_test.go +++ b/pkg/acl/acltree/acltree_test.go @@ -27,7 +27,7 @@ func TestACLTree_UserJoinBuild(t *testing.T) { Identity: keychain.GetIdentity("A"), SignKey: keychain.SigningKeys["A"], EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519Decoder(), + Decoder: signingkey.NewEd25519PubKeyDecoder(), } listener := &mockListener{} tree, err := BuildACLTree(thr, accountData, listener) @@ -62,8 +62,25 @@ func TestACLTree_UserJoinUpdate_Append(t *testing.T) { Identity: keychain.GetIdentity("A"), SignKey: keychain.SigningKeys["A"], EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519Decoder(), + Decoder: signingkey.NewEd25519PubKeyDecoder(), } + + // Use this for key generation + //encryptionDecoder := keys.NewKeyDecoder(func(bytes []byte) (keys.Key, error) { + // key, err := encryptionkey.NewEncryptionRsaPrivKeyFromBytes(bytes) + // return key, err + //}) + //encodedEncryptionKey, _ := encryptionDecoder.EncodeToString(keychain.EncryptionKeys["A"]) + // + //signingDecoder := keys.NewKeyDecoder(func(bytes []byte) (keys.Key, error) { + // key, err := signingkey.NewSigningEd25519PrivKeyFromBytes(bytes) + // return key, err + //}) + //encodedSigningKey, _ := signingDecoder.EncodeToString(keychain.SigningKeys["A"]) + // + //fmt.Println(encodedEncryptionKey) + //fmt.Println(encodedSigningKey) + listener := &mockListener{} tree, err := BuildACLTree(thr, accountData, listener) if err != nil { @@ -112,7 +129,7 @@ func TestACLTree_UserJoinUpdate_Rebuild(t *testing.T) { Identity: keychain.GetIdentity("A"), SignKey: keychain.SigningKeys["A"], EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519Decoder(), + Decoder: signingkey.NewEd25519PubKeyDecoder(), } listener := &mockListener{} tree, err := BuildACLTree(thr, accountData, listener) @@ -163,7 +180,7 @@ func TestACLTree_UserRemoveBuild(t *testing.T) { Identity: keychain.GetIdentity("A"), SignKey: keychain.SigningKeys["A"], EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519Decoder(), + Decoder: signingkey.NewEd25519PubKeyDecoder(), } listener := &mockListener{} tree, err := BuildACLTree(thr, accountData, listener) @@ -194,7 +211,7 @@ func TestACLTree_UserRemoveBeforeBuild(t *testing.T) { Identity: keychain.GetIdentity("A"), SignKey: keychain.SigningKeys["A"], EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519Decoder(), + Decoder: signingkey.NewEd25519PubKeyDecoder(), } listener := &mockListener{} tree, err := BuildACLTree(thr, accountData, listener) @@ -226,7 +243,7 @@ func TestACLTree_InvalidSnapshotBuild(t *testing.T) { Identity: keychain.GetIdentity("A"), SignKey: keychain.SigningKeys["A"], EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519Decoder(), + Decoder: signingkey.NewEd25519PubKeyDecoder(), } listener := &mockListener{} tree, err := BuildACLTree(thr, accountData, listener) @@ -257,7 +274,7 @@ func TestACLTree_ValidSnapshotBuild(t *testing.T) { Identity: keychain.GetIdentity("A"), SignKey: keychain.SigningKeys["A"], EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519Decoder(), + Decoder: signingkey.NewEd25519PubKeyDecoder(), } listener := &mockListener{} tree, err := BuildACLTree(thr, accountData, listener) diff --git a/pkg/acl/acltree/acltreestorage.go b/pkg/acl/acltree/acltreestorage.go index a0e241f4..f5fe18c0 100644 --- a/pkg/acl/acltree/acltreestorage.go +++ b/pkg/acl/acltree/acltreestorage.go @@ -12,7 +12,7 @@ func BuildTreeStorageWithACL( create func(change *treestorage.RawChange) (treestorage.TreeStorage, error)) (treestorage.TreeStorage, error) { bld := newChangeBuilder() bld.Init( - newACLState(acc.Identity, acc.EncKey, signingkey.NewEd25519Decoder()), + newACLState(acc.Identity, acc.EncKey, signingkey.NewEd25519PubKeyDecoder()), &Tree{}, acc) err := build(bld) diff --git a/pkg/acl/example/plaintextdocument/document_test.go b/pkg/acl/example/plaintextdocument/document_test.go index 9f523fa7..7cabb4af 100644 --- a/pkg/acl/example/plaintextdocument/document_test.go +++ b/pkg/acl/example/plaintextdocument/document_test.go @@ -18,7 +18,7 @@ func TestDocument_NewPlainTextDocument(t *testing.T) { Identity: keychain.GetIdentity("A"), SignKey: keychain.SigningKeys["A"], EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519Decoder(), + Decoder: signingkey.NewEd25519PubKeyDecoder(), } doc, err := NewPlainTextDocument(data, treestorage.NewInMemoryTreeStorage, "Some text") @@ -36,7 +36,7 @@ func TestDocument_PlainTextDocument_AddText(t *testing.T) { Identity: keychain.GetIdentity("A"), SignKey: keychain.SigningKeys["A"], EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519Decoder(), + Decoder: signingkey.NewEd25519PubKeyDecoder(), } doc, err := NewPlainTextDocument(data, treestorage.NewInMemoryTreeStorage, "Some text") diff --git a/pkg/acl/testutils/treestoragebuilder/keychain.go b/pkg/acl/testutils/treestoragebuilder/keychain.go index 6211f66f..5635f072 100644 --- a/pkg/acl/testutils/treestoragebuilder/keychain.go +++ b/pkg/acl/testutils/treestoragebuilder/keychain.go @@ -32,7 +32,7 @@ func NewKeychain() *Keychain { GeneratedIdentities: map[string]string{}, ReadKeys: map[string]*SymKey{}, ReadKeysByHash: map[uint64]*SymKey{}, - coder: signingkey.NewEd25519Decoder(), + coder: signingkey.NewEd25519PubKeyDecoder(), } } diff --git a/pkg/acl/treestorage/provider.go b/pkg/acl/treestorage/provider.go new file mode 100644 index 00000000..bf0c074c --- /dev/null +++ b/pkg/acl/treestorage/provider.go @@ -0,0 +1,39 @@ +package treestorage + +import "fmt" + +type Provider interface { + TreeStorage(treeId string) (TreeStorage, error) + InsertTree(tree TreeStorage) error +} + +type inMemoryTreeStorageProvider struct { + trees map[string]TreeStorage +} + +func (i *inMemoryTreeStorageProvider) TreeStorage(treeId string) (TreeStorage, error) { + if tree, exists := i.trees[treeId]; exists { + return tree, nil + } + return nil, fmt.Errorf("tree with id %s doesn't exist", treeId) +} + +func (i *inMemoryTreeStorageProvider) InsertTree(tree TreeStorage) error { + if tree == nil { + return fmt.Errorf("tree should not be nil") + } + + id, err := tree.TreeID() + if err != nil { + return err + } + + i.trees[id] = tree + return nil +} + +func NewInMemoryTreeStorageProvider() Provider { + return &inMemoryTreeStorageProvider{ + trees: make(map[string]TreeStorage), + } +} diff --git a/pkg/acl/treestorage/models.go b/pkg/acl/treestorage/storage.go similarity index 100% rename from pkg/acl/treestorage/models.go rename to pkg/acl/treestorage/storage.go diff --git a/service/account/service.go b/service/account/service.go new file mode 100644 index 00000000..3363379d --- /dev/null +++ b/service/account/service.go @@ -0,0 +1,82 @@ +package account + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "gopkg.in/yaml.v3" + "io/ioutil" +) + +const CName = "account" + +type Service interface { + Account() *account.AccountData +} + +type service struct { + accountData *account.AccountData +} + +func (s *service) Account() *account.AccountData { + return s.accountData +} + +type StaticAccount struct { + SigningKey string `yaml:"siginingKey"` + EncryptionKey string `yaml:"encryptionKey"` +} + +func NewFromFile(path string) (app.Component, error) { + acc := &StaticAccount{} + data, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + } + if err = yaml.Unmarshal(data, acc); err != nil { + return nil, err + } + privateEncryptionDecoder := keys.NewKeyDecoder(func(bytes []byte) (keys.Key, error) { + key, err := encryptionkey.NewEncryptionRsaPrivKeyFromBytes(bytes) + return key, err + }) + privateSigningDecoder := keys.NewKeyDecoder(func(bytes []byte) (keys.Key, error) { + key, err := signingkey.NewSigningEd25519PrivKeyFromBytes(bytes) + return key, err + }) + // TODO: Convert this to new decoder + publicSigningDecoder := signingkey.NewEd25519PubKeyDecoder() + + decodedEncryptionKey, err := privateEncryptionDecoder.DecodeFromString(acc.EncryptionKey) + if err != nil { + return nil, err + } + decodedSiginingKey, err := privateSigningDecoder.DecodeFromString(acc.EncryptionKey) + if err != nil { + return nil, err + } + signKey := decodedSiginingKey.(signingkey.PrivKey) + identity, err := publicSigningDecoder.EncodeToString(signKey.GetPublic()) + if err != nil { + return nil, err + } + + accountData := &account.AccountData{ + Identity: identity, + SignKey: signKey, + EncKey: decodedEncryptionKey.(encryptionkey.PrivKey), + Decoder: signingkey.NewEd25519PubKeyDecoder(), + } + return &service{accountData: accountData}, nil +} + +func (s *service) Init(ctx context.Context, a *app.App) (err error) { + return nil +} + +func (s *service) Name() (name string) { + return CName +} diff --git a/service/treecache/service.go b/service/treecache/service.go new file mode 100644 index 00000000..620da179 --- /dev/null +++ b/service/treecache/service.go @@ -0,0 +1,44 @@ +package treecache + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" +) + +type TreeCache interface { + Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree)) error +} + +type service struct { + treeProvider treestorage.Provider + cache ocache.OCache +} + +func (s *service) Init(ctx context.Context, a *app.App) (err error) { + s.cache = ocache.New() +} + +func (s *service) Name() (name string) { + //TODO implement me + panic("implement me") +} + +func (s *service) Run(ctx context.Context) (err error) { + //TODO implement me + panic("implement me") +} + +func (s *service) Close(ctx context.Context) (err error) { + return nil +} + +func (s *service) loadTree(ctx context.Context, id string) (value ocache.Object, err error) { + tree, err := s.treeProvider.TreeStorage(id) + if err != nil { + return nil, err + } + +} diff --git a/util/keys/asymmetric/signingkey/ed25519.go b/util/keys/asymmetric/signingkey/ed25519.go index 27f8650b..135b6864 100644 --- a/util/keys/asymmetric/signingkey/ed25519.go +++ b/util/keys/asymmetric/signingkey/ed25519.go @@ -27,6 +27,10 @@ func NewSigningEd25519PubKeyFromBytes(bytes []byte) (PubKey, error) { return UnmarshalEd25519PublicKey(bytes) } +func NewSigningEd25519PrivKeyFromBytes(bytes []byte) (PrivKey, error) { + return UnmarshalEd25519PrivateKey(bytes) +} + func GenerateRandomEd25519KeyPair() (PrivKey, PubKey, error) { return GenerateEd25519Key(rand.Reader) } @@ -146,7 +150,7 @@ func UnmarshalEd25519PrivateKey(data []byte) (PrivKey, error) { type Ed25519SigningPubKeyDecoder struct{} -func NewEd25519Decoder() PubKeyDecoder { +func NewEd25519PubKeyDecoder() PubKeyDecoder { return &Ed25519SigningPubKeyDecoder{} } diff --git a/util/keys/decoder.go b/util/keys/decoder.go new file mode 100644 index 00000000..2a55872b --- /dev/null +++ b/util/keys/decoder.go @@ -0,0 +1,38 @@ +package keys + +import "github.com/anytypeio/go-anytype-infrastructure-experiments/util/strkey" + +type keyDecoder struct { + create func([]byte) (Key, error) +} + +func NewKeyDecoder(create func(bytes []byte) (Key, error)) Decoder { + return &keyDecoder{ + create: create, + } +} + +func (e *keyDecoder) DecodeFromBytes(bytes []byte) (Key, error) { + return e.create(bytes) +} + +func (e *keyDecoder) DecodeFromString(identity string) (Key, error) { + pubKeyRaw, err := strkey.Decode(0x5b, identity) + if err != nil { + return nil, err + } + + return e.DecodeFromBytes(pubKeyRaw) +} + +func (e *keyDecoder) DecodeFromStringIntoBytes(identity string) ([]byte, error) { + return strkey.Decode(0x5b, identity) +} + +func (e *keyDecoder) EncodeToString(key Key) (string, error) { + raw, err := key.Raw() + if err != nil { + return "", err + } + return strkey.Encode(0x5b, raw) +} diff --git a/util/keys/key.go b/util/keys/key.go index 150d0897..2170fac8 100644 --- a/util/keys/key.go +++ b/util/keys/key.go @@ -8,6 +8,13 @@ type Key interface { Raw() ([]byte, error) } +type Decoder interface { + DecodeFromBytes(bytes []byte) (Key, error) + DecodeFromString(identity string) (Key, error) + DecodeFromStringIntoBytes(identity string) ([]byte, error) + EncodeToString(key Key) (string, error) +} + func KeyEquals(k1, k2 Key) bool { a, err := k1.Raw() if err != nil { From 293ada96c893c6407773b74f0cbd95403f91ee4c Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 14 Jul 2022 21:23:40 +0200 Subject: [PATCH 05/40] Add tree cache service --- cmd/node/node.go | 2 ++ pkg/acl/acltree/acltree.go | 7 +++++ service/treecache/service.go | 56 ++++++++++++++++++++++++------------ 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/cmd/node/node.go b/cmd/node/node.go index 157d29a5..bbbfdda0 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -8,6 +8,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "go.uber.org/zap" "os" "os/signal" @@ -55,6 +56,7 @@ func main() { // bootstrap components a.Register(conf) a.Register(acc) + a.Register(treecache.NewTreeCache()) Bootstrap(a) // start app diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index ed14f446..5d5b770d 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -27,6 +27,12 @@ type TreeUpdateListener interface { Rebuild(tree ACLTree) } +type NoOpListener struct{} + +func (n NoOpListener) Update(tree ACLTree) {} + +func (n NoOpListener) Rebuild(tree ACLTree) {} + type ACLTree interface { ACLState() *ACLState AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*Change, error) @@ -195,6 +201,7 @@ func (a *aclTree) rebuildFromStorage(fromStart bool) error { } func (a *aclTree) ACLState() *ACLState { + // TODO: probably locks should be happening outside because we are using object cache a.RLock() defer a.RUnlock() return a.aclState diff --git a/service/treecache/service.go b/service/treecache/service.go index 620da179..0aef289c 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -6,39 +6,59 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" ) -type TreeCache interface { - Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree)) error +const CName = "treecache" + +type Service interface { + Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree) error) error } type service struct { treeProvider treestorage.Provider + account account.Service cache ocache.OCache } +func NewTreeCache() app.ComponentRunnable { + return &service{} +} + +func (s *service) Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree) error) error { + tree, err := s.cache.Get(ctx, treeId) + defer s.cache.Release(treeId) + if err != nil { + return err + } + return f(tree.(acltree.ACLTree)) +} + func (s *service) Init(ctx context.Context, a *app.App) (err error) { - s.cache = ocache.New() -} - -func (s *service) Name() (name string) { - //TODO implement me - panic("implement me") -} - -func (s *service) Run(ctx context.Context) (err error) { - //TODO implement me - panic("implement me") -} - -func (s *service) Close(ctx context.Context) (err error) { + s.cache = ocache.New(s.loadTree) + s.account = a.MustComponent(account.CName).(account.Service) + // TODO: for test we should load some predefined keys return nil } -func (s *service) loadTree(ctx context.Context, id string) (value ocache.Object, err error) { +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Run(ctx context.Context) (err error) { + return nil +} + +func (s *service) Close(ctx context.Context) (err error) { + return s.cache.Close() +} + +func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error) { tree, err := s.treeProvider.TreeStorage(id) if err != nil { return nil, err } - + // TODO: should probably accept nil listeners + aclTree, err := acltree.BuildACLTree(tree, s.account.Account(), acltree.NoOpListener{}) + return aclTree, err } From 5f8dc32ed6f3ce721764dbe5c61b47d64814a0a4 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 14 Jul 2022 21:29:10 +0200 Subject: [PATCH 06/40] Simplify code in decoders --- pkg/acl/acltree/acltree_test.go | 6 ++---- service/account/service.go | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/pkg/acl/acltree/acltree_test.go b/pkg/acl/acltree/acltree_test.go index f8313df4..e9a72226 100644 --- a/pkg/acl/acltree/acltree_test.go +++ b/pkg/acl/acltree/acltree_test.go @@ -67,14 +67,12 @@ func TestACLTree_UserJoinUpdate_Append(t *testing.T) { // Use this for key generation //encryptionDecoder := keys.NewKeyDecoder(func(bytes []byte) (keys.Key, error) { - // key, err := encryptionkey.NewEncryptionRsaPrivKeyFromBytes(bytes) - // return key, err + // return encryptionkey.NewEncryptionRsaPrivKeyFromBytes(bytes) //}) //encodedEncryptionKey, _ := encryptionDecoder.EncodeToString(keychain.EncryptionKeys["A"]) // //signingDecoder := keys.NewKeyDecoder(func(bytes []byte) (keys.Key, error) { - // key, err := signingkey.NewSigningEd25519PrivKeyFromBytes(bytes) - // return key, err + // return signingkey.NewSigningEd25519PrivKeyFromBytes(bytes) //}) //encodedSigningKey, _ := signingDecoder.EncodeToString(keychain.SigningKeys["A"]) // diff --git a/service/account/service.go b/service/account/service.go index 3363379d..b64a6a83 100644 --- a/service/account/service.go +++ b/service/account/service.go @@ -40,12 +40,10 @@ func NewFromFile(path string) (app.Component, error) { return nil, err } privateEncryptionDecoder := keys.NewKeyDecoder(func(bytes []byte) (keys.Key, error) { - key, err := encryptionkey.NewEncryptionRsaPrivKeyFromBytes(bytes) - return key, err + return encryptionkey.NewEncryptionRsaPrivKeyFromBytes(bytes) }) privateSigningDecoder := keys.NewKeyDecoder(func(bytes []byte) (keys.Key, error) { - key, err := signingkey.NewSigningEd25519PrivKeyFromBytes(bytes) - return key, err + return signingkey.NewSigningEd25519PrivKeyFromBytes(bytes) }) // TODO: Convert this to new decoder publicSigningDecoder := signingkey.NewEd25519PubKeyDecoder() From b8dcac03cc3d4863ddbe175387c9630e762f990c Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 14 Jul 2022 23:52:37 +0200 Subject: [PATCH 07/40] WIP sync proto --- Makefile | 8 +- pkg/acl/aclchanges/aclpb/aclchanges.pb.go | 155 +- .../aclchanges/aclpb/protos/aclchanges.proto | 2 +- service/sync/syncpb/protos/sync.proto | 31 + service/sync/syncpb/sync.pb.go | 1400 +++++++++++++++++ 5 files changed, 1515 insertions(+), 81 deletions(-) create mode 100644 service/sync/syncpb/protos/sync.proto create mode 100644 service/sync/syncpb/sync.pb.go diff --git a/Makefile b/Makefile index 29f43106..b1a3cc3e 100644 --- a/Makefile +++ b/Makefile @@ -16,18 +16,22 @@ export PATH=$(GOPATH)/bin:$(shell echo $$PATH) protos-go: @echo 'Generating protobuf packages (Go)...' # Uncomment if needed - @$(eval P_TIMESTAMP := Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types) - @$(eval P_STRUCT := Mgoogle/protobuf/struct.proto=github.com/gogo/protobuf/types) @$(eval ROOT_PKG := pkg) @$(eval GOGO_START := GOGO_NO_UNDERSCORE=1 GOGO_EXPORT_ONEOF_INTERFACE=1) @$(eval P_TREE_STORAGE_PATH_PB := $(ROOT_PKG)/acl/treestorage/treepb) @$(eval P_ACL_CHANGES_PATH_PB := $(ROOT_PKG)/acl/aclchanges/aclpb) @$(eval P_PLAINTEXT_CHANGES_PATH_PB := $(ROOT_PKG)/acl/testutils/testchanges/testchangepb) + @$(eval P_SYNC_CHANGES_PATH_PB := service/sync/syncpb) + @$(eval P_TIMESTAMP := Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types) + @$(eval P_STRUCT := Mgoogle/protobuf/struct.proto=github.com/gogo/protobuf/types) + @$(eval P_ACL_CHANGES := M$(P_ACL_CHANGES_PATH_PB)/protos/aclchanges.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/$(P_ACL_CHANGES_PATH_PB)) # use if needed $(eval PKGMAP := $$(P_TIMESTAMP),$$(P_STRUCT)) $(GOGO_START) protoc --gogofaster_out=:. $(P_ACL_CHANGES_PATH_PB)/protos/*.proto; mv $(P_ACL_CHANGES_PATH_PB)/protos/*.go $(P_ACL_CHANGES_PATH_PB) $(GOGO_START) protoc --gogofaster_out=:. $(P_TREE_STORAGE_PATH_PB)/protos/*.proto; mv $(P_TREE_STORAGE_PATH_PB)/protos/*.go $(P_TREE_STORAGE_PATH_PB) $(GOGO_START) protoc --gogofaster_out=:. $(P_PLAINTEXT_CHANGES_PATH_PB)/protos/*.proto; mv $(P_PLAINTEXT_CHANGES_PATH_PB)/protos/*.go $(P_PLAINTEXT_CHANGES_PATH_PB) + $(eval PKGMAP := $$(P_ACL_CHANGES)) + $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. $(P_SYNC_CHANGES_PATH_PB)/protos/*.proto; mv $(P_SYNC_CHANGES_PATH_PB)/protos/*.go $(P_SYNC_CHANGES_PATH_PB) build: @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) diff --git a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go index aad678fd..1cce6bf3 100644 --- a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go +++ b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go @@ -453,7 +453,7 @@ type ACLChangeUserState struct { Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLChangeUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=anytype.ACLChangeUserPermissions" json:"permissions,omitempty"` + Permissions ACLChangeUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLChangeUserPermissions" json:"permissions,omitempty"` IsConfirmed bool `protobuf:"varint,5,opt,name=IsConfirmed,proto3" json:"IsConfirmed,omitempty"` } @@ -530,7 +530,7 @@ type ACLChangeUserAdd struct { Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLChangeUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=anytype.ACLChangeUserPermissions" json:"permissions,omitempty"` + Permissions ACLChangeUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLChangeUserPermissions" json:"permissions,omitempty"` } func (m *ACLChangeUserAdd) Reset() { *m = ACLChangeUserAdd{} } @@ -651,7 +651,7 @@ type ACLChangeUserInvite struct { AcceptPublicKey []byte `protobuf:"bytes,1,opt,name=acceptPublicKey,proto3" json:"acceptPublicKey,omitempty"` EncryptPublicKey []byte `protobuf:"bytes,2,opt,name=encryptPublicKey,proto3" json:"encryptPublicKey,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLChangeUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=anytype.ACLChangeUserPermissions" json:"permissions,omitempty"` + Permissions ACLChangeUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLChangeUserPermissions" json:"permissions,omitempty"` InviteId string `protobuf:"bytes,5,opt,name=InviteId,proto3" json:"InviteId,omitempty"` } @@ -913,7 +913,7 @@ func (m *ACLChangeReadKeyReplace) GetEncryptedReadKey() []byte { type ACLChangeUserPermissionChange struct { Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - Permissions ACLChangeUserPermissions `protobuf:"varint,2,opt,name=permissions,proto3,enum=anytype.ACLChangeUserPermissions" json:"permissions,omitempty"` + Permissions ACLChangeUserPermissions `protobuf:"varint,2,opt,name=permissions,proto3,enum=acl.ACLChangeUserPermissions" json:"permissions,omitempty"` } func (m *ACLChangeUserPermissionChange) Reset() { *m = ACLChangeUserPermissionChange{} } @@ -964,21 +964,21 @@ func (m *ACLChangeUserPermissionChange) GetPermissions() ACLChangeUserPermission } func init() { - proto.RegisterEnum("anytype.ACLChangeUserPermissions", ACLChangeUserPermissions_name, ACLChangeUserPermissions_value) - proto.RegisterType((*ACLChange)(nil), "anytype.ACLChange") - proto.RegisterType((*ACLChangeACLContentValue)(nil), "anytype.ACLChange.ACLContentValue") - proto.RegisterType((*ACLChangeACLData)(nil), "anytype.ACLChange.ACLData") - proto.RegisterType((*ACLChangeACLSnapshot)(nil), "anytype.ACLChange.ACLSnapshot") - proto.RegisterType((*ACLChangeACLState)(nil), "anytype.ACLChange.ACLState") - proto.RegisterMapType((map[string]*ACLChangeUserInvite)(nil), "anytype.ACLChange.ACLState.InvitesEntry") - proto.RegisterType((*ACLChangeUserState)(nil), "anytype.ACLChange.UserState") - proto.RegisterType((*ACLChangeUserAdd)(nil), "anytype.ACLChange.UserAdd") - proto.RegisterType((*ACLChangeUserConfirm)(nil), "anytype.ACLChange.UserConfirm") - proto.RegisterType((*ACLChangeUserInvite)(nil), "anytype.ACLChange.UserInvite") - proto.RegisterType((*ACLChangeUserJoin)(nil), "anytype.ACLChange.UserJoin") - proto.RegisterType((*ACLChangeUserRemove)(nil), "anytype.ACLChange.UserRemove") - proto.RegisterType((*ACLChangeReadKeyReplace)(nil), "anytype.ACLChange.ReadKeyReplace") - proto.RegisterType((*ACLChangeUserPermissionChange)(nil), "anytype.ACLChange.UserPermissionChange") + proto.RegisterEnum("acl.ACLChangeUserPermissions", ACLChangeUserPermissions_name, ACLChangeUserPermissions_value) + proto.RegisterType((*ACLChange)(nil), "acl.ACLChange") + proto.RegisterType((*ACLChangeACLContentValue)(nil), "acl.ACLChange.ACLContentValue") + proto.RegisterType((*ACLChangeACLData)(nil), "acl.ACLChange.ACLData") + proto.RegisterType((*ACLChangeACLSnapshot)(nil), "acl.ACLChange.ACLSnapshot") + proto.RegisterType((*ACLChangeACLState)(nil), "acl.ACLChange.ACLState") + proto.RegisterMapType((map[string]*ACLChangeUserInvite)(nil), "acl.ACLChange.ACLState.InvitesEntry") + proto.RegisterType((*ACLChangeUserState)(nil), "acl.ACLChange.UserState") + proto.RegisterType((*ACLChangeUserAdd)(nil), "acl.ACLChange.UserAdd") + proto.RegisterType((*ACLChangeUserConfirm)(nil), "acl.ACLChange.UserConfirm") + proto.RegisterType((*ACLChangeUserInvite)(nil), "acl.ACLChange.UserInvite") + proto.RegisterType((*ACLChangeUserJoin)(nil), "acl.ACLChange.UserJoin") + proto.RegisterType((*ACLChangeUserRemove)(nil), "acl.ACLChange.UserRemove") + proto.RegisterType((*ACLChangeReadKeyReplace)(nil), "acl.ACLChange.ReadKeyReplace") + proto.RegisterType((*ACLChangeUserPermissionChange)(nil), "acl.ACLChange.UserPermissionChange") } func init() { @@ -986,65 +986,64 @@ func init() { } var fileDescriptor_37a022c841a51877 = []byte{ - // 915 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x4d, 0x6f, 0xe3, 0x44, - 0x18, 0xf6, 0x24, 0x4d, 0x1d, 0xbf, 0x0e, 0x6d, 0x18, 0xf5, 0x60, 0x79, 0x8b, 0x09, 0x15, 0x82, - 0x08, 0xa1, 0x2c, 0xca, 0x22, 0xbe, 0x84, 0x04, 0x4d, 0x17, 0x48, 0x28, 0x87, 0xd5, 0xac, 0x00, - 0x81, 0xc4, 0x61, 0x6a, 0x0f, 0xad, 0xb5, 0x89, 0x6d, 0x79, 0x26, 0x15, 0xb9, 0xf0, 0x0f, 0x10, - 0xfc, 0x16, 0xae, 0x1c, 0xb8, 0xee, 0x71, 0x8f, 0x1c, 0x51, 0xfb, 0x0f, 0xf8, 0x05, 0x68, 0x3e, - 0xec, 0x38, 0xa9, 0x1d, 0x24, 0xb4, 0x12, 0xe2, 0x10, 0x69, 0xe6, 0x99, 0xe7, 0x1d, 0xbf, 0x1f, - 0xcf, 0xfb, 0x4e, 0xe0, 0xad, 0xec, 0xc9, 0xe5, 0x7d, 0x1a, 0xce, 0xe5, 0x2f, 0xbc, 0xa2, 0xc9, - 0x25, 0xe3, 0x72, 0x99, 0x5d, 0xdc, 0xcf, 0xf2, 0x54, 0xa4, 0xbc, 0x82, 0x8f, 0x14, 0x82, 0x6d, - 0x9a, 0xac, 0xc4, 0x2a, 0x63, 0x27, 0xbf, 0x1d, 0x81, 0x73, 0x7a, 0xf6, 0xc5, 0x99, 0x3a, 0xc5, - 0x03, 0x70, 0x45, 0xce, 0xd8, 0x94, 0xd1, 0x68, 0x16, 0x71, 0x0f, 0x0d, 0xda, 0x43, 0x87, 0x54, - 0x21, 0x1c, 0x00, 0xd0, 0x70, 0x5e, 0x10, 0x5a, 0x8a, 0x50, 0x41, 0xf0, 0x6b, 0x70, 0xc0, 0x13, - 0x9a, 0xf1, 0xab, 0x54, 0x4c, 0x28, 0x67, 0xb3, 0xc8, 0x6b, 0x0f, 0xd0, 0xd0, 0x21, 0x5b, 0x28, - 0x7e, 0x1b, 0x6c, 0x1a, 0xce, 0x1f, 0x52, 0x41, 0xbd, 0xbd, 0x01, 0x1a, 0xba, 0x63, 0x7f, 0x64, - 0x5c, 0x1a, 0x95, 0xee, 0xc8, 0x95, 0x64, 0x90, 0x82, 0x2a, 0xfd, 0x33, 0x71, 0x28, 0xcb, 0xce, - 0x00, 0x0d, 0x7b, 0xa4, 0x0a, 0xe1, 0x11, 0xe0, 0x70, 0x99, 0xe7, 0x2c, 0x11, 0x84, 0xd1, 0xe8, - 0x9c, 0xad, 0xa6, 0x94, 0x5f, 0x79, 0xfb, 0x03, 0x34, 0xdc, 0x23, 0x35, 0x27, 0xf8, 0x18, 0x1c, - 0x11, 0x2f, 0x18, 0x17, 0x74, 0x91, 0x79, 0xf6, 0x00, 0x0d, 0xdb, 0x64, 0x0d, 0x60, 0x1f, 0xba, - 0x71, 0xc4, 0x12, 0x11, 0x8b, 0x95, 0xd7, 0x55, 0x71, 0x94, 0x7b, 0xff, 0xd7, 0x36, 0x1c, 0x4a, - 0x57, 0xd3, 0x44, 0xb0, 0x44, 0x7c, 0x45, 0xe7, 0x4b, 0x86, 0xdf, 0x01, 0x7b, 0xc9, 0x59, 0x7e, - 0x1a, 0x45, 0x1e, 0x6a, 0x8c, 0xea, 0x4b, 0xcd, 0x98, 0x5a, 0xa4, 0x20, 0xe3, 0x8f, 0x00, 0xe4, - 0x92, 0xb0, 0x45, 0x7a, 0xcd, 0xbc, 0x96, 0x32, 0x7d, 0xa9, 0xc1, 0x54, 0x93, 0xa6, 0x16, 0xa9, - 0x98, 0xe0, 0xef, 0xe0, 0x48, 0xee, 0x1e, 0xb1, 0x7c, 0x11, 0x73, 0x1e, 0xa7, 0x89, 0x36, 0x50, - 0xc9, 0x77, 0xc7, 0xaf, 0x37, 0x5c, 0xb5, 0x4d, 0x9f, 0x5a, 0xa4, 0xf6, 0x9a, 0xc2, 0xbf, 0x59, - 0x72, 0x1d, 0x0b, 0x66, 0x0a, 0xd6, 0xe4, 0x9f, 0x26, 0x15, 0xfe, 0xe9, 0x1d, 0x7e, 0x1f, 0xba, - 0x72, 0xf7, 0x79, 0x1a, 0x27, 0xaa, 0x6a, 0xee, 0xf8, 0x5e, 0x83, 0xb9, 0xa4, 0x4c, 0x2d, 0x52, - 0xd2, 0xf1, 0x04, 0x5c, 0xb9, 0x3e, 0x4b, 0x93, 0xef, 0xe3, 0x7c, 0xa1, 0x4a, 0xe9, 0x8e, 0x83, - 0x06, 0x6b, 0xc3, 0x9a, 0x5a, 0xa4, 0x6a, 0x34, 0xb1, 0xa1, 0x73, 0x2d, 0x0b, 0xe4, 0xff, 0x8c, - 0xc0, 0x36, 0xaa, 0xc2, 0x1f, 0x83, 0x4b, 0xc3, 0xf9, 0x63, 0xa3, 0x4b, 0x53, 0xb0, 0xa0, 0x5e, - 0x86, 0x05, 0x8b, 0x54, 0x4d, 0xf0, 0x44, 0x35, 0x83, 0x51, 0x80, 0x6a, 0x06, 0x77, 0x7c, 0x52, - 0x7f, 0x41, 0x55, 0x26, 0xa4, 0x62, 0xe5, 0x7f, 0x0a, 0x6e, 0xe5, 0x7e, 0xfc, 0x2e, 0x74, 0xe5, - 0x17, 0x04, 0x15, 0xcc, 0x78, 0x74, 0xaf, 0xc1, 0x23, 0x49, 0x21, 0x25, 0xd9, 0xff, 0xa9, 0x05, - 0xdd, 0x02, 0xc6, 0xaf, 0xc2, 0x0b, 0xf9, 0x5a, 0xe4, 0x4c, 0x77, 0xf2, 0x1e, 0xd9, 0x04, 0xf1, - 0x87, 0xba, 0xaa, 0xca, 0x84, 0x1b, 0xf7, 0x8f, 0x1b, 0x12, 0xab, 0x3f, 0x57, 0xe1, 0xe3, 0x09, - 0xd8, 0xb1, 0x2a, 0x2e, 0xf7, 0xda, 0xca, 0x74, 0xb8, 0xc3, 0xd1, 0x91, 0xd6, 0x01, 0xff, 0x24, - 0x11, 0xf9, 0x8a, 0x14, 0x86, 0xfe, 0x37, 0xd0, 0xab, 0x1e, 0xe0, 0x3e, 0xb4, 0x9f, 0xb0, 0x95, - 0x0a, 0xdc, 0x21, 0x72, 0x89, 0x1f, 0x98, 0xca, 0xfd, 0x43, 0x53, 0xe8, 0x5b, 0x88, 0xe6, 0x7e, - 0xd0, 0x7a, 0x0f, 0xf9, 0xb7, 0x08, 0x9c, 0xd2, 0xf1, 0x8d, 0x46, 0x46, 0x9b, 0x8d, 0x2c, 0x93, - 0xc5, 0x92, 0x30, 0x5f, 0x65, 0x22, 0x4e, 0x93, 0x73, 0xb6, 0x52, 0x9f, 0xea, 0x91, 0x4d, 0x10, - 0xbf, 0x09, 0x2f, 0x1a, 0x80, 0x45, 0x66, 0x80, 0xe8, 0xc0, 0x7b, 0xe4, 0xee, 0x01, 0x7e, 0x08, - 0x6e, 0x56, 0x36, 0x11, 0x57, 0x1d, 0x73, 0x50, 0x2b, 0x8d, 0xcd, 0x36, 0xe4, 0xa4, 0x6a, 0x26, - 0xc7, 0xdd, 0x8c, 0x1b, 0x0d, 0xb3, 0x48, 0x35, 0x4e, 0x97, 0x54, 0x21, 0xff, 0x77, 0x04, 0xb6, - 0x99, 0x27, 0xff, 0xcf, 0x18, 0xfd, 0xcf, 0xc0, 0xad, 0x34, 0xee, 0xce, 0x20, 0x8e, 0xc1, 0x31, - 0x03, 0x73, 0x16, 0xa9, 0x00, 0x1c, 0xb2, 0x06, 0xfc, 0xbf, 0x10, 0xc0, 0x5a, 0x0a, 0x78, 0x08, - 0x87, 0x34, 0x0c, 0x59, 0x26, 0x1e, 0x2d, 0x2f, 0xe6, 0x71, 0x78, 0x6e, 0x64, 0xd5, 0x23, 0xdb, - 0x30, 0x7e, 0x03, 0xfa, 0x26, 0xb8, 0x35, 0x55, 0xa7, 0xe7, 0x0e, 0xfe, 0x9f, 0xa8, 0xc0, 0x87, - 0xae, 0x8e, 0x69, 0xa6, 0x25, 0xe0, 0x90, 0x72, 0xef, 0x3f, 0x45, 0xd0, 0x2d, 0xa6, 0xe6, 0x73, - 0x10, 0x40, 0x99, 0xb4, 0xc7, 0xf1, 0x65, 0x42, 0xc5, 0x32, 0xd7, 0x2f, 0x48, 0x99, 0xb4, 0x12, - 0xc6, 0x27, 0xd0, 0x5b, 0x8f, 0xf7, 0x59, 0xa4, 0x62, 0x73, 0xc8, 0x06, 0x56, 0x9f, 0xac, 0x4e, - 0x43, 0xb2, 0xfc, 0xa5, 0x2e, 0x9f, 0x79, 0xd0, 0x76, 0xc5, 0x72, 0x0e, 0x87, 0x66, 0x90, 0x11, - 0x96, 0xcd, 0x69, 0x58, 0x4e, 0xa0, 0x57, 0x6a, 0x52, 0x4b, 0x36, 0x98, 0x64, 0xdb, 0xd2, 0xff, - 0x11, 0x0e, 0x36, 0x29, 0xcf, 0x21, 0x8d, 0x6b, 0x45, 0x95, 0xf1, 0x99, 0x3c, 0xde, 0xc1, 0xfd, - 0x1f, 0xe0, 0xa8, 0xee, 0x29, 0xde, 0xe9, 0xc5, 0x96, 0xae, 0x5a, 0xff, 0x4a, 0x57, 0x27, 0xa7, - 0x70, 0xb8, 0x75, 0x8e, 0x1d, 0xe8, 0x9c, 0x46, 0x8b, 0x38, 0xe9, 0x5b, 0x18, 0x60, 0xff, 0xeb, - 0x3c, 0x16, 0x2c, 0xef, 0x23, 0xb9, 0x96, 0xee, 0xb2, 0xbc, 0xdf, 0xc2, 0x2e, 0xd8, 0xba, 0x44, - 0x51, 0xbf, 0x3d, 0x79, 0xf9, 0xe9, 0x4d, 0x80, 0x9e, 0xdd, 0x04, 0xe8, 0xcf, 0x9b, 0x00, 0xfd, - 0x72, 0x1b, 0x58, 0xcf, 0x6e, 0x03, 0xeb, 0x8f, 0xdb, 0xc0, 0xfa, 0xb6, 0xa3, 0xfe, 0x7f, 0x5e, - 0xec, 0xab, 0xbf, 0x9b, 0x0f, 0xfe, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x12, 0x23, 0x4c, 0xb6, 0xa2, - 0x0a, 0x00, 0x00, + // 912 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x4f, 0x6f, 0xe3, 0x44, + 0x14, 0xf7, 0x24, 0x4d, 0x13, 0x3f, 0x87, 0x36, 0x0c, 0x2b, 0xd6, 0x8c, 0x96, 0x10, 0x95, 0x15, + 0x8a, 0x10, 0x4a, 0x57, 0x59, 0x21, 0xad, 0x00, 0x55, 0xb4, 0x05, 0x6d, 0x42, 0x39, 0xac, 0x66, + 0xb5, 0x20, 0xb8, 0x4d, 0xed, 0xa1, 0xb5, 0xd6, 0xb1, 0x8d, 0x67, 0x52, 0x29, 0x17, 0x24, 0x4e, + 0x5c, 0x39, 0xf3, 0x55, 0xf8, 0x02, 0x7b, 0xdc, 0x23, 0x37, 0x50, 0x7b, 0xe7, 0xc2, 0x17, 0x40, + 0xf3, 0xc7, 0x8e, 0x93, 0x78, 0x23, 0x21, 0x55, 0x48, 0x7b, 0xa8, 0x34, 0xf3, 0x7b, 0xbf, 0x37, + 0x7d, 0x7f, 0x7e, 0xef, 0x39, 0xf0, 0x20, 0x7b, 0x7e, 0x71, 0xc8, 0x82, 0x58, 0xfd, 0x05, 0x97, + 0x2c, 0xb9, 0xe0, 0x42, 0x1d, 0xb3, 0xf3, 0xc3, 0x2c, 0x4f, 0x65, 0x2a, 0x2a, 0xf8, 0x48, 0x23, + 0xb8, 0xc9, 0x82, 0xf8, 0xe0, 0x9f, 0xb7, 0xc0, 0x3d, 0x3e, 0xfd, 0xfa, 0x54, 0x5b, 0xf0, 0x00, + 0x3c, 0x99, 0x73, 0x3e, 0xe1, 0x2c, 0x9c, 0x86, 0xc2, 0x47, 0x83, 0xe6, 0xd0, 0xa5, 0x55, 0x08, + 0xf7, 0x01, 0x58, 0x10, 0x17, 0x84, 0x86, 0x26, 0x54, 0x10, 0xfc, 0x01, 0xec, 0x89, 0x84, 0x65, + 0xe2, 0x32, 0x95, 0x27, 0x4c, 0xf0, 0x69, 0xe8, 0x37, 0x07, 0x68, 0xe8, 0xd2, 0x35, 0x14, 0x3f, + 0x80, 0x36, 0x0b, 0xe2, 0x2f, 0x98, 0x64, 0xfe, 0xce, 0x00, 0x0d, 0xbd, 0xf1, 0xdb, 0x23, 0x16, + 0xc4, 0xa3, 0x32, 0x14, 0x75, 0x52, 0x56, 0x5a, 0xd0, 0x54, 0x6c, 0x36, 0x7e, 0xed, 0xd5, 0x1a, + 0xa0, 0x61, 0x97, 0x56, 0x21, 0x3c, 0x02, 0x1c, 0xcc, 0xf3, 0x9c, 0x27, 0x92, 0x72, 0x16, 0x9e, + 0xf1, 0xc5, 0x84, 0x89, 0x4b, 0x7f, 0x77, 0x80, 0x86, 0x3b, 0xb4, 0xc6, 0x82, 0xef, 0x81, 0x2b, + 0xa3, 0x19, 0x17, 0x92, 0xcd, 0x32, 0xbf, 0x3d, 0x40, 0xc3, 0x26, 0x5d, 0x02, 0x98, 0x40, 0x27, + 0x0a, 0x79, 0x22, 0x23, 0xb9, 0xf0, 0x3b, 0x3a, 0x87, 0xf2, 0x4e, 0x7e, 0x6b, 0xc2, 0xbe, 0x0a, + 0x35, 0x4d, 0x24, 0x4f, 0xe4, 0x37, 0x2c, 0x9e, 0x73, 0x3c, 0x86, 0xf6, 0x5c, 0xf0, 0xfc, 0x38, + 0x0c, 0x7d, 0x54, 0x9b, 0xd1, 0x33, 0x63, 0x9d, 0x38, 0xb4, 0x20, 0xe2, 0x4f, 0x01, 0xd4, 0x91, + 0xf2, 0x59, 0x7a, 0xc5, 0xfd, 0x86, 0x76, 0x7b, 0xa7, 0xc6, 0xcd, 0x10, 0x26, 0x0e, 0xad, 0xd0, + 0xf1, 0x77, 0x70, 0x47, 0xdd, 0x9e, 0xf0, 0x7c, 0x16, 0x09, 0x11, 0xa5, 0x89, 0x71, 0xd0, 0x05, + 0xf7, 0xc6, 0xef, 0xd7, 0x3c, 0xb3, 0x4e, 0x9d, 0x38, 0xb4, 0xf6, 0x89, 0x22, 0xae, 0x69, 0x72, + 0x15, 0x49, 0x6e, 0x1b, 0x54, 0x17, 0x97, 0x21, 0x14, 0x71, 0x99, 0x1b, 0xfe, 0x18, 0x3a, 0xea, + 0xf6, 0x55, 0x1a, 0x25, 0xba, 0x4b, 0xde, 0xf8, 0x6e, 0x8d, 0xab, 0x32, 0x4f, 0x1c, 0x5a, 0x52, + 0xf1, 0x11, 0x78, 0xea, 0x7c, 0x9a, 0x26, 0x3f, 0x44, 0xf9, 0x4c, 0xb7, 0xcd, 0x1b, 0x93, 0x1a, + 0x4f, 0xcb, 0x98, 0x38, 0xb4, 0xea, 0x70, 0xd2, 0x86, 0xd6, 0x95, 0x6a, 0x04, 0xf9, 0x05, 0x41, + 0xdb, 0xaa, 0x07, 0x7f, 0x06, 0x1e, 0x0b, 0xe2, 0xa7, 0x56, 0x7b, 0xb6, 0x31, 0x64, 0x53, 0x6a, + 0x05, 0x83, 0x56, 0xe9, 0xf8, 0x48, 0x8b, 0xdd, 0x76, 0x59, 0x8b, 0xdd, 0x1b, 0xf7, 0x37, 0x9d, + 0xab, 0x32, 0xa0, 0x15, 0x0f, 0x72, 0x02, 0x5e, 0xe5, 0x6d, 0xfc, 0x10, 0x3a, 0xea, 0x75, 0xc9, + 0x24, 0xb7, 0x91, 0xdc, 0xad, 0x89, 0x44, 0x99, 0x69, 0x49, 0x24, 0x3f, 0x37, 0xa0, 0x53, 0xc0, + 0xf8, 0x3e, 0xbc, 0x91, 0x2f, 0x05, 0xcc, 0xcd, 0x84, 0xee, 0xd0, 0x55, 0x10, 0x3f, 0x32, 0xdd, + 0xd3, 0x2e, 0xc2, 0x86, 0xed, 0xd7, 0x14, 0xd2, 0xfc, 0xab, 0x0a, 0x17, 0x1f, 0x41, 0x3b, 0xd2, + 0x4d, 0x14, 0x7e, 0x53, 0xbb, 0xdd, 0x7f, 0x45, 0x80, 0x23, 0xd3, 0x6b, 0xf1, 0x65, 0x22, 0xf3, + 0x05, 0x2d, 0x9c, 0xc8, 0x33, 0xe8, 0x56, 0x0d, 0xb8, 0x07, 0xcd, 0xe7, 0x7c, 0xa1, 0x93, 0x75, + 0xa9, 0x3a, 0xe2, 0x43, 0xdb, 0xa5, 0x2d, 0x62, 0x37, 0x2f, 0x50, 0xc3, 0xfb, 0xa4, 0xf1, 0x08, + 0x91, 0x3f, 0x11, 0xb8, 0x65, 0xc0, 0x2b, 0x83, 0x89, 0x56, 0x07, 0x53, 0x15, 0x88, 0x27, 0x41, + 0xbe, 0xc8, 0x64, 0x94, 0x26, 0x67, 0x7c, 0xa1, 0xff, 0x4d, 0x97, 0xae, 0x82, 0xf8, 0x23, 0x78, + 0xd3, 0x02, 0x3c, 0xb4, 0x0b, 0xc1, 0x24, 0xdc, 0xa5, 0x9b, 0x06, 0xfc, 0x39, 0x78, 0x59, 0x39, + 0x20, 0x42, 0x4f, 0xc3, 0xde, 0x86, 0x0c, 0x56, 0xc7, 0x4b, 0xd0, 0xaa, 0x8b, 0x5a, 0x5d, 0x53, + 0x61, 0x75, 0xca, 0x43, 0x3d, 0x14, 0x1d, 0x5a, 0x85, 0xc8, 0xef, 0x08, 0xda, 0x76, 0x3f, 0xbc, + 0x7e, 0xf9, 0x91, 0xc7, 0xe0, 0x55, 0x06, 0x73, 0x6b, 0x02, 0xf7, 0xc0, 0xb5, 0xcb, 0x6f, 0x1a, + 0xea, 0xe0, 0x5d, 0xba, 0x04, 0xc8, 0xdf, 0x08, 0x60, 0x29, 0x01, 0x3c, 0x84, 0x7d, 0x16, 0x04, + 0x3c, 0x93, 0x4f, 0xe6, 0xe7, 0x71, 0x14, 0x9c, 0x59, 0x29, 0x75, 0xe9, 0x3a, 0x8c, 0x3f, 0x84, + 0x9e, 0x4d, 0x6c, 0x49, 0x35, 0xa5, 0xd9, 0xc0, 0xff, 0xf7, 0xee, 0x13, 0xe8, 0x98, 0x7c, 0xa6, + 0xa6, 0xf5, 0x2e, 0x2d, 0xef, 0xe4, 0x05, 0x82, 0x4e, 0xb1, 0x0d, 0x6f, 0xa1, 0xf1, 0x65, 0xc1, + 0x9e, 0x46, 0x17, 0x09, 0x93, 0xf3, 0xdc, 0x7c, 0x0d, 0xca, 0x82, 0x95, 0x30, 0x3e, 0x80, 0xee, + 0x72, 0x65, 0x4f, 0x43, 0x9d, 0x97, 0x4b, 0x57, 0xb0, 0xfa, 0x42, 0xb5, 0x5e, 0x51, 0x28, 0xf2, + 0xa3, 0x69, 0x9d, 0xfd, 0x38, 0x6d, 0xcb, 0xe5, 0x31, 0xec, 0xdb, 0x85, 0x45, 0x79, 0x16, 0xb3, + 0xa0, 0xdc, 0x36, 0xef, 0xae, 0x95, 0x95, 0xae, 0xb0, 0xe8, 0xba, 0x17, 0xf9, 0x09, 0xf6, 0x56, + 0x29, 0xb7, 0x50, 0xc2, 0xa5, 0x92, 0xca, 0xdc, 0x6c, 0x0d, 0x37, 0x70, 0x22, 0xe1, 0x4e, 0xdd, + 0x67, 0x75, 0x6b, 0x14, 0x6b, 0x7a, 0x6a, 0xfc, 0x67, 0x3d, 0x1d, 0x1c, 0xc3, 0xfe, 0x9a, 0x1d, + 0xbb, 0xd0, 0x3a, 0x0e, 0x67, 0x51, 0xd2, 0x73, 0x30, 0xc0, 0xee, 0xb7, 0x79, 0x24, 0x79, 0xde, + 0x43, 0xea, 0xac, 0x42, 0xe5, 0x79, 0xaf, 0x81, 0x3d, 0x68, 0x9b, 0xd6, 0x84, 0xbd, 0xe6, 0xc9, + 0x7b, 0x2f, 0xae, 0xfb, 0xe8, 0xe5, 0x75, 0x1f, 0xfd, 0x75, 0xdd, 0x47, 0xbf, 0xde, 0xf4, 0x9d, + 0x97, 0x37, 0x7d, 0xe7, 0x8f, 0x9b, 0xbe, 0xf3, 0x7d, 0x4b, 0xff, 0x66, 0x3c, 0xdf, 0xd5, 0x3f, + 0x11, 0x1f, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x84, 0xb4, 0xc9, 0x56, 0x0a, 0x00, 0x00, } func (m *ACLChange) Marshal() (dAtA []byte, err error) { diff --git a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto index 582c5eac..1906e1e5 100644 --- a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto +++ b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -package anytype; +package acl; option go_package = "aclpb"; // the element of change tree used to store and internal apply smartBlock history diff --git a/service/sync/syncpb/protos/sync.proto b/service/sync/syncpb/protos/sync.proto new file mode 100644 index 00000000..ca2c3fb8 --- /dev/null +++ b/service/sync/syncpb/protos/sync.proto @@ -0,0 +1,31 @@ +syntax = "proto3"; +package anytype; +option go_package = "syncpb"; + +import "pkg/acl/aclchanges/aclpb/protos/aclchanges.proto"; + +message Sync { + message HeadUpdate { + repeated Head heads = 1; + repeated acl.ACLChange changes = 2; + string senderId = 3; + } + + message Head { + string id = 1; + repeated string snapshotPath = 2; + } + + message Full { + // here with send the request with all changes we have (we already know sender's snapshot path) + message Request { + repeated Head heads = 1; + repeated acl.ACLChange changes = 2; + } + + message Response { + repeated Head heads = 1; + repeated acl.ACLChange changes = 2; + } + } +} \ No newline at end of file diff --git a/service/sync/syncpb/sync.pb.go b/service/sync/syncpb/sync.pb.go new file mode 100644 index 00000000..12ddf234 --- /dev/null +++ b/service/sync/syncpb/sync.pb.go @@ -0,0 +1,1400 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: service/sync/syncpb/protos/sync.proto + +package syncpb + +import ( + fmt "fmt" + aclpb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type Sync struct { +} + +func (m *Sync) Reset() { *m = Sync{} } +func (m *Sync) String() string { return proto.CompactTextString(m) } +func (*Sync) ProtoMessage() {} +func (*Sync) Descriptor() ([]byte, []int) { + return fileDescriptor_5f66cdd599c6466f, []int{0} +} +func (m *Sync) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Sync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Sync.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Sync) XXX_Merge(src proto.Message) { + xxx_messageInfo_Sync.Merge(m, src) +} +func (m *Sync) XXX_Size() int { + return m.Size() +} +func (m *Sync) XXX_DiscardUnknown() { + xxx_messageInfo_Sync.DiscardUnknown(m) +} + +var xxx_messageInfo_Sync proto.InternalMessageInfo + +type SyncHeadUpdate struct { + Heads []*SyncHead `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.ACLChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + SenderId string `protobuf:"bytes,3,opt,name=senderId,proto3" json:"senderId,omitempty"` +} + +func (m *SyncHeadUpdate) Reset() { *m = SyncHeadUpdate{} } +func (m *SyncHeadUpdate) String() string { return proto.CompactTextString(m) } +func (*SyncHeadUpdate) ProtoMessage() {} +func (*SyncHeadUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_5f66cdd599c6466f, []int{0, 0} +} +func (m *SyncHeadUpdate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncHeadUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncHeadUpdate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncHeadUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncHeadUpdate.Merge(m, src) +} +func (m *SyncHeadUpdate) XXX_Size() int { + return m.Size() +} +func (m *SyncHeadUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_SyncHeadUpdate.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncHeadUpdate proto.InternalMessageInfo + +func (m *SyncHeadUpdate) GetHeads() []*SyncHead { + if m != nil { + return m.Heads + } + return nil +} + +func (m *SyncHeadUpdate) GetChanges() []*aclpb.ACLChange { + if m != nil { + return m.Changes + } + return nil +} + +func (m *SyncHeadUpdate) GetSenderId() string { + if m != nil { + return m.SenderId + } + return "" +} + +type SyncHead struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + SnapshotPath []string `protobuf:"bytes,2,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` +} + +func (m *SyncHead) Reset() { *m = SyncHead{} } +func (m *SyncHead) String() string { return proto.CompactTextString(m) } +func (*SyncHead) ProtoMessage() {} +func (*SyncHead) Descriptor() ([]byte, []int) { + return fileDescriptor_5f66cdd599c6466f, []int{0, 1} +} +func (m *SyncHead) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncHead) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncHead.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncHead) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncHead.Merge(m, src) +} +func (m *SyncHead) XXX_Size() int { + return m.Size() +} +func (m *SyncHead) XXX_DiscardUnknown() { + xxx_messageInfo_SyncHead.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncHead proto.InternalMessageInfo + +func (m *SyncHead) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *SyncHead) GetSnapshotPath() []string { + if m != nil { + return m.SnapshotPath + } + return nil +} + +type SyncFull struct { +} + +func (m *SyncFull) Reset() { *m = SyncFull{} } +func (m *SyncFull) String() string { return proto.CompactTextString(m) } +func (*SyncFull) ProtoMessage() {} +func (*SyncFull) Descriptor() ([]byte, []int) { + return fileDescriptor_5f66cdd599c6466f, []int{0, 2} +} +func (m *SyncFull) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncFull) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncFull.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncFull) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncFull.Merge(m, src) +} +func (m *SyncFull) XXX_Size() int { + return m.Size() +} +func (m *SyncFull) XXX_DiscardUnknown() { + xxx_messageInfo_SyncFull.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncFull proto.InternalMessageInfo + +// here with send the request with all changes we have (we already know sender's snapshot path) +type SyncFullRequest struct { + Heads []*SyncHead `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.ACLChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` +} + +func (m *SyncFullRequest) Reset() { *m = SyncFullRequest{} } +func (m *SyncFullRequest) String() string { return proto.CompactTextString(m) } +func (*SyncFullRequest) ProtoMessage() {} +func (*SyncFullRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_5f66cdd599c6466f, []int{0, 2, 0} +} +func (m *SyncFullRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncFullRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncFullRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncFullRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncFullRequest.Merge(m, src) +} +func (m *SyncFullRequest) XXX_Size() int { + return m.Size() +} +func (m *SyncFullRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SyncFullRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncFullRequest proto.InternalMessageInfo + +func (m *SyncFullRequest) GetHeads() []*SyncHead { + if m != nil { + return m.Heads + } + return nil +} + +func (m *SyncFullRequest) GetChanges() []*aclpb.ACLChange { + if m != nil { + return m.Changes + } + return nil +} + +type SyncFullResponse struct { + Heads []*SyncHead `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.ACLChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` +} + +func (m *SyncFullResponse) Reset() { *m = SyncFullResponse{} } +func (m *SyncFullResponse) String() string { return proto.CompactTextString(m) } +func (*SyncFullResponse) ProtoMessage() {} +func (*SyncFullResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_5f66cdd599c6466f, []int{0, 2, 1} +} +func (m *SyncFullResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncFullResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncFullResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncFullResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncFullResponse.Merge(m, src) +} +func (m *SyncFullResponse) XXX_Size() int { + return m.Size() +} +func (m *SyncFullResponse) XXX_DiscardUnknown() { + xxx_messageInfo_SyncFullResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncFullResponse proto.InternalMessageInfo + +func (m *SyncFullResponse) GetHeads() []*SyncHead { + if m != nil { + return m.Heads + } + return nil +} + +func (m *SyncFullResponse) GetChanges() []*aclpb.ACLChange { + if m != nil { + return m.Changes + } + return nil +} + +func init() { + proto.RegisterType((*Sync)(nil), "anytype.Sync") + proto.RegisterType((*SyncHeadUpdate)(nil), "anytype.Sync.HeadUpdate") + proto.RegisterType((*SyncHead)(nil), "anytype.Sync.Head") + proto.RegisterType((*SyncFull)(nil), "anytype.Sync.Full") + proto.RegisterType((*SyncFullRequest)(nil), "anytype.Sync.Full.Request") + proto.RegisterType((*SyncFullResponse)(nil), "anytype.Sync.Full.Response") +} + +func init() { + proto.RegisterFile("service/sync/syncpb/protos/sync.proto", fileDescriptor_5f66cdd599c6466f) +} + +var fileDescriptor_5f66cdd599c6466f = []byte{ + // 300 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2d, 0x4e, 0x2d, 0x2a, + 0xcb, 0x4c, 0x4e, 0xd5, 0x2f, 0xae, 0xcc, 0x4b, 0x06, 0x13, 0x05, 0x49, 0xfa, 0x05, 0x45, 0xf9, + 0x25, 0xf9, 0xc5, 0x60, 0x9e, 0x1e, 0x98, 0x2d, 0xc4, 0x9e, 0x98, 0x57, 0x59, 0x52, 0x59, 0x90, + 0x2a, 0x65, 0x50, 0x90, 0x9d, 0xae, 0x9f, 0x98, 0x9c, 0x03, 0xc2, 0xc9, 0x19, 0x89, 0x79, 0xe9, + 0xa9, 0xc5, 0x20, 0x26, 0x42, 0x13, 0x42, 0x1c, 0xa2, 0x55, 0xa9, 0x83, 0x99, 0x8b, 0x25, 0xb8, + 0x32, 0x2f, 0x59, 0xaa, 0x86, 0x8b, 0xcb, 0x23, 0x35, 0x31, 0x25, 0xb4, 0x20, 0x25, 0xb1, 0x24, + 0x55, 0x48, 0x83, 0x8b, 0x35, 0x23, 0x35, 0x31, 0xa5, 0x58, 0x82, 0x51, 0x81, 0x59, 0x83, 0xdb, + 0x48, 0x48, 0x0f, 0x6a, 0x83, 0x1e, 0x48, 0xad, 0x1e, 0x48, 0x61, 0x10, 0x44, 0x81, 0x90, 0x06, + 0x17, 0x3b, 0xd4, 0x44, 0x09, 0x26, 0xb0, 0x5a, 0x3e, 0xbd, 0xc4, 0xe4, 0x1c, 0x3d, 0x47, 0x67, + 0x1f, 0x67, 0xb0, 0x70, 0x10, 0x4c, 0x5a, 0x48, 0x8a, 0x8b, 0xa3, 0x38, 0x35, 0x2f, 0x25, 0xb5, + 0xc8, 0x33, 0x45, 0x82, 0x59, 0x81, 0x51, 0x83, 0x33, 0x08, 0xce, 0x97, 0xb2, 0xe2, 0x62, 0x01, + 0x19, 0x2a, 0xc4, 0xc7, 0xc5, 0x94, 0x99, 0x22, 0xc1, 0x08, 0x96, 0x65, 0xca, 0x4c, 0x11, 0x52, + 0xe2, 0xe2, 0x29, 0xce, 0x4b, 0x2c, 0x28, 0xce, 0xc8, 0x2f, 0x09, 0x48, 0x2c, 0xc9, 0x00, 0x5b, + 0xc1, 0x19, 0x84, 0x22, 0x26, 0x75, 0x94, 0x91, 0x8b, 0xc5, 0xad, 0x34, 0x27, 0x47, 0x2a, 0x96, + 0x8b, 0x3d, 0x28, 0xb5, 0xb0, 0x34, 0xb5, 0xb8, 0x84, 0x16, 0xee, 0x97, 0x8a, 0xe3, 0xe2, 0x08, + 0x4a, 0x2d, 0x2e, 0xc8, 0xcf, 0x2b, 0xa6, 0x49, 0xf8, 0x38, 0x29, 0x9c, 0x78, 0x24, 0xc7, 0x78, + 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, + 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x14, 0x1b, 0x24, 0xe6, 0x93, 0xd8, 0xc0, 0x71, 0x66, 0x0c, 0x08, + 0x00, 0x00, 0xff, 0xff, 0x9a, 0x7b, 0x0b, 0x1c, 0x17, 0x02, 0x00, 0x00, +} + +func (m *Sync) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Sync) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Sync) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *SyncHeadUpdate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncHeadUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SenderId) > 0 { + i -= len(m.SenderId) + copy(dAtA[i:], m.SenderId) + i = encodeVarintSync(dAtA, i, uint64(len(m.SenderId))) + i-- + dAtA[i] = 0x1a + } + if len(m.Changes) > 0 { + for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Heads) > 0 { + for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Heads[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *SyncHead) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncHead) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncHead) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintSync(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SyncFull) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncFull) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncFull) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *SyncFullRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncFullRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncFullRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Changes) > 0 { + for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Heads) > 0 { + for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Heads[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *SyncFullResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncFullResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncFullResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Changes) > 0 { + for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Heads) > 0 { + for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Heads[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintSync(dAtA []byte, offset int, v uint64) int { + offset -= sovSync(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Sync) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *SyncHeadUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Heads) > 0 { + for _, e := range m.Heads { + l = e.Size() + n += 1 + l + sovSync(uint64(l)) + } + } + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovSync(uint64(l)) + } + } + l = len(m.SenderId) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } + return n +} + +func (m *SyncHead) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } + if len(m.SnapshotPath) > 0 { + for _, s := range m.SnapshotPath { + l = len(s) + n += 1 + l + sovSync(uint64(l)) + } + } + return n +} + +func (m *SyncFull) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *SyncFullRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Heads) > 0 { + for _, e := range m.Heads { + l = e.Size() + n += 1 + l + sovSync(uint64(l)) + } + } + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovSync(uint64(l)) + } + } + return n +} + +func (m *SyncFullResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Heads) > 0 { + for _, e := range m.Heads { + l = e.Size() + n += 1 + l + sovSync(uint64(l)) + } + } + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovSync(uint64(l)) + } + } + return n +} + +func sovSync(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozSync(x uint64) (n int) { + return sovSync(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Sync) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Sync: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Sync: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HeadUpdate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HeadUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Heads = append(m.Heads, &SyncHead{}) + if err := m.Heads[len(m.Heads)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, &aclpb.ACLChange{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SenderId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SenderId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncHead) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Head: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Head: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncFull) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Full: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Full: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncFullRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Heads = append(m.Heads, &SyncHead{}) + if err := m.Heads[len(m.Heads)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, &aclpb.ACLChange{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncFullResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Heads = append(m.Heads, &SyncHead{}) + if err := m.Heads[len(m.Heads)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, &aclpb.ACLChange{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipSync(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSync + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSync + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSync + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthSync + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupSync + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthSync + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthSync = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowSync = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupSync = fmt.Errorf("proto: unexpected end of group") +) From 2893c4b4ad1b8bd512c457f6677a62b8496d074e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 15 Jul 2022 09:39:16 +0200 Subject: [PATCH 08/40] Use pb rawchanges instead of treestorage.RawChange --- pkg/acl/aclchanges/aclpb/aclchanges.pb.go | 421 +++++++++++++++--- .../aclchanges/aclpb/protos/aclchanges.proto | 6 + pkg/acl/acltree/acltree.go | 3 +- pkg/acl/acltree/acltreestorage.go | 5 +- pkg/acl/acltree/change.go | 3 +- pkg/acl/acltree/changeloader.go | 2 +- pkg/acl/example/plaintextdocument/document.go | 2 +- .../treestoragebuilder/treestoragebuilder.go | 13 +- pkg/acl/treestorage/inmemory.go | 13 +- pkg/acl/treestorage/storage.go | 11 +- service/sync/syncpb/protos/sync.proto | 10 +- service/sync/syncpb/sync.pb.go | 182 ++++++-- 12 files changed, 528 insertions(+), 143 deletions(-) diff --git a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go index 1cce6bf3..4a892fdf 100644 --- a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go +++ b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go @@ -50,7 +50,67 @@ func (x ACLChangeUserPermissions) String() string { } func (ACLChangeUserPermissions) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 0} + return fileDescriptor_37a022c841a51877, []int{1, 0} +} + +type RawChange struct { + Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` +} + +func (m *RawChange) Reset() { *m = RawChange{} } +func (m *RawChange) String() string { return proto.CompactTextString(m) } +func (*RawChange) ProtoMessage() {} +func (*RawChange) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{0} +} +func (m *RawChange) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RawChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RawChange.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RawChange) XXX_Merge(src proto.Message) { + xxx_messageInfo_RawChange.Merge(m, src) +} +func (m *RawChange) XXX_Size() int { + return m.Size() +} +func (m *RawChange) XXX_DiscardUnknown() { + xxx_messageInfo_RawChange.DiscardUnknown(m) +} + +var xxx_messageInfo_RawChange proto.InternalMessageInfo + +func (m *RawChange) GetPayload() []byte { + if m != nil { + return m.Payload + } + return nil +} + +func (m *RawChange) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *RawChange) GetId() string { + if m != nil { + return m.Id + } + return "" } // the element of change tree used to store and internal apply smartBlock history @@ -70,7 +130,7 @@ func (m *ACLChange) Reset() { *m = ACLChange{} } func (m *ACLChange) String() string { return proto.CompactTextString(m) } func (*ACLChange) ProtoMessage() {} func (*ACLChange) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0} + return fileDescriptor_37a022c841a51877, []int{1} } func (m *ACLChange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -170,7 +230,7 @@ func (m *ACLChangeACLContentValue) Reset() { *m = ACLChangeACLContentVal func (m *ACLChangeACLContentValue) String() string { return proto.CompactTextString(m) } func (*ACLChangeACLContentValue) ProtoMessage() {} func (*ACLChangeACLContentValue) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 0} + return fileDescriptor_37a022c841a51877, []int{1, 0} } func (m *ACLChangeACLContentValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -301,7 +361,7 @@ func (m *ACLChangeACLData) Reset() { *m = ACLChangeACLData{} } func (m *ACLChangeACLData) String() string { return proto.CompactTextString(m) } func (*ACLChangeACLData) ProtoMessage() {} func (*ACLChangeACLData) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 1} + return fileDescriptor_37a022c841a51877, []int{1, 1} } func (m *ACLChangeACLData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -353,7 +413,7 @@ func (m *ACLChangeACLSnapshot) Reset() { *m = ACLChangeACLSnapshot{} } func (m *ACLChangeACLSnapshot) String() string { return proto.CompactTextString(m) } func (*ACLChangeACLSnapshot) ProtoMessage() {} func (*ACLChangeACLSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 2} + return fileDescriptor_37a022c841a51877, []int{1, 2} } func (m *ACLChangeACLSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -399,7 +459,7 @@ func (m *ACLChangeACLState) Reset() { *m = ACLChangeACLState{} } func (m *ACLChangeACLState) String() string { return proto.CompactTextString(m) } func (*ACLChangeACLState) ProtoMessage() {} func (*ACLChangeACLState) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 3} + return fileDescriptor_37a022c841a51877, []int{1, 3} } func (m *ACLChangeACLState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -461,7 +521,7 @@ func (m *ACLChangeUserState) Reset() { *m = ACLChangeUserState{} } func (m *ACLChangeUserState) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserState) ProtoMessage() {} func (*ACLChangeUserState) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 4} + return fileDescriptor_37a022c841a51877, []int{1, 4} } func (m *ACLChangeUserState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -537,7 +597,7 @@ func (m *ACLChangeUserAdd) Reset() { *m = ACLChangeUserAdd{} } func (m *ACLChangeUserAdd) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserAdd) ProtoMessage() {} func (*ACLChangeUserAdd) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 5} + return fileDescriptor_37a022c841a51877, []int{1, 5} } func (m *ACLChangeUserAdd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -604,7 +664,7 @@ func (m *ACLChangeUserConfirm) Reset() { *m = ACLChangeUserConfirm{} } func (m *ACLChangeUserConfirm) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserConfirm) ProtoMessage() {} func (*ACLChangeUserConfirm) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 6} + return fileDescriptor_37a022c841a51877, []int{1, 6} } func (m *ACLChangeUserConfirm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -659,7 +719,7 @@ func (m *ACLChangeUserInvite) Reset() { *m = ACLChangeUserInvite{} } func (m *ACLChangeUserInvite) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserInvite) ProtoMessage() {} func (*ACLChangeUserInvite) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 7} + return fileDescriptor_37a022c841a51877, []int{1, 7} } func (m *ACLChangeUserInvite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -735,7 +795,7 @@ func (m *ACLChangeUserJoin) Reset() { *m = ACLChangeUserJoin{} } func (m *ACLChangeUserJoin) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserJoin) ProtoMessage() {} func (*ACLChangeUserJoin) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 8} + return fileDescriptor_37a022c841a51877, []int{1, 8} } func (m *ACLChangeUserJoin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -808,7 +868,7 @@ func (m *ACLChangeUserRemove) Reset() { *m = ACLChangeUserRemove{} } func (m *ACLChangeUserRemove) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserRemove) ProtoMessage() {} func (*ACLChangeUserRemove) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 9} + return fileDescriptor_37a022c841a51877, []int{1, 9} } func (m *ACLChangeUserRemove) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -861,7 +921,7 @@ func (m *ACLChangeReadKeyReplace) Reset() { *m = ACLChangeReadKeyReplace func (m *ACLChangeReadKeyReplace) String() string { return proto.CompactTextString(m) } func (*ACLChangeReadKeyReplace) ProtoMessage() {} func (*ACLChangeReadKeyReplace) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 10} + return fileDescriptor_37a022c841a51877, []int{1, 10} } func (m *ACLChangeReadKeyReplace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -920,7 +980,7 @@ func (m *ACLChangeUserPermissionChange) Reset() { *m = ACLChangeUserPerm func (m *ACLChangeUserPermissionChange) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserPermissionChange) ProtoMessage() {} func (*ACLChangeUserPermissionChange) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0, 11} + return fileDescriptor_37a022c841a51877, []int{1, 11} } func (m *ACLChangeUserPermissionChange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -965,6 +1025,7 @@ func (m *ACLChangeUserPermissionChange) GetPermissions() ACLChangeUserPermission func init() { proto.RegisterEnum("acl.ACLChangeUserPermissions", ACLChangeUserPermissions_name, ACLChangeUserPermissions_value) + proto.RegisterType((*RawChange)(nil), "acl.RawChange") proto.RegisterType((*ACLChange)(nil), "acl.ACLChange") proto.RegisterType((*ACLChangeACLContentValue)(nil), "acl.ACLChange.ACLContentValue") proto.RegisterType((*ACLChangeACLData)(nil), "acl.ACLChange.ACLData") @@ -986,64 +1047,111 @@ func init() { } var fileDescriptor_37a022c841a51877 = []byte{ - // 912 bytes of a gzipped FileDescriptorProto + // 948 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x4f, 0x6f, 0xe3, 0x44, - 0x14, 0xf7, 0x24, 0x4d, 0x13, 0x3f, 0x87, 0x36, 0x0c, 0x2b, 0xd6, 0x8c, 0x96, 0x10, 0x95, 0x15, - 0x8a, 0x10, 0x4a, 0x57, 0x59, 0x21, 0xad, 0x00, 0x55, 0xb4, 0x05, 0x6d, 0x42, 0x39, 0xac, 0x66, - 0xb5, 0x20, 0xb8, 0x4d, 0xed, 0xa1, 0xb5, 0xd6, 0xb1, 0x8d, 0x67, 0x52, 0x29, 0x17, 0x24, 0x4e, - 0x5c, 0x39, 0xf3, 0x55, 0xf8, 0x02, 0x7b, 0xdc, 0x23, 0x37, 0x50, 0x7b, 0xe7, 0xc2, 0x17, 0x40, - 0xf3, 0xc7, 0x8e, 0x93, 0x78, 0x23, 0x21, 0x55, 0x48, 0x7b, 0xa8, 0x34, 0xf3, 0x7b, 0xbf, 0x37, - 0x7d, 0x7f, 0x7e, 0xef, 0x39, 0xf0, 0x20, 0x7b, 0x7e, 0x71, 0xc8, 0x82, 0x58, 0xfd, 0x05, 0x97, - 0x2c, 0xb9, 0xe0, 0x42, 0x1d, 0xb3, 0xf3, 0xc3, 0x2c, 0x4f, 0x65, 0x2a, 0x2a, 0xf8, 0x48, 0x23, - 0xb8, 0xc9, 0x82, 0xf8, 0xe0, 0x9f, 0xb7, 0xc0, 0x3d, 0x3e, 0xfd, 0xfa, 0x54, 0x5b, 0xf0, 0x00, - 0x3c, 0x99, 0x73, 0x3e, 0xe1, 0x2c, 0x9c, 0x86, 0xc2, 0x47, 0x83, 0xe6, 0xd0, 0xa5, 0x55, 0x08, - 0xf7, 0x01, 0x58, 0x10, 0x17, 0x84, 0x86, 0x26, 0x54, 0x10, 0xfc, 0x01, 0xec, 0x89, 0x84, 0x65, - 0xe2, 0x32, 0x95, 0x27, 0x4c, 0xf0, 0x69, 0xe8, 0x37, 0x07, 0x68, 0xe8, 0xd2, 0x35, 0x14, 0x3f, - 0x80, 0x36, 0x0b, 0xe2, 0x2f, 0x98, 0x64, 0xfe, 0xce, 0x00, 0x0d, 0xbd, 0xf1, 0xdb, 0x23, 0x16, - 0xc4, 0xa3, 0x32, 0x14, 0x75, 0x52, 0x56, 0x5a, 0xd0, 0x54, 0x6c, 0x36, 0x7e, 0xed, 0xd5, 0x1a, - 0xa0, 0x61, 0x97, 0x56, 0x21, 0x3c, 0x02, 0x1c, 0xcc, 0xf3, 0x9c, 0x27, 0x92, 0x72, 0x16, 0x9e, - 0xf1, 0xc5, 0x84, 0x89, 0x4b, 0x7f, 0x77, 0x80, 0x86, 0x3b, 0xb4, 0xc6, 0x82, 0xef, 0x81, 0x2b, - 0xa3, 0x19, 0x17, 0x92, 0xcd, 0x32, 0xbf, 0x3d, 0x40, 0xc3, 0x26, 0x5d, 0x02, 0x98, 0x40, 0x27, - 0x0a, 0x79, 0x22, 0x23, 0xb9, 0xf0, 0x3b, 0x3a, 0x87, 0xf2, 0x4e, 0x7e, 0x6b, 0xc2, 0xbe, 0x0a, - 0x35, 0x4d, 0x24, 0x4f, 0xe4, 0x37, 0x2c, 0x9e, 0x73, 0x3c, 0x86, 0xf6, 0x5c, 0xf0, 0xfc, 0x38, - 0x0c, 0x7d, 0x54, 0x9b, 0xd1, 0x33, 0x63, 0x9d, 0x38, 0xb4, 0x20, 0xe2, 0x4f, 0x01, 0xd4, 0x91, - 0xf2, 0x59, 0x7a, 0xc5, 0xfd, 0x86, 0x76, 0x7b, 0xa7, 0xc6, 0xcd, 0x10, 0x26, 0x0e, 0xad, 0xd0, - 0xf1, 0x77, 0x70, 0x47, 0xdd, 0x9e, 0xf0, 0x7c, 0x16, 0x09, 0x11, 0xa5, 0x89, 0x71, 0xd0, 0x05, - 0xf7, 0xc6, 0xef, 0xd7, 0x3c, 0xb3, 0x4e, 0x9d, 0x38, 0xb4, 0xf6, 0x89, 0x22, 0xae, 0x69, 0x72, - 0x15, 0x49, 0x6e, 0x1b, 0x54, 0x17, 0x97, 0x21, 0x14, 0x71, 0x99, 0x1b, 0xfe, 0x18, 0x3a, 0xea, - 0xf6, 0x55, 0x1a, 0x25, 0xba, 0x4b, 0xde, 0xf8, 0x6e, 0x8d, 0xab, 0x32, 0x4f, 0x1c, 0x5a, 0x52, - 0xf1, 0x11, 0x78, 0xea, 0x7c, 0x9a, 0x26, 0x3f, 0x44, 0xf9, 0x4c, 0xb7, 0xcd, 0x1b, 0x93, 0x1a, - 0x4f, 0xcb, 0x98, 0x38, 0xb4, 0xea, 0x70, 0xd2, 0x86, 0xd6, 0x95, 0x6a, 0x04, 0xf9, 0x05, 0x41, - 0xdb, 0xaa, 0x07, 0x7f, 0x06, 0x1e, 0x0b, 0xe2, 0xa7, 0x56, 0x7b, 0xb6, 0x31, 0x64, 0x53, 0x6a, - 0x05, 0x83, 0x56, 0xe9, 0xf8, 0x48, 0x8b, 0xdd, 0x76, 0x59, 0x8b, 0xdd, 0x1b, 0xf7, 0x37, 0x9d, - 0xab, 0x32, 0xa0, 0x15, 0x0f, 0x72, 0x02, 0x5e, 0xe5, 0x6d, 0xfc, 0x10, 0x3a, 0xea, 0x75, 0xc9, - 0x24, 0xb7, 0x91, 0xdc, 0xad, 0x89, 0x44, 0x99, 0x69, 0x49, 0x24, 0x3f, 0x37, 0xa0, 0x53, 0xc0, - 0xf8, 0x3e, 0xbc, 0x91, 0x2f, 0x05, 0xcc, 0xcd, 0x84, 0xee, 0xd0, 0x55, 0x10, 0x3f, 0x32, 0xdd, - 0xd3, 0x2e, 0xc2, 0x86, 0xed, 0xd7, 0x14, 0xd2, 0xfc, 0xab, 0x0a, 0x17, 0x1f, 0x41, 0x3b, 0xd2, - 0x4d, 0x14, 0x7e, 0x53, 0xbb, 0xdd, 0x7f, 0x45, 0x80, 0x23, 0xd3, 0x6b, 0xf1, 0x65, 0x22, 0xf3, - 0x05, 0x2d, 0x9c, 0xc8, 0x33, 0xe8, 0x56, 0x0d, 0xb8, 0x07, 0xcd, 0xe7, 0x7c, 0xa1, 0x93, 0x75, - 0xa9, 0x3a, 0xe2, 0x43, 0xdb, 0xa5, 0x2d, 0x62, 0x37, 0x2f, 0x50, 0xc3, 0xfb, 0xa4, 0xf1, 0x08, - 0x91, 0x3f, 0x11, 0xb8, 0x65, 0xc0, 0x2b, 0x83, 0x89, 0x56, 0x07, 0x53, 0x15, 0x88, 0x27, 0x41, - 0xbe, 0xc8, 0x64, 0x94, 0x26, 0x67, 0x7c, 0xa1, 0xff, 0x4d, 0x97, 0xae, 0x82, 0xf8, 0x23, 0x78, - 0xd3, 0x02, 0x3c, 0xb4, 0x0b, 0xc1, 0x24, 0xdc, 0xa5, 0x9b, 0x06, 0xfc, 0x39, 0x78, 0x59, 0x39, - 0x20, 0x42, 0x4f, 0xc3, 0xde, 0x86, 0x0c, 0x56, 0xc7, 0x4b, 0xd0, 0xaa, 0x8b, 0x5a, 0x5d, 0x53, - 0x61, 0x75, 0xca, 0x43, 0x3d, 0x14, 0x1d, 0x5a, 0x85, 0xc8, 0xef, 0x08, 0xda, 0x76, 0x3f, 0xbc, - 0x7e, 0xf9, 0x91, 0xc7, 0xe0, 0x55, 0x06, 0x73, 0x6b, 0x02, 0xf7, 0xc0, 0xb5, 0xcb, 0x6f, 0x1a, - 0xea, 0xe0, 0x5d, 0xba, 0x04, 0xc8, 0xdf, 0x08, 0x60, 0x29, 0x01, 0x3c, 0x84, 0x7d, 0x16, 0x04, - 0x3c, 0x93, 0x4f, 0xe6, 0xe7, 0x71, 0x14, 0x9c, 0x59, 0x29, 0x75, 0xe9, 0x3a, 0x8c, 0x3f, 0x84, - 0x9e, 0x4d, 0x6c, 0x49, 0x35, 0xa5, 0xd9, 0xc0, 0xff, 0xf7, 0xee, 0x13, 0xe8, 0x98, 0x7c, 0xa6, - 0xa6, 0xf5, 0x2e, 0x2d, 0xef, 0xe4, 0x05, 0x82, 0x4e, 0xb1, 0x0d, 0x6f, 0xa1, 0xf1, 0x65, 0xc1, - 0x9e, 0x46, 0x17, 0x09, 0x93, 0xf3, 0xdc, 0x7c, 0x0d, 0xca, 0x82, 0x95, 0x30, 0x3e, 0x80, 0xee, - 0x72, 0x65, 0x4f, 0x43, 0x9d, 0x97, 0x4b, 0x57, 0xb0, 0xfa, 0x42, 0xb5, 0x5e, 0x51, 0x28, 0xf2, - 0xa3, 0x69, 0x9d, 0xfd, 0x38, 0x6d, 0xcb, 0xe5, 0x31, 0xec, 0xdb, 0x85, 0x45, 0x79, 0x16, 0xb3, - 0xa0, 0xdc, 0x36, 0xef, 0xae, 0x95, 0x95, 0xae, 0xb0, 0xe8, 0xba, 0x17, 0xf9, 0x09, 0xf6, 0x56, - 0x29, 0xb7, 0x50, 0xc2, 0xa5, 0x92, 0xca, 0xdc, 0x6c, 0x0d, 0x37, 0x70, 0x22, 0xe1, 0x4e, 0xdd, - 0x67, 0x75, 0x6b, 0x14, 0x6b, 0x7a, 0x6a, 0xfc, 0x67, 0x3d, 0x1d, 0x1c, 0xc3, 0xfe, 0x9a, 0x1d, - 0xbb, 0xd0, 0x3a, 0x0e, 0x67, 0x51, 0xd2, 0x73, 0x30, 0xc0, 0xee, 0xb7, 0x79, 0x24, 0x79, 0xde, - 0x43, 0xea, 0xac, 0x42, 0xe5, 0x79, 0xaf, 0x81, 0x3d, 0x68, 0x9b, 0xd6, 0x84, 0xbd, 0xe6, 0xc9, - 0x7b, 0x2f, 0xae, 0xfb, 0xe8, 0xe5, 0x75, 0x1f, 0xfd, 0x75, 0xdd, 0x47, 0xbf, 0xde, 0xf4, 0x9d, - 0x97, 0x37, 0x7d, 0xe7, 0x8f, 0x9b, 0xbe, 0xf3, 0x7d, 0x4b, 0xff, 0x66, 0x3c, 0xdf, 0xd5, 0x3f, - 0x11, 0x1f, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xfb, 0x84, 0xb4, 0xc9, 0x56, 0x0a, 0x00, 0x00, + 0x14, 0xf7, 0xc4, 0x4d, 0x1d, 0x3f, 0x87, 0x36, 0x0c, 0x2b, 0xd6, 0x58, 0x4b, 0x88, 0xca, 0x0a, + 0x45, 0x08, 0xa5, 0xab, 0xac, 0x90, 0x56, 0x80, 0x2a, 0xda, 0x82, 0x36, 0xa1, 0x1c, 0x56, 0x53, + 0x2d, 0x08, 0x6e, 0x53, 0x7b, 0x68, 0xad, 0x75, 0x6c, 0xe3, 0x99, 0x14, 0xe5, 0x82, 0xc4, 0x89, + 0x2b, 0x67, 0xbe, 0x0a, 0x5f, 0x60, 0x8f, 0x7b, 0xe4, 0x06, 0x6a, 0xef, 0x5c, 0xf8, 0x02, 0x68, + 0xfe, 0xd8, 0x71, 0x12, 0x6f, 0x24, 0xa4, 0x15, 0x12, 0x87, 0x4a, 0x33, 0xbf, 0xf7, 0x7b, 0xd3, + 0xf7, 0xde, 0xef, 0xbd, 0x17, 0xc3, 0x83, 0xfc, 0xd9, 0xe5, 0x21, 0x0d, 0x13, 0xf9, 0x17, 0x5e, + 0xd1, 0xf4, 0x92, 0x71, 0x79, 0xcc, 0x2f, 0x0e, 0xf3, 0x22, 0x13, 0x19, 0xaf, 0xe1, 0x23, 0x85, + 0x60, 0x9b, 0x86, 0xc9, 0xc1, 0x39, 0xb8, 0x84, 0xfe, 0x70, 0xaa, 0x0c, 0xd8, 0x07, 0x27, 0xa7, + 0x8b, 0x24, 0xa3, 0x91, 0x8f, 0x06, 0x68, 0xd8, 0x25, 0xe5, 0x15, 0xdf, 0x03, 0x97, 0xc7, 0x97, + 0x29, 0x15, 0xf3, 0x82, 0xf9, 0x2d, 0x65, 0x5b, 0x02, 0x78, 0x0f, 0x5a, 0x71, 0xe4, 0xdb, 0x03, + 0x34, 0x74, 0x49, 0x2b, 0x8e, 0x0e, 0xfe, 0x7e, 0x03, 0xdc, 0xe3, 0xd3, 0x2f, 0xcd, 0xab, 0x03, + 0xf0, 0x44, 0xc1, 0xd8, 0x84, 0xd1, 0x68, 0x1a, 0x71, 0x1f, 0x0d, 0xec, 0xa1, 0x4b, 0xea, 0x10, + 0xee, 0x03, 0xd0, 0x30, 0x29, 0x09, 0x2d, 0x45, 0xa8, 0x21, 0xf8, 0x3d, 0xd8, 0xe3, 0x29, 0xcd, + 0xf9, 0x55, 0x26, 0x4e, 0x28, 0x67, 0xd3, 0xf2, 0x7f, 0xad, 0xa1, 0xf8, 0x01, 0x38, 0x34, 0x4c, + 0x3e, 0xa3, 0x82, 0xfa, 0x3b, 0x03, 0x34, 0xf4, 0xc6, 0x6f, 0x8e, 0x68, 0x98, 0x8c, 0xaa, 0x50, + 0xe4, 0x49, 0x5a, 0x49, 0x49, 0x93, 0xb1, 0x99, 0xa2, 0x28, 0xaf, 0xb6, 0xca, 0xac, 0x0e, 0xe1, + 0x11, 0xe0, 0x70, 0x5e, 0x14, 0x2c, 0x15, 0x84, 0xd1, 0xe8, 0x8c, 0x2d, 0x26, 0x94, 0x5f, 0xf9, + 0xbb, 0x03, 0x34, 0xdc, 0x21, 0x0d, 0x16, 0x59, 0x29, 0x11, 0xcf, 0x18, 0x17, 0x74, 0x96, 0xfb, + 0xce, 0x00, 0x0d, 0x6d, 0xb2, 0x04, 0x70, 0x00, 0x9d, 0x38, 0x62, 0xa9, 0x88, 0xc5, 0xc2, 0xef, + 0xa8, 0x1c, 0xaa, 0x7b, 0xf0, 0xab, 0x0d, 0xfb, 0x32, 0xd4, 0x2c, 0x15, 0x2c, 0x15, 0x5f, 0xd1, + 0x64, 0xce, 0xf0, 0x18, 0x9c, 0x39, 0x67, 0xc5, 0x71, 0xa4, 0x15, 0xd9, 0xcc, 0xe8, 0xa9, 0xb6, + 0x4e, 0x2c, 0x52, 0x12, 0xf1, 0xc7, 0x00, 0xf2, 0x48, 0xd8, 0x2c, 0xbb, 0xd6, 0x62, 0x79, 0xe3, + 0xb7, 0x1a, 0xdc, 0x34, 0x61, 0x62, 0x91, 0x1a, 0x1d, 0x7f, 0x03, 0x77, 0xe4, 0xed, 0x09, 0x2b, + 0x66, 0x31, 0xe7, 0x71, 0x96, 0x6a, 0x07, 0x55, 0x70, 0x6f, 0xfc, 0x6e, 0xc3, 0x33, 0xeb, 0xd4, + 0x89, 0x45, 0x1a, 0x9f, 0x28, 0xe3, 0x9a, 0xa6, 0xd7, 0xb1, 0x60, 0x46, 0xa0, 0xa6, 0xb8, 0x34, + 0xa1, 0x8c, 0x4b, 0xdf, 0xf0, 0x87, 0xd0, 0x91, 0xb7, 0x2f, 0xb2, 0x38, 0x55, 0x2a, 0x79, 0xe3, + 0xbb, 0x0d, 0xae, 0xd2, 0x3c, 0xb1, 0x48, 0x45, 0xc5, 0x47, 0xe0, 0xc9, 0xf3, 0x69, 0x96, 0x7e, + 0x17, 0x17, 0x33, 0x25, 0x9b, 0x37, 0x0e, 0x1a, 0x3c, 0x0d, 0x63, 0x62, 0x91, 0xba, 0xc3, 0x89, + 0x03, 0xed, 0x6b, 0x29, 0x44, 0xf0, 0x33, 0x02, 0xc7, 0x74, 0x0f, 0xfe, 0x04, 0x3c, 0x1a, 0x26, + 0xe7, 0xa6, 0xf7, 0x8c, 0x30, 0xc1, 0x66, 0xab, 0x95, 0x0c, 0x52, 0xa7, 0xe3, 0x23, 0xd5, 0xec, + 0x46, 0x65, 0xd5, 0xec, 0xde, 0xb8, 0xbf, 0xe9, 0x5c, 0x6f, 0x03, 0x52, 0xf3, 0x08, 0x4e, 0xc0, + 0xab, 0xbd, 0x8d, 0x1f, 0x42, 0x47, 0xbe, 0x2e, 0xa8, 0x60, 0x26, 0x92, 0xbb, 0x0d, 0x91, 0x48, + 0x33, 0xa9, 0x88, 0xc1, 0x4f, 0x2d, 0xe8, 0x94, 0x30, 0xbe, 0x0f, 0xaf, 0x15, 0xcb, 0x06, 0x66, + 0x7a, 0x42, 0x77, 0xc8, 0x2a, 0x88, 0x1f, 0x69, 0xf5, 0x94, 0x0b, 0x37, 0x61, 0xfb, 0x0d, 0x85, + 0xd4, 0xff, 0xaa, 0xc6, 0xc5, 0x47, 0xe0, 0xc4, 0x4a, 0x44, 0xee, 0xdb, 0xca, 0xed, 0xfe, 0x4b, + 0x02, 0x1c, 0x69, 0xad, 0xf9, 0xe7, 0xa9, 0x28, 0x16, 0xa4, 0x74, 0x0a, 0x9e, 0x42, 0xb7, 0x6e, + 0xc0, 0x3d, 0xb0, 0x9f, 0xb1, 0x85, 0x4a, 0xd6, 0x25, 0xf2, 0x88, 0x0f, 0x8d, 0x4a, 0x5b, 0x9a, + 0x5d, 0xbf, 0x40, 0x34, 0xef, 0xa3, 0xd6, 0x23, 0x14, 0xfc, 0x81, 0xc0, 0xad, 0x02, 0x5e, 0x19, + 0x4c, 0xb4, 0x3a, 0x98, 0xb2, 0x40, 0x2c, 0x0d, 0x8b, 0x45, 0x2e, 0xe2, 0x2c, 0x3d, 0x63, 0x0b, + 0xb3, 0x00, 0x57, 0x41, 0xfc, 0x01, 0xbc, 0x6e, 0x00, 0x16, 0x99, 0x85, 0xa0, 0x13, 0xee, 0x92, + 0x4d, 0x03, 0xfe, 0x14, 0xbc, 0xbc, 0x1a, 0x10, 0xae, 0xa6, 0x61, 0x6f, 0xa3, 0x0d, 0x56, 0xc7, + 0x8b, 0x93, 0xba, 0x8b, 0x5c, 0x5d, 0x53, 0x6e, 0xfa, 0x94, 0x45, 0x6a, 0x28, 0x3a, 0xa4, 0x0e, + 0x05, 0xbf, 0x21, 0x70, 0xcc, 0x7e, 0xf8, 0xff, 0xe5, 0x17, 0x3c, 0x06, 0xaf, 0x36, 0x98, 0x5b, + 0x13, 0xb8, 0x07, 0xae, 0x59, 0x7e, 0xd3, 0x48, 0x05, 0xef, 0x92, 0x25, 0x10, 0xfc, 0x85, 0x00, + 0x96, 0x2d, 0x80, 0x87, 0xb0, 0x4f, 0xc3, 0x90, 0xe5, 0xe2, 0xc9, 0xfc, 0x22, 0x89, 0xc3, 0x33, + 0xd3, 0x4a, 0x5d, 0xb2, 0x0e, 0xe3, 0xf7, 0xa1, 0x67, 0x12, 0x5b, 0x52, 0x75, 0x69, 0x36, 0xf0, + 0xff, 0x5c, 0xfd, 0x00, 0x3a, 0x3a, 0x9f, 0xa9, 0x96, 0xde, 0x25, 0xd5, 0x3d, 0x78, 0x8e, 0xa0, + 0x53, 0x6e, 0xc3, 0x57, 0x20, 0x7c, 0x55, 0xb0, 0xf3, 0xea, 0x0b, 0xc0, 0xae, 0x17, 0xac, 0x82, + 0xf1, 0x01, 0x74, 0x97, 0x2b, 0x7b, 0x1a, 0xa9, 0xbc, 0x5c, 0xb2, 0x82, 0x35, 0x17, 0xaa, 0xfd, + 0x92, 0x42, 0x05, 0xdf, 0x6b, 0xe9, 0xcc, 0x8f, 0xd3, 0xb6, 0x5c, 0x1e, 0xc3, 0xbe, 0x59, 0x58, + 0x84, 0xe5, 0x09, 0x0d, 0xab, 0x6d, 0xf3, 0xf6, 0x5a, 0x59, 0xc9, 0x0a, 0x8b, 0xac, 0x7b, 0x05, + 0x3f, 0xc2, 0xde, 0x2a, 0xe5, 0x15, 0x94, 0x70, 0xd9, 0x49, 0x55, 0x6e, 0xa6, 0x86, 0x1b, 0x78, + 0x20, 0xe0, 0x4e, 0xd3, 0xcf, 0xea, 0xd6, 0x28, 0xd6, 0xfa, 0xa9, 0xf5, 0xaf, 0xfb, 0xe9, 0xe0, + 0x18, 0xf6, 0xd7, 0xec, 0xd8, 0x85, 0xf6, 0x71, 0x34, 0x8b, 0xd3, 0x9e, 0x85, 0x01, 0x76, 0xbf, + 0x2e, 0x62, 0xc1, 0x8a, 0x1e, 0x92, 0x67, 0x19, 0x2a, 0x2b, 0x7a, 0x2d, 0xec, 0x81, 0xa3, 0xa5, + 0x89, 0x7a, 0xf6, 0xc9, 0x3b, 0xcf, 0x6f, 0xfa, 0xe8, 0xc5, 0x4d, 0x1f, 0xfd, 0x79, 0xd3, 0x47, + 0xbf, 0xdc, 0xf6, 0xad, 0x17, 0xb7, 0x7d, 0xeb, 0xf7, 0xdb, 0xbe, 0xf5, 0x6d, 0x5b, 0x7d, 0x88, + 0x5e, 0xec, 0xaa, 0xef, 0xce, 0x87, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x2a, 0xe8, 0x23, 0x71, + 0xab, 0x0a, 0x00, 0x00, +} + +func (m *RawChange) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RawChange) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RawChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x1a + } + if len(m.Signature) > 0 { + i -= len(m.Signature) + copy(dAtA[i:], m.Signature) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Signature))) + i-- + dAtA[i] = 0x12 + } + if len(m.Payload) > 0 { + i -= len(m.Payload) + copy(dAtA[i:], m.Payload) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Payload))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *ACLChange) Marshal() (dAtA []byte, err error) { @@ -1854,6 +1962,27 @@ func encodeVarintAclchanges(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *RawChange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Payload) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.Signature) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + return n +} + func (m *ACLChange) Size() (n int) { if m == nil { return 0 @@ -2243,6 +2372,156 @@ func sovAclchanges(x uint64) (n int) { func sozAclchanges(x uint64) (n int) { return sovAclchanges(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (m *RawChange) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RawChange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RawChange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...) + if m.Payload == nil { + m.Payload = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) + if m.Signature == nil { + m.Signature = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclchanges(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclchanges + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ACLChange) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto index 1906e1e5..1c8ceaf2 100644 --- a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto +++ b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto @@ -2,6 +2,12 @@ syntax = "proto3"; package acl; option go_package = "aclpb"; +message RawChange { + bytes payload = 1; + bytes signature = 2; + string id = 3; +} + // the element of change tree used to store and internal apply smartBlock history message ACLChange { repeated string treeHeadIds = 1; diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index 5d5b770d..9761e545 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -3,6 +3,7 @@ package acltree import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "sync" ) @@ -228,7 +229,7 @@ func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuild } a.fullTree.AddFast(ch) - err = a.treeStorage.AddRawChange(&treestorage.RawChange{ + err = a.treeStorage.AddRawChange(&aclpb.RawChange{ Payload: marshalled, Signature: ch.Signature(), Id: ch.Id, diff --git a/pkg/acl/acltree/acltreestorage.go b/pkg/acl/acltree/acltreestorage.go index f5fe18c0..51d7d86d 100644 --- a/pkg/acl/acltree/acltreestorage.go +++ b/pkg/acl/acltree/acltreestorage.go @@ -2,6 +2,7 @@ package acltree import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" ) @@ -9,7 +10,7 @@ import ( func BuildTreeStorageWithACL( acc *account.AccountData, build func(builder ChangeBuilder) error, - create func(change *treestorage.RawChange) (treestorage.TreeStorage, error)) (treestorage.TreeStorage, error) { + create func(change *aclpb.RawChange) (treestorage.TreeStorage, error)) (treestorage.TreeStorage, error) { bld := newChangeBuilder() bld.Init( newACLState(acc.Identity, acc.EncKey, signingkey.NewEd25519PubKeyDecoder()), @@ -26,7 +27,7 @@ func BuildTreeStorageWithACL( return nil, err } - rawChange := &treestorage.RawChange{ + rawChange := &aclpb.RawChange{ Payload: payload, Signature: change.Signature(), Id: change.CID(), diff --git a/pkg/acl/acltree/change.go b/pkg/acl/acltree/change.go index 799a549f..c768ef23 100644 --- a/pkg/acl/acltree/change.go +++ b/pkg/acl/acltree/change.go @@ -3,7 +3,6 @@ package acltree import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/gogo/protobuf/proto" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" @@ -47,7 +46,7 @@ func (ch *Change) IsACLChange() bool { return ch.Content.GetAclData() != nil } -func NewFromRawChange(rawChange *treestorage.RawChange) (*Change, error) { +func NewFromRawChange(rawChange *aclpb.RawChange) (*Change, error) { unmarshalled := &aclpb.ACLChange{} err := proto.Unmarshal(rawChange.Payload, unmarshalled) if err != nil { diff --git a/pkg/acl/acltree/changeloader.go b/pkg/acl/acltree/changeloader.go index 658ac58f..d3b57a32 100644 --- a/pkg/acl/acltree/changeloader.go +++ b/pkg/acl/acltree/changeloader.go @@ -73,7 +73,7 @@ func (c *changeLoader) verify(identity string, payload, signature []byte) (isVer return identityKey.Verify(payload, signature) } -func (c *changeLoader) makeVerifiedACLChange(change *treestorage.RawChange) (aclChange *aclpb.ACLChange, err error) { +func (c *changeLoader) makeVerifiedACLChange(change *aclpb.RawChange) (aclChange *aclpb.ACLChange, err error) { aclChange = new(aclpb.ACLChange) // TODO: think what should we do with such cases, because this can be used by attacker to break our Tree diff --git a/pkg/acl/example/plaintextdocument/document.go b/pkg/acl/example/plaintextdocument/document.go index a38b6d3c..80e760b0 100644 --- a/pkg/acl/example/plaintextdocument/document.go +++ b/pkg/acl/example/plaintextdocument/document.go @@ -117,7 +117,7 @@ func NewInMemoryPlainTextDocument(acc *account.AccountData, text string) (PlainT func NewPlainTextDocument( acc *account.AccountData, - create func(change *treestorage.RawChange) (treestorage.TreeStorage, error), + create func(change *aclpb.RawChange) (treestorage.TreeStorage, error), text string) (PlainTextDocument, error) { changeBuilder := func(builder acltree.ChangeBuilder) error { err := builder.UserAdd(acc.Identity, acc.EncKey.GetPublic(), aclpb.ACLChange_Admin) diff --git a/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go b/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go index b48595ca..f7bb65bd 100644 --- a/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go +++ b/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go @@ -7,7 +7,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" testpb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/yamltests" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" storagepb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" @@ -87,7 +86,7 @@ func (t *TreeStorageBuilder) Heads() ([]string, error) { return t.heads, nil } -func (t *TreeStorageBuilder) AddRawChange(change *treestorage.RawChange) error { +func (t *TreeStorageBuilder) AddRawChange(change *aclpb.RawChange) error { aclChange := new(aclpb.ACLChange) var err error @@ -165,12 +164,12 @@ func (t *TreeStorageBuilder) RemoveOrphans(orphans ...string) error { return nil } -func (t *TreeStorageBuilder) GetChange(ctx context.Context, recordID string) (*treestorage.RawChange, error) { +func (t *TreeStorageBuilder) GetChange(ctx context.Context, recordID string) (*aclpb.RawChange, error) { return t.getChange(recordID, t.allChanges), nil } -func (t *TreeStorageBuilder) GetUpdates(useCase string) []*treestorage.RawChange { - var res []*treestorage.RawChange +func (t *TreeStorageBuilder) GetUpdates(useCase string) []*aclpb.RawChange { + var res []*aclpb.RawChange update := t.updates[useCase] for _, ch := range update.changes { rawCh := t.getChange(ch.id, update.changes) @@ -183,7 +182,7 @@ func (t *TreeStorageBuilder) Header() (*storagepb.TreeHeader, error) { return t.header, nil } -func (t *TreeStorageBuilder) getChange(changeId string, m map[string]*treeChange) *treestorage.RawChange { +func (t *TreeStorageBuilder) getChange(changeId string, m map[string]*treeChange) *aclpb.RawChange { rec := m[changeId] if rec.changesDataDecrypted != nil { @@ -205,7 +204,7 @@ func (t *TreeStorageBuilder) getChange(changeId string, m map[string]*treeChange panic("should be able to sign final acl message!") } - transformedRec := &treestorage.RawChange{ + transformedRec := &aclpb.RawChange{ Payload: aclMarshaled, Signature: signature, Id: changeId, diff --git a/pkg/acl/treestorage/inmemory.go b/pkg/acl/treestorage/inmemory.go index 5cebd9d9..3120d27a 100644 --- a/pkg/acl/treestorage/inmemory.go +++ b/pkg/acl/treestorage/inmemory.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" @@ -16,12 +17,12 @@ type inMemoryTreeStorage struct { header *treepb.TreeHeader heads []string orphans []string - changes map[string]*RawChange + changes map[string]*aclpb.RawChange sync.RWMutex } -func NewInMemoryTreeStorage(firstChange *RawChange) (TreeStorage, error) { +func NewInMemoryTreeStorage(firstChange *aclpb.RawChange) (TreeStorage, error) { header := &treepb.TreeHeader{ FirstChangeId: firstChange.Id, IsWorkspace: false, @@ -35,7 +36,7 @@ func NewInMemoryTreeStorage(firstChange *RawChange) (TreeStorage, error) { return nil, err } - changes := make(map[string]*RawChange) + changes := make(map[string]*aclpb.RawChange) changes[firstChange.Id] = firstChange return &inMemoryTreeStorage{ @@ -97,7 +98,7 @@ func (t *inMemoryTreeStorage) AddOrphans(orphans ...string) error { return nil } -func (t *inMemoryTreeStorage) AddRawChange(change *RawChange) error { +func (t *inMemoryTreeStorage) AddRawChange(change *aclpb.RawChange) error { t.Lock() defer t.Unlock() // TODO: better to do deep copy @@ -116,7 +117,7 @@ func (t *inMemoryTreeStorage) AddChange(change aclchanges.Change) error { if err != nil { return err } - rawChange := &RawChange{ + rawChange := &aclpb.RawChange{ Payload: fullMarshalledChange, Signature: signature, Id: id, @@ -125,7 +126,7 @@ func (t *inMemoryTreeStorage) AddChange(change aclchanges.Change) error { return nil } -func (t *inMemoryTreeStorage) GetChange(ctx context.Context, changeId string) (*RawChange, error) { +func (t *inMemoryTreeStorage) GetChange(ctx context.Context, changeId string) (*aclpb.RawChange, error) { t.RLock() defer t.RUnlock() if res, exists := t.changes[changeId]; exists { diff --git a/pkg/acl/treestorage/storage.go b/pkg/acl/treestorage/storage.go index 44a3effc..df47d809 100644 --- a/pkg/acl/treestorage/storage.go +++ b/pkg/acl/treestorage/storage.go @@ -3,6 +3,7 @@ package treestorage import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" ) @@ -16,15 +17,9 @@ type TreeStorage interface { RemoveOrphans(orphan ...string) error AddOrphans(orphan ...string) error - AddRawChange(change *RawChange) error + AddRawChange(change *aclpb.RawChange) error AddChange(change aclchanges.Change) error // TODO: have methods with raw changes also - GetChange(ctx context.Context, recordID string) (*RawChange, error) -} - -type RawChange struct { - Payload []byte - Signature []byte - Id string + GetChange(ctx context.Context, recordID string) (*aclpb.RawChange, error) } diff --git a/service/sync/syncpb/protos/sync.proto b/service/sync/syncpb/protos/sync.proto index ca2c3fb8..b1ab6905 100644 --- a/service/sync/syncpb/protos/sync.proto +++ b/service/sync/syncpb/protos/sync.proto @@ -7,8 +7,8 @@ import "pkg/acl/aclchanges/aclpb/protos/aclchanges.proto"; message Sync { message HeadUpdate { repeated Head heads = 1; - repeated acl.ACLChange changes = 2; - string senderId = 3; + repeated acl.RawChange changes = 2; + string treeId = 3; } message Head { @@ -20,12 +20,14 @@ message Sync { // here with send the request with all changes we have (we already know sender's snapshot path) message Request { repeated Head heads = 1; - repeated acl.ACLChange changes = 2; + repeated acl.RawChange changes = 2; + string treeId = 3; } message Response { repeated Head heads = 1; - repeated acl.ACLChange changes = 2; + repeated acl.RawChange changes = 2; + string treeId = 3; } } } \ No newline at end of file diff --git a/service/sync/syncpb/sync.pb.go b/service/sync/syncpb/sync.pb.go index 12ddf234..889ae169 100644 --- a/service/sync/syncpb/sync.pb.go +++ b/service/sync/syncpb/sync.pb.go @@ -60,9 +60,9 @@ func (m *Sync) XXX_DiscardUnknown() { var xxx_messageInfo_Sync proto.InternalMessageInfo type SyncHeadUpdate struct { - Heads []*SyncHead `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.ACLChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - SenderId string `protobuf:"bytes,3,opt,name=senderId,proto3" json:"senderId,omitempty"` + Heads []*SyncHead `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` } func (m *SyncHeadUpdate) Reset() { *m = SyncHeadUpdate{} } @@ -105,16 +105,16 @@ func (m *SyncHeadUpdate) GetHeads() []*SyncHead { return nil } -func (m *SyncHeadUpdate) GetChanges() []*aclpb.ACLChange { +func (m *SyncHeadUpdate) GetChanges() []*aclpb.RawChange { if m != nil { return m.Changes } return nil } -func (m *SyncHeadUpdate) GetSenderId() string { +func (m *SyncHeadUpdate) GetTreeId() string { if m != nil { - return m.SenderId + return m.TreeId } return "" } @@ -210,7 +210,8 @@ var xxx_messageInfo_SyncFull proto.InternalMessageInfo // here with send the request with all changes we have (we already know sender's snapshot path) type SyncFullRequest struct { Heads []*SyncHead `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.ACLChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` } func (m *SyncFullRequest) Reset() { *m = SyncFullRequest{} } @@ -253,16 +254,24 @@ func (m *SyncFullRequest) GetHeads() []*SyncHead { return nil } -func (m *SyncFullRequest) GetChanges() []*aclpb.ACLChange { +func (m *SyncFullRequest) GetChanges() []*aclpb.RawChange { if m != nil { return m.Changes } return nil } +func (m *SyncFullRequest) GetTreeId() string { + if m != nil { + return m.TreeId + } + return "" +} + type SyncFullResponse struct { Heads []*SyncHead `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.ACLChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` } func (m *SyncFullResponse) Reset() { *m = SyncFullResponse{} } @@ -305,13 +314,20 @@ func (m *SyncFullResponse) GetHeads() []*SyncHead { return nil } -func (m *SyncFullResponse) GetChanges() []*aclpb.ACLChange { +func (m *SyncFullResponse) GetChanges() []*aclpb.RawChange { if m != nil { return m.Changes } return nil } +func (m *SyncFullResponse) GetTreeId() string { + if m != nil { + return m.TreeId + } + return "" +} + func init() { proto.RegisterType((*Sync)(nil), "anytype.Sync") proto.RegisterType((*SyncHeadUpdate)(nil), "anytype.Sync.HeadUpdate") @@ -326,26 +342,26 @@ func init() { } var fileDescriptor_5f66cdd599c6466f = []byte{ - // 300 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2d, 0x4e, 0x2d, 0x2a, - 0xcb, 0x4c, 0x4e, 0xd5, 0x2f, 0xae, 0xcc, 0x4b, 0x06, 0x13, 0x05, 0x49, 0xfa, 0x05, 0x45, 0xf9, - 0x25, 0xf9, 0xc5, 0x60, 0x9e, 0x1e, 0x98, 0x2d, 0xc4, 0x9e, 0x98, 0x57, 0x59, 0x52, 0x59, 0x90, - 0x2a, 0x65, 0x50, 0x90, 0x9d, 0xae, 0x9f, 0x98, 0x9c, 0x03, 0xc2, 0xc9, 0x19, 0x89, 0x79, 0xe9, - 0xa9, 0xc5, 0x20, 0x26, 0x42, 0x13, 0x42, 0x1c, 0xa2, 0x55, 0xa9, 0x83, 0x99, 0x8b, 0x25, 0xb8, - 0x32, 0x2f, 0x59, 0xaa, 0x86, 0x8b, 0xcb, 0x23, 0x35, 0x31, 0x25, 0xb4, 0x20, 0x25, 0xb1, 0x24, - 0x55, 0x48, 0x83, 0x8b, 0x35, 0x23, 0x35, 0x31, 0xa5, 0x58, 0x82, 0x51, 0x81, 0x59, 0x83, 0xdb, - 0x48, 0x48, 0x0f, 0x6a, 0x83, 0x1e, 0x48, 0xad, 0x1e, 0x48, 0x61, 0x10, 0x44, 0x81, 0x90, 0x06, - 0x17, 0x3b, 0xd4, 0x44, 0x09, 0x26, 0xb0, 0x5a, 0x3e, 0xbd, 0xc4, 0xe4, 0x1c, 0x3d, 0x47, 0x67, - 0x1f, 0x67, 0xb0, 0x70, 0x10, 0x4c, 0x5a, 0x48, 0x8a, 0x8b, 0xa3, 0x38, 0x35, 0x2f, 0x25, 0xb5, - 0xc8, 0x33, 0x45, 0x82, 0x59, 0x81, 0x51, 0x83, 0x33, 0x08, 0xce, 0x97, 0xb2, 0xe2, 0x62, 0x01, - 0x19, 0x2a, 0xc4, 0xc7, 0xc5, 0x94, 0x99, 0x22, 0xc1, 0x08, 0x96, 0x65, 0xca, 0x4c, 0x11, 0x52, - 0xe2, 0xe2, 0x29, 0xce, 0x4b, 0x2c, 0x28, 0xce, 0xc8, 0x2f, 0x09, 0x48, 0x2c, 0xc9, 0x00, 0x5b, - 0xc1, 0x19, 0x84, 0x22, 0x26, 0x75, 0x94, 0x91, 0x8b, 0xc5, 0xad, 0x34, 0x27, 0x47, 0x2a, 0x96, - 0x8b, 0x3d, 0x28, 0xb5, 0xb0, 0x34, 0xb5, 0xb8, 0x84, 0x16, 0xee, 0x97, 0x8a, 0xe3, 0xe2, 0x08, - 0x4a, 0x2d, 0x2e, 0xc8, 0xcf, 0x2b, 0xa6, 0x49, 0xf8, 0x38, 0x29, 0x9c, 0x78, 0x24, 0xc7, 0x78, - 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, - 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x14, 0x1b, 0x24, 0xe6, 0x93, 0xd8, 0xc0, 0x71, 0x66, 0x0c, 0x08, - 0x00, 0x00, 0xff, 0xff, 0x9a, 0x7b, 0x0b, 0x1c, 0x17, 0x02, 0x00, 0x00, + // 297 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x92, 0xb1, 0x4e, 0xc3, 0x30, + 0x10, 0x86, 0xeb, 0xb6, 0xb4, 0xf4, 0x40, 0x1d, 0x3c, 0xa0, 0x28, 0x83, 0x55, 0x55, 0x42, 0xca, + 0xe4, 0x22, 0xd8, 0x18, 0x41, 0x42, 0xb0, 0x21, 0x23, 0x16, 0x36, 0xd7, 0x3e, 0x35, 0x15, 0x91, + 0x63, 0x6a, 0xb7, 0x90, 0xb7, 0xe0, 0x61, 0x78, 0x08, 0xc6, 0x8e, 0x8c, 0x28, 0x79, 0x06, 0x76, + 0x14, 0x27, 0xa8, 0xe2, 0x05, 0x3a, 0xd8, 0xba, 0xfb, 0xef, 0xbb, 0xdf, 0x96, 0x7d, 0x70, 0xea, + 0x70, 0xb5, 0x59, 0x2a, 0x9c, 0xb9, 0xc2, 0xa8, 0xb0, 0xd9, 0xf9, 0xcc, 0xae, 0x72, 0x9f, 0xbb, + 0x90, 0xf1, 0x10, 0xd3, 0xa1, 0x34, 0x85, 0x2f, 0x2c, 0xc6, 0x67, 0xf6, 0x79, 0x31, 0x93, 0x2a, + 0xab, 0x97, 0x4a, 0xa5, 0x59, 0xa0, 0xab, 0xc3, 0x5d, 0xd3, 0x4e, 0x6f, 0x5a, 0xa7, 0x1f, 0x3d, + 0xe8, 0x3f, 0x14, 0x46, 0xc5, 0x6f, 0x00, 0xb7, 0x28, 0xf5, 0xa3, 0xd5, 0xd2, 0x23, 0x4d, 0xe0, + 0x20, 0x45, 0xa9, 0x5d, 0x44, 0x26, 0xbd, 0xe4, 0xe8, 0x9c, 0xf2, 0xf6, 0x04, 0x5e, 0xb3, 0xbc, + 0x06, 0x45, 0x03, 0xd0, 0x04, 0x86, 0xad, 0x63, 0xd4, 0x0d, 0xec, 0x98, 0x4b, 0x95, 0x71, 0x21, + 0x5f, 0xaf, 0x83, 0x2c, 0xfe, 0xca, 0xf4, 0x04, 0x06, 0x7e, 0x85, 0x78, 0xa7, 0xa3, 0xde, 0x84, + 0x24, 0x23, 0xd1, 0x66, 0xf1, 0x25, 0xf4, 0x6b, 0x43, 0x3a, 0x86, 0xee, 0x52, 0x47, 0x24, 0xd4, + 0xba, 0x4b, 0x4d, 0xa7, 0x70, 0xec, 0x8c, 0xb4, 0x2e, 0xcd, 0xfd, 0xbd, 0xf4, 0x69, 0xb0, 0x1f, + 0x89, 0x7f, 0x5a, 0xfc, 0x43, 0xa0, 0x7f, 0xb3, 0xce, 0xb2, 0x78, 0x0d, 0x43, 0x81, 0x2f, 0x6b, + 0x74, 0x7e, 0xaf, 0x77, 0xdf, 0xc0, 0xa1, 0x40, 0x67, 0x73, 0xe3, 0xf6, 0xfa, 0x66, 0x57, 0x93, + 0xcf, 0x92, 0x91, 0x6d, 0xc9, 0xc8, 0x77, 0xc9, 0xc8, 0x7b, 0xc5, 0x3a, 0xdb, 0x8a, 0x75, 0xbe, + 0x2a, 0xd6, 0x79, 0x1a, 0x34, 0x53, 0x32, 0x1f, 0x84, 0xff, 0xbd, 0xf8, 0x0d, 0x00, 0x00, 0xff, + 0xff, 0xac, 0xf4, 0x50, 0xb7, 0x43, 0x02, 0x00, 0x00, } func (m *Sync) Marshal() (dAtA []byte, err error) { @@ -391,10 +407,10 @@ func (m *SyncHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.SenderId) > 0 { - i -= len(m.SenderId) - copy(dAtA[i:], m.SenderId) - i = encodeVarintSync(dAtA, i, uint64(len(m.SenderId))) + if len(m.TreeId) > 0 { + i -= len(m.TreeId) + copy(dAtA[i:], m.TreeId) + i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) i-- dAtA[i] = 0x1a } @@ -511,6 +527,13 @@ func (m *SyncFullRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.TreeId) > 0 { + i -= len(m.TreeId) + copy(dAtA[i:], m.TreeId) + i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) + i-- + dAtA[i] = 0x1a + } if len(m.Changes) > 0 { for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { { @@ -562,6 +585,13 @@ func (m *SyncFullResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.TreeId) > 0 { + i -= len(m.TreeId) + copy(dAtA[i:], m.TreeId) + i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) + i-- + dAtA[i] = 0x1a + } if len(m.Changes) > 0 { for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { { @@ -631,7 +661,7 @@ func (m *SyncHeadUpdate) Size() (n int) { n += 1 + l + sovSync(uint64(l)) } } - l = len(m.SenderId) + l = len(m.TreeId) if l > 0 { n += 1 + l + sovSync(uint64(l)) } @@ -684,6 +714,10 @@ func (m *SyncFullRequest) Size() (n int) { n += 1 + l + sovSync(uint64(l)) } } + l = len(m.TreeId) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } return n } @@ -705,6 +739,10 @@ func (m *SyncFullResponse) Size() (n int) { n += 1 + l + sovSync(uint64(l)) } } + l = len(m.TreeId) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } return n } @@ -856,14 +894,14 @@ func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Changes = append(m.Changes, &aclpb.ACLChange{}) + m.Changes = append(m.Changes, &aclpb.RawChange{}) if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SenderId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TreeId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -891,7 +929,7 @@ func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.SenderId = string(dAtA[iNdEx:postIndex]) + m.TreeId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -1170,11 +1208,43 @@ func (m *SyncFullRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Changes = append(m.Changes, &aclpb.ACLChange{}) + m.Changes = append(m.Changes, &aclpb.RawChange{}) if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TreeId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) @@ -1288,11 +1358,43 @@ func (m *SyncFullResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Changes = append(m.Changes, &aclpb.ACLChange{}) + m.Changes = append(m.Changes, &aclpb.RawChange{}) if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TreeId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) From d3922d812a5cc0a1ec20926601ced0768007d47f Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 15 Jul 2022 10:14:39 +0200 Subject: [PATCH 09/40] WIP handling sync requests --- pkg/acl/acltree/acltree.go | 15 ++++++++++++ service/sync/requesthandler.go | 43 ++++++++++++++++++++++++++++++++++ service/sync/syncclient.go | 8 +++++++ 3 files changed, 66 insertions(+) create mode 100644 service/sync/requesthandler.go create mode 100644 service/sync/syncclient.go diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index 9761e545..90bf337a 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -38,6 +38,7 @@ type ACLTree interface { ACLState() *ACLState AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*Change, error) AddChanges(ctx context.Context, changes ...*Change) (AddResult, error) + AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) Heads() []string Root() *Change Iterate(func(change *Change) bool) @@ -245,6 +246,20 @@ func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuild return ch, nil } +func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (AddResult, error) { + var aclChanges []*Change + for _, ch := range rawChanges { + change, err := NewFromRawChange(ch) + // TODO: think what if we will have incorrect signatures on rawChanges, how everything will work + if err != nil { + continue + } + aclChanges = append(aclChanges, change) + } + + return a.AddChanges(ctx, aclChanges...) +} + func (a *aclTree) AddChanges(ctx context.Context, changes ...*Change) (AddResult, error) { a.Lock() // TODO: make proper error handling, because there are a lot of corner cases where this will break diff --git a/service/sync/requesthandler.go b/service/sync/requesthandler.go new file mode 100644 index 00000000..c935885a --- /dev/null +++ b/service/sync/requesthandler.go @@ -0,0 +1,43 @@ +package sync + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" +) + +type requestHander struct { + treeCache treecache.Service + client SyncClient +} + +func (r *requestHander) HandleHeadUpdate(ctx context.Context, senderId string, update *syncpb.SyncHeadUpdate) error { + err := r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error { + _, err := tree.AddRawChanges(ctx, update.Changes...) + if err != nil { + return err + } + shouldFullSync := !r.compareHeads(update.Heads, tree.Heads()) + + return nil + }) + if err != nil { + return err + } + return nil +} + +func (r *requestHander) compareHeads(syncHeads []*syncpb.SyncHead, heads []string) bool { + for _, head := range syncHeads { + if slice.FindPos(heads, head.Id) == -1 { + return false + } + } + return true +} + +func (r *requestHander) prepareFullSyncRequest(tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) { + +} diff --git a/service/sync/syncclient.go b/service/sync/syncclient.go new file mode 100644 index 00000000..95354982 --- /dev/null +++ b/service/sync/syncclient.go @@ -0,0 +1,8 @@ +package sync + +import "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" + +type SyncClient interface { + NotifyHeadsChanged(update *syncpb.SyncHeadUpdate) error + RequestFullSync(id string, request *syncpb.SyncFullRequest) error +} From 48af2866d23930e023d41806eb50c59bc4d7d3a6 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Fri, 15 Jul 2022 12:35:54 +0300 Subject: [PATCH 10/40] remove drpc --- cmd/client/client.go | 52 ------------- cmd/node/node.go | 1 - go.mod | 15 ++-- go.sum | 13 +--- service/server/drpc.go | 99 ------------------------ syncproto/service_drpc.pb.go | 146 ----------------------------------- 6 files changed, 9 insertions(+), 317 deletions(-) delete mode 100644 service/server/drpc.go delete mode 100644 syncproto/service_drpc.pb.go diff --git a/cmd/client/client.go b/cmd/client/client.go index 0f9cce60..de5eee2e 100644 --- a/cmd/client/client.go +++ b/cmd/client/client.go @@ -9,9 +9,6 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" "log" - "net" - "storj.io/drpc" - "storj.io/drpc/drpcconn" "time" ) @@ -25,7 +22,6 @@ func main() { panic(err) } benchGrpc(conf) - benchDrpc(conf) } func benchGrpc(conf *config.Config) { @@ -69,51 +65,3 @@ func benchGrpc(conf *config.Config) { dur := time.Since(st) fmt.Printf("%d req for %v (%d per sec)\n", n, dur, int(float64(n)/dur.Seconds())) } - -func benchDrpc(conf *config.Config) { - rawconn, err := net.Dial("tcp", conf.GrpcServer.ListenAddrs[1]) - if err != nil { - panic(err) - } - conn := drpcconn.New(rawconn) - defer conn.Close() - client := syncproto.NewDRPCAnytypeSyncClient(conn) - - stream, err := client.Ping(context.TODO()) - if err != nil { - panic(err) - } - - st := time.Now() - n := 100000 - - for i := 0; i < n; i++ { - if err = stream.MsgSend(&syncproto.PingRequest{ - Seq: int64(i), - }, enc{}); err != nil { - panic(err) - } - msg := &syncproto.PingResponse{} - err := stream.MsgRecv(msg, enc{}) - if err != nil { - panic(err) - } - } - dur := time.Since(st) - fmt.Printf("%d req for %v (%d per sec)\n", n, dur, int(float64(n)/dur.Seconds())) -} - -type enc struct { -} - -func (e enc) Marshal(msg drpc.Message) ([]byte, error) { - return msg.(interface { - Marshal() ([]byte, error) - }).Marshal() -} - -func (e enc) Unmarshal(buf []byte, msg drpc.Message) error { - return msg.(interface { - Unmarshal(buf []byte) error - }).Unmarshal(buf) -} diff --git a/cmd/node/node.go b/cmd/node/node.go index a6700e75..161daa88 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -81,5 +81,4 @@ func main() { func Bootstrap(a *app.App) { a.Register(server.New()) - a.Register(server.NewDRPC()) } diff --git a/go.mod b/go.mod index c06a0cc1..972a6472 100644 --- a/go.mod +++ b/go.mod @@ -6,16 +6,15 @@ require ( github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab github.com/goccy/go-graphviz v0.0.9 github.com/gogo/protobuf v1.3.2 + github.com/ipfs/go-cid v0.0.7 github.com/libp2p/go-libp2p-core v0.8.5 github.com/mr-tron/base58 v1.2.0 - github.com/multiformats/go-base32 v0.0.3 - github.com/multiformats/go-multiaddr v0.3.3 - github.com/multiformats/go-multiaddr-dns v0.3.1 - github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multihash v0.0.15 github.com/prometheus/common v0.18.0 github.com/stretchr/testify v1.7.0 github.com/textileio/go-threads v1.0.2-0.20210304072541-d0f91da84404 + go.uber.org/zap v1.21.0 + google.golang.org/grpc v1.48.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -31,33 +30,31 @@ require ( github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.2.1 // indirect - github.com/ipfs/go-cid v0.0.7 // indirect github.com/klauspost/cpuid/v2 v2.0.4 // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect github.com/libp2p/go-buffer-pool v0.0.2 // indirect github.com/libp2p/go-openssl v0.0.7 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect github.com/minio/sha256-simd v1.0.0 // indirect + github.com/multiformats/go-base32 v0.0.3 // indirect github.com/multiformats/go-base36 v0.1.0 // indirect + github.com/multiformats/go-multiaddr v0.3.3 // indirect + github.com/multiformats/go-multibase v0.0.3 // indirect github.com/multiformats/go-varint v0.0.6 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/sirupsen/logrus v1.6.0 // indirect github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect - github.com/zeebo/errs v1.2.2 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.8.0 // indirect - go.uber.org/zap v1.21.0 // indirect golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6 // indirect golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect golang.org/x/text v0.3.6 // indirect google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect - google.golang.org/grpc v1.48.0 // indirect google.golang.org/protobuf v1.27.1 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect - storj.io/drpc v0.0.32 // indirect ) replace github.com/textileio/go-threads => github.com/anytypeio/go-threads v1.1.0-rc1.0.20220223104843-a67245cee80e diff --git a/go.sum b/go.sum index e9440306..8b742ebd 100644 --- a/go.sum +++ b/go.sum @@ -50,6 +50,7 @@ github.com/aws/aws-sdk-go v1.29.15/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTg github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -231,7 +232,6 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= @@ -246,7 +246,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= @@ -1044,8 +1043,6 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1: github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zeebo/errs v1.2.2 h1:5NFypMTuSdoySVTqlNs1dEoU21QVamMQJxW/Fii5O7g= -github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.mongodb.org/mongo-driver v1.4.0/go.mod h1:llVBH2pkj9HywK0Dtdt6lDikOjFLbceHVu/Rc0iMKLs= @@ -1067,6 +1064,7 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -1249,7 +1247,6 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426080607-c94f62235c83 h1:kHSDPqCtsHZOg0nVylfTo20DDhE9gG4Y0jn7hKQ0QAM= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1339,7 +1336,6 @@ google.golang.org/grpc v1.28.1/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w= @@ -1352,7 +1348,6 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= @@ -1382,8 +1377,8 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= @@ -1400,5 +1395,3 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= -storj.io/drpc v0.0.32 h1:5p5ZwsK/VOgapaCu+oxaPVwO6UwIs+iwdMiD50+R4PI= -storj.io/drpc v0.0.32/go.mod h1:6rcOyR/QQkSTX/9L5ZGtlZaE2PtXTTZl8d+ulSeeYEg= diff --git a/service/server/drpc.go b/service/server/drpc.go deleted file mode 100644 index 479392e6..00000000 --- a/service/server/drpc.go +++ /dev/null @@ -1,99 +0,0 @@ -package server - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" - "io" - "net" - "storj.io/drpc" - "storj.io/drpc/drpcmux" - "storj.io/drpc/drpcserver" - "time" -) - -const CNameDRPC = "serverDrpc" - -func NewDRPC() *ServerDrpc { - return &ServerDrpc{} -} - -type ServerDrpc struct { - config config.GrpcServer - grpcServerDrpc *drpcserver.Server - cancel func() -} - -func (s *ServerDrpc) Init(ctx context.Context, a *app.App) (err error) { - s.config = a.MustComponent(config.CName).(*config.Config).GrpcServer - return nil -} - -func (s *ServerDrpc) Name() (name string) { - return CNameDRPC -} - -func (s *ServerDrpc) Run(ctx context.Context) (err error) { - m := drpcmux.New() - lis, err := net.Listen("tcp", s.config.ListenAddrs[1]) - if err != nil { - return err - } - err = syncproto.DRPCRegisterAnytypeSync(m, s) - if err != nil { - return err - } - ctx, s.cancel = context.WithCancel(ctx) - s.grpcServerDrpc = drpcserver.New(m) - var errCh = make(chan error) - go func() { - errCh <- s.grpcServerDrpc.Serve(ctx, lis) - }() - select { - case <-time.After(time.Second / 4): - case err = <-errCh: - } - log.Sugar().Infof("drpc server started at: %v", s.config.ListenAddrs[1]) - return -} - -func (s *ServerDrpc) Ping(stream syncproto.DRPCAnytypeSync_PingStream) error { - for { - var in = &syncproto.PingRequest{} - err := stream.MsgRecv(in, enc{}) - if err == io.EOF { - return nil - } - if err != nil { - return err - } - if err := stream.MsgSend(&syncproto.PingResponse{ - Seq: in.Seq, - }, enc{}); err != nil { - return err - } - } -} - -func (s *ServerDrpc) Close(ctx context.Context) (err error) { - if s.cancel != nil { - s.cancel() - } - return -} - -type enc struct { -} - -func (e enc) Marshal(msg drpc.Message) ([]byte, error) { - return msg.(interface { - Marshal() ([]byte, error) - }).Marshal() -} - -func (e enc) Unmarshal(buf []byte, msg drpc.Message) error { - return msg.(interface { - Unmarshal(buf []byte) error - }).Unmarshal(buf) -} diff --git a/syncproto/service_drpc.pb.go b/syncproto/service_drpc.pb.go deleted file mode 100644 index 694868b4..00000000 --- a/syncproto/service_drpc.pb.go +++ /dev/null @@ -1,146 +0,0 @@ -// Code generated by protoc-gen-go-drpc. DO NOT EDIT. -// protoc-gen-go-drpc version: v0.0.32 -// source: syncproto/proto/service.proto - -package syncproto - -import ( - context "context" - errors "errors" - protojson "google.golang.org/protobuf/encoding/protojson" - proto "google.golang.org/protobuf/proto" - drpc "storj.io/drpc" - drpcerr "storj.io/drpc/drpcerr" -) - -type drpcEncoding_File_syncproto_proto_service_proto struct{} - -func (drpcEncoding_File_syncproto_proto_service_proto) Marshal(msg drpc.Message) ([]byte, error) { - return proto.Marshal(msg.(proto.Message)) -} - -func (drpcEncoding_File_syncproto_proto_service_proto) MarshalAppend(buf []byte, msg drpc.Message) ([]byte, error) { - return proto.MarshalOptions{}.MarshalAppend(buf, msg.(proto.Message)) -} - -func (drpcEncoding_File_syncproto_proto_service_proto) Unmarshal(buf []byte, msg drpc.Message) error { - return proto.Unmarshal(buf, msg.(proto.Message)) -} - -func (drpcEncoding_File_syncproto_proto_service_proto) JSONMarshal(msg drpc.Message) ([]byte, error) { - return protojson.Marshal(msg.(proto.Message)) -} - -func (drpcEncoding_File_syncproto_proto_service_proto) JSONUnmarshal(buf []byte, msg drpc.Message) error { - return protojson.Unmarshal(buf, msg.(proto.Message)) -} - -type DRPCAnytypeSyncClient interface { - DRPCConn() drpc.Conn - - Ping(ctx context.Context) (DRPCAnytypeSync_PingClient, error) -} - -type drpcAnytypeSyncClient struct { - cc drpc.Conn -} - -func NewDRPCAnytypeSyncClient(cc drpc.Conn) DRPCAnytypeSyncClient { - return &drpcAnytypeSyncClient{cc} -} - -func (c *drpcAnytypeSyncClient) DRPCConn() drpc.Conn { return c.cc } - -func (c *drpcAnytypeSyncClient) Ping(ctx context.Context) (DRPCAnytypeSync_PingClient, error) { - stream, err := c.cc.NewStream(ctx, "/anytype.AnytypeSync/Ping", drpcEncoding_File_syncproto_proto_service_proto{}) - if err != nil { - return nil, err - } - x := &drpcAnytypeSync_PingClient{stream} - return x, nil -} - -type DRPCAnytypeSync_PingClient interface { - drpc.Stream - Send(*PingRequest) error - Recv() (*PingResponse, error) -} - -type drpcAnytypeSync_PingClient struct { - drpc.Stream -} - -func (x *drpcAnytypeSync_PingClient) Send(m *PingRequest) error { - return x.MsgSend(m, drpcEncoding_File_syncproto_proto_service_proto{}) -} - -func (x *drpcAnytypeSync_PingClient) Recv() (*PingResponse, error) { - m := new(PingResponse) - if err := x.MsgRecv(m, drpcEncoding_File_syncproto_proto_service_proto{}); err != nil { - return nil, err - } - return m, nil -} - -func (x *drpcAnytypeSync_PingClient) RecvMsg(m *PingResponse) error { - return x.MsgRecv(m, drpcEncoding_File_syncproto_proto_service_proto{}) -} - -type DRPCAnytypeSyncServer interface { - Ping(DRPCAnytypeSync_PingStream) error -} - -type DRPCAnytypeSyncUnimplementedServer struct{} - -func (s *DRPCAnytypeSyncUnimplementedServer) Ping(DRPCAnytypeSync_PingStream) error { - return drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) -} - -type DRPCAnytypeSyncDescription struct{} - -func (DRPCAnytypeSyncDescription) NumMethods() int { return 1 } - -func (DRPCAnytypeSyncDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) { - switch n { - case 0: - return "/anytype.AnytypeSync/Ping", drpcEncoding_File_syncproto_proto_service_proto{}, - func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { - return nil, srv.(DRPCAnytypeSyncServer). - Ping( - &drpcAnytypeSync_PingStream{in1.(drpc.Stream)}, - ) - }, DRPCAnytypeSyncServer.Ping, true - default: - return "", nil, nil, nil, false - } -} - -func DRPCRegisterAnytypeSync(mux drpc.Mux, impl DRPCAnytypeSyncServer) error { - return mux.Register(impl, DRPCAnytypeSyncDescription{}) -} - -type DRPCAnytypeSync_PingStream interface { - drpc.Stream - Send(*PingResponse) error - Recv() (*PingRequest, error) -} - -type drpcAnytypeSync_PingStream struct { - drpc.Stream -} - -func (x *drpcAnytypeSync_PingStream) Send(m *PingResponse) error { - return x.MsgSend(m, drpcEncoding_File_syncproto_proto_service_proto{}) -} - -func (x *drpcAnytypeSync_PingStream) Recv() (*PingRequest, error) { - m := new(PingRequest) - if err := x.MsgRecv(m, drpcEncoding_File_syncproto_proto_service_proto{}); err != nil { - return nil, err - } - return m, nil -} - -func (x *drpcAnytypeSync_PingStream) RecvMsg(m *PingRequest) error { - return x.MsgRecv(m, drpcEncoding_File_syncproto_proto_service_proto{}) -} From 0467933ae92563b25cc4ffe05ba7a5f028bd4b9f Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 15 Jul 2022 16:27:10 +0200 Subject: [PATCH 11/40] Start using raw changes + wip request handler --- pkg/acl/acltree/acltree.go | 63 ++++++++++++++++++++++++++------- pkg/acl/acltree/acltree_test.go | 22 ++---------- service/sync/requesthandler.go | 36 ++++++++++++++++--- service/sync/syncpb/pbutils.go | 22 ++++++++++++ 4 files changed, 106 insertions(+), 37 deletions(-) create mode 100644 service/sync/syncpb/pbutils.go diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index 90bf337a..53690850 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -19,10 +19,16 @@ const ( type AddResult struct { OldHeads []string Heads []string + Added []*aclpb.RawChange // TODO: add summary for changes Summary AddResultSummary } +type HeadWithPathToRoot struct { + Id string + Path []string +} + type TreeUpdateListener interface { Update(tree ACLTree) Rebuild(tree ACLTree) @@ -37,13 +43,13 @@ func (n NoOpListener) Rebuild(tree ACLTree) {} type ACLTree interface { ACLState() *ACLState AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*Change, error) - AddChanges(ctx context.Context, changes ...*Change) (AddResult, error) AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) Heads() []string Root() *Change Iterate(func(change *Change) bool) IterateFrom(string, func(change *Change) bool) HasChange(string) bool + HeadsPathToRoot() []HeadWithPathToRoot Close() error } @@ -247,25 +253,21 @@ func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuild } func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (AddResult, error) { - var aclChanges []*Change + a.Lock() + // TODO: make proper error handling, because there are a lot of corner cases where this will break + var err error + var mode Mode + + var changes []*Change for _, ch := range rawChanges { change, err := NewFromRawChange(ch) // TODO: think what if we will have incorrect signatures on rawChanges, how everything will work if err != nil { continue } - aclChanges = append(aclChanges, change) + changes = append(changes, change) } - return a.AddChanges(ctx, aclChanges...) -} - -func (a *aclTree) AddChanges(ctx context.Context, changes ...*Change) (AddResult, error) { - a.Lock() - // TODO: make proper error handling, because there are a lot of corner cases where this will break - var err error - var mode Mode - defer func() { if err != nil { return @@ -292,6 +294,16 @@ func (a *aclTree) AddChanges(ctx context.Context, changes ...*Change) (AddResult } }() + getAddedChanges := func() []*aclpb.RawChange { + var added []*aclpb.RawChange + for _, ch := range rawChanges { + if _, exists := a.fullTree.attached[ch.Id]; exists { + added = append(added, ch) + } + } + return added + } + for _, ch := range changes { err = a.treeStorage.AddChange(ch) if err != nil { @@ -322,6 +334,7 @@ func (a *aclTree) AddChanges(ctx context.Context, changes ...*Change) (AddResult return AddResult{ OldHeads: prevHeads, Heads: a.fullTree.Heads(), + Added: getAddedChanges(), Summary: AddResultSummaryRebuild, }, nil default: @@ -335,6 +348,7 @@ func (a *aclTree) AddChanges(ctx context.Context, changes ...*Change) (AddResult return AddResult{ OldHeads: prevHeads, Heads: a.fullTree.Heads(), + Added: getAddedChanges(), Summary: AddResultSummaryAppend, }, nil } @@ -376,3 +390,28 @@ func (a *aclTree) Root() *Change { func (a *aclTree) Close() error { return nil } + +func (a *aclTree) HeadsPathToRoot() []HeadWithPathToRoot { + a.RLock() + defer a.RUnlock() + var headsWithPath []HeadWithPathToRoot + for _, h := range a.fullTree.Heads() { + headWithPath := HeadWithPathToRoot{ + Id: h, + } + var path []string + // TODO: think that the user may have not all of the snapshots locally + currentSnapshotId := a.fullTree.attached[h].SnapshotId + for currentSnapshotId != "" { + sn, err := a.treeBuilder.loadChange(currentSnapshotId) + if err != nil { + break + } + path = append(path, currentSnapshotId) + currentSnapshotId = sn.SnapshotId + } + headWithPath.Path = path + headsWithPath = append(headsWithPath, headWithPath) + } + return headsWithPath +} diff --git a/pkg/acl/acltree/acltree_test.go b/pkg/acl/acltree/acltree_test.go index e9a72226..3a0d8e5b 100644 --- a/pkg/acl/acltree/acltree_test.go +++ b/pkg/acl/acltree/acltree_test.go @@ -85,16 +85,7 @@ func TestACLTree_UserJoinUpdate_Append(t *testing.T) { t.Fatalf("should Build acl ACLState without err: %v", err) } rawChanges := thr.GetUpdates("append") - var changes []*Change - for _, ch := range rawChanges { - newCh, err := NewFromRawChange(ch) - if err != nil { - t.Fatalf("should be able to create change from raw: %v", err) - } - changes = append(changes, newCh) - } - - res, err := tree.AddChanges(context.Background(), changes...) + res, err := tree.AddRawChanges(context.Background(), rawChanges...) assert.Equal(t, res.Summary, AddResultSummaryAppend) aclState := tree.ACLState() @@ -135,16 +126,7 @@ func TestACLTree_UserJoinUpdate_Rebuild(t *testing.T) { t.Fatalf("should Build acl ACLState without err: %v", err) } rawChanges := thr.GetUpdates("rebuild") - var changes []*Change - for _, ch := range rawChanges { - newCh, err := NewFromRawChange(ch) - if err != nil { - t.Fatalf("should be able to create change from raw: %v", err) - } - changes = append(changes, newCh) - } - - res, err := tree.AddChanges(context.Background(), changes...) + res, err := tree.AddRawChanges(context.Background(), rawChanges...) assert.Equal(t, res.Summary, AddResultSummaryRebuild) aclState := tree.ACLState() diff --git a/service/sync/requesthandler.go b/service/sync/requesthandler.go index c935885a..b425af6f 100644 --- a/service/sync/requesthandler.go +++ b/service/sync/requesthandler.go @@ -2,6 +2,7 @@ package sync import ( "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" @@ -13,19 +14,44 @@ type requestHander struct { client SyncClient } -func (r *requestHander) HandleHeadUpdate(ctx context.Context, senderId string, update *syncpb.SyncHeadUpdate) error { - err := r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error { - _, err := tree.AddRawChanges(ctx, update.Changes...) +func (r *requestHander) HandleHeadUpdate(ctx context.Context, senderId string, update *syncpb.SyncHeadUpdate) (err error) { + var fullRequest *syncpb.SyncFullRequest + var addedChanges []*aclpb.RawChange + var headsWithPath []acltree.HeadWithPathToRoot + defer func() { + if err != nil || fullRequest != nil { + return + } + newUpdate := syncpb.NewHeadsUpdate(update.TreeId, headsWithPath, addedChanges) + err = r.client.NotifyHeadsChanged(newUpdate) + }() + err = r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error { + // TODO: check if we already have those changes + res, err := tree.AddRawChanges(ctx, update.Changes...) if err != nil { return err } + addedChanges = res.Added shouldFullSync := !r.compareHeads(update.Heads, tree.Heads()) - + if shouldFullSync { + fullRequest, err = r.prepareFullSyncRequest(tree) + if err != nil { + return err + } + } + headsWithPath = tree.HeadsPathToRoot() return nil }) if err != nil { return err } + if fullRequest != nil { + return r.client.RequestFullSync(senderId, fullRequest) + } + return +} + +func (r *requestHander) HandleFullSync(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) error { return nil } @@ -39,5 +65,5 @@ func (r *requestHander) compareHeads(syncHeads []*syncpb.SyncHead, heads []strin } func (r *requestHander) prepareFullSyncRequest(tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) { - + return nil, nil } diff --git a/service/sync/syncpb/pbutils.go b/service/sync/syncpb/pbutils.go new file mode 100644 index 00000000..fddc86ec --- /dev/null +++ b/service/sync/syncpb/pbutils.go @@ -0,0 +1,22 @@ +package syncpb + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" +) + +func NewHeadsUpdate(treeId string, headsWithPath []acltree.HeadWithPathToRoot, changes []*aclpb.RawChange) *SyncHeadUpdate { + var heads []*SyncHead + for _, headWithPath := range headsWithPath { + syncHead := &SyncHead{ + Id: headWithPath.Id, + SnapshotPath: headWithPath.Path, + } + heads = append(heads, syncHead) + } + return &SyncHeadUpdate{ + Heads: heads, + Changes: changes, + TreeId: treeId, + } +} From 67e0956042e05619e8fd81656e12143f731257e9 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 15 Jul 2022 18:10:31 +0200 Subject: [PATCH 12/40] Fix request handler heads update logic --- pkg/acl/acltree/acltree.go | 38 +-- service/sync/requesthandler.go | 29 +- service/sync/syncpb/pbutils.go | 22 -- service/sync/syncpb/protos/sync.proto | 14 +- service/sync/syncpb/sync.pb.go | 460 +++++++++++--------------- 5 files changed, 220 insertions(+), 343 deletions(-) delete mode 100644 service/sync/syncpb/pbutils.go diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index 53690850..49e530db 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -24,11 +24,6 @@ type AddResult struct { Summary AddResultSummary } -type HeadWithPathToRoot struct { - Id string - Path []string -} - type TreeUpdateListener interface { Update(tree ACLTree) Rebuild(tree ACLTree) @@ -49,7 +44,7 @@ type ACLTree interface { Iterate(func(change *Change) bool) IterateFrom(string, func(change *Change) bool) HasChange(string) bool - HeadsPathToRoot() []HeadWithPathToRoot + SnapshotPath() []string Close() error } @@ -391,27 +386,20 @@ func (a *aclTree) Close() error { return nil } -func (a *aclTree) HeadsPathToRoot() []HeadWithPathToRoot { +func (a *aclTree) SnapshotPath() []string { a.RLock() defer a.RUnlock() - var headsWithPath []HeadWithPathToRoot - for _, h := range a.fullTree.Heads() { - headWithPath := HeadWithPathToRoot{ - Id: h, + + var path []string + // TODO: think that the user may have not all of the snapshots locally + currentSnapshotId := a.fullTree.RootId() + for currentSnapshotId != "" { + sn, err := a.treeBuilder.loadChange(currentSnapshotId) + if err != nil { + break } - var path []string - // TODO: think that the user may have not all of the snapshots locally - currentSnapshotId := a.fullTree.attached[h].SnapshotId - for currentSnapshotId != "" { - sn, err := a.treeBuilder.loadChange(currentSnapshotId) - if err != nil { - break - } - path = append(path, currentSnapshotId) - currentSnapshotId = sn.SnapshotId - } - headWithPath.Path = path - headsWithPath = append(headsWithPath, headWithPath) + path = append(path, currentSnapshotId) + currentSnapshotId = sn.SnapshotId } - return headsWithPath + return path } diff --git a/service/sync/requesthandler.go b/service/sync/requesthandler.go index b425af6f..65f2972d 100644 --- a/service/sync/requesthandler.go +++ b/service/sync/requesthandler.go @@ -2,7 +2,6 @@ package sync import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" @@ -16,30 +15,34 @@ type requestHander struct { func (r *requestHander) HandleHeadUpdate(ctx context.Context, senderId string, update *syncpb.SyncHeadUpdate) (err error) { var fullRequest *syncpb.SyncFullRequest - var addedChanges []*aclpb.RawChange - var headsWithPath []acltree.HeadWithPathToRoot + var snapshotPath []string + var result acltree.AddResult defer func() { if err != nil || fullRequest != nil { return } - newUpdate := syncpb.NewHeadsUpdate(update.TreeId, headsWithPath, addedChanges) + newUpdate := &syncpb.SyncHeadUpdate{ + Heads: result.Heads, + Changes: result.Added, + SnapshotPath: snapshotPath, + TreeId: update.TreeId, + } err = r.client.NotifyHeadsChanged(newUpdate) }() err = r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes - res, err := tree.AddRawChanges(ctx, update.Changes...) + result, err = tree.AddRawChanges(ctx, update.Changes...) if err != nil { return err } - addedChanges = res.Added - shouldFullSync := !r.compareHeads(update.Heads, tree.Heads()) + shouldFullSync := !slice.UnsortedEquals(update.Heads, tree.Heads()) + snapshotPath = tree.SnapshotPath() if shouldFullSync { fullRequest, err = r.prepareFullSyncRequest(tree) if err != nil { return err } } - headsWithPath = tree.HeadsPathToRoot() return nil }) if err != nil { @@ -55,15 +58,7 @@ func (r *requestHander) HandleFullSync(ctx context.Context, senderId string, req return nil } -func (r *requestHander) compareHeads(syncHeads []*syncpb.SyncHead, heads []string) bool { - for _, head := range syncHeads { - if slice.FindPos(heads, head.Id) == -1 { - return false - } - } - return true -} - func (r *requestHander) prepareFullSyncRequest(tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) { + return nil, nil } diff --git a/service/sync/syncpb/pbutils.go b/service/sync/syncpb/pbutils.go deleted file mode 100644 index fddc86ec..00000000 --- a/service/sync/syncpb/pbutils.go +++ /dev/null @@ -1,22 +0,0 @@ -package syncpb - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" -) - -func NewHeadsUpdate(treeId string, headsWithPath []acltree.HeadWithPathToRoot, changes []*aclpb.RawChange) *SyncHeadUpdate { - var heads []*SyncHead - for _, headWithPath := range headsWithPath { - syncHead := &SyncHead{ - Id: headWithPath.Id, - SnapshotPath: headWithPath.Path, - } - heads = append(heads, syncHead) - } - return &SyncHeadUpdate{ - Heads: heads, - Changes: changes, - TreeId: treeId, - } -} diff --git a/service/sync/syncpb/protos/sync.proto b/service/sync/syncpb/protos/sync.proto index b1ab6905..b67e18a1 100644 --- a/service/sync/syncpb/protos/sync.proto +++ b/service/sync/syncpb/protos/sync.proto @@ -6,28 +6,26 @@ import "pkg/acl/aclchanges/aclpb/protos/aclchanges.proto"; message Sync { message HeadUpdate { - repeated Head heads = 1; + repeated string heads = 1; repeated acl.RawChange changes = 2; string treeId = 3; - } - - message Head { - string id = 1; - repeated string snapshotPath = 2; + repeated string snapshotPath = 4; } message Full { // here with send the request with all changes we have (we already know sender's snapshot path) message Request { - repeated Head heads = 1; + repeated string heads = 1; repeated acl.RawChange changes = 2; string treeId = 3; + repeated string snapshotPath = 4; } message Response { - repeated Head heads = 1; + repeated string heads = 1; repeated acl.RawChange changes = 2; string treeId = 3; + repeated string snapshotPath = 4; } } } \ No newline at end of file diff --git a/service/sync/syncpb/sync.pb.go b/service/sync/syncpb/sync.pb.go index 889ae169..f06b2d27 100644 --- a/service/sync/syncpb/sync.pb.go +++ b/service/sync/syncpb/sync.pb.go @@ -60,9 +60,10 @@ func (m *Sync) XXX_DiscardUnknown() { var xxx_messageInfo_Sync proto.InternalMessageInfo type SyncHeadUpdate struct { - Heads []*SyncHead `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` + SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` } func (m *SyncHeadUpdate) Reset() { *m = SyncHeadUpdate{} } @@ -98,7 +99,7 @@ func (m *SyncHeadUpdate) XXX_DiscardUnknown() { var xxx_messageInfo_SyncHeadUpdate proto.InternalMessageInfo -func (m *SyncHeadUpdate) GetHeads() []*SyncHead { +func (m *SyncHeadUpdate) GetHeads() []string { if m != nil { return m.Heads } @@ -119,52 +120,7 @@ func (m *SyncHeadUpdate) GetTreeId() string { return "" } -type SyncHead struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - SnapshotPath []string `protobuf:"bytes,2,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` -} - -func (m *SyncHead) Reset() { *m = SyncHead{} } -func (m *SyncHead) String() string { return proto.CompactTextString(m) } -func (*SyncHead) ProtoMessage() {} -func (*SyncHead) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 1} -} -func (m *SyncHead) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncHead) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncHead.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *SyncHead) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncHead.Merge(m, src) -} -func (m *SyncHead) XXX_Size() int { - return m.Size() -} -func (m *SyncHead) XXX_DiscardUnknown() { - xxx_messageInfo_SyncHead.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncHead proto.InternalMessageInfo - -func (m *SyncHead) GetId() string { - if m != nil { - return m.Id - } - return "" -} - -func (m *SyncHead) GetSnapshotPath() []string { +func (m *SyncHeadUpdate) GetSnapshotPath() []string { if m != nil { return m.SnapshotPath } @@ -178,7 +134,7 @@ func (m *SyncFull) Reset() { *m = SyncFull{} } func (m *SyncFull) String() string { return proto.CompactTextString(m) } func (*SyncFull) ProtoMessage() {} func (*SyncFull) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 2} + return fileDescriptor_5f66cdd599c6466f, []int{0, 1} } func (m *SyncFull) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -209,16 +165,17 @@ var xxx_messageInfo_SyncFull proto.InternalMessageInfo // here with send the request with all changes we have (we already know sender's snapshot path) type SyncFullRequest struct { - Heads []*SyncHead `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` + SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` } func (m *SyncFullRequest) Reset() { *m = SyncFullRequest{} } func (m *SyncFullRequest) String() string { return proto.CompactTextString(m) } func (*SyncFullRequest) ProtoMessage() {} func (*SyncFullRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 2, 0} + return fileDescriptor_5f66cdd599c6466f, []int{0, 1, 0} } func (m *SyncFullRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -247,7 +204,7 @@ func (m *SyncFullRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SyncFullRequest proto.InternalMessageInfo -func (m *SyncFullRequest) GetHeads() []*SyncHead { +func (m *SyncFullRequest) GetHeads() []string { if m != nil { return m.Heads } @@ -268,17 +225,25 @@ func (m *SyncFullRequest) GetTreeId() string { return "" } +func (m *SyncFullRequest) GetSnapshotPath() []string { + if m != nil { + return m.SnapshotPath + } + return nil +} + type SyncFullResponse struct { - Heads []*SyncHead `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` + SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` } func (m *SyncFullResponse) Reset() { *m = SyncFullResponse{} } func (m *SyncFullResponse) String() string { return proto.CompactTextString(m) } func (*SyncFullResponse) ProtoMessage() {} func (*SyncFullResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 2, 1} + return fileDescriptor_5f66cdd599c6466f, []int{0, 1, 1} } func (m *SyncFullResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -307,7 +272,7 @@ func (m *SyncFullResponse) XXX_DiscardUnknown() { var xxx_messageInfo_SyncFullResponse proto.InternalMessageInfo -func (m *SyncFullResponse) GetHeads() []*SyncHead { +func (m *SyncFullResponse) GetHeads() []string { if m != nil { return m.Heads } @@ -328,10 +293,16 @@ func (m *SyncFullResponse) GetTreeId() string { return "" } +func (m *SyncFullResponse) GetSnapshotPath() []string { + if m != nil { + return m.SnapshotPath + } + return nil +} + func init() { proto.RegisterType((*Sync)(nil), "anytype.Sync") proto.RegisterType((*SyncHeadUpdate)(nil), "anytype.Sync.HeadUpdate") - proto.RegisterType((*SyncHead)(nil), "anytype.Sync.Head") proto.RegisterType((*SyncFull)(nil), "anytype.Sync.Full") proto.RegisterType((*SyncFullRequest)(nil), "anytype.Sync.Full.Request") proto.RegisterType((*SyncFullResponse)(nil), "anytype.Sync.Full.Response") @@ -342,26 +313,25 @@ func init() { } var fileDescriptor_5f66cdd599c6466f = []byte{ - // 297 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x92, 0xb1, 0x4e, 0xc3, 0x30, - 0x10, 0x86, 0xeb, 0xb6, 0xb4, 0xf4, 0x40, 0x1d, 0x3c, 0xa0, 0x28, 0x83, 0x55, 0x55, 0x42, 0xca, - 0xe4, 0x22, 0xd8, 0x18, 0x41, 0x42, 0xb0, 0x21, 0x23, 0x16, 0x36, 0xd7, 0x3e, 0x35, 0x15, 0x91, - 0x63, 0x6a, 0xb7, 0x90, 0xb7, 0xe0, 0x61, 0x78, 0x08, 0xc6, 0x8e, 0x8c, 0x28, 0x79, 0x06, 0x76, - 0x14, 0x27, 0xa8, 0xe2, 0x05, 0x3a, 0xd8, 0xba, 0xfb, 0xef, 0xbb, 0xdf, 0x96, 0x7d, 0x70, 0xea, - 0x70, 0xb5, 0x59, 0x2a, 0x9c, 0xb9, 0xc2, 0xa8, 0xb0, 0xd9, 0xf9, 0xcc, 0xae, 0x72, 0x9f, 0xbb, - 0x90, 0xf1, 0x10, 0xd3, 0xa1, 0x34, 0x85, 0x2f, 0x2c, 0xc6, 0x67, 0xf6, 0x79, 0x31, 0x93, 0x2a, - 0xab, 0x97, 0x4a, 0xa5, 0x59, 0xa0, 0xab, 0xc3, 0x5d, 0xd3, 0x4e, 0x6f, 0x5a, 0xa7, 0x1f, 0x3d, - 0xe8, 0x3f, 0x14, 0x46, 0xc5, 0x6f, 0x00, 0xb7, 0x28, 0xf5, 0xa3, 0xd5, 0xd2, 0x23, 0x4d, 0xe0, - 0x20, 0x45, 0xa9, 0x5d, 0x44, 0x26, 0xbd, 0xe4, 0xe8, 0x9c, 0xf2, 0xf6, 0x04, 0x5e, 0xb3, 0xbc, - 0x06, 0x45, 0x03, 0xd0, 0x04, 0x86, 0xad, 0x63, 0xd4, 0x0d, 0xec, 0x98, 0x4b, 0x95, 0x71, 0x21, - 0x5f, 0xaf, 0x83, 0x2c, 0xfe, 0xca, 0xf4, 0x04, 0x06, 0x7e, 0x85, 0x78, 0xa7, 0xa3, 0xde, 0x84, - 0x24, 0x23, 0xd1, 0x66, 0xf1, 0x25, 0xf4, 0x6b, 0x43, 0x3a, 0x86, 0xee, 0x52, 0x47, 0x24, 0xd4, - 0xba, 0x4b, 0x4d, 0xa7, 0x70, 0xec, 0x8c, 0xb4, 0x2e, 0xcd, 0xfd, 0xbd, 0xf4, 0x69, 0xb0, 0x1f, - 0x89, 0x7f, 0x5a, 0xfc, 0x43, 0xa0, 0x7f, 0xb3, 0xce, 0xb2, 0x78, 0x0d, 0x43, 0x81, 0x2f, 0x6b, - 0x74, 0x7e, 0xaf, 0x77, 0xdf, 0xc0, 0xa1, 0x40, 0x67, 0x73, 0xe3, 0xf6, 0xfa, 0x66, 0x57, 0x93, - 0xcf, 0x92, 0x91, 0x6d, 0xc9, 0xc8, 0x77, 0xc9, 0xc8, 0x7b, 0xc5, 0x3a, 0xdb, 0x8a, 0x75, 0xbe, - 0x2a, 0xd6, 0x79, 0x1a, 0x34, 0x53, 0x32, 0x1f, 0x84, 0xff, 0xbd, 0xf8, 0x0d, 0x00, 0x00, 0xff, - 0xff, 0xac, 0xf4, 0x50, 0xb7, 0x43, 0x02, 0x00, 0x00, + // 273 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2d, 0x4e, 0x2d, 0x2a, + 0xcb, 0x4c, 0x4e, 0xd5, 0x2f, 0xae, 0xcc, 0x4b, 0x06, 0x13, 0x05, 0x49, 0xfa, 0x05, 0x45, 0xf9, + 0x25, 0xf9, 0xc5, 0x60, 0x9e, 0x1e, 0x98, 0x2d, 0xc4, 0x9e, 0x98, 0x57, 0x59, 0x52, 0x59, 0x90, + 0x2a, 0x65, 0x50, 0x90, 0x9d, 0xae, 0x9f, 0x98, 0x9c, 0x03, 0xc2, 0xc9, 0x19, 0x89, 0x79, 0xe9, + 0xa9, 0xc5, 0x20, 0x26, 0x42, 0x13, 0x42, 0x1c, 0xa2, 0x55, 0x69, 0x35, 0x33, 0x17, 0x4b, 0x70, + 0x65, 0x5e, 0xb2, 0x54, 0x07, 0x23, 0x17, 0x97, 0x47, 0x6a, 0x62, 0x4a, 0x68, 0x41, 0x4a, 0x62, + 0x49, 0xaa, 0x90, 0x08, 0x17, 0x6b, 0x46, 0x6a, 0x62, 0x4a, 0xb1, 0x04, 0xa3, 0x02, 0xb3, 0x06, + 0x67, 0x10, 0x84, 0x23, 0xa4, 0xc1, 0xc5, 0x0e, 0xd5, 0x2e, 0xc1, 0xa4, 0xc0, 0xac, 0xc1, 0x6d, + 0xc4, 0xa7, 0x97, 0x98, 0x9c, 0xa3, 0x17, 0x94, 0x58, 0xee, 0x0c, 0x16, 0x0e, 0x82, 0x49, 0x0b, + 0x89, 0x71, 0xb1, 0x95, 0x14, 0xa5, 0xa6, 0x7a, 0xa6, 0x48, 0x30, 0x2b, 0x30, 0x6a, 0x70, 0x06, + 0x41, 0x79, 0x42, 0x4a, 0x5c, 0x3c, 0xc5, 0x79, 0x89, 0x05, 0xc5, 0x19, 0xf9, 0x25, 0x01, 0x89, + 0x25, 0x19, 0x12, 0x2c, 0x60, 0xe3, 0x51, 0xc4, 0xa4, 0xa6, 0x33, 0x71, 0xb1, 0xb8, 0x95, 0xe6, + 0xe4, 0x48, 0xb5, 0x32, 0x72, 0xb1, 0x07, 0xa5, 0x16, 0x96, 0xa6, 0x16, 0x97, 0x0c, 0xa8, 0x83, + 0xda, 0x18, 0xb9, 0x38, 0x82, 0x52, 0x8b, 0x0b, 0xf2, 0xf3, 0x8a, 0x07, 0x34, 0x64, 0x9c, 0x14, + 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, + 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x8a, 0x0d, 0x92, 0x38, 0x92, 0xd8, + 0xc0, 0xd1, 0x6a, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x90, 0x29, 0xbc, 0x62, 0x3a, 0x02, 0x00, + 0x00, } func (m *Sync) Marshal() (dAtA []byte, err error) { @@ -407,6 +377,15 @@ func (m *SyncHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } if len(m.TreeId) > 0 { i -= len(m.TreeId) copy(dAtA[i:], m.TreeId) @@ -430,14 +409,9 @@ func (m *SyncHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { } if len(m.Heads) > 0 { for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Heads[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } + i -= len(m.Heads[iNdEx]) + copy(dAtA[i:], m.Heads[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.Heads[iNdEx]))) i-- dAtA[i] = 0xa } @@ -445,45 +419,6 @@ func (m *SyncHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SyncHead) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SyncHead) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncHead) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.SnapshotPath) > 0 { - for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.SnapshotPath[iNdEx]) - copy(dAtA[i:], m.SnapshotPath[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintSync(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *SyncFull) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -527,6 +462,15 @@ func (m *SyncFullRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } if len(m.TreeId) > 0 { i -= len(m.TreeId) copy(dAtA[i:], m.TreeId) @@ -550,14 +494,9 @@ func (m *SyncFullRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { } if len(m.Heads) > 0 { for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Heads[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } + i -= len(m.Heads[iNdEx]) + copy(dAtA[i:], m.Heads[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.Heads[iNdEx]))) i-- dAtA[i] = 0xa } @@ -585,6 +524,15 @@ func (m *SyncFullResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } if len(m.TreeId) > 0 { i -= len(m.TreeId) copy(dAtA[i:], m.TreeId) @@ -608,14 +556,9 @@ func (m *SyncFullResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { } if len(m.Heads) > 0 { for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Heads[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } + i -= len(m.Heads[iNdEx]) + copy(dAtA[i:], m.Heads[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.Heads[iNdEx]))) i-- dAtA[i] = 0xa } @@ -650,8 +593,8 @@ func (m *SyncHeadUpdate) Size() (n int) { var l int _ = l if len(m.Heads) > 0 { - for _, e := range m.Heads { - l = e.Size() + for _, s := range m.Heads { + l = len(s) n += 1 + l + sovSync(uint64(l)) } } @@ -665,19 +608,6 @@ func (m *SyncHeadUpdate) Size() (n int) { if l > 0 { n += 1 + l + sovSync(uint64(l)) } - return n -} - -func (m *SyncHead) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } if len(m.SnapshotPath) > 0 { for _, s := range m.SnapshotPath { l = len(s) @@ -703,8 +633,8 @@ func (m *SyncFullRequest) Size() (n int) { var l int _ = l if len(m.Heads) > 0 { - for _, e := range m.Heads { - l = e.Size() + for _, s := range m.Heads { + l = len(s) n += 1 + l + sovSync(uint64(l)) } } @@ -718,6 +648,12 @@ func (m *SyncFullRequest) Size() (n int) { if l > 0 { n += 1 + l + sovSync(uint64(l)) } + if len(m.SnapshotPath) > 0 { + for _, s := range m.SnapshotPath { + l = len(s) + n += 1 + l + sovSync(uint64(l)) + } + } return n } @@ -728,8 +664,8 @@ func (m *SyncFullResponse) Size() (n int) { var l int _ = l if len(m.Heads) > 0 { - for _, e := range m.Heads { - l = e.Size() + for _, s := range m.Heads { + l = len(s) n += 1 + l + sovSync(uint64(l)) } } @@ -743,6 +679,12 @@ func (m *SyncFullResponse) Size() (n int) { if l > 0 { n += 1 + l + sovSync(uint64(l)) } + if len(m.SnapshotPath) > 0 { + for _, s := range m.SnapshotPath { + l = len(s) + n += 1 + l + sovSync(uint64(l)) + } + } return n } @@ -835,7 +777,7 @@ func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowSync @@ -845,25 +787,23 @@ func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthSync } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthSync } if postIndex > l { return io.ErrUnexpectedEOF } - m.Heads = append(m.Heads, &SyncHead{}) - if err := m.Heads[len(m.Heads)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: if wireType != 2 { @@ -931,89 +871,7 @@ func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { } m.TreeId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncHead) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Head: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Head: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) } @@ -1149,7 +1007,7 @@ func (m *SyncFullRequest) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowSync @@ -1159,25 +1017,23 @@ func (m *SyncFullRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthSync } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthSync } if postIndex > l { return io.ErrUnexpectedEOF } - m.Heads = append(m.Heads, &SyncHead{}) - if err := m.Heads[len(m.Heads)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: if wireType != 2 { @@ -1245,6 +1101,38 @@ func (m *SyncFullRequest) Unmarshal(dAtA []byte) error { } m.TreeId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) @@ -1299,7 +1187,7 @@ func (m *SyncFullResponse) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowSync @@ -1309,25 +1197,23 @@ func (m *SyncFullResponse) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthSync } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthSync } if postIndex > l { return io.ErrUnexpectedEOF } - m.Heads = append(m.Heads, &SyncHead{}) - if err := m.Heads[len(m.Heads)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: if wireType != 2 { @@ -1395,6 +1281,38 @@ func (m *SyncFullResponse) Unmarshal(dAtA []byte) error { } m.TreeId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) From 5211267cd2a0d4eb4f215bb4fd52d41cb093c673 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 16 Jul 2022 00:50:08 +0200 Subject: [PATCH 13/40] Provide for getting new tree --- pkg/acl/treestorage/inmemory.go | 31 ++++++++++++++++++++++++ pkg/acl/treestorage/provider.go | 35 +++------------------------ service/sync/requesthandler.go | 43 ++++++++++++++++++++------------- 3 files changed, 60 insertions(+), 49 deletions(-) diff --git a/pkg/acl/treestorage/inmemory.go b/pkg/acl/treestorage/inmemory.go index 3120d27a..8a2b7865 100644 --- a/pkg/acl/treestorage/inmemory.go +++ b/pkg/acl/treestorage/inmemory.go @@ -134,3 +134,34 @@ func (t *inMemoryTreeStorage) GetChange(ctx context.Context, changeId string) (* } return nil, fmt.Errorf("could not get change with id: %s", changeId) } + +type inMemoryTreeStorageProvider struct { + trees map[string]TreeStorage +} + +func (i *inMemoryTreeStorageProvider) TreeStorage(treeId string) (TreeStorage, error) { + if tree, exists := i.trees[treeId]; exists { + return tree, nil + } + return nil, UnknownTreeId +} + +func (i *inMemoryTreeStorageProvider) InsertTree(tree TreeStorage) error { + if tree == nil { + return fmt.Errorf("tree should not be nil") + } + + id, err := tree.TreeID() + if err != nil { + return err + } + + i.trees[id] = tree + return nil +} + +func NewInMemoryTreeStorageProvider() Provider { + return &inMemoryTreeStorageProvider{ + trees: make(map[string]TreeStorage), + } +} diff --git a/pkg/acl/treestorage/provider.go b/pkg/acl/treestorage/provider.go index bf0c074c..c62096db 100644 --- a/pkg/acl/treestorage/provider.go +++ b/pkg/acl/treestorage/provider.go @@ -1,39 +1,10 @@ package treestorage -import "fmt" +import "errors" + +var UnknownTreeId = errors.New("tree does not exist") type Provider interface { TreeStorage(treeId string) (TreeStorage, error) InsertTree(tree TreeStorage) error } - -type inMemoryTreeStorageProvider struct { - trees map[string]TreeStorage -} - -func (i *inMemoryTreeStorageProvider) TreeStorage(treeId string) (TreeStorage, error) { - if tree, exists := i.trees[treeId]; exists { - return tree, nil - } - return nil, fmt.Errorf("tree with id %s doesn't exist", treeId) -} - -func (i *inMemoryTreeStorageProvider) InsertTree(tree TreeStorage) error { - if tree == nil { - return fmt.Errorf("tree should not be nil") - } - - id, err := tree.TreeID() - if err != nil { - return err - } - - i.trees[id] = tree - return nil -} - -func NewInMemoryTreeStorageProvider() Provider { - return &inMemoryTreeStorageProvider{ - trees: make(map[string]TreeStorage), - } -} diff --git a/service/sync/requesthandler.go b/service/sync/requesthandler.go index 65f2972d..b4d0758b 100644 --- a/service/sync/requesthandler.go +++ b/service/sync/requesthandler.go @@ -3,6 +3,7 @@ package sync import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" @@ -14,21 +15,12 @@ type requestHander struct { } func (r *requestHander) HandleHeadUpdate(ctx context.Context, senderId string, update *syncpb.SyncHeadUpdate) (err error) { - var fullRequest *syncpb.SyncFullRequest - var snapshotPath []string - var result acltree.AddResult - defer func() { - if err != nil || fullRequest != nil { - return - } - newUpdate := &syncpb.SyncHeadUpdate{ - Heads: result.Heads, - Changes: result.Added, - SnapshotPath: snapshotPath, - TreeId: update.TreeId, - } - err = r.client.NotifyHeadsChanged(newUpdate) - }() + var ( + fullRequest *syncpb.SyncFullRequest + snapshotPath []string + result acltree.AddResult + ) + err = r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes result, err = tree.AddRawChanges(ctx, update.Changes...) @@ -45,16 +37,33 @@ func (r *requestHander) HandleHeadUpdate(ctx context.Context, senderId string, u } return nil }) - if err != nil { - return err + // if there are no such tree + if err == treestorage.UnknownTreeId { + fullRequest = &syncpb.SyncFullRequest{ + TreeId: update.TreeId, + } } + // if we have incompatible heads, or we haven't seen the tree at all if fullRequest != nil { return r.client.RequestFullSync(senderId, fullRequest) } + // if error or nothing has changed + if err != nil || len(result.Added) == 0 { + return err + } + // otherwise sending heads update message + newUpdate := &syncpb.SyncHeadUpdate{ + Heads: result.Heads, + Changes: result.Added, + SnapshotPath: snapshotPath, + TreeId: update.TreeId, + } + err = r.client.NotifyHeadsChanged(newUpdate) return } func (r *requestHander) HandleFullSync(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) error { + // TODO: add case of new tree return nil } From bc5ffe1828e3beec27976991b52d151f48295cf1 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 16 Jul 2022 12:24:49 +0200 Subject: [PATCH 14/40] Add getting common snapshot logic --- pkg/acl/acltree/acltree.go | 91 +++++++++++++++---- pkg/acl/acltree/change.go | 1 + pkg/acl/acltree/changeloader.go | 6 ++ pkg/acl/acltree/treebuilder.go | 9 +- pkg/acl/example/plaintextdocument/document.go | 1 + pkg/acl/treestorage/inmemory.go | 2 +- pkg/acl/treestorage/provider.go | 2 +- service/sync/pubsub.go | 13 --- service/sync/requesthandler.go | 27 ++++-- service/sync/service.go | 1 - service/treecache/service.go | 3 + 11 files changed, 111 insertions(+), 45 deletions(-) delete mode 100644 service/sync/pubsub.go diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index 49e530db..5cd85957 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -2,6 +2,7 @@ package acltree import ( "context" + "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" @@ -35,7 +36,16 @@ func (n NoOpListener) Update(tree ACLTree) {} func (n NoOpListener) Rebuild(tree ACLTree) {} +type RWLocker interface { + sync.Locker + RLock() + RUnlock() +} + +var ErrNoCommonSnapshot = errors.New("trees doesn't have a common snapshot") + type ACLTree interface { + RWLocker ACLState() *ACLState AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*Change, error) AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) @@ -45,6 +55,7 @@ type ACLTree interface { IterateFrom(string, func(change *Change) bool) HasChange(string) bool SnapshotPath() []string + ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) Close() error } @@ -204,17 +215,12 @@ func (a *aclTree) rebuildFromStorage(fromStart bool) error { } func (a *aclTree) ACLState() *ACLState { - // TODO: probably locks should be happening outside because we are using object cache - a.RLock() - defer a.RUnlock() return a.aclState } func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuilder) error) (*Change, error) { // TODO: add snapshot creation logic - a.Lock() defer func() { - a.Unlock() // TODO: should this be called in a separate goroutine to prevent accidental cycles (tree->updater->tree) a.updateListener.Update(a) }() @@ -248,7 +254,6 @@ func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuild } func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (AddResult, error) { - a.Lock() // TODO: make proper error handling, because there are a lot of corner cases where this will break var err error var mode Mode @@ -278,7 +283,6 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha return } - a.Unlock() switch mode { case Append: a.updateListener.Update(a) @@ -350,20 +354,14 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha } func (a *aclTree) Iterate(f func(change *Change) bool) { - a.RLock() - defer a.RUnlock() a.fullTree.Iterate(a.fullTree.RootId(), f) } func (a *aclTree) IterateFrom(s string, f func(change *Change) bool) { - a.RLock() - defer a.RUnlock() a.fullTree.Iterate(s, f) } func (a *aclTree) HasChange(s string) bool { - a.RLock() - defer a.RUnlock() _, attachedExists := a.fullTree.attached[s] _, unattachedExists := a.fullTree.unAttached[s] _, invalidExists := a.fullTree.invalidChanges[s] @@ -371,14 +369,10 @@ func (a *aclTree) HasChange(s string) bool { } func (a *aclTree) Heads() []string { - a.RLock() - defer a.RUnlock() return a.fullTree.Heads() } func (a *aclTree) Root() *Change { - a.RLock() - defer a.RUnlock() return a.fullTree.Root() } @@ -387,8 +381,7 @@ func (a *aclTree) Close() error { } func (a *aclTree) SnapshotPath() []string { - a.RLock() - defer a.RUnlock() + // TODO: think about caching this var path []string // TODO: think that the user may have not all of the snapshots locally @@ -403,3 +396,63 @@ func (a *aclTree) SnapshotPath() []string { } return path } + +func (a *aclTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { + // TODO: think about when the clients will have their full acl tree and thus full snapshots + // but no changes after some of the snapshots + commonSnapshot, err := a.commonSnapshotForTwoPaths(a.SnapshotPath(), theirPath) + if err != nil { + return nil, err + } + // we presume that we have everything after the common snapshot, though this may not be the case in case of clients and only ACL tree changes + changes, err := a.treeBuilder.dfs(a.fullTree.Heads(), commonSnapshot, func(id string) (*Change, error) { + // using custom load function to skip verification step and save raw changes + raw, err := a.treeStorage.GetChange(context.Background(), id) + if err != nil { + return nil, err + } + + aclChange, err := a.treeBuilder.makeUnverifiedACLChange(raw) + if err != nil { + return nil, err + } + + ch := NewChange(id, aclChange) + ch.Raw = raw + return ch, nil + }) + if err != nil { + return nil, err + } + var rawChanges []*aclpb.RawChange + for _, ch := range changes { + rawChanges = append(rawChanges, ch.Raw) + } + return rawChanges, nil +} + +func (a *aclTree) commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) { + var i int + var j int +OuterLoop: + // find starting point from the right + for i = len(ourPath) - 1; i >= 0; i-- { + for j = len(theirPath) - 1; j >= 0; j-- { + // most likely there would be only one comparison, because mostly the snapshot path will start from the root for nodes + if ourPath[i] == theirPath[j] { + break OuterLoop + } + } + } + if i < 0 || j < 0 { + return "", ErrNoCommonSnapshot + } + // find last common element of the sequence moving from right to left + for i >= 0 && j >= 0 { + if ourPath[i] == theirPath[j] { + i-- + j-- + } + } + return ourPath[i+1], nil +} diff --git a/pkg/acl/acltree/change.go b/pkg/acl/acltree/change.go index c768ef23..67eedf00 100644 --- a/pkg/acl/acltree/change.go +++ b/pkg/acl/acltree/change.go @@ -23,6 +23,7 @@ type Change struct { SnapshotId string IsSnapshot bool DecryptedDocumentChange []byte + Raw *aclpb.RawChange // this will not be present on all changes, we only need it sometimes Content *aclpb.ACLChange Sign []byte diff --git a/pkg/acl/acltree/changeloader.go b/pkg/acl/acltree/changeloader.go index d3b57a32..b308397a 100644 --- a/pkg/acl/acltree/changeloader.go +++ b/pkg/acl/acltree/changeloader.go @@ -91,3 +91,9 @@ func (c *changeLoader) makeVerifiedACLChange(change *aclpb.RawChange) (aclChange } return } + +func (c *changeLoader) makeUnverifiedACLChange(change *aclpb.RawChange) (aclChange *aclpb.ACLChange, err error) { + aclChange = new(aclpb.ACLChange) + err = proto.Unmarshal(change.Payload, aclChange) + return +} diff --git a/pkg/acl/acltree/treebuilder.go b/pkg/acl/acltree/treebuilder.go index c8aa9535..261a49f9 100644 --- a/pkg/acl/acltree/treebuilder.go +++ b/pkg/acl/acltree/treebuilder.go @@ -135,13 +135,16 @@ func (tb *treeBuilder) buildTree(heads []string, breakpoint string) (err error) return } tb.tree.AddFast(ch) - changes, err := tb.dfs(heads, breakpoint) + changes, err := tb.dfs(heads, breakpoint, tb.loadChange) tb.tree.AddFast(changes...) return } -func (tb *treeBuilder) dfs(heads []string, breakpoint string) (buf []*Change, err error) { +func (tb *treeBuilder) dfs( + heads []string, + breakpoint string, + load func(string) (*Change, error)) (buf []*Change, err error) { stack := make([]string, len(heads), len(heads)*2) copy(stack, heads) @@ -154,7 +157,7 @@ func (tb *treeBuilder) dfs(heads []string, breakpoint string) (buf []*Change, er continue } - ch, err := tb.loadChange(id) + ch, err := load(id) if err != nil { continue } diff --git a/pkg/acl/example/plaintextdocument/document.go b/pkg/acl/example/plaintextdocument/document.go index 80e760b0..b25b2f8e 100644 --- a/pkg/acl/example/plaintextdocument/document.go +++ b/pkg/acl/example/plaintextdocument/document.go @@ -17,6 +17,7 @@ type PlainTextDocument interface { AddText(ctx context.Context, text string) error } +// TODO: this struct is not thread-safe, so use it wisely :-) type plainTextDocument struct { heads []string aclTree acltree.ACLTree diff --git a/pkg/acl/treestorage/inmemory.go b/pkg/acl/treestorage/inmemory.go index 8a2b7865..b9015116 100644 --- a/pkg/acl/treestorage/inmemory.go +++ b/pkg/acl/treestorage/inmemory.go @@ -143,7 +143,7 @@ func (i *inMemoryTreeStorageProvider) TreeStorage(treeId string) (TreeStorage, e if tree, exists := i.trees[treeId]; exists { return tree, nil } - return nil, UnknownTreeId + return nil, ErrUnknownTreeId } func (i *inMemoryTreeStorageProvider) InsertTree(tree TreeStorage) error { diff --git a/pkg/acl/treestorage/provider.go b/pkg/acl/treestorage/provider.go index c62096db..fd442655 100644 --- a/pkg/acl/treestorage/provider.go +++ b/pkg/acl/treestorage/provider.go @@ -2,7 +2,7 @@ package treestorage import "errors" -var UnknownTreeId = errors.New("tree does not exist") +var ErrUnknownTreeId = errors.New("tree does not exist") type Provider interface { TreeStorage(treeId string) (TreeStorage, error) diff --git a/service/sync/pubsub.go b/service/sync/pubsub.go deleted file mode 100644 index b85c8e65..00000000 --- a/service/sync/pubsub.go +++ /dev/null @@ -1,13 +0,0 @@ -package sync - -type PubSubPayload struct { -} - -type PubSub interface { - Send(msg *PubSubPayload) error - Listen(chan *PubSubPayload) error -} - -func NewPubSub(topic string) PubSub { - return nil -} diff --git a/service/sync/requesthandler.go b/service/sync/requesthandler.go index b4d0758b..349f59d3 100644 --- a/service/sync/requesthandler.go +++ b/service/sync/requesthandler.go @@ -20,7 +20,7 @@ func (r *requestHander) HandleHeadUpdate(ctx context.Context, senderId string, u snapshotPath []string result acltree.AddResult ) - + err = r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes result, err = tree.AddRawChanges(ctx, update.Changes...) @@ -30,7 +30,7 @@ func (r *requestHander) HandleHeadUpdate(ctx context.Context, senderId string, u shouldFullSync := !slice.UnsortedEquals(update.Heads, tree.Heads()) snapshotPath = tree.SnapshotPath() if shouldFullSync { - fullRequest, err = r.prepareFullSyncRequest(tree) + fullRequest, err = r.prepareFullSyncRequest(update.TreeId, update.SnapshotPath, tree) if err != nil { return err } @@ -38,7 +38,7 @@ func (r *requestHander) HandleHeadUpdate(ctx context.Context, senderId string, u return nil }) // if there are no such tree - if err == treestorage.UnknownTreeId { + if err == treestorage.ErrUnknownTreeId { fullRequest = &syncpb.SyncFullRequest{ TreeId: update.TreeId, } @@ -62,12 +62,25 @@ func (r *requestHander) HandleHeadUpdate(ctx context.Context, senderId string, u return } -func (r *requestHander) HandleFullSync(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) error { +func (r *requestHander) HandleFullSyncRequest(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) error { // TODO: add case of new tree return nil } -func (r *requestHander) prepareFullSyncRequest(tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) { - - return nil, nil +func (r *requestHander) HandleFullSyncResponse(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) error { + // TODO: add case of new tree + return nil +} + +func (r *requestHander) prepareFullSyncRequest(treeId string, theirPath []string, tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) { + ourChanges, err := tree.ChangesAfterCommonSnapshot(theirPath) + if err != nil { + return nil, err + } + return &syncpb.SyncFullRequest{ + Heads: tree.Heads(), + Changes: ourChanges, + TreeId: treeId, + SnapshotPath: tree.SnapshotPath(), + }, nil } diff --git a/service/sync/service.go b/service/sync/service.go index e26d54eb..fd6839bb 100644 --- a/service/sync/service.go +++ b/service/sync/service.go @@ -6,7 +6,6 @@ import ( ) type service struct { - pubSub PubSub } const CName = "SyncService" diff --git a/service/treecache/service.go b/service/treecache/service.go index 0aef289c..654d12ca 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -31,6 +31,9 @@ func (s *service) Do(ctx context.Context, treeId string, f func(tree acltree.ACL if err != nil { return err } + aclTree := tree.(acltree.ACLTree) + aclTree.Lock() + defer aclTree.Unlock() return f(tree.(acltree.ACLTree)) } From d120da8000e51bf78fba12de29368cef27e8fc4e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 16 Jul 2022 13:21:46 +0200 Subject: [PATCH 15/40] Move logic to different components --- service/account/service.go | 2 +- service/sync/client/client.go | 56 +++++ service/sync/requesthandler.go | 86 -------- service/sync/requesthandler/requesthandler.go | 207 ++++++++++++++++++ service/sync/service.go | 43 ---- service/sync/syncclient.go | 8 - 6 files changed, 264 insertions(+), 138 deletions(-) create mode 100644 service/sync/client/client.go delete mode 100644 service/sync/requesthandler.go create mode 100644 service/sync/requesthandler/requesthandler.go delete mode 100644 service/sync/service.go delete mode 100644 service/sync/syncclient.go diff --git a/service/account/service.go b/service/account/service.go index b64a6a83..67adf192 100644 --- a/service/account/service.go +++ b/service/account/service.go @@ -26,7 +26,7 @@ func (s *service) Account() *account.AccountData { } type StaticAccount struct { - SigningKey string `yaml:"siginingKey"` + SigningKey string `yaml:"signingKey"` EncryptionKey string `yaml:"encryptionKey"` } diff --git a/service/sync/client/client.go b/service/sync/client/client.go new file mode 100644 index 00000000..8cc292de --- /dev/null +++ b/service/sync/client/client.go @@ -0,0 +1,56 @@ +package client + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" +) + +const CName = "SyncClient" + +type client struct { + handler requesthandler.RequestHandler +} + +func NewClient() app.Component { + return &client{} +} + +type Client interface { + NotifyHeadsChanged(update *syncpb.SyncHeadUpdate) error + RequestFullSync(id string, request *syncpb.SyncFullRequest) error + SendFullSyncResponse(id string, response *syncpb.SyncFullResponse) error +} + +func (c *client) Init(ctx context.Context, a *app.App) (err error) { + c.handler = a.MustComponent(requesthandler.CName).(requesthandler.RequestHandler) + return nil +} + +func (c *client) Name() (name string) { + return CName +} + +func (c *client) Run(ctx context.Context) (err error) { + return nil +} + +func (c *client) Close(ctx context.Context) (err error) { + return nil +} + +func (c *client) NotifyHeadsChanged(update *syncpb.SyncHeadUpdate) error { + //TODO implement me + panic("implement me") +} + +func (c *client) RequestFullSync(id string, request *syncpb.SyncFullRequest) error { + //TODO implement me + panic("implement me") +} + +func (c *client) SendFullSyncResponse(id string, response *syncpb.SyncFullResponse) error { + //TODO implement me + panic("implement me") +} diff --git a/service/sync/requesthandler.go b/service/sync/requesthandler.go deleted file mode 100644 index 349f59d3..00000000 --- a/service/sync/requesthandler.go +++ /dev/null @@ -1,86 +0,0 @@ -package sync - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" -) - -type requestHander struct { - treeCache treecache.Service - client SyncClient -} - -func (r *requestHander) HandleHeadUpdate(ctx context.Context, senderId string, update *syncpb.SyncHeadUpdate) (err error) { - var ( - fullRequest *syncpb.SyncFullRequest - snapshotPath []string - result acltree.AddResult - ) - - err = r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error { - // TODO: check if we already have those changes - result, err = tree.AddRawChanges(ctx, update.Changes...) - if err != nil { - return err - } - shouldFullSync := !slice.UnsortedEquals(update.Heads, tree.Heads()) - snapshotPath = tree.SnapshotPath() - if shouldFullSync { - fullRequest, err = r.prepareFullSyncRequest(update.TreeId, update.SnapshotPath, tree) - if err != nil { - return err - } - } - return nil - }) - // if there are no such tree - if err == treestorage.ErrUnknownTreeId { - fullRequest = &syncpb.SyncFullRequest{ - TreeId: update.TreeId, - } - } - // if we have incompatible heads, or we haven't seen the tree at all - if fullRequest != nil { - return r.client.RequestFullSync(senderId, fullRequest) - } - // if error or nothing has changed - if err != nil || len(result.Added) == 0 { - return err - } - // otherwise sending heads update message - newUpdate := &syncpb.SyncHeadUpdate{ - Heads: result.Heads, - Changes: result.Added, - SnapshotPath: snapshotPath, - TreeId: update.TreeId, - } - err = r.client.NotifyHeadsChanged(newUpdate) - return -} - -func (r *requestHander) HandleFullSyncRequest(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) error { - // TODO: add case of new tree - return nil -} - -func (r *requestHander) HandleFullSyncResponse(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) error { - // TODO: add case of new tree - return nil -} - -func (r *requestHander) prepareFullSyncRequest(treeId string, theirPath []string, tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) { - ourChanges, err := tree.ChangesAfterCommonSnapshot(theirPath) - if err != nil { - return nil, err - } - return &syncpb.SyncFullRequest{ - Heads: tree.Heads(), - Changes: ourChanges, - TreeId: treeId, - SnapshotPath: tree.SnapshotPath(), - }, nil -} diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go new file mode 100644 index 00000000..702cf909 --- /dev/null +++ b/service/sync/requesthandler/requesthandler.go @@ -0,0 +1,207 @@ +package requesthandler + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/client" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" +) + +type requestHandler struct { + treeCache treecache.Service + client client.Client +} + +func NewRequestHandler() app.Component { + return &requestHandler{} +} + +type RequestHandler interface { + HandleHeadUpdate(ctx context.Context, senderId string, update *syncpb.SyncHeadUpdate) (err error) + HandleFullSyncRequest(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) (err error) + HandleFullSyncResponse(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) (err error) +} + +const CName = "SyncRequestHandler" + +func (r *requestHandler) Init(ctx context.Context, a *app.App) (err error) { + r.treeCache = a.MustComponent(treecache.CName).(treecache.Service) + return nil +} + +func (r *requestHandler) Name() (name string) { + return CName +} + +func (r *requestHandler) Run(ctx context.Context) (err error) { + return nil +} + +func (r *requestHandler) Close(ctx context.Context) (err error) { + return nil +} + +func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, update *syncpb.SyncHeadUpdate) (err error) { + var ( + fullRequest *syncpb.SyncFullRequest + snapshotPath []string + result acltree.AddResult + ) + + err = r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error { + // TODO: check if we already have those changes + result, err = tree.AddRawChanges(ctx, update.Changes...) + if err != nil { + return err + } + shouldFullSync := !slice.UnsortedEquals(update.Heads, tree.Heads()) + snapshotPath = tree.SnapshotPath() + if shouldFullSync { + fullRequest, err = r.prepareFullSyncRequest(update.TreeId, update.SnapshotPath, tree) + if err != nil { + return err + } + } + return nil + }) + // if there are no such tree + if err == treestorage.ErrUnknownTreeId { + fullRequest = &syncpb.SyncFullRequest{ + TreeId: update.TreeId, + } + } + // if we have incompatible heads, or we haven't seen the tree at all + if fullRequest != nil { + return r.client.RequestFullSync(senderId, fullRequest) + } + // if error or nothing has changed + if err != nil || len(result.Added) == 0 { + return err + } + // otherwise sending heads update message + newUpdate := &syncpb.SyncHeadUpdate{ + Heads: result.Heads, + Changes: result.Added, + SnapshotPath: snapshotPath, + TreeId: update.TreeId, + } + return r.client.NotifyHeadsChanged(newUpdate) +} + +func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) (err error) { + var ( + fullResponse *syncpb.SyncFullResponse + snapshotPath []string + result acltree.AddResult + ) + + err = r.treeCache.Do(ctx, request.TreeId, func(tree acltree.ACLTree) error { + // TODO: check if we already have those changes + result, err = tree.AddRawChanges(ctx, request.Changes...) + if err != nil { + return err + } + snapshotPath = tree.SnapshotPath() + fullResponse, err = r.prepareFullSyncResponse(request.TreeId, request.SnapshotPath, request.Changes, tree) + if err != nil { + return err + } + return nil + }) + if err != nil { + return err + } + err = r.client.SendFullSyncResponse(senderId, fullResponse) + // if error or nothing has changed + if err != nil || len(result.Added) == 0 { + return err + } + + // otherwise sending heads update message + newUpdate := &syncpb.SyncHeadUpdate{ + Heads: result.Heads, + Changes: result.Added, + SnapshotPath: snapshotPath, + TreeId: request.TreeId, + } + return r.client.NotifyHeadsChanged(newUpdate) +} + +func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) (err error) { + var ( + snapshotPath []string + result acltree.AddResult + ) + + err = r.treeCache.Do(ctx, request.TreeId, func(tree acltree.ACLTree) error { + // TODO: check if we already have those changes + result, err = tree.AddRawChanges(ctx, request.Changes...) + if err != nil { + return err + } + snapshotPath = tree.SnapshotPath() + return nil + }) + if err != nil { + return err + } + // if error or nothing has changed + if err != nil || len(result.Added) == 0 { + return err + } + + // TODO: probably here we should not send an update message, because the other node had already sent it after updating with our data + // otherwise sending heads update message + newUpdate := &syncpb.SyncHeadUpdate{ + Heads: result.Heads, + Changes: result.Added, + SnapshotPath: snapshotPath, + TreeId: request.TreeId, + } + return r.client.NotifyHeadsChanged(newUpdate) +} + +func (r *requestHandler) prepareFullSyncRequest(treeId string, theirPath []string, tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) { + ourChanges, err := tree.ChangesAfterCommonSnapshot(theirPath) + if err != nil { + return nil, err + } + return &syncpb.SyncFullRequest{ + Heads: tree.Heads(), + Changes: ourChanges, + TreeId: treeId, + SnapshotPath: tree.SnapshotPath(), + }, nil +} + +func (r *requestHandler) prepareFullSyncResponse(treeId string, theirPath []string, theirChanges []*aclpb.RawChange, tree acltree.ACLTree) (*syncpb.SyncFullResponse, error) { + // TODO: we can probably use the common snapshot calculated on the request step from previous peer + ourChanges, err := tree.ChangesAfterCommonSnapshot(theirPath) + if err != nil { + return nil, err + } + theirMap := make(map[string]struct{}) + for _, ch := range theirChanges { + theirMap[ch.Id] = struct{}{} + } + + // filtering our changes, so we will not send the same changes back + var final []*aclpb.RawChange + for _, ch := range ourChanges { + if _, exists := theirMap[ch.Id]; exists { + final = append(final, ch) + } + } + + return &syncpb.SyncFullResponse{ + Heads: tree.Heads(), + Changes: final, + TreeId: treeId, + SnapshotPath: tree.SnapshotPath(), + }, nil +} diff --git a/service/sync/service.go b/service/sync/service.go deleted file mode 100644 index fd6839bb..00000000 --- a/service/sync/service.go +++ /dev/null @@ -1,43 +0,0 @@ -package sync - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" -) - -type service struct { -} - -const CName = "SyncService" - -func (s *service) Init(ctx context.Context, a *app.App) (err error) { - return nil -} - -func (s *service) Name() (name string) { - return CName -} - -func (s *service) Run(ctx context.Context) (err error) { - ch := make(chan *PubSubPayload) - err = s.pubSub.Listen(ch) - if err != nil { - return - } - return nil -} - -func (s *service) Close(ctx context.Context) (err error) { - return nil -} - -func (s *service) listen(ctx context.Context, ch chan *PubSubPayload) { - for { - select { - case <-ctx.Done(): - return - case payload := <-ch: - // TODO: get object from object service and try to perform sync - } - } -} diff --git a/service/sync/syncclient.go b/service/sync/syncclient.go deleted file mode 100644 index 95354982..00000000 --- a/service/sync/syncclient.go +++ /dev/null @@ -1,8 +0,0 @@ -package sync - -import "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" - -type SyncClient interface { - NotifyHeadsChanged(update *syncpb.SyncHeadUpdate) error - RequestFullSync(id string, request *syncpb.SyncFullRequest) error -} From d9452509b54d803b13861854e723d5d6e1f0a22b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 16 Jul 2022 14:24:27 +0200 Subject: [PATCH 16/40] WIP new document logic --- pkg/acl/acltree/acltree.go | 49 ++++++++++++++----- service/sync/requesthandler/requesthandler.go | 31 ++++++++---- service/treecache/service.go | 5 ++ 3 files changed, 65 insertions(+), 20 deletions(-) diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index 5cd85957..ed1c1a45 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -46,6 +46,7 @@ var ErrNoCommonSnapshot = errors.New("trees doesn't have a common snapshot") type ACLTree interface { RWLocker + ID() string ACLState() *ACLState AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*Change, error) AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) @@ -65,6 +66,7 @@ type aclTree struct { accountData *account.AccountData updateListener TreeUpdateListener + id string fullTree *Tree aclTreeFromStart *Tree // TODO: right now we don't use it, we can probably have only local var for now. This tree is built from start of the document aclState *ACLState @@ -112,6 +114,10 @@ func BuildACLTree( if err != nil { return nil, err } + aclTree.id, err = t.TreeID() + if err != nil { + return nil, err + } listener.Rebuild(aclTree) @@ -214,6 +220,10 @@ func (a *aclTree) rebuildFromStorage(fromStart bool) error { return nil } +func (a *aclTree) ID() string { + return a.id +} + func (a *aclTree) ACLState() *ACLState { return a.aclState } @@ -400,13 +410,25 @@ func (a *aclTree) SnapshotPath() []string { func (a *aclTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { // TODO: think about when the clients will have their full acl tree and thus full snapshots // but no changes after some of the snapshots - commonSnapshot, err := a.commonSnapshotForTwoPaths(a.SnapshotPath(), theirPath) - if err != nil { - return nil, err + + var ( + isNewDocument = len(theirPath) != 0 + ourPath = a.SnapshotPath() + // by default returning everything we have + commonSnapshot = ourPath[len(ourPath)-1] // TODO: root snapshot, probably it is better to have a specific method in treestorage + err error + ) + + // if this is non-empty request + if !isNewDocument { + commonSnapshot, err = a.commonSnapshotForTwoPaths(ourPath, theirPath) + if err != nil { + return nil, err + } } - // we presume that we have everything after the common snapshot, though this may not be the case in case of clients and only ACL tree changes - changes, err := a.treeBuilder.dfs(a.fullTree.Heads(), commonSnapshot, func(id string) (*Change, error) { - // using custom load function to skip verification step and save raw changes + var rawChanges []*aclpb.RawChange + // using custom load function to skip verification step and save raw changes + load := func(id string) (*Change, error) { raw, err := a.treeStorage.GetChange(context.Background(), id) if err != nil { return nil, err @@ -418,16 +440,21 @@ func (a *aclTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh } ch := NewChange(id, aclChange) - ch.Raw = raw + rawChanges = append(rawChanges, raw) return ch, nil - }) + } + // we presume that we have everything after the common snapshot, though this may not be the case in case of clients and only ACL tree changes + _, err = a.treeBuilder.dfs(a.fullTree.Heads(), commonSnapshot, load) if err != nil { return nil, err } - var rawChanges []*aclpb.RawChange - for _, ch := range changes { - rawChanges = append(rawChanges, ch.Raw) + if isNewDocument { + _, err = load(commonSnapshot) + if err != nil { + return nil, err + } } + return rawChanges, nil } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 702cf909..491f3c4b 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -6,6 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/client" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" @@ -15,6 +16,7 @@ import ( type requestHandler struct { treeCache treecache.Service client client.Client + account account.Service } func NewRequestHandler() app.Component { @@ -31,6 +33,8 @@ const CName = "SyncRequestHandler" func (r *requestHandler) Init(ctx context.Context, a *app.App) (err error) { r.treeCache = a.MustComponent(treecache.CName).(treecache.Service) + r.client = a.MustComponent(client.CName).(client.Client) + r.account = a.MustComponent(account.CName).(account.Service) return nil } @@ -102,9 +106,12 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str err = r.treeCache.Do(ctx, request.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes - result, err = tree.AddRawChanges(ctx, request.Changes...) - if err != nil { - return err + // if we have non empty request + if len(request.Heads) != 0 { + result, err = tree.AddRawChanges(ctx, request.Changes...) + if err != nil { + return err + } } snapshotPath = tree.SnapshotPath() fullResponse, err = r.prepareFullSyncResponse(request.TreeId, request.SnapshotPath, request.Changes, tree) @@ -132,23 +139,24 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str return r.client.NotifyHeadsChanged(newUpdate) } -func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) (err error) { +func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, response *syncpb.SyncFullResponse) (err error) { var ( snapshotPath []string result acltree.AddResult ) - err = r.treeCache.Do(ctx, request.TreeId, func(tree acltree.ACLTree) error { + err = r.treeCache.Do(ctx, response.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes - result, err = tree.AddRawChanges(ctx, request.Changes...) + result, err = tree.AddRawChanges(ctx, response.Changes...) if err != nil { return err } snapshotPath = tree.SnapshotPath() return nil }) - if err != nil { - return err + if err == treestorage.ErrUnknownTreeId { + // TODO: probably sometimes we should notify about this (e.g. if client created new document) + return r.createTree(response) } // if error or nothing has changed if err != nil || len(result.Added) == 0 { @@ -161,7 +169,7 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st Heads: result.Heads, Changes: result.Added, SnapshotPath: snapshotPath, - TreeId: request.TreeId, + TreeId: response.TreeId, } return r.client.NotifyHeadsChanged(newUpdate) } @@ -205,3 +213,8 @@ func (r *requestHandler) prepareFullSyncResponse(treeId string, theirPath []stri SnapshotPath: tree.SnapshotPath(), }, nil } + +func (r *requestHandler) createTree(response *syncpb.SyncFullResponse) error { + // TODO: write create tree functionality + return nil +} diff --git a/service/treecache/service.go b/service/treecache/service.go index 654d12ca..cd3cf884 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -13,6 +13,7 @@ const CName = "treecache" type Service interface { Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree) error) error + Add(ctx context.Context, treeId string, tree acltree.ACLTree) error } type service struct { @@ -37,6 +38,10 @@ func (s *service) Do(ctx context.Context, treeId string, f func(tree acltree.ACL return f(tree.(acltree.ACLTree)) } +func (s *service) Add(ctx context.Context, treeId string, tree acltree.ACLTree) error { + return s.cache.Add(treeId, tree) +} + func (s *service) Init(ctx context.Context, a *app.App) (err error) { s.cache = ocache.New(s.loadTree) s.account = a.MustComponent(account.CName).(account.Service) From 7f4b18104f299d54bb9e6a45481dea770ea00cab Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Sun, 17 Jul 2022 09:44:16 +0300 Subject: [PATCH 17/40] drpc server, libp2p tls connections --- Makefile | 2 +- cmd/client/client.go | 200 ++++++-- cmd/node/node.go | 7 +- go.mod | 38 +- go.sum | 62 ++- pkg/acl/acltree/treebuilder.go | 4 +- service/server/server.go | 90 ---- service/sync/drpcserver/drpcserver.go | 157 ++++++ service/sync/drpcserver/util.go | 18 + service/sync/drpcserver/util_windows.go | 41 ++ service/sync/transport/context.go | 28 ++ service/sync/transport/listener.go | 50 ++ service/sync/transport/transport.go | 60 +++ syncproto/commands.pb.go | 607 ------------------------ syncproto/proto/commands.proto | 14 - syncproto/proto/service.proto | 9 - syncproto/proto/sync.proto | 7 + syncproto/service.pb.go | 153 ------ syncproto/sync.pb.go | 296 ++++++++++++ 19 files changed, 880 insertions(+), 963 deletions(-) delete mode 100644 service/server/server.go create mode 100644 service/sync/drpcserver/drpcserver.go create mode 100644 service/sync/drpcserver/util.go create mode 100644 service/sync/drpcserver/util_windows.go create mode 100644 service/sync/transport/context.go create mode 100644 service/sync/transport/listener.go create mode 100644 service/sync/transport/transport.go delete mode 100644 syncproto/commands.pb.go delete mode 100644 syncproto/proto/commands.proto delete mode 100644 syncproto/proto/service.proto create mode 100644 syncproto/proto/sync.proto delete mode 100644 syncproto/service.pb.go create mode 100644 syncproto/sync.pb.go diff --git a/Makefile b/Makefile index 7fc14153..d6e677a5 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ protos-go: GOGO_NO_UNDERSCORE=1 GOGO_EXPORT_ONEOF_INTERFACE=1 protoc --gogofaster_out=$(PKGMAP):./thread/pb thread/pb/protos/*.*; mv thread/pb/thread/pb/protos/*.go thread/pb; rm -rf thread/pb/thread protos: - GOGO_NO_UNDERSCORE=1 GOGO_EXPORT_ONEOF_INTERFACE=1 protoc --gogofaster_out=plugins=grpc:. syncproto/proto/*.proto; mv syncproto/proto/*.go syncproto + GOGO_NO_UNDERSCORE=1 GOGO_EXPORT_ONEOF_INTERFACE=1 protoc --gogofaster_out=plugins=grpc:. syncproto/proto/*.proto build: diff --git a/cmd/client/client.go b/cmd/client/client.go index de5eee2e..18bb7e99 100644 --- a/cmd/client/client.go +++ b/cmd/client/client.go @@ -2,66 +2,168 @@ package main import ( "context" + "flag" "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/transport" "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/credentials/insecure" - "log" + "github.com/gogo/protobuf/proto" + "github.com/libp2p/go-libp2p-core/sec" + "go.uber.org/zap" + "io" + "net" + "net/http" + _ "net/http/pprof" + "os" + "os/signal" + "storj.io/drpc" + "storj.io/drpc/drpcconn" + "syscall" "time" ) -// req/rep 1000000 req for 1m56.663998462s (8571 per sec) -// stream 1000000 req for 1m25.54958362s (11689 per sec) +var log = logger.NewNamed("client") + +var ( + flagConfigFile = flag.String("c", "etc/config.yml", "path to config file") + flagVersion = flag.Bool("v", false, "show version and exit") + flagHelp = flag.Bool("h", false, "show help and exit") +) func main() { + flag.Parse() - conf, err := config.NewFromFile("etc/config.yml") - if err != nil { - panic(err) + if *flagVersion { + fmt.Println(app.VersionDescription()) + return + } + if *flagHelp { + flag.PrintDefaults() + return } - benchGrpc(conf) -} -func benchGrpc(conf *config.Config) { - var opts []grpc.DialOption - if conf.GrpcServer.TLS { - creds, err := credentials.NewClientTLSFromFile(conf.GrpcServer.TLSCertFile, "127.0.0.1") - if err != nil { - log.Fatalf("Failed to create TLS credentials %v", err) - } - opts = append(opts, grpc.WithTransportCredentials(creds)) + if debug, ok := os.LookupEnv("ANYPROF"); ok && debug != "" { + go func() { + http.ListenAndServe(debug, nil) + }() + } + + // create app + ctx := context.Background() + a := new(app.App) + + // open config file + conf, err := config.NewFromFile(*flagConfigFile) + if err != nil { + log.Fatal("can't open config file", zap.Error(err)) + } + + // bootstrap components + a.Register(conf). + Register(transport.New()). + Register(&Client{}) + + // start app + if err := a.Start(ctx); err != nil { + log.Fatal("can't start app", zap.Error(err)) + } + log.Info("app started", zap.String("version", a.Version())) + + // wait exit signal + exit := make(chan os.Signal, 1) + signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT) + sig := <-exit + log.Info("received exit signal, stop app...", zap.String("signal", fmt.Sprint(sig))) + + // close app + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + if err := a.Close(ctx); err != nil { + log.Fatal("close error", zap.Error(err)) } else { - opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) + log.Info("goodbye!") } - - conn, err := grpc.Dial(conf.GrpcServer.ListenAddrs[0], opts...) - if err != nil { - log.Fatalf("fail to dial: %v", err) - } - defer conn.Close() - client := syncproto.NewAnytypeSyncClient(conn) - - stream, err := client.Ping(context.TODO()) - if err != nil { - panic(err) - } - - st := time.Now() - n := 100000 - - for i := 0; i < n; i++ { - if err = stream.Send(&syncproto.PingRequest{ - Seq: int64(i), - }); err != nil { - panic(err) - } - _, err := stream.Recv() - if err != nil { - panic(err) - } - } - dur := time.Since(st) - fmt.Printf("%d req for %v (%d per sec)\n", n, dur, int(float64(n)/dur.Seconds())) + time.Sleep(time.Second / 3) +} + +type Client struct { + conf config.GrpcServer + tr transport.Service + sc sec.SecureConn +} + +func (c *Client) Init(ctx context.Context, a *app.App) (err error) { + c.tr = a.MustComponent(transport.CName).(transport.Service) + c.conf = a.MustComponent(config.CName).(*config.Config).GrpcServer + return nil +} + +func (c *Client) Name() (name string) { + return "testClient" +} + +func (c *Client) Run(ctx context.Context) (err error) { + tcpConn, err := net.Dial("tcp", c.conf.ListenAddrs[0]) + if err != nil { + return + } + c.sc, err = c.tr.TLSConn(ctx, tcpConn) + if err != nil { + return + } + log.Info("connected with server", zap.String("serverPeer", c.sc.RemotePeer().String()), zap.String("per", c.sc.LocalPeer().String())) + + dconn := drpcconn.New(c.sc) + stream, err := dconn.NewStream(ctx, "", enc{}) + if err != nil { + return + } + go c.handleStream(stream) + return nil +} + +func (c *Client) handleStream(stream drpc.Stream) { + var err error + defer func() { + log.Info("stream closed", zap.Error(err)) + }() + var n int64 = 100000 + for i := int64(0); i < n; i++ { + st := time.Now() + if err = stream.MsgSend(&syncproto.SyncMessage{Seq: i}, enc{}); err != nil { + if err == io.EOF { + return + } + log.Fatal("send error", zap.Error(err)) + } + log.Debug("message sent", zap.Int64("seq", i)) + msg := &syncproto.SyncMessage{} + if err := stream.MsgRecv(msg, enc{}); err != nil { + if err == io.EOF { + return + } + log.Error("msg recv error", zap.Error(err)) + } + log.Debug("message received", zap.Int64("seq", msg.Seq), zap.Duration("dur", time.Since(st))) + time.Sleep(time.Second) + } +} + +func (c *Client) Close(ctx context.Context) (err error) { + if c.sc != nil { + return c.sc.Close() + } + return +} + +type enc struct{} + +func (e enc) Marshal(msg drpc.Message) ([]byte, error) { + return msg.(proto.Marshaler).Marshal() +} + +func (e enc) Unmarshal(buf []byte, msg drpc.Message) error { + return msg.(proto.Unmarshaler).Unmarshal(buf) } diff --git a/cmd/node/node.go b/cmd/node/node.go index 161daa88..1446220e 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -7,7 +7,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/server" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/drpcserver" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/transport" "go.uber.org/zap" "net/http" _ "net/http/pprof" @@ -77,8 +78,10 @@ func main() { } else { log.Info("goodbye!") } + time.Sleep(time.Second / 3) } func Bootstrap(a *app.App) { - a.Register(server.New()) + a.Register(transport.New()). + Register(drpcserver.New()) } diff --git a/go.mod b/go.mod index 972a6472..50f29ca7 100644 --- a/go.mod +++ b/go.mod @@ -6,23 +6,24 @@ require ( github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab github.com/goccy/go-graphviz v0.0.9 github.com/gogo/protobuf v1.3.2 - github.com/ipfs/go-cid v0.0.7 - github.com/libp2p/go-libp2p-core v0.8.5 + github.com/ipfs/go-cid v0.1.0 + github.com/libp2p/go-libp2p v0.20.3 + github.com/libp2p/go-libp2p-core v0.16.1 github.com/mr-tron/base58 v1.2.0 - github.com/multiformats/go-multihash v0.0.15 - github.com/prometheus/common v0.18.0 + github.com/multiformats/go-multihash v0.1.0 github.com/stretchr/testify v1.7.0 github.com/textileio/go-threads v1.0.2-0.20210304072541-d0f91da84404 go.uber.org/zap v1.21.0 - google.golang.org/grpc v1.48.0 gopkg.in/yaml.v3 v3.0.1 + storj.io/drpc v0.0.32 ) require ( - github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect - github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect - github.com/btcsuite/btcd v0.21.0-beta // indirect + github.com/btcsuite/btcd v0.22.1 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.1.3 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/gogo/googleapis v1.3.1 // indirect @@ -30,31 +31,32 @@ require ( github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.2.1 // indirect - github.com/klauspost/cpuid/v2 v2.0.4 // indirect - github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect + github.com/klauspost/cpuid/v2 v2.0.9 // indirect github.com/libp2p/go-buffer-pool v0.0.2 // indirect github.com/libp2p/go-openssl v0.0.7 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect github.com/minio/sha256-simd v1.0.0 // indirect github.com/multiformats/go-base32 v0.0.3 // indirect github.com/multiformats/go-base36 v0.1.0 // indirect - github.com/multiformats/go-multiaddr v0.3.3 // indirect + github.com/multiformats/go-multiaddr v0.5.0 // indirect github.com/multiformats/go-multibase v0.0.3 // indirect + github.com/multiformats/go-multicodec v0.4.1 // indirect github.com/multiformats/go-varint v0.0.6 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/sirupsen/logrus v1.6.0 // indirect github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/zeebo/errs v1.2.2 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.8.0 // indirect - golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect + golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect - golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6 // indirect - golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect - golang.org/x/text v0.3.6 // indirect - google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect + golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect + google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 // indirect + google.golang.org/grpc v1.48.0 // indirect google.golang.org/protobuf v1.27.1 // indirect - gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + lukechampine.com/blake3 v1.1.6 // indirect ) replace github.com/textileio/go-threads => github.com/anytypeio/go-threads v1.1.0-rc1.0.20220223104843-a67245cee80e diff --git a/go.sum b/go.sum index 8b742ebd..456b37be 100644 --- a/go.sum +++ b/go.sum @@ -25,11 +25,9 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0= github.com/alecthomas/jsonschema v0.0.0-20191017121752-4bb6e3fae4f2/go.mod h1:Juc2PrI3wtNfUwptSvAIeNx+HrETwHQs6nf+TkOJlOA= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -50,8 +48,8 @@ github.com/aws/aws-sdk-go v1.29.15/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTg github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/benbjohnson/clock v1.0.2/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -62,8 +60,13 @@ github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcug github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M= github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= +github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= +github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= +github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -113,6 +116,10 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= @@ -336,8 +343,9 @@ github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUP github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.7 h1:ysQJVJA3fNDF1qigJbsSQOdjhVLsOEoPdh0+R97k3jY= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= +github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= +github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cidutil v0.0.2/go.mod h1:ewllrvrxG6AMYStla3GD7Cqn+XYSLqjK0vc+086tB6s= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= @@ -451,11 +459,11 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= github.com/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= @@ -495,6 +503,8 @@ github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El github.com/libp2p/go-libp2p v0.11.0/go.mod h1:3/ogJDXsbbepEfqtZKBR/DedzxJXCeK17t2Z9RE9bEE= github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= +github.com/libp2p/go-libp2p v0.20.3 h1:tjjDNfp7FqdI/7v1rXtB/BtELaPlAThL2uzlj18kcrw= +github.com/libp2p/go-libp2p v0.20.3/go.mod h1:I+vndVanE/p/SjFbnA+BEmmfAUEpWxrdXZeyQ1Dus5c= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-autonat v0.0.6/go.mod h1:uZneLdOkZHro35xIhpbtTzLlgYturpu4J5+0cZK3MqE= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -542,8 +552,9 @@ github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJB github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= github.com/libp2p/go-libp2p-core v0.8.2/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.5 h1:aEgbIcPGsKy6zYcC+5AJivYFedhYa4sW7mIpWpUaLKw= github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= +github.com/libp2p/go-libp2p-core v0.16.1 h1:bWoiEBqVkpJ13hbv/f69tHODp86t6mvc4fBN4DkK73M= +github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -791,8 +802,9 @@ github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= -github.com/multiformats/go-multiaddr v0.3.3 h1:vo2OTSAqnENB2rLk79pLtr+uhj+VAzSe3uef5q0lRSs= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= +github.com/multiformats/go-multiaddr v0.5.0 h1:i/JuOoVg4szYQ4YEzDGtb2h0o8M7CG/Yq6cGlcjWZpM= +github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= @@ -810,6 +822,8 @@ github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5 github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= +github.com/multiformats/go-multicodec v0.4.1 h1:BSJbf+zpghcZMZrwTYBGwy0CPcVZGWiC72Cp8bBd4R4= +github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -817,8 +831,9 @@ github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.15 h1:hWOPdrNqDjwHDx82vsYGSDZNyktOJJ2dzZJzFkOV1jM= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -913,7 +928,6 @@ github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.18.0 h1:WCVKW7aL6LEe1uryfI9dnEc2ZqNB1Fn0ok930v0iL1Y= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -963,7 +977,6 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= @@ -979,6 +992,7 @@ github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7A github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -1043,6 +1057,9 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1: github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/errs v1.2.2 h1:5NFypMTuSdoySVTqlNs1dEoU21QVamMQJxW/Fii5O7g= +github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.mongodb.org/mongo-driver v1.4.0/go.mod h1:llVBH2pkj9HywK0Dtdt6lDikOjFLbceHVu/Rc0iMKLs= @@ -1110,8 +1127,10 @@ golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= @@ -1171,8 +1190,8 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6 h1:0PC75Fz/kyMGhL0e1QnypqK2kQMqKt9csD1GnMJR+Zk= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1248,8 +1267,9 @@ golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1316,8 +1336,9 @@ google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dT google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= @@ -1348,12 +1369,12 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1377,8 +1398,9 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= @@ -1389,9 +1411,13 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +storj.io/drpc v0.0.32 h1:5p5ZwsK/VOgapaCu+oxaPVwO6UwIs+iwdMiD50+R4PI= +storj.io/drpc v0.0.32/go.mod h1:6rcOyR/QQkSTX/9L5ZGtlZaE2PtXTTZl8d+ulSeeYEg= diff --git a/pkg/acl/acltree/treebuilder.go b/pkg/acl/acltree/treebuilder.go index 0e0dbea7..eb58dc93 100644 --- a/pkg/acl/acltree/treebuilder.go +++ b/pkg/acl/acltree/treebuilder.go @@ -3,16 +3,16 @@ package acltree import ( "errors" "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/thread" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" //"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/lib/logging" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" - "github.com/prometheus/common/log" ) var ( - //log = logging.Logger("anytype-data") + log = logger.NewNamed("acltree").Sugar() ErrEmpty = errors.New("logs empty") ) diff --git a/service/server/server.go b/service/server/server.go deleted file mode 100644 index 4c10bee2..00000000 --- a/service/server/server.go +++ /dev/null @@ -1,90 +0,0 @@ -package server - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "io" - "net" - "time" -) - -var log = logger.NewNamed("server") - -const CName = "server" - -func New() *Server { - return &Server{} -} - -type Server struct { - config config.GrpcServer - grpcServer *grpc.Server -} - -func (s *Server) Init(ctx context.Context, a *app.App) (err error) { - s.config = a.MustComponent(config.CName).(*config.Config).GrpcServer - return nil -} - -func (s *Server) Name() (name string) { - return CName -} - -func (s *Server) Run(ctx context.Context) (err error) { - lis, err := net.Listen("tcp", s.config.ListenAddrs[0]) - if err != nil { - return err - } - var opts []grpc.ServerOption - if s.config.TLS { - creds, err := credentials.NewServerTLSFromFile(s.config.TLSCertFile, s.config.TLSKeyFile) - if err != nil { - return err - } - opts = []grpc.ServerOption{grpc.Creds(creds)} - } - s.grpcServer = grpc.NewServer(opts...) - - syncproto.RegisterAnytypeSyncServer(s.grpcServer, s) - - var errCh = make(chan error) - go func() { - errCh <- s.grpcServer.Serve(lis) - }() - select { - case <-time.After(time.Second / 4): - case err = <-errCh: - } - - log.Sugar().Infof("server started at: %v", s.config.ListenAddrs[0]) - return -} - -func (s *Server) Ping(stream syncproto.AnytypeSync_PingServer) error { - for { - in, err := stream.Recv() - if err == io.EOF { - return nil - } - if err != nil { - return err - } - if err := stream.Send(&syncproto.PingResponse{ - Seq: in.Seq, - }); err != nil { - return err - } - } -} - -func (s *Server) Close(ctx context.Context) (err error) { - if s.grpcServer != nil { - s.grpcServer.GracefulStop() - } - return -} diff --git a/service/sync/drpcserver/drpcserver.go b/service/sync/drpcserver/drpcserver.go new file mode 100644 index 00000000..e3fe7bee --- /dev/null +++ b/service/sync/drpcserver/drpcserver.go @@ -0,0 +1,157 @@ +package drpcserver + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/transport" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "github.com/gogo/protobuf/proto" + "go.uber.org/zap" + "io" + "net" + "storj.io/drpc" + "storj.io/drpc/drpcserver" + "strings" + "time" +) + +var log = logger.NewNamed("drpcserver") + +const CName = "drpcserver" + +func New() DRPCServer { + return &drpcServer{} +} + +type DRPCServer interface { + app.ComponentRunnable +} + +type drpcServer struct { + config config.GrpcServer + drpcServer *drpcserver.Server + transport transport.Service + listeners []transport.ContextListener + cancel func() +} + +func (s *drpcServer) Init(ctx context.Context, a *app.App) (err error) { + s.config = a.MustComponent(config.CName).(*config.Config).GrpcServer + s.transport = a.MustComponent(transport.CName).(transport.Service) + return nil +} + +func (s *drpcServer) Name() (name string) { + return CName +} + +func (s *drpcServer) Run(ctx context.Context) (err error) { + s.drpcServer = drpcserver.New(s) + ctx, s.cancel = context.WithCancel(ctx) + for _, addr := range s.config.ListenAddrs { + tcpList, err := net.Listen("tcp", addr) + if err != nil { + return err + } + tlsList := s.transport.TLSListener(tcpList) + go s.serve(ctx, tlsList) + } + return +} + +func (s *drpcServer) serve(ctx context.Context, lis transport.ContextListener) { + l := log.With(zap.String("localAddr", lis.Addr().String())) + l.Info("drpc listener started") + defer func() { + l.Debug("drpc listener stopped") + }() + for { + select { + case <-ctx.Done(): + return + default: + } + ctx, conn, err := lis.Accept(ctx) + if err != nil { + if isTemporary(err) { + l.Debug("listener temporary accept error", zap.Error(err)) + t := time.NewTimer(500 * time.Millisecond) + select { + case <-t.C: + case <-ctx.Done(): + return + } + continue + } + if _, ok := err.(transport.HandshakeError); ok { + l.Warn("listener handshake error", zap.Error(err)) + continue + } + l.Error("listener accept error", zap.Error(err)) + return + } + go s.serveConn(ctx, conn) + } +} + +func (s *drpcServer) serveConn(ctx context.Context, conn net.Conn) { + l := log.With(zap.String("remoteAddr", conn.RemoteAddr().String())).With(zap.String("localAddr", conn.LocalAddr().String())) + l.Debug("connection opened") + if err := s.drpcServer.ServeOne(ctx, conn); err != nil { + if err == context.Canceled || strings.Contains(err.Error(), "EOF") { + l.Debug("connection closed") + } else { + l.Warn("serve connection error", zap.Error(err)) + } + } +} + +func (s *drpcServer) HandleRPC(stream drpc.Stream, rpc string) (err error) { + ctx := stream.Context() + sc, err := transport.CtxSecureConn(ctx) + if err != nil { + return + } + l := log.With(zap.String("peer", sc.RemotePeer().String())) + l.Info("stream opened") + defer func() { + l.Info("stream closed", zap.Error(err)) + }() + for { + msg := &syncproto.SyncMessage{} + if err = stream.MsgRecv(msg, enc{}); err != nil { + if err == io.EOF { + return + } + } + //log.Debug("receive msg", zap.Int("seq", int(msg.Seq))) + if err = stream.MsgSend(msg, enc{}); err != nil { + return + } + } + return nil +} + +func (s *drpcServer) Close(ctx context.Context) (err error) { + if s.cancel != nil { + s.cancel() + } + for _, l := range s.listeners { + if e := l.Close(); e != nil { + log.Warn("close listener error", zap.Error(e)) + } + } + return +} + +type enc struct{} + +func (e enc) Marshal(msg drpc.Message) ([]byte, error) { + return msg.(proto.Marshaler).Marshal() +} + +func (e enc) Unmarshal(buf []byte, msg drpc.Message) error { + return msg.(proto.Unmarshaler).Unmarshal(buf) +} diff --git a/service/sync/drpcserver/util.go b/service/sync/drpcserver/util.go new file mode 100644 index 00000000..d84358eb --- /dev/null +++ b/service/sync/drpcserver/util.go @@ -0,0 +1,18 @@ +//go:build !windows + +package drpcserver + +import ( + "errors" + "net" +) + +// isTemporary checks if an error is temporary. +func isTemporary(err error) bool { + var nErr net.Error + if errors.As(err, &nErr) { + return nErr.Temporary() + } + + return false +} diff --git a/service/sync/drpcserver/util_windows.go b/service/sync/drpcserver/util_windows.go new file mode 100644 index 00000000..3acba434 --- /dev/null +++ b/service/sync/drpcserver/util_windows.go @@ -0,0 +1,41 @@ +//go:build windows + +package drpcserver + +import ( + "errors" + "net" + "os" + "syscall" +) + +const ( + _WSAEMFILE syscall.Errno = 10024 + _WSAENETRESET syscall.Errno = 10052 + _WSAENOBUFS syscall.Errno = 10055 +) + +// isTemporary checks if an error is temporary. +// see related go issue for more detail: https://go-review.googlesource.com/c/go/+/208537/ +func isTemporary(err error) bool { + var nErr net.Error + if !errors.As(err, &nErr) { + return false + } + + if nErr.Temporary() { + return true + } + + var sErr *os.SyscallError + if errors.As(err, &sErr) { + switch sErr.Err { + case _WSAENETRESET, + _WSAEMFILE, + _WSAENOBUFS: + return true + } + } + + return false +} diff --git a/service/sync/transport/context.go b/service/sync/transport/context.go new file mode 100644 index 00000000..f30bab39 --- /dev/null +++ b/service/sync/transport/context.go @@ -0,0 +1,28 @@ +package transport + +import ( + "context" + "errors" + "github.com/libp2p/go-libp2p-core/sec" +) + +var ( + ErrSecureConnNotFoundInContext = errors.New("secure connection not found in context") +) + +type contextKey uint + +const ( + contextKeySecureConn contextKey = iota +) + +func CtxSecureConn(ctx context.Context) (sec.SecureConn, error) { + if conn, ok := ctx.Value(contextKeySecureConn).(sec.SecureConn); ok { + return conn, nil + } + return nil, ErrSecureConnNotFoundInContext +} + +func ctxWithSecureConn(ctx context.Context, conn sec.SecureConn) context.Context { + return context.WithValue(ctx, contextKeySecureConn, conn) +} diff --git a/service/sync/transport/listener.go b/service/sync/transport/listener.go new file mode 100644 index 00000000..97e9e6f4 --- /dev/null +++ b/service/sync/transport/listener.go @@ -0,0 +1,50 @@ +package transport + +import ( + "context" + "github.com/libp2p/go-libp2p-core/crypto" + libp2ptls "github.com/libp2p/go-libp2p/p2p/security/tls" + "net" +) + +type ContextListener interface { + // Accept works like net.Listener accept but add context + Accept(ctx context.Context) (context.Context, net.Conn, error) + + // Close closes the listener. + // Any blocked Accept operations will be unblocked and return errors. + Close() error + + // Addr returns the listener's network address. + Addr() net.Addr +} + +func newTLSListener(key crypto.PrivKey, lis net.Listener) ContextListener { + tr, _ := libp2ptls.New(key) + return &tlsListener{ + tr: tr, + Listener: lis, + } +} + +type tlsListener struct { + net.Listener + tr *libp2ptls.Transport +} + +func (p *tlsListener) Accept(ctx context.Context) (context.Context, net.Conn, error) { + conn, err := p.Listener.Accept() + if err != nil { + return nil, nil, err + } + return p.upgradeConn(ctx, conn) +} + +func (p *tlsListener) upgradeConn(ctx context.Context, conn net.Conn) (context.Context, net.Conn, error) { + secure, err := p.tr.SecureInbound(ctx, conn, "") + if err != nil { + return nil, nil, HandshakeError(err) + } + ctx = ctxWithSecureConn(ctx, secure) + return ctx, secure, nil +} diff --git a/service/sync/transport/transport.go b/service/sync/transport/transport.go new file mode 100644 index 00000000..5b7e952a --- /dev/null +++ b/service/sync/transport/transport.go @@ -0,0 +1,60 @@ +package transport + +import ( + "context" + "crypto/rand" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/sec" + libp2ptls "github.com/libp2p/go-libp2p/p2p/security/tls" + "go.uber.org/zap" + "net" +) + +type HandshakeError error + +var log = logger.NewNamed("transport") + +const CName = "transport" + +func New() Service { + return &service{} +} + +type Service interface { + TLSListener(lis net.Listener) ContextListener + TLSConn(ctx context.Context, conn net.Conn) (sec.SecureConn, error) + app.Component +} + +type service struct { + key crypto.PrivKey +} + +func (s *service) Init(ctx context.Context, a *app.App) (err error) { + var pubKey crypto.PubKey + s.key, pubKey, err = crypto.GenerateEd25519Key(rand.Reader) + if err != nil { + return + } + pubKeyRaw, _ := pubKey.Raw() + log.Info("transport keys generated", zap.Binary("pubKey", pubKeyRaw)) + return nil +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) TLSListener(lis net.Listener) ContextListener { + return newTLSListener(s.key, lis) +} + +func (s *service) TLSConn(ctx context.Context, conn net.Conn) (sec.SecureConn, error) { + tr, err := libp2ptls.New(s.key) + if err != nil { + return nil, err + } + return tr.SecureOutbound(ctx, conn, "") +} diff --git a/syncproto/commands.pb.go b/syncproto/commands.pb.go deleted file mode 100644 index 8f97a2db..00000000 --- a/syncproto/commands.pb.go +++ /dev/null @@ -1,607 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: syncproto/proto/commands.proto - -package syncproto - -import ( - fmt "fmt" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type Ping struct { -} - -func (m *Ping) Reset() { *m = Ping{} } -func (m *Ping) String() string { return proto.CompactTextString(m) } -func (*Ping) ProtoMessage() {} -func (*Ping) Descriptor() ([]byte, []int) { - return fileDescriptor_51e5c75c191fcbfb, []int{0} -} -func (m *Ping) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ping.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ping) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ping.Merge(m, src) -} -func (m *Ping) XXX_Size() int { - return m.Size() -} -func (m *Ping) XXX_DiscardUnknown() { - xxx_messageInfo_Ping.DiscardUnknown(m) -} - -var xxx_messageInfo_Ping proto.InternalMessageInfo - -type PingRequest struct { - Seq int64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"` -} - -func (m *PingRequest) Reset() { *m = PingRequest{} } -func (m *PingRequest) String() string { return proto.CompactTextString(m) } -func (*PingRequest) ProtoMessage() {} -func (*PingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_51e5c75c191fcbfb, []int{0, 0} -} -func (m *PingRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PingRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PingRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_PingRequest.Merge(m, src) -} -func (m *PingRequest) XXX_Size() int { - return m.Size() -} -func (m *PingRequest) XXX_DiscardUnknown() { - xxx_messageInfo_PingRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_PingRequest proto.InternalMessageInfo - -func (m *PingRequest) GetSeq() int64 { - if m != nil { - return m.Seq - } - return 0 -} - -type PingResponse struct { - Seq int64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` -} - -func (m *PingResponse) Reset() { *m = PingResponse{} } -func (m *PingResponse) String() string { return proto.CompactTextString(m) } -func (*PingResponse) ProtoMessage() {} -func (*PingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_51e5c75c191fcbfb, []int{0, 1} -} -func (m *PingResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PingResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PingResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_PingResponse.Merge(m, src) -} -func (m *PingResponse) XXX_Size() int { - return m.Size() -} -func (m *PingResponse) XXX_DiscardUnknown() { - xxx_messageInfo_PingResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_PingResponse proto.InternalMessageInfo - -func (m *PingResponse) GetSeq() int64 { - if m != nil { - return m.Seq - } - return 0 -} - -func (m *PingResponse) GetTimestamp() int64 { - if m != nil { - return m.Timestamp - } - return 0 -} - -func init() { - proto.RegisterType((*Ping)(nil), "anytype.Ping") - proto.RegisterType((*PingRequest)(nil), "anytype.Ping.Request") - proto.RegisterType((*PingResponse)(nil), "anytype.Ping.Response") -} - -func init() { proto.RegisterFile("syncproto/proto/commands.proto", fileDescriptor_51e5c75c191fcbfb) } - -var fileDescriptor_51e5c75c191fcbfb = []byte{ - // 161 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2b, 0xae, 0xcc, 0x4b, - 0x2e, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x87, 0x90, 0xc9, 0xf9, 0xb9, 0xb9, 0x89, 0x79, 0x29, 0xc5, - 0x7a, 0x60, 0xae, 0x10, 0x7b, 0x62, 0x5e, 0x65, 0x49, 0x65, 0x41, 0xaa, 0x52, 0x3c, 0x17, 0x4b, - 0x40, 0x66, 0x5e, 0xba, 0x94, 0x34, 0x17, 0x7b, 0x50, 0x6a, 0x61, 0x69, 0x6a, 0x71, 0x89, 0x90, - 0x00, 0x17, 0x73, 0x71, 0x6a, 0xa1, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x73, 0x10, 0x88, 0x29, 0x65, - 0xc5, 0xc5, 0x11, 0x94, 0x5a, 0x5c, 0x90, 0x9f, 0x57, 0x9c, 0x8a, 0x29, 0x2b, 0x24, 0xc3, 0xc5, - 0x59, 0x92, 0x99, 0x9b, 0x5a, 0x5c, 0x92, 0x98, 0x5b, 0x20, 0xc1, 0x04, 0x16, 0x47, 0x08, 0x38, - 0x29, 0x9f, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, - 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x14, 0x27, 0xdc, 0x8d, 0x49, - 0x6c, 0x60, 0xca, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0xd5, 0x15, 0xa0, 0x65, 0xb7, 0x00, 0x00, - 0x00, -} - -func (m *Ping) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Ping) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ping) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *PingRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PingRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PingRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Seq != 0 { - i = encodeVarintCommands(dAtA, i, uint64(m.Seq)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *PingResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PingResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PingResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Timestamp != 0 { - i = encodeVarintCommands(dAtA, i, uint64(m.Timestamp)) - i-- - dAtA[i] = 0x10 - } - if m.Seq != 0 { - i = encodeVarintCommands(dAtA, i, uint64(m.Seq)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintCommands(dAtA []byte, offset int, v uint64) int { - offset -= sovCommands(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Ping) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *PingRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Seq != 0 { - n += 1 + sovCommands(uint64(m.Seq)) - } - return n -} - -func (m *PingResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Seq != 0 { - n += 1 + sovCommands(uint64(m.Seq)) - } - if m.Timestamp != 0 { - n += 1 + sovCommands(uint64(m.Timestamp)) - } - return n -} - -func sovCommands(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozCommands(x uint64) (n int) { - return sovCommands(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Ping) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Ping: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ping: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipCommands(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCommands - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PingRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Request: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Seq", wireType) - } - m.Seq = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Seq |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipCommands(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCommands - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PingResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Response: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Seq", wireType) - } - m.Seq = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Seq |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - m.Timestamp = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommands - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Timestamp |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipCommands(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthCommands - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipCommands(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowCommands - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowCommands - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowCommands - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthCommands - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupCommands - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthCommands - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthCommands = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowCommands = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupCommands = fmt.Errorf("proto: unexpected end of group") -) diff --git a/syncproto/proto/commands.proto b/syncproto/proto/commands.proto deleted file mode 100644 index 73a5366c..00000000 --- a/syncproto/proto/commands.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; -package anytype; -option go_package = "/syncproto"; - - -message Ping { - message Request { - int64 seq = 1; - } - message Response { - int64 seq = 1; - int64 timestamp = 2; - } -} \ No newline at end of file diff --git a/syncproto/proto/service.proto b/syncproto/proto/service.proto deleted file mode 100644 index fc0a35ff..00000000 --- a/syncproto/proto/service.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; -package anytype; -option go_package = "/syncproto"; - -import "syncproto/proto/commands.proto"; - -service AnytypeSync { - rpc Ping(stream anytype.Ping.Request) returns (stream anytype.Ping.Response); -} \ No newline at end of file diff --git a/syncproto/proto/sync.proto b/syncproto/proto/sync.proto new file mode 100644 index 00000000..51b2f3bb --- /dev/null +++ b/syncproto/proto/sync.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; +package anytype; +option go_package = "/syncproto"; + +message SyncMessage { + int64 seq = 1; +} \ No newline at end of file diff --git a/syncproto/service.pb.go b/syncproto/service.pb.go deleted file mode 100644 index 40de73a9..00000000 --- a/syncproto/service.pb.go +++ /dev/null @@ -1,153 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: syncproto/proto/service.proto - -package syncproto - -import ( - context "context" - fmt "fmt" - proto "github.com/gogo/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -func init() { proto.RegisterFile("syncproto/proto/service.proto", fileDescriptor_bc194c2299f43729) } - -var fileDescriptor_bc194c2299f43729 = []byte{ - // 156 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2d, 0xae, 0xcc, 0x4b, - 0x2e, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x87, 0x90, 0xc5, 0xa9, 0x45, 0x65, 0x99, 0xc9, 0xa9, 0x7a, - 0x60, 0x9e, 0x10, 0x7b, 0x62, 0x5e, 0x65, 0x49, 0x65, 0x41, 0xaa, 0x94, 0x1c, 0xba, 0xba, 0xe4, - 0xfc, 0xdc, 0xdc, 0xc4, 0xbc, 0x94, 0x62, 0x88, 0x42, 0x23, 0x0f, 0x2e, 0x6e, 0x47, 0x88, 0xd2, - 0xe0, 0xca, 0xbc, 0x64, 0x21, 0x4b, 0x2e, 0x96, 0x80, 0xcc, 0xbc, 0x74, 0x21, 0x51, 0x3d, 0xa8, - 0x01, 0x7a, 0x20, 0xae, 0x5e, 0x50, 0x6a, 0x61, 0x69, 0x6a, 0x71, 0x89, 0x94, 0x18, 0xba, 0x70, - 0x71, 0x41, 0x7e, 0x5e, 0x71, 0xaa, 0x06, 0xa3, 0x01, 0xa3, 0x93, 0xf2, 0x89, 0x47, 0x72, 0x8c, - 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, - 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0x71, 0xc2, 0xdd, 0x90, 0xc4, 0x06, 0xa6, 0x8c, 0x01, 0x01, - 0x00, 0x00, 0xff, 0xff, 0x4d, 0x33, 0xde, 0xf8, 0xbf, 0x00, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// AnytypeSyncClient is the client API for AnytypeSync service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type AnytypeSyncClient interface { - Ping(ctx context.Context, opts ...grpc.CallOption) (AnytypeSync_PingClient, error) -} - -type anytypeSyncClient struct { - cc *grpc.ClientConn -} - -func NewAnytypeSyncClient(cc *grpc.ClientConn) AnytypeSyncClient { - return &anytypeSyncClient{cc} -} - -func (c *anytypeSyncClient) Ping(ctx context.Context, opts ...grpc.CallOption) (AnytypeSync_PingClient, error) { - stream, err := c.cc.NewStream(ctx, &_AnytypeSync_serviceDesc.Streams[0], "/anytype.AnytypeSync/Ping", opts...) - if err != nil { - return nil, err - } - x := &anytypeSyncPingClient{stream} - return x, nil -} - -type AnytypeSync_PingClient interface { - Send(*PingRequest) error - Recv() (*PingResponse, error) - grpc.ClientStream -} - -type anytypeSyncPingClient struct { - grpc.ClientStream -} - -func (x *anytypeSyncPingClient) Send(m *PingRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *anytypeSyncPingClient) Recv() (*PingResponse, error) { - m := new(PingResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// AnytypeSyncServer is the server API for AnytypeSync service. -type AnytypeSyncServer interface { - Ping(AnytypeSync_PingServer) error -} - -// UnimplementedAnytypeSyncServer can be embedded to have forward compatible implementations. -type UnimplementedAnytypeSyncServer struct { -} - -func (*UnimplementedAnytypeSyncServer) Ping(srv AnytypeSync_PingServer) error { - return status.Errorf(codes.Unimplemented, "method Ping not implemented") -} - -func RegisterAnytypeSyncServer(s *grpc.Server, srv AnytypeSyncServer) { - s.RegisterService(&_AnytypeSync_serviceDesc, srv) -} - -func _AnytypeSync_Ping_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(AnytypeSyncServer).Ping(&anytypeSyncPingServer{stream}) -} - -type AnytypeSync_PingServer interface { - Send(*PingResponse) error - Recv() (*PingRequest, error) - grpc.ServerStream -} - -type anytypeSyncPingServer struct { - grpc.ServerStream -} - -func (x *anytypeSyncPingServer) Send(m *PingResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *anytypeSyncPingServer) Recv() (*PingRequest, error) { - m := new(PingRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -var _AnytypeSync_serviceDesc = grpc.ServiceDesc{ - ServiceName: "anytype.AnytypeSync", - HandlerType: (*AnytypeSyncServer)(nil), - Methods: []grpc.MethodDesc{}, - Streams: []grpc.StreamDesc{ - { - StreamName: "Ping", - Handler: _AnytypeSync_Ping_Handler, - ServerStreams: true, - ClientStreams: true, - }, - }, - Metadata: "syncproto/proto/service.proto", -} diff --git a/syncproto/sync.pb.go b/syncproto/sync.pb.go new file mode 100644 index 00000000..aa3947c8 --- /dev/null +++ b/syncproto/sync.pb.go @@ -0,0 +1,296 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: syncproto/proto/sync.proto + +package syncproto + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type SyncMessage struct { + Seq int64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"` +} + +func (m *SyncMessage) Reset() { *m = SyncMessage{} } +func (m *SyncMessage) String() string { return proto.CompactTextString(m) } +func (*SyncMessage) ProtoMessage() {} +func (*SyncMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{0} +} +func (m *SyncMessage) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncMessage.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncMessage.Merge(m, src) +} +func (m *SyncMessage) XXX_Size() int { + return m.Size() +} +func (m *SyncMessage) XXX_DiscardUnknown() { + xxx_messageInfo_SyncMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncMessage proto.InternalMessageInfo + +func (m *SyncMessage) GetSeq() int64 { + if m != nil { + return m.Seq + } + return 0 +} + +func init() { + proto.RegisterType((*SyncMessage)(nil), "anytype.SyncMessage") +} + +func init() { proto.RegisterFile("syncproto/proto/sync.proto", fileDescriptor_4b28dfdd48a89166) } + +var fileDescriptor_4b28dfdd48a89166 = []byte{ + // 119 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2a, 0xae, 0xcc, 0x4b, + 0x2e, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x87, 0x90, 0x20, 0xbe, 0x1e, 0x98, 0x29, 0xc4, 0x9e, 0x98, + 0x57, 0x59, 0x52, 0x59, 0x90, 0xaa, 0x24, 0xcf, 0xc5, 0x1d, 0x5c, 0x99, 0x97, 0xec, 0x9b, 0x5a, + 0x5c, 0x9c, 0x98, 0x9e, 0x2a, 0x24, 0xc0, 0xc5, 0x5c, 0x9c, 0x5a, 0x28, 0xc1, 0xa8, 0xc0, 0xa8, + 0xc1, 0x1c, 0x04, 0x62, 0x3a, 0xa9, 0x9c, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, + 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, + 0x14, 0x97, 0x3e, 0xdc, 0x82, 0x24, 0x36, 0x30, 0x65, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x7e, + 0xbc, 0x46, 0xd2, 0x74, 0x00, 0x00, 0x00, +} + +func (m *SyncMessage) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncMessage) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Seq != 0 { + i = encodeVarintSync(dAtA, i, uint64(m.Seq)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintSync(dAtA []byte, offset int, v uint64) int { + offset -= sovSync(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *SyncMessage) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Seq != 0 { + n += 1 + sovSync(uint64(m.Seq)) + } + return n +} + +func sovSync(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozSync(x uint64) (n int) { + return sovSync(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *SyncMessage) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SyncMessage: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SyncMessage: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Seq", wireType) + } + m.Seq = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Seq |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipSync(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSync + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSync + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowSync + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthSync + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupSync + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthSync + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthSync = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowSync = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupSync = fmt.Errorf("proto: unexpected end of group") +) From 9f984054b65de73dccfa446f191d90c3795a4da1 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 17 Jul 2022 13:34:07 +0200 Subject: [PATCH 18/40] Create new tree logic --- Makefile | 3 +- pkg/acl/acltree/acltree.go | 11 + pkg/acl/acltree/acltreestorage.go | 30 ++- pkg/acl/acltree/acltreestorage_test.go | 2 +- pkg/acl/example/plaintextdocument/document.go | 4 +- pkg/acl/treestorage/inmemory.go | 52 ++-- pkg/acl/treestorage/provider.go | 8 +- pkg/acl/treestorage/treepb/protos/tree.proto | 2 +- pkg/acl/treestorage/treepb/tree.pb.go | 20 +- service/sync/requesthandler/requesthandler.go | 43 ++-- service/sync/syncpb/protos/sync.proto | 6 +- service/sync/syncpb/sync.pb.go | 231 ++++++++++++++++-- service/treecache/service.go | 15 +- 13 files changed, 335 insertions(+), 92 deletions(-) diff --git a/Makefile b/Makefile index b1a3cc3e..41922b2c 100644 --- a/Makefile +++ b/Makefile @@ -25,12 +25,13 @@ protos-go: @$(eval P_TIMESTAMP := Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types) @$(eval P_STRUCT := Mgoogle/protobuf/struct.proto=github.com/gogo/protobuf/types) @$(eval P_ACL_CHANGES := M$(P_ACL_CHANGES_PATH_PB)/protos/aclchanges.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/$(P_ACL_CHANGES_PATH_PB)) + @$(eval P_TREE_CHANGES := M$(P_TREE_STORAGE_PATH_PB)/protos/tree.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/$(P_TREE_STORAGE_PATH_PB)) # use if needed $(eval PKGMAP := $$(P_TIMESTAMP),$$(P_STRUCT)) $(GOGO_START) protoc --gogofaster_out=:. $(P_ACL_CHANGES_PATH_PB)/protos/*.proto; mv $(P_ACL_CHANGES_PATH_PB)/protos/*.go $(P_ACL_CHANGES_PATH_PB) $(GOGO_START) protoc --gogofaster_out=:. $(P_TREE_STORAGE_PATH_PB)/protos/*.proto; mv $(P_TREE_STORAGE_PATH_PB)/protos/*.go $(P_TREE_STORAGE_PATH_PB) $(GOGO_START) protoc --gogofaster_out=:. $(P_PLAINTEXT_CHANGES_PATH_PB)/protos/*.proto; mv $(P_PLAINTEXT_CHANGES_PATH_PB)/protos/*.go $(P_PLAINTEXT_CHANGES_PATH_PB) - $(eval PKGMAP := $$(P_ACL_CHANGES)) + $(eval PKGMAP := $$(P_ACL_CHANGES),$$(P_TREE_CHANGES)) $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. $(P_SYNC_CHANGES_PATH_PB)/protos/*.proto; mv $(P_SYNC_CHANGES_PATH_PB)/protos/*.go $(P_SYNC_CHANGES_PATH_PB) build: diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index ed1c1a45..4b091433 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -6,6 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "sync" ) @@ -47,6 +48,7 @@ var ErrNoCommonSnapshot = errors.New("trees doesn't have a common snapshot") type ACLTree interface { RWLocker ID() string + Header() *treepb.TreeHeader ACLState() *ACLState AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*Change, error) AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) @@ -67,6 +69,7 @@ type aclTree struct { updateListener TreeUpdateListener id string + header *treepb.TreeHeader fullTree *Tree aclTreeFromStart *Tree // TODO: right now we don't use it, we can probably have only local var for now. This tree is built from start of the document aclState *ACLState @@ -118,6 +121,10 @@ func BuildACLTree( if err != nil { return nil, err } + aclTree.header, err = t.Header() + if err != nil { + return nil, err + } listener.Rebuild(aclTree) @@ -224,6 +231,10 @@ func (a *aclTree) ID() string { return a.id } +func (a *aclTree) Header() *treepb.TreeHeader { + return a.header +} + func (a *aclTree) ACLState() *ACLState { return a.aclState } diff --git a/pkg/acl/acltree/acltreestorage.go b/pkg/acl/acltree/acltreestorage.go index 51d7d86d..df03898a 100644 --- a/pkg/acl/acltree/acltreestorage.go +++ b/pkg/acl/acltree/acltreestorage.go @@ -4,13 +4,16 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/gogo/protobuf/proto" ) -func BuildTreeStorageWithACL( +func CreateNewTreeStorageWithACL( acc *account.AccountData, build func(builder ChangeBuilder) error, - create func(change *aclpb.RawChange) (treestorage.TreeStorage, error)) (treestorage.TreeStorage, error) { + create treestorage.CreatorFunc) (treestorage.TreeStorage, error) { bld := newChangeBuilder() bld.Init( newACLState(acc.Identity, acc.EncKey, signingkey.NewEd25519PubKeyDecoder()), @@ -32,8 +35,12 @@ func BuildTreeStorageWithACL( Signature: change.Signature(), Id: change.CID(), } + header, id, err := createTreeHeaderAndId(rawChange) + if err != nil { + return nil, err + } - thr, err := create(rawChange) + thr, err := create(id, header, []*aclpb.RawChange{rawChange}) if err != nil { return nil, err } @@ -44,3 +51,20 @@ func BuildTreeStorageWithACL( } return thr, nil } + +func createTreeHeaderAndId(change *aclpb.RawChange) (*treepb.TreeHeader, string, error) { + header := &treepb.TreeHeader{ + FirstChangeId: change.Id, + IsWorkspace: false, + } + marshalledHeader, err := proto.Marshal(header) + if err != nil { + return nil, "", err + } + treeId, err := cid.NewCIDFromBytes(marshalledHeader) + if err != nil { + return nil, "", err + } + + return header, treeId, nil +} diff --git a/pkg/acl/acltree/acltreestorage_test.go b/pkg/acl/acltree/acltreestorage_test.go index 674dd700..8730a542 100644 --- a/pkg/acl/acltree/acltreestorage_test.go +++ b/pkg/acl/acltree/acltreestorage_test.go @@ -19,7 +19,7 @@ func Test_BuildTreeStorageWithACL(t *testing.T) { SignKey: keychain.SigningKeys["A"], EncKey: keychain.EncryptionKeys["A"], } - thr, err := BuildTreeStorageWithACL( + thr, err := CreateNewTreeStorageWithACL( data, func(builder ChangeBuilder) error { return builder.UserAdd( diff --git a/pkg/acl/example/plaintextdocument/document.go b/pkg/acl/example/plaintextdocument/document.go index b25b2f8e..d97bf430 100644 --- a/pkg/acl/example/plaintextdocument/document.go +++ b/pkg/acl/example/plaintextdocument/document.go @@ -118,7 +118,7 @@ func NewInMemoryPlainTextDocument(acc *account.AccountData, text string) (PlainT func NewPlainTextDocument( acc *account.AccountData, - create func(change *aclpb.RawChange) (treestorage.TreeStorage, error), + create treestorage.CreatorFunc, text string) (PlainTextDocument, error) { changeBuilder := func(builder acltree.ChangeBuilder) error { err := builder.UserAdd(acc.Identity, acc.EncKey.GetPublic(), aclpb.ACLChange_Admin) @@ -128,7 +128,7 @@ func NewPlainTextDocument( builder.AddChangeContent(createInitialChangeContent(text)) return nil } - t, err := acltree.BuildTreeStorageWithACL( + t, err := acltree.CreateNewTreeStorageWithACL( acc, changeBuilder, create) diff --git a/pkg/acl/treestorage/inmemory.go b/pkg/acl/treestorage/inmemory.go index b9015116..adfa9af8 100644 --- a/pkg/acl/treestorage/inmemory.go +++ b/pkg/acl/treestorage/inmemory.go @@ -6,7 +6,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" "github.com/gogo/protobuf/proto" "sync" @@ -22,29 +21,25 @@ type inMemoryTreeStorage struct { sync.RWMutex } -func NewInMemoryTreeStorage(firstChange *aclpb.RawChange) (TreeStorage, error) { - header := &treepb.TreeHeader{ - FirstChangeId: firstChange.Id, - IsWorkspace: false, - } - marshalledHeader, err := proto.Marshal(header) - if err != nil { - return nil, err - } - treeId, err := cid.NewCIDFromBytes(marshalledHeader) - if err != nil { - return nil, err - } +type CreatorFunc = func(string, *treepb.TreeHeader, []*aclpb.RawChange) (TreeStorage, error) - changes := make(map[string]*aclpb.RawChange) - changes[firstChange.Id] = firstChange +func NewInMemoryTreeStorage( + treeId string, + header *treepb.TreeHeader, + changes []*aclpb.RawChange) (TreeStorage, error) { + allChanges := make(map[string]*aclpb.RawChange) + var orphans []string + for _, ch := range changes { + allChanges[ch.Id] = ch + orphans = append(orphans, ch.Id) + } return &inMemoryTreeStorage{ id: treeId, header: header, - heads: []string{firstChange.Id}, - orphans: nil, - changes: changes, + heads: nil, + orphans: orphans, + changes: allChanges, RWMutex: sync.RWMutex{}, }, nil } @@ -137,27 +132,28 @@ func (t *inMemoryTreeStorage) GetChange(ctx context.Context, changeId string) (* type inMemoryTreeStorageProvider struct { trees map[string]TreeStorage + sync.RWMutex } func (i *inMemoryTreeStorageProvider) TreeStorage(treeId string) (TreeStorage, error) { + i.RLock() + defer i.RUnlock() if tree, exists := i.trees[treeId]; exists { return tree, nil } return nil, ErrUnknownTreeId } -func (i *inMemoryTreeStorageProvider) InsertTree(tree TreeStorage) error { - if tree == nil { - return fmt.Errorf("tree should not be nil") - } - - id, err := tree.TreeID() +func (i *inMemoryTreeStorageProvider) CreateTreeStorage(treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) (TreeStorage, error) { + i.Lock() + defer i.Unlock() + res, err := NewInMemoryTreeStorage(treeId, header, changes) if err != nil { - return err + return nil, err } - i.trees[id] = tree - return nil + i.trees[treeId] = res + return res, nil } func NewInMemoryTreeStorageProvider() Provider { diff --git a/pkg/acl/treestorage/provider.go b/pkg/acl/treestorage/provider.go index fd442655..41b472e9 100644 --- a/pkg/acl/treestorage/provider.go +++ b/pkg/acl/treestorage/provider.go @@ -1,10 +1,14 @@ package treestorage -import "errors" +import ( + "errors" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" +) var ErrUnknownTreeId = errors.New("tree does not exist") type Provider interface { TreeStorage(treeId string) (TreeStorage, error) - InsertTree(tree TreeStorage) error + CreateTreeStorage(treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) (TreeStorage, error) } diff --git a/pkg/acl/treestorage/treepb/protos/tree.proto b/pkg/acl/treestorage/treepb/protos/tree.proto index 2b2a707f..eb342673 100644 --- a/pkg/acl/treestorage/treepb/protos/tree.proto +++ b/pkg/acl/treestorage/treepb/protos/tree.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -package anytype; +package tree; option go_package = "treepb"; message TreeHeader { diff --git a/pkg/acl/treestorage/treepb/tree.pb.go b/pkg/acl/treestorage/treepb/tree.pb.go index 32ce731f..7baa874c 100644 --- a/pkg/acl/treestorage/treepb/tree.pb.go +++ b/pkg/acl/treestorage/treepb/tree.pb.go @@ -75,7 +75,7 @@ func (m *TreeHeader) GetIsWorkspace() bool { } func init() { - proto.RegisterType((*TreeHeader)(nil), "anytype.TreeHeader") + proto.RegisterType((*TreeHeader)(nil), "tree.TreeHeader") } func init() { @@ -83,18 +83,18 @@ func init() { } var fileDescriptor_e7d760b855878644 = []byte{ - // 170 bytes of a gzipped FileDescriptorProto + // 165 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x29, 0xc8, 0x4e, 0xd7, 0x4f, 0x4c, 0xce, 0xd1, 0x2f, 0x29, 0x4a, 0x4d, 0x2d, 0x2e, 0xc9, 0x2f, 0x4a, 0x4c, 0x4f, 0x05, 0xb3, 0x0b, 0x92, 0xf4, 0x0b, 0x8a, 0xf2, 0x4b, 0xf2, 0x8b, 0xc1, 0x3c, 0x3d, 0x30, 0x5b, 0x88, - 0x3d, 0x31, 0xaf, 0xb2, 0xa4, 0xb2, 0x20, 0x55, 0x29, 0x84, 0x8b, 0x2b, 0xa4, 0x28, 0x35, 0xd5, - 0x23, 0x35, 0x31, 0x25, 0xb5, 0x48, 0x48, 0x85, 0x8b, 0x37, 0x2d, 0xb3, 0xa8, 0xb8, 0xc4, 0x39, - 0x23, 0x31, 0x2f, 0x3d, 0xd5, 0x33, 0x45, 0x82, 0x51, 0x81, 0x51, 0x83, 0x33, 0x08, 0x55, 0x50, - 0x48, 0x81, 0x8b, 0x3b, 0xb3, 0x38, 0x3c, 0xbf, 0x28, 0xbb, 0xb8, 0x20, 0x31, 0x39, 0x55, 0x82, - 0x49, 0x81, 0x51, 0x83, 0x23, 0x08, 0x59, 0xc8, 0x49, 0xe1, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, - 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, - 0x8f, 0xe5, 0x18, 0xa2, 0xd8, 0x20, 0x4e, 0x4a, 0x62, 0x03, 0xbb, 0xc3, 0x18, 0x10, 0x00, 0x00, - 0xff, 0xff, 0xb1, 0x3f, 0x66, 0x17, 0xb7, 0x00, 0x00, 0x00, + 0x05, 0xc4, 0x56, 0x0a, 0xe1, 0xe2, 0x0a, 0x29, 0x4a, 0x4d, 0xf5, 0x48, 0x4d, 0x4c, 0x49, 0x2d, + 0x12, 0x52, 0xe1, 0xe2, 0x4d, 0xcb, 0x2c, 0x2a, 0x2e, 0x71, 0xce, 0x48, 0xcc, 0x4b, 0x4f, 0xf5, + 0x4c, 0x91, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x42, 0x15, 0x14, 0x52, 0xe0, 0xe2, 0xce, 0x2c, + 0x0e, 0xcf, 0x2f, 0xca, 0x2e, 0x2e, 0x48, 0x4c, 0x4e, 0x95, 0x60, 0x52, 0x60, 0xd4, 0xe0, 0x08, + 0x42, 0x16, 0x72, 0x52, 0x38, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, + 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0x36, + 0x88, 0x7b, 0x92, 0xd8, 0xc0, 0x8e, 0x30, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x09, 0x4f, 0xc6, + 0xec, 0xb4, 0x00, 0x00, 0x00, } func (m *TreeHeader) Marshal() (dAtA []byte, err error) { diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 491f3c4b..7bdaf488 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -6,6 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/client" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" @@ -66,7 +67,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, shouldFullSync := !slice.UnsortedEquals(update.Heads, tree.Heads()) snapshotPath = tree.SnapshotPath() if shouldFullSync { - fullRequest, err = r.prepareFullSyncRequest(update.TreeId, update.SnapshotPath, tree) + fullRequest, err = r.prepareFullSyncRequest(update.TreeId, update.TreeHeader, update.SnapshotPath, tree) if err != nil { return err } @@ -75,8 +76,10 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, }) // if there are no such tree if err == treestorage.ErrUnknownTreeId { + // TODO: maybe we can optimize this by sending the header and stuff right away, so when the tree is created we are able to add it on first request fullRequest = &syncpb.SyncFullRequest{ - TreeId: update.TreeId, + TreeId: update.TreeId, + TreeHeader: update.TreeHeader, } } // if we have incompatible heads, or we haven't seen the tree at all @@ -93,6 +96,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, Changes: result.Added, SnapshotPath: snapshotPath, TreeId: update.TreeId, + TreeHeader: update.TreeHeader, } return r.client.NotifyHeadsChanged(newUpdate) } @@ -106,7 +110,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str err = r.treeCache.Do(ctx, request.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes - // if we have non empty request + // if we have non-empty request if len(request.Heads) != 0 { result, err = tree.AddRawChanges(ctx, request.Changes...) if err != nil { @@ -135,6 +139,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str Changes: result.Added, SnapshotPath: snapshotPath, TreeId: request.TreeId, + TreeHeader: request.TreeHeader, } return r.client.NotifyHeadsChanged(newUpdate) } @@ -154,17 +159,18 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st snapshotPath = tree.SnapshotPath() return nil }) - if err == treestorage.ErrUnknownTreeId { - // TODO: probably sometimes we should notify about this (e.g. if client created new document) - return r.createTree(response) - } // if error or nothing has changed - if err != nil || len(result.Added) == 0 { + if (err != nil || len(result.Added) == 0) && err != treestorage.ErrUnknownTreeId { return err } - - // TODO: probably here we should not send an update message, because the other node had already sent it after updating with our data - // otherwise sending heads update message + // if we have a new tree + if err == treestorage.ErrUnknownTreeId { + err = r.createTree(ctx, response) + if err != nil { + return err + } + } + // sending heads update message newUpdate := &syncpb.SyncHeadUpdate{ Heads: result.Heads, Changes: result.Added, @@ -174,7 +180,7 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st return r.client.NotifyHeadsChanged(newUpdate) } -func (r *requestHandler) prepareFullSyncRequest(treeId string, theirPath []string, tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) { +func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) { ourChanges, err := tree.ChangesAfterCommonSnapshot(theirPath) if err != nil { return nil, err @@ -184,10 +190,15 @@ func (r *requestHandler) prepareFullSyncRequest(treeId string, theirPath []strin Changes: ourChanges, TreeId: treeId, SnapshotPath: tree.SnapshotPath(), + TreeHeader: header, }, nil } -func (r *requestHandler) prepareFullSyncResponse(treeId string, theirPath []string, theirChanges []*aclpb.RawChange, tree acltree.ACLTree) (*syncpb.SyncFullResponse, error) { +func (r *requestHandler) prepareFullSyncResponse( + treeId string, + theirPath []string, + theirChanges []*aclpb.RawChange, + tree acltree.ACLTree) (*syncpb.SyncFullResponse, error) { // TODO: we can probably use the common snapshot calculated on the request step from previous peer ourChanges, err := tree.ChangesAfterCommonSnapshot(theirPath) if err != nil { @@ -211,10 +222,10 @@ func (r *requestHandler) prepareFullSyncResponse(treeId string, theirPath []stri Changes: final, TreeId: treeId, SnapshotPath: tree.SnapshotPath(), + TreeHeader: tree.Header(), }, nil } -func (r *requestHandler) createTree(response *syncpb.SyncFullResponse) error { - // TODO: write create tree functionality - return nil +func (r *requestHandler) createTree(ctx context.Context, response *syncpb.SyncFullResponse) error { + return r.treeCache.Add(ctx, response.TreeId, response.TreeHeader, response.Changes) } diff --git a/service/sync/syncpb/protos/sync.proto b/service/sync/syncpb/protos/sync.proto index b67e18a1..efdc1f7c 100644 --- a/service/sync/syncpb/protos/sync.proto +++ b/service/sync/syncpb/protos/sync.proto @@ -1,8 +1,9 @@ syntax = "proto3"; -package anytype; +package sync; option go_package = "syncpb"; import "pkg/acl/aclchanges/aclpb/protos/aclchanges.proto"; +import "pkg/acl/treestorage/treepb/protos/tree.proto"; message Sync { message HeadUpdate { @@ -10,6 +11,7 @@ message Sync { repeated acl.RawChange changes = 2; string treeId = 3; repeated string snapshotPath = 4; + tree.TreeHeader treeHeader = 5; } message Full { @@ -19,6 +21,7 @@ message Sync { repeated acl.RawChange changes = 2; string treeId = 3; repeated string snapshotPath = 4; + tree.TreeHeader treeHeader = 5; } message Response { @@ -26,6 +29,7 @@ message Sync { repeated acl.RawChange changes = 2; string treeId = 3; repeated string snapshotPath = 4; + tree.TreeHeader treeHeader = 5; } } } \ No newline at end of file diff --git a/service/sync/syncpb/sync.pb.go b/service/sync/syncpb/sync.pb.go index f06b2d27..1cd6afb0 100644 --- a/service/sync/syncpb/sync.pb.go +++ b/service/sync/syncpb/sync.pb.go @@ -6,6 +6,7 @@ package syncpb import ( fmt "fmt" aclpb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + treepb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" proto "github.com/gogo/protobuf/proto" io "io" math "math" @@ -64,6 +65,7 @@ type SyncHeadUpdate struct { Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` + TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` } func (m *SyncHeadUpdate) Reset() { *m = SyncHeadUpdate{} } @@ -127,6 +129,13 @@ func (m *SyncHeadUpdate) GetSnapshotPath() []string { return nil } +func (m *SyncHeadUpdate) GetTreeHeader() *treepb.TreeHeader { + if m != nil { + return m.TreeHeader + } + return nil +} + type SyncFull struct { } @@ -169,6 +178,7 @@ type SyncFullRequest struct { Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` + TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` } func (m *SyncFullRequest) Reset() { *m = SyncFullRequest{} } @@ -232,11 +242,19 @@ func (m *SyncFullRequest) GetSnapshotPath() []string { return nil } +func (m *SyncFullRequest) GetTreeHeader() *treepb.TreeHeader { + if m != nil { + return m.TreeHeader + } + return nil +} + type SyncFullResponse struct { Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` + TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` } func (m *SyncFullResponse) Reset() { *m = SyncFullResponse{} } @@ -300,12 +318,19 @@ func (m *SyncFullResponse) GetSnapshotPath() []string { return nil } +func (m *SyncFullResponse) GetTreeHeader() *treepb.TreeHeader { + if m != nil { + return m.TreeHeader + } + return nil +} + func init() { - proto.RegisterType((*Sync)(nil), "anytype.Sync") - proto.RegisterType((*SyncHeadUpdate)(nil), "anytype.Sync.HeadUpdate") - proto.RegisterType((*SyncFull)(nil), "anytype.Sync.Full") - proto.RegisterType((*SyncFullRequest)(nil), "anytype.Sync.Full.Request") - proto.RegisterType((*SyncFullResponse)(nil), "anytype.Sync.Full.Response") + proto.RegisterType((*Sync)(nil), "sync.Sync") + proto.RegisterType((*SyncHeadUpdate)(nil), "sync.Sync.HeadUpdate") + proto.RegisterType((*SyncFull)(nil), "sync.Sync.Full") + proto.RegisterType((*SyncFullRequest)(nil), "sync.Sync.Full.Request") + proto.RegisterType((*SyncFullResponse)(nil), "sync.Sync.Full.Response") } func init() { @@ -313,25 +338,27 @@ func init() { } var fileDescriptor_5f66cdd599c6466f = []byte{ - // 273 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2d, 0x4e, 0x2d, 0x2a, - 0xcb, 0x4c, 0x4e, 0xd5, 0x2f, 0xae, 0xcc, 0x4b, 0x06, 0x13, 0x05, 0x49, 0xfa, 0x05, 0x45, 0xf9, - 0x25, 0xf9, 0xc5, 0x60, 0x9e, 0x1e, 0x98, 0x2d, 0xc4, 0x9e, 0x98, 0x57, 0x59, 0x52, 0x59, 0x90, - 0x2a, 0x65, 0x50, 0x90, 0x9d, 0xae, 0x9f, 0x98, 0x9c, 0x03, 0xc2, 0xc9, 0x19, 0x89, 0x79, 0xe9, - 0xa9, 0xc5, 0x20, 0x26, 0x42, 0x13, 0x42, 0x1c, 0xa2, 0x55, 0x69, 0x35, 0x33, 0x17, 0x4b, 0x70, - 0x65, 0x5e, 0xb2, 0x54, 0x07, 0x23, 0x17, 0x97, 0x47, 0x6a, 0x62, 0x4a, 0x68, 0x41, 0x4a, 0x62, - 0x49, 0xaa, 0x90, 0x08, 0x17, 0x6b, 0x46, 0x6a, 0x62, 0x4a, 0xb1, 0x04, 0xa3, 0x02, 0xb3, 0x06, - 0x67, 0x10, 0x84, 0x23, 0xa4, 0xc1, 0xc5, 0x0e, 0xd5, 0x2e, 0xc1, 0xa4, 0xc0, 0xac, 0xc1, 0x6d, - 0xc4, 0xa7, 0x97, 0x98, 0x9c, 0xa3, 0x17, 0x94, 0x58, 0xee, 0x0c, 0x16, 0x0e, 0x82, 0x49, 0x0b, - 0x89, 0x71, 0xb1, 0x95, 0x14, 0xa5, 0xa6, 0x7a, 0xa6, 0x48, 0x30, 0x2b, 0x30, 0x6a, 0x70, 0x06, - 0x41, 0x79, 0x42, 0x4a, 0x5c, 0x3c, 0xc5, 0x79, 0x89, 0x05, 0xc5, 0x19, 0xf9, 0x25, 0x01, 0x89, - 0x25, 0x19, 0x12, 0x2c, 0x60, 0xe3, 0x51, 0xc4, 0xa4, 0xa6, 0x33, 0x71, 0xb1, 0xb8, 0x95, 0xe6, - 0xe4, 0x48, 0xb5, 0x32, 0x72, 0xb1, 0x07, 0xa5, 0x16, 0x96, 0xa6, 0x16, 0x97, 0x0c, 0xa8, 0x83, - 0xda, 0x18, 0xb9, 0x38, 0x82, 0x52, 0x8b, 0x0b, 0xf2, 0xf3, 0x8a, 0x07, 0x34, 0x64, 0x9c, 0x14, - 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, - 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x8a, 0x0d, 0x92, 0x38, 0x92, 0xd8, - 0xc0, 0xd1, 0x6a, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x90, 0x29, 0xbc, 0x62, 0x3a, 0x02, 0x00, - 0x00, + // 314 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x52, 0xc1, 0x4a, 0xc3, 0x30, + 0x18, 0x5e, 0xb6, 0x6e, 0x73, 0xff, 0x44, 0x24, 0x88, 0x94, 0x1e, 0x42, 0x19, 0x08, 0x3d, 0x48, + 0x37, 0xe6, 0x1b, 0x28, 0x88, 0xde, 0x24, 0xea, 0xc5, 0x5b, 0xd6, 0xfe, 0xac, 0x62, 0x69, 0x63, + 0x93, 0x29, 0xbe, 0x85, 0x6f, 0xa3, 0x78, 0xf3, 0xe6, 0x71, 0x47, 0x8f, 0xd2, 0x3e, 0x86, 0x17, + 0x49, 0xba, 0x59, 0x7d, 0x84, 0x1d, 0x12, 0xbe, 0xef, 0xcb, 0xff, 0xe5, 0xfb, 0x13, 0x7e, 0x38, + 0x50, 0x58, 0x3c, 0xdc, 0x46, 0x38, 0x56, 0x4f, 0x59, 0x64, 0x37, 0x39, 0x1b, 0xcb, 0x22, 0xd7, + 0xb9, 0xb2, 0x2c, 0xb4, 0x98, 0x3a, 0x06, 0x7b, 0x13, 0x79, 0x37, 0x1f, 0x8b, 0x28, 0x35, 0x2b, + 0x4a, 0x44, 0x36, 0x47, 0x65, 0x60, 0xe3, 0x68, 0xf4, 0xda, 0xe7, 0x1d, 0xae, 0x1d, 0xba, 0x40, + 0x54, 0x3a, 0x2f, 0xc4, 0x1c, 0x2d, 0x6e, 0x3c, 0x86, 0xd5, 0xd5, 0xa3, 0x77, 0x07, 0x9c, 0x4b, + 0x13, 0xf4, 0x46, 0x00, 0xce, 0x50, 0xc4, 0xd7, 0x32, 0x16, 0x1a, 0xe9, 0x1e, 0x74, 0x13, 0x14, + 0xb1, 0x72, 0x89, 0xdf, 0x09, 0x06, 0xbc, 0x26, 0x34, 0x80, 0xfe, 0x2a, 0xcc, 0x6d, 0xfb, 0x9d, + 0x60, 0x38, 0xdd, 0x09, 0x45, 0x94, 0x86, 0x5c, 0x3c, 0x9e, 0x58, 0x99, 0xaf, 0x8f, 0xe9, 0x3e, + 0xf4, 0x4c, 0xca, 0x79, 0xec, 0x76, 0x7c, 0x12, 0x0c, 0xf8, 0x8a, 0xd1, 0x11, 0x6c, 0xab, 0x4c, + 0x48, 0x95, 0xe4, 0xfa, 0x42, 0xe8, 0xc4, 0x75, 0xec, 0xf5, 0xff, 0x34, 0x3a, 0x01, 0x30, 0xd5, + 0xa6, 0x1b, 0x2c, 0xdc, 0xae, 0x4f, 0x82, 0xe1, 0x74, 0x37, 0xb4, 0x4d, 0x5f, 0xfd, 0xea, 0xfc, + 0x4f, 0x8d, 0xf7, 0xdd, 0x06, 0xe7, 0x74, 0x91, 0xa6, 0xde, 0x0b, 0x81, 0x3e, 0xc7, 0xfb, 0x05, + 0x2a, 0xbd, 0x61, 0x4f, 0x78, 0x25, 0xb0, 0xc5, 0x51, 0xc9, 0x3c, 0x53, 0x1b, 0xf6, 0xfb, 0xc7, + 0xfe, 0x47, 0xc9, 0xc8, 0xb2, 0x64, 0xe4, 0xab, 0x64, 0xe4, 0xb9, 0x62, 0xad, 0x65, 0xc5, 0x5a, + 0x9f, 0x15, 0x6b, 0xdd, 0xf4, 0xea, 0xe9, 0x9e, 0xf5, 0xec, 0xb0, 0x1d, 0xfd, 0x04, 0x00, 0x00, + 0xff, 0xff, 0x52, 0xcd, 0x15, 0xea, 0xfb, 0x02, 0x00, 0x00, } func (m *Sync) Marshal() (dAtA []byte, err error) { @@ -377,6 +404,18 @@ func (m *SyncHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.TreeHeader != nil { + { + size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } if len(m.SnapshotPath) > 0 { for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.SnapshotPath[iNdEx]) @@ -462,6 +501,18 @@ func (m *SyncFullRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.TreeHeader != nil { + { + size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } if len(m.SnapshotPath) > 0 { for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.SnapshotPath[iNdEx]) @@ -524,6 +575,18 @@ func (m *SyncFullResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.TreeHeader != nil { + { + size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } if len(m.SnapshotPath) > 0 { for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.SnapshotPath[iNdEx]) @@ -614,6 +677,10 @@ func (m *SyncHeadUpdate) Size() (n int) { n += 1 + l + sovSync(uint64(l)) } } + if m.TreeHeader != nil { + l = m.TreeHeader.Size() + n += 1 + l + sovSync(uint64(l)) + } return n } @@ -654,6 +721,10 @@ func (m *SyncFullRequest) Size() (n int) { n += 1 + l + sovSync(uint64(l)) } } + if m.TreeHeader != nil { + l = m.TreeHeader.Size() + n += 1 + l + sovSync(uint64(l)) + } return n } @@ -685,6 +756,10 @@ func (m *SyncFullResponse) Size() (n int) { n += 1 + l + sovSync(uint64(l)) } } + if m.TreeHeader != nil { + l = m.TreeHeader.Size() + n += 1 + l + sovSync(uint64(l)) + } return n } @@ -903,6 +978,42 @@ func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { } m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TreeHeader == nil { + m.TreeHeader = &treepb.TreeHeader{} + } + if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) @@ -1133,6 +1244,42 @@ func (m *SyncFullRequest) Unmarshal(dAtA []byte) error { } m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TreeHeader == nil { + m.TreeHeader = &treepb.TreeHeader{} + } + if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) @@ -1313,6 +1460,42 @@ func (m *SyncFullResponse) Unmarshal(dAtA []byte) error { } m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TreeHeader == nil { + m.TreeHeader = &treepb.TreeHeader{} + } + if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) diff --git a/service/treecache/service.go b/service/treecache/service.go index cd3cf884..82460917 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -3,8 +3,10 @@ package treecache import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" ) @@ -13,7 +15,7 @@ const CName = "treecache" type Service interface { Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree) error) error - Add(ctx context.Context, treeId string, tree acltree.ACLTree) error + Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) error } type service struct { @@ -38,13 +40,20 @@ func (s *service) Do(ctx context.Context, treeId string, f func(tree acltree.ACL return f(tree.(acltree.ACLTree)) } -func (s *service) Add(ctx context.Context, treeId string, tree acltree.ACLTree) error { - return s.cache.Add(treeId, tree) +func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) error { + _, err := s.treeProvider.CreateTreeStorage(treeId, header, changes) + if err != nil { + return err + } + // forcing the tree to build + _, err = s.cache.Get(ctx, treeId) + return err } func (s *service) Init(ctx context.Context, a *app.App) (err error) { s.cache = ocache.New(s.loadTree) s.account = a.MustComponent(account.CName).(account.Service) + s.treeProvider = treestorage.NewInMemoryTreeStorageProvider() // TODO: for test we should load some predefined keys return nil } From 7a6c42df6239bdde60be17dd92c93a3951880cb2 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 18 Jul 2022 10:45:05 +0200 Subject: [PATCH 19/40] Add oneof to sync proto --- service/sync/syncpb/protos/sync.proto | 12 + service/sync/syncpb/sync.pb.go | 635 +++++++++++++++++++++++++- 2 files changed, 622 insertions(+), 25 deletions(-) diff --git a/service/sync/syncpb/protos/sync.proto b/service/sync/syncpb/protos/sync.proto index efdc1f7c..4c76a33e 100644 --- a/service/sync/syncpb/protos/sync.proto +++ b/service/sync/syncpb/protos/sync.proto @@ -6,6 +6,18 @@ import "pkg/acl/aclchanges/aclpb/protos/aclchanges.proto"; import "pkg/acl/treestorage/treepb/protos/tree.proto"; message Sync { + message Content { + repeated ContentValue messages = 1; + } + + message ContentValue { + oneof value { + HeadUpdate headUpdate = 1; + Full.Request fullSyncRequest = 2; + Full.Response fullSyncResponse = 3; + } + } + message HeadUpdate { repeated string heads = 1; repeated acl.RawChange changes = 2; diff --git a/service/sync/syncpb/sync.pb.go b/service/sync/syncpb/sync.pb.go index 1cd6afb0..dd24731e 100644 --- a/service/sync/syncpb/sync.pb.go +++ b/service/sync/syncpb/sync.pb.go @@ -60,6 +60,148 @@ func (m *Sync) XXX_DiscardUnknown() { var xxx_messageInfo_Sync proto.InternalMessageInfo +type SyncContent struct { + Messages []*SyncContentValue `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"` +} + +func (m *SyncContent) Reset() { *m = SyncContent{} } +func (m *SyncContent) String() string { return proto.CompactTextString(m) } +func (*SyncContent) ProtoMessage() {} +func (*SyncContent) Descriptor() ([]byte, []int) { + return fileDescriptor_5f66cdd599c6466f, []int{0, 0} +} +func (m *SyncContent) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncContent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncContent.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncContent) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncContent.Merge(m, src) +} +func (m *SyncContent) XXX_Size() int { + return m.Size() +} +func (m *SyncContent) XXX_DiscardUnknown() { + xxx_messageInfo_SyncContent.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncContent proto.InternalMessageInfo + +func (m *SyncContent) GetMessages() []*SyncContentValue { + if m != nil { + return m.Messages + } + return nil +} + +type SyncContentValue struct { + // Types that are valid to be assigned to Value: + // *SyncContentValueValueOfHeadUpdate + // *SyncContentValueValueOfFullSyncRequest + // *SyncContentValueValueOfFullSyncResponse + Value IsSyncContentValueValue `protobuf_oneof:"value"` +} + +func (m *SyncContentValue) Reset() { *m = SyncContentValue{} } +func (m *SyncContentValue) String() string { return proto.CompactTextString(m) } +func (*SyncContentValue) ProtoMessage() {} +func (*SyncContentValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5f66cdd599c6466f, []int{0, 1} +} +func (m *SyncContentValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncContentValue.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncContentValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncContentValue.Merge(m, src) +} +func (m *SyncContentValue) XXX_Size() int { + return m.Size() +} +func (m *SyncContentValue) XXX_DiscardUnknown() { + xxx_messageInfo_SyncContentValue.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncContentValue proto.InternalMessageInfo + +type IsSyncContentValueValue interface { + IsSyncContentValueValue() + MarshalTo([]byte) (int, error) + Size() int +} + +type SyncContentValueValueOfHeadUpdate struct { + HeadUpdate *SyncHeadUpdate `protobuf:"bytes,1,opt,name=headUpdate,proto3,oneof" json:"headUpdate,omitempty"` +} +type SyncContentValueValueOfFullSyncRequest struct { + FullSyncRequest *SyncFullRequest `protobuf:"bytes,2,opt,name=fullSyncRequest,proto3,oneof" json:"fullSyncRequest,omitempty"` +} +type SyncContentValueValueOfFullSyncResponse struct { + FullSyncResponse *SyncFullResponse `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` +} + +func (*SyncContentValueValueOfHeadUpdate) IsSyncContentValueValue() {} +func (*SyncContentValueValueOfFullSyncRequest) IsSyncContentValueValue() {} +func (*SyncContentValueValueOfFullSyncResponse) IsSyncContentValueValue() {} + +func (m *SyncContentValue) GetValue() IsSyncContentValueValue { + if m != nil { + return m.Value + } + return nil +} + +func (m *SyncContentValue) GetHeadUpdate() *SyncHeadUpdate { + if x, ok := m.GetValue().(*SyncContentValueValueOfHeadUpdate); ok { + return x.HeadUpdate + } + return nil +} + +func (m *SyncContentValue) GetFullSyncRequest() *SyncFullRequest { + if x, ok := m.GetValue().(*SyncContentValueValueOfFullSyncRequest); ok { + return x.FullSyncRequest + } + return nil +} + +func (m *SyncContentValue) GetFullSyncResponse() *SyncFullResponse { + if x, ok := m.GetValue().(*SyncContentValueValueOfFullSyncResponse); ok { + return x.FullSyncResponse + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*SyncContentValue) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*SyncContentValueValueOfHeadUpdate)(nil), + (*SyncContentValueValueOfFullSyncRequest)(nil), + (*SyncContentValueValueOfFullSyncResponse)(nil), + } +} + type SyncHeadUpdate struct { Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` @@ -72,7 +214,7 @@ func (m *SyncHeadUpdate) Reset() { *m = SyncHeadUpdate{} } func (m *SyncHeadUpdate) String() string { return proto.CompactTextString(m) } func (*SyncHeadUpdate) ProtoMessage() {} func (*SyncHeadUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 0} + return fileDescriptor_5f66cdd599c6466f, []int{0, 2} } func (m *SyncHeadUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -143,7 +285,7 @@ func (m *SyncFull) Reset() { *m = SyncFull{} } func (m *SyncFull) String() string { return proto.CompactTextString(m) } func (*SyncFull) ProtoMessage() {} func (*SyncFull) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 1} + return fileDescriptor_5f66cdd599c6466f, []int{0, 3} } func (m *SyncFull) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -185,7 +327,7 @@ func (m *SyncFullRequest) Reset() { *m = SyncFullRequest{} } func (m *SyncFullRequest) String() string { return proto.CompactTextString(m) } func (*SyncFullRequest) ProtoMessage() {} func (*SyncFullRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 1, 0} + return fileDescriptor_5f66cdd599c6466f, []int{0, 3, 0} } func (m *SyncFullRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -261,7 +403,7 @@ func (m *SyncFullResponse) Reset() { *m = SyncFullResponse{} } func (m *SyncFullResponse) String() string { return proto.CompactTextString(m) } func (*SyncFullResponse) ProtoMessage() {} func (*SyncFullResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 1, 1} + return fileDescriptor_5f66cdd599c6466f, []int{0, 3, 1} } func (m *SyncFullResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -327,6 +469,8 @@ func (m *SyncFullResponse) GetTreeHeader() *treepb.TreeHeader { func init() { proto.RegisterType((*Sync)(nil), "sync.Sync") + proto.RegisterType((*SyncContent)(nil), "sync.Sync.Content") + proto.RegisterType((*SyncContentValue)(nil), "sync.Sync.ContentValue") proto.RegisterType((*SyncHeadUpdate)(nil), "sync.Sync.HeadUpdate") proto.RegisterType((*SyncFull)(nil), "sync.Sync.Full") proto.RegisterType((*SyncFullRequest)(nil), "sync.Sync.Full.Request") @@ -338,27 +482,34 @@ func init() { } var fileDescriptor_5f66cdd599c6466f = []byte{ - // 314 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x52, 0xc1, 0x4a, 0xc3, 0x30, - 0x18, 0x5e, 0xb6, 0x6e, 0x73, 0xff, 0x44, 0x24, 0x88, 0x94, 0x1e, 0x42, 0x19, 0x08, 0x3d, 0x48, - 0x37, 0xe6, 0x1b, 0x28, 0x88, 0xde, 0x24, 0xea, 0xc5, 0x5b, 0xd6, 0xfe, 0xac, 0x62, 0x69, 0x63, - 0x93, 0x29, 0xbe, 0x85, 0x6f, 0xa3, 0x78, 0xf3, 0xe6, 0x71, 0x47, 0x8f, 0xd2, 0x3e, 0x86, 0x17, - 0x49, 0xba, 0x59, 0x7d, 0x84, 0x1d, 0x12, 0xbe, 0xef, 0xcb, 0xff, 0xe5, 0xfb, 0x13, 0x7e, 0x38, - 0x50, 0x58, 0x3c, 0xdc, 0x46, 0x38, 0x56, 0x4f, 0x59, 0x64, 0x37, 0x39, 0x1b, 0xcb, 0x22, 0xd7, - 0xb9, 0xb2, 0x2c, 0xb4, 0x98, 0x3a, 0x06, 0x7b, 0x13, 0x79, 0x37, 0x1f, 0x8b, 0x28, 0x35, 0x2b, - 0x4a, 0x44, 0x36, 0x47, 0x65, 0x60, 0xe3, 0x68, 0xf4, 0xda, 0xe7, 0x1d, 0xae, 0x1d, 0xba, 0x40, - 0x54, 0x3a, 0x2f, 0xc4, 0x1c, 0x2d, 0x6e, 0x3c, 0x86, 0xd5, 0xd5, 0xa3, 0x77, 0x07, 0x9c, 0x4b, - 0x13, 0xf4, 0x46, 0x00, 0xce, 0x50, 0xc4, 0xd7, 0x32, 0x16, 0x1a, 0xe9, 0x1e, 0x74, 0x13, 0x14, - 0xb1, 0x72, 0x89, 0xdf, 0x09, 0x06, 0xbc, 0x26, 0x34, 0x80, 0xfe, 0x2a, 0xcc, 0x6d, 0xfb, 0x9d, - 0x60, 0x38, 0xdd, 0x09, 0x45, 0x94, 0x86, 0x5c, 0x3c, 0x9e, 0x58, 0x99, 0xaf, 0x8f, 0xe9, 0x3e, - 0xf4, 0x4c, 0xca, 0x79, 0xec, 0x76, 0x7c, 0x12, 0x0c, 0xf8, 0x8a, 0xd1, 0x11, 0x6c, 0xab, 0x4c, - 0x48, 0x95, 0xe4, 0xfa, 0x42, 0xe8, 0xc4, 0x75, 0xec, 0xf5, 0xff, 0x34, 0x3a, 0x01, 0x30, 0xd5, - 0xa6, 0x1b, 0x2c, 0xdc, 0xae, 0x4f, 0x82, 0xe1, 0x74, 0x37, 0xb4, 0x4d, 0x5f, 0xfd, 0xea, 0xfc, - 0x4f, 0x8d, 0xf7, 0xdd, 0x06, 0xe7, 0x74, 0x91, 0xa6, 0xde, 0x0b, 0x81, 0x3e, 0xc7, 0xfb, 0x05, - 0x2a, 0xbd, 0x61, 0x4f, 0x78, 0x25, 0xb0, 0xc5, 0x51, 0xc9, 0x3c, 0x53, 0x1b, 0xf6, 0xfb, 0xc7, - 0xfe, 0x47, 0xc9, 0xc8, 0xb2, 0x64, 0xe4, 0xab, 0x64, 0xe4, 0xb9, 0x62, 0xad, 0x65, 0xc5, 0x5a, - 0x9f, 0x15, 0x6b, 0xdd, 0xf4, 0xea, 0xe9, 0x9e, 0xf5, 0xec, 0xb0, 0x1d, 0xfd, 0x04, 0x00, 0x00, - 0xff, 0xff, 0x52, 0xcd, 0x15, 0xea, 0xfb, 0x02, 0x00, 0x00, + // 426 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x53, 0xbd, 0x8e, 0xd3, 0x40, + 0x10, 0xf6, 0xe6, 0x1c, 0xfb, 0x6e, 0xee, 0x04, 0xa7, 0x15, 0x3f, 0x2b, 0x17, 0x56, 0x74, 0x12, + 0x52, 0x0a, 0xe4, 0x9c, 0x2e, 0x05, 0x1d, 0x45, 0x22, 0x45, 0xa6, 0x43, 0xcb, 0x4f, 0x41, 0xb7, + 0x71, 0x06, 0x1b, 0x61, 0x6c, 0xe3, 0x5d, 0x07, 0xf1, 0x16, 0xbc, 0x0d, 0x88, 0x27, 0xa0, 0x4c, + 0x49, 0x83, 0x04, 0xc9, 0x63, 0xd0, 0xa0, 0x5d, 0xdb, 0xb1, 0xb9, 0x3c, 0x41, 0x8a, 0x44, 0x33, + 0xf3, 0x7d, 0xdf, 0xf8, 0x9b, 0x19, 0x2d, 0x3c, 0x92, 0x58, 0xae, 0xdf, 0x45, 0x38, 0x91, 0x9f, + 0xb3, 0xc8, 0xfc, 0x15, 0xcb, 0x49, 0x51, 0xe6, 0x2a, 0x97, 0x26, 0x0b, 0x4c, 0x4c, 0x6d, 0x1d, + 0x7b, 0xd7, 0xc5, 0xfb, 0x78, 0x22, 0xa2, 0x54, 0xff, 0xa2, 0x44, 0x64, 0x31, 0x4a, 0x1d, 0x76, + 0x8a, 0xae, 0x5e, 0xeb, 0xbc, 0xc7, 0xad, 0x42, 0x95, 0x88, 0x52, 0xe5, 0xa5, 0x88, 0xd1, 0xc4, + 0x9d, 0x46, 0x67, 0x35, 0xfb, 0xea, 0x8f, 0x03, 0xf6, 0x0b, 0xfd, 0xa1, 0xa7, 0xe0, 0xce, 0xf3, + 0x4c, 0x61, 0xa6, 0xe8, 0x14, 0x4e, 0x3f, 0xa0, 0x94, 0x22, 0x46, 0xc9, 0xc8, 0xe8, 0x64, 0x7c, + 0x7e, 0xf3, 0x30, 0x30, 0xc6, 0x34, 0x31, 0x68, 0x58, 0xaf, 0x45, 0x5a, 0x21, 0xdf, 0x13, 0xbd, + 0x5f, 0x04, 0x2e, 0xfa, 0x10, 0x7d, 0x02, 0x90, 0xa0, 0x58, 0xbd, 0x2a, 0x56, 0x42, 0x21, 0x23, + 0x23, 0x32, 0x3e, 0xbf, 0xb9, 0xdf, 0xeb, 0x13, 0xee, 0xc1, 0xd0, 0xe2, 0x3d, 0x2a, 0x9d, 0xc3, + 0xdd, 0xb7, 0x55, 0x9a, 0x6a, 0x12, 0xc7, 0x8f, 0x15, 0x4a, 0xc5, 0x06, 0x46, 0xdd, 0x77, 0xb1, + 0xa8, 0xd2, 0x34, 0x68, 0xe0, 0xd0, 0xe2, 0xb7, 0x15, 0x74, 0x01, 0x97, 0x5d, 0x49, 0x16, 0x79, + 0x26, 0x91, 0x9d, 0x98, 0x2e, 0xec, 0xb0, 0x4b, 0x8d, 0x87, 0x16, 0x3f, 0xd0, 0xcc, 0x5c, 0x18, + 0xae, 0xf5, 0x38, 0xde, 0x77, 0x02, 0xd0, 0x59, 0xa6, 0xf7, 0x60, 0xa8, 0x2d, 0xd7, 0x0b, 0x3a, + 0xe3, 0x75, 0x42, 0xc7, 0xe0, 0x36, 0xc7, 0x60, 0x03, 0xb3, 0xb8, 0x3b, 0x81, 0x88, 0xd2, 0x80, + 0x8b, 0x4f, 0x73, 0x53, 0xe6, 0x2d, 0x4c, 0x1f, 0x80, 0xa3, 0xaf, 0xf0, 0x6c, 0x65, 0x5c, 0x9d, + 0xf1, 0x26, 0xa3, 0x57, 0x70, 0x21, 0x33, 0x51, 0xc8, 0x24, 0x57, 0xcf, 0x85, 0x4a, 0x98, 0x6d, + 0xda, 0xff, 0x57, 0xa3, 0xd7, 0x00, 0x9a, 0xad, 0xdd, 0x60, 0xc9, 0x86, 0x66, 0xaa, 0xcb, 0xc0, + 0x1c, 0xf5, 0xe5, 0xbe, 0xce, 0x7b, 0x1c, 0xef, 0xef, 0x00, 0x6c, 0x3d, 0xab, 0xf7, 0x95, 0x80, + 0xdb, 0xae, 0xe8, 0xb8, 0x46, 0xf8, 0x46, 0xe0, 0xb4, 0xbd, 0xca, 0x71, 0x59, 0x9f, 0x8d, 0x7e, + 0x6c, 0x7d, 0xb2, 0xd9, 0xfa, 0xe4, 0xf7, 0xd6, 0x27, 0x5f, 0x76, 0xbe, 0xb5, 0xd9, 0xf9, 0xd6, + 0xcf, 0x9d, 0x6f, 0xbd, 0x71, 0xea, 0xd7, 0xbf, 0x74, 0xcc, 0x63, 0x9c, 0xfe, 0x0b, 0x00, 0x00, + 0xff, 0xff, 0xbf, 0x4d, 0x45, 0xd4, 0x1b, 0x04, 0x00, 0x00, } func (m *Sync) Marshal() (dAtA []byte, err error) { @@ -384,6 +535,138 @@ func (m *Sync) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SyncContent) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncContent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncContent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Messages) > 0 { + for iNdEx := len(m.Messages) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Messages[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *SyncContentValue) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncContentValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Value != nil { + { + size := m.Value.Size() + i -= size + if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *SyncContentValueValueOfHeadUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncContentValueValueOfHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.HeadUpdate != nil { + { + size, err := m.HeadUpdate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *SyncContentValueValueOfFullSyncRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncContentValueValueOfFullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.FullSyncRequest != nil { + { + size, err := m.FullSyncRequest.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *SyncContentValueValueOfFullSyncResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncContentValueValueOfFullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.FullSyncResponse != nil { + { + size, err := m.FullSyncResponse.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} func (m *SyncHeadUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -649,6 +932,69 @@ func (m *Sync) Size() (n int) { return n } +func (m *SyncContent) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Messages) > 0 { + for _, e := range m.Messages { + l = e.Size() + n += 1 + l + sovSync(uint64(l)) + } + } + return n +} + +func (m *SyncContentValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != nil { + n += m.Value.Size() + } + return n +} + +func (m *SyncContentValueValueOfHeadUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.HeadUpdate != nil { + l = m.HeadUpdate.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} +func (m *SyncContentValueValueOfFullSyncRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.FullSyncRequest != nil { + l = m.FullSyncRequest.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} +func (m *SyncContentValueValueOfFullSyncResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.FullSyncResponse != nil { + l = m.FullSyncResponse.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} func (m *SyncHeadUpdate) Size() (n int) { if m == nil { return 0 @@ -819,6 +1165,245 @@ func (m *Sync) Unmarshal(dAtA []byte) error { } return nil } +func (m *SyncContent) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Content: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Content: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Messages", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Messages = append(m.Messages, &SyncContentValue{}) + if err := m.Messages[len(m.Messages)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncContentValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContentValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContentValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HeadUpdate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SyncHeadUpdate{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &SyncContentValueValueOfHeadUpdate{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FullSyncRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SyncFullRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &SyncContentValueValueOfFullSyncRequest{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FullSyncResponse", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SyncFullResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &SyncContentValueValueOfFullSyncResponse{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 From 5f2144db0fb6f5c689c0ff9f9bf9b53caa37efa8 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 18 Jul 2022 22:27:27 +0200 Subject: [PATCH 20/40] Use account key instead of generating new --- service/sync/transport/transport.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/service/sync/transport/transport.go b/service/sync/transport/transport.go index 5b7e952a..13f77282 100644 --- a/service/sync/transport/transport.go +++ b/service/sync/transport/transport.go @@ -2,9 +2,9 @@ package transport import ( "context" - "crypto/rand" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/sec" libp2ptls "github.com/libp2p/go-libp2p/p2p/security/tls" @@ -33,12 +33,19 @@ type service struct { } func (s *service) Init(ctx context.Context, a *app.App) (err error) { - var pubKey crypto.PubKey - s.key, pubKey, err = crypto.GenerateEd25519Key(rand.Reader) + acc := a.MustComponent(account.CName).(account.Service) + rawKey, err := acc.Account().SignKey.Raw() if err != nil { - return + return err } - pubKeyRaw, _ := pubKey.Raw() + + // converting into libp2p crypto structure + s.key, err = crypto.UnmarshalEd25519PrivateKey(rawKey) + if err != nil { + return err + } + + pubKeyRaw, _ := s.key.GetPublic().Raw() log.Info("transport keys generated", zap.Binary("pubKey", pubKeyRaw)) return nil } From 269f907d1df79ef04b6ff024a6650b090257348a Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 19 Jul 2022 00:47:22 +0200 Subject: [PATCH 21/40] Add message service to handle streams --- go.mod | 1 + service/sync/drpcserver/drpcserver.go | 72 ++++++++++++++++++++------- service/sync/message/service.go | 53 ++++++++++++++++++++ 3 files changed, 107 insertions(+), 19 deletions(-) create mode 100644 service/sync/message/service.go diff --git a/go.mod b/go.mod index 91d42059..715f5f35 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multihash v0.1.0 github.com/stretchr/testify v1.7.0 + github.com/cheggaaa/mb v1.0.3 go.uber.org/zap v1.21.0 gopkg.in/yaml.v3 v3.0.1 storj.io/drpc v0.0.32 diff --git a/service/sync/drpcserver/drpcserver.go b/service/sync/drpcserver/drpcserver.go index e3fe7bee..c341e326 100644 --- a/service/sync/drpcserver/drpcserver.go +++ b/service/sync/drpcserver/drpcserver.go @@ -5,8 +5,9 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/transport" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" "github.com/gogo/protobuf/proto" "go.uber.org/zap" "io" @@ -14,6 +15,7 @@ import ( "storj.io/drpc" "storj.io/drpc/drpcserver" "strings" + "sync" "time" ) @@ -27,19 +29,25 @@ func New() DRPCServer { type DRPCServer interface { app.ComponentRunnable + + SendMessage(peerId string, msg *syncpb.SyncContent) + BroadcastMessage(msg *syncpb.SyncContent) } type drpcServer struct { - config config.GrpcServer - drpcServer *drpcserver.Server - transport transport.Service - listeners []transport.ContextListener - cancel func() + config config.GrpcServer + drpcServer *drpcserver.Server + transport transport.Service + listeners []transport.ContextListener + messageService message.Service + + cancel func() } func (s *drpcServer) Init(ctx context.Context, a *app.App) (err error) { s.config = a.MustComponent(config.CName).(*config.Config).GrpcServer s.transport = a.MustComponent(transport.CName).(transport.Service) + s.messageService = a.MustComponent(message.CName).(message.Service) return nil } @@ -114,23 +122,22 @@ func (s *drpcServer) HandleRPC(stream drpc.Stream, rpc string) (err error) { if err != nil { return } - l := log.With(zap.String("peer", sc.RemotePeer().String())) + peerId := sc.RemotePeer().String() + l := log.With(zap.String("peer", peerId)) l.Info("stream opened") defer func() { l.Info("stream closed", zap.Error(err)) }() - for { - msg := &syncproto.SyncMessage{} - if err = stream.MsgRecv(msg, enc{}); err != nil { - if err == io.EOF { - return - } - } - //log.Debug("receive msg", zap.Int("seq", int(msg.Seq))) - if err = stream.MsgSend(msg, enc{}); err != nil { - return - } - } + + ch := s.messageService.RegisterMessageSender(peerId) + defer s.messageService.UnregisterMessageSender(peerId) + + wg := &sync.WaitGroup{} + wg.Add(2) + go s.sendMessages(stream, wg, ch) + go s.receiveMessages(stream, wg, peerId) + wg.Wait() + return nil } @@ -146,6 +153,33 @@ func (s *drpcServer) Close(ctx context.Context) (err error) { return } +func (s *drpcServer) sendMessages(stream drpc.Stream, wg *sync.WaitGroup, ch chan *syncpb.SyncContent) { + defer wg.Done() + for { + select { + case msg := <-ch: + if err := stream.MsgSend(msg, enc{}); err != nil { + return + } + case <-stream.Context().Done(): + return + } + } +} + +func (s *drpcServer) receiveMessages(stream drpc.Stream, wg *sync.WaitGroup, peerId string) { + defer wg.Done() + for { + msg := &syncpb.SyncContent{} + if err := stream.MsgRecv(msg, enc{}); err != nil { + if err == io.EOF { + return + } + } + s.messageService.HandleMessage(peerId, msg) + } +} + type enc struct{} func (e enc) Marshal(msg drpc.Message) ([]byte, error) { diff --git a/service/sync/message/service.go b/service/sync/message/service.go new file mode 100644 index 00000000..5ebc706d --- /dev/null +++ b/service/sync/message/service.go @@ -0,0 +1,53 @@ +package message + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" +) + +const CName = "Service" + +type service struct { +} + +func NewMessageService() app.Component { + return &service{} +} + +type Service interface { + RegisterMessageSender(peerId string) chan *syncpb.SyncContent + UnregisterMessageSender(peerId string) + HandleMessage(peerId string, msg *syncpb.SyncContent) +} + +func (c *service) Init(ctx context.Context, a *app.App) (err error) { + return nil +} + +func (c *service) Name() (name string) { + return CName +} + +func (c *service) Run(ctx context.Context) (err error) { + return nil +} + +func (c *service) Close(ctx context.Context) (err error) { + return nil +} + +func (c *service) RegisterMessageSender(peerId string) chan *syncpb.SyncContent { + //TODO implement me + panic("implement me") +} + +func (c *service) UnregisterMessageSender(peerId string) chan *syncpb.SyncContent { + //TODO implement me + panic("implement me") +} + +func (c *service) HandleMessage(peerId string, msg *syncpb.SyncContent) { + //TODO implement me + panic("implement me") +} From 16b3787258aefc067459abe0722f73f37ad7f71c Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 19 Jul 2022 01:43:21 +0200 Subject: [PATCH 22/40] WIP stream logic --- service/sync/message/service.go | 116 +++++++++++++++--- service/sync/requesthandler/requesthandler.go | 17 ++- service/sync/syncpb/protos/sync.proto | 2 +- service/sync/syncpb/sync.pb.go | 98 ++++++++------- 4 files changed, 165 insertions(+), 68 deletions(-) diff --git a/service/sync/message/service.go b/service/sync/message/service.go index 5ebc706d..92ee6310 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -3,12 +3,29 @@ package message import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" + "github.com/cheggaaa/mb" + "go.uber.org/zap" + "sync" ) -const CName = "Service" +var log = logger.NewNamed("messageservice") + +const CName = "MessageService" type service struct { + receiveBatcher *mb.MB + sendBatcher *mb.MB + senderChannels map[string]chan *syncpb.SyncContent + requestHandler requesthandler.RequestHandler + sync.RWMutex +} + +type message struct { + peerId string + content *syncpb.SyncContent } func NewMessageService() app.Component { @@ -19,35 +36,106 @@ type Service interface { RegisterMessageSender(peerId string) chan *syncpb.SyncContent UnregisterMessageSender(peerId string) HandleMessage(peerId string, msg *syncpb.SyncContent) + SendMessage(peerId string, msg *syncpb.SyncContent) } -func (c *service) Init(ctx context.Context, a *app.App) (err error) { +func (s *service) Init(ctx context.Context, a *app.App) (err error) { + s.receiveBatcher = mb.New(0) + s.sendBatcher = mb.New(0) + s.senderChannels = make(map[string]chan *syncpb.SyncContent) + s.requestHandler = a.MustComponent(requesthandler.CName).(requesthandler.RequestHandler) return nil } -func (c *service) Name() (name string) { +func (s *service) Name() (name string) { return CName } -func (c *service) Run(ctx context.Context) (err error) { +func (s *service) Run(ctx context.Context) (err error) { + go s.runSender(ctx) + go s.runReceiver(ctx) return nil } -func (c *service) Close(ctx context.Context) (err error) { +func (s *service) Close(ctx context.Context) (err error) { return nil } -func (c *service) RegisterMessageSender(peerId string) chan *syncpb.SyncContent { - //TODO implement me - panic("implement me") +func (s *service) RegisterMessageSender(peerId string) chan *syncpb.SyncContent { + s.Lock() + defer s.Unlock() + if ch, exists := s.senderChannels[peerId]; !exists { + return ch + } + ch := make(chan *syncpb.SyncContent) + s.senderChannels[peerId] = ch + return ch } -func (c *service) UnregisterMessageSender(peerId string) chan *syncpb.SyncContent { - //TODO implement me - panic("implement me") +func (s *service) UnregisterMessageSender(peerId string) { + s.Lock() + defer s.Unlock() + if _, exists := s.senderChannels[peerId]; !exists { + return + } + close(s.senderChannels[peerId]) + delete(s.senderChannels, peerId) } -func (c *service) HandleMessage(peerId string, msg *syncpb.SyncContent) { - //TODO implement me - panic("implement me") +func (s *service) HandleMessage(peerId string, msg *syncpb.SyncContent) { + _ = s.receiveBatcher.Add(&message{ + peerId: peerId, + content: msg, + }) +} + +func (s *service) SendMessage(peerId string, msg *syncpb.SyncContent) { + _ = s.sendBatcher.Add(&message{ + peerId: peerId, + content: msg, + }) +} + +func (s *service) runReceiver(ctx context.Context) { + for { + select { + case <-ctx.Done(): + return + default: + break + } + msgs := s.receiveBatcher.WaitMinMax(1, 100) + // TODO: this is bad to serve everything on a new goroutine, but very easy for prototyping :-) + for _, msg := range msgs { + typedMsg := msg.(*message) + go func(typedMsg *message) { + err := s.requestHandler.HandleFullSyncContent(ctx, typedMsg.peerId, typedMsg.content) + if err != nil { + log.Error("failed to handle content", zap.Error(err)) + } + }(typedMsg) + } + } +} + +func (s *service) runSender(ctx context.Context) { + for { + select { + case <-ctx.Done(): + return + default: + break + } + msgs := s.sendBatcher.WaitMinMax(1, 100) + s.RLock() + for _, msg := range msgs { + typedMsg := msg.(*message) + ch, exists := s.senderChannels[typedMsg.peerId] + if !exists { + continue + } + ch <- typedMsg.content + } + s.RUnlock() + } } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 7bdaf488..36f7bf8b 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -25,9 +25,7 @@ func NewRequestHandler() app.Component { } type RequestHandler interface { - HandleHeadUpdate(ctx context.Context, senderId string, update *syncpb.SyncHeadUpdate) (err error) - HandleFullSyncRequest(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) (err error) - HandleFullSyncResponse(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) (err error) + HandleFullSyncContent(ctx context.Context, senderId string, request *syncpb.SyncContent) (err error) } const CName = "SyncRequestHandler" @@ -51,6 +49,19 @@ func (r *requestHandler) Close(ctx context.Context) (err error) { return nil } +func (r *requestHandler) HandleFullSyncContent(ctx context.Context, senderId string, content *syncpb.SyncContent) error { + msg := content.GetMessage() + switch { + case msg.GetFullSyncRequest() != nil: + return r.HandleFullSyncRequest(ctx, senderId, msg.GetFullSyncRequest()) + case msg.GetFullSyncResponse() != nil: + return r.HandleFullSyncResponse(ctx, senderId, msg.GetFullSyncResponse()) + case msg.GetHeadUpdate() != nil: + return r.HandleHeadUpdate(ctx, senderId, msg.GetHeadUpdate()) + } + return nil +} + func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, update *syncpb.SyncHeadUpdate) (err error) { var ( fullRequest *syncpb.SyncFullRequest diff --git a/service/sync/syncpb/protos/sync.proto b/service/sync/syncpb/protos/sync.proto index 4c76a33e..b27414da 100644 --- a/service/sync/syncpb/protos/sync.proto +++ b/service/sync/syncpb/protos/sync.proto @@ -7,7 +7,7 @@ import "pkg/acl/treestorage/treepb/protos/tree.proto"; message Sync { message Content { - repeated ContentValue messages = 1; + ContentValue message = 1; } message ContentValue { diff --git a/service/sync/syncpb/sync.pb.go b/service/sync/syncpb/sync.pb.go index dd24731e..700eac42 100644 --- a/service/sync/syncpb/sync.pb.go +++ b/service/sync/syncpb/sync.pb.go @@ -61,7 +61,7 @@ func (m *Sync) XXX_DiscardUnknown() { var xxx_messageInfo_Sync proto.InternalMessageInfo type SyncContent struct { - Messages []*SyncContentValue `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"` + Message *SyncContentValue `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` } func (m *SyncContent) Reset() { *m = SyncContent{} } @@ -97,9 +97,9 @@ func (m *SyncContent) XXX_DiscardUnknown() { var xxx_messageInfo_SyncContent proto.InternalMessageInfo -func (m *SyncContent) GetMessages() []*SyncContentValue { +func (m *SyncContent) GetMessage() *SyncContentValue { if m != nil { - return m.Messages + return m.Message } return nil } @@ -482,34 +482,34 @@ func init() { } var fileDescriptor_5f66cdd599c6466f = []byte{ - // 426 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x53, 0xbd, 0x8e, 0xd3, 0x40, - 0x10, 0xf6, 0xe6, 0x1c, 0xfb, 0x6e, 0xee, 0x04, 0xa7, 0x15, 0x3f, 0x2b, 0x17, 0x56, 0x74, 0x12, - 0x52, 0x0a, 0xe4, 0x9c, 0x2e, 0x05, 0x1d, 0x45, 0x22, 0x45, 0xa6, 0x43, 0xcb, 0x4f, 0x41, 0xb7, - 0x71, 0x06, 0x1b, 0x61, 0x6c, 0xe3, 0x5d, 0x07, 0xf1, 0x16, 0xbc, 0x0d, 0x88, 0x27, 0xa0, 0x4c, - 0x49, 0x83, 0x04, 0xc9, 0x63, 0xd0, 0xa0, 0x5d, 0xdb, 0xb1, 0xb9, 0x3c, 0x41, 0x8a, 0x44, 0x33, - 0xf3, 0x7d, 0xdf, 0xf8, 0x9b, 0x19, 0x2d, 0x3c, 0x92, 0x58, 0xae, 0xdf, 0x45, 0x38, 0x91, 0x9f, - 0xb3, 0xc8, 0xfc, 0x15, 0xcb, 0x49, 0x51, 0xe6, 0x2a, 0x97, 0x26, 0x0b, 0x4c, 0x4c, 0x6d, 0x1d, - 0x7b, 0xd7, 0xc5, 0xfb, 0x78, 0x22, 0xa2, 0x54, 0xff, 0xa2, 0x44, 0x64, 0x31, 0x4a, 0x1d, 0x76, - 0x8a, 0xae, 0x5e, 0xeb, 0xbc, 0xc7, 0xad, 0x42, 0x95, 0x88, 0x52, 0xe5, 0xa5, 0x88, 0xd1, 0xc4, - 0x9d, 0x46, 0x67, 0x35, 0xfb, 0xea, 0x8f, 0x03, 0xf6, 0x0b, 0xfd, 0xa1, 0xa7, 0xe0, 0xce, 0xf3, - 0x4c, 0x61, 0xa6, 0xe8, 0x14, 0x4e, 0x3f, 0xa0, 0x94, 0x22, 0x46, 0xc9, 0xc8, 0xe8, 0x64, 0x7c, - 0x7e, 0xf3, 0x30, 0x30, 0xc6, 0x34, 0x31, 0x68, 0x58, 0xaf, 0x45, 0x5a, 0x21, 0xdf, 0x13, 0xbd, - 0x5f, 0x04, 0x2e, 0xfa, 0x10, 0x7d, 0x02, 0x90, 0xa0, 0x58, 0xbd, 0x2a, 0x56, 0x42, 0x21, 0x23, - 0x23, 0x32, 0x3e, 0xbf, 0xb9, 0xdf, 0xeb, 0x13, 0xee, 0xc1, 0xd0, 0xe2, 0x3d, 0x2a, 0x9d, 0xc3, - 0xdd, 0xb7, 0x55, 0x9a, 0x6a, 0x12, 0xc7, 0x8f, 0x15, 0x4a, 0xc5, 0x06, 0x46, 0xdd, 0x77, 0xb1, - 0xa8, 0xd2, 0x34, 0x68, 0xe0, 0xd0, 0xe2, 0xb7, 0x15, 0x74, 0x01, 0x97, 0x5d, 0x49, 0x16, 0x79, - 0x26, 0x91, 0x9d, 0x98, 0x2e, 0xec, 0xb0, 0x4b, 0x8d, 0x87, 0x16, 0x3f, 0xd0, 0xcc, 0x5c, 0x18, - 0xae, 0xf5, 0x38, 0xde, 0x77, 0x02, 0xd0, 0x59, 0xa6, 0xf7, 0x60, 0xa8, 0x2d, 0xd7, 0x0b, 0x3a, - 0xe3, 0x75, 0x42, 0xc7, 0xe0, 0x36, 0xc7, 0x60, 0x03, 0xb3, 0xb8, 0x3b, 0x81, 0x88, 0xd2, 0x80, - 0x8b, 0x4f, 0x73, 0x53, 0xe6, 0x2d, 0x4c, 0x1f, 0x80, 0xa3, 0xaf, 0xf0, 0x6c, 0x65, 0x5c, 0x9d, - 0xf1, 0x26, 0xa3, 0x57, 0x70, 0x21, 0x33, 0x51, 0xc8, 0x24, 0x57, 0xcf, 0x85, 0x4a, 0x98, 0x6d, - 0xda, 0xff, 0x57, 0xa3, 0xd7, 0x00, 0x9a, 0xad, 0xdd, 0x60, 0xc9, 0x86, 0x66, 0xaa, 0xcb, 0xc0, - 0x1c, 0xf5, 0xe5, 0xbe, 0xce, 0x7b, 0x1c, 0xef, 0xef, 0x00, 0x6c, 0x3d, 0xab, 0xf7, 0x95, 0x80, - 0xdb, 0xae, 0xe8, 0xb8, 0x46, 0xf8, 0x46, 0xe0, 0xb4, 0xbd, 0xca, 0x71, 0x59, 0x9f, 0x8d, 0x7e, - 0x6c, 0x7d, 0xb2, 0xd9, 0xfa, 0xe4, 0xf7, 0xd6, 0x27, 0x5f, 0x76, 0xbe, 0xb5, 0xd9, 0xf9, 0xd6, - 0xcf, 0x9d, 0x6f, 0xbd, 0x71, 0xea, 0xd7, 0xbf, 0x74, 0xcc, 0x63, 0x9c, 0xfe, 0x0b, 0x00, 0x00, - 0xff, 0xff, 0xbf, 0x4d, 0x45, 0xd4, 0x1b, 0x04, 0x00, 0x00, + // 421 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x53, 0xcd, 0xce, 0x93, 0x40, + 0x14, 0x65, 0x5a, 0x0a, 0x7e, 0xf7, 0x6b, 0xb4, 0x99, 0xf8, 0x33, 0x61, 0x41, 0x48, 0x13, 0x13, + 0x16, 0x86, 0xd6, 0xba, 0x70, 0xe3, 0xaa, 0x4d, 0x1a, 0xdc, 0x99, 0xf1, 0x67, 0xe1, 0x6e, 0x4a, + 0x47, 0x30, 0x22, 0x20, 0x33, 0xd4, 0xf8, 0x16, 0xbe, 0x8d, 0xc6, 0x27, 0x70, 0xd9, 0xa5, 0x1b, + 0xa3, 0x69, 0x1f, 0xc3, 0x8d, 0x99, 0x01, 0x0a, 0xda, 0x27, 0xe8, 0x02, 0x72, 0x7f, 0xce, 0x39, + 0x9c, 0xcb, 0xcd, 0x85, 0xfb, 0x82, 0x97, 0xbb, 0xb7, 0x11, 0x9f, 0x89, 0x4f, 0x59, 0xa4, 0x5f, + 0xc5, 0x66, 0x56, 0x94, 0xb9, 0xcc, 0x85, 0xce, 0x02, 0x1d, 0x63, 0x53, 0xc5, 0xce, 0xbc, 0x78, + 0x17, 0xcf, 0x58, 0x94, 0xaa, 0x27, 0x4a, 0x58, 0x16, 0x73, 0xa1, 0xc2, 0x8e, 0xd1, 0xd5, 0x6b, + 0x9e, 0xf3, 0xa0, 0x65, 0xc8, 0x92, 0x73, 0x21, 0xf3, 0x92, 0xc5, 0x5c, 0xc7, 0x1d, 0x47, 0x65, + 0x35, 0x7a, 0xfa, 0xcb, 0x02, 0xf3, 0xb9, 0xfa, 0xd0, 0x13, 0xb0, 0x57, 0x79, 0x26, 0x79, 0x26, + 0xf1, 0x43, 0xb0, 0xdf, 0x73, 0x21, 0x58, 0xcc, 0x09, 0xf2, 0x90, 0x7f, 0xbd, 0xb8, 0x17, 0x68, + 0x5f, 0x0a, 0x17, 0x34, 0xa0, 0x57, 0x2c, 0xad, 0x38, 0x6d, 0x71, 0xce, 0x4f, 0x04, 0xe3, 0x7e, + 0x07, 0x3f, 0x06, 0x48, 0x38, 0xdb, 0xbe, 0x2c, 0xb6, 0x4c, 0xb6, 0x32, 0x77, 0x7a, 0x32, 0xe1, + 0xa9, 0x19, 0x1a, 0xb4, 0x07, 0xc5, 0x2b, 0xb8, 0xf5, 0xa6, 0x4a, 0x53, 0x05, 0xa2, 0xfc, 0x43, + 0xc5, 0x85, 0x24, 0x83, 0x33, 0x13, 0xeb, 0x2a, 0x4d, 0x83, 0xa6, 0x1d, 0x1a, 0xf4, 0x7f, 0x06, + 0x5e, 0xc3, 0xa4, 0x2b, 0x89, 0x22, 0xcf, 0x04, 0x27, 0x43, 0xad, 0x42, 0xce, 0x55, 0xea, 0x7e, + 0x68, 0xd0, 0x33, 0xce, 0xd2, 0x86, 0xd1, 0x4e, 0x8d, 0xe3, 0x7c, 0x43, 0x00, 0x9d, 0x65, 0x7c, + 0x1b, 0x46, 0xca, 0xb2, 0x20, 0xc8, 0x1b, 0xfa, 0x57, 0xb4, 0x4e, 0xb0, 0x0f, 0x76, 0xb3, 0x0a, + 0x32, 0xf0, 0x86, 0xfe, 0xf5, 0xe2, 0x66, 0xc0, 0xa2, 0x34, 0xa0, 0xec, 0xe3, 0x4a, 0x97, 0x69, + 0xdb, 0xc6, 0x77, 0xc1, 0x52, 0x3b, 0x78, 0xba, 0xd5, 0xae, 0xae, 0x68, 0x93, 0xe1, 0x29, 0x8c, + 0x45, 0xc6, 0x0a, 0x91, 0xe4, 0xf2, 0x19, 0x93, 0x09, 0x31, 0xb5, 0xfc, 0x3f, 0x35, 0x3c, 0x07, + 0x50, 0x68, 0xe5, 0x86, 0x97, 0x64, 0xa4, 0xa7, 0x9a, 0x04, 0x7a, 0xa5, 0x2f, 0x4e, 0x75, 0xda, + 0xc3, 0x38, 0x7f, 0x06, 0x60, 0xaa, 0x59, 0x9d, 0x2f, 0x08, 0xec, 0xf6, 0x17, 0x5d, 0xd6, 0x08, + 0x5f, 0x11, 0xdc, 0x68, 0xb7, 0x72, 0x59, 0xd6, 0x97, 0xde, 0xf7, 0x83, 0x8b, 0xf6, 0x07, 0x17, + 0xfd, 0x3e, 0xb8, 0xe8, 0xf3, 0xd1, 0x35, 0xf6, 0x47, 0xd7, 0xf8, 0x71, 0x74, 0x8d, 0xd7, 0x56, + 0x7d, 0xfb, 0x1b, 0x4b, 0x9f, 0xe2, 0xa3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x3c, 0xed, 0x7d, + 0xff, 0x19, 0x04, 0x00, 0x00, } func (m *Sync) Marshal() (dAtA []byte, err error) { @@ -555,19 +555,17 @@ func (m *SyncContent) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Messages) > 0 { - for iNdEx := len(m.Messages) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Messages[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) + if m.Message != nil { + { + size, err := m.Message.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -938,11 +936,9 @@ func (m *SyncContent) Size() (n int) { } var l int _ = l - if len(m.Messages) > 0 { - for _, e := range m.Messages { - l = e.Size() - n += 1 + l + sovSync(uint64(l)) - } + if m.Message != nil { + l = m.Message.Size() + n += 1 + l + sovSync(uint64(l)) } return n } @@ -1196,7 +1192,7 @@ func (m *SyncContent) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Messages", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1223,8 +1219,10 @@ func (m *SyncContent) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Messages = append(m.Messages, &SyncContentValue{}) - if err := m.Messages[len(m.Messages)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Message == nil { + m.Message = &SyncContentValue{} + } + if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex From 3463b8d3744ccbd980c6f73f7d5024627f69dc60 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 19 Jul 2022 10:40:31 +0200 Subject: [PATCH 23/40] WIP sync logic prototype with server --- service/sync/client/client.go | 56 ------------------- service/sync/drpcserver/drpcserver.go | 8 +-- service/sync/message/service.go | 34 +++++++---- service/sync/requesthandler/requesthandler.go | 38 +++++++++---- 4 files changed, 54 insertions(+), 82 deletions(-) delete mode 100644 service/sync/client/client.go diff --git a/service/sync/client/client.go b/service/sync/client/client.go deleted file mode 100644 index 8cc292de..00000000 --- a/service/sync/client/client.go +++ /dev/null @@ -1,56 +0,0 @@ -package client - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" -) - -const CName = "SyncClient" - -type client struct { - handler requesthandler.RequestHandler -} - -func NewClient() app.Component { - return &client{} -} - -type Client interface { - NotifyHeadsChanged(update *syncpb.SyncHeadUpdate) error - RequestFullSync(id string, request *syncpb.SyncFullRequest) error - SendFullSyncResponse(id string, response *syncpb.SyncFullResponse) error -} - -func (c *client) Init(ctx context.Context, a *app.App) (err error) { - c.handler = a.MustComponent(requesthandler.CName).(requesthandler.RequestHandler) - return nil -} - -func (c *client) Name() (name string) { - return CName -} - -func (c *client) Run(ctx context.Context) (err error) { - return nil -} - -func (c *client) Close(ctx context.Context) (err error) { - return nil -} - -func (c *client) NotifyHeadsChanged(update *syncpb.SyncHeadUpdate) error { - //TODO implement me - panic("implement me") -} - -func (c *client) RequestFullSync(id string, request *syncpb.SyncFullRequest) error { - //TODO implement me - panic("implement me") -} - -func (c *client) SendFullSyncResponse(id string, response *syncpb.SyncFullResponse) error { - //TODO implement me - panic("implement me") -} diff --git a/service/sync/drpcserver/drpcserver.go b/service/sync/drpcserver/drpcserver.go index c341e326..90613d1a 100644 --- a/service/sync/drpcserver/drpcserver.go +++ b/service/sync/drpcserver/drpcserver.go @@ -29,9 +29,6 @@ func New() DRPCServer { type DRPCServer interface { app.ComponentRunnable - - SendMessage(peerId string, msg *syncpb.SyncContent) - BroadcastMessage(msg *syncpb.SyncContent) } type drpcServer struct { @@ -176,7 +173,10 @@ func (s *drpcServer) receiveMessages(stream drpc.Stream, wg *sync.WaitGroup, pee return } } - s.messageService.HandleMessage(peerId, msg) + err := s.messageService.HandleMessage(peerId, msg) + if err != nil { + log.Error("error handling message", zap.Error(err)) + } } } diff --git a/service/sync/message/service.go b/service/sync/message/service.go index 92ee6310..e6670c63 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -35,8 +35,8 @@ func NewMessageService() app.Component { type Service interface { RegisterMessageSender(peerId string) chan *syncpb.SyncContent UnregisterMessageSender(peerId string) - HandleMessage(peerId string, msg *syncpb.SyncContent) - SendMessage(peerId string, msg *syncpb.SyncContent) + HandleMessage(peerId string, msg *syncpb.SyncContent) error + SendMessage(peerId string, msg *syncpb.SyncContent) error } func (s *service) Init(ctx context.Context, a *app.App) (err error) { @@ -82,15 +82,15 @@ func (s *service) UnregisterMessageSender(peerId string) { delete(s.senderChannels, peerId) } -func (s *service) HandleMessage(peerId string, msg *syncpb.SyncContent) { - _ = s.receiveBatcher.Add(&message{ +func (s *service) HandleMessage(peerId string, msg *syncpb.SyncContent) error { + return s.receiveBatcher.Add(&message{ peerId: peerId, content: msg, }) } -func (s *service) SendMessage(peerId string, msg *syncpb.SyncContent) { - _ = s.sendBatcher.Add(&message{ +func (s *service) SendMessage(peerId string, msg *syncpb.SyncContent) error { + return s.sendBatcher.Add(&message{ peerId: peerId, content: msg, }) @@ -129,13 +129,23 @@ func (s *service) runSender(ctx context.Context) { msgs := s.sendBatcher.WaitMinMax(1, 100) s.RLock() for _, msg := range msgs { - typedMsg := msg.(*message) - ch, exists := s.senderChannels[typedMsg.peerId] - if !exists { - continue - } - ch <- typedMsg.content + s.sendMessage(msg.(*message)) } s.RUnlock() } } + +func (s *service) sendMessage(typedMsg *message) { + // this should be done under lock + if typedMsg.content.GetMessage().GetHeadUpdate() != nil { + for _, ch := range s.senderChannels { + ch <- typedMsg.content + } + return + } + ch, exists := s.senderChannels[typedMsg.peerId] + if !exists { + return + } + ch <- typedMsg.content +} diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 36f7bf8b..f9d854a5 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -8,16 +8,16 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/client" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" ) type requestHandler struct { - treeCache treecache.Service - client client.Client - account account.Service + treeCache treecache.Service + account account.Service + messageService message.Service } func NewRequestHandler() app.Component { @@ -32,8 +32,8 @@ const CName = "SyncRequestHandler" func (r *requestHandler) Init(ctx context.Context, a *app.App) (err error) { r.treeCache = a.MustComponent(treecache.CName).(treecache.Service) - r.client = a.MustComponent(client.CName).(client.Client) r.account = a.MustComponent(account.CName).(account.Service) + r.messageService = a.MustComponent(message.CName).(message.Service) return nil } @@ -95,7 +95,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, } // if we have incompatible heads, or we haven't seen the tree at all if fullRequest != nil { - return r.client.RequestFullSync(senderId, fullRequest) + return r.messageService.SendMessage(senderId, wrapFullRequest(fullRequest)) } // if error or nothing has changed if err != nil || len(result.Added) == 0 { @@ -109,7 +109,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, TreeId: update.TreeId, TreeHeader: update.TreeHeader, } - return r.client.NotifyHeadsChanged(newUpdate) + return r.messageService.SendMessage("", wrapHeadUpdate(newUpdate)) } func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) (err error) { @@ -138,7 +138,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str if err != nil { return err } - err = r.client.SendFullSyncResponse(senderId, fullResponse) + err = r.messageService.SendMessage(senderId, wrapFullResponse(fullResponse)) // if error or nothing has changed if err != nil || len(result.Added) == 0 { return err @@ -152,7 +152,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str TreeId: request.TreeId, TreeHeader: request.TreeHeader, } - return r.client.NotifyHeadsChanged(newUpdate) + return r.messageService.SendMessage("", wrapHeadUpdate(newUpdate)) } func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, response *syncpb.SyncFullResponse) (err error) { @@ -188,7 +188,7 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st SnapshotPath: snapshotPath, TreeId: response.TreeId, } - return r.client.NotifyHeadsChanged(newUpdate) + return r.messageService.SendMessage("", wrapHeadUpdate(newUpdate)) } func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) { @@ -240,3 +240,21 @@ func (r *requestHandler) prepareFullSyncResponse( func (r *requestHandler) createTree(ctx context.Context, response *syncpb.SyncFullResponse) error { return r.treeCache.Add(ctx, response.TreeId, response.TreeHeader, response.Changes) } + +func wrapHeadUpdate(update *syncpb.SyncHeadUpdate) *syncpb.SyncContent { + return &syncpb.SyncContent{Message: &syncpb.SyncContentValue{ + Value: &syncpb.SyncContentValueValueOfHeadUpdate{HeadUpdate: update}, + }} +} + +func wrapFullRequest(request *syncpb.SyncFullRequest) *syncpb.SyncContent { + return &syncpb.SyncContent{Message: &syncpb.SyncContentValue{ + Value: &syncpb.SyncContentValueValueOfFullSyncRequest{FullSyncRequest: request}, + }} +} + +func wrapFullResponse(response *syncpb.SyncFullResponse) *syncpb.SyncContent { + return &syncpb.SyncContent{Message: &syncpb.SyncContentValue{ + Value: &syncpb.SyncContentValueValueOfFullSyncResponse{FullSyncResponse: response}, + }} +} From 9aaa80dcc17495cccc7f6b8673fb61502df7ee46 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 21 Jul 2022 11:03:39 +0200 Subject: [PATCH 24/40] Update tree cache for document creation --- pkg/acl/acltree/acltree.go | 2 +- service/sync/document/service.go | 1 + service/sync/message/service.go | 1 + service/sync/requesthandler/requesthandler.go | 9 +++++- service/treecache/service.go | 31 ++++++++++++++----- 5 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 service/sync/document/service.go diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index 4b091433..078feb92 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -279,7 +279,7 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha var err error var mode Mode - var changes []*Change + var changes []*Change // TODO: = addChangesBuf[:0] ... for _, ch := range rawChanges { change, err := NewFromRawChange(ch) // TODO: think what if we will have incorrect signatures on rawChanges, how everything will work diff --git a/service/sync/document/service.go b/service/sync/document/service.go new file mode 100644 index 00000000..075db778 --- /dev/null +++ b/service/sync/document/service.go @@ -0,0 +1 @@ +package document diff --git a/service/sync/message/service.go b/service/sync/message/service.go index e6670c63..7a51ce23 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -35,6 +35,7 @@ func NewMessageService() app.Component { type Service interface { RegisterMessageSender(peerId string) chan *syncpb.SyncContent UnregisterMessageSender(peerId string) + HandleMessage(peerId string, msg *syncpb.SyncContent) error SendMessage(peerId string, msg *syncpb.SyncContent) error } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index f9d854a5..ba30a39c 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -238,7 +238,14 @@ func (r *requestHandler) prepareFullSyncResponse( } func (r *requestHandler) createTree(ctx context.Context, response *syncpb.SyncFullResponse) error { - return r.treeCache.Add(ctx, response.TreeId, response.TreeHeader, response.Changes) + return r.treeCache.Add( + ctx, + response.TreeId, + response.TreeHeader, + response.Changes, + func(tree acltree.ACLTree) error { + return nil + }) } func wrapHeadUpdate(update *syncpb.SyncHeadUpdate) *syncpb.SyncContent { diff --git a/service/treecache/service.go b/service/treecache/service.go index 82460917..d832e40c 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -13,9 +13,13 @@ import ( const CName = "treecache" +type ACLTreeFunc = func(tree acltree.ACLTree) error +type ChangeBuildFunc = func(builder acltree.ChangeBuilder) error + type Service interface { - Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree) error) error - Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) error + Do(ctx context.Context, treeId string, f ACLTreeFunc) error + Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error + Create(ctx context.Context, build ChangeBuildFunc, f ACLTreeFunc) error } type service struct { @@ -28,7 +32,22 @@ func NewTreeCache() app.ComponentRunnable { return &service{} } -func (s *service) Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree) error) error { +func (s *service) Create(ctx context.Context, build ChangeBuildFunc, f ACLTreeFunc) error { + acc := s.account.Account() + st, err := acltree.CreateNewTreeStorageWithACL(acc, build, s.treeProvider.CreateTreeStorage) + if err != nil { + return err + } + + id, err := st.TreeID() + if err != nil { + return err + } + + return s.Do(ctx, id, f) +} + +func (s *service) Do(ctx context.Context, treeId string, f ACLTreeFunc) error { tree, err := s.cache.Get(ctx, treeId) defer s.cache.Release(treeId) if err != nil { @@ -40,14 +59,12 @@ func (s *service) Do(ctx context.Context, treeId string, f func(tree acltree.ACL return f(tree.(acltree.ACLTree)) } -func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) error { +func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error { _, err := s.treeProvider.CreateTreeStorage(treeId, header, changes) if err != nil { return err } - // forcing the tree to build - _, err = s.cache.Get(ctx, treeId) - return err + return s.Do(ctx, treeId, f) } func (s *service) Init(ctx context.Context, a *app.App) (err error) { From f5ec49b3756322f4c7a8177e79975b88fc911f07 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 21 Jul 2022 11:54:19 +0200 Subject: [PATCH 25/40] Add document service --- pkg/acl/acltree/acltree.go | 18 +- pkg/acl/acltree/change.go | 1 - service/sync/document/service.go | 155 ++++++++++++++++++ service/sync/requesthandler/requesthandler.go | 28 +--- service/sync/syncpb/helpers.go | 19 +++ 5 files changed, 191 insertions(+), 30 deletions(-) create mode 100644 service/sync/syncpb/helpers.go diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index 078feb92..0cfcac3f 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -50,7 +50,7 @@ type ACLTree interface { ID() string Header() *treepb.TreeHeader ACLState() *ACLState - AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*Change, error) + AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*aclpb.RawChange, error) AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) Heads() []string Root() *Change @@ -59,6 +59,7 @@ type ACLTree interface { HasChange(string) bool SnapshotPath() []string ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) + Storage() treestorage.TreeStorage Close() error } @@ -239,7 +240,11 @@ func (a *aclTree) ACLState() *ACLState { return a.aclState } -func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuilder) error) (*Change, error) { +func (a *aclTree) Storage() treestorage.TreeStorage { + return a.treeStorage +} + +func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuilder) error) (*aclpb.RawChange, error) { // TODO: add snapshot creation logic defer func() { // TODO: should this be called in a separate goroutine to prevent accidental cycles (tree->updater->tree) @@ -257,12 +262,13 @@ func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuild return nil, err } a.fullTree.AddFast(ch) - - err = a.treeStorage.AddRawChange(&aclpb.RawChange{ + rawCh := &aclpb.RawChange{ Payload: marshalled, Signature: ch.Signature(), Id: ch.Id, - }) + } + + err = a.treeStorage.AddRawChange(rawCh) if err != nil { return nil, err } @@ -271,7 +277,7 @@ func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuild if err != nil { return nil, err } - return ch, nil + return rawCh, nil } func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (AddResult, error) { diff --git a/pkg/acl/acltree/change.go b/pkg/acl/acltree/change.go index 67eedf00..c768ef23 100644 --- a/pkg/acl/acltree/change.go +++ b/pkg/acl/acltree/change.go @@ -23,7 +23,6 @@ type Change struct { SnapshotId string IsSnapshot bool DecryptedDocumentChange []byte - Raw *aclpb.RawChange // this will not be present on all changes, we only need it sometimes Content *aclpb.ACLChange Sign []byte diff --git a/service/sync/document/service.go b/service/sync/document/service.go index 075db778..7b8e8f08 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -1 +1,156 @@ package document + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" + "github.com/gogo/protobuf/proto" +) + +var CName = "DocumentService" + +type service struct { + messageService message.Service + treeCache treecache.Service + account account.Service +} + +type Service interface { + UpdateDocument(ctx context.Context, id, text string) error + CreateDocument(ctx context.Context, text string) (string, error) +} + +func NewService() app.Component { + return &service{} +} + +func (s *service) Init(ctx context.Context, a *app.App) (err error) { + s.account = a.MustComponent(account.CName).(account.Service) + s.messageService = a.MustComponent(message.CName).(message.Service) + s.treeCache = a.MustComponent(treecache.CName).(treecache.Service) + return nil +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Run(ctx context.Context) (err error) { + return nil +} + +func (s *service) Close(ctx context.Context) (err error) { + return nil +} + +func (s *service) UpdateDocument(ctx context.Context, id, text string) (err error) { + var ( + ch *aclpb.RawChange + header *treepb.TreeHeader + snapshotPath []string + heads []string + ) + + err = s.treeCache.Do(ctx, id, func(tree acltree.ACLTree) error { + ch, err = tree.AddContent(ctx, func(builder acltree.ChangeBuilder) error { + builder.AddChangeContent( + &testchangepb.PlainTextChangeData{ + Content: []*testchangepb.PlainTextChangeContent{ + createAppendTextChangeContent(text), + }, + }) + return nil + }) + if err != nil { + return err + } + + id = tree.ID() + heads = tree.Heads() + header = tree.Header() + snapshotPath = tree.SnapshotPath() + return nil + }) + if err != nil { + return err + } + + return s.messageService.SendMessage("", syncpb.WrapHeadUpdate(&syncpb.SyncHeadUpdate{ + Heads: heads, + Changes: []*aclpb.RawChange{ch}, + TreeId: "", + SnapshotPath: snapshotPath, + TreeHeader: header, + })) +} + +func (s *service) CreateDocument(ctx context.Context, text string) (id string, err error) { + acc := s.account.Account() + var ( + ch *aclpb.RawChange + header *treepb.TreeHeader + snapshotPath []string + heads []string + ) + + err = s.treeCache.Create(ctx, func(builder acltree.ChangeBuilder) error { + err := builder.UserAdd(acc.Identity, acc.EncKey.GetPublic(), aclpb.ACLChange_Admin) + if err != nil { + return err + } + builder.AddChangeContent(createInitialChangeContent(text)) + return nil + }, func(tree acltree.ACLTree) error { + id = tree.ID() + heads = tree.Heads() + header = tree.Header() + snapshotPath = tree.SnapshotPath() + ch, err = tree.Storage().GetChange(ctx, heads[0]) + if err != nil { + return err + } + + return nil + }) + if err != nil { + return "", err + } + + err = s.messageService.SendMessage("", syncpb.WrapHeadUpdate(&syncpb.SyncHeadUpdate{ + Heads: heads, + Changes: []*aclpb.RawChange{ch}, + TreeId: "", + SnapshotPath: snapshotPath, + TreeHeader: header, + })) + if err != nil { + return "", err + } + return id, err +} + +func createInitialChangeContent(text string) proto.Marshaler { + return &testchangepb.PlainTextChangeData{ + Content: []*testchangepb.PlainTextChangeContent{ + createAppendTextChangeContent(text), + }, + Snapshot: &testchangepb.PlainTextChangeSnapshot{Text: text}, + } +} + +func createAppendTextChangeContent(text string) *testchangepb.PlainTextChangeContent { + return &testchangepb.PlainTextChangeContent{ + Value: &testchangepb.PlainTextChangeContentValueOfTextAppend{ + TextAppend: &testchangepb.PlainTextChangeTextAppend{ + Text: text, + }, + }, + } +} diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index ba30a39c..83269ee5 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -95,7 +95,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, } // if we have incompatible heads, or we haven't seen the tree at all if fullRequest != nil { - return r.messageService.SendMessage(senderId, wrapFullRequest(fullRequest)) + return r.messageService.SendMessage(senderId, syncpb.WrapFullRequest(fullRequest)) } // if error or nothing has changed if err != nil || len(result.Added) == 0 { @@ -109,7 +109,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, TreeId: update.TreeId, TreeHeader: update.TreeHeader, } - return r.messageService.SendMessage("", wrapHeadUpdate(newUpdate)) + return r.messageService.SendMessage("", syncpb.WrapHeadUpdate(newUpdate)) } func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) (err error) { @@ -138,7 +138,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str if err != nil { return err } - err = r.messageService.SendMessage(senderId, wrapFullResponse(fullResponse)) + err = r.messageService.SendMessage(senderId, syncpb.WrapFullResponse(fullResponse)) // if error or nothing has changed if err != nil || len(result.Added) == 0 { return err @@ -152,7 +152,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str TreeId: request.TreeId, TreeHeader: request.TreeHeader, } - return r.messageService.SendMessage("", wrapHeadUpdate(newUpdate)) + return r.messageService.SendMessage("", syncpb.WrapHeadUpdate(newUpdate)) } func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, response *syncpb.SyncFullResponse) (err error) { @@ -188,7 +188,7 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st SnapshotPath: snapshotPath, TreeId: response.TreeId, } - return r.messageService.SendMessage("", wrapHeadUpdate(newUpdate)) + return r.messageService.SendMessage("", syncpb.WrapHeadUpdate(newUpdate)) } func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) { @@ -247,21 +247,3 @@ func (r *requestHandler) createTree(ctx context.Context, response *syncpb.SyncFu return nil }) } - -func wrapHeadUpdate(update *syncpb.SyncHeadUpdate) *syncpb.SyncContent { - return &syncpb.SyncContent{Message: &syncpb.SyncContentValue{ - Value: &syncpb.SyncContentValueValueOfHeadUpdate{HeadUpdate: update}, - }} -} - -func wrapFullRequest(request *syncpb.SyncFullRequest) *syncpb.SyncContent { - return &syncpb.SyncContent{Message: &syncpb.SyncContentValue{ - Value: &syncpb.SyncContentValueValueOfFullSyncRequest{FullSyncRequest: request}, - }} -} - -func wrapFullResponse(response *syncpb.SyncFullResponse) *syncpb.SyncContent { - return &syncpb.SyncContent{Message: &syncpb.SyncContentValue{ - Value: &syncpb.SyncContentValueValueOfFullSyncResponse{FullSyncResponse: response}, - }} -} diff --git a/service/sync/syncpb/helpers.go b/service/sync/syncpb/helpers.go new file mode 100644 index 00000000..52d7fddd --- /dev/null +++ b/service/sync/syncpb/helpers.go @@ -0,0 +1,19 @@ +package syncpb + +func WrapHeadUpdate(update *SyncHeadUpdate) *SyncContent { + return &SyncContent{Message: &SyncContentValue{ + Value: &SyncContentValueValueOfHeadUpdate{HeadUpdate: update}, + }} +} + +func WrapFullRequest(request *SyncFullRequest) *SyncContent { + return &SyncContent{Message: &SyncContentValue{ + Value: &SyncContentValueValueOfFullSyncRequest{FullSyncRequest: request}, + }} +} + +func WrapFullResponse(response *SyncFullResponse) *SyncContent { + return &SyncContent{Message: &SyncContentValue{ + Value: &SyncContentValueValueOfFullSyncResponse{FullSyncResponse: response}, + }} +} From 26eb52adf1a903be2cda5d510427342775dee530 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 2 Aug 2022 17:30:59 +0200 Subject: [PATCH 26/40] Add nodes generation --- cmd/nodesgen/gen.go | 95 +++++++++++++++ config/nodes.go | 13 +++ etc/account.yaml | 2 - etc/config.yml | 3 +- etc/nodes.yml | 22 ++++ etc/x509/cert.pem | 30 ----- etc/x509/key.pem | 52 --------- pkg/acl/acltree/acltree_test.go | 14 --- service/account/service.go | 33 +++--- service/node/service.go | 130 +++++++++++++++++++++ util/keys/asymmetric/encryptionkey/rsa.go | 8 ++ util/keys/asymmetric/signingkey/ed25519.go | 9 ++ util/keys/decoder.go | 16 +-- 13 files changed, 306 insertions(+), 121 deletions(-) create mode 100644 cmd/nodesgen/gen.go create mode 100644 config/nodes.go delete mode 100644 etc/account.yaml create mode 100644 etc/nodes.yml delete mode 100644 etc/x509/cert.pem delete mode 100644 etc/x509/key.pem create mode 100644 service/node/service.go diff --git a/cmd/nodesgen/gen.go b/cmd/nodesgen/gen.go new file mode 100644 index 00000000..fbb571fa --- /dev/null +++ b/cmd/nodesgen/gen.go @@ -0,0 +1,95 @@ +package main + +import ( + "flag" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "gopkg.in/yaml.v3" + "math/rand" + "os" + "time" +) + +var ( + flagAccountConfigFile = flag.String("a", "etc/nodes.yml", "path to account file") + flagBaseAddress = flag.String("ba", "127.0.0.1:4430", "base ip for each node (you should change it later)") + flagNodeCount = flag.Int("nc", 5, "the count of nodes for which we create the keys") +) + +func main() { + rand.Seed(time.Now().UnixNano()) + flag.Parse() + + if *flagNodeCount <= 0 { + panic("node count should not be zero or less") + } + + encryptionDecoder := encryptionkey.NewRSAPrivKeyDecoder() + signingDecoder := signingkey.NewEDPrivKeyDecoder() + + var nodes []*config.Node + for i := 0; i < *flagNodeCount; i++ { + node, err := genRandomNodeKeys(*flagBaseAddress, encryptionDecoder, signingDecoder) + if err != nil { + panic(fmt.Sprintf("could not generate keys for node: %v", err)) + } + nodes = append(nodes, node) + } + nodeInfo := config.NodeInfo{ + CurrentAlias: nodes[0].Alias, + Nodes: nodes, + } + bytes, err := yaml.Marshal(nodeInfo) + if err != nil { + panic(fmt.Sprintf("could not marshal the keys: %v", err)) + } + + err = os.WriteFile(*flagAccountConfigFile, bytes, 0644) + if err != nil { + panic(fmt.Sprintf("could not write the generated nodes to file: %v", err)) + } +} + +func genRandomNodeKeys(address string, encKeyDecoder keys.Decoder, signKeyDecoder keys.Decoder) (*config.Node, error) { + encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048) + if err != nil { + return nil, err + } + + signKey, _, err := signingkey.GenerateRandomEd25519KeyPair() + if err != nil { + return nil, err + } + + encEncKey, err := encKeyDecoder.EncodeToString(encKey) + if err != nil { + return nil, err + } + + encSignKey, err := signKeyDecoder.EncodeToString(signKey) + if err != nil { + return nil, err + } + + return &config.Node{ + Alias: randString(5), + Address: address, + SigningKey: encSignKey, + EncryptionKey: encEncKey, + }, nil +} + +func randString(n int) string { + const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + + b := make([]byte, n) + for i := 0; i < n; i++ { + idx := rand.Intn(len(letterBytes)) + b[i] = letterBytes[idx] + } + + return string(b) +} diff --git a/config/nodes.go b/config/nodes.go new file mode 100644 index 00000000..510c97c5 --- /dev/null +++ b/config/nodes.go @@ -0,0 +1,13 @@ +package config + +type Node struct { + Alias string `yaml:"alias"` + Address string `yaml:"address"` + SigningKey string `yaml:"signingKey"` + EncryptionKey string `yaml:"encryptionKey"` +} + +type NodeInfo struct { + CurrentAlias string `yaml:"currentAlias"` + Nodes []*Node `yaml:"nodes"` +} diff --git a/etc/account.yaml b/etc/account.yaml deleted file mode 100644 index 5a9a0330..00000000 --- a/etc/account.yaml +++ /dev/null @@ -1,2 +0,0 @@ -signingKey: 3iT1Ue7xNejwKhZ4L8SJCKZw7RLaMy5Vh9fkWFD43ZDTg5kRV3zGPuKCzWL8d2k57EMrFCk39ddknzRVhVFC6fgi77iA -encryptionKey: 51HYzTYh5uokpYWp8EyPeTJRm6AYe2ZoZBPCLUzMR3kMijkKvEJ4bjGBdU3MxgHo4e3Dg1AFnapEZPMMHp4d3hyMB6469ZWHeGPUWh94jhB7WiRL9BtydyazQHqZQhfihK2qaTw9wgx4pq7XnydCrYS1SiQLVCGCitCLH79cHSXZNn3hrNYCz9Z3GQHX12hSKA55uzKyumZiwiiddDQ3Ufzs49hPhNuRU1QtyDYETGNCFafA2MyDv86KbdeXSgQFcghDz97A1KL2FsvfjpMBawok5NKKPmd2P1PR6cZXb1UTHRaMbAGpDuEjQNu74TsFbQQoBEahWYBgSy8Mg92JuaTjeGhLFDh5QsVF89Xj7qYK7T6CRTKuuJEgCyDYL9zbsqnZg7tXESGfazhcCYdUXXZVq3N11NDkEWz7SrNCdLscPKgqcFidBFRdVUqM2v8kGbeXQQCGTGSDsUi9yweB8xrpBdLRhJzJmKrN9xsUT8UeVjdBA4hKc8DKdV9oSxpkcJMMiCuL7EPYBA9uRMXzzeJw3HnZvFemv5QLqcPKc55q5oZp364xDwV86PMokVVGGCu67kuurertyFGKDWsfyRje7g9dy4o1t9D3pTuVmNH5Jjhb432kq38AEx8ndpAzvYPLpni44mBWutreYMg6ASDMYa19NkSRLrvjMHfF8uoP7VLitpyeWsx7mfjsQS5qms3xpTJRDJYjHN1ZPEYdxBCXPjofYyFExHH4kc27gejLMwhKMnTkGuEdnvaBSvJLwq6BUM3NsMMnqZcXFDMwarSbi67F8KyFspmYJ2jsJfEiAHzkSk65ZnppccxQjCAJgniMDQh9NwcuSG3n1Mt4VvW1B7sNrcWdFhTVnZFjBodarLJJfNYXeJDweZgwAs9Y1Ce1BbJQok1u31aJmY9ATnhKS2Bb3eDDf2kvG8q6DDcUiM5HHNqdMZbrt9jevNfR59B19C5j92DNAsCvcTmnWrSfPyphAWjJD5yTZRNdMYL1XaywncrhouSXUS7Crfpsm1yPnRQDYu6LB26vgnc35cLSNYqyX2oXfh3o4WyC2SPPCJ7LP5T8ff34hsKo78GZtc7mGreHuxieYCnJ3kYEW5WpVJ4TqQLTrnqzF2WL244V5pmUHQVF4q4ztzrG5edZS4Ah6Kq389UkU4Qo7srjMQ5KJnDpUAvJmdqdWJWftbqB5qMhRekHS3MXbgDrDL6JrpR2PcLLPPKhQHatPdhKnwgg7NABzTAxNqgb99LjsPFDhPDiK4BpWX7RbvjWm4WSZmozcRvJz75w2t3y4zvhBfNTgu8iZjE1bTL8wLpBrFMZesK5waspBP9N7uYaBKwRfb8VoUNoLWJtERwH592vqHKyg9B1mBHeH3YCQLu9NcS4qUsa5tSKmn24q9i9yBkoeVP1bFiDy3JxHUyQcaCwVgE2kWZApDw6w2T8FUp5ftWDCLb2ewGjj52cRNXb4pjgRuyLZdSa7wgn6SsQdhuAiTaKECmaEpZMoKFL9JRD9iTcAq1HNJBzP8hnaeF88UNdz8TBLr7d5Bnujpcr9mqQSj28JrRzxLNJQfWo6sWLao8LpaRzdP8QNUcv3SDMiLT9Vdb31iFvSesUzi6YG5XY95ceA7xJRzW \ No newline at end of file diff --git a/etc/config.yml b/etc/config.yml index 245199a3..bcf84db6 100644 --- a/etc/config.yml +++ b/etc/config.yml @@ -6,5 +6,4 @@ grpcServer: - "127.0.0.1:4430" - "127.0.0.1:4431" tls: false - tlsKeyFile: "etc/x509/key.pem" - tlsCertFile: "etc/x509/cert.pem" + diff --git a/etc/nodes.yml b/etc/nodes.yml new file mode 100644 index 00000000..7c3008b6 --- /dev/null +++ b/etc/nodes.yml @@ -0,0 +1,22 @@ +currentAlias: ULSsy +nodes: + - alias: ULSsy + address: 127.0.0.1:4430 + signingKey: 3hvsvs4FSnU1p6MFJFVaHFfTfTrD7efGbacacAcYbnWMcXcAQd7k6V7PgLbHddabQH18a1TnNKHQ3Z7yRinXohAzY8HT + encryptionKey: udNkNsbKtm7eu1Bqt5d1jyhFAxd26wjema4tDqRiZ72xdCcBZvK6WBdpXWzb5w75FHEz8DDo7qoFLB9xAQA6GuNzoDTsWJjPX9vQHz2m9rCK5FcotjZF5WWCrgeg1FhyVcnF2zTSnw8kQFejMv4iCLnhjTC8op3U1eUpZ4GVxWQ1oLTg6dBS5MQsry7TU4gX77rJQF5gY2CnG9wK3Lv127vJZ6sphQXKQ3T5E7EfDoacGphH9ondtUgd7JRUices5PS7QMPXGVxqHjn2XR4SfRu6tN3USWVBMH5TbPfJbHvhGCHogbzj3ZXt3VidJKyHk2qnXASh9akFRAvgHpf7uhK4Eet3keXV93t9yeLZfttb5HdQ6PtapdMiYYAxPscd761daY5EdhmmBJWBRGSH2TephjcZDjYY1ZwFpNteXmyiWdvodA64cvHHbtFDQtbCu8oZ1GKvM6vq53rKkVvaJT58qrCoThFGVT3xXTFDSTAiKrLxXdiJikdk87mygvPyShdhASNH95be7co9HMrpit6V1Uyk92VcSWqb84bKDhYAsn5PEJSqNtrxRZjG2Zwzd8gFMwgGvcD8iZfhXUA1PWttZ2hwp2kaEanKsSh8sEA7qkJPpvi1f23fYPhhsxjK3DRauZStbaXHoFzWXQUwtDJnitMCwu9k3A7cJmxy9R5YjTnpivgsrivMcy5cHtDXVAKv4UT2DwSgN3d6phT4jzso2sXrmbNjCnrbJjP1A7UztBuwfefHgw4kKnimB4ZyGBWbtSLY42Lt2hSWcoQPcUXkVMTabEaMY8VKApSiRFVcZX9LyiN3vYMoLgFEFs6pnc6TGVRuMP5DfdyogyEyYHSK9iumSy8iVhftjvBc1xtvv4C8q3G3yipRawKiz9FymufgXBZgnHopo1aWaMsHsr5SwQWtaGapy1rNPX51rE9fLY3a4PhBT31a6XwFxJu7pdgWjXYxeN4rioRrfQUGy4D4PW81UTkqpkVZr3bUMWxUorW6tGpSm2irTwk2KM2a62pxErbTFMZUXdcT5zeZeYTFFpVMocaixGgBS4nYvviYXqeXvQ28uNLeWAiE1PTyur32ShHf8uvtoPfVXKhCfNmTkCBh9Met9b6NYoQwk9VTUAP9E3t9DPAAtyPigkLNdERtPEje4NAoV3wsa1WNXSKNU15dpYh3B6Qcvp95YfX253eucQmVjb71Synb4RkSBdnghZzsBYvhQewAkT3432i7hwnjyTWooDgbXMiHd3UaTTFsHS7EYSJxgCe94UEHUF2SL3Wqno1ReZ95678KLLdFwEPbbXWfvAnGU1KvEiMh9y6b7WMtTwx1kdwCghpwgDhE9ktMZNc6ypyWWLYA6473ge5WKrbnR3ugCoLaEpRAWmZBhc52zP9f7SZS1PgwF4fPtuxLtEJTTBkTkdPPwhQVTwfT8viggbdPVQG4iEhdRoEUBE46HC3MK4tchz8ev8CKJMQp4GH8zweGP3JKTNbNG6b7v6kTxHnvG5LbMJMGrq1tDfADDD8NwgL2Luhoe4y9JfAysK5UHkSWaQw9L7TsxUPgj3otgrwSjGFLvfc2D6zNddfGELcoWzNLzXoFZqAyQUvFdAqUcMYanepAQJke717Wv + - alias: NpBrA + address: 127.0.0.1:4430 + signingKey: 3ixAJXFCYUu366ywFxsvNzAFQkVPyDKRiis1nCviHXUu5i3PkDP9FJFPGs5WZUMe83mEYVaipiW2ntiQXaxHYyYys6wp + encryptionKey: JgG4CcCbae1qEpe7mL9SrVoZim2d7ydWKL1KV6dMtgKcnb62MVgezmTyTPrcx29ZF4wecMxKmQNcdYhAN1t7vDQTBgUrGdCbkCUYu3sLaQYuitCEM6nykS1WWTsKSkFS1HiAVoWeSpQTzVwDNM2VDkVyS5Vbmg9gnE8qt8EnebiD3Cg64YwWi3HgEyVRauygAktmanFJNRtkBsriTPFZn9RDh4mMxSa1Q4iTx4Gxuq6avw6WACWV3x7RpbwrkWh54d8abXUdWxFZGCfe87o9v4UrxcujhWzE4F4tbGyrPBNy7abamb3sVqzRZPAikLeAKeb3s8K5JpUKXTVEiKCNpijaBFBKSLf7znowdJ9NGTMsJCSwTpsznANsBMhaz5uGaL4ur8CK6u4VXQbH1yUpKrnnVVjzoXVqh4vAeUaA7sanWKdPwGcaS6oDwwWp9Mi7qrqYocWQ6EtaeAQhbQ4qRPygujnBdThGnXFLrriYH6Yzb3BJsEG9S5gXEDHytFKAYudmYd77xYcu1rN5k6V35c8EaNp8AWZbkCpkefsSPCc1dTG4Fgg9GnBwdJvrXLV6CrE6SQtjUgPcpiLGK65sEutgApbkfkyasPdpyBBp8xND4woihHpANkTx5Lxn68rDj2bk5NTLgZLJgixJRoNPLXtCWSnQU97xvtjU8UnT195KwkCTm8X62syiRE6jkR3seVWUrwLZ8qojdZkm3bS1yUyYAPaCapUwppTT4SSgTrhCjGjGkYJarJPsxinedwTEvCPzujRcNofq4nF1RedgfSimvkjHPaztQv8h8YmxX1iRZ99AoLzuSw3uohoPvDsQMt97uQFCEZt5gLmzZSXpQpNDmAX6xpwbmuHuLgP2fJ5XrygnZo1jFGPPcfTurx4aghyrBGhbVB1XBcLvrzr6XA5WtU9HwriFYx27TVfiKJFG4ZdsbSUgLSQcYKJz1cZTm2QntLaCMpiG4jEkQtaEPANgp9oARvrh6kizpkGMpuMfVbcfE4cNiYDKwkj4cHa1NRmZHzxUyKiwTzwxh2YKra28NQnFZCnbqm3kBAaf8RiJkjb489uMtDo1nQ3cFhH6X68BqnfAmx2QEWMDHeT1XLPPEAwMhJ3tqrb6nMx9oEjcof8GMxv2GyyMtsAUHFY3KE3NAvfwbgWh35V2kKiyZEmmMWrs5TuMncKCMib85ymwmfa79igHERnhH9dJhKn2HcbhUxSX3SUB1CRihDNnXLT4rExwJfQmZfUhJmAK2BjkfaEGwNwxfcLE3KWMi6BRAiXnYhBiLHeM47poNhc5c9wE5krvis6Mh3HeLxbwjLZxoLWEonQzxstSrRKz6FSzkqXWQKaavELLsiVvo7s7Ga9gMoTvLqmCK9Ksk2u1ZKkgwsp26JAfDkWpvx7UtnomdztpGbMFSiPFvHzEwhKz8qohCyBWDgN7ZjdN4doRyG98MR9wweRyKuneUE6qxXpBhCAGWSUdBYtd3EFtmpGfYscYKQazGNBw3YsfK3UADQQsWMPXqCWGqpi4mpqRsKrZv3niZB1XHHP6kNUGN75awEjh4soKhHwhpBdUx9NXYAx5BDQWR6CeZS3pzUVTnMNAcizm3SJoN6HhmhvBt7LNFEcphPtotM5f + - alias: aVIrA + address: 127.0.0.1:4430 + signingKey: 3hwxb9marr5HkvtWrDkXmE82mBQrNUUxeqMbrBbUjXFJuENrAe6JwqftFjLFmHvTN3r9SELsxujsaehxv1b7VcXXf3ay + encryptionKey: 2M2HT8EVmV3H4KkqzeTUAgw4okcbPbBpUxBMg6kLKpoiJPjg1fHZtZuZjc3HEHn5n7mihCs23uJVDGhtCjQXnpwWZUn2ezBzA1t4ZjURJUDCp7FzL7kKoFETtCuxrdh4j7RcbmA73in2C5YgXeUuEpMn39ApAXTxASMcdSzm9Tk9KMqVXNNMezfu836jDG5cj72wkJgzPFKhviEZTzYjPAeqe9qMnnGLPWqwDCarj2xeqx9n15zA1Ld2KfY5JDQQDj4WBohC5N4kLTzmNjiVnKBbZzLwfW42Nypz7AWxVeKYAZVPmKbTPtJRWGAtMjY3QC36SX8YqnkxV9cHUbCo7cWbEKctsDjJjMFxR5aXsiftqTo5REaVvu8RMQXx2QPshqxFBdJiGpfyrfBnjC6KbdszBTpdSQqiAEhNkoNuvniY8DTdrNWiH1n8CPuuzx3diQVSAaX1CnJzPqXhke2pBQBZWGsiMWFVFDUjZqH9PHe2BWZ3nMaKFxKAggiVhzpRFdC5xW4DbWsfaw9m2atKC5atWaaSs1uPkjtmURGP3DvFdWGdQfiEm5WBfMCR4sd9w5Y23SBFwPvMTJCHbKsAt5iqp9BwvnnX1D4sKxP2FA9Db16aZFczfzvWfsvWGRmZwt9y8dW8axBgCL526YYap9gihFPJbEEgABZpzrLzSTeVuJfsKuwXjwKBqEiGsJaAnKzEK7KwRhsJvz2e31MYx27E2u143njA7aD5AW3civNaDzbqkeTWJYwvXXavsJ94i3FAiG6FF8yARkcPxV76FV87QFwCfN6dz8ZJthmhEDMkLgTYcsVKkhzhGWnAYB2ayJjbmL28ewGDtQtFEAosdoVs6FYjKPUDVvahWiQWmGGnnF3FwY67JCkwnYzPB96kLSQcvjE366s8x8SFwZWy32u1JwwcCwAMBKJTN3RSc1KAa2VazM5knjgtyqyFeF3EJQZLHcLGrusSWpXFqBhMbnbn7Z4GuNNwuzjEDGKK2bJ97o9xtx1pgHjjvRoK6wfJ7zTDtFWXkJqCY6CtC2cwrkw4TuyhaBz1fCnD2Nu9jz2YWu5Ery7wGJkaiVW7wfPHK3ks9VLwXViF2kHDEB1c2AzabRyTWrgGb9JU1kt9PVQM8TPyKHbBvhp6pr4jmU188PMdHKkca8Nx6mTEWhn3QbTzqPxYBzmHSFrvVVKtwyU2J2izvHfbURQ3a9psDYriZVVFeDHRCN64RFku11JREa6ddjTupEoJmBpb9VBkqzmuXFw6diTruRVNQurgm38MVCKKswTLz4BxHGMSrZh5R3YJzFJScRCDkLVy8NgZeydY1h6iE53GCZDaP1Y68XREVqkaNRnrqkaTgL6Vvr9pV1oMSrKfwAUhcCaxS9n9fxSmy8xt1p1k8VYFV91FbkTZU1r2RMQKeWA1tPCDjs9Cd65GgRkvUgJ8zHi1x6GE9CneqmqTuUqXt1xiM6Ha2eZvcGFH99xpqcskCkTkP7GAJsddb3GUuoVgGzSkXBpMSt1ghSQHp8TArzuVYkLrVViygustEXp2YtJREu6c9NWFDnCyXKDUCcGMHtS6GK1entBMr5BWK6szHys3GPLr2mK76TNWX2Xqrm1C3rCkiARhhgTLqqu8zKhJFu + - alias: JDBbe + address: 127.0.0.1:4430 + signingKey: 3i7vzUsjAfsaShNzUY4GQNWP6283s6HudHsWjKf55NoKBtVgcLhkVw7jA1nxt9fswtFsXGNLcpgyAScYUR3mHDZoD2Pk + encryptionKey: 51HYzTYh5uokpYWp8EscYm3wA7Z7J2SQXirK8kjW1kkshSx3EBrkceia4jHcwbqMHSgFxBRBmuTRJAVqKPpLJ12CfEFfdcM3A2iiWJx65iacQmnFtCMvEuFrF4xKxYUyLMWXeoT5BCpLC4Vr6EDZuatvdQHER9T8fCqrBhm4ZSzyJfyzM6Vqj2pXwAMgnLN7hydUjYoxiR23E56zPva8eu1cuFuicMrmPUCwkpZohLE7wbytnkHESQvXNdbJTps3BZ7LP1K66RzwdLFvem3RC6ZxPTrNQfPeMa3KmYkaNtVPcMhbVtj2pTuLJ4EhKNx3WNLVr61UyR91n9EeQxA1G7mts7zeHN2sZbJfonJJkuxN8ppN3MeDfy8tWFRb1DQhgMwmojqhGNFQmJmbM79BHe2zSnySLNU5VtCbDobvsid2g4ZfdVgDqbBYdVaRHzgU8psDX6JiEhxZxEHu2VUy16S4PrWFa92yEpAsXQ1NLD5wg5e1utvVoWHAf4D8PyiNvy3FPwUZg42rmVbj8mWRoerDArQ4ey38SJgSX5LNddYyb6hpQQC8TQzFKTLXGgHsPsyXm8C6xdHnvtEVVNDAejbKHsDsEuom1g4EwgGdEZUYR6WKng8A9K2HP3B8fJA4qvdcnX5BgzGwGYFu5auin3doEKz6zmHmSKyWk7YMCAmeQ4UheTpBFzzW4ynRrKYQHbfRNh69skQmfJR8ANtVXcUX5VvrK8vampSxDZHMcbJKSTyh8D648HiFvoNZk77Q7K4XMiYY2ENjVfXABW29j7sLV6M3qwxqXxqerBmLRFeVZKvhrtqqG13xbQRMYqdxhSvFzcbauPE4RuLukdKiSRDh7nQrvhjp53trWLeHgECsrk4spBrsQXfn5MFJxzrt7xpcRkj4cwgiwobXfVj2z8YEakWC8965ZSr78GJgx4xDBtxJfYcxmXykysRhZd3rqfev47y9q9R5qPgZFy4PxGKsXkwFT6nwDmyghXLfVQYXsJXun2f4xwzJ7D23t825JiwwnUNrzCcEtG3fMRF3tm9yCXBB6iPRtgqwK1Uwpyu81Y9c2ztDw8zuScbMD1SAgeGcuZkA52VT7duqBLu2GAK2dddx8b4aDVZ44fGXSsmZ3bNQNPY4YtQb923hrSoPhNmwVjSLdiXWHWbszvBzMpxRKSnnNjG79St8h3Ydw9GAAuQjRkurpxWUKnhVUBUUBJ2ZvPaVADMqWzRyhKATHTSmGKtdHjX5uN8djjp6xt8FmUteQyKX9LxokMUneExp1nvQvgQxGUGdFqRqmBh2PjWvCXwsWZMaK1cFtriyqJVGr3NdsS1xCNhdxHkot2RxMeMAfzPRRsbHyR8LtJk9zcsCjWDJfpM5YBbgtrLzkuxMNPPCtMJdndyQbiW9ewY4n1WiXgH5mVkZcggrG6e78zu7jre9haC6MRKpNacsvvAUxvJLFqUFfWra48RU4MBp13Ad3JEaQkQgkKYj6qmoDK9mcaYxK3Pi8EeofAUta4kU2WBMnhsAzRCKnG2mdutsjkvTdFkEs9Nms7kvNDFdcdG6ZVQgDHdogpsSEfaXNYnoHdwNmiVGQvYEnBfgVgg4KihoBZMY5D5ZFv8amuj4mVeA9fyym1L + - alias: PqyLS + address: 127.0.0.1:4430 + signingKey: 3hwkRSkxTpC96DnUM9wWKRuxwLZS7CrKzXCGuWTdnhVHT644XMEEYoSiapATVMcE6Dhbmsqmpzop6ox1bqUXiyuCLbha + encryptionKey: JgG4CcCbae1qEpe7mKhXWxXceQPz4hkU4XurwrRAoczMzDmkfpgnVtemFhuHyQqsBbEdeLrEBjxMyqu8TgtiZMD6cX4X7nPcmYRiyjq2dgeZtr7iw2syG7Zpxs5yL51jJCqbmRkJ4HCnGASFR7NWYwUGaEVKCRbgqGHwwNSBr7nKhrmm6ZHs5m6YSyXQbpqA8SxPce5GGGs6JesBzoBEh7f8S95SchThpqAKCFRFisTUFJBjbpuJTZ3T7GbR6tgVMcQTodZf2TAweStvkMzCtHpbLiDqkHxjEAB68p2KLwWN5PR9GuZQtupuKPDMVtmh3e7yvdrSF49ACL6nRSpRiB6ARMgTxb4X5sPR3CFiTVNqo7KK81KB1PyaytNkSHJ2WgURJrAafqt85BiCLney6Pk9xfGiSXve2FMY8mmzzLjccZa4PJER9WXGoFjd7QyfEkQcBEQpk77cKEeT5xc8mZEwg7sKkBGRZypMKkTd3vM3RVXRqavuq9GgW8oL1kPAZ7cknwveyZ4F446thVutK5ieXTwDikY5QpsJuJTKszpeK56EL1GWL9AV4z2xfPmsSVwvPYSi4mC5mSWgesVAatUXpWKCX5mwgw3U1D8WXhosCbnJTvtuAWKsmnyBUQWVxS3pGsb3wWZjHvnt294mUdqTbGAoS9PEGNGxEYqc7zf5i2vRfbCXAEHg9bi8qd4vMxpbxptT7s1MiTgDntFyLeKQLZ1aNkWtpfL2P3tT8VtzReEH72WQd8nMCdtFo3MiGZycqcFsSvpmofmq8DWLU6r7ZYJq5CXekrcyVBDHSbhf62KW2DMV3Z8htkUjZojwk5qVyeLNNBgDHFAFA4puZBMFVnjsn6hmwbUMqSY8kjrEsDqCXa2cLrSWu48Mm9LPLCaxsNAxVTAGAxHPBXww7cecJSWrFcfuK1iLNYg37fzU9ZYgGQ17wVMw35GL5xdq1ZC5tAdte8xYYoW4AfNoajPfnVMEHZMh7EpGLN9K4p4yr5dD9gsxtaBE8ZKJtMx5tyePS3BeajhB4Fsr7fb1CpssneCmJkXqzxqFy7U2wjaaW7FyJfwu4e5sa4KgAoNUyLHumD2F4AjDqBw7hCahut8Ua5Qo12WSjASxUAwoazPQyuech7xh71DGVPZGmzmcMamc8ek7rBWeWrxXPeTCfwXavW4F7aZDXqCHRDDjHkCaHYNyrYRhNY263Vy5VRDdKb8iHDfLToe1uf8z4BAaLQ7nYMWgZoHjum8TGQkGqCM5Jk4HpJY2mbahD4bjMueQcZH9ks82ttsrg7mFmALAUoyVjkub4KYyXhR6GqRDRLFaDUv7toM9gZ3L3p5n1RwJr7hFr2sRwjTGJ7hdSCzgNPk3NUGK3vnojpjQoKXNPgCXYyRJgTr2y7UoZWj15Gm8H1QnrK5Ar76i663RV1zu3MhghweFGnh7WE14j2NqJ4vkfe37AJmntwF19j4JdUpTtDY9b7DZT9ohSSeRkmoSuPsy9Vpai3JyFpfAWom8CmkYkDA2GR9Uwxmg2UuqWSoxxcsdn1dZJdfYWrrXodjK9PGsJ8YPLMTSZz2Ye4vshmW4znLam5B6Yh11vtivD8njej9cm8eCP2SvPcUvMyFb7ZW9p6ByeWSq diff --git a/etc/x509/cert.pem b/etc/x509/cert.pem deleted file mode 100644 index 0ddaa01e..00000000 --- a/etc/x509/cert.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFJTCCAw2gAwIBAgIUNiBcO8wV6YezcDQ+cLpZe/iXbGYwDQYJKoZIhvcNAQEL -BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMDcxMzE5NDgwNFoXDTMyMDcx -MDE5NDgwNFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEAt+6cVBVkEe9I3CRmPuAqZGnLq48DTXaRH7xz6u4ld7tU -cpDaXw+aURRYKGfYIvcfQav/i+mYUxTQDFbfN8SULis/DckTqeBEaGgUbJJZ6w73 -kkB8BuCiIjh3W9hyUHr+WbdF9wU8K1G6GmjimBJ+qlBBewQm0kzqosVwjQVWarN4 -aEhgiyjnLF9XVYQZRVqGxKzP/MssEU7YjSPPfBEsmi6pAqiDYuZ3+sVlKuDrki0d -r1XOcV/dcSJa4NRazxiWME+GJQ/x7gA2GlC5FbQyhrOs1sNWaBsaWQGl4oHB90T7 -b0GxKOTqI7oCMho+Ajt7eB4zN0fqeCw0nwFyzok3f/GKFk0vLnecFt+gCLyMyS6X -Dqf/DAlvoP41UeFI/rheOwc0UcZbU0HZ2zYrzOYR4eHMHSYKma2DHvIyOYZIV0Uw -tkyOFnoEQGSXK3TMOb7oWyrs4gl+5euPEDKqDuP28xBr4GsFbNq7/7Kd9rKwXb3L -iyy3kot2Vf5QqDFGdyOLDFFKF7MgMrUiEX8onW+fSmjooqUq7ZyLAs8W0uim4moQ -52t7CGUuglaTHYMi2rfoAS5qPXT76jiwu7H351Psca6EIY4V+dIiElvbYryhTNsV -4eDdWGJoZUyGACUhPdfO9l7Wp2+Yy/HGfPWm6mKX8VPHO4llYvwgGzm6Is/pFmUC -AwEAAaNvMG0wHQYDVR0OBBYEFKl07s6kNnGmJN/ASYQTml5UkK0AMB8GA1UdIwQY -MBaAFKl07s6kNnGmJN/ASYQTml5UkK0AMA8GA1UdEwEB/wQFMAMBAf8wGgYDVR0R -BBMwEYIJbG9jYWxob3N0hwR/AAABMA0GCSqGSIb3DQEBCwUAA4ICAQBs5JmRhddd -KuyhkSWd6T/HqAQISgP72ZUAr3gt2j34GLrhDYcvKFZwcoJFCFjG3pVmvJCORVGO -x2TYt2ntsmIyFCZlGE/TpLxbSgsykoUVBnc8ySDnTQTDJr6S7AyWQsznSD6j1/FA -a9E8ZrsyopqIn2eZy9/Asgy1qeJVO4F1kIq+19HUDR2z1rXqVSycOQEJkF84Kgvd -+nDJQ5W3EdamYuDQOhTOeEFfZy1HyM3APhR9JyFHHnZ2D3vsoys/LIWolBJPOq6B -o5JjXgLrA1e12TVXlnTqZ3986vGOyjfut7o2NPO1Se5OeGr6XFwO1nhIJ4gj8OTv -2XuBcslLXI5+6UIsXtFHXAfH7eYErkBCQGiwjYj0V8Kb4M7UZ0seqjK+gMKfvM4Z -hAPlKP2AUNYS7TNyqW3t8SA0c52ASdAezzh/OklCO5vyzxQT4wXTQt5Bub83m9uY -Jnrv6Kg5UPQMrTpo9usJ2zAyj+qkk8KubKOA7grtblmCTvyJFDwyiWZkr0nuvNTV -BsKis/DbJ2hneF+2D/B2pGKxyEP1LCIV/JDTUGX3F8ljTgSihZay/ZZnPUZpbCa0 -czodlAQk4wkGxJWSH6SSkq4dD+JnBQpufBMLa1qShfUn+N1N02yiDPq9XxJytoOR -+vHqqrPS0PcTk1x2Og0xLn6kN+MH0+jRNQ== ------END CERTIFICATE----- diff --git a/etc/x509/key.pem b/etc/x509/key.pem deleted file mode 100644 index 84d64a5e..00000000 --- a/etc/x509/key.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC37pxUFWQR70jc -JGY+4CpkacurjwNNdpEfvHPq7iV3u1RykNpfD5pRFFgoZ9gi9x9Bq/+L6ZhTFNAM -Vt83xJQuKz8NyROp4ERoaBRsklnrDveSQHwG4KIiOHdb2HJQev5Zt0X3BTwrUboa -aOKYEn6qUEF7BCbSTOqixXCNBVZqs3hoSGCLKOcsX1dVhBlFWobErM/8yywRTtiN -I898ESyaLqkCqINi5nf6xWUq4OuSLR2vVc5xX91xIlrg1FrPGJYwT4YlD/HuADYa -ULkVtDKGs6zWw1ZoGxpZAaXigcH3RPtvQbEo5OojugIyGj4CO3t4HjM3R+p4LDSf -AXLOiTd/8YoWTS8ud5wW36AIvIzJLpcOp/8MCW+g/jVR4Uj+uF47BzRRxltTQdnb -NivM5hHh4cwdJgqZrYMe8jI5hkhXRTC2TI4WegRAZJcrdMw5vuhbKuziCX7l648Q -MqoO4/bzEGvgawVs2rv/sp32srBdvcuLLLeSi3ZV/lCoMUZ3I4sMUUoXsyAytSIR -fyidb59KaOiipSrtnIsCzxbS6KbiahDna3sIZS6CVpMdgyLat+gBLmo9dPvqOLC7 -sffnU+xxroQhjhX50iISW9tivKFM2xXh4N1YYmhlTIYAJSE91872Xtanb5jL8cZ8 -9abqYpfxU8c7iWVi/CAbOboiz+kWZQIDAQABAoICAAcytJX6z1N/WonY99Jime4b -kM+qNV4g8317NcseHkPBBkVEg3NAbFDbe7a7F6OIqcW7ajEKx34K3Lh65tnrHMRw -x1MuCRG3F95BInl8Qb4X9BraYLAxNs8hiBRFVHXvVkhjCn8oCoqEdITHkYSThrb6 -FJHwn+dPgMg1c1nleVQMKXxlRrfzdhaPtZ6AYK/M4uTMAYi6V8Nmo0VkvyAzGNyA -0nbq6tdiPxRGiNbEfhuWneiIcl+P+Z3NkyJk1RfxNaF230BQjy55/iQKADBIAMky -O2OdOeKxmtacYKZMXy+i2LcqKjl4OeyDgUX+LmqOct7IycbSTuv8iOOnHhvUlWIg -nFYHx2i/t5mHp0kPjHUzqu40HaRKPpGxAzzSL/W2WNuSFzbZB6SMTGIxG77hGkUh -saoOSLRDL7DhEvvZ5cvhVM0l2mrufak0sUR7K/TooheQ+0A6bU+pZW1kzfwt4ICI -BlGZt6rw7dSEDMButhfMkWPCIowULrtevB9pOULfvwGcpslMNN6KiAl8mjR6OwJB -7AdWCCCC52p240OKe8N4eBoPr6T44LoBsKFpCI2Ztd8IG3LP6AGJueWFLrmPj1J+ -WePs5WX5IGfHSHJondm1BWS1nwkdSZQUaeL/POi0YbaAlgndpZAbpkfxjcLuB7Wd -5iOqiIkrGCjVyFTXBipxAoIBAQDE0amd/TrSPwcdLLkhGZswSgGatlenqw/DLswy -30Vu6NzZ2dRHKk1eX3GApgBtYmkP4n3Jadaxl8OXGCw+mPv9fBHgVrmcwt9CCTNL -uwKvGtEpvXH2LgcmFTEL8CnKoM7ZlXDAlGSPf46pOU8HG8nOqOywkIaoiiLAPZHZ -Y3FMLs7s0UEDYSM0EWHr6/po8VQLSnyN5NDcUhn6dsNgjS4p9W90lHHK24J7dqGh -ye4vWslzB5K47JitYKzpo3+dOUpu1/jo9uwzDsUw7SON7CKtKgldwrzvZGiRBhVW -j+cLHdRdCNz2gF/aI2JwgkW1HC+0X3RQs+H99g+yWNDYbyGVAoIBAQDvPPbql0kz -FzdpInbtBY7Z4V0ZRveeWDMln04qtEuifHzme0K03itACcxAhWAwAV8fCjZJdmkc -nQVJ/0i05IFSXiFAKpuhyA9TkPiwxYwlFpvKDk2lhAQ0yR7ig8wCYs1ZA6PKWwHl -Zd7FJKAjTkHey/KAagA1ya8XTBeIDiIQKriMVU9DdJ+4tEFqZLq9EUd/QHJkrxaV -jwmwcc26oE8XAFdFdZtqqvKjhpO4OjFN8C9TIX70krrzTSN2FTK1Y5IVSanzkYEB -Ovy/gedWzq9evuGRoKKNxYqYUXy/p6DiD36OMHZveGssPCkI4NIdPLVo1L6YXuMS -pLl2PswHmI2RAoIBAAiMCk+gFZPXxNlRfeCgGgsoy5UKYhgX56FUQO3coElGt4CG -Yx+MCLwWbPlnPBGD+ogED+5VOEuSCZ5gIFu/jQHfB2+0lG7oT4WwnJenUWCFS5wC -bBaCvTC8LtsT3Ny9yv3L7Y+PYiaRJYLXyETIwiTFVTH9tLtQ9F1gzxqfpOXoCnhi -Re59o2e5cYUrRD6WbE3pOCt5SlCnCBXGXoms19penC5129MxYSM3baF3AW7xBFqI -c6iwLZkp35htzzbmrALQQjDruCondAzB349kN8VJVArMUCQdOiVCHF8b9K6Y5wX7 -Qo052e/BJZ85KQnKZY/xrT1r8l5y9w+Jp9geS1kCggEBAJxp34XBI7qjkzbJsbeF -yr/o+FVucLa2M7qFTTXeaxTxDzghnptiJiTYQxJsIVdBjk9c/eFJ6a8reinHHmIm -g+a2ZEbvlJFRm7OnNPFeNyKIhZK1h06P4bAhTnAKe3eT4W4xUwUaO0MgN2XtbEWp -BKgF76bFpx2Dn1Y8CaaKlvq6863MmOYhecvpDlvhP7YddgFcwW3Si5F803jo7vj1 -lsATGPvwyIwU+E6xziLE6TdrsYVIgRimVlR8OpMZiO3PC9OfNd5pY07KojUTWY0H -1OC9K/1qaN0IKnUr0cP8dNNYDgYo6UY4FNn2+10yoC09Y94GOhak8xFdYWRN6leN -BgECggEAbS7bbv1gIB8toaAWBXxEnLtAU0Ob8e7uD2JYKZqe6NaC+ZX5NTLn+QSG -Y4SkBORGw+v1BIw7Rdk6jlEPpYWncQigQ6YbhqerL39+lmatXoSbQBcMRsjPP0gF -yuOb48ff/uXJhlnbVBJHXMfOW8LDFXL3bgMS2HpWnr5Buu7zGB4ERHg91+tuczNL -qEa85pyvY974arF/53T7Kmzdd/fx7I6RZeZpBGWKqwuZSJTMYL7V/LyKyfU8CTP1 -nz86BQIF1Cr8UXyOUI33UZMFwIXb62HRDXAfij7Ew33rj803l4cedNluXHSx/kNH -3XcrP5qofkzfgz1calZv6phIGJdHLQ== ------END PRIVATE KEY----- diff --git a/pkg/acl/acltree/acltree_test.go b/pkg/acl/acltree/acltree_test.go index 3a0d8e5b..8d89bac3 100644 --- a/pkg/acl/acltree/acltree_test.go +++ b/pkg/acl/acltree/acltree_test.go @@ -65,20 +65,6 @@ func TestACLTree_UserJoinUpdate_Append(t *testing.T) { Decoder: signingkey.NewEd25519PubKeyDecoder(), } - // Use this for key generation - //encryptionDecoder := keys.NewKeyDecoder(func(bytes []byte) (keys.Key, error) { - // return encryptionkey.NewEncryptionRsaPrivKeyFromBytes(bytes) - //}) - //encodedEncryptionKey, _ := encryptionDecoder.EncodeToString(keychain.EncryptionKeys["A"]) - // - //signingDecoder := keys.NewKeyDecoder(func(bytes []byte) (keys.Key, error) { - // return signingkey.NewSigningEd25519PrivKeyFromBytes(bytes) - //}) - //encodedSigningKey, _ := signingDecoder.EncodeToString(keychain.SigningKeys["A"]) - // - //fmt.Println(encodedEncryptionKey) - //fmt.Println(encodedSigningKey) - listener := &mockListener{} tree, err := BuildACLTree(thr, accountData, listener) if err != nil { diff --git a/service/account/service.go b/service/account/service.go index 67adf192..b5b7b8ee 100644 --- a/service/account/service.go +++ b/service/account/service.go @@ -2,9 +2,10 @@ package account import ( "context" + "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "gopkg.in/yaml.v3" @@ -31,32 +32,38 @@ type StaticAccount struct { } func NewFromFile(path string) (app.Component, error) { - acc := &StaticAccount{} + nodeInfo := &config.NodeInfo{} data, err := ioutil.ReadFile(path) if err != nil { return nil, err } - if err = yaml.Unmarshal(data, acc); err != nil { + if err = yaml.Unmarshal(data, nodeInfo); err != nil { return nil, err } - privateEncryptionDecoder := keys.NewKeyDecoder(func(bytes []byte) (keys.Key, error) { - return encryptionkey.NewEncryptionRsaPrivKeyFromBytes(bytes) - }) - privateSigningDecoder := keys.NewKeyDecoder(func(bytes []byte) (keys.Key, error) { - return signingkey.NewSigningEd25519PrivKeyFromBytes(bytes) - }) - // TODO: Convert this to new decoder - publicSigningDecoder := signingkey.NewEd25519PubKeyDecoder() + privateEncryptionDecoder := encryptionkey.NewRSAPrivKeyDecoder() + privateSigningDecoder := signingkey.NewEDPrivKeyDecoder() + publicSigningDecoder := signingkey.NewEDPubKeyDecoder() + + var acc *config.Node + for _, node := range nodeInfo.Nodes { + if node.Alias == nodeInfo.CurrentAlias { + acc = node + break + } + } + if acc == nil { + return nil, fmt.Errorf("the node should have a defined alias") + } decodedEncryptionKey, err := privateEncryptionDecoder.DecodeFromString(acc.EncryptionKey) if err != nil { return nil, err } - decodedSiginingKey, err := privateSigningDecoder.DecodeFromString(acc.EncryptionKey) + decodedSigningKey, err := privateSigningDecoder.DecodeFromString(acc.SigningKey) if err != nil { return nil, err } - signKey := decodedSiginingKey.(signingkey.PrivKey) + signKey := decodedSigningKey.(signingkey.PrivKey) identity, err := publicSigningDecoder.EncodeToString(signKey.GetPublic()) if err != nil { return nil, err diff --git a/service/node/service.go b/service/node/service.go new file mode 100644 index 00000000..065740dd --- /dev/null +++ b/service/node/service.go @@ -0,0 +1,130 @@ +package node + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + "gopkg.in/yaml.v3" + "io/ioutil" +) + +const CName = "NodesService" + +type Node struct { + Address string + PeerId string + SigningKey signingkey.PubKey + EncryptionKey encryptionkey.PubKey + SigningKeyString string + EncryptionKeyString string +} + +func NewFromFile(path string) (app.Component, error) { + nodeInfo := &config.NodeInfo{} + data, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + } + if err = yaml.Unmarshal(data, nodeInfo); err != nil { + return nil, err + } + + var nodes []*Node + privateEncryptionDecoder := encryptionkey.NewRSAPrivKeyDecoder() + privateSigningDecoder := signingkey.NewEDPrivKeyDecoder() + for _, n := range nodeInfo.Nodes { + // ignoring ourselves + if n.Alias == nodeInfo.CurrentAlias { + continue + } + newNode, err := nodeFromYamlNode(n, privateSigningDecoder, privateEncryptionDecoder) + if err != nil { + return nil, fmt.Errorf("failed to parse node: %w", err) + } + nodes = append(nodes, newNode) + } + + return &service{nodes: nodes}, nil +} + +type Service interface { + Nodes() []*Node +} + +type service struct { + nodes []*Node +} + +func (s *service) Init(ctx context.Context, a *app.App) (err error) { + return nil +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Run(ctx context.Context) (err error) { + return nil +} + +func (s *service) Close(ctx context.Context) (err error) { + return nil +} + +func (s *service) Nodes() []*Node { + return s.nodes +} + +func nodeFromYamlNode( + n *config.Node, + privateSigningDecoder keys.Decoder, + privateEncryptionDecoder keys.Decoder) (*Node, error) { + decodedSigningKey, err := privateSigningDecoder.DecodeFromString(n.SigningKey) + if err != nil { + return nil, err + } + + decodedEncryptionKey, err := privateEncryptionDecoder.DecodeFromString(n.EncryptionKey) + if err != nil { + return nil, err + } + + rawSigning, err := decodedSigningKey.Raw() + if err != nil { + return nil, err + } + + libp2pKey, err := crypto.UnmarshalEd25519PrivateKey(rawSigning) + if err != nil { + return nil, err + } + + peerId, err := peer.IDFromPublicKey(libp2pKey.GetPublic()) + if err != nil { + return nil, err + } + + encKeyString, err := privateEncryptionDecoder.EncodeToString( + decodedEncryptionKey.(encryptionkey.PrivKey).GetPublic()) + if err != nil { + return nil, err + } + + signKeyString, err := privateSigningDecoder.EncodeToString( + decodedSigningKey.(signingkey.PrivKey).GetPublic()) + + return &Node{ + Address: n.Address, + PeerId: peerId.String(), + SigningKey: decodedSigningKey.(signingkey.PrivKey).GetPublic(), + EncryptionKey: decodedEncryptionKey.(encryptionkey.PrivKey).GetPublic(), + SigningKeyString: signKeyString, + EncryptionKeyString: encKeyString, + }, nil +} diff --git a/util/keys/asymmetric/encryptionkey/rsa.go b/util/keys/asymmetric/encryptionkey/rsa.go index 6c733488..4e70091a 100644 --- a/util/keys/asymmetric/encryptionkey/rsa.go +++ b/util/keys/asymmetric/encryptionkey/rsa.go @@ -107,6 +107,14 @@ func NewEncryptionRsaPubKeyFromBytes(bytes []byte) (PubKey, error) { return &EncryptionRsaPubKey{pubKey: *pk}, nil } +func NewRSAPrivKeyDecoder() keys.Decoder { + return keys.NewKeyDecoder(NewEncryptionRsaPrivKeyFromBytes) +} + +func NewRSAPubKeyDecoder() keys.Decoder { + return keys.NewKeyDecoder(NewEncryptionRsaPubKeyFromBytes) +} + func keyEquals(k1, k2 keys.Key) bool { a, err := k1.Raw() if err != nil { diff --git a/util/keys/asymmetric/signingkey/ed25519.go b/util/keys/asymmetric/signingkey/ed25519.go index 135b6864..90763e67 100644 --- a/util/keys/asymmetric/signingkey/ed25519.go +++ b/util/keys/asymmetric/signingkey/ed25519.go @@ -148,6 +148,7 @@ func UnmarshalEd25519PrivateKey(data []byte) (PrivKey, error) { }, nil } +// TODO: remove this one in favor of new one type Ed25519SigningPubKeyDecoder struct{} func NewEd25519PubKeyDecoder() PubKeyDecoder { @@ -178,3 +179,11 @@ func (e *Ed25519SigningPubKeyDecoder) EncodeToString(pubkey PubKey) (string, err } return strkey.Encode(0x5b, raw) } + +func NewEDPrivKeyDecoder() keys.Decoder { + return keys.NewKeyDecoder(NewSigningEd25519PrivKeyFromBytes) +} + +func NewEDPubKeyDecoder() keys.Decoder { + return keys.NewKeyDecoder(NewSigningEd25519PubKeyFromBytes) +} diff --git a/util/keys/decoder.go b/util/keys/decoder.go index 2a55872b..0b194794 100644 --- a/util/keys/decoder.go +++ b/util/keys/decoder.go @@ -2,21 +2,21 @@ package keys import "github.com/anytypeio/go-anytype-infrastructure-experiments/util/strkey" -type keyDecoder struct { - create func([]byte) (Key, error) +type keyDecoder[T Key] struct { + create func([]byte) (T, error) } -func NewKeyDecoder(create func(bytes []byte) (Key, error)) Decoder { - return &keyDecoder{ +func NewKeyDecoder[T Key](create func(bytes []byte) (T, error)) Decoder { + return &keyDecoder[T]{ create: create, } } -func (e *keyDecoder) DecodeFromBytes(bytes []byte) (Key, error) { +func (e *keyDecoder[T]) DecodeFromBytes(bytes []byte) (Key, error) { return e.create(bytes) } -func (e *keyDecoder) DecodeFromString(identity string) (Key, error) { +func (e *keyDecoder[T]) DecodeFromString(identity string) (Key, error) { pubKeyRaw, err := strkey.Decode(0x5b, identity) if err != nil { return nil, err @@ -25,11 +25,11 @@ func (e *keyDecoder) DecodeFromString(identity string) (Key, error) { return e.DecodeFromBytes(pubKeyRaw) } -func (e *keyDecoder) DecodeFromStringIntoBytes(identity string) ([]byte, error) { +func (e *keyDecoder[T]) DecodeFromStringIntoBytes(identity string) ([]byte, error) { return strkey.Decode(0x5b, identity) } -func (e *keyDecoder) EncodeToString(key Key) (string, error) { +func (e *keyDecoder[T]) EncodeToString(key Key) (string, error) { raw, err := key.Raw() if err != nil { return "", err From 718df194febe17e29f59980123c8696c4daae7c4 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 2 Aug 2022 17:36:37 +0200 Subject: [PATCH 27/40] Add component registration on start --- cmd/node/node.go | 32 ++++++++++++++----- service/sync/document/service.go | 2 +- service/sync/message/service.go | 2 +- service/sync/requesthandler/requesthandler.go | 2 +- service/treecache/service.go | 2 +- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/cmd/node/node.go b/cmd/node/node.go index 618aceb6..a911ada6 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -8,7 +8,11 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/document" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/drpcserver" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/transport" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "go.uber.org/zap" @@ -23,10 +27,10 @@ import ( var log = logger.NewNamed("main") var ( - flagConfigFile = flag.String("c", "etc/config.yml", "path to config file") - flagAccountFile = flag.String("a", "etc/account.yaml", "path to account file") - flagVersion = flag.Bool("v", false, "show version and exit") - flagHelp = flag.Bool("h", false, "show help and exit") + flagConfigFile = flag.String("c", "etc/config.yml", "path to config file") + flagNodesFile = flag.String("a", "etc/nodes.yml", "path to account file") + flagVersion = flag.Bool("v", false, "show version and exit") + flagHelp = flag.Bool("h", false, "show help and exit") ) func main() { @@ -57,16 +61,28 @@ func main() { log.Fatal("can't open config file", zap.Error(err)) } - // open account file with node's keys - acc, err := account.NewFromFile(*flagAccountFile) + // open nodes file with node's keys + acc, err := account.NewFromFile(*flagNodesFile) if err != nil { - log.Fatal("can't open account file", zap.Error(err)) + log.Fatal("can't open nodes file", zap.Error(err)) + } + + // open nodes file with data related to other nodes + nodes, err := node.NewFromFile(*flagNodesFile) + if err != nil { + log.Fatal("can't open nodes file", zap.Error(err)) } // bootstrap components a.Register(conf) a.Register(acc) - a.Register(treecache.NewTreeCache()) + a.Register(nodes) + a.Register(document.New()) + a.Register(drpcserver.New()) + a.Register(message.New()) + a.Register(requesthandler.New()) + a.Register(transport.New()) + a.Register(treecache.New()) Bootstrap(a) // start app diff --git a/service/sync/document/service.go b/service/sync/document/service.go index 7b8e8f08..24843a25 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -27,7 +27,7 @@ type Service interface { CreateDocument(ctx context.Context, text string) (string, error) } -func NewService() app.Component { +func New() app.Component { return &service{} } diff --git a/service/sync/message/service.go b/service/sync/message/service.go index 7a51ce23..57dc0d79 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -28,7 +28,7 @@ type message struct { content *syncpb.SyncContent } -func NewMessageService() app.Component { +func New() app.Component { return &service{} } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 83269ee5..2b4635ec 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -20,7 +20,7 @@ type requestHandler struct { messageService message.Service } -func NewRequestHandler() app.Component { +func New() app.Component { return &requestHandler{} } diff --git a/service/treecache/service.go b/service/treecache/service.go index d832e40c..85e370fe 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -28,7 +28,7 @@ type service struct { cache ocache.OCache } -func NewTreeCache() app.ComponentRunnable { +func New() app.ComponentRunnable { return &service{} } From e6be9ea84e992a541611428484ec8fc73935d6ad Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 2 Aug 2022 19:28:32 +0200 Subject: [PATCH 28/40] Add http server for debugging --- pkg/acl/acltree/acltree.go | 5 ++ service/api/service.go | 113 +++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 service/api/service.go diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index 0cfcac3f..4697be1e 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -60,6 +60,7 @@ type ACLTree interface { SnapshotPath() []string ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) Storage() treestorage.TreeStorage + DebugDump() (string, error) Close() error } @@ -475,6 +476,10 @@ func (a *aclTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh return rawChanges, nil } +func (a *aclTree) DebugDump() (string, error) { + return a.fullTree.Graph() +} + func (a *aclTree) commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) { var i int var j int diff --git a/service/api/service.go b/service/api/service.go new file mode 100644 index 00000000..44be8430 --- /dev/null +++ b/service/api/service.go @@ -0,0 +1,113 @@ +package api + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/document" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" + "go.uber.org/zap" + "io" + "net/http" +) + +const CName = "APIService" + +var log = logger.NewNamed("api") + +func New() app.Component { + return &service{} +} + +type service struct { + treeCache treecache.Service + documentService document.Service + srv *http.Server +} + +func (s *service) Init(ctx context.Context, a *app.App) (err error) { + s.treeCache = a.MustComponent(treecache.CName).(treecache.Service) + s.documentService = a.MustComponent(document.CName).(document.Service) + return nil +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Run(ctx context.Context) (err error) { + s.srv = &http.Server{ + Addr: ":8080", + } + mux := http.NewServeMux() + mux.HandleFunc("/treeDump", s.treeDump) + mux.HandleFunc("/createDocument", s.createDocument) + mux.HandleFunc("/appendDocument", s.appendDocument) + s.srv.Handler = mux + + return s.srv.ListenAndServe() +} + +func (s *service) Close(ctx context.Context) (err error) { + return s.srv.Shutdown(ctx) +} + +func (s *service) treeDump(w http.ResponseWriter, req *http.Request) { + var ( + query = req.URL.Query() + treeId = query.Get("treeId") + dump string + err error + ) + err = s.treeCache.Do(context.Background(), treeId, func(tree acltree.ACLTree) error { + dump, err = tree.DebugDump() + if err != nil { + return err + } + return nil + }) + if err != nil { + sendText(w, http.StatusInternalServerError, err.Error()) + return + } + sendText(w, http.StatusOK, dump) +} + +func (s *service) createDocument(w http.ResponseWriter, req *http.Request) { + var ( + query = req.URL.Query() + text = query.Get("text") + ) + treeId, err := s.documentService.CreateDocument(context.Background(), text) + if err != nil { + sendText(w, http.StatusInternalServerError, err.Error()) + return + } + sendText(w, http.StatusOK, treeId) +} + +func (s *service) appendDocument(w http.ResponseWriter, req *http.Request) { + var ( + query = req.URL.Query() + text = query.Get("text") + treeId = query.Get("treeId") + ) + err := s.documentService.UpdateDocument(context.Background(), treeId, text) + if err != nil { + sendText(w, http.StatusInternalServerError, err.Error()) + return + } + sendText(w, http.StatusOK, "") +} + +func sendText(r http.ResponseWriter, code int, body string) { + r.Header().Set("Content-Type", "text/plain") + r.WriteHeader(code) + + _, err := io.WriteString(r, fmt.Sprintf("%s\n", body)) + if err != nil { + log.Error("writing response failed", zap.Error(err)) + } +} From cc134da1ed9e3cbd84de7a6643b8523a0b7fbe8e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 2 Aug 2022 20:08:07 +0200 Subject: [PATCH 29/40] Change bootstrap, remove cycles --- cmd/node/node.go | 14 +++++++------- go.mod | 2 +- go.sum | 2 ++ service/sync/requesthandler/requesthandler.go | 9 ++++++--- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/cmd/node/node.go b/cmd/node/node.go index a911ada6..26ab5999 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -8,6 +8,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/api" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/document" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/drpcserver" @@ -77,12 +78,6 @@ func main() { a.Register(conf) a.Register(acc) a.Register(nodes) - a.Register(document.New()) - a.Register(drpcserver.New()) - a.Register(message.New()) - a.Register(requesthandler.New()) - a.Register(transport.New()) - a.Register(treecache.New()) Bootstrap(a) // start app @@ -110,5 +105,10 @@ func main() { func Bootstrap(a *app.App) { a.Register(transport.New()). - Register(drpcserver.New()) + Register(drpcserver.New()). + Register(document.New()). + Register(message.New()). + Register(requesthandler.New()). + Register(treecache.New()). + Register(api.New()) } diff --git a/go.mod b/go.mod index 715f5f35..28de7481 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.18 require ( github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab + github.com/cheggaaa/mb v1.0.3 github.com/goccy/go-graphviz v0.0.9 github.com/gogo/protobuf v1.3.2 github.com/ipfs/go-cid v0.1.0 @@ -13,7 +14,6 @@ require ( github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multihash v0.1.0 github.com/stretchr/testify v1.7.0 - github.com/cheggaaa/mb v1.0.3 go.uber.org/zap v1.21.0 gopkg.in/yaml.v3 v3.0.1 storj.io/drpc v0.0.32 diff --git a/go.sum b/go.sum index 04a8f6c5..5cb5955d 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,8 @@ github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJ github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/cheggaaa/mb v1.0.3 h1:03ksWum+6kHclB+kjwKMaBtgl5gtNYUwNpxsHQciKe8= +github.com/cheggaaa/mb v1.0.3/go.mod h1:NUl0GBtFLlfg2o6iZwxzcG7Lslc2wV/ADTFbLXtVPE4= github.com/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA= github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 2b4635ec..9e4e371a 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -8,7 +8,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" @@ -17,7 +16,7 @@ import ( type requestHandler struct { treeCache treecache.Service account account.Service - messageService message.Service + messageService MessageSender } func New() app.Component { @@ -28,12 +27,16 @@ type RequestHandler interface { HandleFullSyncContent(ctx context.Context, senderId string, request *syncpb.SyncContent) (err error) } +type MessageSender interface { + SendMessage(peerId string, msg *syncpb.SyncContent) error +} + const CName = "SyncRequestHandler" func (r *requestHandler) Init(ctx context.Context, a *app.App) (err error) { r.treeCache = a.MustComponent(treecache.CName).(treecache.Service) r.account = a.MustComponent(account.CName).(account.Service) - r.messageService = a.MustComponent(message.CName).(message.Service) + r.messageService = a.MustComponent("MessageService").(MessageSender) return nil } From 7a1ddf9c83e28e2de7301f77083dbb9bb1061caf Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 2 Aug 2022 20:28:33 +0200 Subject: [PATCH 30/40] Fix server starting, add some logs --- service/api/service.go | 16 +++++++++++++++- service/sync/document/service.go | 23 +++++++++++++++++++++++ service/treecache/service.go | 12 ++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/service/api/service.go b/service/api/service.go index 44be8430..7b2a8986 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -38,6 +38,12 @@ func (s *service) Name() (name string) { } func (s *service) Run(ctx context.Context) (err error) { + defer func() { + if err == nil { + log.Info("api server started running on port 8080") + } + }() + s.srv = &http.Server{ Addr: ":8080", } @@ -47,7 +53,15 @@ func (s *service) Run(ctx context.Context) (err error) { mux.HandleFunc("/appendDocument", s.appendDocument) s.srv.Handler = mux - return s.srv.ListenAndServe() + go s.runServer() + return nil +} + +func (s *service) runServer() { + err := s.srv.ListenAndServe() + if err != nil { + log.With(zap.Error(err)).Error("could not run api server") + } } func (s *service) Close(ctx context.Context) (err error) { diff --git a/service/sync/document/service.go b/service/sync/document/service.go index 24843a25..747d5006 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -3,23 +3,30 @@ package document import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "github.com/gogo/protobuf/proto" + "go.uber.org/zap" ) var CName = "DocumentService" +var log = logger.NewNamed("documentservice") + type service struct { messageService message.Service treeCache treecache.Service account account.Service + // to create new documents we need to know all nodes + nodes []*node.Node } type Service interface { @@ -35,6 +42,10 @@ func (s *service) Init(ctx context.Context, a *app.App) (err error) { s.account = a.MustComponent(account.CName).(account.Service) s.messageService = a.MustComponent(message.CName).(message.Service) s.treeCache = a.MustComponent(treecache.CName).(treecache.Service) + + nodesService := a.MustComponent(node.CName).(node.Service) + s.nodes = nodesService.Nodes() + return nil } @@ -57,6 +68,8 @@ func (s *service) UpdateDocument(ctx context.Context, id, text string) (err erro snapshotPath []string heads []string ) + log.With(zap.String("id", id), zap.String("text", text)). + Debug("updating document") err = s.treeCache.Do(ctx, id, func(tree acltree.ACLTree) error { ch, err = tree.AddContent(ctx, func(builder acltree.ChangeBuilder) error { @@ -99,12 +112,22 @@ func (s *service) CreateDocument(ctx context.Context, text string) (id string, e snapshotPath []string heads []string ) + log.With(zap.String("id", id), zap.String("text", text)). + Debug("creating document") err = s.treeCache.Create(ctx, func(builder acltree.ChangeBuilder) error { err := builder.UserAdd(acc.Identity, acc.EncKey.GetPublic(), aclpb.ACLChange_Admin) if err != nil { return err } + // adding all predefined nodes to the document as admins + for _, n := range s.nodes { + err = builder.UserAdd(n.SigningKeyString, n.EncryptionKey, aclpb.ACLChange_Admin) + if err != nil { + return err + } + } + builder.AddChangeContent(createInitialChangeContent(text)) return nil }, func(tree acltree.ACLTree) error { diff --git a/service/treecache/service.go b/service/treecache/service.go index 85e370fe..78985a68 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -3,12 +3,14 @@ package treecache import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" + "go.uber.org/zap" ) const CName = "treecache" @@ -16,6 +18,8 @@ const CName = "treecache" type ACLTreeFunc = func(tree acltree.ACLTree) error type ChangeBuildFunc = func(builder acltree.ChangeBuilder) error +var log = logger.NewNamed("treecache") + type Service interface { Do(ctx context.Context, treeId string, f ACLTreeFunc) error Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error @@ -48,6 +52,10 @@ func (s *service) Create(ctx context.Context, build ChangeBuildFunc, f ACLTreeFu } func (s *service) Do(ctx context.Context, treeId string, f ACLTreeFunc) error { + log. + With(zap.String("treeId", treeId)). + Debug("requesting tree from cache to perform operation") + tree, err := s.cache.Get(ctx, treeId) defer s.cache.Release(treeId) if err != nil { @@ -60,6 +68,10 @@ func (s *service) Do(ctx context.Context, treeId string, f ACLTreeFunc) error { } func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error { + log. + With(zap.String("treeId", treeId)). + Debug("adding tree with changes") + _, err := s.treeProvider.CreateTreeStorage(treeId, header, changes) if err != nil { return err From ad99bbb7e8dc2edb21e118a0b097fd889d62c115 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 2 Aug 2022 20:50:35 +0200 Subject: [PATCH 31/40] Add logs for receiving a message, descriptive messages for api --- service/api/service.go | 4 ++-- service/sync/document/service.go | 11 ++++++++++- service/sync/message/service.go | 25 +++++++++++++++++++++++-- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/service/api/service.go b/service/api/service.go index 7b2a8986..49e230a5 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -94,7 +94,7 @@ func (s *service) createDocument(w http.ResponseWriter, req *http.Request) { query = req.URL.Query() text = query.Get("text") ) - treeId, err := s.documentService.CreateDocument(context.Background(), text) + treeId, err := s.documentService.CreateDocument(context.Background(), fmt.Sprintf("created document with id: %s", text)) if err != nil { sendText(w, http.StatusInternalServerError, err.Error()) return @@ -113,7 +113,7 @@ func (s *service) appendDocument(w http.ResponseWriter, req *http.Request) { sendText(w, http.StatusInternalServerError, err.Error()) return } - sendText(w, http.StatusOK, "") + sendText(w, http.StatusOK, fmt.Sprintf("updated document with id: %s with text: %s", treeId, text)) } func sendText(r http.ResponseWriter, code int, body string) { diff --git a/service/sync/document/service.go b/service/sync/document/service.go index 747d5006..8a4ae6c5 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -94,6 +94,11 @@ func (s *service) UpdateDocument(ctx context.Context, id, text string) (err erro if err != nil { return err } + log.With( + zap.String("id", id), + zap.Strings("heads", heads), + zap.String("header", header.String())). + Debug("document updated in the database") return s.messageService.SendMessage("", syncpb.WrapHeadUpdate(&syncpb.SyncHeadUpdate{ Heads: heads, @@ -139,7 +144,11 @@ func (s *service) CreateDocument(ctx context.Context, text string) (id string, e if err != nil { return err } - + log.With( + zap.String("id", id), + zap.Strings("heads", heads), + zap.String("header", header.String())). + Debug("document created in the database") return nil }) if err != nil { diff --git a/service/sync/message/service.go b/service/sync/message/service.go index 57dc0d79..e3061657 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -53,8 +53,8 @@ func (s *service) Name() (name string) { } func (s *service) Run(ctx context.Context) (err error) { - go s.runSender(ctx) - go s.runReceiver(ctx) + //go s.runSender(ctx) + //go s.runReceiver(ctx) return nil } @@ -84,6 +84,10 @@ func (s *service) UnregisterMessageSender(peerId string) { } func (s *service) HandleMessage(peerId string, msg *syncpb.SyncContent) error { + log.With( + zap.String("peerId", peerId), + zap.String("message", msgType(msg))). + Debug("handling message from peer") return s.receiveBatcher.Add(&message{ peerId: peerId, content: msg, @@ -91,6 +95,10 @@ func (s *service) HandleMessage(peerId string, msg *syncpb.SyncContent) error { } func (s *service) SendMessage(peerId string, msg *syncpb.SyncContent) error { + log.With( + zap.String("peerId", peerId), + zap.String("message", msgType(msg))). + Debug("sending message to peer") return s.sendBatcher.Add(&message{ peerId: peerId, content: msg, @@ -150,3 +158,16 @@ func (s *service) sendMessage(typedMsg *message) { } ch <- typedMsg.content } + +func msgType(content *syncpb.SyncContent) string { + msg := content.GetMessage() + switch { + case msg.GetFullSyncRequest() != nil: + return "FullSyncRequest" + case msg.GetFullSyncResponse() != nil: + return "FullSyncResponse" + case msg.GetHeadUpdate() != nil: + return "HeadUpdate" + } + return "UnknownMessage" +} From b7e94f2b52ea351120ee36a4a25a03731210e5d4 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 3 Aug 2022 14:20:20 +0200 Subject: [PATCH 32/40] Change config generation logic --- cmd/node/node.go | 19 +-- cmd/nodesgen/gen.go | 138 ++++++++++++------ cmd/nodesgen/nodemap.yml | 13 ++ config/account.go | 7 + config/api.go | 5 + config/config.go | 3 + config/grpc.go | 2 - config/nodes.go | 7 +- etc/config.yml | 27 +++- ...Dua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze.yml | 26 ++++ ...Y23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs.yml | 26 ++++ ...nuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx.yml | 26 ++++ etc/nodes.yml | 22 --- service/account/service.go | 46 ++---- service/api/service.go | 7 +- service/node/service.go | 78 ++++------ util/peer/peer.go | 21 +++ 17 files changed, 289 insertions(+), 184 deletions(-) create mode 100644 cmd/nodesgen/nodemap.yml create mode 100644 config/account.go create mode 100644 config/api.go create mode 100755 etc/configs/12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze.yml create mode 100755 etc/configs/12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs.yml create mode 100755 etc/configs/12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx.yml delete mode 100644 etc/nodes.yml create mode 100644 util/peer/peer.go diff --git a/cmd/node/node.go b/cmd/node/node.go index 26ab5999..fddad6f7 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -29,7 +29,6 @@ var log = logger.NewNamed("main") var ( flagConfigFile = flag.String("c", "etc/config.yml", "path to config file") - flagNodesFile = flag.String("a", "etc/nodes.yml", "path to account file") flagVersion = flag.Bool("v", false, "show version and exit") flagHelp = flag.Bool("h", false, "show help and exit") ) @@ -62,22 +61,8 @@ func main() { log.Fatal("can't open config file", zap.Error(err)) } - // open nodes file with node's keys - acc, err := account.NewFromFile(*flagNodesFile) - if err != nil { - log.Fatal("can't open nodes file", zap.Error(err)) - } - - // open nodes file with data related to other nodes - nodes, err := node.NewFromFile(*flagNodesFile) - if err != nil { - log.Fatal("can't open nodes file", zap.Error(err)) - } - // bootstrap components a.Register(conf) - a.Register(acc) - a.Register(nodes) Bootstrap(a) // start app @@ -104,8 +89,10 @@ func main() { } func Bootstrap(a *app.App) { - a.Register(transport.New()). + a.Register(account.New()). + Register(transport.New()). Register(drpcserver.New()). + Register(node.New()). Register(document.New()). Register(message.New()). Register(requesthandler.New()). diff --git a/cmd/nodesgen/gen.go b/cmd/nodesgen/gen.go index fbb571fa..7532f12c 100644 --- a/cmd/nodesgen/gen.go +++ b/cmd/nodesgen/gen.go @@ -4,92 +4,134 @@ import ( "flag" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/peer" "gopkg.in/yaml.v3" - "math/rand" + "io/ioutil" "os" - "time" ) var ( + flagNodeMap = flag.String("n", "cmd/nodesgen/nodemap.yml", "path to nodes map file") flagAccountConfigFile = flag.String("a", "etc/nodes.yml", "path to account file") - flagBaseAddress = flag.String("ba", "127.0.0.1:4430", "base ip for each node (you should change it later)") - flagNodeCount = flag.Int("nc", 5, "the count of nodes for which we create the keys") + flagEtcPath = flag.String("e", "etc", "path to etc directory") ) -func main() { - rand.Seed(time.Now().UnixNano()) - flag.Parse() +type NodesMap struct { + Nodes []struct { + Addresses []string `yaml:"grpcAddresses"` + APIPort string `yaml:"apiPort"` + } `yaml:"nodes"` +} - if *flagNodeCount <= 0 { - panic("node count should not be zero or less") +func main() { + nodesMap := &NodesMap{} + data, err := ioutil.ReadFile(*flagNodeMap) + if err != nil { + panic(err) } - encryptionDecoder := encryptionkey.NewRSAPrivKeyDecoder() - signingDecoder := signingkey.NewEDPrivKeyDecoder() + err = yaml.Unmarshal(data, nodesMap) + if err != nil { + panic(err) + } + flag.Parse() - var nodes []*config.Node - for i := 0; i < *flagNodeCount; i++ { - node, err := genRandomNodeKeys(*flagBaseAddress, encryptionDecoder, signingDecoder) + var configs []config.Config + var nodes []config.Node + for _, n := range nodesMap.Nodes { + cfg, err := genConfig(n.Addresses, n.APIPort) if err != nil { - panic(fmt.Sprintf("could not generate keys for node: %v", err)) + panic(fmt.Sprintf("could not generate the config file: %s", err.Error())) + } + configs = append(configs, cfg) + + node := config.Node{ + PeerId: cfg.Account.PeerId, + Address: cfg.GrpcServer.ListenAddrs[0], + SigningKey: cfg.Account.SigningKey, + EncryptionKey: cfg.Account.EncryptionKey, } nodes = append(nodes, node) } - nodeInfo := config.NodeInfo{ - CurrentAlias: nodes[0].Alias, - Nodes: nodes, - } - bytes, err := yaml.Marshal(nodeInfo) - if err != nil { - panic(fmt.Sprintf("could not marshal the keys: %v", err)) + for idx := range configs { + configs[idx].Nodes = nodes } - err = os.WriteFile(*flagAccountConfigFile, bytes, 0644) - if err != nil { - panic(fmt.Sprintf("could not write the generated nodes to file: %v", err)) + // saving configs + configsPath := fmt.Sprintf("%s/configs", *flagEtcPath) + createDir := func() { + err := os.Mkdir(configsPath, os.ModePerm) + if err != nil { + panic(fmt.Sprintf("failed to create the configs directory: %v", err)) + } + } + if _, err := os.Stat(configsPath); os.IsNotExist(err) { + createDir() + } else { + err = os.RemoveAll(configsPath) + if err != nil { + panic(fmt.Sprintf("failed to remove the configs directory: %v", err)) + } + createDir() + } + for _, cfg := range configs { + path := fmt.Sprintf("%s/%s.yml", configsPath, cfg.Account.PeerId) + bytes, err := yaml.Marshal(cfg) + if err != nil { + panic(fmt.Sprintf("could not marshal the keys: %v", err)) + } + + err = os.WriteFile(path, bytes, os.ModePerm) + if err != nil { + panic(fmt.Sprintf("could not write the config to file: %v", err)) + } } } -func genRandomNodeKeys(address string, encKeyDecoder keys.Decoder, signKeyDecoder keys.Decoder) (*config.Node, error) { +func genConfig(addresses []string, apiPort string) (config.Config, error) { encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048) if err != nil { - return nil, err + return config.Config{}, err } signKey, _, err := signingkey.GenerateRandomEd25519KeyPair() if err != nil { - return nil, err + return config.Config{}, err } + encKeyDecoder := encryptionkey.NewRSAPrivKeyDecoder() + signKeyDecoder := signingkey.NewEDPrivKeyDecoder() + encEncKey, err := encKeyDecoder.EncodeToString(encKey) if err != nil { - return nil, err + return config.Config{}, err } encSignKey, err := signKeyDecoder.EncodeToString(signKey) if err != nil { - return nil, err + return config.Config{}, err } - return &config.Node{ - Alias: randString(5), - Address: address, - SigningKey: encSignKey, - EncryptionKey: encEncKey, + peerID, err := peer.IDFromSigningPubKey(signKey.GetPublic()) + if err != nil { + return config.Config{}, err + } + + return config.Config{ + Anytype: config.Anytype{SwarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec"}, + GrpcServer: config.GrpcServer{ + ListenAddrs: addresses, + TLS: false, + }, + Account: config.Account{ + PeerId: peerID.String(), + SigningKey: encSignKey, + EncryptionKey: encEncKey, + }, + APIServer: config.APIServer{ + Port: apiPort, + }, }, nil } - -func randString(n int) string { - const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - - b := make([]byte, n) - for i := 0; i < n; i++ { - idx := rand.Intn(len(letterBytes)) - b[i] = letterBytes[idx] - } - - return string(b) -} diff --git a/cmd/nodesgen/nodemap.yml b/cmd/nodesgen/nodemap.yml new file mode 100644 index 00000000..4107f830 --- /dev/null +++ b/cmd/nodesgen/nodemap.yml @@ -0,0 +1,13 @@ +nodes: + - grpcAddresses: + - "127.0.0.1:4430" + - "127.0.0.1:4431" + apiPort: "8080" + - grpcAddresses: + - "127.0.0.1:4432" + - "127.0.0.1:4433" + apiPort: "8081" + - grpcAddresses: + - "127.0.0.1:4434" + - "127.0.0.1:4435" + apiPort: "8082" diff --git a/config/account.go b/config/account.go new file mode 100644 index 00000000..4525b26f --- /dev/null +++ b/config/account.go @@ -0,0 +1,7 @@ +package config + +type Account struct { + PeerId string `yaml:"peerId"` + SigningKey string `yaml:"signingKey"` + EncryptionKey string `yaml:"encryptionKey"` +} diff --git a/config/api.go b/config/api.go new file mode 100644 index 00000000..25cd3e33 --- /dev/null +++ b/config/api.go @@ -0,0 +1,5 @@ +package config + +type APIServer struct { + Port string `yaml:"port"` +} diff --git a/config/config.go b/config/config.go index f525e67b..1766eec0 100644 --- a/config/config.go +++ b/config/config.go @@ -26,6 +26,9 @@ func NewFromFile(path string) (c *Config, err error) { type Config struct { Anytype Anytype `yaml:"anytype"` GrpcServer GrpcServer `yaml:"grpcServer"` + Account Account `yaml:"account"` + APIServer APIServer `yaml:"apiServer"` + Nodes []Node `yaml:"nodes"` } func (c *Config) Init(ctx context.Context, a *app.App) (err error) { diff --git a/config/grpc.go b/config/grpc.go index 6a4fc426..700c3567 100644 --- a/config/grpc.go +++ b/config/grpc.go @@ -3,6 +3,4 @@ package config type GrpcServer struct { ListenAddrs []string `yaml:"listenAddrs"` TLS bool `yaml:"tls"` - TLSCertFile string `yaml:"tlsCertFile"` - TLSKeyFile string `yaml:"tlsKeyFile"` } diff --git a/config/nodes.go b/config/nodes.go index 510c97c5..932a76a9 100644 --- a/config/nodes.go +++ b/config/nodes.go @@ -1,13 +1,8 @@ package config type Node struct { - Alias string `yaml:"alias"` + PeerId string `yaml:"peerId"` Address string `yaml:"address"` SigningKey string `yaml:"signingKey"` EncryptionKey string `yaml:"encryptionKey"` } - -type NodeInfo struct { - CurrentAlias string `yaml:"currentAlias"` - Nodes []*Node `yaml:"nodes"` -} diff --git a/etc/config.yml b/etc/config.yml index bcf84db6..f66b7fdd 100644 --- a/etc/config.yml +++ b/etc/config.yml @@ -1,9 +1,26 @@ anytype: - swarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec" - + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec grpcServer: listenAddrs: - - "127.0.0.1:4430" - - "127.0.0.1:4431" + - 127.0.0.1:4430 + - 127.0.0.1:4431 tls: false - +account: + peerId: 12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs + signingKey: 3inYSp8q7WidZi7RkhLFNZPF9yMJXHpnyrTpTsE7cd2ggESfTAEpWiQNa8zCnNdzK9DpG6Mu5hDCZhfU6RMDL466H8om + encryptionKey: udNkNsbKtm7eu1Bqt6DUwLZka2Rq22vm33K5eezrMkGnXx8X13oQ8HBSHgkLmRZTC1737hgZ66s92QRNe1YC1v8JNiv6yXVuV3MujBkmrYYVbGB7DBz6REsGAMPmuqDiG5PubjVHP468MDJJYRTZN6VEJuSGZtEAyLBJe9iErRVFsMdNc6ZMbY5pxoYE6LHWbsfZejrnAXvgABTnYTN4ad6EaxRiEWHGACizr59uf3KYFb9hFwxkFMhenpTpxbkBwQp3V8MxV4eLbgsWQPMpfeGeinjmNRAnZfi6tnqSDLyy3RWM5y9W89rYKt3EdVRwcFWFHh8FgSjzhpqE77GEwjGU9ddKorUfW85jQGdd2xdFwQfLF2eTGEwSxX9Gz2fTTtkN4pNJC8MesKK2cRsLAZLb9rv5ebCMgQ3S86WjfbWRcEYLoKUWKjujiY1XT5GszTgSa2b68QpcDmqgUv7FiwcZwC5qaCsgoARZ2GGsPgW7mCBahxTJnor4dCLF9Aiz1YvFvwWzm8k9zUmY5pxPQFNSWfAAcodqEHJV6i9TSf5ERNLJCQiRTSStZZdoeqAf42sYCSdiaiVUc26Q7QcTxtxxpfCTqGc2Lgh6ofgwG1m2CfmhXTsBDwBFRc8q6TcGJ4fT4WuZXF9f4MhKHqgqppFKMWYyvtJyvypbJ735kU63UWWSMCo8BbVTRrtaq7bPHbgvHHWYso5o7PeqNuhD2YwTKd6wpbAeg8wpv3eEWB2sgotQ5JiW2itEyinLZHRpLvbtYGFWctsZisvBbCssiCsPqzG1DffZWNjt2nj1vztuapZLpz9azanCaXhFxLBBLVveEk4tvEknHtREwXtmTpQK5GqpmW9LTFqA5jj7fVtytYQFufe9Cp4HKNNodv1UCPQ1KTLwkwA6UEMwqamvE67GDDvjmE2XaMoq6ErEYX6FkQi2d9kbLJaFVGwYH3DVcbBGAJzSoeYceosuoQJBcKS19BhFqXWT1W3iKvMibadh8MYLim7ncxezuHFCyUPFnFn33kfzzTWTsFYbKDukCECRBKciptevx9zS6V2YiSgcYRWV7Rd8sNg8vAGUBQ6mLBtWNExn5gRkoBQDqN9BhfqpEbGo33JHb7GVLsN7um9VxKcTSkiDLPKTxijNevHeRWRbtbCvQ31WHaNLzihnsowVQMk8SV6CiqzqwUb4ETxiXCDHABGuCACcYVC2jgEoFuqSAwS6c2y5sfcjxWSe3hs9eLjyWmeHu75MbNcJN8EtBrLs4j2tWGtbq6BR7SYVcygUbscf75HKncC4YBkF1MWRHmos11ZKaCwLfjsTW6XUXdfhvpco6mxic8muiq5XA3G8x47stQ3eBoSXoehRAMd4FKNv9geDagAhjorfcMd7kCT5CEENMqCLpjtUsFXSGtjqpYg1aeaQsxdEszfw2LS5pvPQEnYmqMRxZsuYHbuAH4J7sQwvjn7ezWfpsJfwQT6EqDFJp4g6vcgfUeCYzim9DVDnJYWocL9Uzb9P3rvknDKZmAkFWgTVWq16GaX4xUsXVNLMkDm88q4vvxrCQyAerNzox27uF2yH1ca66pVu9GZkGHM1KJrNmyyYEm445wNgkgSx8ivhyC11SUKs3nTKNVrnc +apiServer: + port: "8080" +nodes: + - peerId: 12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs + address: 127.0.0.1:4430 + signingKey: 3inYSp8q7WidZi7RkhLFNZPF9yMJXHpnyrTpTsE7cd2ggESfTAEpWiQNa8zCnNdzK9DpG6Mu5hDCZhfU6RMDL466H8om + encryptionKey: udNkNsbKtm7eu1Bqt6DUwLZka2Rq22vm33K5eezrMkGnXx8X13oQ8HBSHgkLmRZTC1737hgZ66s92QRNe1YC1v8JNiv6yXVuV3MujBkmrYYVbGB7DBz6REsGAMPmuqDiG5PubjVHP468MDJJYRTZN6VEJuSGZtEAyLBJe9iErRVFsMdNc6ZMbY5pxoYE6LHWbsfZejrnAXvgABTnYTN4ad6EaxRiEWHGACizr59uf3KYFb9hFwxkFMhenpTpxbkBwQp3V8MxV4eLbgsWQPMpfeGeinjmNRAnZfi6tnqSDLyy3RWM5y9W89rYKt3EdVRwcFWFHh8FgSjzhpqE77GEwjGU9ddKorUfW85jQGdd2xdFwQfLF2eTGEwSxX9Gz2fTTtkN4pNJC8MesKK2cRsLAZLb9rv5ebCMgQ3S86WjfbWRcEYLoKUWKjujiY1XT5GszTgSa2b68QpcDmqgUv7FiwcZwC5qaCsgoARZ2GGsPgW7mCBahxTJnor4dCLF9Aiz1YvFvwWzm8k9zUmY5pxPQFNSWfAAcodqEHJV6i9TSf5ERNLJCQiRTSStZZdoeqAf42sYCSdiaiVUc26Q7QcTxtxxpfCTqGc2Lgh6ofgwG1m2CfmhXTsBDwBFRc8q6TcGJ4fT4WuZXF9f4MhKHqgqppFKMWYyvtJyvypbJ735kU63UWWSMCo8BbVTRrtaq7bPHbgvHHWYso5o7PeqNuhD2YwTKd6wpbAeg8wpv3eEWB2sgotQ5JiW2itEyinLZHRpLvbtYGFWctsZisvBbCssiCsPqzG1DffZWNjt2nj1vztuapZLpz9azanCaXhFxLBBLVveEk4tvEknHtREwXtmTpQK5GqpmW9LTFqA5jj7fVtytYQFufe9Cp4HKNNodv1UCPQ1KTLwkwA6UEMwqamvE67GDDvjmE2XaMoq6ErEYX6FkQi2d9kbLJaFVGwYH3DVcbBGAJzSoeYceosuoQJBcKS19BhFqXWT1W3iKvMibadh8MYLim7ncxezuHFCyUPFnFn33kfzzTWTsFYbKDukCECRBKciptevx9zS6V2YiSgcYRWV7Rd8sNg8vAGUBQ6mLBtWNExn5gRkoBQDqN9BhfqpEbGo33JHb7GVLsN7um9VxKcTSkiDLPKTxijNevHeRWRbtbCvQ31WHaNLzihnsowVQMk8SV6CiqzqwUb4ETxiXCDHABGuCACcYVC2jgEoFuqSAwS6c2y5sfcjxWSe3hs9eLjyWmeHu75MbNcJN8EtBrLs4j2tWGtbq6BR7SYVcygUbscf75HKncC4YBkF1MWRHmos11ZKaCwLfjsTW6XUXdfhvpco6mxic8muiq5XA3G8x47stQ3eBoSXoehRAMd4FKNv9geDagAhjorfcMd7kCT5CEENMqCLpjtUsFXSGtjqpYg1aeaQsxdEszfw2LS5pvPQEnYmqMRxZsuYHbuAH4J7sQwvjn7ezWfpsJfwQT6EqDFJp4g6vcgfUeCYzim9DVDnJYWocL9Uzb9P3rvknDKZmAkFWgTVWq16GaX4xUsXVNLMkDm88q4vvxrCQyAerNzox27uF2yH1ca66pVu9GZkGHM1KJrNmyyYEm445wNgkgSx8ivhyC11SUKs3nTKNVrnc + - peerId: 12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx + address: 127.0.0.1:4432 + signingKey: 3i7TZgCtctChP9rA13BDuK2GmdbRL6sgk51JjetKyFt3SEqXN8M4EwcREWVfPYmayBKYPHveLzY7NsggxvKapJFdYH8F + encryptionKey: JgG4CcCbae1qEpe7mL87XWScKZWBBqSZseakgKVJfHqTUt3CiLPMKPDZtzQWLfb2ouiTbff5YTBZbGxwKqWYMAW8prEVjbcXBtkCi2Y2XkZ8v1ugidF5MC3d1ifnh5Es5CafB8kToUegtAig8vhMCuXAzLQpbiQyFLf25KcyKfVvHUomafaHyKCbYu1bmyGRC7CGxUD6jnPg2MYZZiJiq9scNRaRxbiqCe9C2VcUTFdigV65eGmZPKGgfAThcyKCdQSe1hmoXtNw5MaqbB3eQvkuS4GySap3SaEZUmGsmuVumUvHappUpN8x3UQs1TNWfYxULVx3tUMHfQ98G9No4gwP42ENMgCuMVQW9M68s73WCGucvpPUZdvQFiSJkSoKDqi2F6zdrM2LZTp8qGciunKDFZvh14eAGDbPLw9dBLVmMQLKq68yz8Nzi9BYWjzLa4fDNkoYETB8rArNPECAjVVW6PYLzueVNmqvo7RdWZGHF2YCRXr1wLG7jg4WBX4Lm5jQZS8bkWacbpj49b4nxRnjLsGusdCwRCZPY9qFPim2WU4z2KEgRS87x97TiYAThLUJwGBv5pBKRLkrAAoFWwkDSfxcRt83FiZtJ1hLWkpj6fK56SuubQUjWzNfVPCTfNqcod54PAPVESTuAPjDsmM4YeMGgUpaK9Goqbu1FuuZ9P6mQPwGKdpGuVgjJv7uQJZw3fpC9H1vJ4fa2wBrGFkahyEFo2QDb8iG9oGarpFxewJVVs12cpKJeQzU5dLFBvQJmGnHASTnBwfNBieDT7ZeFmnGuN7sLaPJ5wgdKJpY6aAooztyWfJPKTbxzYjUQMVoyW3YbTD3qg8F9grqVT1VFAp88ta1u55eokqz7h82EJNQf7GptDHxPRg4euAJ3BDvmRUfAwYzU8TD1gyiUnnHGRuvH25xgJRqauNrDLUbha33wVAHeMzWJhpLjLz4DLmtLejpfwNr5PuEbczqFAaLspf8dFjkrvmC3RrwHngKuzTkYo46WSJggWs3CwWDpzMmrATh2LRYmdH7BtNUkvu7onRzms8jWHBsFNfbCitMpfAsM3XmgtFUGTMi4LzVK3f5G8HqwGqcVEnFJTZzdoBsfNMKyFapXPnUBUHQse8jZjSYQv3dJpVuTV6HQ5R8saBdKDGMpXFyYqZK85cikcK6Nkd7ZrnbUUN2i6f3ano7hnxTbeW7kGxatUWETTwAzwGjdMhpJjieLFBTomAqqfXopEr1FeWcFmQ6kYBL2fa6XYqhZJevG6LpNXeuLcbyTiADt5CMNwt6MTmEomqtzqE7BgvqYEibuEj5K22ufvvLmX7XbGiB7wZKRPGuTR1pPDgJbzU9HGmF5fWjTVGPeNMn7ZmbQVcys6xy79notYp6MoQhBCTWyuuEuc24REEfMCjPuhNgssJQWT3ZR3xskrcEdCUyGbvQT2eWVa6atYsu5Z2m7sGXXwfH7vhdiUkVZEmhNPusij7dsMa9io63D6itYuu8Ed5aZYoUkZCfKZ39KQ16rtYpa9mfcwG4fyQy11Zy9G7nxdNJohGYeq3xuerSdwTDNdK2PREJcAoNA7Nfcsxk7333B5gXNFZKcBLQk56C1PqApLerSfo3jVuojcNAxYB688K6 + - peerId: 12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze + address: 127.0.0.1:4434 + signingKey: 3iPPhpw3jndkSCvpZ4yf5eWYydZwbFAk7gdMkXZBgyh939AicHVakwkabDpxzhtrsgJEXrP5sKam9QL7weMyyoMrKNCH + encryptionKey: JgG4CcCbae1qEpe7mL5br9LinoxiiuQqGC7y6HBbvmQ9pcZM4F4q2oGDQA71ZumaTJ1RAiUDaxi1fBVnrvv4Tqm9fau3NyijggQ246UtHKemsPFBX9Qyv4oYZJ9X3WNNc9q3BkPX9C8WHdfda9fxW4wD1QYKzd5F1J7FdhxZh3MZUdc4GEfPLwew8dTfEJp7ipAvM7TY1r6URe4VHVmsdaEL3jsEUzEqL4MRSc69WdjdKZLyVzQVcjnLegFfoH2c6476MfnoPggeVGghPjDmoqoJ2kzHwjvDQKoGyC9m4wkicS4YZkVA6N2ezKBSumJkV1mY6hpBPuCtdYLDw2zsCqMq9AXFhtMxzSCtLLRnRVntErY3Wb8ty5vEnS8aY7B612okwdsMg2rYxP55ccK4zP7PoKTKTS4TWTqGiLW2GtptTLhQ7ynJudG9YArzwwjgqXaxExrMqFCSMCfQbVNvwv3SckfpwQjpJjCfRS73SQKPY8ghqrdKnuRHyUWpJbYb9y5doCWMCuLw6u6t2LqfcwknNkjoWNCG69tohSgRStbYfmA7AZvHzPGc3gKByZecVxdmvPmtbSLXRiB9FbqtuqEerGxpisL3FhDM6SVqxRm2E2SxwJTHVcyL2LNF5tE2V7mujSa5dwzZfbRA9p3SwFeRhd42z1r36iL92yugfa2SbHYYDhdKFCJLhMc8ogqd1b8oUBbwBktKg6p6MJeZdqS2vfsLQRnV8TyP72fKUjFtaQ4o7D6vQ9VnsBMQS9FF8PEuZ5yF3XQaMjJMpeGho3c4dNFEw4vCiUaVN2WzF7XR28dyGwLASMoVFuUoErgr7TUQm4yKJG8QaHePx7A7Ku3Ys6fvrDsBVJWz5taQB7cMBqXmrAg2DHSUwqr8XfhxXnv8cnZZzPTrtib86P7w3kUYLrJYaR6jur5jTFucFSxthKEMqzBPtS3wgn2hcj31ATSNR7FNDcZmteWex5vAzGkuDoCG4c7dUCGinT3akYvukR7WugdHAYySkhf6AhNGg4wrZ7y3YVRMwRkex3PumcwGGKoTvNMNMqz2kTCNjSsDr6xRBk8njCLwDMunvDZM7VThTMKQ4CvegCtX3kV11qk46WjouqFedYSmShmxB5dMMVKui3owicS3ioVXoSqCRAcov3LJ3zL5aQ19FBBvvezeN27PkcZjvXKQwNEpnMzJeLTLdz8guWrER9Vn7XB3zgvt6xzab8JbHJ62XEEGFC5EoU68D3Wn9oXH6EqfCNbUsfW6EScc7wcsRu7aLi4ddjYrDcd4pQgct3dpAzR9Z4ZHRgQi9k4DF8bg9LUjfjaJS53DGSiSSfGBNtkpdyLp8K8Y89BZRnw21yVcKwA8JD47By6s3vfJ8PdSTs4Lsfm7mEhERuVLyQC9wpPe6ysjzUTQjx7RyTaVVA9ENQfpc1XCdHufDFST1eeiRFLwKzEFCr2bATo5r5oQ6UtBdQv6eFaGv19ju4cikXTNq2vCGw6aMupdaESYeWL5Gs8ssCjb1K2iZfGwqidfTJejEiuoiD2S6shTRv6BFz3JrhU7XsZdLkU9rvDYJs6rWq4C4ix4VWDxNHktF7iBuCASnZjgMYs9Lipt5hZEow4FrWcvUtVQ8PXQT3SC diff --git a/etc/configs/12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze.yml b/etc/configs/12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze.yml new file mode 100755 index 00000000..a16fec73 --- /dev/null +++ b/etc/configs/12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze.yml @@ -0,0 +1,26 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4434 + - 127.0.0.1:4435 + tls: false +account: + peerId: 12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze + signingKey: 3iPPhpw3jndkSCvpZ4yf5eWYydZwbFAk7gdMkXZBgyh939AicHVakwkabDpxzhtrsgJEXrP5sKam9QL7weMyyoMrKNCH + encryptionKey: JgG4CcCbae1qEpe7mL5br9LinoxiiuQqGC7y6HBbvmQ9pcZM4F4q2oGDQA71ZumaTJ1RAiUDaxi1fBVnrvv4Tqm9fau3NyijggQ246UtHKemsPFBX9Qyv4oYZJ9X3WNNc9q3BkPX9C8WHdfda9fxW4wD1QYKzd5F1J7FdhxZh3MZUdc4GEfPLwew8dTfEJp7ipAvM7TY1r6URe4VHVmsdaEL3jsEUzEqL4MRSc69WdjdKZLyVzQVcjnLegFfoH2c6476MfnoPggeVGghPjDmoqoJ2kzHwjvDQKoGyC9m4wkicS4YZkVA6N2ezKBSumJkV1mY6hpBPuCtdYLDw2zsCqMq9AXFhtMxzSCtLLRnRVntErY3Wb8ty5vEnS8aY7B612okwdsMg2rYxP55ccK4zP7PoKTKTS4TWTqGiLW2GtptTLhQ7ynJudG9YArzwwjgqXaxExrMqFCSMCfQbVNvwv3SckfpwQjpJjCfRS73SQKPY8ghqrdKnuRHyUWpJbYb9y5doCWMCuLw6u6t2LqfcwknNkjoWNCG69tohSgRStbYfmA7AZvHzPGc3gKByZecVxdmvPmtbSLXRiB9FbqtuqEerGxpisL3FhDM6SVqxRm2E2SxwJTHVcyL2LNF5tE2V7mujSa5dwzZfbRA9p3SwFeRhd42z1r36iL92yugfa2SbHYYDhdKFCJLhMc8ogqd1b8oUBbwBktKg6p6MJeZdqS2vfsLQRnV8TyP72fKUjFtaQ4o7D6vQ9VnsBMQS9FF8PEuZ5yF3XQaMjJMpeGho3c4dNFEw4vCiUaVN2WzF7XR28dyGwLASMoVFuUoErgr7TUQm4yKJG8QaHePx7A7Ku3Ys6fvrDsBVJWz5taQB7cMBqXmrAg2DHSUwqr8XfhxXnv8cnZZzPTrtib86P7w3kUYLrJYaR6jur5jTFucFSxthKEMqzBPtS3wgn2hcj31ATSNR7FNDcZmteWex5vAzGkuDoCG4c7dUCGinT3akYvukR7WugdHAYySkhf6AhNGg4wrZ7y3YVRMwRkex3PumcwGGKoTvNMNMqz2kTCNjSsDr6xRBk8njCLwDMunvDZM7VThTMKQ4CvegCtX3kV11qk46WjouqFedYSmShmxB5dMMVKui3owicS3ioVXoSqCRAcov3LJ3zL5aQ19FBBvvezeN27PkcZjvXKQwNEpnMzJeLTLdz8guWrER9Vn7XB3zgvt6xzab8JbHJ62XEEGFC5EoU68D3Wn9oXH6EqfCNbUsfW6EScc7wcsRu7aLi4ddjYrDcd4pQgct3dpAzR9Z4ZHRgQi9k4DF8bg9LUjfjaJS53DGSiSSfGBNtkpdyLp8K8Y89BZRnw21yVcKwA8JD47By6s3vfJ8PdSTs4Lsfm7mEhERuVLyQC9wpPe6ysjzUTQjx7RyTaVVA9ENQfpc1XCdHufDFST1eeiRFLwKzEFCr2bATo5r5oQ6UtBdQv6eFaGv19ju4cikXTNq2vCGw6aMupdaESYeWL5Gs8ssCjb1K2iZfGwqidfTJejEiuoiD2S6shTRv6BFz3JrhU7XsZdLkU9rvDYJs6rWq4C4ix4VWDxNHktF7iBuCASnZjgMYs9Lipt5hZEow4FrWcvUtVQ8PXQT3SC +apiServer: + port: "8082" +nodes: + - peerId: 12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs + address: 127.0.0.1:4430 + signingKey: 3inYSp8q7WidZi7RkhLFNZPF9yMJXHpnyrTpTsE7cd2ggESfTAEpWiQNa8zCnNdzK9DpG6Mu5hDCZhfU6RMDL466H8om + encryptionKey: udNkNsbKtm7eu1Bqt6DUwLZka2Rq22vm33K5eezrMkGnXx8X13oQ8HBSHgkLmRZTC1737hgZ66s92QRNe1YC1v8JNiv6yXVuV3MujBkmrYYVbGB7DBz6REsGAMPmuqDiG5PubjVHP468MDJJYRTZN6VEJuSGZtEAyLBJe9iErRVFsMdNc6ZMbY5pxoYE6LHWbsfZejrnAXvgABTnYTN4ad6EaxRiEWHGACizr59uf3KYFb9hFwxkFMhenpTpxbkBwQp3V8MxV4eLbgsWQPMpfeGeinjmNRAnZfi6tnqSDLyy3RWM5y9W89rYKt3EdVRwcFWFHh8FgSjzhpqE77GEwjGU9ddKorUfW85jQGdd2xdFwQfLF2eTGEwSxX9Gz2fTTtkN4pNJC8MesKK2cRsLAZLb9rv5ebCMgQ3S86WjfbWRcEYLoKUWKjujiY1XT5GszTgSa2b68QpcDmqgUv7FiwcZwC5qaCsgoARZ2GGsPgW7mCBahxTJnor4dCLF9Aiz1YvFvwWzm8k9zUmY5pxPQFNSWfAAcodqEHJV6i9TSf5ERNLJCQiRTSStZZdoeqAf42sYCSdiaiVUc26Q7QcTxtxxpfCTqGc2Lgh6ofgwG1m2CfmhXTsBDwBFRc8q6TcGJ4fT4WuZXF9f4MhKHqgqppFKMWYyvtJyvypbJ735kU63UWWSMCo8BbVTRrtaq7bPHbgvHHWYso5o7PeqNuhD2YwTKd6wpbAeg8wpv3eEWB2sgotQ5JiW2itEyinLZHRpLvbtYGFWctsZisvBbCssiCsPqzG1DffZWNjt2nj1vztuapZLpz9azanCaXhFxLBBLVveEk4tvEknHtREwXtmTpQK5GqpmW9LTFqA5jj7fVtytYQFufe9Cp4HKNNodv1UCPQ1KTLwkwA6UEMwqamvE67GDDvjmE2XaMoq6ErEYX6FkQi2d9kbLJaFVGwYH3DVcbBGAJzSoeYceosuoQJBcKS19BhFqXWT1W3iKvMibadh8MYLim7ncxezuHFCyUPFnFn33kfzzTWTsFYbKDukCECRBKciptevx9zS6V2YiSgcYRWV7Rd8sNg8vAGUBQ6mLBtWNExn5gRkoBQDqN9BhfqpEbGo33JHb7GVLsN7um9VxKcTSkiDLPKTxijNevHeRWRbtbCvQ31WHaNLzihnsowVQMk8SV6CiqzqwUb4ETxiXCDHABGuCACcYVC2jgEoFuqSAwS6c2y5sfcjxWSe3hs9eLjyWmeHu75MbNcJN8EtBrLs4j2tWGtbq6BR7SYVcygUbscf75HKncC4YBkF1MWRHmos11ZKaCwLfjsTW6XUXdfhvpco6mxic8muiq5XA3G8x47stQ3eBoSXoehRAMd4FKNv9geDagAhjorfcMd7kCT5CEENMqCLpjtUsFXSGtjqpYg1aeaQsxdEszfw2LS5pvPQEnYmqMRxZsuYHbuAH4J7sQwvjn7ezWfpsJfwQT6EqDFJp4g6vcgfUeCYzim9DVDnJYWocL9Uzb9P3rvknDKZmAkFWgTVWq16GaX4xUsXVNLMkDm88q4vvxrCQyAerNzox27uF2yH1ca66pVu9GZkGHM1KJrNmyyYEm445wNgkgSx8ivhyC11SUKs3nTKNVrnc + - peerId: 12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx + address: 127.0.0.1:4432 + signingKey: 3i7TZgCtctChP9rA13BDuK2GmdbRL6sgk51JjetKyFt3SEqXN8M4EwcREWVfPYmayBKYPHveLzY7NsggxvKapJFdYH8F + encryptionKey: JgG4CcCbae1qEpe7mL87XWScKZWBBqSZseakgKVJfHqTUt3CiLPMKPDZtzQWLfb2ouiTbff5YTBZbGxwKqWYMAW8prEVjbcXBtkCi2Y2XkZ8v1ugidF5MC3d1ifnh5Es5CafB8kToUegtAig8vhMCuXAzLQpbiQyFLf25KcyKfVvHUomafaHyKCbYu1bmyGRC7CGxUD6jnPg2MYZZiJiq9scNRaRxbiqCe9C2VcUTFdigV65eGmZPKGgfAThcyKCdQSe1hmoXtNw5MaqbB3eQvkuS4GySap3SaEZUmGsmuVumUvHappUpN8x3UQs1TNWfYxULVx3tUMHfQ98G9No4gwP42ENMgCuMVQW9M68s73WCGucvpPUZdvQFiSJkSoKDqi2F6zdrM2LZTp8qGciunKDFZvh14eAGDbPLw9dBLVmMQLKq68yz8Nzi9BYWjzLa4fDNkoYETB8rArNPECAjVVW6PYLzueVNmqvo7RdWZGHF2YCRXr1wLG7jg4WBX4Lm5jQZS8bkWacbpj49b4nxRnjLsGusdCwRCZPY9qFPim2WU4z2KEgRS87x97TiYAThLUJwGBv5pBKRLkrAAoFWwkDSfxcRt83FiZtJ1hLWkpj6fK56SuubQUjWzNfVPCTfNqcod54PAPVESTuAPjDsmM4YeMGgUpaK9Goqbu1FuuZ9P6mQPwGKdpGuVgjJv7uQJZw3fpC9H1vJ4fa2wBrGFkahyEFo2QDb8iG9oGarpFxewJVVs12cpKJeQzU5dLFBvQJmGnHASTnBwfNBieDT7ZeFmnGuN7sLaPJ5wgdKJpY6aAooztyWfJPKTbxzYjUQMVoyW3YbTD3qg8F9grqVT1VFAp88ta1u55eokqz7h82EJNQf7GptDHxPRg4euAJ3BDvmRUfAwYzU8TD1gyiUnnHGRuvH25xgJRqauNrDLUbha33wVAHeMzWJhpLjLz4DLmtLejpfwNr5PuEbczqFAaLspf8dFjkrvmC3RrwHngKuzTkYo46WSJggWs3CwWDpzMmrATh2LRYmdH7BtNUkvu7onRzms8jWHBsFNfbCitMpfAsM3XmgtFUGTMi4LzVK3f5G8HqwGqcVEnFJTZzdoBsfNMKyFapXPnUBUHQse8jZjSYQv3dJpVuTV6HQ5R8saBdKDGMpXFyYqZK85cikcK6Nkd7ZrnbUUN2i6f3ano7hnxTbeW7kGxatUWETTwAzwGjdMhpJjieLFBTomAqqfXopEr1FeWcFmQ6kYBL2fa6XYqhZJevG6LpNXeuLcbyTiADt5CMNwt6MTmEomqtzqE7BgvqYEibuEj5K22ufvvLmX7XbGiB7wZKRPGuTR1pPDgJbzU9HGmF5fWjTVGPeNMn7ZmbQVcys6xy79notYp6MoQhBCTWyuuEuc24REEfMCjPuhNgssJQWT3ZR3xskrcEdCUyGbvQT2eWVa6atYsu5Z2m7sGXXwfH7vhdiUkVZEmhNPusij7dsMa9io63D6itYuu8Ed5aZYoUkZCfKZ39KQ16rtYpa9mfcwG4fyQy11Zy9G7nxdNJohGYeq3xuerSdwTDNdK2PREJcAoNA7Nfcsxk7333B5gXNFZKcBLQk56C1PqApLerSfo3jVuojcNAxYB688K6 + - peerId: 12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze + address: 127.0.0.1:4434 + signingKey: 3iPPhpw3jndkSCvpZ4yf5eWYydZwbFAk7gdMkXZBgyh939AicHVakwkabDpxzhtrsgJEXrP5sKam9QL7weMyyoMrKNCH + encryptionKey: JgG4CcCbae1qEpe7mL5br9LinoxiiuQqGC7y6HBbvmQ9pcZM4F4q2oGDQA71ZumaTJ1RAiUDaxi1fBVnrvv4Tqm9fau3NyijggQ246UtHKemsPFBX9Qyv4oYZJ9X3WNNc9q3BkPX9C8WHdfda9fxW4wD1QYKzd5F1J7FdhxZh3MZUdc4GEfPLwew8dTfEJp7ipAvM7TY1r6URe4VHVmsdaEL3jsEUzEqL4MRSc69WdjdKZLyVzQVcjnLegFfoH2c6476MfnoPggeVGghPjDmoqoJ2kzHwjvDQKoGyC9m4wkicS4YZkVA6N2ezKBSumJkV1mY6hpBPuCtdYLDw2zsCqMq9AXFhtMxzSCtLLRnRVntErY3Wb8ty5vEnS8aY7B612okwdsMg2rYxP55ccK4zP7PoKTKTS4TWTqGiLW2GtptTLhQ7ynJudG9YArzwwjgqXaxExrMqFCSMCfQbVNvwv3SckfpwQjpJjCfRS73SQKPY8ghqrdKnuRHyUWpJbYb9y5doCWMCuLw6u6t2LqfcwknNkjoWNCG69tohSgRStbYfmA7AZvHzPGc3gKByZecVxdmvPmtbSLXRiB9FbqtuqEerGxpisL3FhDM6SVqxRm2E2SxwJTHVcyL2LNF5tE2V7mujSa5dwzZfbRA9p3SwFeRhd42z1r36iL92yugfa2SbHYYDhdKFCJLhMc8ogqd1b8oUBbwBktKg6p6MJeZdqS2vfsLQRnV8TyP72fKUjFtaQ4o7D6vQ9VnsBMQS9FF8PEuZ5yF3XQaMjJMpeGho3c4dNFEw4vCiUaVN2WzF7XR28dyGwLASMoVFuUoErgr7TUQm4yKJG8QaHePx7A7Ku3Ys6fvrDsBVJWz5taQB7cMBqXmrAg2DHSUwqr8XfhxXnv8cnZZzPTrtib86P7w3kUYLrJYaR6jur5jTFucFSxthKEMqzBPtS3wgn2hcj31ATSNR7FNDcZmteWex5vAzGkuDoCG4c7dUCGinT3akYvukR7WugdHAYySkhf6AhNGg4wrZ7y3YVRMwRkex3PumcwGGKoTvNMNMqz2kTCNjSsDr6xRBk8njCLwDMunvDZM7VThTMKQ4CvegCtX3kV11qk46WjouqFedYSmShmxB5dMMVKui3owicS3ioVXoSqCRAcov3LJ3zL5aQ19FBBvvezeN27PkcZjvXKQwNEpnMzJeLTLdz8guWrER9Vn7XB3zgvt6xzab8JbHJ62XEEGFC5EoU68D3Wn9oXH6EqfCNbUsfW6EScc7wcsRu7aLi4ddjYrDcd4pQgct3dpAzR9Z4ZHRgQi9k4DF8bg9LUjfjaJS53DGSiSSfGBNtkpdyLp8K8Y89BZRnw21yVcKwA8JD47By6s3vfJ8PdSTs4Lsfm7mEhERuVLyQC9wpPe6ysjzUTQjx7RyTaVVA9ENQfpc1XCdHufDFST1eeiRFLwKzEFCr2bATo5r5oQ6UtBdQv6eFaGv19ju4cikXTNq2vCGw6aMupdaESYeWL5Gs8ssCjb1K2iZfGwqidfTJejEiuoiD2S6shTRv6BFz3JrhU7XsZdLkU9rvDYJs6rWq4C4ix4VWDxNHktF7iBuCASnZjgMYs9Lipt5hZEow4FrWcvUtVQ8PXQT3SC diff --git a/etc/configs/12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs.yml b/etc/configs/12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs.yml new file mode 100755 index 00000000..3cf26367 --- /dev/null +++ b/etc/configs/12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs.yml @@ -0,0 +1,26 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4430 + - 127.0.0.1:4431 + tls: false +account: + peerId: 12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs + signingKey: 3inYSp8q7WidZi7RkhLFNZPF9yMJXHpnyrTpTsE7cd2ggESfTAEpWiQNa8zCnNdzK9DpG6Mu5hDCZhfU6RMDL466H8om + encryptionKey: udNkNsbKtm7eu1Bqt6DUwLZka2Rq22vm33K5eezrMkGnXx8X13oQ8HBSHgkLmRZTC1737hgZ66s92QRNe1YC1v8JNiv6yXVuV3MujBkmrYYVbGB7DBz6REsGAMPmuqDiG5PubjVHP468MDJJYRTZN6VEJuSGZtEAyLBJe9iErRVFsMdNc6ZMbY5pxoYE6LHWbsfZejrnAXvgABTnYTN4ad6EaxRiEWHGACizr59uf3KYFb9hFwxkFMhenpTpxbkBwQp3V8MxV4eLbgsWQPMpfeGeinjmNRAnZfi6tnqSDLyy3RWM5y9W89rYKt3EdVRwcFWFHh8FgSjzhpqE77GEwjGU9ddKorUfW85jQGdd2xdFwQfLF2eTGEwSxX9Gz2fTTtkN4pNJC8MesKK2cRsLAZLb9rv5ebCMgQ3S86WjfbWRcEYLoKUWKjujiY1XT5GszTgSa2b68QpcDmqgUv7FiwcZwC5qaCsgoARZ2GGsPgW7mCBahxTJnor4dCLF9Aiz1YvFvwWzm8k9zUmY5pxPQFNSWfAAcodqEHJV6i9TSf5ERNLJCQiRTSStZZdoeqAf42sYCSdiaiVUc26Q7QcTxtxxpfCTqGc2Lgh6ofgwG1m2CfmhXTsBDwBFRc8q6TcGJ4fT4WuZXF9f4MhKHqgqppFKMWYyvtJyvypbJ735kU63UWWSMCo8BbVTRrtaq7bPHbgvHHWYso5o7PeqNuhD2YwTKd6wpbAeg8wpv3eEWB2sgotQ5JiW2itEyinLZHRpLvbtYGFWctsZisvBbCssiCsPqzG1DffZWNjt2nj1vztuapZLpz9azanCaXhFxLBBLVveEk4tvEknHtREwXtmTpQK5GqpmW9LTFqA5jj7fVtytYQFufe9Cp4HKNNodv1UCPQ1KTLwkwA6UEMwqamvE67GDDvjmE2XaMoq6ErEYX6FkQi2d9kbLJaFVGwYH3DVcbBGAJzSoeYceosuoQJBcKS19BhFqXWT1W3iKvMibadh8MYLim7ncxezuHFCyUPFnFn33kfzzTWTsFYbKDukCECRBKciptevx9zS6V2YiSgcYRWV7Rd8sNg8vAGUBQ6mLBtWNExn5gRkoBQDqN9BhfqpEbGo33JHb7GVLsN7um9VxKcTSkiDLPKTxijNevHeRWRbtbCvQ31WHaNLzihnsowVQMk8SV6CiqzqwUb4ETxiXCDHABGuCACcYVC2jgEoFuqSAwS6c2y5sfcjxWSe3hs9eLjyWmeHu75MbNcJN8EtBrLs4j2tWGtbq6BR7SYVcygUbscf75HKncC4YBkF1MWRHmos11ZKaCwLfjsTW6XUXdfhvpco6mxic8muiq5XA3G8x47stQ3eBoSXoehRAMd4FKNv9geDagAhjorfcMd7kCT5CEENMqCLpjtUsFXSGtjqpYg1aeaQsxdEszfw2LS5pvPQEnYmqMRxZsuYHbuAH4J7sQwvjn7ezWfpsJfwQT6EqDFJp4g6vcgfUeCYzim9DVDnJYWocL9Uzb9P3rvknDKZmAkFWgTVWq16GaX4xUsXVNLMkDm88q4vvxrCQyAerNzox27uF2yH1ca66pVu9GZkGHM1KJrNmyyYEm445wNgkgSx8ivhyC11SUKs3nTKNVrnc +apiServer: + port: "8080" +nodes: + - peerId: 12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs + address: 127.0.0.1:4430 + signingKey: 3inYSp8q7WidZi7RkhLFNZPF9yMJXHpnyrTpTsE7cd2ggESfTAEpWiQNa8zCnNdzK9DpG6Mu5hDCZhfU6RMDL466H8om + encryptionKey: udNkNsbKtm7eu1Bqt6DUwLZka2Rq22vm33K5eezrMkGnXx8X13oQ8HBSHgkLmRZTC1737hgZ66s92QRNe1YC1v8JNiv6yXVuV3MujBkmrYYVbGB7DBz6REsGAMPmuqDiG5PubjVHP468MDJJYRTZN6VEJuSGZtEAyLBJe9iErRVFsMdNc6ZMbY5pxoYE6LHWbsfZejrnAXvgABTnYTN4ad6EaxRiEWHGACizr59uf3KYFb9hFwxkFMhenpTpxbkBwQp3V8MxV4eLbgsWQPMpfeGeinjmNRAnZfi6tnqSDLyy3RWM5y9W89rYKt3EdVRwcFWFHh8FgSjzhpqE77GEwjGU9ddKorUfW85jQGdd2xdFwQfLF2eTGEwSxX9Gz2fTTtkN4pNJC8MesKK2cRsLAZLb9rv5ebCMgQ3S86WjfbWRcEYLoKUWKjujiY1XT5GszTgSa2b68QpcDmqgUv7FiwcZwC5qaCsgoARZ2GGsPgW7mCBahxTJnor4dCLF9Aiz1YvFvwWzm8k9zUmY5pxPQFNSWfAAcodqEHJV6i9TSf5ERNLJCQiRTSStZZdoeqAf42sYCSdiaiVUc26Q7QcTxtxxpfCTqGc2Lgh6ofgwG1m2CfmhXTsBDwBFRc8q6TcGJ4fT4WuZXF9f4MhKHqgqppFKMWYyvtJyvypbJ735kU63UWWSMCo8BbVTRrtaq7bPHbgvHHWYso5o7PeqNuhD2YwTKd6wpbAeg8wpv3eEWB2sgotQ5JiW2itEyinLZHRpLvbtYGFWctsZisvBbCssiCsPqzG1DffZWNjt2nj1vztuapZLpz9azanCaXhFxLBBLVveEk4tvEknHtREwXtmTpQK5GqpmW9LTFqA5jj7fVtytYQFufe9Cp4HKNNodv1UCPQ1KTLwkwA6UEMwqamvE67GDDvjmE2XaMoq6ErEYX6FkQi2d9kbLJaFVGwYH3DVcbBGAJzSoeYceosuoQJBcKS19BhFqXWT1W3iKvMibadh8MYLim7ncxezuHFCyUPFnFn33kfzzTWTsFYbKDukCECRBKciptevx9zS6V2YiSgcYRWV7Rd8sNg8vAGUBQ6mLBtWNExn5gRkoBQDqN9BhfqpEbGo33JHb7GVLsN7um9VxKcTSkiDLPKTxijNevHeRWRbtbCvQ31WHaNLzihnsowVQMk8SV6CiqzqwUb4ETxiXCDHABGuCACcYVC2jgEoFuqSAwS6c2y5sfcjxWSe3hs9eLjyWmeHu75MbNcJN8EtBrLs4j2tWGtbq6BR7SYVcygUbscf75HKncC4YBkF1MWRHmos11ZKaCwLfjsTW6XUXdfhvpco6mxic8muiq5XA3G8x47stQ3eBoSXoehRAMd4FKNv9geDagAhjorfcMd7kCT5CEENMqCLpjtUsFXSGtjqpYg1aeaQsxdEszfw2LS5pvPQEnYmqMRxZsuYHbuAH4J7sQwvjn7ezWfpsJfwQT6EqDFJp4g6vcgfUeCYzim9DVDnJYWocL9Uzb9P3rvknDKZmAkFWgTVWq16GaX4xUsXVNLMkDm88q4vvxrCQyAerNzox27uF2yH1ca66pVu9GZkGHM1KJrNmyyYEm445wNgkgSx8ivhyC11SUKs3nTKNVrnc + - peerId: 12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx + address: 127.0.0.1:4432 + signingKey: 3i7TZgCtctChP9rA13BDuK2GmdbRL6sgk51JjetKyFt3SEqXN8M4EwcREWVfPYmayBKYPHveLzY7NsggxvKapJFdYH8F + encryptionKey: JgG4CcCbae1qEpe7mL87XWScKZWBBqSZseakgKVJfHqTUt3CiLPMKPDZtzQWLfb2ouiTbff5YTBZbGxwKqWYMAW8prEVjbcXBtkCi2Y2XkZ8v1ugidF5MC3d1ifnh5Es5CafB8kToUegtAig8vhMCuXAzLQpbiQyFLf25KcyKfVvHUomafaHyKCbYu1bmyGRC7CGxUD6jnPg2MYZZiJiq9scNRaRxbiqCe9C2VcUTFdigV65eGmZPKGgfAThcyKCdQSe1hmoXtNw5MaqbB3eQvkuS4GySap3SaEZUmGsmuVumUvHappUpN8x3UQs1TNWfYxULVx3tUMHfQ98G9No4gwP42ENMgCuMVQW9M68s73WCGucvpPUZdvQFiSJkSoKDqi2F6zdrM2LZTp8qGciunKDFZvh14eAGDbPLw9dBLVmMQLKq68yz8Nzi9BYWjzLa4fDNkoYETB8rArNPECAjVVW6PYLzueVNmqvo7RdWZGHF2YCRXr1wLG7jg4WBX4Lm5jQZS8bkWacbpj49b4nxRnjLsGusdCwRCZPY9qFPim2WU4z2KEgRS87x97TiYAThLUJwGBv5pBKRLkrAAoFWwkDSfxcRt83FiZtJ1hLWkpj6fK56SuubQUjWzNfVPCTfNqcod54PAPVESTuAPjDsmM4YeMGgUpaK9Goqbu1FuuZ9P6mQPwGKdpGuVgjJv7uQJZw3fpC9H1vJ4fa2wBrGFkahyEFo2QDb8iG9oGarpFxewJVVs12cpKJeQzU5dLFBvQJmGnHASTnBwfNBieDT7ZeFmnGuN7sLaPJ5wgdKJpY6aAooztyWfJPKTbxzYjUQMVoyW3YbTD3qg8F9grqVT1VFAp88ta1u55eokqz7h82EJNQf7GptDHxPRg4euAJ3BDvmRUfAwYzU8TD1gyiUnnHGRuvH25xgJRqauNrDLUbha33wVAHeMzWJhpLjLz4DLmtLejpfwNr5PuEbczqFAaLspf8dFjkrvmC3RrwHngKuzTkYo46WSJggWs3CwWDpzMmrATh2LRYmdH7BtNUkvu7onRzms8jWHBsFNfbCitMpfAsM3XmgtFUGTMi4LzVK3f5G8HqwGqcVEnFJTZzdoBsfNMKyFapXPnUBUHQse8jZjSYQv3dJpVuTV6HQ5R8saBdKDGMpXFyYqZK85cikcK6Nkd7ZrnbUUN2i6f3ano7hnxTbeW7kGxatUWETTwAzwGjdMhpJjieLFBTomAqqfXopEr1FeWcFmQ6kYBL2fa6XYqhZJevG6LpNXeuLcbyTiADt5CMNwt6MTmEomqtzqE7BgvqYEibuEj5K22ufvvLmX7XbGiB7wZKRPGuTR1pPDgJbzU9HGmF5fWjTVGPeNMn7ZmbQVcys6xy79notYp6MoQhBCTWyuuEuc24REEfMCjPuhNgssJQWT3ZR3xskrcEdCUyGbvQT2eWVa6atYsu5Z2m7sGXXwfH7vhdiUkVZEmhNPusij7dsMa9io63D6itYuu8Ed5aZYoUkZCfKZ39KQ16rtYpa9mfcwG4fyQy11Zy9G7nxdNJohGYeq3xuerSdwTDNdK2PREJcAoNA7Nfcsxk7333B5gXNFZKcBLQk56C1PqApLerSfo3jVuojcNAxYB688K6 + - peerId: 12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze + address: 127.0.0.1:4434 + signingKey: 3iPPhpw3jndkSCvpZ4yf5eWYydZwbFAk7gdMkXZBgyh939AicHVakwkabDpxzhtrsgJEXrP5sKam9QL7weMyyoMrKNCH + encryptionKey: JgG4CcCbae1qEpe7mL5br9LinoxiiuQqGC7y6HBbvmQ9pcZM4F4q2oGDQA71ZumaTJ1RAiUDaxi1fBVnrvv4Tqm9fau3NyijggQ246UtHKemsPFBX9Qyv4oYZJ9X3WNNc9q3BkPX9C8WHdfda9fxW4wD1QYKzd5F1J7FdhxZh3MZUdc4GEfPLwew8dTfEJp7ipAvM7TY1r6URe4VHVmsdaEL3jsEUzEqL4MRSc69WdjdKZLyVzQVcjnLegFfoH2c6476MfnoPggeVGghPjDmoqoJ2kzHwjvDQKoGyC9m4wkicS4YZkVA6N2ezKBSumJkV1mY6hpBPuCtdYLDw2zsCqMq9AXFhtMxzSCtLLRnRVntErY3Wb8ty5vEnS8aY7B612okwdsMg2rYxP55ccK4zP7PoKTKTS4TWTqGiLW2GtptTLhQ7ynJudG9YArzwwjgqXaxExrMqFCSMCfQbVNvwv3SckfpwQjpJjCfRS73SQKPY8ghqrdKnuRHyUWpJbYb9y5doCWMCuLw6u6t2LqfcwknNkjoWNCG69tohSgRStbYfmA7AZvHzPGc3gKByZecVxdmvPmtbSLXRiB9FbqtuqEerGxpisL3FhDM6SVqxRm2E2SxwJTHVcyL2LNF5tE2V7mujSa5dwzZfbRA9p3SwFeRhd42z1r36iL92yugfa2SbHYYDhdKFCJLhMc8ogqd1b8oUBbwBktKg6p6MJeZdqS2vfsLQRnV8TyP72fKUjFtaQ4o7D6vQ9VnsBMQS9FF8PEuZ5yF3XQaMjJMpeGho3c4dNFEw4vCiUaVN2WzF7XR28dyGwLASMoVFuUoErgr7TUQm4yKJG8QaHePx7A7Ku3Ys6fvrDsBVJWz5taQB7cMBqXmrAg2DHSUwqr8XfhxXnv8cnZZzPTrtib86P7w3kUYLrJYaR6jur5jTFucFSxthKEMqzBPtS3wgn2hcj31ATSNR7FNDcZmteWex5vAzGkuDoCG4c7dUCGinT3akYvukR7WugdHAYySkhf6AhNGg4wrZ7y3YVRMwRkex3PumcwGGKoTvNMNMqz2kTCNjSsDr6xRBk8njCLwDMunvDZM7VThTMKQ4CvegCtX3kV11qk46WjouqFedYSmShmxB5dMMVKui3owicS3ioVXoSqCRAcov3LJ3zL5aQ19FBBvvezeN27PkcZjvXKQwNEpnMzJeLTLdz8guWrER9Vn7XB3zgvt6xzab8JbHJ62XEEGFC5EoU68D3Wn9oXH6EqfCNbUsfW6EScc7wcsRu7aLi4ddjYrDcd4pQgct3dpAzR9Z4ZHRgQi9k4DF8bg9LUjfjaJS53DGSiSSfGBNtkpdyLp8K8Y89BZRnw21yVcKwA8JD47By6s3vfJ8PdSTs4Lsfm7mEhERuVLyQC9wpPe6ysjzUTQjx7RyTaVVA9ENQfpc1XCdHufDFST1eeiRFLwKzEFCr2bATo5r5oQ6UtBdQv6eFaGv19ju4cikXTNq2vCGw6aMupdaESYeWL5Gs8ssCjb1K2iZfGwqidfTJejEiuoiD2S6shTRv6BFz3JrhU7XsZdLkU9rvDYJs6rWq4C4ix4VWDxNHktF7iBuCASnZjgMYs9Lipt5hZEow4FrWcvUtVQ8PXQT3SC diff --git a/etc/configs/12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx.yml b/etc/configs/12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx.yml new file mode 100755 index 00000000..6d09daa2 --- /dev/null +++ b/etc/configs/12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx.yml @@ -0,0 +1,26 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4432 + - 127.0.0.1:4433 + tls: false +account: + peerId: 12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx + signingKey: 3i7TZgCtctChP9rA13BDuK2GmdbRL6sgk51JjetKyFt3SEqXN8M4EwcREWVfPYmayBKYPHveLzY7NsggxvKapJFdYH8F + encryptionKey: JgG4CcCbae1qEpe7mL87XWScKZWBBqSZseakgKVJfHqTUt3CiLPMKPDZtzQWLfb2ouiTbff5YTBZbGxwKqWYMAW8prEVjbcXBtkCi2Y2XkZ8v1ugidF5MC3d1ifnh5Es5CafB8kToUegtAig8vhMCuXAzLQpbiQyFLf25KcyKfVvHUomafaHyKCbYu1bmyGRC7CGxUD6jnPg2MYZZiJiq9scNRaRxbiqCe9C2VcUTFdigV65eGmZPKGgfAThcyKCdQSe1hmoXtNw5MaqbB3eQvkuS4GySap3SaEZUmGsmuVumUvHappUpN8x3UQs1TNWfYxULVx3tUMHfQ98G9No4gwP42ENMgCuMVQW9M68s73WCGucvpPUZdvQFiSJkSoKDqi2F6zdrM2LZTp8qGciunKDFZvh14eAGDbPLw9dBLVmMQLKq68yz8Nzi9BYWjzLa4fDNkoYETB8rArNPECAjVVW6PYLzueVNmqvo7RdWZGHF2YCRXr1wLG7jg4WBX4Lm5jQZS8bkWacbpj49b4nxRnjLsGusdCwRCZPY9qFPim2WU4z2KEgRS87x97TiYAThLUJwGBv5pBKRLkrAAoFWwkDSfxcRt83FiZtJ1hLWkpj6fK56SuubQUjWzNfVPCTfNqcod54PAPVESTuAPjDsmM4YeMGgUpaK9Goqbu1FuuZ9P6mQPwGKdpGuVgjJv7uQJZw3fpC9H1vJ4fa2wBrGFkahyEFo2QDb8iG9oGarpFxewJVVs12cpKJeQzU5dLFBvQJmGnHASTnBwfNBieDT7ZeFmnGuN7sLaPJ5wgdKJpY6aAooztyWfJPKTbxzYjUQMVoyW3YbTD3qg8F9grqVT1VFAp88ta1u55eokqz7h82EJNQf7GptDHxPRg4euAJ3BDvmRUfAwYzU8TD1gyiUnnHGRuvH25xgJRqauNrDLUbha33wVAHeMzWJhpLjLz4DLmtLejpfwNr5PuEbczqFAaLspf8dFjkrvmC3RrwHngKuzTkYo46WSJggWs3CwWDpzMmrATh2LRYmdH7BtNUkvu7onRzms8jWHBsFNfbCitMpfAsM3XmgtFUGTMi4LzVK3f5G8HqwGqcVEnFJTZzdoBsfNMKyFapXPnUBUHQse8jZjSYQv3dJpVuTV6HQ5R8saBdKDGMpXFyYqZK85cikcK6Nkd7ZrnbUUN2i6f3ano7hnxTbeW7kGxatUWETTwAzwGjdMhpJjieLFBTomAqqfXopEr1FeWcFmQ6kYBL2fa6XYqhZJevG6LpNXeuLcbyTiADt5CMNwt6MTmEomqtzqE7BgvqYEibuEj5K22ufvvLmX7XbGiB7wZKRPGuTR1pPDgJbzU9HGmF5fWjTVGPeNMn7ZmbQVcys6xy79notYp6MoQhBCTWyuuEuc24REEfMCjPuhNgssJQWT3ZR3xskrcEdCUyGbvQT2eWVa6atYsu5Z2m7sGXXwfH7vhdiUkVZEmhNPusij7dsMa9io63D6itYuu8Ed5aZYoUkZCfKZ39KQ16rtYpa9mfcwG4fyQy11Zy9G7nxdNJohGYeq3xuerSdwTDNdK2PREJcAoNA7Nfcsxk7333B5gXNFZKcBLQk56C1PqApLerSfo3jVuojcNAxYB688K6 +apiServer: + port: "8081" +nodes: + - peerId: 12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs + address: 127.0.0.1:4430 + signingKey: 3inYSp8q7WidZi7RkhLFNZPF9yMJXHpnyrTpTsE7cd2ggESfTAEpWiQNa8zCnNdzK9DpG6Mu5hDCZhfU6RMDL466H8om + encryptionKey: udNkNsbKtm7eu1Bqt6DUwLZka2Rq22vm33K5eezrMkGnXx8X13oQ8HBSHgkLmRZTC1737hgZ66s92QRNe1YC1v8JNiv6yXVuV3MujBkmrYYVbGB7DBz6REsGAMPmuqDiG5PubjVHP468MDJJYRTZN6VEJuSGZtEAyLBJe9iErRVFsMdNc6ZMbY5pxoYE6LHWbsfZejrnAXvgABTnYTN4ad6EaxRiEWHGACizr59uf3KYFb9hFwxkFMhenpTpxbkBwQp3V8MxV4eLbgsWQPMpfeGeinjmNRAnZfi6tnqSDLyy3RWM5y9W89rYKt3EdVRwcFWFHh8FgSjzhpqE77GEwjGU9ddKorUfW85jQGdd2xdFwQfLF2eTGEwSxX9Gz2fTTtkN4pNJC8MesKK2cRsLAZLb9rv5ebCMgQ3S86WjfbWRcEYLoKUWKjujiY1XT5GszTgSa2b68QpcDmqgUv7FiwcZwC5qaCsgoARZ2GGsPgW7mCBahxTJnor4dCLF9Aiz1YvFvwWzm8k9zUmY5pxPQFNSWfAAcodqEHJV6i9TSf5ERNLJCQiRTSStZZdoeqAf42sYCSdiaiVUc26Q7QcTxtxxpfCTqGc2Lgh6ofgwG1m2CfmhXTsBDwBFRc8q6TcGJ4fT4WuZXF9f4MhKHqgqppFKMWYyvtJyvypbJ735kU63UWWSMCo8BbVTRrtaq7bPHbgvHHWYso5o7PeqNuhD2YwTKd6wpbAeg8wpv3eEWB2sgotQ5JiW2itEyinLZHRpLvbtYGFWctsZisvBbCssiCsPqzG1DffZWNjt2nj1vztuapZLpz9azanCaXhFxLBBLVveEk4tvEknHtREwXtmTpQK5GqpmW9LTFqA5jj7fVtytYQFufe9Cp4HKNNodv1UCPQ1KTLwkwA6UEMwqamvE67GDDvjmE2XaMoq6ErEYX6FkQi2d9kbLJaFVGwYH3DVcbBGAJzSoeYceosuoQJBcKS19BhFqXWT1W3iKvMibadh8MYLim7ncxezuHFCyUPFnFn33kfzzTWTsFYbKDukCECRBKciptevx9zS6V2YiSgcYRWV7Rd8sNg8vAGUBQ6mLBtWNExn5gRkoBQDqN9BhfqpEbGo33JHb7GVLsN7um9VxKcTSkiDLPKTxijNevHeRWRbtbCvQ31WHaNLzihnsowVQMk8SV6CiqzqwUb4ETxiXCDHABGuCACcYVC2jgEoFuqSAwS6c2y5sfcjxWSe3hs9eLjyWmeHu75MbNcJN8EtBrLs4j2tWGtbq6BR7SYVcygUbscf75HKncC4YBkF1MWRHmos11ZKaCwLfjsTW6XUXdfhvpco6mxic8muiq5XA3G8x47stQ3eBoSXoehRAMd4FKNv9geDagAhjorfcMd7kCT5CEENMqCLpjtUsFXSGtjqpYg1aeaQsxdEszfw2LS5pvPQEnYmqMRxZsuYHbuAH4J7sQwvjn7ezWfpsJfwQT6EqDFJp4g6vcgfUeCYzim9DVDnJYWocL9Uzb9P3rvknDKZmAkFWgTVWq16GaX4xUsXVNLMkDm88q4vvxrCQyAerNzox27uF2yH1ca66pVu9GZkGHM1KJrNmyyYEm445wNgkgSx8ivhyC11SUKs3nTKNVrnc + - peerId: 12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx + address: 127.0.0.1:4432 + signingKey: 3i7TZgCtctChP9rA13BDuK2GmdbRL6sgk51JjetKyFt3SEqXN8M4EwcREWVfPYmayBKYPHveLzY7NsggxvKapJFdYH8F + encryptionKey: JgG4CcCbae1qEpe7mL87XWScKZWBBqSZseakgKVJfHqTUt3CiLPMKPDZtzQWLfb2ouiTbff5YTBZbGxwKqWYMAW8prEVjbcXBtkCi2Y2XkZ8v1ugidF5MC3d1ifnh5Es5CafB8kToUegtAig8vhMCuXAzLQpbiQyFLf25KcyKfVvHUomafaHyKCbYu1bmyGRC7CGxUD6jnPg2MYZZiJiq9scNRaRxbiqCe9C2VcUTFdigV65eGmZPKGgfAThcyKCdQSe1hmoXtNw5MaqbB3eQvkuS4GySap3SaEZUmGsmuVumUvHappUpN8x3UQs1TNWfYxULVx3tUMHfQ98G9No4gwP42ENMgCuMVQW9M68s73WCGucvpPUZdvQFiSJkSoKDqi2F6zdrM2LZTp8qGciunKDFZvh14eAGDbPLw9dBLVmMQLKq68yz8Nzi9BYWjzLa4fDNkoYETB8rArNPECAjVVW6PYLzueVNmqvo7RdWZGHF2YCRXr1wLG7jg4WBX4Lm5jQZS8bkWacbpj49b4nxRnjLsGusdCwRCZPY9qFPim2WU4z2KEgRS87x97TiYAThLUJwGBv5pBKRLkrAAoFWwkDSfxcRt83FiZtJ1hLWkpj6fK56SuubQUjWzNfVPCTfNqcod54PAPVESTuAPjDsmM4YeMGgUpaK9Goqbu1FuuZ9P6mQPwGKdpGuVgjJv7uQJZw3fpC9H1vJ4fa2wBrGFkahyEFo2QDb8iG9oGarpFxewJVVs12cpKJeQzU5dLFBvQJmGnHASTnBwfNBieDT7ZeFmnGuN7sLaPJ5wgdKJpY6aAooztyWfJPKTbxzYjUQMVoyW3YbTD3qg8F9grqVT1VFAp88ta1u55eokqz7h82EJNQf7GptDHxPRg4euAJ3BDvmRUfAwYzU8TD1gyiUnnHGRuvH25xgJRqauNrDLUbha33wVAHeMzWJhpLjLz4DLmtLejpfwNr5PuEbczqFAaLspf8dFjkrvmC3RrwHngKuzTkYo46WSJggWs3CwWDpzMmrATh2LRYmdH7BtNUkvu7onRzms8jWHBsFNfbCitMpfAsM3XmgtFUGTMi4LzVK3f5G8HqwGqcVEnFJTZzdoBsfNMKyFapXPnUBUHQse8jZjSYQv3dJpVuTV6HQ5R8saBdKDGMpXFyYqZK85cikcK6Nkd7ZrnbUUN2i6f3ano7hnxTbeW7kGxatUWETTwAzwGjdMhpJjieLFBTomAqqfXopEr1FeWcFmQ6kYBL2fa6XYqhZJevG6LpNXeuLcbyTiADt5CMNwt6MTmEomqtzqE7BgvqYEibuEj5K22ufvvLmX7XbGiB7wZKRPGuTR1pPDgJbzU9HGmF5fWjTVGPeNMn7ZmbQVcys6xy79notYp6MoQhBCTWyuuEuc24REEfMCjPuhNgssJQWT3ZR3xskrcEdCUyGbvQT2eWVa6atYsu5Z2m7sGXXwfH7vhdiUkVZEmhNPusij7dsMa9io63D6itYuu8Ed5aZYoUkZCfKZ39KQ16rtYpa9mfcwG4fyQy11Zy9G7nxdNJohGYeq3xuerSdwTDNdK2PREJcAoNA7Nfcsxk7333B5gXNFZKcBLQk56C1PqApLerSfo3jVuojcNAxYB688K6 + - peerId: 12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze + address: 127.0.0.1:4434 + signingKey: 3iPPhpw3jndkSCvpZ4yf5eWYydZwbFAk7gdMkXZBgyh939AicHVakwkabDpxzhtrsgJEXrP5sKam9QL7weMyyoMrKNCH + encryptionKey: JgG4CcCbae1qEpe7mL5br9LinoxiiuQqGC7y6HBbvmQ9pcZM4F4q2oGDQA71ZumaTJ1RAiUDaxi1fBVnrvv4Tqm9fau3NyijggQ246UtHKemsPFBX9Qyv4oYZJ9X3WNNc9q3BkPX9C8WHdfda9fxW4wD1QYKzd5F1J7FdhxZh3MZUdc4GEfPLwew8dTfEJp7ipAvM7TY1r6URe4VHVmsdaEL3jsEUzEqL4MRSc69WdjdKZLyVzQVcjnLegFfoH2c6476MfnoPggeVGghPjDmoqoJ2kzHwjvDQKoGyC9m4wkicS4YZkVA6N2ezKBSumJkV1mY6hpBPuCtdYLDw2zsCqMq9AXFhtMxzSCtLLRnRVntErY3Wb8ty5vEnS8aY7B612okwdsMg2rYxP55ccK4zP7PoKTKTS4TWTqGiLW2GtptTLhQ7ynJudG9YArzwwjgqXaxExrMqFCSMCfQbVNvwv3SckfpwQjpJjCfRS73SQKPY8ghqrdKnuRHyUWpJbYb9y5doCWMCuLw6u6t2LqfcwknNkjoWNCG69tohSgRStbYfmA7AZvHzPGc3gKByZecVxdmvPmtbSLXRiB9FbqtuqEerGxpisL3FhDM6SVqxRm2E2SxwJTHVcyL2LNF5tE2V7mujSa5dwzZfbRA9p3SwFeRhd42z1r36iL92yugfa2SbHYYDhdKFCJLhMc8ogqd1b8oUBbwBktKg6p6MJeZdqS2vfsLQRnV8TyP72fKUjFtaQ4o7D6vQ9VnsBMQS9FF8PEuZ5yF3XQaMjJMpeGho3c4dNFEw4vCiUaVN2WzF7XR28dyGwLASMoVFuUoErgr7TUQm4yKJG8QaHePx7A7Ku3Ys6fvrDsBVJWz5taQB7cMBqXmrAg2DHSUwqr8XfhxXnv8cnZZzPTrtib86P7w3kUYLrJYaR6jur5jTFucFSxthKEMqzBPtS3wgn2hcj31ATSNR7FNDcZmteWex5vAzGkuDoCG4c7dUCGinT3akYvukR7WugdHAYySkhf6AhNGg4wrZ7y3YVRMwRkex3PumcwGGKoTvNMNMqz2kTCNjSsDr6xRBk8njCLwDMunvDZM7VThTMKQ4CvegCtX3kV11qk46WjouqFedYSmShmxB5dMMVKui3owicS3ioVXoSqCRAcov3LJ3zL5aQ19FBBvvezeN27PkcZjvXKQwNEpnMzJeLTLdz8guWrER9Vn7XB3zgvt6xzab8JbHJ62XEEGFC5EoU68D3Wn9oXH6EqfCNbUsfW6EScc7wcsRu7aLi4ddjYrDcd4pQgct3dpAzR9Z4ZHRgQi9k4DF8bg9LUjfjaJS53DGSiSSfGBNtkpdyLp8K8Y89BZRnw21yVcKwA8JD47By6s3vfJ8PdSTs4Lsfm7mEhERuVLyQC9wpPe6ysjzUTQjx7RyTaVVA9ENQfpc1XCdHufDFST1eeiRFLwKzEFCr2bATo5r5oQ6UtBdQv6eFaGv19ju4cikXTNq2vCGw6aMupdaESYeWL5Gs8ssCjb1K2iZfGwqidfTJejEiuoiD2S6shTRv6BFz3JrhU7XsZdLkU9rvDYJs6rWq4C4ix4VWDxNHktF7iBuCASnZjgMYs9Lipt5hZEow4FrWcvUtVQ8PXQT3SC diff --git a/etc/nodes.yml b/etc/nodes.yml deleted file mode 100644 index 7c3008b6..00000000 --- a/etc/nodes.yml +++ /dev/null @@ -1,22 +0,0 @@ -currentAlias: ULSsy -nodes: - - alias: ULSsy - address: 127.0.0.1:4430 - signingKey: 3hvsvs4FSnU1p6MFJFVaHFfTfTrD7efGbacacAcYbnWMcXcAQd7k6V7PgLbHddabQH18a1TnNKHQ3Z7yRinXohAzY8HT - encryptionKey: udNkNsbKtm7eu1Bqt5d1jyhFAxd26wjema4tDqRiZ72xdCcBZvK6WBdpXWzb5w75FHEz8DDo7qoFLB9xAQA6GuNzoDTsWJjPX9vQHz2m9rCK5FcotjZF5WWCrgeg1FhyVcnF2zTSnw8kQFejMv4iCLnhjTC8op3U1eUpZ4GVxWQ1oLTg6dBS5MQsry7TU4gX77rJQF5gY2CnG9wK3Lv127vJZ6sphQXKQ3T5E7EfDoacGphH9ondtUgd7JRUices5PS7QMPXGVxqHjn2XR4SfRu6tN3USWVBMH5TbPfJbHvhGCHogbzj3ZXt3VidJKyHk2qnXASh9akFRAvgHpf7uhK4Eet3keXV93t9yeLZfttb5HdQ6PtapdMiYYAxPscd761daY5EdhmmBJWBRGSH2TephjcZDjYY1ZwFpNteXmyiWdvodA64cvHHbtFDQtbCu8oZ1GKvM6vq53rKkVvaJT58qrCoThFGVT3xXTFDSTAiKrLxXdiJikdk87mygvPyShdhASNH95be7co9HMrpit6V1Uyk92VcSWqb84bKDhYAsn5PEJSqNtrxRZjG2Zwzd8gFMwgGvcD8iZfhXUA1PWttZ2hwp2kaEanKsSh8sEA7qkJPpvi1f23fYPhhsxjK3DRauZStbaXHoFzWXQUwtDJnitMCwu9k3A7cJmxy9R5YjTnpivgsrivMcy5cHtDXVAKv4UT2DwSgN3d6phT4jzso2sXrmbNjCnrbJjP1A7UztBuwfefHgw4kKnimB4ZyGBWbtSLY42Lt2hSWcoQPcUXkVMTabEaMY8VKApSiRFVcZX9LyiN3vYMoLgFEFs6pnc6TGVRuMP5DfdyogyEyYHSK9iumSy8iVhftjvBc1xtvv4C8q3G3yipRawKiz9FymufgXBZgnHopo1aWaMsHsr5SwQWtaGapy1rNPX51rE9fLY3a4PhBT31a6XwFxJu7pdgWjXYxeN4rioRrfQUGy4D4PW81UTkqpkVZr3bUMWxUorW6tGpSm2irTwk2KM2a62pxErbTFMZUXdcT5zeZeYTFFpVMocaixGgBS4nYvviYXqeXvQ28uNLeWAiE1PTyur32ShHf8uvtoPfVXKhCfNmTkCBh9Met9b6NYoQwk9VTUAP9E3t9DPAAtyPigkLNdERtPEje4NAoV3wsa1WNXSKNU15dpYh3B6Qcvp95YfX253eucQmVjb71Synb4RkSBdnghZzsBYvhQewAkT3432i7hwnjyTWooDgbXMiHd3UaTTFsHS7EYSJxgCe94UEHUF2SL3Wqno1ReZ95678KLLdFwEPbbXWfvAnGU1KvEiMh9y6b7WMtTwx1kdwCghpwgDhE9ktMZNc6ypyWWLYA6473ge5WKrbnR3ugCoLaEpRAWmZBhc52zP9f7SZS1PgwF4fPtuxLtEJTTBkTkdPPwhQVTwfT8viggbdPVQG4iEhdRoEUBE46HC3MK4tchz8ev8CKJMQp4GH8zweGP3JKTNbNG6b7v6kTxHnvG5LbMJMGrq1tDfADDD8NwgL2Luhoe4y9JfAysK5UHkSWaQw9L7TsxUPgj3otgrwSjGFLvfc2D6zNddfGELcoWzNLzXoFZqAyQUvFdAqUcMYanepAQJke717Wv - - alias: NpBrA - address: 127.0.0.1:4430 - signingKey: 3ixAJXFCYUu366ywFxsvNzAFQkVPyDKRiis1nCviHXUu5i3PkDP9FJFPGs5WZUMe83mEYVaipiW2ntiQXaxHYyYys6wp - encryptionKey: JgG4CcCbae1qEpe7mL9SrVoZim2d7ydWKL1KV6dMtgKcnb62MVgezmTyTPrcx29ZF4wecMxKmQNcdYhAN1t7vDQTBgUrGdCbkCUYu3sLaQYuitCEM6nykS1WWTsKSkFS1HiAVoWeSpQTzVwDNM2VDkVyS5Vbmg9gnE8qt8EnebiD3Cg64YwWi3HgEyVRauygAktmanFJNRtkBsriTPFZn9RDh4mMxSa1Q4iTx4Gxuq6avw6WACWV3x7RpbwrkWh54d8abXUdWxFZGCfe87o9v4UrxcujhWzE4F4tbGyrPBNy7abamb3sVqzRZPAikLeAKeb3s8K5JpUKXTVEiKCNpijaBFBKSLf7znowdJ9NGTMsJCSwTpsznANsBMhaz5uGaL4ur8CK6u4VXQbH1yUpKrnnVVjzoXVqh4vAeUaA7sanWKdPwGcaS6oDwwWp9Mi7qrqYocWQ6EtaeAQhbQ4qRPygujnBdThGnXFLrriYH6Yzb3BJsEG9S5gXEDHytFKAYudmYd77xYcu1rN5k6V35c8EaNp8AWZbkCpkefsSPCc1dTG4Fgg9GnBwdJvrXLV6CrE6SQtjUgPcpiLGK65sEutgApbkfkyasPdpyBBp8xND4woihHpANkTx5Lxn68rDj2bk5NTLgZLJgixJRoNPLXtCWSnQU97xvtjU8UnT195KwkCTm8X62syiRE6jkR3seVWUrwLZ8qojdZkm3bS1yUyYAPaCapUwppTT4SSgTrhCjGjGkYJarJPsxinedwTEvCPzujRcNofq4nF1RedgfSimvkjHPaztQv8h8YmxX1iRZ99AoLzuSw3uohoPvDsQMt97uQFCEZt5gLmzZSXpQpNDmAX6xpwbmuHuLgP2fJ5XrygnZo1jFGPPcfTurx4aghyrBGhbVB1XBcLvrzr6XA5WtU9HwriFYx27TVfiKJFG4ZdsbSUgLSQcYKJz1cZTm2QntLaCMpiG4jEkQtaEPANgp9oARvrh6kizpkGMpuMfVbcfE4cNiYDKwkj4cHa1NRmZHzxUyKiwTzwxh2YKra28NQnFZCnbqm3kBAaf8RiJkjb489uMtDo1nQ3cFhH6X68BqnfAmx2QEWMDHeT1XLPPEAwMhJ3tqrb6nMx9oEjcof8GMxv2GyyMtsAUHFY3KE3NAvfwbgWh35V2kKiyZEmmMWrs5TuMncKCMib85ymwmfa79igHERnhH9dJhKn2HcbhUxSX3SUB1CRihDNnXLT4rExwJfQmZfUhJmAK2BjkfaEGwNwxfcLE3KWMi6BRAiXnYhBiLHeM47poNhc5c9wE5krvis6Mh3HeLxbwjLZxoLWEonQzxstSrRKz6FSzkqXWQKaavELLsiVvo7s7Ga9gMoTvLqmCK9Ksk2u1ZKkgwsp26JAfDkWpvx7UtnomdztpGbMFSiPFvHzEwhKz8qohCyBWDgN7ZjdN4doRyG98MR9wweRyKuneUE6qxXpBhCAGWSUdBYtd3EFtmpGfYscYKQazGNBw3YsfK3UADQQsWMPXqCWGqpi4mpqRsKrZv3niZB1XHHP6kNUGN75awEjh4soKhHwhpBdUx9NXYAx5BDQWR6CeZS3pzUVTnMNAcizm3SJoN6HhmhvBt7LNFEcphPtotM5f - - alias: aVIrA - address: 127.0.0.1:4430 - signingKey: 3hwxb9marr5HkvtWrDkXmE82mBQrNUUxeqMbrBbUjXFJuENrAe6JwqftFjLFmHvTN3r9SELsxujsaehxv1b7VcXXf3ay - encryptionKey: 2M2HT8EVmV3H4KkqzeTUAgw4okcbPbBpUxBMg6kLKpoiJPjg1fHZtZuZjc3HEHn5n7mihCs23uJVDGhtCjQXnpwWZUn2ezBzA1t4ZjURJUDCp7FzL7kKoFETtCuxrdh4j7RcbmA73in2C5YgXeUuEpMn39ApAXTxASMcdSzm9Tk9KMqVXNNMezfu836jDG5cj72wkJgzPFKhviEZTzYjPAeqe9qMnnGLPWqwDCarj2xeqx9n15zA1Ld2KfY5JDQQDj4WBohC5N4kLTzmNjiVnKBbZzLwfW42Nypz7AWxVeKYAZVPmKbTPtJRWGAtMjY3QC36SX8YqnkxV9cHUbCo7cWbEKctsDjJjMFxR5aXsiftqTo5REaVvu8RMQXx2QPshqxFBdJiGpfyrfBnjC6KbdszBTpdSQqiAEhNkoNuvniY8DTdrNWiH1n8CPuuzx3diQVSAaX1CnJzPqXhke2pBQBZWGsiMWFVFDUjZqH9PHe2BWZ3nMaKFxKAggiVhzpRFdC5xW4DbWsfaw9m2atKC5atWaaSs1uPkjtmURGP3DvFdWGdQfiEm5WBfMCR4sd9w5Y23SBFwPvMTJCHbKsAt5iqp9BwvnnX1D4sKxP2FA9Db16aZFczfzvWfsvWGRmZwt9y8dW8axBgCL526YYap9gihFPJbEEgABZpzrLzSTeVuJfsKuwXjwKBqEiGsJaAnKzEK7KwRhsJvz2e31MYx27E2u143njA7aD5AW3civNaDzbqkeTWJYwvXXavsJ94i3FAiG6FF8yARkcPxV76FV87QFwCfN6dz8ZJthmhEDMkLgTYcsVKkhzhGWnAYB2ayJjbmL28ewGDtQtFEAosdoVs6FYjKPUDVvahWiQWmGGnnF3FwY67JCkwnYzPB96kLSQcvjE366s8x8SFwZWy32u1JwwcCwAMBKJTN3RSc1KAa2VazM5knjgtyqyFeF3EJQZLHcLGrusSWpXFqBhMbnbn7Z4GuNNwuzjEDGKK2bJ97o9xtx1pgHjjvRoK6wfJ7zTDtFWXkJqCY6CtC2cwrkw4TuyhaBz1fCnD2Nu9jz2YWu5Ery7wGJkaiVW7wfPHK3ks9VLwXViF2kHDEB1c2AzabRyTWrgGb9JU1kt9PVQM8TPyKHbBvhp6pr4jmU188PMdHKkca8Nx6mTEWhn3QbTzqPxYBzmHSFrvVVKtwyU2J2izvHfbURQ3a9psDYriZVVFeDHRCN64RFku11JREa6ddjTupEoJmBpb9VBkqzmuXFw6diTruRVNQurgm38MVCKKswTLz4BxHGMSrZh5R3YJzFJScRCDkLVy8NgZeydY1h6iE53GCZDaP1Y68XREVqkaNRnrqkaTgL6Vvr9pV1oMSrKfwAUhcCaxS9n9fxSmy8xt1p1k8VYFV91FbkTZU1r2RMQKeWA1tPCDjs9Cd65GgRkvUgJ8zHi1x6GE9CneqmqTuUqXt1xiM6Ha2eZvcGFH99xpqcskCkTkP7GAJsddb3GUuoVgGzSkXBpMSt1ghSQHp8TArzuVYkLrVViygustEXp2YtJREu6c9NWFDnCyXKDUCcGMHtS6GK1entBMr5BWK6szHys3GPLr2mK76TNWX2Xqrm1C3rCkiARhhgTLqqu8zKhJFu - - alias: JDBbe - address: 127.0.0.1:4430 - signingKey: 3i7vzUsjAfsaShNzUY4GQNWP6283s6HudHsWjKf55NoKBtVgcLhkVw7jA1nxt9fswtFsXGNLcpgyAScYUR3mHDZoD2Pk - encryptionKey: 51HYzTYh5uokpYWp8EscYm3wA7Z7J2SQXirK8kjW1kkshSx3EBrkceia4jHcwbqMHSgFxBRBmuTRJAVqKPpLJ12CfEFfdcM3A2iiWJx65iacQmnFtCMvEuFrF4xKxYUyLMWXeoT5BCpLC4Vr6EDZuatvdQHER9T8fCqrBhm4ZSzyJfyzM6Vqj2pXwAMgnLN7hydUjYoxiR23E56zPva8eu1cuFuicMrmPUCwkpZohLE7wbytnkHESQvXNdbJTps3BZ7LP1K66RzwdLFvem3RC6ZxPTrNQfPeMa3KmYkaNtVPcMhbVtj2pTuLJ4EhKNx3WNLVr61UyR91n9EeQxA1G7mts7zeHN2sZbJfonJJkuxN8ppN3MeDfy8tWFRb1DQhgMwmojqhGNFQmJmbM79BHe2zSnySLNU5VtCbDobvsid2g4ZfdVgDqbBYdVaRHzgU8psDX6JiEhxZxEHu2VUy16S4PrWFa92yEpAsXQ1NLD5wg5e1utvVoWHAf4D8PyiNvy3FPwUZg42rmVbj8mWRoerDArQ4ey38SJgSX5LNddYyb6hpQQC8TQzFKTLXGgHsPsyXm8C6xdHnvtEVVNDAejbKHsDsEuom1g4EwgGdEZUYR6WKng8A9K2HP3B8fJA4qvdcnX5BgzGwGYFu5auin3doEKz6zmHmSKyWk7YMCAmeQ4UheTpBFzzW4ynRrKYQHbfRNh69skQmfJR8ANtVXcUX5VvrK8vampSxDZHMcbJKSTyh8D648HiFvoNZk77Q7K4XMiYY2ENjVfXABW29j7sLV6M3qwxqXxqerBmLRFeVZKvhrtqqG13xbQRMYqdxhSvFzcbauPE4RuLukdKiSRDh7nQrvhjp53trWLeHgECsrk4spBrsQXfn5MFJxzrt7xpcRkj4cwgiwobXfVj2z8YEakWC8965ZSr78GJgx4xDBtxJfYcxmXykysRhZd3rqfev47y9q9R5qPgZFy4PxGKsXkwFT6nwDmyghXLfVQYXsJXun2f4xwzJ7D23t825JiwwnUNrzCcEtG3fMRF3tm9yCXBB6iPRtgqwK1Uwpyu81Y9c2ztDw8zuScbMD1SAgeGcuZkA52VT7duqBLu2GAK2dddx8b4aDVZ44fGXSsmZ3bNQNPY4YtQb923hrSoPhNmwVjSLdiXWHWbszvBzMpxRKSnnNjG79St8h3Ydw9GAAuQjRkurpxWUKnhVUBUUBJ2ZvPaVADMqWzRyhKATHTSmGKtdHjX5uN8djjp6xt8FmUteQyKX9LxokMUneExp1nvQvgQxGUGdFqRqmBh2PjWvCXwsWZMaK1cFtriyqJVGr3NdsS1xCNhdxHkot2RxMeMAfzPRRsbHyR8LtJk9zcsCjWDJfpM5YBbgtrLzkuxMNPPCtMJdndyQbiW9ewY4n1WiXgH5mVkZcggrG6e78zu7jre9haC6MRKpNacsvvAUxvJLFqUFfWra48RU4MBp13Ad3JEaQkQgkKYj6qmoDK9mcaYxK3Pi8EeofAUta4kU2WBMnhsAzRCKnG2mdutsjkvTdFkEs9Nms7kvNDFdcdG6ZVQgDHdogpsSEfaXNYnoHdwNmiVGQvYEnBfgVgg4KihoBZMY5D5ZFv8amuj4mVeA9fyym1L - - alias: PqyLS - address: 127.0.0.1:4430 - signingKey: 3hwkRSkxTpC96DnUM9wWKRuxwLZS7CrKzXCGuWTdnhVHT644XMEEYoSiapATVMcE6Dhbmsqmpzop6ox1bqUXiyuCLbha - encryptionKey: JgG4CcCbae1qEpe7mKhXWxXceQPz4hkU4XurwrRAoczMzDmkfpgnVtemFhuHyQqsBbEdeLrEBjxMyqu8TgtiZMD6cX4X7nPcmYRiyjq2dgeZtr7iw2syG7Zpxs5yL51jJCqbmRkJ4HCnGASFR7NWYwUGaEVKCRbgqGHwwNSBr7nKhrmm6ZHs5m6YSyXQbpqA8SxPce5GGGs6JesBzoBEh7f8S95SchThpqAKCFRFisTUFJBjbpuJTZ3T7GbR6tgVMcQTodZf2TAweStvkMzCtHpbLiDqkHxjEAB68p2KLwWN5PR9GuZQtupuKPDMVtmh3e7yvdrSF49ACL6nRSpRiB6ARMgTxb4X5sPR3CFiTVNqo7KK81KB1PyaytNkSHJ2WgURJrAafqt85BiCLney6Pk9xfGiSXve2FMY8mmzzLjccZa4PJER9WXGoFjd7QyfEkQcBEQpk77cKEeT5xc8mZEwg7sKkBGRZypMKkTd3vM3RVXRqavuq9GgW8oL1kPAZ7cknwveyZ4F446thVutK5ieXTwDikY5QpsJuJTKszpeK56EL1GWL9AV4z2xfPmsSVwvPYSi4mC5mSWgesVAatUXpWKCX5mwgw3U1D8WXhosCbnJTvtuAWKsmnyBUQWVxS3pGsb3wWZjHvnt294mUdqTbGAoS9PEGNGxEYqc7zf5i2vRfbCXAEHg9bi8qd4vMxpbxptT7s1MiTgDntFyLeKQLZ1aNkWtpfL2P3tT8VtzReEH72WQd8nMCdtFo3MiGZycqcFsSvpmofmq8DWLU6r7ZYJq5CXekrcyVBDHSbhf62KW2DMV3Z8htkUjZojwk5qVyeLNNBgDHFAFA4puZBMFVnjsn6hmwbUMqSY8kjrEsDqCXa2cLrSWu48Mm9LPLCaxsNAxVTAGAxHPBXww7cecJSWrFcfuK1iLNYg37fzU9ZYgGQ17wVMw35GL5xdq1ZC5tAdte8xYYoW4AfNoajPfnVMEHZMh7EpGLN9K4p4yr5dD9gsxtaBE8ZKJtMx5tyePS3BeajhB4Fsr7fb1CpssneCmJkXqzxqFy7U2wjaaW7FyJfwu4e5sa4KgAoNUyLHumD2F4AjDqBw7hCahut8Ua5Qo12WSjASxUAwoazPQyuech7xh71DGVPZGmzmcMamc8ek7rBWeWrxXPeTCfwXavW4F7aZDXqCHRDDjHkCaHYNyrYRhNY263Vy5VRDdKb8iHDfLToe1uf8z4BAaLQ7nYMWgZoHjum8TGQkGqCM5Jk4HpJY2mbahD4bjMueQcZH9ks82ttsrg7mFmALAUoyVjkub4KYyXhR6GqRDRLFaDUv7toM9gZ3L3p5n1RwJr7hFr2sRwjTGJ7hdSCzgNPk3NUGK3vnojpjQoKXNPgCXYyRJgTr2y7UoZWj15Gm8H1QnrK5Ar76i663RV1zu3MhghweFGnh7WE14j2NqJ4vkfe37AJmntwF19j4JdUpTtDY9b7DZT9ohSSeRkmoSuPsy9Vpai3JyFpfAWom8CmkYkDA2GR9Uwxmg2UuqWSoxxcsdn1dZJdfYWrrXodjK9PGsJ8YPLMTSZz2Ye4vshmW4znLam5B6Yh11vtivD8njej9cm8eCP2SvPcUvMyFb7ZW9p6ByeWSq diff --git a/service/account/service.go b/service/account/service.go index b5b7b8ee..ed66fe1e 100644 --- a/service/account/service.go +++ b/service/account/service.go @@ -2,14 +2,11 @@ package account import ( "context" - "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "gopkg.in/yaml.v3" - "io/ioutil" ) const CName = "account" @@ -20,6 +17,7 @@ type Service interface { type service struct { accountData *account.AccountData + peerId string } func (s *service) Account() *account.AccountData { @@ -31,54 +29,42 @@ type StaticAccount struct { EncryptionKey string `yaml:"encryptionKey"` } -func NewFromFile(path string) (app.Component, error) { - nodeInfo := &config.NodeInfo{} - data, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - if err = yaml.Unmarshal(data, nodeInfo); err != nil { - return nil, err - } +func New() app.Component { + return &service{} +} + +func (s *service) Init(ctx context.Context, a *app.App) (err error) { + cfg := a.MustComponent(config.CName).(*config.Config) + + // decoding our keys privateEncryptionDecoder := encryptionkey.NewRSAPrivKeyDecoder() privateSigningDecoder := signingkey.NewEDPrivKeyDecoder() publicSigningDecoder := signingkey.NewEDPubKeyDecoder() - - var acc *config.Node - for _, node := range nodeInfo.Nodes { - if node.Alias == nodeInfo.CurrentAlias { - acc = node - break - } - } - if acc == nil { - return nil, fmt.Errorf("the node should have a defined alias") - } + acc := cfg.Account decodedEncryptionKey, err := privateEncryptionDecoder.DecodeFromString(acc.EncryptionKey) if err != nil { - return nil, err + return err } decodedSigningKey, err := privateSigningDecoder.DecodeFromString(acc.SigningKey) if err != nil { - return nil, err + return err } signKey := decodedSigningKey.(signingkey.PrivKey) identity, err := publicSigningDecoder.EncodeToString(signKey.GetPublic()) if err != nil { - return nil, err + return err } - accountData := &account.AccountData{ + // TODO: using acl lib format basically, but we should simplify this + s.accountData = &account.AccountData{ Identity: identity, SignKey: signKey, EncKey: decodedEncryptionKey.(encryptionkey.PrivKey), Decoder: signingkey.NewEd25519PubKeyDecoder(), } - return &service{accountData: accountData}, nil -} + s.peerId = acc.PeerId -func (s *service) Init(ctx context.Context, a *app.App) (err error) { return nil } diff --git a/service/api/service.go b/service/api/service.go index 49e230a5..c0fb9c9b 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/document" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" @@ -25,11 +26,13 @@ type service struct { treeCache treecache.Service documentService document.Service srv *http.Server + cfg *config.Config } func (s *service) Init(ctx context.Context, a *app.App) (err error) { s.treeCache = a.MustComponent(treecache.CName).(treecache.Service) s.documentService = a.MustComponent(document.CName).(document.Service) + s.cfg = a.MustComponent(config.CName).(*config.Config) return nil } @@ -40,12 +43,12 @@ func (s *service) Name() (name string) { func (s *service) Run(ctx context.Context) (err error) { defer func() { if err == nil { - log.Info("api server started running on port 8080") + log.With(zap.String("port", s.cfg.APIServer.Port)).Info("api server started running") } }() s.srv = &http.Server{ - Addr: ":8080", + Addr: fmt.Sprintf(":%s", s.cfg.APIServer.Port), } mux := http.NewServeMux() mux.HandleFunc("/treeDump", s.treeDump) diff --git a/service/node/service.go b/service/node/service.go index 065740dd..788624b1 100644 --- a/service/node/service.go +++ b/service/node/service.go @@ -2,16 +2,11 @@ package node import ( "context" - "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" - "gopkg.in/yaml.v3" - "io/ioutil" ) const CName = "NodesService" @@ -25,32 +20,8 @@ type Node struct { EncryptionKeyString string } -func NewFromFile(path string) (app.Component, error) { - nodeInfo := &config.NodeInfo{} - data, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - if err = yaml.Unmarshal(data, nodeInfo); err != nil { - return nil, err - } - - var nodes []*Node - privateEncryptionDecoder := encryptionkey.NewRSAPrivKeyDecoder() - privateSigningDecoder := signingkey.NewEDPrivKeyDecoder() - for _, n := range nodeInfo.Nodes { - // ignoring ourselves - if n.Alias == nodeInfo.CurrentAlias { - continue - } - newNode, err := nodeFromYamlNode(n, privateSigningDecoder, privateEncryptionDecoder) - if err != nil { - return nil, fmt.Errorf("failed to parse node: %w", err) - } - nodes = append(nodes, newNode) - } - - return &service{nodes: nodes}, nil +func New() app.Component { + return &service{} } type Service interface { @@ -62,6 +33,23 @@ type service struct { } func (s *service) Init(ctx context.Context, a *app.App) (err error) { + cfg := a.MustComponent(config.CName).(*config.Config) + signDecoder := signingkey.NewEDPrivKeyDecoder() + rsaDecoder := encryptionkey.NewRSAPrivKeyDecoder() + + var filteredNodes []*Node + for _, n := range cfg.Nodes { + if n.PeerId == cfg.Account.PeerId { + continue + } + node, err := nodeFromConfigNode(n, n.PeerId, signDecoder, rsaDecoder) + if err != nil { + return err + } + + filteredNodes = append(filteredNodes, node) + } + s.nodes = filteredNodes return nil } @@ -81,8 +69,9 @@ func (s *service) Nodes() []*Node { return s.nodes } -func nodeFromYamlNode( - n *config.Node, +func nodeFromConfigNode( + n config.Node, + peerId string, privateSigningDecoder keys.Decoder, privateEncryptionDecoder keys.Decoder) (*Node, error) { decodedSigningKey, err := privateSigningDecoder.DecodeFromString(n.SigningKey) @@ -95,33 +84,16 @@ func nodeFromYamlNode( return nil, err } - rawSigning, err := decodedSigningKey.Raw() + encKeyString, err := privateEncryptionDecoder.EncodeToString(decodedEncryptionKey.(encryptionkey.PrivKey).GetPublic()) if err != nil { return nil, err } - libp2pKey, err := crypto.UnmarshalEd25519PrivateKey(rawSigning) - if err != nil { - return nil, err - } - - peerId, err := peer.IDFromPublicKey(libp2pKey.GetPublic()) - if err != nil { - return nil, err - } - - encKeyString, err := privateEncryptionDecoder.EncodeToString( - decodedEncryptionKey.(encryptionkey.PrivKey).GetPublic()) - if err != nil { - return nil, err - } - - signKeyString, err := privateSigningDecoder.EncodeToString( - decodedSigningKey.(signingkey.PrivKey).GetPublic()) + signKeyString, err := privateSigningDecoder.EncodeToString(decodedSigningKey.(signingkey.PrivKey).GetPublic()) return &Node{ Address: n.Address, - PeerId: peerId.String(), + PeerId: peerId, SigningKey: decodedSigningKey.(signingkey.PrivKey).GetPublic(), EncryptionKey: decodedEncryptionKey.(encryptionkey.PrivKey).GetPublic(), SigningKeyString: signKeyString, diff --git a/util/peer/peer.go b/util/peer/peer.go new file mode 100644 index 00000000..dfa03282 --- /dev/null +++ b/util/peer/peer.go @@ -0,0 +1,21 @@ +package peer + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" +) + +func IDFromSigningPubKey(pubKey signingkey.PubKey) (peer.ID, error) { + rawSigning, err := pubKey.Raw() + if err != nil { + return "", err + } + + libp2pKey, err := crypto.UnmarshalEd25519PublicKey(rawSigning) + if err != nil { + return "", err + } + + return peer.IDFromPublicKey(libp2pKey) +} From 4724fab97e14867e319e304feabcd19924ce8a74 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 3 Aug 2022 14:47:31 +0200 Subject: [PATCH 33/40] Add indication in tree graph for non-acl changes --- pkg/acl/acltree/treegraph_nix.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/acl/acltree/treegraph_nix.go b/pkg/acl/acltree/treegraph_nix.go index c180c7df..4d798939 100644 --- a/pkg/acl/acltree/treegraph_nix.go +++ b/pkg/acl/acltree/treegraph_nix.go @@ -83,6 +83,7 @@ func (t *Tree) Graph() (data string, err error) { // } // chSymbs = append(chSymbs, res) //} + chSymbs = append(chSymbs, "DEC") } shortId := c.Id From 62c5d8e3b9ffb6240e4ae588ee9d655e022ff404 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Fri, 5 Aug 2022 12:07:34 +0300 Subject: [PATCH 34/40] net utils wip --- cmd/client/client.go | 169 -- cmd/node/node.go | 14 +- config/config.go | 1 + config/grpc.go | 3 - config/peer.go | 14 + etc/config.1.yml | 16 + etc/config.2.yml | 16 + etc/config.yml | 14 +- etc/x509/cert.pem | 30 - etc/x509/key.pem | 52 - go.mod | 1 + go.sum | 2 + pkg/ocache/ocache.go | 49 +- pkg/ocache/ocache_test.go | 14 + service/example/example.go | 84 + service/net/dialer/dialer.go | 104 + service/net/peer/peer.go | 35 + service/net/pool/message.go | 71 + service/net/pool/peer.go | 28 + service/net/pool/pool.go | 305 +++ service/net/pool/request.go | 45 + service/net/pool/result.go | 53 + service/net/rpc/encoding.go | 18 + .../rpc/server}/drpcserver.go | 59 +- .../drpcserver => net/rpc/server}/util.go | 2 +- .../rpc/server}/util_windows.go | 2 +- service/net/rpc/stream.go | 55 + .../{sync/transport => net/secure}/context.go | 2 +- .../transport => net/secure}/listener.go | 2 +- .../transport.go => net/secure/service.go} | 44 +- syncproto/proto/sync.proto | 63 +- syncproto/sync.pb.go | 2279 ++++++++++++++++- 32 files changed, 3261 insertions(+), 385 deletions(-) delete mode 100644 cmd/client/client.go create mode 100644 config/peer.go create mode 100644 etc/config.1.yml create mode 100644 etc/config.2.yml delete mode 100644 etc/x509/cert.pem delete mode 100644 etc/x509/key.pem create mode 100644 service/example/example.go create mode 100644 service/net/dialer/dialer.go create mode 100644 service/net/peer/peer.go create mode 100644 service/net/pool/message.go create mode 100644 service/net/pool/peer.go create mode 100644 service/net/pool/pool.go create mode 100644 service/net/pool/request.go create mode 100644 service/net/pool/result.go create mode 100644 service/net/rpc/encoding.go rename service/{sync/drpcserver => net/rpc/server}/drpcserver.go (67%) rename service/{sync/drpcserver => net/rpc/server}/util.go (92%) rename service/{sync/drpcserver => net/rpc/server}/util_windows.go (97%) create mode 100644 service/net/rpc/stream.go rename service/{sync/transport => net/secure}/context.go (97%) rename service/{sync/transport => net/secure}/listener.go (98%) rename service/{sync/transport/transport.go => net/secure/service.go} (55%) diff --git a/cmd/client/client.go b/cmd/client/client.go deleted file mode 100644 index 18bb7e99..00000000 --- a/cmd/client/client.go +++ /dev/null @@ -1,169 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/transport" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" - "github.com/gogo/protobuf/proto" - "github.com/libp2p/go-libp2p-core/sec" - "go.uber.org/zap" - "io" - "net" - "net/http" - _ "net/http/pprof" - "os" - "os/signal" - "storj.io/drpc" - "storj.io/drpc/drpcconn" - "syscall" - "time" -) - -var log = logger.NewNamed("client") - -var ( - flagConfigFile = flag.String("c", "etc/config.yml", "path to config file") - flagVersion = flag.Bool("v", false, "show version and exit") - flagHelp = flag.Bool("h", false, "show help and exit") -) - -func main() { - flag.Parse() - - if *flagVersion { - fmt.Println(app.VersionDescription()) - return - } - if *flagHelp { - flag.PrintDefaults() - return - } - - if debug, ok := os.LookupEnv("ANYPROF"); ok && debug != "" { - go func() { - http.ListenAndServe(debug, nil) - }() - } - - // create app - ctx := context.Background() - a := new(app.App) - - // open config file - conf, err := config.NewFromFile(*flagConfigFile) - if err != nil { - log.Fatal("can't open config file", zap.Error(err)) - } - - // bootstrap components - a.Register(conf). - Register(transport.New()). - Register(&Client{}) - - // start app - if err := a.Start(ctx); err != nil { - log.Fatal("can't start app", zap.Error(err)) - } - log.Info("app started", zap.String("version", a.Version())) - - // wait exit signal - exit := make(chan os.Signal, 1) - signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT) - sig := <-exit - log.Info("received exit signal, stop app...", zap.String("signal", fmt.Sprint(sig))) - - // close app - ctx, cancel := context.WithTimeout(ctx, time.Minute) - defer cancel() - if err := a.Close(ctx); err != nil { - log.Fatal("close error", zap.Error(err)) - } else { - log.Info("goodbye!") - } - time.Sleep(time.Second / 3) -} - -type Client struct { - conf config.GrpcServer - tr transport.Service - sc sec.SecureConn -} - -func (c *Client) Init(ctx context.Context, a *app.App) (err error) { - c.tr = a.MustComponent(transport.CName).(transport.Service) - c.conf = a.MustComponent(config.CName).(*config.Config).GrpcServer - return nil -} - -func (c *Client) Name() (name string) { - return "testClient" -} - -func (c *Client) Run(ctx context.Context) (err error) { - tcpConn, err := net.Dial("tcp", c.conf.ListenAddrs[0]) - if err != nil { - return - } - c.sc, err = c.tr.TLSConn(ctx, tcpConn) - if err != nil { - return - } - log.Info("connected with server", zap.String("serverPeer", c.sc.RemotePeer().String()), zap.String("per", c.sc.LocalPeer().String())) - - dconn := drpcconn.New(c.sc) - stream, err := dconn.NewStream(ctx, "", enc{}) - if err != nil { - return - } - go c.handleStream(stream) - return nil -} - -func (c *Client) handleStream(stream drpc.Stream) { - var err error - defer func() { - log.Info("stream closed", zap.Error(err)) - }() - var n int64 = 100000 - for i := int64(0); i < n; i++ { - st := time.Now() - if err = stream.MsgSend(&syncproto.SyncMessage{Seq: i}, enc{}); err != nil { - if err == io.EOF { - return - } - log.Fatal("send error", zap.Error(err)) - } - log.Debug("message sent", zap.Int64("seq", i)) - msg := &syncproto.SyncMessage{} - if err := stream.MsgRecv(msg, enc{}); err != nil { - if err == io.EOF { - return - } - log.Error("msg recv error", zap.Error(err)) - } - log.Debug("message received", zap.Int64("seq", msg.Seq), zap.Duration("dur", time.Since(st))) - time.Sleep(time.Second) - } -} - -func (c *Client) Close(ctx context.Context) (err error) { - if c.sc != nil { - return c.sc.Close() - } - return -} - -type enc struct{} - -func (e enc) Marshal(msg drpc.Message) ([]byte, error) { - return msg.(proto.Marshaler).Marshal() -} - -func (e enc) Unmarshal(buf []byte, msg drpc.Message) error { - return msg.(proto.Unmarshaler).Unmarshal(buf) -} diff --git a/cmd/node/node.go b/cmd/node/node.go index 1446220e..69c5c601 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -7,8 +7,11 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/drpcserver" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/transport" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/example" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc/server" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" "go.uber.org/zap" "net/http" _ "net/http/pprof" @@ -82,6 +85,9 @@ func main() { } func Bootstrap(a *app.App) { - a.Register(transport.New()). - Register(drpcserver.New()) + a.Register(secure.New()). + Register(server.New()). + Register(dialer.New()). + Register(pool.NewPool()). + Register(&example.Example{}) } diff --git a/config/config.go b/config/config.go index f525e67b..4b610ca9 100644 --- a/config/config.go +++ b/config/config.go @@ -26,6 +26,7 @@ func NewFromFile(path string) (c *Config, err error) { type Config struct { Anytype Anytype `yaml:"anytype"` GrpcServer GrpcServer `yaml:"grpcServer"` + PeerList PeerList `yaml:"peerList"` } func (c *Config) Init(ctx context.Context, a *app.App) (err error) { diff --git a/config/grpc.go b/config/grpc.go index 6a4fc426..01b797fa 100644 --- a/config/grpc.go +++ b/config/grpc.go @@ -2,7 +2,4 @@ package config type GrpcServer struct { ListenAddrs []string `yaml:"listenAddrs"` - TLS bool `yaml:"tls"` - TLSCertFile string `yaml:"tlsCertFile"` - TLSKeyFile string `yaml:"tlsKeyFile"` } diff --git a/config/peer.go b/config/peer.go new file mode 100644 index 00000000..17680e2b --- /dev/null +++ b/config/peer.go @@ -0,0 +1,14 @@ +package config + +type PeerList struct { + MyId struct { + PeerId string `yaml:"peerId"` + PrivKey string `yaml:"privKey"` + } `yaml:"myId"` + Remote []PeerRemote `yaml:"remote"` +} + +type PeerRemote struct { + PeerId string `yaml:"peerId"` + Addr string `yaml:"addr"` +} diff --git a/etc/config.1.yml b/etc/config.1.yml new file mode 100644 index 00000000..093d1ef7 --- /dev/null +++ b/etc/config.1.yml @@ -0,0 +1,16 @@ +anytype: + swarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec" + +grpcServer: + listenAddrs: + - "127.0.0.1:4431" + +peerList: + myId: + peerId: "12D3KooWA4FLWvrMbCtp2MbzKcC5RRN7HqxxBxPcSADFfzrGiW3U" + privKey: "InCGjb55V9+jj2PebUExUuwrpOIBc4hmgk2dSqyk3k4DjmgrdoNVuFe7xCFaFdUVb0RJYj6A+OTp2yXASTmq2w==" + remote: + - peerId: "12D3KooWHJpSEMQUZCyK8TK181LhjzntWjKfXDr7MWks9cw41R2C" + addr: "127.0.0.1:4430" + - peerId: "12D3KooWK6c1CPLL4Bvjim9A9SDRmehy12hYjbqX1VASHKfH7W7H" + addr: "127.0.0.1:4432" diff --git a/etc/config.2.yml b/etc/config.2.yml new file mode 100644 index 00000000..701fdc5f --- /dev/null +++ b/etc/config.2.yml @@ -0,0 +1,16 @@ +anytype: + swarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec" + +grpcServer: + listenAddrs: + - "127.0.0.1:4432" + +peerList: + myId: + peerId: "12D3KooWK6c1CPLL4Bvjim9A9SDRmehy12hYjbqX1VASHKfH7W7H" + privKey: "jynYZBgtM4elT+6e7M5UERTJCZgUd3hDdmQjCqTpApyJ4h53V6TQan4Ru4OXqz+91rCLjpIVdphhaB0l+TvNsA==" + remote: + - peerId: "12D3KooWA4FLWvrMbCtp2MbzKcC5RRN7HqxxBxPcSADFfzrGiW3U" + addr: "127.0.0.1:4431" + - peerId: "12D3KooWHJpSEMQUZCyK8TK181LhjzntWjKfXDr7MWks9cw41R2C" + addr: "127.0.0.1:4430" diff --git a/etc/config.yml b/etc/config.yml index 245199a3..782b6015 100644 --- a/etc/config.yml +++ b/etc/config.yml @@ -4,7 +4,13 @@ anytype: grpcServer: listenAddrs: - "127.0.0.1:4430" - - "127.0.0.1:4431" - tls: false - tlsKeyFile: "etc/x509/key.pem" - tlsCertFile: "etc/x509/cert.pem" + +peerList: + myId: + peerId: "12D3KooWHJpSEMQUZCyK8TK181LhjzntWjKfXDr7MWks9cw41R2C" + privKey: "3BhkWxi0Vzc2AhLtw7LhFHa9Ys4P0wHOlPCW02O6FKJvS8V2nzkJGDlM3vcSLZZ0m9tyYuCKqK4TWUKXgu/FVQ==" + remote: + - peerId: "12D3KooWA4FLWvrMbCtp2MbzKcC5RRN7HqxxBxPcSADFfzrGiW3U" + addr: "127.0.0.1:4431" + - peerId: "12D3KooWK6c1CPLL4Bvjim9A9SDRmehy12hYjbqX1VASHKfH7W7H" + addr: "127.0.0.1:4432" diff --git a/etc/x509/cert.pem b/etc/x509/cert.pem deleted file mode 100644 index 0ddaa01e..00000000 --- a/etc/x509/cert.pem +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFJTCCAw2gAwIBAgIUNiBcO8wV6YezcDQ+cLpZe/iXbGYwDQYJKoZIhvcNAQEL -BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMDcxMzE5NDgwNFoXDTMyMDcx -MDE5NDgwNFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEAt+6cVBVkEe9I3CRmPuAqZGnLq48DTXaRH7xz6u4ld7tU -cpDaXw+aURRYKGfYIvcfQav/i+mYUxTQDFbfN8SULis/DckTqeBEaGgUbJJZ6w73 -kkB8BuCiIjh3W9hyUHr+WbdF9wU8K1G6GmjimBJ+qlBBewQm0kzqosVwjQVWarN4 -aEhgiyjnLF9XVYQZRVqGxKzP/MssEU7YjSPPfBEsmi6pAqiDYuZ3+sVlKuDrki0d -r1XOcV/dcSJa4NRazxiWME+GJQ/x7gA2GlC5FbQyhrOs1sNWaBsaWQGl4oHB90T7 -b0GxKOTqI7oCMho+Ajt7eB4zN0fqeCw0nwFyzok3f/GKFk0vLnecFt+gCLyMyS6X -Dqf/DAlvoP41UeFI/rheOwc0UcZbU0HZ2zYrzOYR4eHMHSYKma2DHvIyOYZIV0Uw -tkyOFnoEQGSXK3TMOb7oWyrs4gl+5euPEDKqDuP28xBr4GsFbNq7/7Kd9rKwXb3L -iyy3kot2Vf5QqDFGdyOLDFFKF7MgMrUiEX8onW+fSmjooqUq7ZyLAs8W0uim4moQ -52t7CGUuglaTHYMi2rfoAS5qPXT76jiwu7H351Psca6EIY4V+dIiElvbYryhTNsV -4eDdWGJoZUyGACUhPdfO9l7Wp2+Yy/HGfPWm6mKX8VPHO4llYvwgGzm6Is/pFmUC -AwEAAaNvMG0wHQYDVR0OBBYEFKl07s6kNnGmJN/ASYQTml5UkK0AMB8GA1UdIwQY -MBaAFKl07s6kNnGmJN/ASYQTml5UkK0AMA8GA1UdEwEB/wQFMAMBAf8wGgYDVR0R -BBMwEYIJbG9jYWxob3N0hwR/AAABMA0GCSqGSIb3DQEBCwUAA4ICAQBs5JmRhddd -KuyhkSWd6T/HqAQISgP72ZUAr3gt2j34GLrhDYcvKFZwcoJFCFjG3pVmvJCORVGO -x2TYt2ntsmIyFCZlGE/TpLxbSgsykoUVBnc8ySDnTQTDJr6S7AyWQsznSD6j1/FA -a9E8ZrsyopqIn2eZy9/Asgy1qeJVO4F1kIq+19HUDR2z1rXqVSycOQEJkF84Kgvd -+nDJQ5W3EdamYuDQOhTOeEFfZy1HyM3APhR9JyFHHnZ2D3vsoys/LIWolBJPOq6B -o5JjXgLrA1e12TVXlnTqZ3986vGOyjfut7o2NPO1Se5OeGr6XFwO1nhIJ4gj8OTv -2XuBcslLXI5+6UIsXtFHXAfH7eYErkBCQGiwjYj0V8Kb4M7UZ0seqjK+gMKfvM4Z -hAPlKP2AUNYS7TNyqW3t8SA0c52ASdAezzh/OklCO5vyzxQT4wXTQt5Bub83m9uY -Jnrv6Kg5UPQMrTpo9usJ2zAyj+qkk8KubKOA7grtblmCTvyJFDwyiWZkr0nuvNTV -BsKis/DbJ2hneF+2D/B2pGKxyEP1LCIV/JDTUGX3F8ljTgSihZay/ZZnPUZpbCa0 -czodlAQk4wkGxJWSH6SSkq4dD+JnBQpufBMLa1qShfUn+N1N02yiDPq9XxJytoOR -+vHqqrPS0PcTk1x2Og0xLn6kN+MH0+jRNQ== ------END CERTIFICATE----- diff --git a/etc/x509/key.pem b/etc/x509/key.pem deleted file mode 100644 index 84d64a5e..00000000 --- a/etc/x509/key.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC37pxUFWQR70jc -JGY+4CpkacurjwNNdpEfvHPq7iV3u1RykNpfD5pRFFgoZ9gi9x9Bq/+L6ZhTFNAM -Vt83xJQuKz8NyROp4ERoaBRsklnrDveSQHwG4KIiOHdb2HJQev5Zt0X3BTwrUboa -aOKYEn6qUEF7BCbSTOqixXCNBVZqs3hoSGCLKOcsX1dVhBlFWobErM/8yywRTtiN -I898ESyaLqkCqINi5nf6xWUq4OuSLR2vVc5xX91xIlrg1FrPGJYwT4YlD/HuADYa -ULkVtDKGs6zWw1ZoGxpZAaXigcH3RPtvQbEo5OojugIyGj4CO3t4HjM3R+p4LDSf -AXLOiTd/8YoWTS8ud5wW36AIvIzJLpcOp/8MCW+g/jVR4Uj+uF47BzRRxltTQdnb -NivM5hHh4cwdJgqZrYMe8jI5hkhXRTC2TI4WegRAZJcrdMw5vuhbKuziCX7l648Q -MqoO4/bzEGvgawVs2rv/sp32srBdvcuLLLeSi3ZV/lCoMUZ3I4sMUUoXsyAytSIR -fyidb59KaOiipSrtnIsCzxbS6KbiahDna3sIZS6CVpMdgyLat+gBLmo9dPvqOLC7 -sffnU+xxroQhjhX50iISW9tivKFM2xXh4N1YYmhlTIYAJSE91872Xtanb5jL8cZ8 -9abqYpfxU8c7iWVi/CAbOboiz+kWZQIDAQABAoICAAcytJX6z1N/WonY99Jime4b -kM+qNV4g8317NcseHkPBBkVEg3NAbFDbe7a7F6OIqcW7ajEKx34K3Lh65tnrHMRw -x1MuCRG3F95BInl8Qb4X9BraYLAxNs8hiBRFVHXvVkhjCn8oCoqEdITHkYSThrb6 -FJHwn+dPgMg1c1nleVQMKXxlRrfzdhaPtZ6AYK/M4uTMAYi6V8Nmo0VkvyAzGNyA -0nbq6tdiPxRGiNbEfhuWneiIcl+P+Z3NkyJk1RfxNaF230BQjy55/iQKADBIAMky -O2OdOeKxmtacYKZMXy+i2LcqKjl4OeyDgUX+LmqOct7IycbSTuv8iOOnHhvUlWIg -nFYHx2i/t5mHp0kPjHUzqu40HaRKPpGxAzzSL/W2WNuSFzbZB6SMTGIxG77hGkUh -saoOSLRDL7DhEvvZ5cvhVM0l2mrufak0sUR7K/TooheQ+0A6bU+pZW1kzfwt4ICI -BlGZt6rw7dSEDMButhfMkWPCIowULrtevB9pOULfvwGcpslMNN6KiAl8mjR6OwJB -7AdWCCCC52p240OKe8N4eBoPr6T44LoBsKFpCI2Ztd8IG3LP6AGJueWFLrmPj1J+ -WePs5WX5IGfHSHJondm1BWS1nwkdSZQUaeL/POi0YbaAlgndpZAbpkfxjcLuB7Wd -5iOqiIkrGCjVyFTXBipxAoIBAQDE0amd/TrSPwcdLLkhGZswSgGatlenqw/DLswy -30Vu6NzZ2dRHKk1eX3GApgBtYmkP4n3Jadaxl8OXGCw+mPv9fBHgVrmcwt9CCTNL -uwKvGtEpvXH2LgcmFTEL8CnKoM7ZlXDAlGSPf46pOU8HG8nOqOywkIaoiiLAPZHZ -Y3FMLs7s0UEDYSM0EWHr6/po8VQLSnyN5NDcUhn6dsNgjS4p9W90lHHK24J7dqGh -ye4vWslzB5K47JitYKzpo3+dOUpu1/jo9uwzDsUw7SON7CKtKgldwrzvZGiRBhVW -j+cLHdRdCNz2gF/aI2JwgkW1HC+0X3RQs+H99g+yWNDYbyGVAoIBAQDvPPbql0kz -FzdpInbtBY7Z4V0ZRveeWDMln04qtEuifHzme0K03itACcxAhWAwAV8fCjZJdmkc -nQVJ/0i05IFSXiFAKpuhyA9TkPiwxYwlFpvKDk2lhAQ0yR7ig8wCYs1ZA6PKWwHl -Zd7FJKAjTkHey/KAagA1ya8XTBeIDiIQKriMVU9DdJ+4tEFqZLq9EUd/QHJkrxaV -jwmwcc26oE8XAFdFdZtqqvKjhpO4OjFN8C9TIX70krrzTSN2FTK1Y5IVSanzkYEB -Ovy/gedWzq9evuGRoKKNxYqYUXy/p6DiD36OMHZveGssPCkI4NIdPLVo1L6YXuMS -pLl2PswHmI2RAoIBAAiMCk+gFZPXxNlRfeCgGgsoy5UKYhgX56FUQO3coElGt4CG -Yx+MCLwWbPlnPBGD+ogED+5VOEuSCZ5gIFu/jQHfB2+0lG7oT4WwnJenUWCFS5wC -bBaCvTC8LtsT3Ny9yv3L7Y+PYiaRJYLXyETIwiTFVTH9tLtQ9F1gzxqfpOXoCnhi -Re59o2e5cYUrRD6WbE3pOCt5SlCnCBXGXoms19penC5129MxYSM3baF3AW7xBFqI -c6iwLZkp35htzzbmrALQQjDruCondAzB349kN8VJVArMUCQdOiVCHF8b9K6Y5wX7 -Qo052e/BJZ85KQnKZY/xrT1r8l5y9w+Jp9geS1kCggEBAJxp34XBI7qjkzbJsbeF -yr/o+FVucLa2M7qFTTXeaxTxDzghnptiJiTYQxJsIVdBjk9c/eFJ6a8reinHHmIm -g+a2ZEbvlJFRm7OnNPFeNyKIhZK1h06P4bAhTnAKe3eT4W4xUwUaO0MgN2XtbEWp -BKgF76bFpx2Dn1Y8CaaKlvq6863MmOYhecvpDlvhP7YddgFcwW3Si5F803jo7vj1 -lsATGPvwyIwU+E6xziLE6TdrsYVIgRimVlR8OpMZiO3PC9OfNd5pY07KojUTWY0H -1OC9K/1qaN0IKnUr0cP8dNNYDgYo6UY4FNn2+10yoC09Y94GOhak8xFdYWRN6leN -BgECggEAbS7bbv1gIB8toaAWBXxEnLtAU0Ob8e7uD2JYKZqe6NaC+ZX5NTLn+QSG -Y4SkBORGw+v1BIw7Rdk6jlEPpYWncQigQ6YbhqerL39+lmatXoSbQBcMRsjPP0gF -yuOb48ff/uXJhlnbVBJHXMfOW8LDFXL3bgMS2HpWnr5Buu7zGB4ERHg91+tuczNL -qEa85pyvY974arF/53T7Kmzdd/fx7I6RZeZpBGWKqwuZSJTMYL7V/LyKyfU8CTP1 -nz86BQIF1Cr8UXyOUI33UZMFwIXb62HRDXAfij7Ew33rj803l4cedNluXHSx/kNH -3XcrP5qofkzfgz1calZv6phIGJdHLQ== ------END PRIVATE KEY----- diff --git a/go.mod b/go.mod index 91d42059..dad41ff7 100644 --- a/go.mod +++ b/go.mod @@ -47,6 +47,7 @@ require ( golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect + gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect lukechampine.com/blake3 v1.1.6 // indirect ) diff --git a/go.sum b/go.sum index 04a8f6c5..12d550cb 100644 --- a/go.sum +++ b/go.sum @@ -160,6 +160,8 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/pkg/ocache/ocache.go b/pkg/ocache/ocache.go index 9f72aa38..b0460ca6 100644 --- a/pkg/ocache/ocache.go +++ b/pkg/ocache/ocache.go @@ -10,9 +10,10 @@ import ( ) var ( - ErrClosed = errors.New("object cache closed") - ErrExists = errors.New("object exists") - ErrTimeout = errors.New("loading object timed out") + ErrClosed = errors.New("object cache closed") + ErrExists = errors.New("object exists") + ErrTimeout = errors.New("loading object timed out") + ErrNotExists = errors.New("object not exists") ) var ( @@ -20,10 +21,6 @@ var ( defaultGC = 20 * time.Second ) -type key int - -const CacheTimeout key = 0 - var log = logger.NewNamed("ocache") type LoadFunc func(ctx context.Context, id string) (value Object, err error) @@ -61,7 +58,9 @@ func New(loadFunc LoadFunc, opts ...Option) OCache { for _, o := range opts { o(c) } - go c.ticker() + if c.ttl != 0 { + go c.ticker() + } return c } @@ -99,6 +98,8 @@ type OCache interface { // Increases the object refs counter on successful // When 'loadFunc' returns a non-nil error, an object will not be stored to cache Get(ctx context.Context, id string) (value Object, err error) + // Pick returns value if it's presents in cache (will not call loadFunc) + Pick(id string) (value Object, err error) // Add adds new object to cache // Returns error when object exists Add(id string, value Object) (err error) @@ -154,28 +155,28 @@ func (c *oCache) Get(ctx context.Context, id string) (value Object, err error) { e.refCount++ c.mu.Unlock() - timeout := ctx.Value(CacheTimeout) if load { - if timeout != nil { - go c.load(ctx, id, e) - } else { - c.load(ctx, id, e) - } + go c.load(ctx, id, e) } - - if timeout != nil { - duration := timeout.(time.Duration) - select { - case <-e.load: - return e.value, e.loadErr - case <-time.After(duration): - return nil, ErrTimeout - } + select { + case <-ctx.Done(): + return nil, ctx.Err() + case <-e.load: } - <-e.load return e.value, e.loadErr } +func (c *oCache) Pick(id string) (value Object, err error) { + c.mu.Lock() + val, ok := c.data[id] + c.mu.Unlock() + if !ok { + return nil, ErrNotExists + } + <-val.load + return val.value, val.loadErr +} + func (c *oCache) load(ctx context.Context, id string, e *entry) { defer close(e.load) value, err := c.loadFunc(ctx, id) diff --git a/pkg/ocache/ocache_test.go b/pkg/ocache/ocache_test.go index eb3a1caf..55bf2e95 100644 --- a/pkg/ocache/ocache_test.go +++ b/pkg/ocache/ocache_test.go @@ -92,6 +92,20 @@ func TestOCache_Get(t *testing.T) { _, err := c.Get(context.TODO(), "id") assert.Equal(t, ErrClosed, err) }) + t.Run("context cancel", func(t *testing.T) { + c := New(func(ctx context.Context, id string) (value Object, err error) { + time.Sleep(time.Second / 3) + return &testObject{ + name: "id", + }, nil + }) + + ctx, cancel := context.WithCancel(context.Background()) + cancel() + _, err := c.Get(ctx, "id") + assert.Equal(t, context.Canceled, err) + assert.NoError(t, c.Close()) + }) } func TestOCache_GC(t *testing.T) { diff --git a/service/example/example.go b/service/example/example.go new file mode 100644 index 00000000..c3513fd8 --- /dev/null +++ b/service/example/example.go @@ -0,0 +1,84 @@ +package example + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "go.uber.org/zap" + "strings" + "time" +) + +var log = logger.NewNamed("example") + +type Example struct { + pool pool.Pool + peerConf config.PeerList +} + +func (e *Example) Init(ctx context.Context, a *app.App) (err error) { + e.pool = a.MustComponent(pool.CName).(pool.Pool) + e.peerConf = a.MustComponent(config.CName).(*config.Config).PeerList + + // subscribe for sync messages + e.pool.AddHandler(syncproto.MessageType_MessageTypeSync, e.syncHandler) + return +} + +func (e *Example) Name() (name string) { + return "example" +} + +func (e *Example) Run(ctx context.Context) (err error) { + // dial manually with all peers + for _, rp := range e.peerConf.Remote { + if er := e.pool.DialAndAddPeer(ctx, rp.PeerId); er != nil { + log.Info("can't dial to peer", zap.Error(er)) + } else { + log.Info("connected with peer", zap.String("peerId", rp.PeerId)) + } + } + go e.doRequests() + return nil +} + +func (e *Example) syncHandler(ctx context.Context, msg *pool.Message) (err error) { + data := string(msg.Data) // you need unmarshal this bytes + log.Info("msg received", zap.String("peerId", msg.Peer().Id()), zap.String("data", data)) + + if strings.HasPrefix(data, "ack:") { + if err = msg.Ack(); err != nil { + log.Error("ack error", zap.Error(err)) + } + } else if strings.HasPrefix(data, "ackErr:") { + if err = msg.AckError(42, "ack error description"); err != nil { + log.Error("ackErr error", zap.Error(err)) + } + } else if strings.HasPrefix(data, "reply:") { + if err = msg.Reply([]byte("reply for:" + strings.TrimPrefix(data, "reply:"))); err != nil { + log.Error("reply error", zap.Error(err)) + } + } + return nil +} + +func (e *Example) doRequests() { + time.Sleep(time.Second) + ctx := context.Background() + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + + st := time.Now() + err := e.pool.SendAndWait(ctx, e.peerConf.Remote[0].PeerId, &syncproto.Message{ + Header: &syncproto.Header{Type: syncproto.MessageType_MessageTypeSync}, + Data: []byte("ack: something"), + }) + log.Info("sent with ack:", zap.Error(err), zap.Duration("dur", time.Since(st))) +} + +func (e *Example) Close(ctx context.Context) (err error) { + return +} diff --git a/service/net/dialer/dialer.go b/service/net/dialer/dialer.go new file mode 100644 index 00000000..a1cb8a31 --- /dev/null +++ b/service/net/dialer/dialer.go @@ -0,0 +1,104 @@ +package dialer + +import ( + "context" + "errors" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" + "github.com/libp2p/go-libp2p-core/sec" + "go.uber.org/zap" + "net" + "storj.io/drpc" + "storj.io/drpc/drpcconn" + "sync" +) + +const CName = "net/dialer" + +var ErrArrdsNotFound = errors.New("addrs for peer not found") + +var log = logger.NewNamed(CName) + +func New() Dialer { + return &dialer{} +} + +type Dialer interface { + Dial(ctx context.Context, peerId string) (peer peer.Peer, err error) + UpdateAddrs(addrs map[string][]string) + app.Component +} + +type dialer struct { + transport secure.Service + peerAddrs map[string][]string + + mu sync.RWMutex +} + +func (d *dialer) Init(ctx context.Context, a *app.App) (err error) { + d.transport = a.MustComponent(secure.CName).(secure.Service) + peerConf := a.MustComponent(config.CName).(*config.Config).PeerList.Remote + d.peerAddrs = map[string][]string{} + for _, rp := range peerConf { + d.peerAddrs[rp.PeerId] = []string{rp.Addr} + } + return +} + +func (d *dialer) Name() (name string) { + return CName +} + +func (d *dialer) UpdateAddrs(addrs map[string][]string) { + d.mu.Lock() + d.peerAddrs = addrs + d.mu.Unlock() +} + +func (d *dialer) Dial(ctx context.Context, peerId string) (peer peer.Peer, err error) { + d.mu.RLock() + defer d.mu.RUnlock() + addrs, ok := d.peerAddrs[peerId] + if !ok || len(addrs) == 0 { + return nil, ErrArrdsNotFound + } + var ( + stream drpc.Stream + sc sec.SecureConn + ) + for _, addr := range addrs { + stream, sc, err = d.makeStream(ctx, addr) + if err != nil { + log.Info("can't connect to host", zap.String("addr", addr)) + } else { + err = nil + break + } + } + if err != nil { + return + } + return rpc.PeerFromStream(sc, stream, false), nil +} + +func (d *dialer) makeStream(ctx context.Context, addr string) (stream drpc.Stream, sc sec.SecureConn, err error) { + tcpConn, err := net.Dial("tcp", addr) + if err != nil { + return + } + sc, err = d.transport.TLSConn(ctx, tcpConn) + if err != nil { + return + } + log.Info("connected with remote host", zap.String("serverPeer", sc.RemotePeer().String()), zap.String("per", sc.LocalPeer().String())) + stream, err = drpcconn.New(sc).NewStream(ctx, "", rpc.Encoding) + if err != nil { + return + } + return stream, sc, err +} diff --git a/service/net/peer/peer.go b/service/net/peer/peer.go new file mode 100644 index 00000000..331b0982 --- /dev/null +++ b/service/net/peer/peer.go @@ -0,0 +1,35 @@ +package peer + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "time" +) + +type Dir uint + +const ( + // DirInbound indicates peer created connection + DirInbound Dir = iota + // DirOutbound indicates that our host created connection + DirOutbound +) + +type Info struct { + Id string + Dir Dir + LastActiveUnix int64 +} + +func (i Info) LastActive() time.Time { + return time.Unix(i.LastActiveUnix, 0) +} + +type Peer interface { + Id() string + Info() Info + Recv() (*syncproto.Message, error) + Send(msg *syncproto.Message) (err error) + Context() context.Context + Close() error +} diff --git a/service/net/pool/message.go b/service/net/pool/message.go new file mode 100644 index 00000000..bc067a12 --- /dev/null +++ b/service/net/pool/message.go @@ -0,0 +1,71 @@ +package pool + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "gopkg.in/mgo.v2/bson" +) + +type Message struct { + *syncproto.Message + peer peer.Peer +} + +func (m *Message) Peer() peer.Peer { + return m.peer +} + +func (m *Message) Reply(data []byte) (err error) { + rep := &syncproto.Message{ + Header: &syncproto.Header{ + TraceId: m.GetHeader().TraceId, + ReplyId: m.GetHeader().RequestId, + Type: syncproto.MessageType_MessageTypeSync, + }, + Data: data, + } + return m.peer.Send(rep) +} + +func (m *Message) Ack() (err error) { + ack := &syncproto.System{ + Ack: &syncproto.SystemAck{}, + } + data, err := ack.Marshal() + if err != nil { + return + } + rep := &syncproto.Message{ + Header: &syncproto.Header{ + TraceId: m.GetHeader().TraceId, + ReplyId: m.GetHeader().RequestId, + Type: syncproto.MessageType_MessageTypeSystem, + }, + Data: data, + } + return m.peer.Send(rep) +} + +func (m *Message) AckError(code syncproto.SystemErrorCode, description string) (err error) { + ack := &syncproto.System{ + Ack: &syncproto.SystemAck{ + Error: &syncproto.SystemError{ + Code: code, + Description: description, + }, + }, + } + data, err := ack.Marshal() + if err != nil { + return + } + rep := &syncproto.Message{ + Header: &syncproto.Header{ + TraceId: []byte(bson.NewObjectId()), + ReplyId: m.GetHeader().RequestId, + Type: syncproto.MessageType_MessageTypeSystem, + }, + Data: data, + } + return m.peer.Send(rep) +} diff --git a/service/net/pool/peer.go b/service/net/pool/peer.go new file mode 100644 index 00000000..6a7a96d0 --- /dev/null +++ b/service/net/pool/peer.go @@ -0,0 +1,28 @@ +package pool + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" +) + +type peerEntry struct { + peer peer.Peer + groupIds []string + ready chan struct{} +} + +func (pe *peerEntry) addGroup(groupId string) (ok bool) { + if slice.FindPos(pe.groupIds, groupId) != -1 { + return false + } + pe.groupIds = append(pe.groupIds, groupId) + return true +} + +func (pe *peerEntry) removeGroup(groupId string) (ok bool) { + if slice.FindPos(pe.groupIds, groupId) == -1 { + return false + } + pe.groupIds = slice.Remove(pe.groupIds, groupId) + return true +} diff --git a/service/net/pool/pool.go b/service/net/pool/pool.go new file mode 100644 index 00000000..21779ca0 --- /dev/null +++ b/service/net/pool/pool.go @@ -0,0 +1,305 @@ +package pool + +import ( + "context" + "errors" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" + "go.uber.org/zap" + "sync" + "sync/atomic" +) + +const CName = "sync/peerPool" + +var log = logger.NewNamed("peerPool") + +var ( + ErrPoolClosed = errors.New("peer pool is closed") + ErrPeerNotFound = errors.New("peer not found") +) + +func NewPool() Pool { + return &pool{closed: true} +} + +type Handler func(ctx context.Context, msg *Message) (err error) + +type Pool interface { + DialAndAddPeer(ctx context.Context, id string) (err error) + AddAndReadPeer(peer peer.Peer) (err error) + AddHandler(msgType syncproto.MessageType, h Handler) + AddPeerIdToGroup(peerId, groupId string) (err error) + RemovePeerIdFromGroup(peerId, groupId string) (err error) + + SendAndWait(ctx context.Context, peerId string, msg *syncproto.Message) (err error) + Broadcast(ctx context.Context, groupId string, msg *syncproto.Message) (err error) + + app.ComponentRunnable +} + +type pool struct { + peersById map[string]*peerEntry + waiters waiters + handlers map[syncproto.MessageType][]Handler + peersIdsByGroup map[string][]string + + dialer dialer.Dialer + + closed bool + mu sync.RWMutex + wg *sync.WaitGroup +} + +func (p *pool) Init(ctx context.Context, a *app.App) (err error) { + p.peersById = map[string]*peerEntry{} + p.handlers = map[syncproto.MessageType][]Handler{} + p.peersIdsByGroup = map[string][]string{} + p.waiters = waiters{waiters: map[uint64]*waiter{}} + p.dialer = a.MustComponent(dialer.CName).(dialer.Dialer) + p.wg = &sync.WaitGroup{} + return nil +} + +func (p *pool) Name() (name string) { + return CName +} + +func (p *pool) Run(ctx context.Context) (err error) { + p.closed = false + return nil +} + +func (p *pool) AddHandler(msgType syncproto.MessageType, h Handler) { + p.mu.Lock() + defer p.mu.Unlock() + if !p.closed { + // unable to add handler after Run + return + } + p.handlers[msgType] = append(p.handlers[msgType], h) +} + +func (p *pool) DialAndAddPeer(ctx context.Context, peerId string) (err error) { + p.mu.Lock() + defer p.mu.Unlock() + if p.closed { + return ErrPoolClosed + } + if _, ok := p.peersById[peerId]; ok { + return nil + } + peer, err := p.dialer.Dial(ctx, peerId) + if err != nil { + return + } + p.peersById[peer.Id()] = &peerEntry{ + peer: peer, + } + p.wg.Add(1) + go p.readPeerLoop(peer) + return nil +} + +func (p *pool) AddAndReadPeer(peer peer.Peer) (err error) { + p.mu.Lock() + if p.closed { + p.mu.Unlock() + return ErrPoolClosed + } + p.peersById[peer.Id()] = &peerEntry{ + peer: peer, + } + p.wg.Add(1) + p.mu.Unlock() + return p.readPeerLoop(peer) +} + +func (p *pool) AddPeerIdToGroup(peerId, groupId string) (err error) { + p.mu.Lock() + defer p.mu.Unlock() + peer, ok := p.peersById[peerId] + if !ok { + return ErrPeerNotFound + } + if slice.FindPos(peer.groupIds, groupId) != -1 { + return nil + } + peer.addGroup(groupId) + p.peersIdsByGroup[groupId] = append(p.peersIdsByGroup[groupId], peerId) + return +} + +func (p *pool) RemovePeerIdFromGroup(peerId, groupId string) (err error) { + p.mu.Lock() + defer p.mu.Unlock() + peer, ok := p.peersById[peerId] + if !ok { + return ErrPeerNotFound + } + if slice.FindPos(peer.groupIds, groupId) == -1 { + return nil + } + peer.removeGroup(groupId) + p.peersIdsByGroup[groupId] = slice.Remove(p.peersIdsByGroup[groupId], peerId) + return +} + +func (p *pool) SendAndWait(ctx context.Context, peerId string, msg *syncproto.Message) (err error) { + p.mu.RLock() + peer := p.peersById[peerId] + p.mu.RUnlock() + if peer == nil { + return ErrPeerNotFound + } + repId := p.waiters.NewReplyId() + msg.GetHeader().RequestId = repId + ch := make(chan Reply, 1) + p.waiters.Add(repId, &waiter{ch: ch}) + defer p.waiters.Remove(repId) + if err = peer.peer.Send(msg); err != nil { + return + } + select { + case rep := <-ch: + if rep.Error != nil { + return rep.Error + } + return nil + case <-ctx.Done(): + return ctx.Err() + } +} + +func (p *pool) Broadcast(ctx context.Context, groupId string, msg *syncproto.Message) (err error) { + //TODO implement me + panic("implement me") +} + +func (p *pool) readPeerLoop(peer peer.Peer) (err error) { + defer p.wg.Done() + for { + msg, err := peer.Recv() + if err != nil { + log.Debug("peer receive error", zap.Error(err), zap.String("peerId", peer.Id())) + break + } + p.handleMessage(peer, msg) + } + if err = p.removePeer(peer.Id()); err != nil { + log.Error("remove peer error", zap.String("peerId", peer.Id())) + } + return +} + +func (p *pool) removePeer(peerId string) (err error) { + p.mu.Lock() + defer p.mu.Unlock() + _, ok := p.peersById[peerId] + if !ok { + return ErrPeerNotFound + } + delete(p.peersById, peerId) + return +} + +func (p *pool) handleMessage(peer peer.Peer, msg *syncproto.Message) { + replyId := msg.GetHeader().GetReplyId() + if replyId != 0 { + if !p.waiters.Send(replyId, Reply{ + PeerInfo: peer.Info(), + Message: &Message{ + Message: msg, + peer: peer, + }, + }) { + log.Debug("received reply with unknown (or expired) replyId", zap.Uint64("replyId", replyId)) + } + return + } + handlers := p.handlers[msg.GetHeader().GetType()] + if len(handlers) == 0 { + return + } + + message := &Message{Message: msg, peer: peer} + + for _, h := range handlers { + if err := h(peer.Context(), message); err != nil { + log.Error("handle message error", zap.Error(err)) + } + } +} + +func (p *pool) Close(ctx context.Context) (err error) { + p.mu.Lock() + for _, peer := range p.peersById { + peer.peer.Close() + } + wg := p.wg + p.mu.Unlock() + if wg != nil { + wg.Wait() + } + return nil +} + +type waiter struct { + sent int + ch chan<- Reply +} + +type waiters struct { + waiters map[uint64]*waiter + replySeq uint64 + mu sync.Mutex +} + +func (w waiters) Send(replyId uint64, r Reply) (ok bool) { + w.mu.Lock() + wait := w.waiters[replyId] + if wait == nil { + w.mu.Unlock() + return false + } + wait.sent++ + var lastMessage = wait.sent == cap(wait.ch) + if lastMessage { + delete(w.waiters, replyId) + } + w.mu.Unlock() + wait.ch <- r + if lastMessage { + close(wait.ch) + } + return true +} + +func (w waiters) Add(replyId uint64, wait *waiter) { + w.mu.Lock() + w.waiters[replyId] = wait + w.mu.Unlock() +} + +func (w waiters) Remove(id uint64) error { + w.mu.Lock() + defer w.mu.Unlock() + if _, ok := w.waiters[id]; ok { + delete(w.waiters, id) + return nil + } + return fmt.Errorf("waiter not found") +} + +func (w waiters) NewReplyId() uint64 { + res := atomic.AddUint64(&w.replySeq, 1) + if res == 0 { + return w.NewReplyId() + } + return res +} diff --git a/service/net/pool/request.go b/service/net/pool/request.go new file mode 100644 index 00000000..8584f0dd --- /dev/null +++ b/service/net/pool/request.go @@ -0,0 +1,45 @@ +package pool + +import "context" + +// 1. message for one peerId with ack +// pool.SendAndWait(ctx context,.C +// 2. message for many peers without ack (or group) + +type Request struct { + groupId string + oneOf []string + all []string + tryDial bool + needReply bool + pool *pool +} + +func (r *Request) GroupId(groupId string) *Request { + r.groupId = groupId + return r +} + +func (r *Request) All(peerIds ...string) *Request { + r.all = peerIds + return r +} + +func (r *Request) OneOf(peerIds ...string) *Request { + r.oneOf = peerIds + return r +} + +func (r *Request) TryDial(is bool) *Request { + r.tryDial = is + return r +} + +func (r *Request) NeedReply(is bool) *Request { + r.needReply = is + return r +} + +func (r *Request) Exec(ctx context.Context, msg *Message) *Results { + return nil +} diff --git a/service/net/pool/result.go b/service/net/pool/result.go new file mode 100644 index 00000000..94f1ac93 --- /dev/null +++ b/service/net/pool/result.go @@ -0,0 +1,53 @@ +package pool + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" +) + +// Results of request collects replies and errors +// Must be closed after usage r.Close() +type Results struct { + ctx context.Context + cancel func() + waiterId uint64 + ch chan Reply + pool *pool +} + +// Iterate iterates over replies +// if callback will return a non-nil error then iteration stops +func (r *Results) Iterate(callback func(r Reply) (err error)) (err error) { + if r.ctx == nil || r.ch == nil { + return fmt.Errorf("results not initialized") + } + for { + select { + case <-r.ctx.Done(): + return r.ctx.Err() + case m, ok := <-r.ch: + if ok { + if err = callback(m); err != nil { + return err + } + } else { + return + } + } + } +} + +// Close cancels iteration and unregister reply handler in the pool +// Required to call to avoid memory leaks +func (r *Results) Close() (err error) { + r.cancel() + return r.pool.waiters.Remove(r.waiterId) +} + +// Reply presents the result of request executing can be error or result message +type Reply struct { + PeerInfo peer.Info + Error error + Message *Message +} diff --git a/service/net/rpc/encoding.go b/service/net/rpc/encoding.go new file mode 100644 index 00000000..eb983b9d --- /dev/null +++ b/service/net/rpc/encoding.go @@ -0,0 +1,18 @@ +package rpc + +import ( + "github.com/gogo/protobuf/proto" + "storj.io/drpc" +) + +var Encoding = enc{} + +type enc struct{} + +func (e enc) Marshal(msg drpc.Message) ([]byte, error) { + return msg.(proto.Marshaler).Marshal() +} + +func (e enc) Unmarshal(buf []byte, msg drpc.Message) error { + return msg.(proto.Unmarshaler).Unmarshal(buf) +} diff --git a/service/sync/drpcserver/drpcserver.go b/service/net/rpc/server/drpcserver.go similarity index 67% rename from service/sync/drpcserver/drpcserver.go rename to service/net/rpc/server/drpcserver.go index e3fe7bee..dcdf2156 100644 --- a/service/sync/drpcserver/drpcserver.go +++ b/service/net/rpc/server/drpcserver.go @@ -1,15 +1,14 @@ -package drpcserver +package server import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/transport" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" - "github.com/gogo/protobuf/proto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" "go.uber.org/zap" - "io" "net" "storj.io/drpc" "storj.io/drpc/drpcserver" @@ -17,9 +16,9 @@ import ( "time" ) -var log = logger.NewNamed("drpcserver") +const CName = "net/drpcserver" -const CName = "drpcserver" +var log = logger.NewNamed(CName) func New() DRPCServer { return &drpcServer{} @@ -32,14 +31,16 @@ type DRPCServer interface { type drpcServer struct { config config.GrpcServer drpcServer *drpcserver.Server - transport transport.Service - listeners []transport.ContextListener + transport secure.Service + listeners []secure.ContextListener + pool pool.Pool cancel func() } func (s *drpcServer) Init(ctx context.Context, a *app.App) (err error) { s.config = a.MustComponent(config.CName).(*config.Config).GrpcServer - s.transport = a.MustComponent(transport.CName).(transport.Service) + s.transport = a.MustComponent(secure.CName).(secure.Service) + s.pool = a.MustComponent(pool.CName).(pool.Pool) return nil } @@ -61,7 +62,7 @@ func (s *drpcServer) Run(ctx context.Context) (err error) { return } -func (s *drpcServer) serve(ctx context.Context, lis transport.ContextListener) { +func (s *drpcServer) serve(ctx context.Context, lis secure.ContextListener) { l := log.With(zap.String("localAddr", lis.Addr().String())) l.Info("drpc listener started") defer func() { @@ -85,7 +86,7 @@ func (s *drpcServer) serve(ctx context.Context, lis transport.ContextListener) { } continue } - if _, ok := err.(transport.HandshakeError); ok { + if _, ok := err.(secure.HandshakeError); ok { l.Warn("listener handshake error", zap.Error(err)) continue } @@ -108,30 +109,14 @@ func (s *drpcServer) serveConn(ctx context.Context, conn net.Conn) { } } -func (s *drpcServer) HandleRPC(stream drpc.Stream, rpc string) (err error) { +func (s *drpcServer) HandleRPC(stream drpc.Stream, _ string) (err error) { ctx := stream.Context() - sc, err := transport.CtxSecureConn(ctx) + sc, err := secure.CtxSecureConn(ctx) if err != nil { return } - l := log.With(zap.String("peer", sc.RemotePeer().String())) - l.Info("stream opened") - defer func() { - l.Info("stream closed", zap.Error(err)) - }() - for { - msg := &syncproto.SyncMessage{} - if err = stream.MsgRecv(msg, enc{}); err != nil { - if err == io.EOF { - return - } - } - //log.Debug("receive msg", zap.Int("seq", int(msg.Seq))) - if err = stream.MsgSend(msg, enc{}); err != nil { - return - } - } - return nil + log.With(zap.String("peer", sc.RemotePeer().String())).Debug("stream opened") + return s.pool.AddAndReadPeer(rpc.PeerFromStream(sc, stream, true)) } func (s *drpcServer) Close(ctx context.Context) (err error) { @@ -145,13 +130,3 @@ func (s *drpcServer) Close(ctx context.Context) (err error) { } return } - -type enc struct{} - -func (e enc) Marshal(msg drpc.Message) ([]byte, error) { - return msg.(proto.Marshaler).Marshal() -} - -func (e enc) Unmarshal(buf []byte, msg drpc.Message) error { - return msg.(proto.Unmarshaler).Unmarshal(buf) -} diff --git a/service/sync/drpcserver/util.go b/service/net/rpc/server/util.go similarity index 92% rename from service/sync/drpcserver/util.go rename to service/net/rpc/server/util.go index d84358eb..5852288a 100644 --- a/service/sync/drpcserver/util.go +++ b/service/net/rpc/server/util.go @@ -1,6 +1,6 @@ //go:build !windows -package drpcserver +package server import ( "errors" diff --git a/service/sync/drpcserver/util_windows.go b/service/net/rpc/server/util_windows.go similarity index 97% rename from service/sync/drpcserver/util_windows.go rename to service/net/rpc/server/util_windows.go index 3acba434..efef2915 100644 --- a/service/sync/drpcserver/util_windows.go +++ b/service/net/rpc/server/util_windows.go @@ -1,6 +1,6 @@ //go:build windows -package drpcserver +package server import ( "errors" diff --git a/service/net/rpc/stream.go b/service/net/rpc/stream.go new file mode 100644 index 00000000..c05691da --- /dev/null +++ b/service/net/rpc/stream.go @@ -0,0 +1,55 @@ +package rpc + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "github.com/libp2p/go-libp2p-core/sec" + "storj.io/drpc" + "sync/atomic" + "time" +) + +func PeerFromStream(sc sec.SecureConn, stream drpc.Stream, incoming bool) peer.Peer { + dp := &drpcPeer{ + sc: sc, + Stream: stream, + } + dp.info.Id = sc.RemotePeer().String() + if incoming { + dp.info.Dir = peer.DirInbound + } else { + dp.info.Dir = peer.DirOutbound + } + return dp +} + +type drpcPeer struct { + sc sec.SecureConn + info peer.Info + drpc.Stream +} + +func (d *drpcPeer) Id() string { + return d.info.Id +} + +func (d *drpcPeer) Info() peer.Info { + return d.info +} + +func (d *drpcPeer) Recv() (msg *syncproto.Message, err error) { + msg = &syncproto.Message{} + if err = d.Stream.MsgRecv(msg, Encoding); err != nil { + return + } + atomic.StoreInt64(&d.info.LastActiveUnix, time.Now().Unix()) + return +} + +func (d *drpcPeer) Send(msg *syncproto.Message) (err error) { + if err = d.Stream.MsgSend(msg, Encoding); err != nil { + return + } + atomic.StoreInt64(&d.info.LastActiveUnix, time.Now().Unix()) + return +} diff --git a/service/sync/transport/context.go b/service/net/secure/context.go similarity index 97% rename from service/sync/transport/context.go rename to service/net/secure/context.go index f30bab39..c38da959 100644 --- a/service/sync/transport/context.go +++ b/service/net/secure/context.go @@ -1,4 +1,4 @@ -package transport +package secure import ( "context" diff --git a/service/sync/transport/listener.go b/service/net/secure/listener.go similarity index 98% rename from service/sync/transport/listener.go rename to service/net/secure/listener.go index 97e9e6f4..a0c61d56 100644 --- a/service/sync/transport/listener.go +++ b/service/net/secure/listener.go @@ -1,4 +1,4 @@ -package transport +package secure import ( "context" diff --git a/service/sync/transport/transport.go b/service/net/secure/service.go similarity index 55% rename from service/sync/transport/transport.go rename to service/net/secure/service.go index 5b7e952a..b61c2f86 100644 --- a/service/sync/transport/transport.go +++ b/service/net/secure/service.go @@ -1,11 +1,13 @@ -package transport +package secure import ( "context" - "crypto/rand" + "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/sec" libp2ptls "github.com/libp2p/go-libp2p/p2p/security/tls" "go.uber.org/zap" @@ -14,9 +16,9 @@ import ( type HandshakeError error -var log = logger.NewNamed("transport") +const CName = "net/secure" -const CName = "transport" +var log = logger.NewNamed(CName) func New() Service { return &service{} @@ -33,13 +35,39 @@ type service struct { } func (s *service) Init(ctx context.Context, a *app.App) (err error) { - var pubKey crypto.PubKey - s.key, pubKey, err = crypto.GenerateEd25519Key(rand.Reader) + peerConf := a.MustComponent(config.CName).(*config.Config).PeerList + pkb, err := crypto.ConfigDecodeKey(peerConf.MyId.PrivKey) if err != nil { return } - pubKeyRaw, _ := pubKey.Raw() - log.Info("transport keys generated", zap.Binary("pubKey", pubKeyRaw)) + if s.key, err = crypto.UnmarshalEd25519PrivateKey(pkb); err != nil { + return + } + + pid, err := peer.Decode(peerConf.MyId.PeerId) + if err != nil { + return + } + + var testData = []byte("test data") + sign, err := s.key.Sign(testData) + if err != nil { + return + } + pubKey, err := pid.ExtractPublicKey() + if err != nil { + return + } + ok, err := pubKey.Verify(testData, sign) + if err != nil { + return + } + if !ok { + return fmt.Errorf("peerId and privateKey mismatched") + } + + log.Info("secure service init", zap.String("peerId", peerConf.MyId.PeerId)) + return nil } diff --git a/syncproto/proto/sync.proto b/syncproto/proto/sync.proto index 51b2f3bb..d633afd3 100644 --- a/syncproto/proto/sync.proto +++ b/syncproto/proto/sync.proto @@ -2,6 +2,63 @@ syntax = "proto3"; package anytype; option go_package = "/syncproto"; -message SyncMessage { - int64 seq = 1; -} \ No newline at end of file +message Message { + Header header = 1; + bytes data = 2; +} + +message Header { + bytes traceId = 1; + uint64 requestId = 2; + uint64 replyId = 3; + MessageType type = 4; +} + +enum MessageType { + MessageTypeSystem = 0; + MessageTypeSubscription = 1; + MessageTypeSync = 2; +} + + +message System { + Handshake handshake = 1; + Ping ping = 2; + Ack ack = 3; + + message Handshake { + string protocolVersion = 1; + } + message Ping { + uint64 unixTime = 1; + } + message Ack { + Error error = 2; + } + message Error { + Code code = 1; + string description = 2; + + enum Code { + UNKNOWN = 0; + UNSUPPORTED_PROTOCOL_VERSION = 10; + } + } +} + +message Subscription { + SubscribeSpace subscribeSpace = 1; + UnsubscribeSpace unsubscribeSpace = 2; + + message SubscribeSpace { + string spaceId = 1; + } + message UnsubscribeSpace { + string spaceId = 1; + } +} + +message Sync { + string spaceId = 1; + +} diff --git a/syncproto/sync.pb.go b/syncproto/sync.pb.go index aa3947c8..d673a859 100644 --- a/syncproto/sync.pb.go +++ b/syncproto/sync.pb.go @@ -22,22 +22,76 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -type SyncMessage struct { - Seq int64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"` +type MessageType int32 + +const ( + MessageType_MessageTypeSystem MessageType = 0 + MessageType_MessageTypeSubscription MessageType = 1 + MessageType_MessageTypeSync MessageType = 2 +) + +var MessageType_name = map[int32]string{ + 0: "MessageTypeSystem", + 1: "MessageTypeSubscription", + 2: "MessageTypeSync", } -func (m *SyncMessage) Reset() { *m = SyncMessage{} } -func (m *SyncMessage) String() string { return proto.CompactTextString(m) } -func (*SyncMessage) ProtoMessage() {} -func (*SyncMessage) Descriptor() ([]byte, []int) { +var MessageType_value = map[string]int32{ + "MessageTypeSystem": 0, + "MessageTypeSubscription": 1, + "MessageTypeSync": 2, +} + +func (x MessageType) String() string { + return proto.EnumName(MessageType_name, int32(x)) +} + +func (MessageType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{0} } -func (m *SyncMessage) XXX_Unmarshal(b []byte) error { + +type SystemErrorCode int32 + +const ( + SystemError_UNKNOWN SystemErrorCode = 0 + SystemError_UNSUPPORTED_PROTOCOL_VERSION SystemErrorCode = 10 +) + +var SystemErrorCode_name = map[int32]string{ + 0: "UNKNOWN", + 10: "UNSUPPORTED_PROTOCOL_VERSION", +} + +var SystemErrorCode_value = map[string]int32{ + "UNKNOWN": 0, + "UNSUPPORTED_PROTOCOL_VERSION": 10, +} + +func (x SystemErrorCode) String() string { + return proto.EnumName(SystemErrorCode_name, int32(x)) +} + +func (SystemErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{2, 3, 0} +} + +type Message struct { + Header *Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *Message) Reset() { *m = Message{} } +func (m *Message) String() string { return proto.CompactTextString(m) } +func (*Message) ProtoMessage() {} +func (*Message) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{0} +} +func (m *Message) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SyncMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SyncMessage.Marshal(b, m, deterministic) + return xxx_messageInfo_Message.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -47,44 +101,588 @@ func (m *SyncMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *SyncMessage) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncMessage.Merge(m, src) +func (m *Message) XXX_Merge(src proto.Message) { + xxx_messageInfo_Message.Merge(m, src) } -func (m *SyncMessage) XXX_Size() int { +func (m *Message) XXX_Size() int { return m.Size() } -func (m *SyncMessage) XXX_DiscardUnknown() { - xxx_messageInfo_SyncMessage.DiscardUnknown(m) +func (m *Message) XXX_DiscardUnknown() { + xxx_messageInfo_Message.DiscardUnknown(m) } -var xxx_messageInfo_SyncMessage proto.InternalMessageInfo +var xxx_messageInfo_Message proto.InternalMessageInfo -func (m *SyncMessage) GetSeq() int64 { +func (m *Message) GetHeader() *Header { if m != nil { - return m.Seq + return m.Header + } + return nil +} + +func (m *Message) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +type Header struct { + TraceId []byte `protobuf:"bytes,1,opt,name=traceId,proto3" json:"traceId,omitempty"` + RequestId uint64 `protobuf:"varint,2,opt,name=requestId,proto3" json:"requestId,omitempty"` + ReplyId uint64 `protobuf:"varint,3,opt,name=replyId,proto3" json:"replyId,omitempty"` + Type MessageType `protobuf:"varint,4,opt,name=type,proto3,enum=anytype.MessageType" json:"type,omitempty"` +} + +func (m *Header) Reset() { *m = Header{} } +func (m *Header) String() string { return proto.CompactTextString(m) } +func (*Header) ProtoMessage() {} +func (*Header) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{1} +} +func (m *Header) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Header.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Header) XXX_Merge(src proto.Message) { + xxx_messageInfo_Header.Merge(m, src) +} +func (m *Header) XXX_Size() int { + return m.Size() +} +func (m *Header) XXX_DiscardUnknown() { + xxx_messageInfo_Header.DiscardUnknown(m) +} + +var xxx_messageInfo_Header proto.InternalMessageInfo + +func (m *Header) GetTraceId() []byte { + if m != nil { + return m.TraceId + } + return nil +} + +func (m *Header) GetRequestId() uint64 { + if m != nil { + return m.RequestId } return 0 } +func (m *Header) GetReplyId() uint64 { + if m != nil { + return m.ReplyId + } + return 0 +} + +func (m *Header) GetType() MessageType { + if m != nil { + return m.Type + } + return MessageType_MessageTypeSystem +} + +type System struct { + Handshake *SystemHandshake `protobuf:"bytes,1,opt,name=handshake,proto3" json:"handshake,omitempty"` + Ping *SystemPing `protobuf:"bytes,2,opt,name=ping,proto3" json:"ping,omitempty"` + Ack *SystemAck `protobuf:"bytes,3,opt,name=ack,proto3" json:"ack,omitempty"` +} + +func (m *System) Reset() { *m = System{} } +func (m *System) String() string { return proto.CompactTextString(m) } +func (*System) ProtoMessage() {} +func (*System) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{2} +} +func (m *System) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *System) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_System.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *System) XXX_Merge(src proto.Message) { + xxx_messageInfo_System.Merge(m, src) +} +func (m *System) XXX_Size() int { + return m.Size() +} +func (m *System) XXX_DiscardUnknown() { + xxx_messageInfo_System.DiscardUnknown(m) +} + +var xxx_messageInfo_System proto.InternalMessageInfo + +func (m *System) GetHandshake() *SystemHandshake { + if m != nil { + return m.Handshake + } + return nil +} + +func (m *System) GetPing() *SystemPing { + if m != nil { + return m.Ping + } + return nil +} + +func (m *System) GetAck() *SystemAck { + if m != nil { + return m.Ack + } + return nil +} + +type SystemHandshake struct { + ProtocolVersion string `protobuf:"bytes,1,opt,name=protocolVersion,proto3" json:"protocolVersion,omitempty"` +} + +func (m *SystemHandshake) Reset() { *m = SystemHandshake{} } +func (m *SystemHandshake) String() string { return proto.CompactTextString(m) } +func (*SystemHandshake) ProtoMessage() {} +func (*SystemHandshake) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{2, 0} +} +func (m *SystemHandshake) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SystemHandshake) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SystemHandshake.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SystemHandshake) XXX_Merge(src proto.Message) { + xxx_messageInfo_SystemHandshake.Merge(m, src) +} +func (m *SystemHandshake) XXX_Size() int { + return m.Size() +} +func (m *SystemHandshake) XXX_DiscardUnknown() { + xxx_messageInfo_SystemHandshake.DiscardUnknown(m) +} + +var xxx_messageInfo_SystemHandshake proto.InternalMessageInfo + +func (m *SystemHandshake) GetProtocolVersion() string { + if m != nil { + return m.ProtocolVersion + } + return "" +} + +type SystemPing struct { + UnixTime uint64 `protobuf:"varint,1,opt,name=unixTime,proto3" json:"unixTime,omitempty"` +} + +func (m *SystemPing) Reset() { *m = SystemPing{} } +func (m *SystemPing) String() string { return proto.CompactTextString(m) } +func (*SystemPing) ProtoMessage() {} +func (*SystemPing) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{2, 1} +} +func (m *SystemPing) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SystemPing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SystemPing.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SystemPing) XXX_Merge(src proto.Message) { + xxx_messageInfo_SystemPing.Merge(m, src) +} +func (m *SystemPing) XXX_Size() int { + return m.Size() +} +func (m *SystemPing) XXX_DiscardUnknown() { + xxx_messageInfo_SystemPing.DiscardUnknown(m) +} + +var xxx_messageInfo_SystemPing proto.InternalMessageInfo + +func (m *SystemPing) GetUnixTime() uint64 { + if m != nil { + return m.UnixTime + } + return 0 +} + +type SystemAck struct { + Error *SystemError `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (m *SystemAck) Reset() { *m = SystemAck{} } +func (m *SystemAck) String() string { return proto.CompactTextString(m) } +func (*SystemAck) ProtoMessage() {} +func (*SystemAck) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{2, 2} +} +func (m *SystemAck) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SystemAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SystemAck.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SystemAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_SystemAck.Merge(m, src) +} +func (m *SystemAck) XXX_Size() int { + return m.Size() +} +func (m *SystemAck) XXX_DiscardUnknown() { + xxx_messageInfo_SystemAck.DiscardUnknown(m) +} + +var xxx_messageInfo_SystemAck proto.InternalMessageInfo + +func (m *SystemAck) GetError() *SystemError { + if m != nil { + return m.Error + } + return nil +} + +type SystemError struct { + Code SystemErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.SystemErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *SystemError) Reset() { *m = SystemError{} } +func (m *SystemError) String() string { return proto.CompactTextString(m) } +func (*SystemError) ProtoMessage() {} +func (*SystemError) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{2, 3} +} +func (m *SystemError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SystemError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SystemError.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SystemError) XXX_Merge(src proto.Message) { + xxx_messageInfo_SystemError.Merge(m, src) +} +func (m *SystemError) XXX_Size() int { + return m.Size() +} +func (m *SystemError) XXX_DiscardUnknown() { + xxx_messageInfo_SystemError.DiscardUnknown(m) +} + +var xxx_messageInfo_SystemError proto.InternalMessageInfo + +func (m *SystemError) GetCode() SystemErrorCode { + if m != nil { + return m.Code + } + return SystemError_UNKNOWN +} + +func (m *SystemError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +type Subscription struct { + SubscribeSpace *SubscriptionSubscribeSpace `protobuf:"bytes,1,opt,name=subscribeSpace,proto3" json:"subscribeSpace,omitempty"` + UnsubscribeSpace *SubscriptionUnsubscribeSpace `protobuf:"bytes,2,opt,name=unsubscribeSpace,proto3" json:"unsubscribeSpace,omitempty"` +} + +func (m *Subscription) Reset() { *m = Subscription{} } +func (m *Subscription) String() string { return proto.CompactTextString(m) } +func (*Subscription) ProtoMessage() {} +func (*Subscription) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{3} +} +func (m *Subscription) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Subscription) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Subscription.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Subscription) XXX_Merge(src proto.Message) { + xxx_messageInfo_Subscription.Merge(m, src) +} +func (m *Subscription) XXX_Size() int { + return m.Size() +} +func (m *Subscription) XXX_DiscardUnknown() { + xxx_messageInfo_Subscription.DiscardUnknown(m) +} + +var xxx_messageInfo_Subscription proto.InternalMessageInfo + +func (m *Subscription) GetSubscribeSpace() *SubscriptionSubscribeSpace { + if m != nil { + return m.SubscribeSpace + } + return nil +} + +func (m *Subscription) GetUnsubscribeSpace() *SubscriptionUnsubscribeSpace { + if m != nil { + return m.UnsubscribeSpace + } + return nil +} + +type SubscriptionSubscribeSpace struct { + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` +} + +func (m *SubscriptionSubscribeSpace) Reset() { *m = SubscriptionSubscribeSpace{} } +func (m *SubscriptionSubscribeSpace) String() string { return proto.CompactTextString(m) } +func (*SubscriptionSubscribeSpace) ProtoMessage() {} +func (*SubscriptionSubscribeSpace) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{3, 0} +} +func (m *SubscriptionSubscribeSpace) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SubscriptionSubscribeSpace) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SubscriptionSubscribeSpace.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SubscriptionSubscribeSpace) XXX_Merge(src proto.Message) { + xxx_messageInfo_SubscriptionSubscribeSpace.Merge(m, src) +} +func (m *SubscriptionSubscribeSpace) XXX_Size() int { + return m.Size() +} +func (m *SubscriptionSubscribeSpace) XXX_DiscardUnknown() { + xxx_messageInfo_SubscriptionSubscribeSpace.DiscardUnknown(m) +} + +var xxx_messageInfo_SubscriptionSubscribeSpace proto.InternalMessageInfo + +func (m *SubscriptionSubscribeSpace) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +type SubscriptionUnsubscribeSpace struct { + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` +} + +func (m *SubscriptionUnsubscribeSpace) Reset() { *m = SubscriptionUnsubscribeSpace{} } +func (m *SubscriptionUnsubscribeSpace) String() string { return proto.CompactTextString(m) } +func (*SubscriptionUnsubscribeSpace) ProtoMessage() {} +func (*SubscriptionUnsubscribeSpace) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{3, 1} +} +func (m *SubscriptionUnsubscribeSpace) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SubscriptionUnsubscribeSpace) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SubscriptionUnsubscribeSpace.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SubscriptionUnsubscribeSpace) XXX_Merge(src proto.Message) { + xxx_messageInfo_SubscriptionUnsubscribeSpace.Merge(m, src) +} +func (m *SubscriptionUnsubscribeSpace) XXX_Size() int { + return m.Size() +} +func (m *SubscriptionUnsubscribeSpace) XXX_DiscardUnknown() { + xxx_messageInfo_SubscriptionUnsubscribeSpace.DiscardUnknown(m) +} + +var xxx_messageInfo_SubscriptionUnsubscribeSpace proto.InternalMessageInfo + +func (m *SubscriptionUnsubscribeSpace) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +type Sync struct { + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` +} + +func (m *Sync) Reset() { *m = Sync{} } +func (m *Sync) String() string { return proto.CompactTextString(m) } +func (*Sync) ProtoMessage() {} +func (*Sync) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{4} +} +func (m *Sync) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Sync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Sync.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Sync) XXX_Merge(src proto.Message) { + xxx_messageInfo_Sync.Merge(m, src) +} +func (m *Sync) XXX_Size() int { + return m.Size() +} +func (m *Sync) XXX_DiscardUnknown() { + xxx_messageInfo_Sync.DiscardUnknown(m) +} + +var xxx_messageInfo_Sync proto.InternalMessageInfo + +func (m *Sync) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + func init() { - proto.RegisterType((*SyncMessage)(nil), "anytype.SyncMessage") + proto.RegisterEnum("anytype.MessageType", MessageType_name, MessageType_value) + proto.RegisterEnum("anytype.SystemErrorCode", SystemErrorCode_name, SystemErrorCode_value) + proto.RegisterType((*Message)(nil), "anytype.Message") + proto.RegisterType((*Header)(nil), "anytype.Header") + proto.RegisterType((*System)(nil), "anytype.System") + proto.RegisterType((*SystemHandshake)(nil), "anytype.System.Handshake") + proto.RegisterType((*SystemPing)(nil), "anytype.System.Ping") + proto.RegisterType((*SystemAck)(nil), "anytype.System.Ack") + proto.RegisterType((*SystemError)(nil), "anytype.System.Error") + proto.RegisterType((*Subscription)(nil), "anytype.Subscription") + proto.RegisterType((*SubscriptionSubscribeSpace)(nil), "anytype.Subscription.SubscribeSpace") + proto.RegisterType((*SubscriptionUnsubscribeSpace)(nil), "anytype.Subscription.UnsubscribeSpace") + proto.RegisterType((*Sync)(nil), "anytype.Sync") } func init() { proto.RegisterFile("syncproto/proto/sync.proto", fileDescriptor_4b28dfdd48a89166) } var fileDescriptor_4b28dfdd48a89166 = []byte{ - // 119 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2a, 0xae, 0xcc, 0x4b, - 0x2e, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x87, 0x90, 0x20, 0xbe, 0x1e, 0x98, 0x29, 0xc4, 0x9e, 0x98, - 0x57, 0x59, 0x52, 0x59, 0x90, 0xaa, 0x24, 0xcf, 0xc5, 0x1d, 0x5c, 0x99, 0x97, 0xec, 0x9b, 0x5a, - 0x5c, 0x9c, 0x98, 0x9e, 0x2a, 0x24, 0xc0, 0xc5, 0x5c, 0x9c, 0x5a, 0x28, 0xc1, 0xa8, 0xc0, 0xa8, - 0xc1, 0x1c, 0x04, 0x62, 0x3a, 0xa9, 0x9c, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, - 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, - 0x14, 0x97, 0x3e, 0xdc, 0x82, 0x24, 0x36, 0x30, 0x65, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x7e, - 0xbc, 0x46, 0xd2, 0x74, 0x00, 0x00, 0x00, + // 577 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x94, 0x51, 0x6f, 0xd2, 0x50, + 0x14, 0xc7, 0x29, 0x74, 0x20, 0xa7, 0x04, 0xea, 0x9d, 0x8b, 0x58, 0x97, 0xa6, 0x69, 0xa6, 0x92, + 0x69, 0xba, 0x04, 0xb3, 0xf8, 0x3c, 0x27, 0x06, 0xe2, 0xa4, 0xe4, 0x16, 0x30, 0xf1, 0x65, 0x29, + 0xb7, 0x37, 0xd0, 0xb0, 0xb5, 0xb5, 0x2d, 0x89, 0x7d, 0xf7, 0xc9, 0xa7, 0x7d, 0x18, 0x3f, 0x84, + 0x8f, 0x7b, 0xf4, 0xd1, 0xc0, 0x17, 0x31, 0xbd, 0x6d, 0xa1, 0xab, 0xdb, 0x0b, 0xdc, 0xff, 0xb9, + 0xbf, 0xff, 0x39, 0xff, 0xcb, 0xbd, 0x01, 0xa4, 0x20, 0x72, 0x88, 0xe7, 0xbb, 0xa1, 0x7b, 0x92, + 0x7c, 0xc6, 0x5a, 0x63, 0x4b, 0x54, 0x33, 0x9d, 0x28, 0x8c, 0x3c, 0xaa, 0x7e, 0x84, 0xda, 0x67, + 0x1a, 0x04, 0xe6, 0x9c, 0xa2, 0x57, 0x50, 0x5d, 0x50, 0xd3, 0xa2, 0x7e, 0x9b, 0x53, 0xb8, 0x8e, + 0xd0, 0x6d, 0x69, 0x29, 0xa4, 0xf5, 0x59, 0x19, 0xa7, 0xdb, 0x08, 0x01, 0x6f, 0x99, 0xa1, 0xd9, + 0x2e, 0x2b, 0x5c, 0xa7, 0x81, 0xd9, 0x5a, 0xfd, 0xc1, 0x41, 0x35, 0xc1, 0x50, 0x1b, 0x6a, 0xa1, + 0x6f, 0x12, 0x3a, 0xb0, 0x58, 0xa3, 0x06, 0xce, 0x24, 0x3a, 0x84, 0xba, 0x4f, 0xbf, 0xad, 0x68, + 0x10, 0x0e, 0x2c, 0xe6, 0xe6, 0xf1, 0xae, 0x10, 0xfb, 0x7c, 0xea, 0x5d, 0x45, 0x03, 0xab, 0x5d, + 0x61, 0x7b, 0x99, 0x44, 0x1d, 0xe0, 0xe3, 0x1c, 0x6d, 0x5e, 0xe1, 0x3a, 0xcd, 0xee, 0x93, 0x6d, + 0xae, 0x34, 0xf9, 0x38, 0xf2, 0x28, 0x66, 0x84, 0xfa, 0xab, 0x02, 0x55, 0x23, 0x0a, 0x42, 0x7a, + 0x8d, 0xde, 0x41, 0x7d, 0x61, 0x3a, 0x56, 0xb0, 0x30, 0x97, 0x34, 0x3d, 0xd1, 0xb3, 0xad, 0x33, + 0x61, 0xb4, 0x7e, 0x06, 0xe0, 0x1d, 0x1b, 0x4f, 0xf3, 0x6c, 0x67, 0xce, 0x02, 0x0a, 0xb9, 0x69, + 0xa9, 0x67, 0x64, 0x3b, 0x73, 0xcc, 0x08, 0xf4, 0x02, 0x2a, 0x26, 0x59, 0xb2, 0xb4, 0x42, 0x77, + 0xbf, 0x08, 0x9e, 0x91, 0x25, 0x8e, 0xf7, 0xa5, 0x53, 0xa8, 0xf7, 0x73, 0xdd, 0x5b, 0xec, 0x0a, + 0x88, 0x7b, 0x35, 0xa5, 0x7e, 0x60, 0xbb, 0x0e, 0x0b, 0x57, 0xc7, 0xc5, 0xb2, 0xa4, 0x02, 0x1f, + 0xcf, 0x42, 0x12, 0x3c, 0x5a, 0x39, 0xf6, 0xf7, 0xb1, 0x7d, 0x9d, 0x9c, 0x83, 0xc7, 0x5b, 0x2d, + 0x75, 0xa1, 0x72, 0x46, 0x96, 0xe8, 0x35, 0xec, 0x51, 0xdf, 0x77, 0xfd, 0x34, 0xf3, 0x41, 0x31, + 0x4a, 0x2f, 0xde, 0xc4, 0x09, 0x23, 0xdd, 0x70, 0xb0, 0xc7, 0x0a, 0x48, 0x03, 0x9e, 0xb8, 0x56, + 0xd2, 0xb5, 0xd9, 0x95, 0xee, 0x75, 0x69, 0xe7, 0xae, 0x45, 0x31, 0xe3, 0x90, 0x02, 0x82, 0x45, + 0x03, 0xe2, 0xdb, 0x5e, 0x18, 0xe7, 0x2e, 0xb3, 0xdc, 0xf9, 0x92, 0x7a, 0x0a, 0x7c, 0xcc, 0x23, + 0x01, 0x6a, 0x93, 0xe1, 0xa7, 0xa1, 0xfe, 0x65, 0x28, 0x96, 0x90, 0x02, 0x87, 0x93, 0xa1, 0x31, + 0x19, 0x8d, 0x74, 0x3c, 0xee, 0x7d, 0xb8, 0x1c, 0x61, 0x7d, 0xac, 0x9f, 0xeb, 0x17, 0x97, 0xd3, + 0x1e, 0x36, 0x06, 0xfa, 0x50, 0x04, 0xf5, 0x67, 0x19, 0x1a, 0xc6, 0x6a, 0xb6, 0xed, 0x83, 0x2e, + 0xa0, 0x19, 0x24, 0x7a, 0x46, 0x0d, 0xcf, 0x24, 0xd9, 0x0d, 0x1e, 0xed, 0x32, 0xe6, 0xf0, 0x4c, + 0xa4, 0x2c, 0x2e, 0x78, 0x11, 0x06, 0x71, 0xe5, 0x14, 0xfa, 0x25, 0xbf, 0xd4, 0xcb, 0xfb, 0xfb, + 0x4d, 0x0a, 0x34, 0xfe, 0xcf, 0x2f, 0x1d, 0x43, 0xf3, 0xee, 0xd4, 0xf8, 0xfd, 0x06, 0xde, 0xee, + 0xdd, 0xd7, 0x71, 0x26, 0xa5, 0x37, 0x20, 0x16, 0x3b, 0x3e, 0x4c, 0xab, 0x0a, 0xf0, 0x46, 0xe4, + 0x90, 0x87, 0x89, 0xe3, 0x29, 0x08, 0xb9, 0xa7, 0x8f, 0x0e, 0xe0, 0x71, 0x4e, 0x26, 0x97, 0x27, + 0x96, 0xd0, 0x73, 0x78, 0x9a, 0x2f, 0xe7, 0xce, 0x27, 0x72, 0x68, 0x1f, 0x5a, 0x77, 0x3c, 0x0e, + 0x11, 0xcb, 0xef, 0x8f, 0x7e, 0xaf, 0x65, 0xee, 0x76, 0x2d, 0x73, 0x7f, 0xd7, 0x32, 0x77, 0xb3, + 0x91, 0x4b, 0xb7, 0x1b, 0xb9, 0xf4, 0x67, 0x23, 0x97, 0xbe, 0xc2, 0xc9, 0xf6, 0xcf, 0x64, 0x56, + 0x65, 0x5f, 0x6f, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x26, 0x2f, 0x92, 0xfd, 0x60, 0x04, 0x00, + 0x00, } -func (m *SyncMessage) Marshal() (dAtA []byte, err error) { +func (m *Message) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -94,24 +692,407 @@ func (m *SyncMessage) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SyncMessage) MarshalTo(dAtA []byte) (int, error) { +func (m *Message) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SyncMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Message) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.Seq != 0 { - i = encodeVarintSync(dAtA, i, uint64(m.Seq)) + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintSync(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x12 + } + if m.Header != nil { + { + size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Header) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Header) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Header) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Type != 0 { + i = encodeVarintSync(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x20 + } + if m.ReplyId != 0 { + i = encodeVarintSync(dAtA, i, uint64(m.ReplyId)) + i-- + dAtA[i] = 0x18 + } + if m.RequestId != 0 { + i = encodeVarintSync(dAtA, i, uint64(m.RequestId)) + i-- + dAtA[i] = 0x10 + } + if len(m.TraceId) > 0 { + i -= len(m.TraceId) + copy(dAtA[i:], m.TraceId) + i = encodeVarintSync(dAtA, i, uint64(len(m.TraceId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *System) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *System) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *System) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Ack != nil { + { + size, err := m.Ack.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Ping != nil { + { + size, err := m.Ping.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Handshake != nil { + { + size, err := m.Handshake.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SystemHandshake) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SystemHandshake) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SystemHandshake) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ProtocolVersion) > 0 { + i -= len(m.ProtocolVersion) + copy(dAtA[i:], m.ProtocolVersion) + i = encodeVarintSync(dAtA, i, uint64(len(m.ProtocolVersion))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SystemPing) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SystemPing) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SystemPing) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.UnixTime != 0 { + i = encodeVarintSync(dAtA, i, uint64(m.UnixTime)) i-- dAtA[i] = 0x8 } return len(dAtA) - i, nil } +func (m *SystemAck) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SystemAck) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SystemAck) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} + +func (m *SystemError) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SystemError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SystemError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintSync(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintSync(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *Subscription) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Subscription) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Subscription) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.UnsubscribeSpace != nil { + { + size, err := m.UnsubscribeSpace.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.SubscribeSpace != nil { + { + size, err := m.SubscribeSpace.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SubscriptionSubscribeSpace) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SubscriptionSubscribeSpace) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SubscriptionSubscribeSpace) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintSync(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SubscriptionUnsubscribeSpace) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SubscriptionUnsubscribeSpace) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SubscriptionUnsubscribeSpace) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintSync(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Sync) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Sync) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Sync) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintSync(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintSync(dAtA []byte, offset int, v uint64) int { offset -= sovSync(v) base := offset @@ -123,14 +1104,172 @@ func encodeVarintSync(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *SyncMessage) Size() (n int) { +func (m *Message) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Seq != 0 { - n += 1 + sovSync(uint64(m.Seq)) + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovSync(uint64(l)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } + return n +} + +func (m *Header) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TraceId) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } + if m.RequestId != 0 { + n += 1 + sovSync(uint64(m.RequestId)) + } + if m.ReplyId != 0 { + n += 1 + sovSync(uint64(m.ReplyId)) + } + if m.Type != 0 { + n += 1 + sovSync(uint64(m.Type)) + } + return n +} + +func (m *System) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Handshake != nil { + l = m.Handshake.Size() + n += 1 + l + sovSync(uint64(l)) + } + if m.Ping != nil { + l = m.Ping.Size() + n += 1 + l + sovSync(uint64(l)) + } + if m.Ack != nil { + l = m.Ack.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} + +func (m *SystemHandshake) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ProtocolVersion) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } + return n +} + +func (m *SystemPing) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.UnixTime != 0 { + n += 1 + sovSync(uint64(m.UnixTime)) + } + return n +} + +func (m *SystemAck) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} + +func (m *SystemError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovSync(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } + return n +} + +func (m *Subscription) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SubscribeSpace != nil { + l = m.SubscribeSpace.Size() + n += 1 + l + sovSync(uint64(l)) + } + if m.UnsubscribeSpace != nil { + l = m.UnsubscribeSpace.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} + +func (m *SubscriptionSubscribeSpace) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } + return n +} + +func (m *SubscriptionUnsubscribeSpace) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } + return n +} + +func (m *Sync) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) } return n } @@ -141,7 +1280,7 @@ func sovSync(x uint64) (n int) { func sozSync(x uint64) (n int) { return sovSync(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *SyncMessage) Unmarshal(dAtA []byte) error { +func (m *Message) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -164,17 +1303,17 @@ func (m *SyncMessage) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SyncMessage: wiretype end group for non-group") + return fmt.Errorf("proto: Message: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SyncMessage: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Message: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Seq", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) } - m.Seq = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowSync @@ -184,11 +1323,1067 @@ func (m *SyncMessage) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Seq |= int64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &Header{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Header) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Header: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Header: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TraceId", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TraceId = append(m.TraceId[:0], dAtA[iNdEx:postIndex]...) + if m.TraceId == nil { + m.TraceId = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestId", wireType) + } + m.RequestId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RequestId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReplyId", wireType) + } + m.ReplyId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ReplyId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= MessageType(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *System) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: System: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: System: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Handshake", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Handshake == nil { + m.Handshake = &SystemHandshake{} + } + if err := m.Handshake.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ping", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Ping == nil { + m.Ping = &SystemPing{} + } + if err := m.Ping.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ack", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Ack == nil { + m.Ack = &SystemAck{} + } + if err := m.Ack.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SystemHandshake) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Handshake: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Handshake: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProtocolVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProtocolVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SystemPing) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Ping: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ping: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnixTime", wireType) + } + m.UnixTime = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnixTime |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SystemAck) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Ack: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ack: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &SystemError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SystemError) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= SystemErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Subscription) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Subscription: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Subscription: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SubscribeSpace", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SubscribeSpace == nil { + m.SubscribeSpace = &SubscriptionSubscribeSpace{} + } + if err := m.SubscribeSpace.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UnsubscribeSpace", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UnsubscribeSpace == nil { + m.UnsubscribeSpace = &SubscriptionUnsubscribeSpace{} + } + if err := m.UnsubscribeSpace.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SubscriptionSubscribeSpace) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SubscribeSpace: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SubscribeSpace: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpaceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SubscriptionUnsubscribeSpace) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UnsubscribeSpace: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UnsubscribeSpace: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpaceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Sync) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Sync: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Sync: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpaceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) From 3e81762f27f493b79b307f546a28cbfc93a061de Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 5 Aug 2022 13:44:23 +0200 Subject: [PATCH 35/40] Add message to syncproto, fix request handler --- Makefile | 8 +- service/net/secure/service.go | 10 +- service/sync/requesthandler/requesthandler.go | 47 +- service/sync/syncpb/helpers.go | 19 - service/sync/syncpb/protos/sync.proto | 47 - service/sync/syncpb/sync.pb.go | 2186 ----------------- syncproto/helpers.go | 19 + syncproto/proto/sync.proto | 39 +- syncproto/sync.pb.go | 1880 +++++++++++++- 9 files changed, 1930 insertions(+), 2325 deletions(-) delete mode 100644 service/sync/syncpb/helpers.go delete mode 100644 service/sync/syncpb/protos/sync.proto delete mode 100644 service/sync/syncpb/sync.pb.go create mode 100644 syncproto/helpers.go diff --git a/Makefile b/Makefile index 20e6afec..d24a7929 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ protos-go: @$(eval P_TREE_STORAGE_PATH_PB := $(ROOT_PKG)/acl/treestorage/treepb) @$(eval P_ACL_CHANGES_PATH_PB := $(ROOT_PKG)/acl/aclchanges/aclpb) @$(eval P_PLAINTEXT_CHANGES_PATH_PB := $(ROOT_PKG)/acl/testutils/testchanges/testchangepb) - @$(eval P_SYNC_CHANGES_PATH_PB := service/sync/syncpb) + @$(eval P_SYNC_CHANGES_PATH_PB := syncproto) @$(eval P_TIMESTAMP := Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types) @$(eval P_STRUCT := Mgoogle/protobuf/struct.proto=github.com/gogo/protobuf/types) @$(eval P_ACL_CHANGES := M$(P_ACL_CHANGES_PATH_PB)/protos/aclchanges.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/$(P_ACL_CHANGES_PATH_PB)) @@ -32,11 +32,7 @@ protos-go: $(GOGO_START) protoc --gogofaster_out=:. $(P_TREE_STORAGE_PATH_PB)/protos/*.proto; mv $(P_TREE_STORAGE_PATH_PB)/protos/*.go $(P_TREE_STORAGE_PATH_PB) $(GOGO_START) protoc --gogofaster_out=:. $(P_PLAINTEXT_CHANGES_PATH_PB)/protos/*.proto; mv $(P_PLAINTEXT_CHANGES_PATH_PB)/protos/*.go $(P_PLAINTEXT_CHANGES_PATH_PB) $(eval PKGMAP := $$(P_ACL_CHANGES),$$(P_TREE_CHANGES)) - $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. $(P_SYNC_CHANGES_PATH_PB)/protos/*.proto; mv $(P_SYNC_CHANGES_PATH_PB)/protos/*.go $(P_SYNC_CHANGES_PATH_PB) - -protos: - GOGO_NO_UNDERSCORE=1 GOGO_EXPORT_ONEOF_INTERFACE=1 protoc --gogofaster_out=plugins=grpc:. syncproto/proto/*.proto - + $(GOGO_START) protoc --gogofaster_out=$(PKGMAP),plugins=grpc:. $(P_SYNC_CHANGES_PATH_PB)/proto/*.proto build: @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) diff --git a/service/net/secure/service.go b/service/net/secure/service.go index b61c2f86..5c93862b 100644 --- a/service/net/secure/service.go +++ b/service/net/secure/service.go @@ -6,6 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/sec" @@ -35,8 +36,9 @@ type service struct { } func (s *service) Init(ctx context.Context, a *app.App) (err error) { - peerConf := a.MustComponent(config.CName).(*config.Config).PeerList - pkb, err := crypto.ConfigDecodeKey(peerConf.MyId.PrivKey) + account := a.MustComponent(config.CName).(*config.Config).Account + decoder := signingkey.NewEDPrivKeyDecoder() + pkb, err := decoder.DecodeFromStringIntoBytes(account.SigningKey) if err != nil { return } @@ -44,7 +46,7 @@ func (s *service) Init(ctx context.Context, a *app.App) (err error) { return } - pid, err := peer.Decode(peerConf.MyId.PeerId) + pid, err := peer.Decode(account.PeerId) if err != nil { return } @@ -66,7 +68,7 @@ func (s *service) Init(ctx context.Context, a *app.App) (err error) { return fmt.Errorf("peerId and privateKey mismatched") } - log.Info("secure service init", zap.String("peerId", peerConf.MyId.PeerId)) + log.Info("secure service init", zap.String("peerId", account.PeerId)) return nil } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 9e4e371a..35456cce 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -8,8 +8,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" ) @@ -24,11 +24,12 @@ func New() app.Component { } type RequestHandler interface { - HandleFullSyncContent(ctx context.Context, senderId string, request *syncpb.SyncContent) (err error) + HandleFullSyncContent(ctx context.Context, senderId string, request *syncproto.Sync) (err error) } type MessageSender interface { - SendMessage(peerId string, msg *syncpb.SyncContent) error + SendMessage(peerId string, msg *syncproto.Sync) error + SendSpace(spaceId string, msg *syncproto.Sync) error } const CName = "SyncRequestHandler" @@ -52,7 +53,7 @@ func (r *requestHandler) Close(ctx context.Context) (err error) { return nil } -func (r *requestHandler) HandleFullSyncContent(ctx context.Context, senderId string, content *syncpb.SyncContent) error { +func (r *requestHandler) HandleFullSyncContent(ctx context.Context, senderId string, content *syncproto.Sync) error { msg := content.GetMessage() switch { case msg.GetFullSyncRequest() != nil: @@ -65,9 +66,9 @@ func (r *requestHandler) HandleFullSyncContent(ctx context.Context, senderId str return nil } -func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, update *syncpb.SyncHeadUpdate) (err error) { +func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, update *syncproto.SyncHeadUpdate) (err error) { var ( - fullRequest *syncpb.SyncFullRequest + fullRequest *syncproto.SyncFullRequest snapshotPath []string result acltree.AddResult ) @@ -91,33 +92,33 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, // if there are no such tree if err == treestorage.ErrUnknownTreeId { // TODO: maybe we can optimize this by sending the header and stuff right away, so when the tree is created we are able to add it on first request - fullRequest = &syncpb.SyncFullRequest{ + fullRequest = &syncproto.SyncFullRequest{ TreeId: update.TreeId, TreeHeader: update.TreeHeader, } } // if we have incompatible heads, or we haven't seen the tree at all if fullRequest != nil { - return r.messageService.SendMessage(senderId, syncpb.WrapFullRequest(fullRequest)) + return r.messageService.SendMessage(senderId, syncproto.WrapFullRequest(fullRequest)) } // if error or nothing has changed if err != nil || len(result.Added) == 0 { return err } // otherwise sending heads update message - newUpdate := &syncpb.SyncHeadUpdate{ + newUpdate := &syncproto.SyncHeadUpdate{ Heads: result.Heads, Changes: result.Added, SnapshotPath: snapshotPath, TreeId: update.TreeId, TreeHeader: update.TreeHeader, } - return r.messageService.SendMessage("", syncpb.WrapHeadUpdate(newUpdate)) + return r.messageService.SendSpace("", syncproto.WrapHeadUpdate(newUpdate)) } -func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId string, request *syncpb.SyncFullRequest) (err error) { +func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId string, request *syncproto.SyncFullRequest) (err error) { var ( - fullResponse *syncpb.SyncFullResponse + fullResponse *syncproto.SyncFullResponse snapshotPath []string result acltree.AddResult ) @@ -141,24 +142,24 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str if err != nil { return err } - err = r.messageService.SendMessage(senderId, syncpb.WrapFullResponse(fullResponse)) + err = r.messageService.SendMessage(senderId, syncproto.WrapFullResponse(fullResponse)) // if error or nothing has changed if err != nil || len(result.Added) == 0 { return err } // otherwise sending heads update message - newUpdate := &syncpb.SyncHeadUpdate{ + newUpdate := &syncproto.SyncHeadUpdate{ Heads: result.Heads, Changes: result.Added, SnapshotPath: snapshotPath, TreeId: request.TreeId, TreeHeader: request.TreeHeader, } - return r.messageService.SendMessage("", syncpb.WrapHeadUpdate(newUpdate)) + return r.messageService.SendSpace("", syncproto.WrapHeadUpdate(newUpdate)) } -func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, response *syncpb.SyncFullResponse) (err error) { +func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, response *syncproto.SyncFullResponse) (err error) { var ( snapshotPath []string result acltree.AddResult @@ -185,21 +186,21 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st } } // sending heads update message - newUpdate := &syncpb.SyncHeadUpdate{ + newUpdate := &syncproto.SyncHeadUpdate{ Heads: result.Heads, Changes: result.Added, SnapshotPath: snapshotPath, TreeId: response.TreeId, } - return r.messageService.SendMessage("", syncpb.WrapHeadUpdate(newUpdate)) + return r.messageService.SendSpace("", syncproto.WrapHeadUpdate(newUpdate)) } -func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) { +func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, tree acltree.ACLTree) (*syncproto.SyncFullRequest, error) { ourChanges, err := tree.ChangesAfterCommonSnapshot(theirPath) if err != nil { return nil, err } - return &syncpb.SyncFullRequest{ + return &syncproto.SyncFullRequest{ Heads: tree.Heads(), Changes: ourChanges, TreeId: treeId, @@ -212,7 +213,7 @@ func (r *requestHandler) prepareFullSyncResponse( treeId string, theirPath []string, theirChanges []*aclpb.RawChange, - tree acltree.ACLTree) (*syncpb.SyncFullResponse, error) { + tree acltree.ACLTree) (*syncproto.SyncFullResponse, error) { // TODO: we can probably use the common snapshot calculated on the request step from previous peer ourChanges, err := tree.ChangesAfterCommonSnapshot(theirPath) if err != nil { @@ -231,7 +232,7 @@ func (r *requestHandler) prepareFullSyncResponse( } } - return &syncpb.SyncFullResponse{ + return &syncproto.SyncFullResponse{ Heads: tree.Heads(), Changes: final, TreeId: treeId, @@ -240,7 +241,7 @@ func (r *requestHandler) prepareFullSyncResponse( }, nil } -func (r *requestHandler) createTree(ctx context.Context, response *syncpb.SyncFullResponse) error { +func (r *requestHandler) createTree(ctx context.Context, response *syncproto.SyncFullResponse) error { return r.treeCache.Add( ctx, response.TreeId, diff --git a/service/sync/syncpb/helpers.go b/service/sync/syncpb/helpers.go deleted file mode 100644 index 52d7fddd..00000000 --- a/service/sync/syncpb/helpers.go +++ /dev/null @@ -1,19 +0,0 @@ -package syncpb - -func WrapHeadUpdate(update *SyncHeadUpdate) *SyncContent { - return &SyncContent{Message: &SyncContentValue{ - Value: &SyncContentValueValueOfHeadUpdate{HeadUpdate: update}, - }} -} - -func WrapFullRequest(request *SyncFullRequest) *SyncContent { - return &SyncContent{Message: &SyncContentValue{ - Value: &SyncContentValueValueOfFullSyncRequest{FullSyncRequest: request}, - }} -} - -func WrapFullResponse(response *SyncFullResponse) *SyncContent { - return &SyncContent{Message: &SyncContentValue{ - Value: &SyncContentValueValueOfFullSyncResponse{FullSyncResponse: response}, - }} -} diff --git a/service/sync/syncpb/protos/sync.proto b/service/sync/syncpb/protos/sync.proto deleted file mode 100644 index b27414da..00000000 --- a/service/sync/syncpb/protos/sync.proto +++ /dev/null @@ -1,47 +0,0 @@ -syntax = "proto3"; -package sync; -option go_package = "syncpb"; - -import "pkg/acl/aclchanges/aclpb/protos/aclchanges.proto"; -import "pkg/acl/treestorage/treepb/protos/tree.proto"; - -message Sync { - message Content { - ContentValue message = 1; - } - - message ContentValue { - oneof value { - HeadUpdate headUpdate = 1; - Full.Request fullSyncRequest = 2; - Full.Response fullSyncResponse = 3; - } - } - - message HeadUpdate { - repeated string heads = 1; - repeated acl.RawChange changes = 2; - string treeId = 3; - repeated string snapshotPath = 4; - tree.TreeHeader treeHeader = 5; - } - - message Full { - // here with send the request with all changes we have (we already know sender's snapshot path) - message Request { - repeated string heads = 1; - repeated acl.RawChange changes = 2; - string treeId = 3; - repeated string snapshotPath = 4; - tree.TreeHeader treeHeader = 5; - } - - message Response { - repeated string heads = 1; - repeated acl.RawChange changes = 2; - string treeId = 3; - repeated string snapshotPath = 4; - tree.TreeHeader treeHeader = 5; - } - } -} \ No newline at end of file diff --git a/service/sync/syncpb/sync.pb.go b/service/sync/syncpb/sync.pb.go deleted file mode 100644 index 700eac42..00000000 --- a/service/sync/syncpb/sync.pb.go +++ /dev/null @@ -1,2186 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: service/sync/syncpb/protos/sync.proto - -package syncpb - -import ( - fmt "fmt" - aclpb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - treepb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type Sync struct { -} - -func (m *Sync) Reset() { *m = Sync{} } -func (m *Sync) String() string { return proto.CompactTextString(m) } -func (*Sync) ProtoMessage() {} -func (*Sync) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0} -} -func (m *Sync) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Sync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Sync.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Sync) XXX_Merge(src proto.Message) { - xxx_messageInfo_Sync.Merge(m, src) -} -func (m *Sync) XXX_Size() int { - return m.Size() -} -func (m *Sync) XXX_DiscardUnknown() { - xxx_messageInfo_Sync.DiscardUnknown(m) -} - -var xxx_messageInfo_Sync proto.InternalMessageInfo - -type SyncContent struct { - Message *SyncContentValue `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` -} - -func (m *SyncContent) Reset() { *m = SyncContent{} } -func (m *SyncContent) String() string { return proto.CompactTextString(m) } -func (*SyncContent) ProtoMessage() {} -func (*SyncContent) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 0} -} -func (m *SyncContent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncContent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncContent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *SyncContent) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncContent.Merge(m, src) -} -func (m *SyncContent) XXX_Size() int { - return m.Size() -} -func (m *SyncContent) XXX_DiscardUnknown() { - xxx_messageInfo_SyncContent.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncContent proto.InternalMessageInfo - -func (m *SyncContent) GetMessage() *SyncContentValue { - if m != nil { - return m.Message - } - return nil -} - -type SyncContentValue struct { - // Types that are valid to be assigned to Value: - // *SyncContentValueValueOfHeadUpdate - // *SyncContentValueValueOfFullSyncRequest - // *SyncContentValueValueOfFullSyncResponse - Value IsSyncContentValueValue `protobuf_oneof:"value"` -} - -func (m *SyncContentValue) Reset() { *m = SyncContentValue{} } -func (m *SyncContentValue) String() string { return proto.CompactTextString(m) } -func (*SyncContentValue) ProtoMessage() {} -func (*SyncContentValue) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 1} -} -func (m *SyncContentValue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncContentValue.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *SyncContentValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncContentValue.Merge(m, src) -} -func (m *SyncContentValue) XXX_Size() int { - return m.Size() -} -func (m *SyncContentValue) XXX_DiscardUnknown() { - xxx_messageInfo_SyncContentValue.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncContentValue proto.InternalMessageInfo - -type IsSyncContentValueValue interface { - IsSyncContentValueValue() - MarshalTo([]byte) (int, error) - Size() int -} - -type SyncContentValueValueOfHeadUpdate struct { - HeadUpdate *SyncHeadUpdate `protobuf:"bytes,1,opt,name=headUpdate,proto3,oneof" json:"headUpdate,omitempty"` -} -type SyncContentValueValueOfFullSyncRequest struct { - FullSyncRequest *SyncFullRequest `protobuf:"bytes,2,opt,name=fullSyncRequest,proto3,oneof" json:"fullSyncRequest,omitempty"` -} -type SyncContentValueValueOfFullSyncResponse struct { - FullSyncResponse *SyncFullResponse `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` -} - -func (*SyncContentValueValueOfHeadUpdate) IsSyncContentValueValue() {} -func (*SyncContentValueValueOfFullSyncRequest) IsSyncContentValueValue() {} -func (*SyncContentValueValueOfFullSyncResponse) IsSyncContentValueValue() {} - -func (m *SyncContentValue) GetValue() IsSyncContentValueValue { - if m != nil { - return m.Value - } - return nil -} - -func (m *SyncContentValue) GetHeadUpdate() *SyncHeadUpdate { - if x, ok := m.GetValue().(*SyncContentValueValueOfHeadUpdate); ok { - return x.HeadUpdate - } - return nil -} - -func (m *SyncContentValue) GetFullSyncRequest() *SyncFullRequest { - if x, ok := m.GetValue().(*SyncContentValueValueOfFullSyncRequest); ok { - return x.FullSyncRequest - } - return nil -} - -func (m *SyncContentValue) GetFullSyncResponse() *SyncFullResponse { - if x, ok := m.GetValue().(*SyncContentValueValueOfFullSyncResponse); ok { - return x.FullSyncResponse - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*SyncContentValue) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*SyncContentValueValueOfHeadUpdate)(nil), - (*SyncContentValueValueOfFullSyncRequest)(nil), - (*SyncContentValueValueOfFullSyncResponse)(nil), - } -} - -type SyncHeadUpdate struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` - SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` - TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` -} - -func (m *SyncHeadUpdate) Reset() { *m = SyncHeadUpdate{} } -func (m *SyncHeadUpdate) String() string { return proto.CompactTextString(m) } -func (*SyncHeadUpdate) ProtoMessage() {} -func (*SyncHeadUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 2} -} -func (m *SyncHeadUpdate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncHeadUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncHeadUpdate.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *SyncHeadUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncHeadUpdate.Merge(m, src) -} -func (m *SyncHeadUpdate) XXX_Size() int { - return m.Size() -} -func (m *SyncHeadUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_SyncHeadUpdate.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncHeadUpdate proto.InternalMessageInfo - -func (m *SyncHeadUpdate) GetHeads() []string { - if m != nil { - return m.Heads - } - return nil -} - -func (m *SyncHeadUpdate) GetChanges() []*aclpb.RawChange { - if m != nil { - return m.Changes - } - return nil -} - -func (m *SyncHeadUpdate) GetTreeId() string { - if m != nil { - return m.TreeId - } - return "" -} - -func (m *SyncHeadUpdate) GetSnapshotPath() []string { - if m != nil { - return m.SnapshotPath - } - return nil -} - -func (m *SyncHeadUpdate) GetTreeHeader() *treepb.TreeHeader { - if m != nil { - return m.TreeHeader - } - return nil -} - -type SyncFull struct { -} - -func (m *SyncFull) Reset() { *m = SyncFull{} } -func (m *SyncFull) String() string { return proto.CompactTextString(m) } -func (*SyncFull) ProtoMessage() {} -func (*SyncFull) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 3} -} -func (m *SyncFull) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncFull) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncFull.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *SyncFull) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncFull.Merge(m, src) -} -func (m *SyncFull) XXX_Size() int { - return m.Size() -} -func (m *SyncFull) XXX_DiscardUnknown() { - xxx_messageInfo_SyncFull.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncFull proto.InternalMessageInfo - -// here with send the request with all changes we have (we already know sender's snapshot path) -type SyncFullRequest struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` - SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` - TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` -} - -func (m *SyncFullRequest) Reset() { *m = SyncFullRequest{} } -func (m *SyncFullRequest) String() string { return proto.CompactTextString(m) } -func (*SyncFullRequest) ProtoMessage() {} -func (*SyncFullRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 3, 0} -} -func (m *SyncFullRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncFullRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncFullRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *SyncFullRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncFullRequest.Merge(m, src) -} -func (m *SyncFullRequest) XXX_Size() int { - return m.Size() -} -func (m *SyncFullRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SyncFullRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncFullRequest proto.InternalMessageInfo - -func (m *SyncFullRequest) GetHeads() []string { - if m != nil { - return m.Heads - } - return nil -} - -func (m *SyncFullRequest) GetChanges() []*aclpb.RawChange { - if m != nil { - return m.Changes - } - return nil -} - -func (m *SyncFullRequest) GetTreeId() string { - if m != nil { - return m.TreeId - } - return "" -} - -func (m *SyncFullRequest) GetSnapshotPath() []string { - if m != nil { - return m.SnapshotPath - } - return nil -} - -func (m *SyncFullRequest) GetTreeHeader() *treepb.TreeHeader { - if m != nil { - return m.TreeHeader - } - return nil -} - -type SyncFullResponse struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` - SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` - TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` -} - -func (m *SyncFullResponse) Reset() { *m = SyncFullResponse{} } -func (m *SyncFullResponse) String() string { return proto.CompactTextString(m) } -func (*SyncFullResponse) ProtoMessage() {} -func (*SyncFullResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5f66cdd599c6466f, []int{0, 3, 1} -} -func (m *SyncFullResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncFullResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncFullResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *SyncFullResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncFullResponse.Merge(m, src) -} -func (m *SyncFullResponse) XXX_Size() int { - return m.Size() -} -func (m *SyncFullResponse) XXX_DiscardUnknown() { - xxx_messageInfo_SyncFullResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncFullResponse proto.InternalMessageInfo - -func (m *SyncFullResponse) GetHeads() []string { - if m != nil { - return m.Heads - } - return nil -} - -func (m *SyncFullResponse) GetChanges() []*aclpb.RawChange { - if m != nil { - return m.Changes - } - return nil -} - -func (m *SyncFullResponse) GetTreeId() string { - if m != nil { - return m.TreeId - } - return "" -} - -func (m *SyncFullResponse) GetSnapshotPath() []string { - if m != nil { - return m.SnapshotPath - } - return nil -} - -func (m *SyncFullResponse) GetTreeHeader() *treepb.TreeHeader { - if m != nil { - return m.TreeHeader - } - return nil -} - -func init() { - proto.RegisterType((*Sync)(nil), "sync.Sync") - proto.RegisterType((*SyncContent)(nil), "sync.Sync.Content") - proto.RegisterType((*SyncContentValue)(nil), "sync.Sync.ContentValue") - proto.RegisterType((*SyncHeadUpdate)(nil), "sync.Sync.HeadUpdate") - proto.RegisterType((*SyncFull)(nil), "sync.Sync.Full") - proto.RegisterType((*SyncFullRequest)(nil), "sync.Sync.Full.Request") - proto.RegisterType((*SyncFullResponse)(nil), "sync.Sync.Full.Response") -} - -func init() { - proto.RegisterFile("service/sync/syncpb/protos/sync.proto", fileDescriptor_5f66cdd599c6466f) -} - -var fileDescriptor_5f66cdd599c6466f = []byte{ - // 421 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x53, 0xcd, 0xce, 0x93, 0x40, - 0x14, 0x65, 0x5a, 0x0a, 0x7e, 0xf7, 0x6b, 0xb4, 0x99, 0xf8, 0x33, 0x61, 0x41, 0x48, 0x13, 0x13, - 0x16, 0x86, 0xd6, 0xba, 0x70, 0xe3, 0xaa, 0x4d, 0x1a, 0xdc, 0x99, 0xf1, 0x67, 0xe1, 0x6e, 0x4a, - 0x47, 0x30, 0x22, 0x20, 0x33, 0xd4, 0xf8, 0x16, 0xbe, 0x8d, 0xc6, 0x27, 0x70, 0xd9, 0xa5, 0x1b, - 0xa3, 0x69, 0x1f, 0xc3, 0x8d, 0x99, 0x01, 0x0a, 0xda, 0x27, 0xe8, 0x02, 0x72, 0x7f, 0xce, 0x39, - 0x9c, 0xcb, 0xcd, 0x85, 0xfb, 0x82, 0x97, 0xbb, 0xb7, 0x11, 0x9f, 0x89, 0x4f, 0x59, 0xa4, 0x5f, - 0xc5, 0x66, 0x56, 0x94, 0xb9, 0xcc, 0x85, 0xce, 0x02, 0x1d, 0x63, 0x53, 0xc5, 0xce, 0xbc, 0x78, - 0x17, 0xcf, 0x58, 0x94, 0xaa, 0x27, 0x4a, 0x58, 0x16, 0x73, 0xa1, 0xc2, 0x8e, 0xd1, 0xd5, 0x6b, - 0x9e, 0xf3, 0xa0, 0x65, 0xc8, 0x92, 0x73, 0x21, 0xf3, 0x92, 0xc5, 0x5c, 0xc7, 0x1d, 0x47, 0x65, - 0x35, 0x7a, 0xfa, 0xcb, 0x02, 0xf3, 0xb9, 0xfa, 0xd0, 0x13, 0xb0, 0x57, 0x79, 0x26, 0x79, 0x26, - 0xf1, 0x43, 0xb0, 0xdf, 0x73, 0x21, 0x58, 0xcc, 0x09, 0xf2, 0x90, 0x7f, 0xbd, 0xb8, 0x17, 0x68, - 0x5f, 0x0a, 0x17, 0x34, 0xa0, 0x57, 0x2c, 0xad, 0x38, 0x6d, 0x71, 0xce, 0x4f, 0x04, 0xe3, 0x7e, - 0x07, 0x3f, 0x06, 0x48, 0x38, 0xdb, 0xbe, 0x2c, 0xb6, 0x4c, 0xb6, 0x32, 0x77, 0x7a, 0x32, 0xe1, - 0xa9, 0x19, 0x1a, 0xb4, 0x07, 0xc5, 0x2b, 0xb8, 0xf5, 0xa6, 0x4a, 0x53, 0x05, 0xa2, 0xfc, 0x43, - 0xc5, 0x85, 0x24, 0x83, 0x33, 0x13, 0xeb, 0x2a, 0x4d, 0x83, 0xa6, 0x1d, 0x1a, 0xf4, 0x7f, 0x06, - 0x5e, 0xc3, 0xa4, 0x2b, 0x89, 0x22, 0xcf, 0x04, 0x27, 0x43, 0xad, 0x42, 0xce, 0x55, 0xea, 0x7e, - 0x68, 0xd0, 0x33, 0xce, 0xd2, 0x86, 0xd1, 0x4e, 0x8d, 0xe3, 0x7c, 0x43, 0x00, 0x9d, 0x65, 0x7c, - 0x1b, 0x46, 0xca, 0xb2, 0x20, 0xc8, 0x1b, 0xfa, 0x57, 0xb4, 0x4e, 0xb0, 0x0f, 0x76, 0xb3, 0x0a, - 0x32, 0xf0, 0x86, 0xfe, 0xf5, 0xe2, 0x66, 0xc0, 0xa2, 0x34, 0xa0, 0xec, 0xe3, 0x4a, 0x97, 0x69, - 0xdb, 0xc6, 0x77, 0xc1, 0x52, 0x3b, 0x78, 0xba, 0xd5, 0xae, 0xae, 0x68, 0x93, 0xe1, 0x29, 0x8c, - 0x45, 0xc6, 0x0a, 0x91, 0xe4, 0xf2, 0x19, 0x93, 0x09, 0x31, 0xb5, 0xfc, 0x3f, 0x35, 0x3c, 0x07, - 0x50, 0x68, 0xe5, 0x86, 0x97, 0x64, 0xa4, 0xa7, 0x9a, 0x04, 0x7a, 0xa5, 0x2f, 0x4e, 0x75, 0xda, - 0xc3, 0x38, 0x7f, 0x06, 0x60, 0xaa, 0x59, 0x9d, 0x2f, 0x08, 0xec, 0xf6, 0x17, 0x5d, 0xd6, 0x08, - 0x5f, 0x11, 0xdc, 0x68, 0xb7, 0x72, 0x59, 0xd6, 0x97, 0xde, 0xf7, 0x83, 0x8b, 0xf6, 0x07, 0x17, - 0xfd, 0x3e, 0xb8, 0xe8, 0xf3, 0xd1, 0x35, 0xf6, 0x47, 0xd7, 0xf8, 0x71, 0x74, 0x8d, 0xd7, 0x56, - 0x7d, 0xfb, 0x1b, 0x4b, 0x9f, 0xe2, 0xa3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x3c, 0xed, 0x7d, - 0xff, 0x19, 0x04, 0x00, 0x00, -} - -func (m *Sync) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Sync) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Sync) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *SyncContent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SyncContent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncContent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Message != nil { - { - size, err := m.Message.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SyncContentValue) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SyncContentValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Value != nil { - { - size := m.Value.Size() - i -= size - if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *SyncContentValueValueOfHeadUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncContentValueValueOfHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.HeadUpdate != nil { - { - size, err := m.HeadUpdate.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} -func (m *SyncContentValueValueOfFullSyncRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncContentValueValueOfFullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.FullSyncRequest != nil { - { - size, err := m.FullSyncRequest.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *SyncContentValueValueOfFullSyncResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncContentValueValueOfFullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.FullSyncResponse != nil { - { - size, err := m.FullSyncResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} -func (m *SyncHeadUpdate) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SyncHeadUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.TreeHeader != nil { - { - size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if len(m.SnapshotPath) > 0 { - for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.SnapshotPath[iNdEx]) - copy(dAtA[i:], m.SnapshotPath[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if len(m.TreeId) > 0 { - i -= len(m.TreeId) - copy(dAtA[i:], m.TreeId) - i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) - i-- - dAtA[i] = 0x1a - } - if len(m.Changes) > 0 { - for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Heads) > 0 { - for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Heads[iNdEx]) - copy(dAtA[i:], m.Heads[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.Heads[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *SyncFull) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SyncFull) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncFull) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *SyncFullRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SyncFullRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncFullRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.TreeHeader != nil { - { - size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if len(m.SnapshotPath) > 0 { - for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.SnapshotPath[iNdEx]) - copy(dAtA[i:], m.SnapshotPath[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if len(m.TreeId) > 0 { - i -= len(m.TreeId) - copy(dAtA[i:], m.TreeId) - i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) - i-- - dAtA[i] = 0x1a - } - if len(m.Changes) > 0 { - for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Heads) > 0 { - for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Heads[iNdEx]) - copy(dAtA[i:], m.Heads[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.Heads[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *SyncFullResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SyncFullResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncFullResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.TreeHeader != nil { - { - size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if len(m.SnapshotPath) > 0 { - for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.SnapshotPath[iNdEx]) - copy(dAtA[i:], m.SnapshotPath[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if len(m.TreeId) > 0 { - i -= len(m.TreeId) - copy(dAtA[i:], m.TreeId) - i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) - i-- - dAtA[i] = 0x1a - } - if len(m.Changes) > 0 { - for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Heads) > 0 { - for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Heads[iNdEx]) - copy(dAtA[i:], m.Heads[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.Heads[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func encodeVarintSync(dAtA []byte, offset int, v uint64) int { - offset -= sovSync(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Sync) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *SyncContent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Message != nil { - l = m.Message.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} - -func (m *SyncContentValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value != nil { - n += m.Value.Size() - } - return n -} - -func (m *SyncContentValueValueOfHeadUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.HeadUpdate != nil { - l = m.HeadUpdate.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} -func (m *SyncContentValueValueOfFullSyncRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.FullSyncRequest != nil { - l = m.FullSyncRequest.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} -func (m *SyncContentValueValueOfFullSyncResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.FullSyncResponse != nil { - l = m.FullSyncResponse.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} -func (m *SyncHeadUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Heads) > 0 { - for _, s := range m.Heads { - l = len(s) - n += 1 + l + sovSync(uint64(l)) - } - } - if len(m.Changes) > 0 { - for _, e := range m.Changes { - l = e.Size() - n += 1 + l + sovSync(uint64(l)) - } - } - l = len(m.TreeId) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } - if len(m.SnapshotPath) > 0 { - for _, s := range m.SnapshotPath { - l = len(s) - n += 1 + l + sovSync(uint64(l)) - } - } - if m.TreeHeader != nil { - l = m.TreeHeader.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} - -func (m *SyncFull) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *SyncFullRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Heads) > 0 { - for _, s := range m.Heads { - l = len(s) - n += 1 + l + sovSync(uint64(l)) - } - } - if len(m.Changes) > 0 { - for _, e := range m.Changes { - l = e.Size() - n += 1 + l + sovSync(uint64(l)) - } - } - l = len(m.TreeId) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } - if len(m.SnapshotPath) > 0 { - for _, s := range m.SnapshotPath { - l = len(s) - n += 1 + l + sovSync(uint64(l)) - } - } - if m.TreeHeader != nil { - l = m.TreeHeader.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} - -func (m *SyncFullResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Heads) > 0 { - for _, s := range m.Heads { - l = len(s) - n += 1 + l + sovSync(uint64(l)) - } - } - if len(m.Changes) > 0 { - for _, e := range m.Changes { - l = e.Size() - n += 1 + l + sovSync(uint64(l)) - } - } - l = len(m.TreeId) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } - if len(m.SnapshotPath) > 0 { - for _, s := range m.SnapshotPath { - l = len(s) - n += 1 + l + sovSync(uint64(l)) - } - } - if m.TreeHeader != nil { - l = m.TreeHeader.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} - -func sovSync(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozSync(x uint64) (n int) { - return sovSync(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Sync) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Sync: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Sync: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncContent) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Content: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Content: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Message == nil { - m.Message = &SyncContentValue{} - } - if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncContentValue) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ContentValue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ContentValue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field HeadUpdate", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SyncHeadUpdate{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &SyncContentValueValueOfHeadUpdate{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FullSyncRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SyncFullRequest{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &SyncContentValueValueOfFullSyncRequest{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FullSyncResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SyncFullResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &SyncContentValueValueOfFullSyncResponse{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: HeadUpdate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: HeadUpdate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Changes = append(m.Changes, &aclpb.RawChange{}) - if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TreeId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.TreeHeader == nil { - m.TreeHeader = &treepb.TreeHeader{} - } - if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncFull) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Full: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Full: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncFullRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Request: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Changes = append(m.Changes, &aclpb.RawChange{}) - if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TreeId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.TreeHeader == nil { - m.TreeHeader = &treepb.TreeHeader{} - } - if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncFullResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Response: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Changes = append(m.Changes, &aclpb.RawChange{}) - if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TreeId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.TreeHeader == nil { - m.TreeHeader = &treepb.TreeHeader{} - } - if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipSync(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowSync - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowSync - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowSync - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthSync - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupSync - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthSync - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthSync = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowSync = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupSync = fmt.Errorf("proto: unexpected end of group") -) diff --git a/syncproto/helpers.go b/syncproto/helpers.go new file mode 100644 index 00000000..e3059bda --- /dev/null +++ b/syncproto/helpers.go @@ -0,0 +1,19 @@ +package syncproto + +func WrapHeadUpdate(update *SyncHeadUpdate) *Sync { + return &Sync{Message: &SyncContentValue{ + Value: &SyncContentValueValueOfHeadUpdate{HeadUpdate: update}, + }} +} + +func WrapFullRequest(request *SyncFullRequest) *Sync { + return &Sync{Message: &SyncContentValue{ + Value: &SyncContentValueValueOfFullSyncRequest{FullSyncRequest: request}, + }} +} + +func WrapFullResponse(response *SyncFullResponse) *Sync { + return &Sync{Message: &SyncContentValue{ + Value: &SyncContentValueValueOfFullSyncResponse{FullSyncResponse: response}, + }} +} diff --git a/syncproto/proto/sync.proto b/syncproto/proto/sync.proto index d633afd3..1aa39e1a 100644 --- a/syncproto/proto/sync.proto +++ b/syncproto/proto/sync.proto @@ -2,6 +2,9 @@ syntax = "proto3"; package anytype; option go_package = "/syncproto"; +import "pkg/acl/aclchanges/aclpb/protos/aclchanges.proto"; +import "pkg/acl/treestorage/treepb/protos/tree.proto"; + message Message { Header header = 1; bytes data = 2; @@ -20,7 +23,6 @@ enum MessageType { MessageTypeSync = 2; } - message System { Handshake handshake = 1; Ping ping = 2; @@ -60,5 +62,40 @@ message Subscription { message Sync { string spaceId = 1; + ContentValue message = 2; + message ContentValue { + oneof value { + HeadUpdate headUpdate = 1; + Full.Request fullSyncRequest = 2; + Full.Response fullSyncResponse = 3; + } + } + + message HeadUpdate { + repeated string heads = 1; + repeated acl.RawChange changes = 2; + string treeId = 3; + repeated string snapshotPath = 4; + tree.TreeHeader treeHeader = 5; + } + + message Full { + // here with send the request with all changes we have (we already know sender's snapshot path) + message Request { + repeated string heads = 1; + repeated acl.RawChange changes = 2; + string treeId = 3; + repeated string snapshotPath = 4; + tree.TreeHeader treeHeader = 5; + } + + message Response { + repeated string heads = 1; + repeated acl.RawChange changes = 2; + string treeId = 3; + repeated string snapshotPath = 4; + tree.TreeHeader treeHeader = 5; + } + } } diff --git a/syncproto/sync.pb.go b/syncproto/sync.pb.go index d673a859..a002c37d 100644 --- a/syncproto/sync.pb.go +++ b/syncproto/sync.pb.go @@ -5,6 +5,8 @@ package syncproto import ( fmt "fmt" + aclpb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + treepb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" proto "github.com/gogo/protobuf/proto" io "io" math "math" @@ -580,7 +582,8 @@ func (m *SubscriptionUnsubscribeSpace) GetSpaceId() string { } type Sync struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Message *SyncContentValue `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` } func (m *Sync) Reset() { *m = Sync{} } @@ -623,6 +626,376 @@ func (m *Sync) GetSpaceId() string { return "" } +func (m *Sync) GetMessage() *SyncContentValue { + if m != nil { + return m.Message + } + return nil +} + +type SyncContentValue struct { + // Types that are valid to be assigned to Value: + // *SyncContentValueValueOfHeadUpdate + // *SyncContentValueValueOfFullSyncRequest + // *SyncContentValueValueOfFullSyncResponse + Value IsSyncContentValueValue `protobuf_oneof:"value"` +} + +func (m *SyncContentValue) Reset() { *m = SyncContentValue{} } +func (m *SyncContentValue) String() string { return proto.CompactTextString(m) } +func (*SyncContentValue) ProtoMessage() {} +func (*SyncContentValue) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{4, 0} +} +func (m *SyncContentValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncContentValue.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncContentValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncContentValue.Merge(m, src) +} +func (m *SyncContentValue) XXX_Size() int { + return m.Size() +} +func (m *SyncContentValue) XXX_DiscardUnknown() { + xxx_messageInfo_SyncContentValue.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncContentValue proto.InternalMessageInfo + +type IsSyncContentValueValue interface { + IsSyncContentValueValue() + MarshalTo([]byte) (int, error) + Size() int +} + +type SyncContentValueValueOfHeadUpdate struct { + HeadUpdate *SyncHeadUpdate `protobuf:"bytes,1,opt,name=headUpdate,proto3,oneof" json:"headUpdate,omitempty"` +} +type SyncContentValueValueOfFullSyncRequest struct { + FullSyncRequest *SyncFullRequest `protobuf:"bytes,2,opt,name=fullSyncRequest,proto3,oneof" json:"fullSyncRequest,omitempty"` +} +type SyncContentValueValueOfFullSyncResponse struct { + FullSyncResponse *SyncFullResponse `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` +} + +func (*SyncContentValueValueOfHeadUpdate) IsSyncContentValueValue() {} +func (*SyncContentValueValueOfFullSyncRequest) IsSyncContentValueValue() {} +func (*SyncContentValueValueOfFullSyncResponse) IsSyncContentValueValue() {} + +func (m *SyncContentValue) GetValue() IsSyncContentValueValue { + if m != nil { + return m.Value + } + return nil +} + +func (m *SyncContentValue) GetHeadUpdate() *SyncHeadUpdate { + if x, ok := m.GetValue().(*SyncContentValueValueOfHeadUpdate); ok { + return x.HeadUpdate + } + return nil +} + +func (m *SyncContentValue) GetFullSyncRequest() *SyncFullRequest { + if x, ok := m.GetValue().(*SyncContentValueValueOfFullSyncRequest); ok { + return x.FullSyncRequest + } + return nil +} + +func (m *SyncContentValue) GetFullSyncResponse() *SyncFullResponse { + if x, ok := m.GetValue().(*SyncContentValueValueOfFullSyncResponse); ok { + return x.FullSyncResponse + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*SyncContentValue) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*SyncContentValueValueOfHeadUpdate)(nil), + (*SyncContentValueValueOfFullSyncRequest)(nil), + (*SyncContentValueValueOfFullSyncResponse)(nil), + } +} + +type SyncHeadUpdate struct { + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` + SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` + TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` +} + +func (m *SyncHeadUpdate) Reset() { *m = SyncHeadUpdate{} } +func (m *SyncHeadUpdate) String() string { return proto.CompactTextString(m) } +func (*SyncHeadUpdate) ProtoMessage() {} +func (*SyncHeadUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{4, 1} +} +func (m *SyncHeadUpdate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncHeadUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncHeadUpdate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncHeadUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncHeadUpdate.Merge(m, src) +} +func (m *SyncHeadUpdate) XXX_Size() int { + return m.Size() +} +func (m *SyncHeadUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_SyncHeadUpdate.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncHeadUpdate proto.InternalMessageInfo + +func (m *SyncHeadUpdate) GetHeads() []string { + if m != nil { + return m.Heads + } + return nil +} + +func (m *SyncHeadUpdate) GetChanges() []*aclpb.RawChange { + if m != nil { + return m.Changes + } + return nil +} + +func (m *SyncHeadUpdate) GetTreeId() string { + if m != nil { + return m.TreeId + } + return "" +} + +func (m *SyncHeadUpdate) GetSnapshotPath() []string { + if m != nil { + return m.SnapshotPath + } + return nil +} + +func (m *SyncHeadUpdate) GetTreeHeader() *treepb.TreeHeader { + if m != nil { + return m.TreeHeader + } + return nil +} + +type SyncFull struct { +} + +func (m *SyncFull) Reset() { *m = SyncFull{} } +func (m *SyncFull) String() string { return proto.CompactTextString(m) } +func (*SyncFull) ProtoMessage() {} +func (*SyncFull) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{4, 2} +} +func (m *SyncFull) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncFull) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncFull.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncFull) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncFull.Merge(m, src) +} +func (m *SyncFull) XXX_Size() int { + return m.Size() +} +func (m *SyncFull) XXX_DiscardUnknown() { + xxx_messageInfo_SyncFull.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncFull proto.InternalMessageInfo + +// here with send the request with all changes we have (we already know sender's snapshot path) +type SyncFullRequest struct { + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` + SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` + TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` +} + +func (m *SyncFullRequest) Reset() { *m = SyncFullRequest{} } +func (m *SyncFullRequest) String() string { return proto.CompactTextString(m) } +func (*SyncFullRequest) ProtoMessage() {} +func (*SyncFullRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{4, 2, 0} +} +func (m *SyncFullRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncFullRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncFullRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncFullRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncFullRequest.Merge(m, src) +} +func (m *SyncFullRequest) XXX_Size() int { + return m.Size() +} +func (m *SyncFullRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SyncFullRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncFullRequest proto.InternalMessageInfo + +func (m *SyncFullRequest) GetHeads() []string { + if m != nil { + return m.Heads + } + return nil +} + +func (m *SyncFullRequest) GetChanges() []*aclpb.RawChange { + if m != nil { + return m.Changes + } + return nil +} + +func (m *SyncFullRequest) GetTreeId() string { + if m != nil { + return m.TreeId + } + return "" +} + +func (m *SyncFullRequest) GetSnapshotPath() []string { + if m != nil { + return m.SnapshotPath + } + return nil +} + +func (m *SyncFullRequest) GetTreeHeader() *treepb.TreeHeader { + if m != nil { + return m.TreeHeader + } + return nil +} + +type SyncFullResponse struct { + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` + SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` + TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` +} + +func (m *SyncFullResponse) Reset() { *m = SyncFullResponse{} } +func (m *SyncFullResponse) String() string { return proto.CompactTextString(m) } +func (*SyncFullResponse) ProtoMessage() {} +func (*SyncFullResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{4, 2, 1} +} +func (m *SyncFullResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncFullResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncFullResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SyncFullResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncFullResponse.Merge(m, src) +} +func (m *SyncFullResponse) XXX_Size() int { + return m.Size() +} +func (m *SyncFullResponse) XXX_DiscardUnknown() { + xxx_messageInfo_SyncFullResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncFullResponse proto.InternalMessageInfo + +func (m *SyncFullResponse) GetHeads() []string { + if m != nil { + return m.Heads + } + return nil +} + +func (m *SyncFullResponse) GetChanges() []*aclpb.RawChange { + if m != nil { + return m.Changes + } + return nil +} + +func (m *SyncFullResponse) GetTreeId() string { + if m != nil { + return m.TreeId + } + return "" +} + +func (m *SyncFullResponse) GetSnapshotPath() []string { + if m != nil { + return m.SnapshotPath + } + return nil +} + +func (m *SyncFullResponse) GetTreeHeader() *treepb.TreeHeader { + if m != nil { + return m.TreeHeader + } + return nil +} + func init() { proto.RegisterEnum("anytype.MessageType", MessageType_name, MessageType_value) proto.RegisterEnum("anytype.SystemErrorCode", SystemErrorCode_name, SystemErrorCode_value) @@ -637,49 +1010,71 @@ func init() { proto.RegisterType((*SubscriptionSubscribeSpace)(nil), "anytype.Subscription.SubscribeSpace") proto.RegisterType((*SubscriptionUnsubscribeSpace)(nil), "anytype.Subscription.UnsubscribeSpace") proto.RegisterType((*Sync)(nil), "anytype.Sync") + proto.RegisterType((*SyncContentValue)(nil), "anytype.Sync.ContentValue") + proto.RegisterType((*SyncHeadUpdate)(nil), "anytype.Sync.HeadUpdate") + proto.RegisterType((*SyncFull)(nil), "anytype.Sync.Full") + proto.RegisterType((*SyncFullRequest)(nil), "anytype.Sync.Full.Request") + proto.RegisterType((*SyncFullResponse)(nil), "anytype.Sync.Full.Response") } func init() { proto.RegisterFile("syncproto/proto/sync.proto", fileDescriptor_4b28dfdd48a89166) } var fileDescriptor_4b28dfdd48a89166 = []byte{ - // 577 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x94, 0x51, 0x6f, 0xd2, 0x50, - 0x14, 0xc7, 0x29, 0x74, 0x20, 0xa7, 0x04, 0xea, 0x9d, 0x8b, 0x58, 0x97, 0xa6, 0x69, 0xa6, 0x92, - 0x69, 0xba, 0x04, 0xb3, 0xf8, 0x3c, 0x27, 0x06, 0xe2, 0xa4, 0xe4, 0x16, 0x30, 0xf1, 0x65, 0x29, - 0xb7, 0x37, 0xd0, 0xb0, 0xb5, 0xb5, 0x2d, 0x89, 0x7d, 0xf7, 0xc9, 0xa7, 0x7d, 0x18, 0x3f, 0x84, - 0x8f, 0x7b, 0xf4, 0xd1, 0xc0, 0x17, 0x31, 0xbd, 0x6d, 0xa1, 0xab, 0xdb, 0x0b, 0xdc, 0xff, 0xb9, - 0xbf, 0xff, 0x39, 0xff, 0xcb, 0xbd, 0x01, 0xa4, 0x20, 0x72, 0x88, 0xe7, 0xbb, 0xa1, 0x7b, 0x92, - 0x7c, 0xc6, 0x5a, 0x63, 0x4b, 0x54, 0x33, 0x9d, 0x28, 0x8c, 0x3c, 0xaa, 0x7e, 0x84, 0xda, 0x67, - 0x1a, 0x04, 0xe6, 0x9c, 0xa2, 0x57, 0x50, 0x5d, 0x50, 0xd3, 0xa2, 0x7e, 0x9b, 0x53, 0xb8, 0x8e, - 0xd0, 0x6d, 0x69, 0x29, 0xa4, 0xf5, 0x59, 0x19, 0xa7, 0xdb, 0x08, 0x01, 0x6f, 0x99, 0xa1, 0xd9, - 0x2e, 0x2b, 0x5c, 0xa7, 0x81, 0xd9, 0x5a, 0xfd, 0xc1, 0x41, 0x35, 0xc1, 0x50, 0x1b, 0x6a, 0xa1, - 0x6f, 0x12, 0x3a, 0xb0, 0x58, 0xa3, 0x06, 0xce, 0x24, 0x3a, 0x84, 0xba, 0x4f, 0xbf, 0xad, 0x68, - 0x10, 0x0e, 0x2c, 0xe6, 0xe6, 0xf1, 0xae, 0x10, 0xfb, 0x7c, 0xea, 0x5d, 0x45, 0x03, 0xab, 0x5d, - 0x61, 0x7b, 0x99, 0x44, 0x1d, 0xe0, 0xe3, 0x1c, 0x6d, 0x5e, 0xe1, 0x3a, 0xcd, 0xee, 0x93, 0x6d, - 0xae, 0x34, 0xf9, 0x38, 0xf2, 0x28, 0x66, 0x84, 0xfa, 0xab, 0x02, 0x55, 0x23, 0x0a, 0x42, 0x7a, - 0x8d, 0xde, 0x41, 0x7d, 0x61, 0x3a, 0x56, 0xb0, 0x30, 0x97, 0x34, 0x3d, 0xd1, 0xb3, 0xad, 0x33, - 0x61, 0xb4, 0x7e, 0x06, 0xe0, 0x1d, 0x1b, 0x4f, 0xf3, 0x6c, 0x67, 0xce, 0x02, 0x0a, 0xb9, 0x69, - 0xa9, 0x67, 0x64, 0x3b, 0x73, 0xcc, 0x08, 0xf4, 0x02, 0x2a, 0x26, 0x59, 0xb2, 0xb4, 0x42, 0x77, - 0xbf, 0x08, 0x9e, 0x91, 0x25, 0x8e, 0xf7, 0xa5, 0x53, 0xa8, 0xf7, 0x73, 0xdd, 0x5b, 0xec, 0x0a, - 0x88, 0x7b, 0x35, 0xa5, 0x7e, 0x60, 0xbb, 0x0e, 0x0b, 0x57, 0xc7, 0xc5, 0xb2, 0xa4, 0x02, 0x1f, - 0xcf, 0x42, 0x12, 0x3c, 0x5a, 0x39, 0xf6, 0xf7, 0xb1, 0x7d, 0x9d, 0x9c, 0x83, 0xc7, 0x5b, 0x2d, - 0x75, 0xa1, 0x72, 0x46, 0x96, 0xe8, 0x35, 0xec, 0x51, 0xdf, 0x77, 0xfd, 0x34, 0xf3, 0x41, 0x31, - 0x4a, 0x2f, 0xde, 0xc4, 0x09, 0x23, 0xdd, 0x70, 0xb0, 0xc7, 0x0a, 0x48, 0x03, 0x9e, 0xb8, 0x56, - 0xd2, 0xb5, 0xd9, 0x95, 0xee, 0x75, 0x69, 0xe7, 0xae, 0x45, 0x31, 0xe3, 0x90, 0x02, 0x82, 0x45, - 0x03, 0xe2, 0xdb, 0x5e, 0x18, 0xe7, 0x2e, 0xb3, 0xdc, 0xf9, 0x92, 0x7a, 0x0a, 0x7c, 0xcc, 0x23, - 0x01, 0x6a, 0x93, 0xe1, 0xa7, 0xa1, 0xfe, 0x65, 0x28, 0x96, 0x90, 0x02, 0x87, 0x93, 0xa1, 0x31, - 0x19, 0x8d, 0x74, 0x3c, 0xee, 0x7d, 0xb8, 0x1c, 0x61, 0x7d, 0xac, 0x9f, 0xeb, 0x17, 0x97, 0xd3, - 0x1e, 0x36, 0x06, 0xfa, 0x50, 0x04, 0xf5, 0x67, 0x19, 0x1a, 0xc6, 0x6a, 0xb6, 0xed, 0x83, 0x2e, - 0xa0, 0x19, 0x24, 0x7a, 0x46, 0x0d, 0xcf, 0x24, 0xd9, 0x0d, 0x1e, 0xed, 0x32, 0xe6, 0xf0, 0x4c, - 0xa4, 0x2c, 0x2e, 0x78, 0x11, 0x06, 0x71, 0xe5, 0x14, 0xfa, 0x25, 0xbf, 0xd4, 0xcb, 0xfb, 0xfb, - 0x4d, 0x0a, 0x34, 0xfe, 0xcf, 0x2f, 0x1d, 0x43, 0xf3, 0xee, 0xd4, 0xf8, 0xfd, 0x06, 0xde, 0xee, - 0xdd, 0xd7, 0x71, 0x26, 0xa5, 0x37, 0x20, 0x16, 0x3b, 0x3e, 0x4c, 0xab, 0x0a, 0xf0, 0x46, 0xe4, - 0x90, 0x87, 0x89, 0xe3, 0x29, 0x08, 0xb9, 0xa7, 0x8f, 0x0e, 0xe0, 0x71, 0x4e, 0x26, 0x97, 0x27, - 0x96, 0xd0, 0x73, 0x78, 0x9a, 0x2f, 0xe7, 0xce, 0x27, 0x72, 0x68, 0x1f, 0x5a, 0x77, 0x3c, 0x0e, - 0x11, 0xcb, 0xef, 0x8f, 0x7e, 0xaf, 0x65, 0xee, 0x76, 0x2d, 0x73, 0x7f, 0xd7, 0x32, 0x77, 0xb3, - 0x91, 0x4b, 0xb7, 0x1b, 0xb9, 0xf4, 0x67, 0x23, 0x97, 0xbe, 0xc2, 0xc9, 0xf6, 0xcf, 0x64, 0x56, - 0x65, 0x5f, 0x6f, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x26, 0x2f, 0x92, 0xfd, 0x60, 0x04, 0x00, - 0x00, + // 851 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x41, 0x8f, 0xdb, 0x44, + 0x14, 0xb6, 0x13, 0x27, 0x6e, 0x5e, 0xa2, 0xac, 0x99, 0xb6, 0x60, 0xdc, 0x2a, 0x8a, 0xac, 0x02, + 0x51, 0xa9, 0xbc, 0x55, 0xa0, 0x42, 0xe2, 0xd6, 0x2e, 0xbb, 0x4a, 0x44, 0x49, 0xa2, 0x49, 0xb2, + 0x48, 0x5c, 0xaa, 0x59, 0x7b, 0x48, 0xa2, 0x78, 0xc7, 0xc6, 0xe3, 0x00, 0xb9, 0x73, 0xe2, 0xd4, + 0x1f, 0x83, 0x04, 0xe2, 0x17, 0x70, 0xec, 0x91, 0x23, 0xda, 0x95, 0xf8, 0x11, 0x70, 0xa9, 0x66, + 0xc6, 0x4e, 0xbc, 0x6e, 0xfa, 0x03, 0x7a, 0xd8, 0xcd, 0xbc, 0xef, 0x7d, 0xdf, 0x9b, 0xef, 0x8d, + 0x3d, 0x2f, 0x01, 0x87, 0x6f, 0x99, 0x1f, 0x27, 0x51, 0x1a, 0x1d, 0xab, 0xff, 0x22, 0xf6, 0xe4, + 0x12, 0x99, 0x84, 0x6d, 0xd3, 0x6d, 0x4c, 0x9d, 0xc7, 0xf1, 0x7a, 0x71, 0x4c, 0xfc, 0x50, 0xfc, + 0xf9, 0x4b, 0xc2, 0x16, 0x94, 0x8b, 0x65, 0x7c, 0xa1, 0x34, 0xbc, 0x80, 0x2b, 0xa9, 0xf3, 0x28, + 0x57, 0xa4, 0x09, 0xa5, 0x3c, 0x8d, 0x12, 0xb2, 0xa0, 0x72, 0xbd, 0xd7, 0x88, 0x48, 0xb1, 0xdd, + 0x33, 0x30, 0xbf, 0xa1, 0x9c, 0x93, 0x05, 0x45, 0x9f, 0x40, 0x7d, 0x49, 0x49, 0x40, 0x13, 0x5b, + 0xef, 0xea, 0xbd, 0x66, 0xff, 0xc8, 0xcb, 0x4c, 0x78, 0x03, 0x09, 0xe3, 0x2c, 0x8d, 0x10, 0x18, + 0x01, 0x49, 0x89, 0x5d, 0xe9, 0xea, 0xbd, 0x16, 0x96, 0x6b, 0xf7, 0x17, 0x1d, 0xea, 0x8a, 0x86, + 0x6c, 0x30, 0xd3, 0x84, 0xf8, 0x74, 0x18, 0xc8, 0x42, 0x2d, 0x9c, 0x87, 0xe8, 0x3e, 0x34, 0x12, + 0xfa, 0xc3, 0x86, 0xf2, 0x74, 0x18, 0x48, 0xb5, 0x81, 0xf7, 0x80, 0xd0, 0x25, 0x34, 0x0e, 0xb7, + 0xc3, 0xc0, 0xae, 0xca, 0x5c, 0x1e, 0xa2, 0x1e, 0x18, 0xc2, 0x87, 0x6d, 0x74, 0xf5, 0x5e, 0xbb, + 0x7f, 0x67, 0xe7, 0x2b, 0x73, 0x3e, 0xdb, 0xc6, 0x14, 0x4b, 0x86, 0xfb, 0x5b, 0x15, 0xea, 0xd3, + 0x2d, 0x4f, 0xe9, 0x25, 0xfa, 0x02, 0x1a, 0x4b, 0xc2, 0x02, 0xbe, 0x24, 0x6b, 0x9a, 0x75, 0xf4, + 0xe1, 0x4e, 0xa9, 0x38, 0xde, 0x20, 0x27, 0xe0, 0x3d, 0x57, 0xec, 0x16, 0xaf, 0xd8, 0x42, 0x1a, + 0x6c, 0x16, 0x76, 0xcb, 0x34, 0x93, 0x15, 0x5b, 0x60, 0xc9, 0x40, 0x1f, 0x41, 0x95, 0xf8, 0x6b, + 0xe9, 0xb6, 0xd9, 0xbf, 0x5d, 0x26, 0x3e, 0xf5, 0xd7, 0x58, 0xe4, 0x9d, 0x27, 0xd0, 0x18, 0x14, + 0xaa, 0x1f, 0xc9, 0x93, 0xf7, 0xa3, 0xf0, 0x9c, 0x26, 0x7c, 0x15, 0x31, 0x69, 0xae, 0x81, 0xcb, + 0xb0, 0xe3, 0x82, 0x21, 0xf6, 0x42, 0x0e, 0xdc, 0xda, 0xb0, 0xd5, 0xcf, 0xb3, 0xd5, 0xa5, 0xea, + 0xc3, 0xc0, 0xbb, 0xd8, 0xe9, 0x43, 0xf5, 0xa9, 0xbf, 0x46, 0x9f, 0x42, 0x8d, 0x26, 0x49, 0x94, + 0x64, 0x9e, 0xef, 0x96, 0xad, 0x9c, 0x8a, 0x24, 0x56, 0x1c, 0xe7, 0xa5, 0x0e, 0x35, 0x09, 0x20, + 0x0f, 0x0c, 0x3f, 0x0a, 0x54, 0xd5, 0x76, 0xdf, 0x39, 0xa8, 0xf2, 0x4e, 0xa2, 0x80, 0x62, 0xc9, + 0x43, 0x5d, 0x68, 0x06, 0x94, 0xfb, 0xc9, 0x2a, 0x4e, 0x85, 0xef, 0x8a, 0xf4, 0x5d, 0x84, 0xdc, + 0x27, 0x60, 0x08, 0x3e, 0x6a, 0x82, 0x39, 0x1f, 0x7d, 0x3d, 0x1a, 0x7f, 0x3b, 0xb2, 0x34, 0xd4, + 0x85, 0xfb, 0xf3, 0xd1, 0x74, 0x3e, 0x99, 0x8c, 0xf1, 0xec, 0xf4, 0xab, 0x17, 0x13, 0x3c, 0x9e, + 0x8d, 0x4f, 0xc6, 0xcf, 0x5f, 0x9c, 0x9f, 0xe2, 0xe9, 0x70, 0x3c, 0xb2, 0xc0, 0xfd, 0xb5, 0x02, + 0xad, 0xe9, 0xe6, 0x62, 0x57, 0x07, 0x3d, 0x87, 0x36, 0x57, 0xf1, 0x05, 0x9d, 0xc6, 0xc4, 0xcf, + 0x9f, 0xe0, 0x83, 0xbd, 0xc7, 0x02, 0x3d, 0x0f, 0x32, 0x2e, 0x2e, 0x69, 0x11, 0x06, 0x6b, 0xc3, + 0x4a, 0xf5, 0xd4, 0x49, 0x7d, 0x7c, 0xb8, 0xde, 0xbc, 0xc4, 0xc6, 0x6f, 0xe8, 0x9d, 0x87, 0xd0, + 0xbe, 0xb9, 0xab, 0x78, 0x7f, 0x79, 0xbc, 0x7f, 0xef, 0x1b, 0x38, 0x0f, 0x9d, 0x47, 0x60, 0x95, + 0x2b, 0xbe, 0x9d, 0xed, 0xfe, 0x57, 0x07, 0x63, 0xba, 0x65, 0xfe, 0xdb, 0x29, 0xe8, 0x73, 0x30, + 0x2f, 0xd5, 0xbb, 0x9f, 0xf5, 0x51, 0x7c, 0x76, 0xcc, 0xf7, 0x4e, 0x22, 0x96, 0x52, 0x96, 0x9e, + 0x93, 0x70, 0x43, 0x71, 0x4e, 0x75, 0xfe, 0xd5, 0xa1, 0x55, 0xcc, 0xa0, 0x2f, 0x01, 0xc4, 0x95, + 0x9e, 0xc7, 0x01, 0x49, 0xf3, 0x13, 0xb6, 0x6f, 0x56, 0x1a, 0xec, 0xf2, 0x03, 0x0d, 0x17, 0xd8, + 0xe8, 0x0c, 0x8e, 0xbe, 0xdf, 0x84, 0xa1, 0x20, 0x61, 0x75, 0x85, 0x0f, 0x5b, 0x39, 0xdb, 0x84, + 0xa1, 0x97, 0x31, 0x06, 0x1a, 0x2e, 0x8b, 0xd0, 0x10, 0xac, 0x3d, 0xc4, 0xe3, 0x88, 0x71, 0x9a, + 0x5d, 0xa8, 0x7b, 0x07, 0x0b, 0x29, 0xca, 0x40, 0xc3, 0x6f, 0xc8, 0x9e, 0x99, 0x50, 0xfb, 0x51, + 0xf4, 0xe5, 0xfc, 0xa9, 0x03, 0xec, 0x8d, 0xa3, 0x3b, 0x50, 0x13, 0xc6, 0xb9, 0xad, 0x77, 0xab, + 0xbd, 0x06, 0x56, 0x01, 0xea, 0x81, 0x99, 0x0d, 0x4e, 0xbb, 0xd2, 0xad, 0xf6, 0x9a, 0xfd, 0xb6, + 0x47, 0xfc, 0xd0, 0xc3, 0xe4, 0xa7, 0x13, 0x09, 0xe3, 0x3c, 0x8d, 0xde, 0x87, 0xba, 0x98, 0x98, + 0xd9, 0x5c, 0x6a, 0xe0, 0x2c, 0x42, 0x2e, 0xb4, 0x38, 0x23, 0x31, 0x5f, 0x46, 0xe9, 0x84, 0xa4, + 0x4b, 0xdb, 0x90, 0xe5, 0x6f, 0x60, 0xe8, 0x31, 0x80, 0x60, 0xab, 0xd1, 0x68, 0xd7, 0x64, 0x63, + 0x96, 0x27, 0x07, 0xf0, 0x6c, 0x87, 0xe3, 0x02, 0xc7, 0xf9, 0xbf, 0x02, 0x86, 0xe8, 0xd5, 0xf9, + 0x5d, 0x07, 0x33, 0x3f, 0xa5, 0x77, 0xab, 0x85, 0x3f, 0x74, 0xb8, 0x95, 0x3f, 0x95, 0x77, 0xcb, + 0xfa, 0xc3, 0x73, 0x68, 0x16, 0xbe, 0x55, 0xd0, 0x5d, 0x78, 0xaf, 0x10, 0xaa, 0xb9, 0x68, 0x69, + 0xe8, 0x1e, 0x7c, 0x50, 0x84, 0x0b, 0xa3, 0xc3, 0xd2, 0xd1, 0x6d, 0x38, 0xba, 0xa1, 0x61, 0xbe, + 0x55, 0x79, 0xf6, 0xe0, 0xaf, 0xab, 0x8e, 0xfe, 0xea, 0xaa, 0xa3, 0xff, 0x73, 0xd5, 0xd1, 0x5f, + 0x5e, 0x77, 0xb4, 0x57, 0xd7, 0x1d, 0xed, 0xef, 0xeb, 0x8e, 0xf6, 0x1d, 0x1c, 0xef, 0x7e, 0x07, + 0x5c, 0xd4, 0xe5, 0xc7, 0x67, 0xaf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x41, 0xe9, 0x79, 0xe5, 0x1b, + 0x08, 0x00, 0x00, } func (m *Message) Marshal() (dAtA []byte, err error) { @@ -1083,6 +1478,18 @@ func (m *Sync) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Message != nil { + { + size, err := m.Message.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } if len(m.SpaceId) > 0 { i -= len(m.SpaceId) copy(dAtA[i:], m.SpaceId) @@ -1093,6 +1500,346 @@ func (m *Sync) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SyncContentValue) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncContentValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Value != nil { + { + size := m.Value.Size() + i -= size + if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *SyncContentValueValueOfHeadUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncContentValueValueOfHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.HeadUpdate != nil { + { + size, err := m.HeadUpdate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *SyncContentValueValueOfFullSyncRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncContentValueValueOfFullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.FullSyncRequest != nil { + { + size, err := m.FullSyncRequest.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *SyncContentValueValueOfFullSyncResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncContentValueValueOfFullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.FullSyncResponse != nil { + { + size, err := m.FullSyncResponse.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *SyncHeadUpdate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncHeadUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.TreeHeader != nil { + { + size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.TreeId) > 0 { + i -= len(m.TreeId) + copy(dAtA[i:], m.TreeId) + i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) + i-- + dAtA[i] = 0x1a + } + if len(m.Changes) > 0 { + for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Heads) > 0 { + for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Heads[iNdEx]) + copy(dAtA[i:], m.Heads[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.Heads[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *SyncFull) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncFull) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncFull) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *SyncFullRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncFullRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncFullRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.TreeHeader != nil { + { + size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.TreeId) > 0 { + i -= len(m.TreeId) + copy(dAtA[i:], m.TreeId) + i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) + i-- + dAtA[i] = 0x1a + } + if len(m.Changes) > 0 { + for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Heads) > 0 { + for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Heads[iNdEx]) + copy(dAtA[i:], m.Heads[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.Heads[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *SyncFullResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SyncFullResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncFullResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.TreeHeader != nil { + { + size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + if len(m.TreeId) > 0 { + i -= len(m.TreeId) + copy(dAtA[i:], m.TreeId) + i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) + i-- + dAtA[i] = 0x1a + } + if len(m.Changes) > 0 { + for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Heads) > 0 { + for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Heads[iNdEx]) + copy(dAtA[i:], m.Heads[iNdEx]) + i = encodeVarintSync(dAtA, i, uint64(len(m.Heads[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintSync(dAtA []byte, offset int, v uint64) int { offset -= sovSync(v) base := offset @@ -1271,6 +2018,172 @@ func (m *Sync) Size() (n int) { if l > 0 { n += 1 + l + sovSync(uint64(l)) } + if m.Message != nil { + l = m.Message.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} + +func (m *SyncContentValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != nil { + n += m.Value.Size() + } + return n +} + +func (m *SyncContentValueValueOfHeadUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.HeadUpdate != nil { + l = m.HeadUpdate.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} +func (m *SyncContentValueValueOfFullSyncRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.FullSyncRequest != nil { + l = m.FullSyncRequest.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} +func (m *SyncContentValueValueOfFullSyncResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.FullSyncResponse != nil { + l = m.FullSyncResponse.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} +func (m *SyncHeadUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Heads) > 0 { + for _, s := range m.Heads { + l = len(s) + n += 1 + l + sovSync(uint64(l)) + } + } + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovSync(uint64(l)) + } + } + l = len(m.TreeId) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } + if len(m.SnapshotPath) > 0 { + for _, s := range m.SnapshotPath { + l = len(s) + n += 1 + l + sovSync(uint64(l)) + } + } + if m.TreeHeader != nil { + l = m.TreeHeader.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} + +func (m *SyncFull) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *SyncFullRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Heads) > 0 { + for _, s := range m.Heads { + l = len(s) + n += 1 + l + sovSync(uint64(l)) + } + } + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovSync(uint64(l)) + } + } + l = len(m.TreeId) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } + if len(m.SnapshotPath) > 0 { + for _, s := range m.SnapshotPath { + l = len(s) + n += 1 + l + sovSync(uint64(l)) + } + } + if m.TreeHeader != nil { + l = m.TreeHeader.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} + +func (m *SyncFullResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Heads) > 0 { + for _, s := range m.Heads { + l = len(s) + n += 1 + l + sovSync(uint64(l)) + } + } + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovSync(uint64(l)) + } + } + l = len(m.TreeId) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } + if len(m.SnapshotPath) > 0 { + for _, s := range m.SnapshotPath { + l = len(s) + n += 1 + l + sovSync(uint64(l)) + } + } + if m.TreeHeader != nil { + l = m.TreeHeader.Size() + n += 1 + l + sovSync(uint64(l)) + } return n } @@ -2384,6 +3297,895 @@ func (m *Sync) Unmarshal(dAtA []byte) error { } m.SpaceId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Message == nil { + m.Message = &SyncContentValue{} + } + if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncContentValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContentValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContentValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HeadUpdate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SyncHeadUpdate{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &SyncContentValueValueOfHeadUpdate{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FullSyncRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SyncFullRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &SyncContentValueValueOfFullSyncRequest{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FullSyncResponse", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SyncFullResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &SyncContentValueValueOfFullSyncResponse{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HeadUpdate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HeadUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, &aclpb.RawChange{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TreeId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TreeHeader == nil { + m.TreeHeader = &treepb.TreeHeader{} + } + if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncFull) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Full: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Full: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncFullRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, &aclpb.RawChange{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TreeId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TreeHeader == nil { + m.TreeHeader = &treepb.TreeHeader{} + } + if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncFullResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, &aclpb.RawChange{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TreeId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TreeHeader == nil { + m.TreeHeader = &treepb.TreeHeader{} + } + if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) From 89fb94420a4e4c38c6f71a268ff8fc490635ec51 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 5 Aug 2022 14:19:03 +0200 Subject: [PATCH 36/40] Fix compile errors and add dependencies --- cmd/node/node.go | 19 +- cmd/nodesgen/gen.go | 5 +- service/net/dialer/dialer.go | 6 +- service/sync/document/service.go | 10 +- service/sync/message/service.go | 176 ++++++++---------- service/sync/requesthandler/requesthandler.go | 12 +- 6 files changed, 105 insertions(+), 123 deletions(-) diff --git a/cmd/node/node.go b/cmd/node/node.go index 69c5c601..d65f7a10 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -7,11 +7,17 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/example" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/api" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/document" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "go.uber.org/zap" "net/http" _ "net/http/pprof" @@ -85,9 +91,16 @@ func main() { } func Bootstrap(a *app.App) { - a.Register(secure.New()). + a.Register(account.New()). + Register(secure.New()). Register(server.New()). Register(dialer.New()). Register(pool.NewPool()). - Register(&example.Example{}) + //Register(&example.Example{}) + Register(node.New()). + Register(document.New()). + Register(message.New()). + Register(requesthandler.New()). + Register(treecache.New()). + Register(api.New()) } diff --git a/cmd/nodesgen/gen.go b/cmd/nodesgen/gen.go index 7532f12c..069c3c59 100644 --- a/cmd/nodesgen/gen.go +++ b/cmd/nodesgen/gen.go @@ -13,9 +13,8 @@ import ( ) var ( - flagNodeMap = flag.String("n", "cmd/nodesgen/nodemap.yml", "path to nodes map file") - flagAccountConfigFile = flag.String("a", "etc/nodes.yml", "path to account file") - flagEtcPath = flag.String("e", "etc", "path to etc directory") + flagNodeMap = flag.String("n", "cmd/nodesgen/nodemap.yml", "path to nodes map file") + flagEtcPath = flag.String("e", "etc", "path to etc directory") ) type NodesMap struct { diff --git a/service/net/dialer/dialer.go b/service/net/dialer/dialer.go index a1cb8a31..b90bf872 100644 --- a/service/net/dialer/dialer.go +++ b/service/net/dialer/dialer.go @@ -42,10 +42,10 @@ type dialer struct { func (d *dialer) Init(ctx context.Context, a *app.App) (err error) { d.transport = a.MustComponent(secure.CName).(secure.Service) - peerConf := a.MustComponent(config.CName).(*config.Config).PeerList.Remote + nodes := a.MustComponent(config.CName).(*config.Config).Nodes d.peerAddrs = map[string][]string{} - for _, rp := range peerConf { - d.peerAddrs[rp.PeerId] = []string{rp.Addr} + for _, n := range nodes { + d.peerAddrs[n.PeerId] = []string{n.Address} } return } diff --git a/service/sync/document/service.go b/service/sync/document/service.go index 8a4ae6c5..8aae859b 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -11,8 +11,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" "github.com/gogo/protobuf/proto" "go.uber.org/zap" ) @@ -100,10 +100,10 @@ func (s *service) UpdateDocument(ctx context.Context, id, text string) (err erro zap.String("header", header.String())). Debug("document updated in the database") - return s.messageService.SendMessage("", syncpb.WrapHeadUpdate(&syncpb.SyncHeadUpdate{ + return s.messageService.SendToSpace("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ Heads: heads, Changes: []*aclpb.RawChange{ch}, - TreeId: "", + TreeId: id, SnapshotPath: snapshotPath, TreeHeader: header, })) @@ -155,10 +155,10 @@ func (s *service) CreateDocument(ctx context.Context, text string) (id string, e return "", err } - err = s.messageService.SendMessage("", syncpb.WrapHeadUpdate(&syncpb.SyncHeadUpdate{ + err = s.messageService.SendToSpace("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ Heads: heads, Changes: []*aclpb.RawChange{ch}, - TreeId: "", + TreeId: id, SnapshotPath: snapshotPath, TreeHeader: header, })) diff --git a/service/sync/message/service.go b/service/sync/message/service.go index e3061657..c78b0e1c 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -4,9 +4,11 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb" - "github.com/cheggaaa/mb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "github.com/gogo/protobuf/proto" "go.uber.org/zap" "sync" ) @@ -16,35 +18,25 @@ var log = logger.NewNamed("messageservice") const CName = "MessageService" type service struct { - receiveBatcher *mb.MB - sendBatcher *mb.MB - senderChannels map[string]chan *syncpb.SyncContent + nodes []config.Node requestHandler requesthandler.RequestHandler + pool pool.Pool sync.RWMutex } -type message struct { - peerId string - content *syncpb.SyncContent -} - func New() app.Component { return &service{} } type Service interface { - RegisterMessageSender(peerId string) chan *syncpb.SyncContent - UnregisterMessageSender(peerId string) - - HandleMessage(peerId string, msg *syncpb.SyncContent) error - SendMessage(peerId string, msg *syncpb.SyncContent) error + SendMessage(peerId string, msg *syncproto.Sync) error + SendToSpace(spaceId string, msg *syncproto.Sync) error } func (s *service) Init(ctx context.Context, a *app.App) (err error) { - s.receiveBatcher = mb.New(0) - s.sendBatcher = mb.New(0) - s.senderChannels = make(map[string]chan *syncpb.SyncContent) s.requestHandler = a.MustComponent(requesthandler.CName).(requesthandler.RequestHandler) + s.nodes = a.MustComponent(config.CName).(*config.Config).Nodes + s.pool = a.MustComponent(pool.CName).(pool.Pool) return nil } @@ -53,8 +45,16 @@ func (s *service) Name() (name string) { } func (s *service) Run(ctx context.Context) (err error) { - //go s.runSender(ctx) - //go s.runReceiver(ctx) + // dial manually to all peers + for _, rp := range s.nodes { + if er := s.pool.DialAndAddPeer(ctx, rp.PeerId); er != nil { + log.Info("can't dial to peer", zap.Error(er)) + } else { + log.Info("connected with peer", zap.String("peerId", rp.PeerId)) + } + } + s.pool.AddHandler(syncproto.MessageType_MessageTypeSync, s.HandleMessage) + return nil } @@ -62,104 +62,74 @@ func (s *service) Close(ctx context.Context) (err error) { return nil } -func (s *service) RegisterMessageSender(peerId string) chan *syncpb.SyncContent { - s.Lock() - defer s.Unlock() - if ch, exists := s.senderChannels[peerId]; !exists { - return ch - } - ch := make(chan *syncpb.SyncContent) - s.senderChannels[peerId] = ch - return ch -} - -func (s *service) UnregisterMessageSender(peerId string) { - s.Lock() - defer s.Unlock() - if _, exists := s.senderChannels[peerId]; !exists { - return - } - close(s.senderChannels[peerId]) - delete(s.senderChannels, peerId) -} - -func (s *service) HandleMessage(peerId string, msg *syncpb.SyncContent) error { +func (s *service) HandleMessage(ctx context.Context, msg *pool.Message) (err error) { log.With( - zap.String("peerId", peerId), - zap.String("message", msgType(msg))). + zap.String("peerId", msg.Peer().Id())). Debug("handling message from peer") - return s.receiveBatcher.Add(&message{ - peerId: peerId, - content: msg, - }) + + var syncMsg *syncproto.Sync + err = proto.Unmarshal(msg.Data, syncMsg) + if err != nil { + return err + } + + return s.requestHandler.HandleSyncMessage(ctx, msg.Peer().Id(), syncMsg) } -func (s *service) SendMessage(peerId string, msg *syncpb.SyncContent) error { +func (s *service) SendMessage(peerId string, msg *syncproto.Sync) error { log.With( zap.String("peerId", peerId), zap.String("message", msgType(msg))). Debug("sending message to peer") - return s.sendBatcher.Add(&message{ - peerId: peerId, - content: msg, + + marshalled, err := proto.Marshal(msg) + if err != nil { + return err + } + + err = s.pool.SendAndWait(context.Background(), peerId, &syncproto.Message{ + Header: &syncproto.Header{Type: syncproto.MessageType_MessageTypeSync}, + Data: marshalled, }) + if err != nil { + log.With( + zap.String("peerId", peerId), + zap.String("message", msgType(msg)), + zap.Error(err)). + Error("failed to send message to peer") + } + return err } -func (s *service) runReceiver(ctx context.Context) { - for { - select { - case <-ctx.Done(): - return - default: - break - } - msgs := s.receiveBatcher.WaitMinMax(1, 100) - // TODO: this is bad to serve everything on a new goroutine, but very easy for prototyping :-) - for _, msg := range msgs { - typedMsg := msg.(*message) - go func(typedMsg *message) { - err := s.requestHandler.HandleFullSyncContent(ctx, typedMsg.peerId, typedMsg.content) - if err != nil { - log.Error("failed to handle content", zap.Error(err)) - } - }(typedMsg) +func (s *service) SendToSpace(spaceId string, msg *syncproto.Sync) error { + log.With( + zap.String("message", msgType(msg))). + Debug("sending message to all") + + marshalled, err := proto.Marshal(msg) + if err != nil { + return err + } + + // TODO: use Broadcast method here when it is ready + for _, n := range s.nodes { + err := s.pool.SendAndWait(context.Background(), n.PeerId, &syncproto.Message{ + Header: &syncproto.Header{Type: syncproto.MessageType_MessageTypeSync}, + Data: marshalled, + }) + if err != nil { + log.With( + zap.String("peerId", n.PeerId), + zap.String("message", msgType(msg)), + zap.Error(err)). + Error("failed to send message to peer") } } + + return nil } -func (s *service) runSender(ctx context.Context) { - for { - select { - case <-ctx.Done(): - return - default: - break - } - msgs := s.sendBatcher.WaitMinMax(1, 100) - s.RLock() - for _, msg := range msgs { - s.sendMessage(msg.(*message)) - } - s.RUnlock() - } -} - -func (s *service) sendMessage(typedMsg *message) { - // this should be done under lock - if typedMsg.content.GetMessage().GetHeadUpdate() != nil { - for _, ch := range s.senderChannels { - ch <- typedMsg.content - } - return - } - ch, exists := s.senderChannels[typedMsg.peerId] - if !exists { - return - } - ch <- typedMsg.content -} - -func msgType(content *syncpb.SyncContent) string { +func msgType(content *syncproto.Sync) string { msg := content.GetMessage() switch { case msg.GetFullSyncRequest() != nil: diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 35456cce..724be478 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -24,12 +24,12 @@ func New() app.Component { } type RequestHandler interface { - HandleFullSyncContent(ctx context.Context, senderId string, request *syncproto.Sync) (err error) + HandleSyncMessage(ctx context.Context, senderId string, request *syncproto.Sync) (err error) } type MessageSender interface { SendMessage(peerId string, msg *syncproto.Sync) error - SendSpace(spaceId string, msg *syncproto.Sync) error + SendToSpace(spaceId string, msg *syncproto.Sync) error } const CName = "SyncRequestHandler" @@ -53,7 +53,7 @@ func (r *requestHandler) Close(ctx context.Context) (err error) { return nil } -func (r *requestHandler) HandleFullSyncContent(ctx context.Context, senderId string, content *syncproto.Sync) error { +func (r *requestHandler) HandleSyncMessage(ctx context.Context, senderId string, content *syncproto.Sync) error { msg := content.GetMessage() switch { case msg.GetFullSyncRequest() != nil: @@ -113,7 +113,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, TreeId: update.TreeId, TreeHeader: update.TreeHeader, } - return r.messageService.SendSpace("", syncproto.WrapHeadUpdate(newUpdate)) + return r.messageService.SendToSpace("", syncproto.WrapHeadUpdate(newUpdate)) } func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId string, request *syncproto.SyncFullRequest) (err error) { @@ -156,7 +156,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str TreeId: request.TreeId, TreeHeader: request.TreeHeader, } - return r.messageService.SendSpace("", syncproto.WrapHeadUpdate(newUpdate)) + return r.messageService.SendToSpace("", syncproto.WrapHeadUpdate(newUpdate)) } func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, response *syncproto.SyncFullResponse) (err error) { @@ -192,7 +192,7 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st SnapshotPath: snapshotPath, TreeId: response.TreeId, } - return r.messageService.SendSpace("", syncproto.WrapHeadUpdate(newUpdate)) + return r.messageService.SendToSpace("", syncproto.WrapHeadUpdate(newUpdate)) } func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, tree acltree.ACLTree) (*syncproto.SyncFullRequest, error) { From d0ecf7483614f73085aade7095dc02a8b95738fd Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 5 Aug 2022 16:33:37 +0200 Subject: [PATCH 37/40] Change dialling logic --- cmd/node/node.go | 2 +- service/sync/message/service.go | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/cmd/node/node.go b/cmd/node/node.go index d65f7a10..269e4890 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -92,12 +92,12 @@ func main() { func Bootstrap(a *app.App) { a.Register(account.New()). + Register(node.New()). Register(secure.New()). Register(server.New()). Register(dialer.New()). Register(pool.NewPool()). //Register(&example.Example{}) - Register(node.New()). Register(document.New()). Register(message.New()). Register(requesthandler.New()). diff --git a/service/sync/message/service.go b/service/sync/message/service.go index c78b0e1c..4d5a8237 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -45,14 +45,6 @@ func (s *service) Name() (name string) { } func (s *service) Run(ctx context.Context) (err error) { - // dial manually to all peers - for _, rp := range s.nodes { - if er := s.pool.DialAndAddPeer(ctx, rp.PeerId); er != nil { - log.Info("can't dial to peer", zap.Error(er)) - } else { - log.Info("connected with peer", zap.String("peerId", rp.PeerId)) - } - } s.pool.AddHandler(syncproto.MessageType_MessageTypeSync, s.HandleMessage) return nil @@ -82,6 +74,11 @@ func (s *service) SendMessage(peerId string, msg *syncproto.Sync) error { zap.String("message", msgType(msg))). Debug("sending message to peer") + err := s.pool.DialAndAddPeer(context.Background(), peerId) + if err != nil { + return err + } + marshalled, err := proto.Marshal(msg) if err != nil { return err @@ -106,6 +103,15 @@ func (s *service) SendToSpace(spaceId string, msg *syncproto.Sync) error { zap.String("message", msgType(msg))). Debug("sending message to all") + // dial manually to all peers + for _, rp := range s.nodes { + if er := s.pool.DialAndAddPeer(context.Background(), rp.PeerId); er != nil { + log.Info("can't dial to peer", zap.Error(er)) + } else { + log.Info("connected with peer", zap.String("peerId", rp.PeerId)) + } + } + marshalled, err := proto.Marshal(msg) if err != nil { return err From 31517db9bf8c17ab1e6d2de183f006a5e5d4c024 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 5 Aug 2022 17:09:40 +0200 Subject: [PATCH 38/40] Add contexts and fix bugs --- cmd/nodesgen/nodemap.yml | 4 --- etc/config.yml | 22 +++++++-------- ...Dua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze.yml | 26 ------------------ ...K2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml | 22 +++++++++++++++ ...Y23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs.yml | 26 ------------------ ...nuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx.yml | 26 ------------------ ...zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml | 22 +++++++++++++++ service/api/service.go | 9 +++++-- service/net/pool/pool.go | 2 ++ service/sync/document/service.go | 4 +-- service/sync/message/service.go | 27 ++++++++++++------- service/sync/requesthandler/requesthandler.go | 14 +++++----- 12 files changed, 88 insertions(+), 116 deletions(-) delete mode 100755 etc/configs/12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze.yml create mode 100755 etc/configs/12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml delete mode 100755 etc/configs/12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs.yml delete mode 100755 etc/configs/12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx.yml create mode 100755 etc/configs/12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml diff --git a/cmd/nodesgen/nodemap.yml b/cmd/nodesgen/nodemap.yml index 4107f830..d7b776aa 100644 --- a/cmd/nodesgen/nodemap.yml +++ b/cmd/nodesgen/nodemap.yml @@ -7,7 +7,3 @@ nodes: - "127.0.0.1:4432" - "127.0.0.1:4433" apiPort: "8081" - - grpcAddresses: - - "127.0.0.1:4434" - - "127.0.0.1:4435" - apiPort: "8082" diff --git a/etc/config.yml b/etc/config.yml index f66b7fdd..79754d42 100644 --- a/etc/config.yml +++ b/etc/config.yml @@ -6,21 +6,17 @@ grpcServer: - 127.0.0.1:4431 tls: false account: - peerId: 12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs - signingKey: 3inYSp8q7WidZi7RkhLFNZPF9yMJXHpnyrTpTsE7cd2ggESfTAEpWiQNa8zCnNdzK9DpG6Mu5hDCZhfU6RMDL466H8om - encryptionKey: udNkNsbKtm7eu1Bqt6DUwLZka2Rq22vm33K5eezrMkGnXx8X13oQ8HBSHgkLmRZTC1737hgZ66s92QRNe1YC1v8JNiv6yXVuV3MujBkmrYYVbGB7DBz6REsGAMPmuqDiG5PubjVHP468MDJJYRTZN6VEJuSGZtEAyLBJe9iErRVFsMdNc6ZMbY5pxoYE6LHWbsfZejrnAXvgABTnYTN4ad6EaxRiEWHGACizr59uf3KYFb9hFwxkFMhenpTpxbkBwQp3V8MxV4eLbgsWQPMpfeGeinjmNRAnZfi6tnqSDLyy3RWM5y9W89rYKt3EdVRwcFWFHh8FgSjzhpqE77GEwjGU9ddKorUfW85jQGdd2xdFwQfLF2eTGEwSxX9Gz2fTTtkN4pNJC8MesKK2cRsLAZLb9rv5ebCMgQ3S86WjfbWRcEYLoKUWKjujiY1XT5GszTgSa2b68QpcDmqgUv7FiwcZwC5qaCsgoARZ2GGsPgW7mCBahxTJnor4dCLF9Aiz1YvFvwWzm8k9zUmY5pxPQFNSWfAAcodqEHJV6i9TSf5ERNLJCQiRTSStZZdoeqAf42sYCSdiaiVUc26Q7QcTxtxxpfCTqGc2Lgh6ofgwG1m2CfmhXTsBDwBFRc8q6TcGJ4fT4WuZXF9f4MhKHqgqppFKMWYyvtJyvypbJ735kU63UWWSMCo8BbVTRrtaq7bPHbgvHHWYso5o7PeqNuhD2YwTKd6wpbAeg8wpv3eEWB2sgotQ5JiW2itEyinLZHRpLvbtYGFWctsZisvBbCssiCsPqzG1DffZWNjt2nj1vztuapZLpz9azanCaXhFxLBBLVveEk4tvEknHtREwXtmTpQK5GqpmW9LTFqA5jj7fVtytYQFufe9Cp4HKNNodv1UCPQ1KTLwkwA6UEMwqamvE67GDDvjmE2XaMoq6ErEYX6FkQi2d9kbLJaFVGwYH3DVcbBGAJzSoeYceosuoQJBcKS19BhFqXWT1W3iKvMibadh8MYLim7ncxezuHFCyUPFnFn33kfzzTWTsFYbKDukCECRBKciptevx9zS6V2YiSgcYRWV7Rd8sNg8vAGUBQ6mLBtWNExn5gRkoBQDqN9BhfqpEbGo33JHb7GVLsN7um9VxKcTSkiDLPKTxijNevHeRWRbtbCvQ31WHaNLzihnsowVQMk8SV6CiqzqwUb4ETxiXCDHABGuCACcYVC2jgEoFuqSAwS6c2y5sfcjxWSe3hs9eLjyWmeHu75MbNcJN8EtBrLs4j2tWGtbq6BR7SYVcygUbscf75HKncC4YBkF1MWRHmos11ZKaCwLfjsTW6XUXdfhvpco6mxic8muiq5XA3G8x47stQ3eBoSXoehRAMd4FKNv9geDagAhjorfcMd7kCT5CEENMqCLpjtUsFXSGtjqpYg1aeaQsxdEszfw2LS5pvPQEnYmqMRxZsuYHbuAH4J7sQwvjn7ezWfpsJfwQT6EqDFJp4g6vcgfUeCYzim9DVDnJYWocL9Uzb9P3rvknDKZmAkFWgTVWq16GaX4xUsXVNLMkDm88q4vvxrCQyAerNzox27uF2yH1ca66pVu9GZkGHM1KJrNmyyYEm445wNgkgSx8ivhyC11SUKs3nTKNVrnc + peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 + signingKey: 3id6ddLcoNoe9rDgGM88ET8T6TnvHm5GFqFdN6kBzn7Q8d6VUGgjeT59CNWFiaofdeRnHBvX2A5ZacMXvfwaYEFuCbug + encryptionKey: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd apiServer: port: "8080" nodes: - - peerId: 12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs + - peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 address: 127.0.0.1:4430 - signingKey: 3inYSp8q7WidZi7RkhLFNZPF9yMJXHpnyrTpTsE7cd2ggESfTAEpWiQNa8zCnNdzK9DpG6Mu5hDCZhfU6RMDL466H8om - encryptionKey: udNkNsbKtm7eu1Bqt6DUwLZka2Rq22vm33K5eezrMkGnXx8X13oQ8HBSHgkLmRZTC1737hgZ66s92QRNe1YC1v8JNiv6yXVuV3MujBkmrYYVbGB7DBz6REsGAMPmuqDiG5PubjVHP468MDJJYRTZN6VEJuSGZtEAyLBJe9iErRVFsMdNc6ZMbY5pxoYE6LHWbsfZejrnAXvgABTnYTN4ad6EaxRiEWHGACizr59uf3KYFb9hFwxkFMhenpTpxbkBwQp3V8MxV4eLbgsWQPMpfeGeinjmNRAnZfi6tnqSDLyy3RWM5y9W89rYKt3EdVRwcFWFHh8FgSjzhpqE77GEwjGU9ddKorUfW85jQGdd2xdFwQfLF2eTGEwSxX9Gz2fTTtkN4pNJC8MesKK2cRsLAZLb9rv5ebCMgQ3S86WjfbWRcEYLoKUWKjujiY1XT5GszTgSa2b68QpcDmqgUv7FiwcZwC5qaCsgoARZ2GGsPgW7mCBahxTJnor4dCLF9Aiz1YvFvwWzm8k9zUmY5pxPQFNSWfAAcodqEHJV6i9TSf5ERNLJCQiRTSStZZdoeqAf42sYCSdiaiVUc26Q7QcTxtxxpfCTqGc2Lgh6ofgwG1m2CfmhXTsBDwBFRc8q6TcGJ4fT4WuZXF9f4MhKHqgqppFKMWYyvtJyvypbJ735kU63UWWSMCo8BbVTRrtaq7bPHbgvHHWYso5o7PeqNuhD2YwTKd6wpbAeg8wpv3eEWB2sgotQ5JiW2itEyinLZHRpLvbtYGFWctsZisvBbCssiCsPqzG1DffZWNjt2nj1vztuapZLpz9azanCaXhFxLBBLVveEk4tvEknHtREwXtmTpQK5GqpmW9LTFqA5jj7fVtytYQFufe9Cp4HKNNodv1UCPQ1KTLwkwA6UEMwqamvE67GDDvjmE2XaMoq6ErEYX6FkQi2d9kbLJaFVGwYH3DVcbBGAJzSoeYceosuoQJBcKS19BhFqXWT1W3iKvMibadh8MYLim7ncxezuHFCyUPFnFn33kfzzTWTsFYbKDukCECRBKciptevx9zS6V2YiSgcYRWV7Rd8sNg8vAGUBQ6mLBtWNExn5gRkoBQDqN9BhfqpEbGo33JHb7GVLsN7um9VxKcTSkiDLPKTxijNevHeRWRbtbCvQ31WHaNLzihnsowVQMk8SV6CiqzqwUb4ETxiXCDHABGuCACcYVC2jgEoFuqSAwS6c2y5sfcjxWSe3hs9eLjyWmeHu75MbNcJN8EtBrLs4j2tWGtbq6BR7SYVcygUbscf75HKncC4YBkF1MWRHmos11ZKaCwLfjsTW6XUXdfhvpco6mxic8muiq5XA3G8x47stQ3eBoSXoehRAMd4FKNv9geDagAhjorfcMd7kCT5CEENMqCLpjtUsFXSGtjqpYg1aeaQsxdEszfw2LS5pvPQEnYmqMRxZsuYHbuAH4J7sQwvjn7ezWfpsJfwQT6EqDFJp4g6vcgfUeCYzim9DVDnJYWocL9Uzb9P3rvknDKZmAkFWgTVWq16GaX4xUsXVNLMkDm88q4vvxrCQyAerNzox27uF2yH1ca66pVu9GZkGHM1KJrNmyyYEm445wNgkgSx8ivhyC11SUKs3nTKNVrnc - - peerId: 12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx + signingKey: 3id6ddLcoNoe9rDgGM88ET8T6TnvHm5GFqFdN6kBzn7Q8d6VUGgjeT59CNWFiaofdeRnHBvX2A5ZacMXvfwaYEFuCbug + encryptionKey: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd + - peerId: 12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw address: 127.0.0.1:4432 - signingKey: 3i7TZgCtctChP9rA13BDuK2GmdbRL6sgk51JjetKyFt3SEqXN8M4EwcREWVfPYmayBKYPHveLzY7NsggxvKapJFdYH8F - encryptionKey: JgG4CcCbae1qEpe7mL87XWScKZWBBqSZseakgKVJfHqTUt3CiLPMKPDZtzQWLfb2ouiTbff5YTBZbGxwKqWYMAW8prEVjbcXBtkCi2Y2XkZ8v1ugidF5MC3d1ifnh5Es5CafB8kToUegtAig8vhMCuXAzLQpbiQyFLf25KcyKfVvHUomafaHyKCbYu1bmyGRC7CGxUD6jnPg2MYZZiJiq9scNRaRxbiqCe9C2VcUTFdigV65eGmZPKGgfAThcyKCdQSe1hmoXtNw5MaqbB3eQvkuS4GySap3SaEZUmGsmuVumUvHappUpN8x3UQs1TNWfYxULVx3tUMHfQ98G9No4gwP42ENMgCuMVQW9M68s73WCGucvpPUZdvQFiSJkSoKDqi2F6zdrM2LZTp8qGciunKDFZvh14eAGDbPLw9dBLVmMQLKq68yz8Nzi9BYWjzLa4fDNkoYETB8rArNPECAjVVW6PYLzueVNmqvo7RdWZGHF2YCRXr1wLG7jg4WBX4Lm5jQZS8bkWacbpj49b4nxRnjLsGusdCwRCZPY9qFPim2WU4z2KEgRS87x97TiYAThLUJwGBv5pBKRLkrAAoFWwkDSfxcRt83FiZtJ1hLWkpj6fK56SuubQUjWzNfVPCTfNqcod54PAPVESTuAPjDsmM4YeMGgUpaK9Goqbu1FuuZ9P6mQPwGKdpGuVgjJv7uQJZw3fpC9H1vJ4fa2wBrGFkahyEFo2QDb8iG9oGarpFxewJVVs12cpKJeQzU5dLFBvQJmGnHASTnBwfNBieDT7ZeFmnGuN7sLaPJ5wgdKJpY6aAooztyWfJPKTbxzYjUQMVoyW3YbTD3qg8F9grqVT1VFAp88ta1u55eokqz7h82EJNQf7GptDHxPRg4euAJ3BDvmRUfAwYzU8TD1gyiUnnHGRuvH25xgJRqauNrDLUbha33wVAHeMzWJhpLjLz4DLmtLejpfwNr5PuEbczqFAaLspf8dFjkrvmC3RrwHngKuzTkYo46WSJggWs3CwWDpzMmrATh2LRYmdH7BtNUkvu7onRzms8jWHBsFNfbCitMpfAsM3XmgtFUGTMi4LzVK3f5G8HqwGqcVEnFJTZzdoBsfNMKyFapXPnUBUHQse8jZjSYQv3dJpVuTV6HQ5R8saBdKDGMpXFyYqZK85cikcK6Nkd7ZrnbUUN2i6f3ano7hnxTbeW7kGxatUWETTwAzwGjdMhpJjieLFBTomAqqfXopEr1FeWcFmQ6kYBL2fa6XYqhZJevG6LpNXeuLcbyTiADt5CMNwt6MTmEomqtzqE7BgvqYEibuEj5K22ufvvLmX7XbGiB7wZKRPGuTR1pPDgJbzU9HGmF5fWjTVGPeNMn7ZmbQVcys6xy79notYp6MoQhBCTWyuuEuc24REEfMCjPuhNgssJQWT3ZR3xskrcEdCUyGbvQT2eWVa6atYsu5Z2m7sGXXwfH7vhdiUkVZEmhNPusij7dsMa9io63D6itYuu8Ed5aZYoUkZCfKZ39KQ16rtYpa9mfcwG4fyQy11Zy9G7nxdNJohGYeq3xuerSdwTDNdK2PREJcAoNA7Nfcsxk7333B5gXNFZKcBLQk56C1PqApLerSfo3jVuojcNAxYB688K6 - - peerId: 12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze - address: 127.0.0.1:4434 - signingKey: 3iPPhpw3jndkSCvpZ4yf5eWYydZwbFAk7gdMkXZBgyh939AicHVakwkabDpxzhtrsgJEXrP5sKam9QL7weMyyoMrKNCH - encryptionKey: JgG4CcCbae1qEpe7mL5br9LinoxiiuQqGC7y6HBbvmQ9pcZM4F4q2oGDQA71ZumaTJ1RAiUDaxi1fBVnrvv4Tqm9fau3NyijggQ246UtHKemsPFBX9Qyv4oYZJ9X3WNNc9q3BkPX9C8WHdfda9fxW4wD1QYKzd5F1J7FdhxZh3MZUdc4GEfPLwew8dTfEJp7ipAvM7TY1r6URe4VHVmsdaEL3jsEUzEqL4MRSc69WdjdKZLyVzQVcjnLegFfoH2c6476MfnoPggeVGghPjDmoqoJ2kzHwjvDQKoGyC9m4wkicS4YZkVA6N2ezKBSumJkV1mY6hpBPuCtdYLDw2zsCqMq9AXFhtMxzSCtLLRnRVntErY3Wb8ty5vEnS8aY7B612okwdsMg2rYxP55ccK4zP7PoKTKTS4TWTqGiLW2GtptTLhQ7ynJudG9YArzwwjgqXaxExrMqFCSMCfQbVNvwv3SckfpwQjpJjCfRS73SQKPY8ghqrdKnuRHyUWpJbYb9y5doCWMCuLw6u6t2LqfcwknNkjoWNCG69tohSgRStbYfmA7AZvHzPGc3gKByZecVxdmvPmtbSLXRiB9FbqtuqEerGxpisL3FhDM6SVqxRm2E2SxwJTHVcyL2LNF5tE2V7mujSa5dwzZfbRA9p3SwFeRhd42z1r36iL92yugfa2SbHYYDhdKFCJLhMc8ogqd1b8oUBbwBktKg6p6MJeZdqS2vfsLQRnV8TyP72fKUjFtaQ4o7D6vQ9VnsBMQS9FF8PEuZ5yF3XQaMjJMpeGho3c4dNFEw4vCiUaVN2WzF7XR28dyGwLASMoVFuUoErgr7TUQm4yKJG8QaHePx7A7Ku3Ys6fvrDsBVJWz5taQB7cMBqXmrAg2DHSUwqr8XfhxXnv8cnZZzPTrtib86P7w3kUYLrJYaR6jur5jTFucFSxthKEMqzBPtS3wgn2hcj31ATSNR7FNDcZmteWex5vAzGkuDoCG4c7dUCGinT3akYvukR7WugdHAYySkhf6AhNGg4wrZ7y3YVRMwRkex3PumcwGGKoTvNMNMqz2kTCNjSsDr6xRBk8njCLwDMunvDZM7VThTMKQ4CvegCtX3kV11qk46WjouqFedYSmShmxB5dMMVKui3owicS3ioVXoSqCRAcov3LJ3zL5aQ19FBBvvezeN27PkcZjvXKQwNEpnMzJeLTLdz8guWrER9Vn7XB3zgvt6xzab8JbHJ62XEEGFC5EoU68D3Wn9oXH6EqfCNbUsfW6EScc7wcsRu7aLi4ddjYrDcd4pQgct3dpAzR9Z4ZHRgQi9k4DF8bg9LUjfjaJS53DGSiSSfGBNtkpdyLp8K8Y89BZRnw21yVcKwA8JD47By6s3vfJ8PdSTs4Lsfm7mEhERuVLyQC9wpPe6ysjzUTQjx7RyTaVVA9ENQfpc1XCdHufDFST1eeiRFLwKzEFCr2bATo5r5oQ6UtBdQv6eFaGv19ju4cikXTNq2vCGw6aMupdaESYeWL5Gs8ssCjb1K2iZfGwqidfTJejEiuoiD2S6shTRv6BFz3JrhU7XsZdLkU9rvDYJs6rWq4C4ix4VWDxNHktF7iBuCASnZjgMYs9Lipt5hZEow4FrWcvUtVQ8PXQT3SC + signingKey: 3iiLPj6wMUQpPwTBNZcUgkbXub1jumg4AEV9LfMyFHZVc84GLyAjVbVvH6EAGhcNrxRxL82aW4BimhDZCpLsRCqx5vwj + encryptionKey: JgG4CcCbae1qEpe7mKXzp7m5hNc56SSyZd9DwUaEStKJrq7RToAC2Vgd3i6hKRwa58zCWeN6Wjc3o6qrdKPEPRvcyEPysamajVo5mdQiUgWAmr97pGEsyjuRjQoC2GY2LvLiEQxEgwFgJxKGMHMiaWMtDfxCDUaDEm4bu5RdMhqRZekAWho6c3WoEeruSr14iX1TrocFNfBkBY7CjEw8kcywXCTNgtvhb2Qiwgj5AxEF4wyw4bzaNA9ctXb1hoHPFVMu6C51pkFY7jUD9zwyH3ukgnAewkGAcPNbKmaTAtMosKRVaAN97mAwXh2VRt1hWmRvVk7r76EjnVKhD4vbsKZc56RVcHTVWRVdhU7FGyPsiE5rSQAz1JQGYzxnZpX7EG77CyrmUGyfueVfRHhwY2oq8A4uQCRaQxSaJHYLowjXSxh8DQ2V6MTqyzti32C27utBYdHzLVCJSGkmdzGwrFcHqsq7nLDxmvJVErPvyReixEe8kFmqopJ3e6LLm8WdYw9K6JYBjXnEfwPzm7Von9sf3dcaGDUHYfttMyeke7fAXJkvPRje69hYVyzdQGAauuojzGkkvQWCSMK1KCMNMznRaPDCNvofrQhYrub24WhmwpKhorufdfW8Cb4T6reBDCtaWVsbuinjtL6F6Sui5aYHJFLJ6e4pPewr1P4EuZYRbMBZwN5KvDLhTGLBuBnaTqUUdF6bj2U22NoRYMogiHiftqKqiexKNDXX1Zg9RQEvxgjuVo6SBW42mVEA8agrLhruRqCmiduJxVrfqLNGeYXHXrcmMEgW7uosJbPXvTcfRvdFWS1ov7oSALvj6vhDQ28Yi9D2ETNdNsfVWAFQuwvPpW7CHQGXTitprVbqH8JYxNZuGygcLmr5efbB22Vzu4ntd1HoraQpG12qeDEUA7tXYUpoYyuSdWwKPjSAMtaQcCSfVrhKQHQuKJargrVrez8vjWuwLfvSucV7ZHe7gjqvYgULdE1ubRCRSd7DuLjEN2Vd6obzV2c3MRet7ZSf4Sp88WM5AuTyW7BjArBc4S3gUQ8rYaiZ8Tu7NCxkEzbFwWRaemZkwfvcsX3XxqjyF37tFSGkEqE5kuBvpZW72675LkDffj7kH1zA8yE6dVujJjWsNYVFJWndUtz5Vy2KCdZAbBgq19q4AtsxWPodU2N3yZXzFAFAzTrxS6V4P7Scpdau1avgRvHLcBQPunA37xaYMy8YMifJwtmRY25mnAQwZAk3eANk7tXwZd58SDnciLNvARJvwKzTQBXcshkwyy52SX8XmXDJsPnRLaHmiYBJ63Yzr5XpZuuAtxb9qrWG2NHCNxfomHokWacV1hjZPPd6ZxT1FuRozB6Qt2NLcyqY7bnTcQJb1jPUaTAGXXCR8WVmmmYo2fDQe8CdBmgyPvbzNTEJUyScBz4RdycB5PZap4SurJCWtHbuMyQbQUB6jJgURDstfXS5Akfe4oruNq9rnYcNtnsDJPtrhXHBqzDizmf1BDxR5FB2RCxzCgeAfg8WQ1Ug9PVAGTzob6ZqCrGXzWXEUniZnf1vjr7QhGKBYXEX9SWDoSMUpP4FreVDTnx15ijRZTV3p8xG5fE9e36TnugRVvTyq7XzmyPBjW2r66f1bior diff --git a/etc/configs/12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze.yml b/etc/configs/12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze.yml deleted file mode 100755 index a16fec73..00000000 --- a/etc/configs/12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze.yml +++ /dev/null @@ -1,26 +0,0 @@ -anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec -grpcServer: - listenAddrs: - - 127.0.0.1:4434 - - 127.0.0.1:4435 - tls: false -account: - peerId: 12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze - signingKey: 3iPPhpw3jndkSCvpZ4yf5eWYydZwbFAk7gdMkXZBgyh939AicHVakwkabDpxzhtrsgJEXrP5sKam9QL7weMyyoMrKNCH - encryptionKey: JgG4CcCbae1qEpe7mL5br9LinoxiiuQqGC7y6HBbvmQ9pcZM4F4q2oGDQA71ZumaTJ1RAiUDaxi1fBVnrvv4Tqm9fau3NyijggQ246UtHKemsPFBX9Qyv4oYZJ9X3WNNc9q3BkPX9C8WHdfda9fxW4wD1QYKzd5F1J7FdhxZh3MZUdc4GEfPLwew8dTfEJp7ipAvM7TY1r6URe4VHVmsdaEL3jsEUzEqL4MRSc69WdjdKZLyVzQVcjnLegFfoH2c6476MfnoPggeVGghPjDmoqoJ2kzHwjvDQKoGyC9m4wkicS4YZkVA6N2ezKBSumJkV1mY6hpBPuCtdYLDw2zsCqMq9AXFhtMxzSCtLLRnRVntErY3Wb8ty5vEnS8aY7B612okwdsMg2rYxP55ccK4zP7PoKTKTS4TWTqGiLW2GtptTLhQ7ynJudG9YArzwwjgqXaxExrMqFCSMCfQbVNvwv3SckfpwQjpJjCfRS73SQKPY8ghqrdKnuRHyUWpJbYb9y5doCWMCuLw6u6t2LqfcwknNkjoWNCG69tohSgRStbYfmA7AZvHzPGc3gKByZecVxdmvPmtbSLXRiB9FbqtuqEerGxpisL3FhDM6SVqxRm2E2SxwJTHVcyL2LNF5tE2V7mujSa5dwzZfbRA9p3SwFeRhd42z1r36iL92yugfa2SbHYYDhdKFCJLhMc8ogqd1b8oUBbwBktKg6p6MJeZdqS2vfsLQRnV8TyP72fKUjFtaQ4o7D6vQ9VnsBMQS9FF8PEuZ5yF3XQaMjJMpeGho3c4dNFEw4vCiUaVN2WzF7XR28dyGwLASMoVFuUoErgr7TUQm4yKJG8QaHePx7A7Ku3Ys6fvrDsBVJWz5taQB7cMBqXmrAg2DHSUwqr8XfhxXnv8cnZZzPTrtib86P7w3kUYLrJYaR6jur5jTFucFSxthKEMqzBPtS3wgn2hcj31ATSNR7FNDcZmteWex5vAzGkuDoCG4c7dUCGinT3akYvukR7WugdHAYySkhf6AhNGg4wrZ7y3YVRMwRkex3PumcwGGKoTvNMNMqz2kTCNjSsDr6xRBk8njCLwDMunvDZM7VThTMKQ4CvegCtX3kV11qk46WjouqFedYSmShmxB5dMMVKui3owicS3ioVXoSqCRAcov3LJ3zL5aQ19FBBvvezeN27PkcZjvXKQwNEpnMzJeLTLdz8guWrER9Vn7XB3zgvt6xzab8JbHJ62XEEGFC5EoU68D3Wn9oXH6EqfCNbUsfW6EScc7wcsRu7aLi4ddjYrDcd4pQgct3dpAzR9Z4ZHRgQi9k4DF8bg9LUjfjaJS53DGSiSSfGBNtkpdyLp8K8Y89BZRnw21yVcKwA8JD47By6s3vfJ8PdSTs4Lsfm7mEhERuVLyQC9wpPe6ysjzUTQjx7RyTaVVA9ENQfpc1XCdHufDFST1eeiRFLwKzEFCr2bATo5r5oQ6UtBdQv6eFaGv19ju4cikXTNq2vCGw6aMupdaESYeWL5Gs8ssCjb1K2iZfGwqidfTJejEiuoiD2S6shTRv6BFz3JrhU7XsZdLkU9rvDYJs6rWq4C4ix4VWDxNHktF7iBuCASnZjgMYs9Lipt5hZEow4FrWcvUtVQ8PXQT3SC -apiServer: - port: "8082" -nodes: - - peerId: 12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs - address: 127.0.0.1:4430 - signingKey: 3inYSp8q7WidZi7RkhLFNZPF9yMJXHpnyrTpTsE7cd2ggESfTAEpWiQNa8zCnNdzK9DpG6Mu5hDCZhfU6RMDL466H8om - encryptionKey: udNkNsbKtm7eu1Bqt6DUwLZka2Rq22vm33K5eezrMkGnXx8X13oQ8HBSHgkLmRZTC1737hgZ66s92QRNe1YC1v8JNiv6yXVuV3MujBkmrYYVbGB7DBz6REsGAMPmuqDiG5PubjVHP468MDJJYRTZN6VEJuSGZtEAyLBJe9iErRVFsMdNc6ZMbY5pxoYE6LHWbsfZejrnAXvgABTnYTN4ad6EaxRiEWHGACizr59uf3KYFb9hFwxkFMhenpTpxbkBwQp3V8MxV4eLbgsWQPMpfeGeinjmNRAnZfi6tnqSDLyy3RWM5y9W89rYKt3EdVRwcFWFHh8FgSjzhpqE77GEwjGU9ddKorUfW85jQGdd2xdFwQfLF2eTGEwSxX9Gz2fTTtkN4pNJC8MesKK2cRsLAZLb9rv5ebCMgQ3S86WjfbWRcEYLoKUWKjujiY1XT5GszTgSa2b68QpcDmqgUv7FiwcZwC5qaCsgoARZ2GGsPgW7mCBahxTJnor4dCLF9Aiz1YvFvwWzm8k9zUmY5pxPQFNSWfAAcodqEHJV6i9TSf5ERNLJCQiRTSStZZdoeqAf42sYCSdiaiVUc26Q7QcTxtxxpfCTqGc2Lgh6ofgwG1m2CfmhXTsBDwBFRc8q6TcGJ4fT4WuZXF9f4MhKHqgqppFKMWYyvtJyvypbJ735kU63UWWSMCo8BbVTRrtaq7bPHbgvHHWYso5o7PeqNuhD2YwTKd6wpbAeg8wpv3eEWB2sgotQ5JiW2itEyinLZHRpLvbtYGFWctsZisvBbCssiCsPqzG1DffZWNjt2nj1vztuapZLpz9azanCaXhFxLBBLVveEk4tvEknHtREwXtmTpQK5GqpmW9LTFqA5jj7fVtytYQFufe9Cp4HKNNodv1UCPQ1KTLwkwA6UEMwqamvE67GDDvjmE2XaMoq6ErEYX6FkQi2d9kbLJaFVGwYH3DVcbBGAJzSoeYceosuoQJBcKS19BhFqXWT1W3iKvMibadh8MYLim7ncxezuHFCyUPFnFn33kfzzTWTsFYbKDukCECRBKciptevx9zS6V2YiSgcYRWV7Rd8sNg8vAGUBQ6mLBtWNExn5gRkoBQDqN9BhfqpEbGo33JHb7GVLsN7um9VxKcTSkiDLPKTxijNevHeRWRbtbCvQ31WHaNLzihnsowVQMk8SV6CiqzqwUb4ETxiXCDHABGuCACcYVC2jgEoFuqSAwS6c2y5sfcjxWSe3hs9eLjyWmeHu75MbNcJN8EtBrLs4j2tWGtbq6BR7SYVcygUbscf75HKncC4YBkF1MWRHmos11ZKaCwLfjsTW6XUXdfhvpco6mxic8muiq5XA3G8x47stQ3eBoSXoehRAMd4FKNv9geDagAhjorfcMd7kCT5CEENMqCLpjtUsFXSGtjqpYg1aeaQsxdEszfw2LS5pvPQEnYmqMRxZsuYHbuAH4J7sQwvjn7ezWfpsJfwQT6EqDFJp4g6vcgfUeCYzim9DVDnJYWocL9Uzb9P3rvknDKZmAkFWgTVWq16GaX4xUsXVNLMkDm88q4vvxrCQyAerNzox27uF2yH1ca66pVu9GZkGHM1KJrNmyyYEm445wNgkgSx8ivhyC11SUKs3nTKNVrnc - - peerId: 12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx - address: 127.0.0.1:4432 - signingKey: 3i7TZgCtctChP9rA13BDuK2GmdbRL6sgk51JjetKyFt3SEqXN8M4EwcREWVfPYmayBKYPHveLzY7NsggxvKapJFdYH8F - encryptionKey: JgG4CcCbae1qEpe7mL87XWScKZWBBqSZseakgKVJfHqTUt3CiLPMKPDZtzQWLfb2ouiTbff5YTBZbGxwKqWYMAW8prEVjbcXBtkCi2Y2XkZ8v1ugidF5MC3d1ifnh5Es5CafB8kToUegtAig8vhMCuXAzLQpbiQyFLf25KcyKfVvHUomafaHyKCbYu1bmyGRC7CGxUD6jnPg2MYZZiJiq9scNRaRxbiqCe9C2VcUTFdigV65eGmZPKGgfAThcyKCdQSe1hmoXtNw5MaqbB3eQvkuS4GySap3SaEZUmGsmuVumUvHappUpN8x3UQs1TNWfYxULVx3tUMHfQ98G9No4gwP42ENMgCuMVQW9M68s73WCGucvpPUZdvQFiSJkSoKDqi2F6zdrM2LZTp8qGciunKDFZvh14eAGDbPLw9dBLVmMQLKq68yz8Nzi9BYWjzLa4fDNkoYETB8rArNPECAjVVW6PYLzueVNmqvo7RdWZGHF2YCRXr1wLG7jg4WBX4Lm5jQZS8bkWacbpj49b4nxRnjLsGusdCwRCZPY9qFPim2WU4z2KEgRS87x97TiYAThLUJwGBv5pBKRLkrAAoFWwkDSfxcRt83FiZtJ1hLWkpj6fK56SuubQUjWzNfVPCTfNqcod54PAPVESTuAPjDsmM4YeMGgUpaK9Goqbu1FuuZ9P6mQPwGKdpGuVgjJv7uQJZw3fpC9H1vJ4fa2wBrGFkahyEFo2QDb8iG9oGarpFxewJVVs12cpKJeQzU5dLFBvQJmGnHASTnBwfNBieDT7ZeFmnGuN7sLaPJ5wgdKJpY6aAooztyWfJPKTbxzYjUQMVoyW3YbTD3qg8F9grqVT1VFAp88ta1u55eokqz7h82EJNQf7GptDHxPRg4euAJ3BDvmRUfAwYzU8TD1gyiUnnHGRuvH25xgJRqauNrDLUbha33wVAHeMzWJhpLjLz4DLmtLejpfwNr5PuEbczqFAaLspf8dFjkrvmC3RrwHngKuzTkYo46WSJggWs3CwWDpzMmrATh2LRYmdH7BtNUkvu7onRzms8jWHBsFNfbCitMpfAsM3XmgtFUGTMi4LzVK3f5G8HqwGqcVEnFJTZzdoBsfNMKyFapXPnUBUHQse8jZjSYQv3dJpVuTV6HQ5R8saBdKDGMpXFyYqZK85cikcK6Nkd7ZrnbUUN2i6f3ano7hnxTbeW7kGxatUWETTwAzwGjdMhpJjieLFBTomAqqfXopEr1FeWcFmQ6kYBL2fa6XYqhZJevG6LpNXeuLcbyTiADt5CMNwt6MTmEomqtzqE7BgvqYEibuEj5K22ufvvLmX7XbGiB7wZKRPGuTR1pPDgJbzU9HGmF5fWjTVGPeNMn7ZmbQVcys6xy79notYp6MoQhBCTWyuuEuc24REEfMCjPuhNgssJQWT3ZR3xskrcEdCUyGbvQT2eWVa6atYsu5Z2m7sGXXwfH7vhdiUkVZEmhNPusij7dsMa9io63D6itYuu8Ed5aZYoUkZCfKZ39KQ16rtYpa9mfcwG4fyQy11Zy9G7nxdNJohGYeq3xuerSdwTDNdK2PREJcAoNA7Nfcsxk7333B5gXNFZKcBLQk56C1PqApLerSfo3jVuojcNAxYB688K6 - - peerId: 12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze - address: 127.0.0.1:4434 - signingKey: 3iPPhpw3jndkSCvpZ4yf5eWYydZwbFAk7gdMkXZBgyh939AicHVakwkabDpxzhtrsgJEXrP5sKam9QL7weMyyoMrKNCH - encryptionKey: JgG4CcCbae1qEpe7mL5br9LinoxiiuQqGC7y6HBbvmQ9pcZM4F4q2oGDQA71ZumaTJ1RAiUDaxi1fBVnrvv4Tqm9fau3NyijggQ246UtHKemsPFBX9Qyv4oYZJ9X3WNNc9q3BkPX9C8WHdfda9fxW4wD1QYKzd5F1J7FdhxZh3MZUdc4GEfPLwew8dTfEJp7ipAvM7TY1r6URe4VHVmsdaEL3jsEUzEqL4MRSc69WdjdKZLyVzQVcjnLegFfoH2c6476MfnoPggeVGghPjDmoqoJ2kzHwjvDQKoGyC9m4wkicS4YZkVA6N2ezKBSumJkV1mY6hpBPuCtdYLDw2zsCqMq9AXFhtMxzSCtLLRnRVntErY3Wb8ty5vEnS8aY7B612okwdsMg2rYxP55ccK4zP7PoKTKTS4TWTqGiLW2GtptTLhQ7ynJudG9YArzwwjgqXaxExrMqFCSMCfQbVNvwv3SckfpwQjpJjCfRS73SQKPY8ghqrdKnuRHyUWpJbYb9y5doCWMCuLw6u6t2LqfcwknNkjoWNCG69tohSgRStbYfmA7AZvHzPGc3gKByZecVxdmvPmtbSLXRiB9FbqtuqEerGxpisL3FhDM6SVqxRm2E2SxwJTHVcyL2LNF5tE2V7mujSa5dwzZfbRA9p3SwFeRhd42z1r36iL92yugfa2SbHYYDhdKFCJLhMc8ogqd1b8oUBbwBktKg6p6MJeZdqS2vfsLQRnV8TyP72fKUjFtaQ4o7D6vQ9VnsBMQS9FF8PEuZ5yF3XQaMjJMpeGho3c4dNFEw4vCiUaVN2WzF7XR28dyGwLASMoVFuUoErgr7TUQm4yKJG8QaHePx7A7Ku3Ys6fvrDsBVJWz5taQB7cMBqXmrAg2DHSUwqr8XfhxXnv8cnZZzPTrtib86P7w3kUYLrJYaR6jur5jTFucFSxthKEMqzBPtS3wgn2hcj31ATSNR7FNDcZmteWex5vAzGkuDoCG4c7dUCGinT3akYvukR7WugdHAYySkhf6AhNGg4wrZ7y3YVRMwRkex3PumcwGGKoTvNMNMqz2kTCNjSsDr6xRBk8njCLwDMunvDZM7VThTMKQ4CvegCtX3kV11qk46WjouqFedYSmShmxB5dMMVKui3owicS3ioVXoSqCRAcov3LJ3zL5aQ19FBBvvezeN27PkcZjvXKQwNEpnMzJeLTLdz8guWrER9Vn7XB3zgvt6xzab8JbHJ62XEEGFC5EoU68D3Wn9oXH6EqfCNbUsfW6EScc7wcsRu7aLi4ddjYrDcd4pQgct3dpAzR9Z4ZHRgQi9k4DF8bg9LUjfjaJS53DGSiSSfGBNtkpdyLp8K8Y89BZRnw21yVcKwA8JD47By6s3vfJ8PdSTs4Lsfm7mEhERuVLyQC9wpPe6ysjzUTQjx7RyTaVVA9ENQfpc1XCdHufDFST1eeiRFLwKzEFCr2bATo5r5oQ6UtBdQv6eFaGv19ju4cikXTNq2vCGw6aMupdaESYeWL5Gs8ssCjb1K2iZfGwqidfTJejEiuoiD2S6shTRv6BFz3JrhU7XsZdLkU9rvDYJs6rWq4C4ix4VWDxNHktF7iBuCASnZjgMYs9Lipt5hZEow4FrWcvUtVQ8PXQT3SC diff --git a/etc/configs/12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml b/etc/configs/12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml new file mode 100755 index 00000000..2e552e35 --- /dev/null +++ b/etc/configs/12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml @@ -0,0 +1,22 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4430 + - 127.0.0.1:4431 + tls: false +account: + peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 + signingKey: 3id6ddLcoNoe9rDgGM88ET8T6TnvHm5GFqFdN6kBzn7Q8d6VUGgjeT59CNWFiaofdeRnHBvX2A5ZacMXvfwaYEFuCbug + encryptionKey: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd +apiServer: + port: "8080" +nodes: + - peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 + address: 127.0.0.1:4430 + signingKey: 3id6ddLcoNoe9rDgGM88ET8T6TnvHm5GFqFdN6kBzn7Q8d6VUGgjeT59CNWFiaofdeRnHBvX2A5ZacMXvfwaYEFuCbug + encryptionKey: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd + - peerId: 12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw + address: 127.0.0.1:4432 + signingKey: 3iiLPj6wMUQpPwTBNZcUgkbXub1jumg4AEV9LfMyFHZVc84GLyAjVbVvH6EAGhcNrxRxL82aW4BimhDZCpLsRCqx5vwj + encryptionKey: JgG4CcCbae1qEpe7mKXzp7m5hNc56SSyZd9DwUaEStKJrq7RToAC2Vgd3i6hKRwa58zCWeN6Wjc3o6qrdKPEPRvcyEPysamajVo5mdQiUgWAmr97pGEsyjuRjQoC2GY2LvLiEQxEgwFgJxKGMHMiaWMtDfxCDUaDEm4bu5RdMhqRZekAWho6c3WoEeruSr14iX1TrocFNfBkBY7CjEw8kcywXCTNgtvhb2Qiwgj5AxEF4wyw4bzaNA9ctXb1hoHPFVMu6C51pkFY7jUD9zwyH3ukgnAewkGAcPNbKmaTAtMosKRVaAN97mAwXh2VRt1hWmRvVk7r76EjnVKhD4vbsKZc56RVcHTVWRVdhU7FGyPsiE5rSQAz1JQGYzxnZpX7EG77CyrmUGyfueVfRHhwY2oq8A4uQCRaQxSaJHYLowjXSxh8DQ2V6MTqyzti32C27utBYdHzLVCJSGkmdzGwrFcHqsq7nLDxmvJVErPvyReixEe8kFmqopJ3e6LLm8WdYw9K6JYBjXnEfwPzm7Von9sf3dcaGDUHYfttMyeke7fAXJkvPRje69hYVyzdQGAauuojzGkkvQWCSMK1KCMNMznRaPDCNvofrQhYrub24WhmwpKhorufdfW8Cb4T6reBDCtaWVsbuinjtL6F6Sui5aYHJFLJ6e4pPewr1P4EuZYRbMBZwN5KvDLhTGLBuBnaTqUUdF6bj2U22NoRYMogiHiftqKqiexKNDXX1Zg9RQEvxgjuVo6SBW42mVEA8agrLhruRqCmiduJxVrfqLNGeYXHXrcmMEgW7uosJbPXvTcfRvdFWS1ov7oSALvj6vhDQ28Yi9D2ETNdNsfVWAFQuwvPpW7CHQGXTitprVbqH8JYxNZuGygcLmr5efbB22Vzu4ntd1HoraQpG12qeDEUA7tXYUpoYyuSdWwKPjSAMtaQcCSfVrhKQHQuKJargrVrez8vjWuwLfvSucV7ZHe7gjqvYgULdE1ubRCRSd7DuLjEN2Vd6obzV2c3MRet7ZSf4Sp88WM5AuTyW7BjArBc4S3gUQ8rYaiZ8Tu7NCxkEzbFwWRaemZkwfvcsX3XxqjyF37tFSGkEqE5kuBvpZW72675LkDffj7kH1zA8yE6dVujJjWsNYVFJWndUtz5Vy2KCdZAbBgq19q4AtsxWPodU2N3yZXzFAFAzTrxS6V4P7Scpdau1avgRvHLcBQPunA37xaYMy8YMifJwtmRY25mnAQwZAk3eANk7tXwZd58SDnciLNvARJvwKzTQBXcshkwyy52SX8XmXDJsPnRLaHmiYBJ63Yzr5XpZuuAtxb9qrWG2NHCNxfomHokWacV1hjZPPd6ZxT1FuRozB6Qt2NLcyqY7bnTcQJb1jPUaTAGXXCR8WVmmmYo2fDQe8CdBmgyPvbzNTEJUyScBz4RdycB5PZap4SurJCWtHbuMyQbQUB6jJgURDstfXS5Akfe4oruNq9rnYcNtnsDJPtrhXHBqzDizmf1BDxR5FB2RCxzCgeAfg8WQ1Ug9PVAGTzob6ZqCrGXzWXEUniZnf1vjr7QhGKBYXEX9SWDoSMUpP4FreVDTnx15ijRZTV3p8xG5fE9e36TnugRVvTyq7XzmyPBjW2r66f1bior diff --git a/etc/configs/12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs.yml b/etc/configs/12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs.yml deleted file mode 100755 index 3cf26367..00000000 --- a/etc/configs/12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs.yml +++ /dev/null @@ -1,26 +0,0 @@ -anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec -grpcServer: - listenAddrs: - - 127.0.0.1:4430 - - 127.0.0.1:4431 - tls: false -account: - peerId: 12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs - signingKey: 3inYSp8q7WidZi7RkhLFNZPF9yMJXHpnyrTpTsE7cd2ggESfTAEpWiQNa8zCnNdzK9DpG6Mu5hDCZhfU6RMDL466H8om - encryptionKey: udNkNsbKtm7eu1Bqt6DUwLZka2Rq22vm33K5eezrMkGnXx8X13oQ8HBSHgkLmRZTC1737hgZ66s92QRNe1YC1v8JNiv6yXVuV3MujBkmrYYVbGB7DBz6REsGAMPmuqDiG5PubjVHP468MDJJYRTZN6VEJuSGZtEAyLBJe9iErRVFsMdNc6ZMbY5pxoYE6LHWbsfZejrnAXvgABTnYTN4ad6EaxRiEWHGACizr59uf3KYFb9hFwxkFMhenpTpxbkBwQp3V8MxV4eLbgsWQPMpfeGeinjmNRAnZfi6tnqSDLyy3RWM5y9W89rYKt3EdVRwcFWFHh8FgSjzhpqE77GEwjGU9ddKorUfW85jQGdd2xdFwQfLF2eTGEwSxX9Gz2fTTtkN4pNJC8MesKK2cRsLAZLb9rv5ebCMgQ3S86WjfbWRcEYLoKUWKjujiY1XT5GszTgSa2b68QpcDmqgUv7FiwcZwC5qaCsgoARZ2GGsPgW7mCBahxTJnor4dCLF9Aiz1YvFvwWzm8k9zUmY5pxPQFNSWfAAcodqEHJV6i9TSf5ERNLJCQiRTSStZZdoeqAf42sYCSdiaiVUc26Q7QcTxtxxpfCTqGc2Lgh6ofgwG1m2CfmhXTsBDwBFRc8q6TcGJ4fT4WuZXF9f4MhKHqgqppFKMWYyvtJyvypbJ735kU63UWWSMCo8BbVTRrtaq7bPHbgvHHWYso5o7PeqNuhD2YwTKd6wpbAeg8wpv3eEWB2sgotQ5JiW2itEyinLZHRpLvbtYGFWctsZisvBbCssiCsPqzG1DffZWNjt2nj1vztuapZLpz9azanCaXhFxLBBLVveEk4tvEknHtREwXtmTpQK5GqpmW9LTFqA5jj7fVtytYQFufe9Cp4HKNNodv1UCPQ1KTLwkwA6UEMwqamvE67GDDvjmE2XaMoq6ErEYX6FkQi2d9kbLJaFVGwYH3DVcbBGAJzSoeYceosuoQJBcKS19BhFqXWT1W3iKvMibadh8MYLim7ncxezuHFCyUPFnFn33kfzzTWTsFYbKDukCECRBKciptevx9zS6V2YiSgcYRWV7Rd8sNg8vAGUBQ6mLBtWNExn5gRkoBQDqN9BhfqpEbGo33JHb7GVLsN7um9VxKcTSkiDLPKTxijNevHeRWRbtbCvQ31WHaNLzihnsowVQMk8SV6CiqzqwUb4ETxiXCDHABGuCACcYVC2jgEoFuqSAwS6c2y5sfcjxWSe3hs9eLjyWmeHu75MbNcJN8EtBrLs4j2tWGtbq6BR7SYVcygUbscf75HKncC4YBkF1MWRHmos11ZKaCwLfjsTW6XUXdfhvpco6mxic8muiq5XA3G8x47stQ3eBoSXoehRAMd4FKNv9geDagAhjorfcMd7kCT5CEENMqCLpjtUsFXSGtjqpYg1aeaQsxdEszfw2LS5pvPQEnYmqMRxZsuYHbuAH4J7sQwvjn7ezWfpsJfwQT6EqDFJp4g6vcgfUeCYzim9DVDnJYWocL9Uzb9P3rvknDKZmAkFWgTVWq16GaX4xUsXVNLMkDm88q4vvxrCQyAerNzox27uF2yH1ca66pVu9GZkGHM1KJrNmyyYEm445wNgkgSx8ivhyC11SUKs3nTKNVrnc -apiServer: - port: "8080" -nodes: - - peerId: 12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs - address: 127.0.0.1:4430 - signingKey: 3inYSp8q7WidZi7RkhLFNZPF9yMJXHpnyrTpTsE7cd2ggESfTAEpWiQNa8zCnNdzK9DpG6Mu5hDCZhfU6RMDL466H8om - encryptionKey: udNkNsbKtm7eu1Bqt6DUwLZka2Rq22vm33K5eezrMkGnXx8X13oQ8HBSHgkLmRZTC1737hgZ66s92QRNe1YC1v8JNiv6yXVuV3MujBkmrYYVbGB7DBz6REsGAMPmuqDiG5PubjVHP468MDJJYRTZN6VEJuSGZtEAyLBJe9iErRVFsMdNc6ZMbY5pxoYE6LHWbsfZejrnAXvgABTnYTN4ad6EaxRiEWHGACizr59uf3KYFb9hFwxkFMhenpTpxbkBwQp3V8MxV4eLbgsWQPMpfeGeinjmNRAnZfi6tnqSDLyy3RWM5y9W89rYKt3EdVRwcFWFHh8FgSjzhpqE77GEwjGU9ddKorUfW85jQGdd2xdFwQfLF2eTGEwSxX9Gz2fTTtkN4pNJC8MesKK2cRsLAZLb9rv5ebCMgQ3S86WjfbWRcEYLoKUWKjujiY1XT5GszTgSa2b68QpcDmqgUv7FiwcZwC5qaCsgoARZ2GGsPgW7mCBahxTJnor4dCLF9Aiz1YvFvwWzm8k9zUmY5pxPQFNSWfAAcodqEHJV6i9TSf5ERNLJCQiRTSStZZdoeqAf42sYCSdiaiVUc26Q7QcTxtxxpfCTqGc2Lgh6ofgwG1m2CfmhXTsBDwBFRc8q6TcGJ4fT4WuZXF9f4MhKHqgqppFKMWYyvtJyvypbJ735kU63UWWSMCo8BbVTRrtaq7bPHbgvHHWYso5o7PeqNuhD2YwTKd6wpbAeg8wpv3eEWB2sgotQ5JiW2itEyinLZHRpLvbtYGFWctsZisvBbCssiCsPqzG1DffZWNjt2nj1vztuapZLpz9azanCaXhFxLBBLVveEk4tvEknHtREwXtmTpQK5GqpmW9LTFqA5jj7fVtytYQFufe9Cp4HKNNodv1UCPQ1KTLwkwA6UEMwqamvE67GDDvjmE2XaMoq6ErEYX6FkQi2d9kbLJaFVGwYH3DVcbBGAJzSoeYceosuoQJBcKS19BhFqXWT1W3iKvMibadh8MYLim7ncxezuHFCyUPFnFn33kfzzTWTsFYbKDukCECRBKciptevx9zS6V2YiSgcYRWV7Rd8sNg8vAGUBQ6mLBtWNExn5gRkoBQDqN9BhfqpEbGo33JHb7GVLsN7um9VxKcTSkiDLPKTxijNevHeRWRbtbCvQ31WHaNLzihnsowVQMk8SV6CiqzqwUb4ETxiXCDHABGuCACcYVC2jgEoFuqSAwS6c2y5sfcjxWSe3hs9eLjyWmeHu75MbNcJN8EtBrLs4j2tWGtbq6BR7SYVcygUbscf75HKncC4YBkF1MWRHmos11ZKaCwLfjsTW6XUXdfhvpco6mxic8muiq5XA3G8x47stQ3eBoSXoehRAMd4FKNv9geDagAhjorfcMd7kCT5CEENMqCLpjtUsFXSGtjqpYg1aeaQsxdEszfw2LS5pvPQEnYmqMRxZsuYHbuAH4J7sQwvjn7ezWfpsJfwQT6EqDFJp4g6vcgfUeCYzim9DVDnJYWocL9Uzb9P3rvknDKZmAkFWgTVWq16GaX4xUsXVNLMkDm88q4vvxrCQyAerNzox27uF2yH1ca66pVu9GZkGHM1KJrNmyyYEm445wNgkgSx8ivhyC11SUKs3nTKNVrnc - - peerId: 12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx - address: 127.0.0.1:4432 - signingKey: 3i7TZgCtctChP9rA13BDuK2GmdbRL6sgk51JjetKyFt3SEqXN8M4EwcREWVfPYmayBKYPHveLzY7NsggxvKapJFdYH8F - encryptionKey: JgG4CcCbae1qEpe7mL87XWScKZWBBqSZseakgKVJfHqTUt3CiLPMKPDZtzQWLfb2ouiTbff5YTBZbGxwKqWYMAW8prEVjbcXBtkCi2Y2XkZ8v1ugidF5MC3d1ifnh5Es5CafB8kToUegtAig8vhMCuXAzLQpbiQyFLf25KcyKfVvHUomafaHyKCbYu1bmyGRC7CGxUD6jnPg2MYZZiJiq9scNRaRxbiqCe9C2VcUTFdigV65eGmZPKGgfAThcyKCdQSe1hmoXtNw5MaqbB3eQvkuS4GySap3SaEZUmGsmuVumUvHappUpN8x3UQs1TNWfYxULVx3tUMHfQ98G9No4gwP42ENMgCuMVQW9M68s73WCGucvpPUZdvQFiSJkSoKDqi2F6zdrM2LZTp8qGciunKDFZvh14eAGDbPLw9dBLVmMQLKq68yz8Nzi9BYWjzLa4fDNkoYETB8rArNPECAjVVW6PYLzueVNmqvo7RdWZGHF2YCRXr1wLG7jg4WBX4Lm5jQZS8bkWacbpj49b4nxRnjLsGusdCwRCZPY9qFPim2WU4z2KEgRS87x97TiYAThLUJwGBv5pBKRLkrAAoFWwkDSfxcRt83FiZtJ1hLWkpj6fK56SuubQUjWzNfVPCTfNqcod54PAPVESTuAPjDsmM4YeMGgUpaK9Goqbu1FuuZ9P6mQPwGKdpGuVgjJv7uQJZw3fpC9H1vJ4fa2wBrGFkahyEFo2QDb8iG9oGarpFxewJVVs12cpKJeQzU5dLFBvQJmGnHASTnBwfNBieDT7ZeFmnGuN7sLaPJ5wgdKJpY6aAooztyWfJPKTbxzYjUQMVoyW3YbTD3qg8F9grqVT1VFAp88ta1u55eokqz7h82EJNQf7GptDHxPRg4euAJ3BDvmRUfAwYzU8TD1gyiUnnHGRuvH25xgJRqauNrDLUbha33wVAHeMzWJhpLjLz4DLmtLejpfwNr5PuEbczqFAaLspf8dFjkrvmC3RrwHngKuzTkYo46WSJggWs3CwWDpzMmrATh2LRYmdH7BtNUkvu7onRzms8jWHBsFNfbCitMpfAsM3XmgtFUGTMi4LzVK3f5G8HqwGqcVEnFJTZzdoBsfNMKyFapXPnUBUHQse8jZjSYQv3dJpVuTV6HQ5R8saBdKDGMpXFyYqZK85cikcK6Nkd7ZrnbUUN2i6f3ano7hnxTbeW7kGxatUWETTwAzwGjdMhpJjieLFBTomAqqfXopEr1FeWcFmQ6kYBL2fa6XYqhZJevG6LpNXeuLcbyTiADt5CMNwt6MTmEomqtzqE7BgvqYEibuEj5K22ufvvLmX7XbGiB7wZKRPGuTR1pPDgJbzU9HGmF5fWjTVGPeNMn7ZmbQVcys6xy79notYp6MoQhBCTWyuuEuc24REEfMCjPuhNgssJQWT3ZR3xskrcEdCUyGbvQT2eWVa6atYsu5Z2m7sGXXwfH7vhdiUkVZEmhNPusij7dsMa9io63D6itYuu8Ed5aZYoUkZCfKZ39KQ16rtYpa9mfcwG4fyQy11Zy9G7nxdNJohGYeq3xuerSdwTDNdK2PREJcAoNA7Nfcsxk7333B5gXNFZKcBLQk56C1PqApLerSfo3jVuojcNAxYB688K6 - - peerId: 12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze - address: 127.0.0.1:4434 - signingKey: 3iPPhpw3jndkSCvpZ4yf5eWYydZwbFAk7gdMkXZBgyh939AicHVakwkabDpxzhtrsgJEXrP5sKam9QL7weMyyoMrKNCH - encryptionKey: JgG4CcCbae1qEpe7mL5br9LinoxiiuQqGC7y6HBbvmQ9pcZM4F4q2oGDQA71ZumaTJ1RAiUDaxi1fBVnrvv4Tqm9fau3NyijggQ246UtHKemsPFBX9Qyv4oYZJ9X3WNNc9q3BkPX9C8WHdfda9fxW4wD1QYKzd5F1J7FdhxZh3MZUdc4GEfPLwew8dTfEJp7ipAvM7TY1r6URe4VHVmsdaEL3jsEUzEqL4MRSc69WdjdKZLyVzQVcjnLegFfoH2c6476MfnoPggeVGghPjDmoqoJ2kzHwjvDQKoGyC9m4wkicS4YZkVA6N2ezKBSumJkV1mY6hpBPuCtdYLDw2zsCqMq9AXFhtMxzSCtLLRnRVntErY3Wb8ty5vEnS8aY7B612okwdsMg2rYxP55ccK4zP7PoKTKTS4TWTqGiLW2GtptTLhQ7ynJudG9YArzwwjgqXaxExrMqFCSMCfQbVNvwv3SckfpwQjpJjCfRS73SQKPY8ghqrdKnuRHyUWpJbYb9y5doCWMCuLw6u6t2LqfcwknNkjoWNCG69tohSgRStbYfmA7AZvHzPGc3gKByZecVxdmvPmtbSLXRiB9FbqtuqEerGxpisL3FhDM6SVqxRm2E2SxwJTHVcyL2LNF5tE2V7mujSa5dwzZfbRA9p3SwFeRhd42z1r36iL92yugfa2SbHYYDhdKFCJLhMc8ogqd1b8oUBbwBktKg6p6MJeZdqS2vfsLQRnV8TyP72fKUjFtaQ4o7D6vQ9VnsBMQS9FF8PEuZ5yF3XQaMjJMpeGho3c4dNFEw4vCiUaVN2WzF7XR28dyGwLASMoVFuUoErgr7TUQm4yKJG8QaHePx7A7Ku3Ys6fvrDsBVJWz5taQB7cMBqXmrAg2DHSUwqr8XfhxXnv8cnZZzPTrtib86P7w3kUYLrJYaR6jur5jTFucFSxthKEMqzBPtS3wgn2hcj31ATSNR7FNDcZmteWex5vAzGkuDoCG4c7dUCGinT3akYvukR7WugdHAYySkhf6AhNGg4wrZ7y3YVRMwRkex3PumcwGGKoTvNMNMqz2kTCNjSsDr6xRBk8njCLwDMunvDZM7VThTMKQ4CvegCtX3kV11qk46WjouqFedYSmShmxB5dMMVKui3owicS3ioVXoSqCRAcov3LJ3zL5aQ19FBBvvezeN27PkcZjvXKQwNEpnMzJeLTLdz8guWrER9Vn7XB3zgvt6xzab8JbHJ62XEEGFC5EoU68D3Wn9oXH6EqfCNbUsfW6EScc7wcsRu7aLi4ddjYrDcd4pQgct3dpAzR9Z4ZHRgQi9k4DF8bg9LUjfjaJS53DGSiSSfGBNtkpdyLp8K8Y89BZRnw21yVcKwA8JD47By6s3vfJ8PdSTs4Lsfm7mEhERuVLyQC9wpPe6ysjzUTQjx7RyTaVVA9ENQfpc1XCdHufDFST1eeiRFLwKzEFCr2bATo5r5oQ6UtBdQv6eFaGv19ju4cikXTNq2vCGw6aMupdaESYeWL5Gs8ssCjb1K2iZfGwqidfTJejEiuoiD2S6shTRv6BFz3JrhU7XsZdLkU9rvDYJs6rWq4C4ix4VWDxNHktF7iBuCASnZjgMYs9Lipt5hZEow4FrWcvUtVQ8PXQT3SC diff --git a/etc/configs/12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx.yml b/etc/configs/12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx.yml deleted file mode 100755 index 6d09daa2..00000000 --- a/etc/configs/12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx.yml +++ /dev/null @@ -1,26 +0,0 @@ -anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec -grpcServer: - listenAddrs: - - 127.0.0.1:4432 - - 127.0.0.1:4433 - tls: false -account: - peerId: 12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx - signingKey: 3i7TZgCtctChP9rA13BDuK2GmdbRL6sgk51JjetKyFt3SEqXN8M4EwcREWVfPYmayBKYPHveLzY7NsggxvKapJFdYH8F - encryptionKey: JgG4CcCbae1qEpe7mL87XWScKZWBBqSZseakgKVJfHqTUt3CiLPMKPDZtzQWLfb2ouiTbff5YTBZbGxwKqWYMAW8prEVjbcXBtkCi2Y2XkZ8v1ugidF5MC3d1ifnh5Es5CafB8kToUegtAig8vhMCuXAzLQpbiQyFLf25KcyKfVvHUomafaHyKCbYu1bmyGRC7CGxUD6jnPg2MYZZiJiq9scNRaRxbiqCe9C2VcUTFdigV65eGmZPKGgfAThcyKCdQSe1hmoXtNw5MaqbB3eQvkuS4GySap3SaEZUmGsmuVumUvHappUpN8x3UQs1TNWfYxULVx3tUMHfQ98G9No4gwP42ENMgCuMVQW9M68s73WCGucvpPUZdvQFiSJkSoKDqi2F6zdrM2LZTp8qGciunKDFZvh14eAGDbPLw9dBLVmMQLKq68yz8Nzi9BYWjzLa4fDNkoYETB8rArNPECAjVVW6PYLzueVNmqvo7RdWZGHF2YCRXr1wLG7jg4WBX4Lm5jQZS8bkWacbpj49b4nxRnjLsGusdCwRCZPY9qFPim2WU4z2KEgRS87x97TiYAThLUJwGBv5pBKRLkrAAoFWwkDSfxcRt83FiZtJ1hLWkpj6fK56SuubQUjWzNfVPCTfNqcod54PAPVESTuAPjDsmM4YeMGgUpaK9Goqbu1FuuZ9P6mQPwGKdpGuVgjJv7uQJZw3fpC9H1vJ4fa2wBrGFkahyEFo2QDb8iG9oGarpFxewJVVs12cpKJeQzU5dLFBvQJmGnHASTnBwfNBieDT7ZeFmnGuN7sLaPJ5wgdKJpY6aAooztyWfJPKTbxzYjUQMVoyW3YbTD3qg8F9grqVT1VFAp88ta1u55eokqz7h82EJNQf7GptDHxPRg4euAJ3BDvmRUfAwYzU8TD1gyiUnnHGRuvH25xgJRqauNrDLUbha33wVAHeMzWJhpLjLz4DLmtLejpfwNr5PuEbczqFAaLspf8dFjkrvmC3RrwHngKuzTkYo46WSJggWs3CwWDpzMmrATh2LRYmdH7BtNUkvu7onRzms8jWHBsFNfbCitMpfAsM3XmgtFUGTMi4LzVK3f5G8HqwGqcVEnFJTZzdoBsfNMKyFapXPnUBUHQse8jZjSYQv3dJpVuTV6HQ5R8saBdKDGMpXFyYqZK85cikcK6Nkd7ZrnbUUN2i6f3ano7hnxTbeW7kGxatUWETTwAzwGjdMhpJjieLFBTomAqqfXopEr1FeWcFmQ6kYBL2fa6XYqhZJevG6LpNXeuLcbyTiADt5CMNwt6MTmEomqtzqE7BgvqYEibuEj5K22ufvvLmX7XbGiB7wZKRPGuTR1pPDgJbzU9HGmF5fWjTVGPeNMn7ZmbQVcys6xy79notYp6MoQhBCTWyuuEuc24REEfMCjPuhNgssJQWT3ZR3xskrcEdCUyGbvQT2eWVa6atYsu5Z2m7sGXXwfH7vhdiUkVZEmhNPusij7dsMa9io63D6itYuu8Ed5aZYoUkZCfKZ39KQ16rtYpa9mfcwG4fyQy11Zy9G7nxdNJohGYeq3xuerSdwTDNdK2PREJcAoNA7Nfcsxk7333B5gXNFZKcBLQk56C1PqApLerSfo3jVuojcNAxYB688K6 -apiServer: - port: "8081" -nodes: - - peerId: 12D3KooWPviVQZY23iXQU7eva7k4ojyScagRAqE8cXm6cTm6rhNs - address: 127.0.0.1:4430 - signingKey: 3inYSp8q7WidZi7RkhLFNZPF9yMJXHpnyrTpTsE7cd2ggESfTAEpWiQNa8zCnNdzK9DpG6Mu5hDCZhfU6RMDL466H8om - encryptionKey: udNkNsbKtm7eu1Bqt6DUwLZka2Rq22vm33K5eezrMkGnXx8X13oQ8HBSHgkLmRZTC1737hgZ66s92QRNe1YC1v8JNiv6yXVuV3MujBkmrYYVbGB7DBz6REsGAMPmuqDiG5PubjVHP468MDJJYRTZN6VEJuSGZtEAyLBJe9iErRVFsMdNc6ZMbY5pxoYE6LHWbsfZejrnAXvgABTnYTN4ad6EaxRiEWHGACizr59uf3KYFb9hFwxkFMhenpTpxbkBwQp3V8MxV4eLbgsWQPMpfeGeinjmNRAnZfi6tnqSDLyy3RWM5y9W89rYKt3EdVRwcFWFHh8FgSjzhpqE77GEwjGU9ddKorUfW85jQGdd2xdFwQfLF2eTGEwSxX9Gz2fTTtkN4pNJC8MesKK2cRsLAZLb9rv5ebCMgQ3S86WjfbWRcEYLoKUWKjujiY1XT5GszTgSa2b68QpcDmqgUv7FiwcZwC5qaCsgoARZ2GGsPgW7mCBahxTJnor4dCLF9Aiz1YvFvwWzm8k9zUmY5pxPQFNSWfAAcodqEHJV6i9TSf5ERNLJCQiRTSStZZdoeqAf42sYCSdiaiVUc26Q7QcTxtxxpfCTqGc2Lgh6ofgwG1m2CfmhXTsBDwBFRc8q6TcGJ4fT4WuZXF9f4MhKHqgqppFKMWYyvtJyvypbJ735kU63UWWSMCo8BbVTRrtaq7bPHbgvHHWYso5o7PeqNuhD2YwTKd6wpbAeg8wpv3eEWB2sgotQ5JiW2itEyinLZHRpLvbtYGFWctsZisvBbCssiCsPqzG1DffZWNjt2nj1vztuapZLpz9azanCaXhFxLBBLVveEk4tvEknHtREwXtmTpQK5GqpmW9LTFqA5jj7fVtytYQFufe9Cp4HKNNodv1UCPQ1KTLwkwA6UEMwqamvE67GDDvjmE2XaMoq6ErEYX6FkQi2d9kbLJaFVGwYH3DVcbBGAJzSoeYceosuoQJBcKS19BhFqXWT1W3iKvMibadh8MYLim7ncxezuHFCyUPFnFn33kfzzTWTsFYbKDukCECRBKciptevx9zS6V2YiSgcYRWV7Rd8sNg8vAGUBQ6mLBtWNExn5gRkoBQDqN9BhfqpEbGo33JHb7GVLsN7um9VxKcTSkiDLPKTxijNevHeRWRbtbCvQ31WHaNLzihnsowVQMk8SV6CiqzqwUb4ETxiXCDHABGuCACcYVC2jgEoFuqSAwS6c2y5sfcjxWSe3hs9eLjyWmeHu75MbNcJN8EtBrLs4j2tWGtbq6BR7SYVcygUbscf75HKncC4YBkF1MWRHmos11ZKaCwLfjsTW6XUXdfhvpco6mxic8muiq5XA3G8x47stQ3eBoSXoehRAMd4FKNv9geDagAhjorfcMd7kCT5CEENMqCLpjtUsFXSGtjqpYg1aeaQsxdEszfw2LS5pvPQEnYmqMRxZsuYHbuAH4J7sQwvjn7ezWfpsJfwQT6EqDFJp4g6vcgfUeCYzim9DVDnJYWocL9Uzb9P3rvknDKZmAkFWgTVWq16GaX4xUsXVNLMkDm88q4vvxrCQyAerNzox27uF2yH1ca66pVu9GZkGHM1KJrNmyyYEm445wNgkgSx8ivhyC11SUKs3nTKNVrnc - - peerId: 12D3KooWPzziVTnuypw4MC7m4mzdoh9CM5FXGrYiTW81pfjngmwx - address: 127.0.0.1:4432 - signingKey: 3i7TZgCtctChP9rA13BDuK2GmdbRL6sgk51JjetKyFt3SEqXN8M4EwcREWVfPYmayBKYPHveLzY7NsggxvKapJFdYH8F - encryptionKey: JgG4CcCbae1qEpe7mL87XWScKZWBBqSZseakgKVJfHqTUt3CiLPMKPDZtzQWLfb2ouiTbff5YTBZbGxwKqWYMAW8prEVjbcXBtkCi2Y2XkZ8v1ugidF5MC3d1ifnh5Es5CafB8kToUegtAig8vhMCuXAzLQpbiQyFLf25KcyKfVvHUomafaHyKCbYu1bmyGRC7CGxUD6jnPg2MYZZiJiq9scNRaRxbiqCe9C2VcUTFdigV65eGmZPKGgfAThcyKCdQSe1hmoXtNw5MaqbB3eQvkuS4GySap3SaEZUmGsmuVumUvHappUpN8x3UQs1TNWfYxULVx3tUMHfQ98G9No4gwP42ENMgCuMVQW9M68s73WCGucvpPUZdvQFiSJkSoKDqi2F6zdrM2LZTp8qGciunKDFZvh14eAGDbPLw9dBLVmMQLKq68yz8Nzi9BYWjzLa4fDNkoYETB8rArNPECAjVVW6PYLzueVNmqvo7RdWZGHF2YCRXr1wLG7jg4WBX4Lm5jQZS8bkWacbpj49b4nxRnjLsGusdCwRCZPY9qFPim2WU4z2KEgRS87x97TiYAThLUJwGBv5pBKRLkrAAoFWwkDSfxcRt83FiZtJ1hLWkpj6fK56SuubQUjWzNfVPCTfNqcod54PAPVESTuAPjDsmM4YeMGgUpaK9Goqbu1FuuZ9P6mQPwGKdpGuVgjJv7uQJZw3fpC9H1vJ4fa2wBrGFkahyEFo2QDb8iG9oGarpFxewJVVs12cpKJeQzU5dLFBvQJmGnHASTnBwfNBieDT7ZeFmnGuN7sLaPJ5wgdKJpY6aAooztyWfJPKTbxzYjUQMVoyW3YbTD3qg8F9grqVT1VFAp88ta1u55eokqz7h82EJNQf7GptDHxPRg4euAJ3BDvmRUfAwYzU8TD1gyiUnnHGRuvH25xgJRqauNrDLUbha33wVAHeMzWJhpLjLz4DLmtLejpfwNr5PuEbczqFAaLspf8dFjkrvmC3RrwHngKuzTkYo46WSJggWs3CwWDpzMmrATh2LRYmdH7BtNUkvu7onRzms8jWHBsFNfbCitMpfAsM3XmgtFUGTMi4LzVK3f5G8HqwGqcVEnFJTZzdoBsfNMKyFapXPnUBUHQse8jZjSYQv3dJpVuTV6HQ5R8saBdKDGMpXFyYqZK85cikcK6Nkd7ZrnbUUN2i6f3ano7hnxTbeW7kGxatUWETTwAzwGjdMhpJjieLFBTomAqqfXopEr1FeWcFmQ6kYBL2fa6XYqhZJevG6LpNXeuLcbyTiADt5CMNwt6MTmEomqtzqE7BgvqYEibuEj5K22ufvvLmX7XbGiB7wZKRPGuTR1pPDgJbzU9HGmF5fWjTVGPeNMn7ZmbQVcys6xy79notYp6MoQhBCTWyuuEuc24REEfMCjPuhNgssJQWT3ZR3xskrcEdCUyGbvQT2eWVa6atYsu5Z2m7sGXXwfH7vhdiUkVZEmhNPusij7dsMa9io63D6itYuu8Ed5aZYoUkZCfKZ39KQ16rtYpa9mfcwG4fyQy11Zy9G7nxdNJohGYeq3xuerSdwTDNdK2PREJcAoNA7Nfcsxk7333B5gXNFZKcBLQk56C1PqApLerSfo3jVuojcNAxYB688K6 - - peerId: 12D3KooWL9qu6sDua8hK8sEyeUVzpei8SVf3DA4W1gVAxDMwW9Ze - address: 127.0.0.1:4434 - signingKey: 3iPPhpw3jndkSCvpZ4yf5eWYydZwbFAk7gdMkXZBgyh939AicHVakwkabDpxzhtrsgJEXrP5sKam9QL7weMyyoMrKNCH - encryptionKey: JgG4CcCbae1qEpe7mL5br9LinoxiiuQqGC7y6HBbvmQ9pcZM4F4q2oGDQA71ZumaTJ1RAiUDaxi1fBVnrvv4Tqm9fau3NyijggQ246UtHKemsPFBX9Qyv4oYZJ9X3WNNc9q3BkPX9C8WHdfda9fxW4wD1QYKzd5F1J7FdhxZh3MZUdc4GEfPLwew8dTfEJp7ipAvM7TY1r6URe4VHVmsdaEL3jsEUzEqL4MRSc69WdjdKZLyVzQVcjnLegFfoH2c6476MfnoPggeVGghPjDmoqoJ2kzHwjvDQKoGyC9m4wkicS4YZkVA6N2ezKBSumJkV1mY6hpBPuCtdYLDw2zsCqMq9AXFhtMxzSCtLLRnRVntErY3Wb8ty5vEnS8aY7B612okwdsMg2rYxP55ccK4zP7PoKTKTS4TWTqGiLW2GtptTLhQ7ynJudG9YArzwwjgqXaxExrMqFCSMCfQbVNvwv3SckfpwQjpJjCfRS73SQKPY8ghqrdKnuRHyUWpJbYb9y5doCWMCuLw6u6t2LqfcwknNkjoWNCG69tohSgRStbYfmA7AZvHzPGc3gKByZecVxdmvPmtbSLXRiB9FbqtuqEerGxpisL3FhDM6SVqxRm2E2SxwJTHVcyL2LNF5tE2V7mujSa5dwzZfbRA9p3SwFeRhd42z1r36iL92yugfa2SbHYYDhdKFCJLhMc8ogqd1b8oUBbwBktKg6p6MJeZdqS2vfsLQRnV8TyP72fKUjFtaQ4o7D6vQ9VnsBMQS9FF8PEuZ5yF3XQaMjJMpeGho3c4dNFEw4vCiUaVN2WzF7XR28dyGwLASMoVFuUoErgr7TUQm4yKJG8QaHePx7A7Ku3Ys6fvrDsBVJWz5taQB7cMBqXmrAg2DHSUwqr8XfhxXnv8cnZZzPTrtib86P7w3kUYLrJYaR6jur5jTFucFSxthKEMqzBPtS3wgn2hcj31ATSNR7FNDcZmteWex5vAzGkuDoCG4c7dUCGinT3akYvukR7WugdHAYySkhf6AhNGg4wrZ7y3YVRMwRkex3PumcwGGKoTvNMNMqz2kTCNjSsDr6xRBk8njCLwDMunvDZM7VThTMKQ4CvegCtX3kV11qk46WjouqFedYSmShmxB5dMMVKui3owicS3ioVXoSqCRAcov3LJ3zL5aQ19FBBvvezeN27PkcZjvXKQwNEpnMzJeLTLdz8guWrER9Vn7XB3zgvt6xzab8JbHJ62XEEGFC5EoU68D3Wn9oXH6EqfCNbUsfW6EScc7wcsRu7aLi4ddjYrDcd4pQgct3dpAzR9Z4ZHRgQi9k4DF8bg9LUjfjaJS53DGSiSSfGBNtkpdyLp8K8Y89BZRnw21yVcKwA8JD47By6s3vfJ8PdSTs4Lsfm7mEhERuVLyQC9wpPe6ysjzUTQjx7RyTaVVA9ENQfpc1XCdHufDFST1eeiRFLwKzEFCr2bATo5r5oQ6UtBdQv6eFaGv19ju4cikXTNq2vCGw6aMupdaESYeWL5Gs8ssCjb1K2iZfGwqidfTJejEiuoiD2S6shTRv6BFz3JrhU7XsZdLkU9rvDYJs6rWq4C4ix4VWDxNHktF7iBuCASnZjgMYs9Lipt5hZEow4FrWcvUtVQ8PXQT3SC diff --git a/etc/configs/12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml b/etc/configs/12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml new file mode 100755 index 00000000..10a49044 --- /dev/null +++ b/etc/configs/12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml @@ -0,0 +1,22 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4432 + - 127.0.0.1:4433 + tls: false +account: + peerId: 12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw + signingKey: 3iiLPj6wMUQpPwTBNZcUgkbXub1jumg4AEV9LfMyFHZVc84GLyAjVbVvH6EAGhcNrxRxL82aW4BimhDZCpLsRCqx5vwj + encryptionKey: JgG4CcCbae1qEpe7mKXzp7m5hNc56SSyZd9DwUaEStKJrq7RToAC2Vgd3i6hKRwa58zCWeN6Wjc3o6qrdKPEPRvcyEPysamajVo5mdQiUgWAmr97pGEsyjuRjQoC2GY2LvLiEQxEgwFgJxKGMHMiaWMtDfxCDUaDEm4bu5RdMhqRZekAWho6c3WoEeruSr14iX1TrocFNfBkBY7CjEw8kcywXCTNgtvhb2Qiwgj5AxEF4wyw4bzaNA9ctXb1hoHPFVMu6C51pkFY7jUD9zwyH3ukgnAewkGAcPNbKmaTAtMosKRVaAN97mAwXh2VRt1hWmRvVk7r76EjnVKhD4vbsKZc56RVcHTVWRVdhU7FGyPsiE5rSQAz1JQGYzxnZpX7EG77CyrmUGyfueVfRHhwY2oq8A4uQCRaQxSaJHYLowjXSxh8DQ2V6MTqyzti32C27utBYdHzLVCJSGkmdzGwrFcHqsq7nLDxmvJVErPvyReixEe8kFmqopJ3e6LLm8WdYw9K6JYBjXnEfwPzm7Von9sf3dcaGDUHYfttMyeke7fAXJkvPRje69hYVyzdQGAauuojzGkkvQWCSMK1KCMNMznRaPDCNvofrQhYrub24WhmwpKhorufdfW8Cb4T6reBDCtaWVsbuinjtL6F6Sui5aYHJFLJ6e4pPewr1P4EuZYRbMBZwN5KvDLhTGLBuBnaTqUUdF6bj2U22NoRYMogiHiftqKqiexKNDXX1Zg9RQEvxgjuVo6SBW42mVEA8agrLhruRqCmiduJxVrfqLNGeYXHXrcmMEgW7uosJbPXvTcfRvdFWS1ov7oSALvj6vhDQ28Yi9D2ETNdNsfVWAFQuwvPpW7CHQGXTitprVbqH8JYxNZuGygcLmr5efbB22Vzu4ntd1HoraQpG12qeDEUA7tXYUpoYyuSdWwKPjSAMtaQcCSfVrhKQHQuKJargrVrez8vjWuwLfvSucV7ZHe7gjqvYgULdE1ubRCRSd7DuLjEN2Vd6obzV2c3MRet7ZSf4Sp88WM5AuTyW7BjArBc4S3gUQ8rYaiZ8Tu7NCxkEzbFwWRaemZkwfvcsX3XxqjyF37tFSGkEqE5kuBvpZW72675LkDffj7kH1zA8yE6dVujJjWsNYVFJWndUtz5Vy2KCdZAbBgq19q4AtsxWPodU2N3yZXzFAFAzTrxS6V4P7Scpdau1avgRvHLcBQPunA37xaYMy8YMifJwtmRY25mnAQwZAk3eANk7tXwZd58SDnciLNvARJvwKzTQBXcshkwyy52SX8XmXDJsPnRLaHmiYBJ63Yzr5XpZuuAtxb9qrWG2NHCNxfomHokWacV1hjZPPd6ZxT1FuRozB6Qt2NLcyqY7bnTcQJb1jPUaTAGXXCR8WVmmmYo2fDQe8CdBmgyPvbzNTEJUyScBz4RdycB5PZap4SurJCWtHbuMyQbQUB6jJgURDstfXS5Akfe4oruNq9rnYcNtnsDJPtrhXHBqzDizmf1BDxR5FB2RCxzCgeAfg8WQ1Ug9PVAGTzob6ZqCrGXzWXEUniZnf1vjr7QhGKBYXEX9SWDoSMUpP4FreVDTnx15ijRZTV3p8xG5fE9e36TnugRVvTyq7XzmyPBjW2r66f1bior +apiServer: + port: "8081" +nodes: + - peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 + address: 127.0.0.1:4430 + signingKey: 3id6ddLcoNoe9rDgGM88ET8T6TnvHm5GFqFdN6kBzn7Q8d6VUGgjeT59CNWFiaofdeRnHBvX2A5ZacMXvfwaYEFuCbug + encryptionKey: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd + - peerId: 12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw + address: 127.0.0.1:4432 + signingKey: 3iiLPj6wMUQpPwTBNZcUgkbXub1jumg4AEV9LfMyFHZVc84GLyAjVbVvH6EAGhcNrxRxL82aW4BimhDZCpLsRCqx5vwj + encryptionKey: JgG4CcCbae1qEpe7mKXzp7m5hNc56SSyZd9DwUaEStKJrq7RToAC2Vgd3i6hKRwa58zCWeN6Wjc3o6qrdKPEPRvcyEPysamajVo5mdQiUgWAmr97pGEsyjuRjQoC2GY2LvLiEQxEgwFgJxKGMHMiaWMtDfxCDUaDEm4bu5RdMhqRZekAWho6c3WoEeruSr14iX1TrocFNfBkBY7CjEw8kcywXCTNgtvhb2Qiwgj5AxEF4wyw4bzaNA9ctXb1hoHPFVMu6C51pkFY7jUD9zwyH3ukgnAewkGAcPNbKmaTAtMosKRVaAN97mAwXh2VRt1hWmRvVk7r76EjnVKhD4vbsKZc56RVcHTVWRVdhU7FGyPsiE5rSQAz1JQGYzxnZpX7EG77CyrmUGyfueVfRHhwY2oq8A4uQCRaQxSaJHYLowjXSxh8DQ2V6MTqyzti32C27utBYdHzLVCJSGkmdzGwrFcHqsq7nLDxmvJVErPvyReixEe8kFmqopJ3e6LLm8WdYw9K6JYBjXnEfwPzm7Von9sf3dcaGDUHYfttMyeke7fAXJkvPRje69hYVyzdQGAauuojzGkkvQWCSMK1KCMNMznRaPDCNvofrQhYrub24WhmwpKhorufdfW8Cb4T6reBDCtaWVsbuinjtL6F6Sui5aYHJFLJ6e4pPewr1P4EuZYRbMBZwN5KvDLhTGLBuBnaTqUUdF6bj2U22NoRYMogiHiftqKqiexKNDXX1Zg9RQEvxgjuVo6SBW42mVEA8agrLhruRqCmiduJxVrfqLNGeYXHXrcmMEgW7uosJbPXvTcfRvdFWS1ov7oSALvj6vhDQ28Yi9D2ETNdNsfVWAFQuwvPpW7CHQGXTitprVbqH8JYxNZuGygcLmr5efbB22Vzu4ntd1HoraQpG12qeDEUA7tXYUpoYyuSdWwKPjSAMtaQcCSfVrhKQHQuKJargrVrez8vjWuwLfvSucV7ZHe7gjqvYgULdE1ubRCRSd7DuLjEN2Vd6obzV2c3MRet7ZSf4Sp88WM5AuTyW7BjArBc4S3gUQ8rYaiZ8Tu7NCxkEzbFwWRaemZkwfvcsX3XxqjyF37tFSGkEqE5kuBvpZW72675LkDffj7kH1zA8yE6dVujJjWsNYVFJWndUtz5Vy2KCdZAbBgq19q4AtsxWPodU2N3yZXzFAFAzTrxS6V4P7Scpdau1avgRvHLcBQPunA37xaYMy8YMifJwtmRY25mnAQwZAk3eANk7tXwZd58SDnciLNvARJvwKzTQBXcshkwyy52SX8XmXDJsPnRLaHmiYBJ63Yzr5XpZuuAtxb9qrWG2NHCNxfomHokWacV1hjZPPd6ZxT1FuRozB6Qt2NLcyqY7bnTcQJb1jPUaTAGXXCR8WVmmmYo2fDQe8CdBmgyPvbzNTEJUyScBz4RdycB5PZap4SurJCWtHbuMyQbQUB6jJgURDstfXS5Akfe4oruNq9rnYcNtnsDJPtrhXHBqzDizmf1BDxR5FB2RCxzCgeAfg8WQ1Ug9PVAGTzob6ZqCrGXzWXEUniZnf1vjr7QhGKBYXEX9SWDoSMUpP4FreVDTnx15ijRZTV3p8xG5fE9e36TnugRVvTyq7XzmyPBjW2r66f1bior diff --git a/service/api/service.go b/service/api/service.go index c0fb9c9b..e489518e 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -12,6 +12,7 @@ import ( "go.uber.org/zap" "io" "net/http" + "time" ) const CName = "APIService" @@ -97,7 +98,9 @@ func (s *service) createDocument(w http.ResponseWriter, req *http.Request) { query = req.URL.Query() text = query.Get("text") ) - treeId, err := s.documentService.CreateDocument(context.Background(), fmt.Sprintf("created document with id: %s", text)) + timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*5) + treeId, err := s.documentService.CreateDocument(timeoutCtx, fmt.Sprintf("created document with id: %s", text)) + cancel() if err != nil { sendText(w, http.StatusInternalServerError, err.Error()) return @@ -111,7 +114,9 @@ func (s *service) appendDocument(w http.ResponseWriter, req *http.Request) { text = query.Get("text") treeId = query.Get("treeId") ) - err := s.documentService.UpdateDocument(context.Background(), treeId, text) + timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*5) + err := s.documentService.UpdateDocument(timeoutCtx, treeId, text) + cancel() if err != nil { sendText(w, http.StatusInternalServerError, err.Error()) return diff --git a/service/net/pool/pool.go b/service/net/pool/pool.go index 21779ca0..fe57e16c 100644 --- a/service/net/pool/pool.go +++ b/service/net/pool/pool.go @@ -209,6 +209,7 @@ func (p *pool) removePeer(peerId string) (err error) { } func (p *pool) handleMessage(peer peer.Peer, msg *syncproto.Message) { + log.With(zap.String("peerId", peer.Id())).Debug("received message from peer") replyId := msg.GetHeader().GetReplyId() if replyId != 0 { if !p.waiters.Send(replyId, Reply{ @@ -224,6 +225,7 @@ func (p *pool) handleMessage(peer peer.Peer, msg *syncproto.Message) { } handlers := p.handlers[msg.GetHeader().GetType()] if len(handlers) == 0 { + log.With(zap.String("peerId", peer.Id())).Debug("no handlers for such message") return } diff --git a/service/sync/document/service.go b/service/sync/document/service.go index 8aae859b..b1d39689 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -100,7 +100,7 @@ func (s *service) UpdateDocument(ctx context.Context, id, text string) (err erro zap.String("header", header.String())). Debug("document updated in the database") - return s.messageService.SendToSpace("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ + return s.messageService.SendToSpace(ctx, "", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ Heads: heads, Changes: []*aclpb.RawChange{ch}, TreeId: id, @@ -155,7 +155,7 @@ func (s *service) CreateDocument(ctx context.Context, text string) (id string, e return "", err } - err = s.messageService.SendToSpace("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ + err = s.messageService.SendToSpace(ctx, "", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ Heads: heads, Changes: []*aclpb.RawChange{ch}, TreeId: id, diff --git a/service/sync/message/service.go b/service/sync/message/service.go index 4d5a8237..2d9f7027 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -11,6 +11,7 @@ import ( "github.com/gogo/protobuf/proto" "go.uber.org/zap" "sync" + "time" ) var log = logger.NewNamed("messageservice") @@ -29,14 +30,15 @@ func New() app.Component { } type Service interface { - SendMessage(peerId string, msg *syncproto.Sync) error - SendToSpace(spaceId string, msg *syncproto.Sync) error + SendMessage(ctx context.Context, peerId string, msg *syncproto.Sync) error + SendToSpace(ctx context.Context, spaceId string, msg *syncproto.Sync) error } func (s *service) Init(ctx context.Context, a *app.App) (err error) { s.requestHandler = a.MustComponent(requesthandler.CName).(requesthandler.RequestHandler) s.nodes = a.MustComponent(config.CName).(*config.Config).Nodes s.pool = a.MustComponent(pool.CName).(pool.Pool) + s.pool.AddHandler(syncproto.MessageType_MessageTypeSync, s.HandleMessage) return nil } @@ -45,8 +47,6 @@ func (s *service) Name() (name string) { } func (s *service) Run(ctx context.Context) (err error) { - s.pool.AddHandler(syncproto.MessageType_MessageTypeSync, s.HandleMessage) - return nil } @@ -59,16 +59,23 @@ func (s *service) HandleMessage(ctx context.Context, msg *pool.Message) (err err zap.String("peerId", msg.Peer().Id())). Debug("handling message from peer") - var syncMsg *syncproto.Sync + err = msg.Ack() + if err != nil { + log.With(zap.String("peerId", msg.Peer().Id()), zap.Error(err)). + Error("could not ack message") + } + syncMsg := &syncproto.Sync{} err = proto.Unmarshal(msg.Data, syncMsg) if err != nil { return err } - return s.requestHandler.HandleSyncMessage(ctx, msg.Peer().Id(), syncMsg) + timeoutCtx, cancel := context.WithTimeout(ctx, time.Second*5) + defer cancel() + return s.requestHandler.HandleSyncMessage(timeoutCtx, msg.Peer().Id(), syncMsg) } -func (s *service) SendMessage(peerId string, msg *syncproto.Sync) error { +func (s *service) SendMessage(ctx context.Context, peerId string, msg *syncproto.Sync) error { log.With( zap.String("peerId", peerId), zap.String("message", msgType(msg))). @@ -84,7 +91,7 @@ func (s *service) SendMessage(peerId string, msg *syncproto.Sync) error { return err } - err = s.pool.SendAndWait(context.Background(), peerId, &syncproto.Message{ + err = s.pool.SendAndWait(ctx, peerId, &syncproto.Message{ Header: &syncproto.Header{Type: syncproto.MessageType_MessageTypeSync}, Data: marshalled, }) @@ -98,7 +105,7 @@ func (s *service) SendMessage(peerId string, msg *syncproto.Sync) error { return err } -func (s *service) SendToSpace(spaceId string, msg *syncproto.Sync) error { +func (s *service) SendToSpace(ctx context.Context, spaceId string, msg *syncproto.Sync) error { log.With( zap.String("message", msgType(msg))). Debug("sending message to all") @@ -119,7 +126,7 @@ func (s *service) SendToSpace(spaceId string, msg *syncproto.Sync) error { // TODO: use Broadcast method here when it is ready for _, n := range s.nodes { - err := s.pool.SendAndWait(context.Background(), n.PeerId, &syncproto.Message{ + err := s.pool.SendAndWait(ctx, n.PeerId, &syncproto.Message{ Header: &syncproto.Header{Type: syncproto.MessageType_MessageTypeSync}, Data: marshalled, }) diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 724be478..d26eb2db 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -28,8 +28,8 @@ type RequestHandler interface { } type MessageSender interface { - SendMessage(peerId string, msg *syncproto.Sync) error - SendToSpace(spaceId string, msg *syncproto.Sync) error + SendMessage(ctx context.Context, peerId string, msg *syncproto.Sync) error + SendToSpace(ctx context.Context, spaceId string, msg *syncproto.Sync) error } const CName = "SyncRequestHandler" @@ -99,7 +99,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, } // if we have incompatible heads, or we haven't seen the tree at all if fullRequest != nil { - return r.messageService.SendMessage(senderId, syncproto.WrapFullRequest(fullRequest)) + return r.messageService.SendMessage(ctx, senderId, syncproto.WrapFullRequest(fullRequest)) } // if error or nothing has changed if err != nil || len(result.Added) == 0 { @@ -113,7 +113,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, TreeId: update.TreeId, TreeHeader: update.TreeHeader, } - return r.messageService.SendToSpace("", syncproto.WrapHeadUpdate(newUpdate)) + return r.messageService.SendToSpace(ctx, "", syncproto.WrapHeadUpdate(newUpdate)) } func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId string, request *syncproto.SyncFullRequest) (err error) { @@ -142,7 +142,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str if err != nil { return err } - err = r.messageService.SendMessage(senderId, syncproto.WrapFullResponse(fullResponse)) + err = r.messageService.SendMessage(ctx, senderId, syncproto.WrapFullResponse(fullResponse)) // if error or nothing has changed if err != nil || len(result.Added) == 0 { return err @@ -156,7 +156,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str TreeId: request.TreeId, TreeHeader: request.TreeHeader, } - return r.messageService.SendToSpace("", syncproto.WrapHeadUpdate(newUpdate)) + return r.messageService.SendToSpace(ctx, "", syncproto.WrapHeadUpdate(newUpdate)) } func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, response *syncproto.SyncFullResponse) (err error) { @@ -192,7 +192,7 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st SnapshotPath: snapshotPath, TreeId: response.TreeId, } - return r.messageService.SendToSpace("", syncproto.WrapHeadUpdate(newUpdate)) + return r.messageService.SendToSpace(ctx, "", syncproto.WrapHeadUpdate(newUpdate)) } func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, tree acltree.ACLTree) (*syncproto.SyncFullRequest, error) { From fbaf96eb38af244db0ab269c6d4ca299b5baaef7 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 5 Aug 2022 18:14:35 +0200 Subject: [PATCH 39/40] Fix sync bugs and add logs --- pkg/acl/acltree/acltree.go | 15 ++++++++++++++- pkg/acl/acltree/treebuilder.go | 1 - service/node/service.go | 6 +++++- service/sync/document/service.go | 4 ++-- service/sync/message/service.go | 14 +++++++------- service/sync/requesthandler/requesthandler.go | 14 +++++++++++++- service/treecache/service.go | 2 +- 7 files changed, 42 insertions(+), 14 deletions(-) diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index 4697be1e..19c67822 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -7,6 +7,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" + "go.uber.org/zap" "sync" ) @@ -430,7 +431,7 @@ func (a *aclTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh // but no changes after some of the snapshots var ( - isNewDocument = len(theirPath) != 0 + isNewDocument = len(theirPath) == 0 ourPath = a.SnapshotPath() // by default returning everything we have commonSnapshot = ourPath[len(ourPath)-1] // TODO: root snapshot, probably it is better to have a specific method in treestorage @@ -462,16 +463,26 @@ func (a *aclTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh return ch, nil } // we presume that we have everything after the common snapshot, though this may not be the case in case of clients and only ACL tree changes + log.With( + zap.Strings("heads", a.fullTree.Heads()), + zap.String("breakpoint", commonSnapshot), + zap.String("id", a.id)). + Debug("getting all changes from common snapshot") _, err = a.treeBuilder.dfs(a.fullTree.Heads(), commonSnapshot, load) if err != nil { return nil, err } if isNewDocument { + // adding snapshot to raw changes _, err = load(commonSnapshot) if err != nil { return nil, err } } + log.With( + zap.Int("len(changes)", len(rawChanges)), + zap.String("id", a.id)). + Debug("sending all changes after common snapshot") return rawChanges, nil } @@ -483,6 +494,8 @@ func (a *aclTree) DebugDump() (string, error) { func (a *aclTree) commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) { var i int var j int + log.With(zap.Strings("our path", ourPath), zap.Strings("their path", theirPath)). + Debug("finding common snapshot for two paths") OuterLoop: // find starting point from the right for i = len(ourPath) - 1; i >= 0; i-- { diff --git a/pkg/acl/acltree/treebuilder.go b/pkg/acl/acltree/treebuilder.go index 261a49f9..9bb9a4b8 100644 --- a/pkg/acl/acltree/treebuilder.go +++ b/pkg/acl/acltree/treebuilder.go @@ -6,7 +6,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" ) diff --git a/service/node/service.go b/service/node/service.go index 788624b1..f3b82ba0 100644 --- a/service/node/service.go +++ b/service/node/service.go @@ -3,14 +3,18 @@ package node import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "go.uber.org/zap" ) const CName = "NodesService" +var log = logger.NewNamed("nodesservice") + type Node struct { Address string PeerId string @@ -46,7 +50,7 @@ func (s *service) Init(ctx context.Context, a *app.App) (err error) { if err != nil { return err } - + log.With(zap.String("node", node.PeerId)).Debug("adding peer to known nodes") filteredNodes = append(filteredNodes, node) } s.nodes = filteredNodes diff --git a/service/sync/document/service.go b/service/sync/document/service.go index b1d39689..7a22e590 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -117,8 +117,6 @@ func (s *service) CreateDocument(ctx context.Context, text string) (id string, e snapshotPath []string heads []string ) - log.With(zap.String("id", id), zap.String("text", text)). - Debug("creating document") err = s.treeCache.Create(ctx, func(builder acltree.ChangeBuilder) error { err := builder.UserAdd(acc.Identity, acc.EncKey.GetPublic(), aclpb.ACLChange_Admin) @@ -154,6 +152,8 @@ func (s *service) CreateDocument(ctx context.Context, text string) (id string, e if err != nil { return "", err } + log.With(zap.String("id", id), zap.String("text", text)). + Debug("creating document") err = s.messageService.SendToSpace(ctx, "", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ Heads: heads, diff --git a/service/sync/message/service.go b/service/sync/message/service.go index 2d9f7027..12c3a844 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -4,8 +4,8 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" "github.com/gogo/protobuf/proto" @@ -19,7 +19,7 @@ var log = logger.NewNamed("messageservice") const CName = "MessageService" type service struct { - nodes []config.Node + nodes []*node.Node requestHandler requesthandler.RequestHandler pool pool.Pool sync.RWMutex @@ -36,7 +36,7 @@ type Service interface { func (s *service) Init(ctx context.Context, a *app.App) (err error) { s.requestHandler = a.MustComponent(requesthandler.CName).(requesthandler.RequestHandler) - s.nodes = a.MustComponent(config.CName).(*config.Config).Nodes + s.nodes = a.MustComponent(node.CName).(node.Service).Nodes() s.pool = a.MustComponent(pool.CName).(pool.Pool) s.pool.AddHandler(syncproto.MessageType_MessageTypeSync, s.HandleMessage) return nil @@ -106,10 +106,6 @@ func (s *service) SendMessage(ctx context.Context, peerId string, msg *syncproto } func (s *service) SendToSpace(ctx context.Context, spaceId string, msg *syncproto.Sync) error { - log.With( - zap.String("message", msgType(msg))). - Debug("sending message to all") - // dial manually to all peers for _, rp := range s.nodes { if er := s.pool.DialAndAddPeer(context.Background(), rp.PeerId); er != nil { @@ -126,6 +122,10 @@ func (s *service) SendToSpace(ctx context.Context, spaceId string, msg *syncprot // TODO: use Broadcast method here when it is ready for _, n := range s.nodes { + log.With( + zap.String("peerId", n.PeerId), + zap.String("message", msgType(msg))). + Debug("sending message to peer") err := s.pool.SendAndWait(ctx, n.PeerId, &syncproto.Message{ Header: &syncproto.Header{Type: syncproto.MessageType_MessageTypeSync}, Data: marshalled, diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index d26eb2db..0c1bad55 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -3,6 +3,7 @@ package requesthandler import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" @@ -11,6 +12,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" + "go.uber.org/zap" ) type requestHandler struct { @@ -19,6 +21,8 @@ type requestHandler struct { messageService MessageSender } +var log = logger.NewNamed("requesthandler") + func New() app.Component { return &requestHandler{} } @@ -72,6 +76,8 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, snapshotPath []string result acltree.AddResult ) + log.With(zap.String("peerId", senderId), zap.String("treeId", update.TreeId)). + Debug("received head update message") err = r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes @@ -122,6 +128,8 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str snapshotPath []string result acltree.AddResult ) + log.With(zap.String("peerId", senderId), zap.String("treeId", request.TreeId)). + Debug("received full sync request message") err = r.treeCache.Do(ctx, request.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes @@ -164,6 +172,8 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st snapshotPath []string result acltree.AddResult ) + log.With(zap.String("peerId", senderId), zap.String("treeId", response.TreeId)). + Debug("received full sync response message") err = r.treeCache.Do(ctx, response.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes @@ -227,10 +237,12 @@ func (r *requestHandler) prepareFullSyncResponse( // filtering our changes, so we will not send the same changes back var final []*aclpb.RawChange for _, ch := range ourChanges { - if _, exists := theirMap[ch.Id]; exists { + if _, exists := theirMap[ch.Id]; !exists { final = append(final, ch) } } + log.With(zap.Int("len(changes)", len(final)), zap.String("id", treeId)). + Debug("sending changes for tree") return &syncproto.SyncFullResponse{ Heads: tree.Heads(), diff --git a/service/treecache/service.go b/service/treecache/service.go index 78985a68..14a011a9 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -69,7 +69,7 @@ func (s *service) Do(ctx context.Context, treeId string, f ACLTreeFunc) error { func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error { log. - With(zap.String("treeId", treeId)). + With(zap.String("treeId", treeId), zap.Int("len(changes)", len(changes))). Debug("adding tree with changes") _, err := s.treeProvider.CreateTreeStorage(treeId, header, changes) From 48627c0901f56055b69601d28201da3bfdd0ac8c Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 5 Aug 2022 21:05:47 +0200 Subject: [PATCH 40/40] Fix replyId update and add goroutine in handleMessage --- service/api/service.go | 4 +- service/net/pool/message.go | 2 + service/net/pool/pool.go | 42 +++-- service/sync/message/service.go | 45 ++--- service/sync/requesthandler/requesthandler.go | 2 +- service/treecache/service.go | 1 + syncproto/proto/sync.proto | 1 + syncproto/sync.pb.go | 162 ++++++++++++------ 8 files changed, 158 insertions(+), 101 deletions(-) diff --git a/service/api/service.go b/service/api/service.go index e489518e..8ab7eb26 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -98,7 +98,7 @@ func (s *service) createDocument(w http.ResponseWriter, req *http.Request) { query = req.URL.Query() text = query.Get("text") ) - timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*5) + timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30) treeId, err := s.documentService.CreateDocument(timeoutCtx, fmt.Sprintf("created document with id: %s", text)) cancel() if err != nil { @@ -114,7 +114,7 @@ func (s *service) appendDocument(w http.ResponseWriter, req *http.Request) { text = query.Get("text") treeId = query.Get("treeId") ) - timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*5) + timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30) err := s.documentService.UpdateDocument(timeoutCtx, treeId, text) cancel() if err != nil { diff --git a/service/net/pool/message.go b/service/net/pool/message.go index bc067a12..e6cb38fe 100644 --- a/service/net/pool/message.go +++ b/service/net/pool/message.go @@ -3,6 +3,7 @@ package pool import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "go.uber.org/zap" "gopkg.in/mgo.v2/bson" ) @@ -43,6 +44,7 @@ func (m *Message) Ack() (err error) { }, Data: data, } + log.With(zap.String("header", rep.Header.String())).Info("sending ack to peer") return m.peer.Send(rep) } diff --git a/service/net/pool/pool.go b/service/net/pool/pool.go index fe57e16c..f4aa266f 100644 --- a/service/net/pool/pool.go +++ b/service/net/pool/pool.go @@ -15,7 +15,10 @@ import ( "sync/atomic" ) -const CName = "sync/peerPool" +const ( + CName = "sync/peerPool" + maxSimultaneousOperationsPerStream = 10 +) var log = logger.NewNamed("peerPool") @@ -45,7 +48,7 @@ type Pool interface { type pool struct { peersById map[string]*peerEntry - waiters waiters + waiters *waiters handlers map[syncproto.MessageType][]Handler peersIdsByGroup map[string][]string @@ -60,7 +63,7 @@ func (p *pool) Init(ctx context.Context, a *app.App) (err error) { p.peersById = map[string]*peerEntry{} p.handlers = map[syncproto.MessageType][]Handler{} p.peersIdsByGroup = map[string][]string{} - p.waiters = waiters{waiters: map[uint64]*waiter{}} + p.waiters = &waiters{waiters: map[uint64]*waiter{}} p.dialer = a.MustComponent(dialer.CName).(dialer.Dialer) p.wg = &sync.WaitGroup{} return nil @@ -160,6 +163,7 @@ func (p *pool) SendAndWait(ctx context.Context, peerId string, msg *syncproto.Me repId := p.waiters.NewReplyId() msg.GetHeader().RequestId = repId ch := make(chan Reply, 1) + log.With(zap.Uint64("reply id", repId)).Debug("adding waiter for reply id") p.waiters.Add(repId, &waiter{ch: ch}) defer p.waiters.Remove(repId) if err = peer.peer.Send(msg); err != nil { @@ -172,24 +176,41 @@ func (p *pool) SendAndWait(ctx context.Context, peerId string, msg *syncproto.Me } return nil case <-ctx.Done(): + log.Debug("context error happened in send and wait") return ctx.Err() } } func (p *pool) Broadcast(ctx context.Context, groupId string, msg *syncproto.Message) (err error) { + //TODO implement me panic("implement me") } func (p *pool) readPeerLoop(peer peer.Peer) (err error) { defer p.wg.Done() + limiter := make(chan struct{}, maxSimultaneousOperationsPerStream) + for i := 0; i < maxSimultaneousOperationsPerStream; i++ { + limiter <- struct{}{} + } +Loop: for { msg, err := peer.Recv() if err != nil { log.Debug("peer receive error", zap.Error(err), zap.String("peerId", peer.Id())) break } - p.handleMessage(peer, msg) + select { + case <-limiter: + case <-peer.Context().Done(): + break Loop + } + go func() { + defer func() { + limiter <- struct{}{} + }() + p.handleMessage(peer, msg) + }() } if err = p.removePeer(peer.Id()); err != nil { log.Error("remove peer error", zap.String("peerId", peer.Id())) @@ -209,7 +230,8 @@ func (p *pool) removePeer(peerId string) (err error) { } func (p *pool) handleMessage(peer peer.Peer, msg *syncproto.Message) { - log.With(zap.String("peerId", peer.Id())).Debug("received message from peer") + log.With(zap.String("peerId", peer.Id()), zap.String("header", msg.GetHeader().String())). + Debug("received message from peer") replyId := msg.GetHeader().GetReplyId() if replyId != 0 { if !p.waiters.Send(replyId, Reply{ @@ -219,7 +241,7 @@ func (p *pool) handleMessage(peer peer.Peer, msg *syncproto.Message) { peer: peer, }, }) { - log.Debug("received reply with unknown (or expired) replyId", zap.Uint64("replyId", replyId)) + log.Debug("received reply with unknown (or expired) replyId", zap.Uint64("replyId", replyId), zap.String("header", msg.GetHeader().String())) } return } @@ -262,7 +284,7 @@ type waiters struct { mu sync.Mutex } -func (w waiters) Send(replyId uint64, r Reply) (ok bool) { +func (w *waiters) Send(replyId uint64, r Reply) (ok bool) { w.mu.Lock() wait := w.waiters[replyId] if wait == nil { @@ -282,13 +304,13 @@ func (w waiters) Send(replyId uint64, r Reply) (ok bool) { return true } -func (w waiters) Add(replyId uint64, wait *waiter) { +func (w *waiters) Add(replyId uint64, wait *waiter) { w.mu.Lock() w.waiters[replyId] = wait w.mu.Unlock() } -func (w waiters) Remove(id uint64) error { +func (w *waiters) Remove(id uint64) error { w.mu.Lock() defer w.mu.Unlock() if _, ok := w.waiters[id]; ok { @@ -298,7 +320,7 @@ func (w waiters) Remove(id uint64) error { return fmt.Errorf("waiter not found") } -func (w waiters) NewReplyId() uint64 { +func (w *waiters) NewReplyId() uint64 { res := atomic.AddUint64(&w.replySeq, 1) if res == 0 { return w.NewReplyId() diff --git a/service/sync/message/service.go b/service/sync/message/service.go index 12c3a844..44e7e68c 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -63,6 +63,9 @@ func (s *service) HandleMessage(ctx context.Context, msg *pool.Message) (err err if err != nil { log.With(zap.String("peerId", msg.Peer().Id()), zap.Error(err)). Error("could not ack message") + } else { + log.With(zap.String("peerId", msg.Peer().Id()), zap.Int("type", int(msg.Header.Type))). + Debug("ack returned") } syncMsg := &syncproto.Sync{} err = proto.Unmarshal(msg.Data, syncMsg) @@ -70,7 +73,7 @@ func (s *service) HandleMessage(ctx context.Context, msg *pool.Message) (err err return err } - timeoutCtx, cancel := context.WithTimeout(ctx, time.Second*5) + timeoutCtx, cancel := context.WithTimeout(ctx, time.Second*30) defer cancel() return s.requestHandler.HandleSyncMessage(timeoutCtx, msg.Peer().Id(), syncMsg) } @@ -95,50 +98,26 @@ func (s *service) SendMessage(ctx context.Context, peerId string, msg *syncproto Header: &syncproto.Header{Type: syncproto.MessageType_MessageTypeSync}, Data: marshalled, }) + if err != nil { log.With( zap.String("peerId", peerId), zap.String("message", msgType(msg)), zap.Error(err)). - Error("failed to send message to peer") + Debug("failed to send message to peer") + } else { + log.With( + zap.String("peerId", peerId), + zap.String("message", msgType(msg))). + Debug("message send to peer completed") } return err } func (s *service) SendToSpace(ctx context.Context, spaceId string, msg *syncproto.Sync) error { - // dial manually to all peers for _, rp := range s.nodes { - if er := s.pool.DialAndAddPeer(context.Background(), rp.PeerId); er != nil { - log.Info("can't dial to peer", zap.Error(er)) - } else { - log.Info("connected with peer", zap.String("peerId", rp.PeerId)) - } + s.SendMessage(ctx, rp.PeerId, msg) } - - marshalled, err := proto.Marshal(msg) - if err != nil { - return err - } - - // TODO: use Broadcast method here when it is ready - for _, n := range s.nodes { - log.With( - zap.String("peerId", n.PeerId), - zap.String("message", msgType(msg))). - Debug("sending message to peer") - err := s.pool.SendAndWait(ctx, n.PeerId, &syncproto.Message{ - Header: &syncproto.Header{Type: syncproto.MessageType_MessageTypeSync}, - Data: marshalled, - }) - if err != nil { - log.With( - zap.String("peerId", n.PeerId), - zap.String("message", msgType(msg)), - zap.Error(err)). - Error("failed to send message to peer") - } - } - return nil } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 0c1bad55..cce5ab0b 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -164,7 +164,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str TreeId: request.TreeId, TreeHeader: request.TreeHeader, } - return r.messageService.SendToSpace(ctx, "", syncproto.WrapHeadUpdate(newUpdate)) + return r.messageService.SendToSpace(ctx, "def", syncproto.WrapHeadUpdate(newUpdate)) } func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, response *syncproto.SyncFullResponse) (err error) { diff --git a/service/treecache/service.go b/service/treecache/service.go index 14a011a9..687300f0 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -15,6 +15,7 @@ import ( const CName = "treecache" +// TODO: add context type ACLTreeFunc = func(tree acltree.ACLTree) error type ChangeBuildFunc = func(builder acltree.ChangeBuilder) error diff --git a/syncproto/proto/sync.proto b/syncproto/proto/sync.proto index 1aa39e1a..284d6a34 100644 --- a/syncproto/proto/sync.proto +++ b/syncproto/proto/sync.proto @@ -15,6 +15,7 @@ message Header { uint64 requestId = 2; uint64 replyId = 3; MessageType type = 4; + string debugInfo = 5; } enum MessageType { diff --git a/syncproto/sync.pb.go b/syncproto/sync.pb.go index a002c37d..64ce8676 100644 --- a/syncproto/sync.pb.go +++ b/syncproto/sync.pb.go @@ -134,6 +134,7 @@ type Header struct { RequestId uint64 `protobuf:"varint,2,opt,name=requestId,proto3" json:"requestId,omitempty"` ReplyId uint64 `protobuf:"varint,3,opt,name=replyId,proto3" json:"replyId,omitempty"` Type MessageType `protobuf:"varint,4,opt,name=type,proto3,enum=anytype.MessageType" json:"type,omitempty"` + DebugInfo string `protobuf:"bytes,5,opt,name=debugInfo,proto3" json:"debugInfo,omitempty"` } func (m *Header) Reset() { *m = Header{} } @@ -197,6 +198,13 @@ func (m *Header) GetType() MessageType { return MessageType_MessageTypeSystem } +func (m *Header) GetDebugInfo() string { + if m != nil { + return m.DebugInfo + } + return "" +} + type System struct { Handshake *SystemHandshake `protobuf:"bytes,1,opt,name=handshake,proto3" json:"handshake,omitempty"` Ping *SystemPing `protobuf:"bytes,2,opt,name=ping,proto3" json:"ping,omitempty"` @@ -1020,61 +1028,62 @@ func init() { func init() { proto.RegisterFile("syncproto/proto/sync.proto", fileDescriptor_4b28dfdd48a89166) } var fileDescriptor_4b28dfdd48a89166 = []byte{ - // 851 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x41, 0x8f, 0xdb, 0x44, - 0x14, 0xb6, 0x13, 0x27, 0x6e, 0x5e, 0xa2, 0xac, 0x99, 0xb6, 0x60, 0xdc, 0x2a, 0x8a, 0xac, 0x02, - 0x51, 0xa9, 0xbc, 0x55, 0xa0, 0x42, 0xe2, 0xd6, 0x2e, 0xbb, 0x4a, 0x44, 0x49, 0xa2, 0x49, 0xb2, - 0x48, 0x5c, 0xaa, 0x59, 0x7b, 0x48, 0xa2, 0x78, 0xc7, 0xc6, 0xe3, 0x00, 0xb9, 0x73, 0xe2, 0xd4, - 0x1f, 0x83, 0x04, 0xe2, 0x17, 0x70, 0xec, 0x91, 0x23, 0xda, 0x95, 0xf8, 0x11, 0x70, 0xa9, 0x66, - 0xc6, 0x4e, 0xbc, 0x6e, 0xfa, 0x03, 0x7a, 0xd8, 0xcd, 0xbc, 0xef, 0x7d, 0xdf, 0x9b, 0xef, 0x8d, - 0x3d, 0x2f, 0x01, 0x87, 0x6f, 0x99, 0x1f, 0x27, 0x51, 0x1a, 0x1d, 0xab, 0xff, 0x22, 0xf6, 0xe4, - 0x12, 0x99, 0x84, 0x6d, 0xd3, 0x6d, 0x4c, 0x9d, 0xc7, 0xf1, 0x7a, 0x71, 0x4c, 0xfc, 0x50, 0xfc, - 0xf9, 0x4b, 0xc2, 0x16, 0x94, 0x8b, 0x65, 0x7c, 0xa1, 0x34, 0xbc, 0x80, 0x2b, 0xa9, 0xf3, 0x28, - 0x57, 0xa4, 0x09, 0xa5, 0x3c, 0x8d, 0x12, 0xb2, 0xa0, 0x72, 0xbd, 0xd7, 0x88, 0x48, 0xb1, 0xdd, - 0x33, 0x30, 0xbf, 0xa1, 0x9c, 0x93, 0x05, 0x45, 0x9f, 0x40, 0x7d, 0x49, 0x49, 0x40, 0x13, 0x5b, - 0xef, 0xea, 0xbd, 0x66, 0xff, 0xc8, 0xcb, 0x4c, 0x78, 0x03, 0x09, 0xe3, 0x2c, 0x8d, 0x10, 0x18, - 0x01, 0x49, 0x89, 0x5d, 0xe9, 0xea, 0xbd, 0x16, 0x96, 0x6b, 0xf7, 0x17, 0x1d, 0xea, 0x8a, 0x86, - 0x6c, 0x30, 0xd3, 0x84, 0xf8, 0x74, 0x18, 0xc8, 0x42, 0x2d, 0x9c, 0x87, 0xe8, 0x3e, 0x34, 0x12, - 0xfa, 0xc3, 0x86, 0xf2, 0x74, 0x18, 0x48, 0xb5, 0x81, 0xf7, 0x80, 0xd0, 0x25, 0x34, 0x0e, 0xb7, - 0xc3, 0xc0, 0xae, 0xca, 0x5c, 0x1e, 0xa2, 0x1e, 0x18, 0xc2, 0x87, 0x6d, 0x74, 0xf5, 0x5e, 0xbb, - 0x7f, 0x67, 0xe7, 0x2b, 0x73, 0x3e, 0xdb, 0xc6, 0x14, 0x4b, 0x86, 0xfb, 0x5b, 0x15, 0xea, 0xd3, - 0x2d, 0x4f, 0xe9, 0x25, 0xfa, 0x02, 0x1a, 0x4b, 0xc2, 0x02, 0xbe, 0x24, 0x6b, 0x9a, 0x75, 0xf4, - 0xe1, 0x4e, 0xa9, 0x38, 0xde, 0x20, 0x27, 0xe0, 0x3d, 0x57, 0xec, 0x16, 0xaf, 0xd8, 0x42, 0x1a, - 0x6c, 0x16, 0x76, 0xcb, 0x34, 0x93, 0x15, 0x5b, 0x60, 0xc9, 0x40, 0x1f, 0x41, 0x95, 0xf8, 0x6b, - 0xe9, 0xb6, 0xd9, 0xbf, 0x5d, 0x26, 0x3e, 0xf5, 0xd7, 0x58, 0xe4, 0x9d, 0x27, 0xd0, 0x18, 0x14, - 0xaa, 0x1f, 0xc9, 0x93, 0xf7, 0xa3, 0xf0, 0x9c, 0x26, 0x7c, 0x15, 0x31, 0x69, 0xae, 0x81, 0xcb, - 0xb0, 0xe3, 0x82, 0x21, 0xf6, 0x42, 0x0e, 0xdc, 0xda, 0xb0, 0xd5, 0xcf, 0xb3, 0xd5, 0xa5, 0xea, - 0xc3, 0xc0, 0xbb, 0xd8, 0xe9, 0x43, 0xf5, 0xa9, 0xbf, 0x46, 0x9f, 0x42, 0x8d, 0x26, 0x49, 0x94, - 0x64, 0x9e, 0xef, 0x96, 0xad, 0x9c, 0x8a, 0x24, 0x56, 0x1c, 0xe7, 0xa5, 0x0e, 0x35, 0x09, 0x20, - 0x0f, 0x0c, 0x3f, 0x0a, 0x54, 0xd5, 0x76, 0xdf, 0x39, 0xa8, 0xf2, 0x4e, 0xa2, 0x80, 0x62, 0xc9, - 0x43, 0x5d, 0x68, 0x06, 0x94, 0xfb, 0xc9, 0x2a, 0x4e, 0x85, 0xef, 0x8a, 0xf4, 0x5d, 0x84, 0xdc, - 0x27, 0x60, 0x08, 0x3e, 0x6a, 0x82, 0x39, 0x1f, 0x7d, 0x3d, 0x1a, 0x7f, 0x3b, 0xb2, 0x34, 0xd4, - 0x85, 0xfb, 0xf3, 0xd1, 0x74, 0x3e, 0x99, 0x8c, 0xf1, 0xec, 0xf4, 0xab, 0x17, 0x13, 0x3c, 0x9e, - 0x8d, 0x4f, 0xc6, 0xcf, 0x5f, 0x9c, 0x9f, 0xe2, 0xe9, 0x70, 0x3c, 0xb2, 0xc0, 0xfd, 0xb5, 0x02, - 0xad, 0xe9, 0xe6, 0x62, 0x57, 0x07, 0x3d, 0x87, 0x36, 0x57, 0xf1, 0x05, 0x9d, 0xc6, 0xc4, 0xcf, - 0x9f, 0xe0, 0x83, 0xbd, 0xc7, 0x02, 0x3d, 0x0f, 0x32, 0x2e, 0x2e, 0x69, 0x11, 0x06, 0x6b, 0xc3, - 0x4a, 0xf5, 0xd4, 0x49, 0x7d, 0x7c, 0xb8, 0xde, 0xbc, 0xc4, 0xc6, 0x6f, 0xe8, 0x9d, 0x87, 0xd0, - 0xbe, 0xb9, 0xab, 0x78, 0x7f, 0x79, 0xbc, 0x7f, 0xef, 0x1b, 0x38, 0x0f, 0x9d, 0x47, 0x60, 0x95, - 0x2b, 0xbe, 0x9d, 0xed, 0xfe, 0x57, 0x07, 0x63, 0xba, 0x65, 0xfe, 0xdb, 0x29, 0xe8, 0x73, 0x30, - 0x2f, 0xd5, 0xbb, 0x9f, 0xf5, 0x51, 0x7c, 0x76, 0xcc, 0xf7, 0x4e, 0x22, 0x96, 0x52, 0x96, 0x9e, - 0x93, 0x70, 0x43, 0x71, 0x4e, 0x75, 0xfe, 0xd5, 0xa1, 0x55, 0xcc, 0xa0, 0x2f, 0x01, 0xc4, 0x95, - 0x9e, 0xc7, 0x01, 0x49, 0xf3, 0x13, 0xb6, 0x6f, 0x56, 0x1a, 0xec, 0xf2, 0x03, 0x0d, 0x17, 0xd8, - 0xe8, 0x0c, 0x8e, 0xbe, 0xdf, 0x84, 0xa1, 0x20, 0x61, 0x75, 0x85, 0x0f, 0x5b, 0x39, 0xdb, 0x84, - 0xa1, 0x97, 0x31, 0x06, 0x1a, 0x2e, 0x8b, 0xd0, 0x10, 0xac, 0x3d, 0xc4, 0xe3, 0x88, 0x71, 0x9a, - 0x5d, 0xa8, 0x7b, 0x07, 0x0b, 0x29, 0xca, 0x40, 0xc3, 0x6f, 0xc8, 0x9e, 0x99, 0x50, 0xfb, 0x51, - 0xf4, 0xe5, 0xfc, 0xa9, 0x03, 0xec, 0x8d, 0xa3, 0x3b, 0x50, 0x13, 0xc6, 0xb9, 0xad, 0x77, 0xab, - 0xbd, 0x06, 0x56, 0x01, 0xea, 0x81, 0x99, 0x0d, 0x4e, 0xbb, 0xd2, 0xad, 0xf6, 0x9a, 0xfd, 0xb6, - 0x47, 0xfc, 0xd0, 0xc3, 0xe4, 0xa7, 0x13, 0x09, 0xe3, 0x3c, 0x8d, 0xde, 0x87, 0xba, 0x98, 0x98, - 0xd9, 0x5c, 0x6a, 0xe0, 0x2c, 0x42, 0x2e, 0xb4, 0x38, 0x23, 0x31, 0x5f, 0x46, 0xe9, 0x84, 0xa4, - 0x4b, 0xdb, 0x90, 0xe5, 0x6f, 0x60, 0xe8, 0x31, 0x80, 0x60, 0xab, 0xd1, 0x68, 0xd7, 0x64, 0x63, - 0x96, 0x27, 0x07, 0xf0, 0x6c, 0x87, 0xe3, 0x02, 0xc7, 0xf9, 0xbf, 0x02, 0x86, 0xe8, 0xd5, 0xf9, - 0x5d, 0x07, 0x33, 0x3f, 0xa5, 0x77, 0xab, 0x85, 0x3f, 0x74, 0xb8, 0x95, 0x3f, 0x95, 0x77, 0xcb, - 0xfa, 0xc3, 0x73, 0x68, 0x16, 0xbe, 0x55, 0xd0, 0x5d, 0x78, 0xaf, 0x10, 0xaa, 0xb9, 0x68, 0x69, - 0xe8, 0x1e, 0x7c, 0x50, 0x84, 0x0b, 0xa3, 0xc3, 0xd2, 0xd1, 0x6d, 0x38, 0xba, 0xa1, 0x61, 0xbe, - 0x55, 0x79, 0xf6, 0xe0, 0xaf, 0xab, 0x8e, 0xfe, 0xea, 0xaa, 0xa3, 0xff, 0x73, 0xd5, 0xd1, 0x5f, - 0x5e, 0x77, 0xb4, 0x57, 0xd7, 0x1d, 0xed, 0xef, 0xeb, 0x8e, 0xf6, 0x1d, 0x1c, 0xef, 0x7e, 0x07, - 0x5c, 0xd4, 0xe5, 0xc7, 0x67, 0xaf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x41, 0xe9, 0x79, 0xe5, 0x1b, - 0x08, 0x00, 0x00, + // 868 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0xd1, 0x8e, 0xda, 0x46, + 0x14, 0x65, 0xc0, 0x40, 0xb8, 0x20, 0xd6, 0x9d, 0x24, 0xad, 0xeb, 0x44, 0x08, 0xa1, 0xb4, 0x45, + 0x69, 0xe4, 0x8d, 0x68, 0xa3, 0x4a, 0x7d, 0x4b, 0xb6, 0xbb, 0x02, 0x35, 0x05, 0x34, 0xc0, 0x56, + 0xea, 0x4b, 0x34, 0xd8, 0x13, 0x40, 0x78, 0xc7, 0xae, 0xc7, 0xb4, 0xe5, 0x17, 0xfa, 0x94, 0x6f, + 0xe8, 0x37, 0x54, 0x6a, 0xd5, 0x2f, 0xe8, 0x63, 0x1e, 0xfb, 0x58, 0xed, 0x4a, 0xfd, 0x88, 0xf6, + 0xa5, 0x9a, 0x19, 0x1b, 0x7b, 0x9d, 0xcd, 0x07, 0xe4, 0x01, 0x98, 0x7b, 0xee, 0x39, 0xd7, 0xe7, + 0xce, 0x30, 0x17, 0xc0, 0x16, 0x7b, 0xee, 0x86, 0x51, 0x10, 0x07, 0xc7, 0xfa, 0x5d, 0xc6, 0x8e, + 0x5a, 0xe2, 0x3a, 0xe5, 0xfb, 0x78, 0x1f, 0x32, 0xfb, 0x71, 0xb8, 0x5d, 0x1d, 0x53, 0xd7, 0x97, + 0x2f, 0x77, 0x4d, 0xf9, 0x8a, 0x09, 0xb9, 0x0c, 0x97, 0x5a, 0x23, 0x72, 0xb8, 0x96, 0xda, 0x8f, + 0x52, 0x45, 0x1c, 0x31, 0x26, 0xe2, 0x20, 0xa2, 0x2b, 0xa6, 0xd6, 0x99, 0x46, 0x46, 0x9a, 0xdd, + 0x3b, 0x83, 0xfa, 0x37, 0x4c, 0x08, 0xba, 0x62, 0xf8, 0x13, 0xa8, 0xad, 0x19, 0xf5, 0x58, 0x64, + 0xa1, 0x2e, 0xea, 0x37, 0x07, 0x47, 0x4e, 0x62, 0xc2, 0x19, 0x2a, 0x98, 0x24, 0x69, 0x8c, 0xc1, + 0xf0, 0x68, 0x4c, 0xad, 0x72, 0x17, 0xf5, 0x5b, 0x44, 0xad, 0x7b, 0xbf, 0x20, 0xa8, 0x69, 0x1a, + 0xb6, 0xa0, 0x1e, 0x47, 0xd4, 0x65, 0x23, 0x4f, 0x15, 0x6a, 0x91, 0x34, 0xc4, 0xf7, 0xa1, 0x11, + 0xb1, 0xef, 0x77, 0x4c, 0xc4, 0x23, 0x4f, 0xa9, 0x0d, 0x92, 0x01, 0x52, 0x17, 0xb1, 0xd0, 0xdf, + 0x8f, 0x3c, 0xab, 0xa2, 0x72, 0x69, 0x88, 0xfb, 0x60, 0x48, 0x1f, 0x96, 0xd1, 0x45, 0xfd, 0xf6, + 0xe0, 0xce, 0xc1, 0x57, 0xe2, 0x7c, 0xbe, 0x0f, 0x19, 0x51, 0x0c, 0xf9, 0x04, 0x8f, 0x2d, 0x77, + 0xab, 0x11, 0x7f, 0x19, 0x58, 0xd5, 0x2e, 0xea, 0x37, 0x48, 0x06, 0xf4, 0x7e, 0xad, 0x40, 0x6d, + 0xb6, 0x17, 0x31, 0xbb, 0xc0, 0x5f, 0x40, 0x63, 0x4d, 0xb9, 0x27, 0xd6, 0x74, 0xcb, 0x92, 0x7e, + 0x3f, 0x3c, 0xd4, 0xd5, 0x1c, 0x67, 0x98, 0x12, 0x48, 0xc6, 0x95, 0x5e, 0xc2, 0x0d, 0x5f, 0x29, + 0xfb, 0xcd, 0x9c, 0x97, 0x44, 0x33, 0xdd, 0xf0, 0x15, 0x51, 0x0c, 0xfc, 0x11, 0x54, 0xa8, 0xbb, + 0x55, 0xbd, 0x34, 0x07, 0xb7, 0x8b, 0xc4, 0xa7, 0xee, 0x96, 0xc8, 0xbc, 0xfd, 0x04, 0x1a, 0xc3, + 0x5c, 0xf5, 0x23, 0x75, 0x2e, 0x6e, 0xe0, 0x9f, 0xb3, 0x48, 0x6c, 0x02, 0xae, 0xcc, 0x35, 0x48, + 0x11, 0xb6, 0x7b, 0x60, 0xc8, 0x67, 0x61, 0x1b, 0x6e, 0xed, 0xf8, 0xe6, 0xa7, 0xf9, 0xe6, 0x42, + 0xf7, 0x61, 0x90, 0x43, 0x6c, 0x0f, 0xa0, 0xf2, 0xd4, 0xdd, 0xe2, 0x4f, 0xa1, 0xca, 0xa2, 0x28, + 0x88, 0x12, 0xcf, 0x77, 0x8b, 0x56, 0x4e, 0x65, 0x92, 0x68, 0x8e, 0xfd, 0x0a, 0x41, 0x55, 0x01, + 0xd8, 0x01, 0xc3, 0x0d, 0x3c, 0x5d, 0xb5, 0x3d, 0xb0, 0x6f, 0x54, 0x39, 0x27, 0x81, 0xc7, 0x88, + 0xe2, 0xe1, 0x2e, 0x34, 0x3d, 0x26, 0xdc, 0x68, 0x13, 0xc6, 0xd2, 0x77, 0x59, 0xf9, 0xce, 0x43, + 0xbd, 0x27, 0x60, 0x48, 0x3e, 0x6e, 0x42, 0x7d, 0x31, 0xfe, 0x7a, 0x3c, 0xf9, 0x76, 0x6c, 0x96, + 0x70, 0x17, 0xee, 0x2f, 0xc6, 0xb3, 0xc5, 0x74, 0x3a, 0x21, 0xf3, 0xd3, 0xaf, 0x5e, 0x4c, 0xc9, + 0x64, 0x3e, 0x39, 0x99, 0x3c, 0x7f, 0x71, 0x7e, 0x4a, 0x66, 0xa3, 0xc9, 0xd8, 0x84, 0xde, 0xcf, + 0x65, 0x68, 0xcd, 0x76, 0xcb, 0x43, 0x1d, 0xfc, 0x1c, 0xda, 0x42, 0xc7, 0x4b, 0x36, 0x0b, 0xa9, + 0x9b, 0x9e, 0xe0, 0x83, 0xcc, 0x63, 0x8e, 0x9e, 0x06, 0x09, 0x97, 0x14, 0xb4, 0x98, 0x80, 0xb9, + 0xe3, 0x85, 0x7a, 0x7a, 0xa7, 0x3e, 0xbe, 0xb9, 0xde, 0xa2, 0xc0, 0x26, 0x6f, 0xe8, 0xed, 0x87, + 0xd0, 0xbe, 0xfe, 0x54, 0xf9, 0xed, 0x16, 0x61, 0x76, 0x2b, 0x1a, 0x24, 0x0d, 0xed, 0x47, 0x60, + 0x16, 0x2b, 0xbe, 0x9d, 0xdd, 0xfb, 0xb7, 0x06, 0xc6, 0x6c, 0xcf, 0xdd, 0xb7, 0x53, 0xf0, 0xe7, + 0x50, 0xbf, 0xd0, 0x37, 0x23, 0xe9, 0x23, 0x7f, 0x76, 0xdc, 0x75, 0x4e, 0x02, 0x1e, 0x33, 0x1e, + 0x9f, 0x53, 0x7f, 0xc7, 0x48, 0x4a, 0xb5, 0xff, 0x41, 0xd0, 0xca, 0x67, 0xf0, 0x97, 0x00, 0xf2, + 0xc2, 0x2f, 0x42, 0x8f, 0xc6, 0xe9, 0x0e, 0x5b, 0xd7, 0x2b, 0x0d, 0x0f, 0xf9, 0x61, 0x89, 0xe4, + 0xd8, 0xf8, 0x0c, 0x8e, 0x5e, 0xee, 0x7c, 0x5f, 0x92, 0x88, 0xbe, 0xe0, 0x37, 0x5b, 0x39, 0xdb, + 0xf9, 0xbe, 0x93, 0x30, 0x86, 0x25, 0x52, 0x14, 0xe1, 0x11, 0x98, 0x19, 0x24, 0xc2, 0x80, 0x0b, + 0x96, 0x5c, 0xa8, 0x7b, 0x37, 0x16, 0xd2, 0x94, 0x61, 0x89, 0xbc, 0x21, 0x7b, 0x56, 0x87, 0xea, + 0x0f, 0xb2, 0x2f, 0xfb, 0x0f, 0x04, 0x90, 0x19, 0xc7, 0x77, 0xa0, 0x2a, 0x8d, 0x0b, 0x0b, 0x75, + 0x2b, 0xfd, 0x06, 0xd1, 0x01, 0xee, 0x43, 0x3d, 0x19, 0xab, 0x56, 0xb9, 0x5b, 0xe9, 0x37, 0x07, + 0x6d, 0x87, 0xba, 0xbe, 0x43, 0xe8, 0x8f, 0x27, 0x0a, 0x26, 0x69, 0x1a, 0xbf, 0x0f, 0x35, 0x39, + 0x4f, 0x93, 0xa9, 0xd5, 0x20, 0x49, 0x84, 0x7b, 0xd0, 0x12, 0x9c, 0x86, 0x62, 0x1d, 0xc4, 0x53, + 0x1a, 0xaf, 0x2d, 0x43, 0x95, 0xbf, 0x86, 0xe1, 0xc7, 0x00, 0x92, 0xad, 0x07, 0xa7, 0x9a, 0x57, + 0xcd, 0x81, 0xe9, 0xa8, 0xf1, 0x3c, 0x3f, 0xe0, 0x24, 0xc7, 0xb1, 0xff, 0x2b, 0x83, 0x21, 0x7b, + 0xb5, 0x7f, 0x43, 0x50, 0x4f, 0x77, 0xe9, 0xdd, 0x6a, 0xe1, 0x77, 0x04, 0xb7, 0xd2, 0x53, 0x79, + 0xb7, 0xac, 0x3f, 0x3c, 0x87, 0x66, 0xee, 0x37, 0x07, 0xdf, 0x85, 0xf7, 0x72, 0xa1, 0x9e, 0x8b, + 0x66, 0x09, 0xdf, 0x83, 0x0f, 0xf2, 0x70, 0x6e, 0x74, 0x98, 0x08, 0xdf, 0x86, 0xa3, 0x6b, 0x1a, + 0xee, 0x9a, 0xe5, 0x67, 0x0f, 0xfe, 0xbc, 0xec, 0xa0, 0xd7, 0x97, 0x1d, 0xf4, 0xf7, 0x65, 0x07, + 0xbd, 0xba, 0xea, 0x94, 0x5e, 0x5f, 0x75, 0x4a, 0x7f, 0x5d, 0x75, 0x4a, 0xdf, 0xc1, 0xf1, 0xe1, + 0x5f, 0xc2, 0xb2, 0xa6, 0x3e, 0x3e, 0xfb, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xad, 0xe7, 0x46, + 0x39, 0x08, 0x00, 0x00, } func (m *Message) Marshal() (dAtA []byte, err error) { @@ -1139,6 +1148,13 @@ func (m *Header) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.DebugInfo) > 0 { + i -= len(m.DebugInfo) + copy(dAtA[i:], m.DebugInfo) + i = encodeVarintSync(dAtA, i, uint64(len(m.DebugInfo))) + i-- + dAtA[i] = 0x2a + } if m.Type != 0 { i = encodeVarintSync(dAtA, i, uint64(m.Type)) i-- @@ -1887,6 +1903,10 @@ func (m *Header) Size() (n int) { if m.Type != 0 { n += 1 + sovSync(uint64(m.Type)) } + l = len(m.DebugInfo) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } return n } @@ -2433,6 +2453,38 @@ func (m *Header) Unmarshal(dAtA []byte) error { break } } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DebugInfo", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DebugInfo = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:])