diff --git a/go.mod b/go.mod index a9b47f924..807b58bc0 100644 --- a/go.mod +++ b/go.mod @@ -190,6 +190,7 @@ require ( github.com/ipfs/go-ipfs-provider v0.8.1 // indirect github.com/ipfs/go-ipfs-util v0.0.2 // indirect github.com/ipfs/go-ipld-legacy v0.1.1 // indirect + github.com/ipfs/go-libipfs v0.3.0 // indirect github.com/ipfs/go-metrics-interface v0.0.1 // indirect github.com/ipfs/go-peertaskqueue v0.8.0 // indirect github.com/ipfs/go-verifcid v0.0.2 // indirect @@ -269,7 +270,6 @@ require ( go.uber.org/fx v1.18.2 // indirect golang.org/x/crypto v0.5.0 // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect - golang.org/x/mobile v0.0.0-20221110043201-43a038452099 // indirect golang.org/x/mod v0.7.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.4.0 // indirect diff --git a/go.sum b/go.sum index f236f7ebb..8f4e6c3e2 100644 --- a/go.sum +++ b/go.sum @@ -83,12 +83,6 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/anytypeio/amplitude-go v0.0.0-20211130222238-8d16496a9b31 h1:fCXBjRAxXq4pKyfH8xmYPfjL/E6v5zTTxYrIKDz8ufw= github.com/anytypeio/amplitude-go v0.0.0-20211130222238-8d16496a9b31/go.mod h1:uX6FcwR+wTQWzFszLXQxeKfNeittg1408V7pVAtLKqQ= -github.com/anytypeio/any-sync v0.0.8-0.20230204164120-d3362ba85e19 h1:QT0wvSV6MN8FoIfVutJwh1Olkc5Al1psCNuCI+nh10k= -github.com/anytypeio/any-sync v0.0.8-0.20230204164120-d3362ba85e19/go.mod h1:v11BGtMFMdQ9RaYggyI/CwsS5K6CnsCoO89a6WEcVEA= -github.com/anytypeio/any-sync v0.0.8-0.20230205142955-b2140f3c30de h1:1fAnGfxNPHNeyuDIG5rKkCTqF8AB2a2l3WcGGzZReYM= -github.com/anytypeio/any-sync v0.0.8-0.20230205142955-b2140f3c30de/go.mod h1:v11BGtMFMdQ9RaYggyI/CwsS5K6CnsCoO89a6WEcVEA= -github.com/anytypeio/any-sync v0.0.8 h1:2bJJBOaYZHeQnx2x4UHuqqqTbpsbwP3KgoEblfi/OSg= -github.com/anytypeio/any-sync v0.0.8/go.mod h1:rFQjYtpQOYdhqjQxolTNsoW/OXR3CEPFXGrAiUR5/i0= github.com/anytypeio/any-sync v0.0.9-0.20230208165349-75214ee231e6 h1:4q17xwyu38G0bUsZDRTen40bfN3ppVTulhBuaQoKqWg= github.com/anytypeio/any-sync v0.0.9-0.20230208165349-75214ee231e6/go.mod h1:rFQjYtpQOYdhqjQxolTNsoW/OXR3CEPFXGrAiUR5/i0= github.com/anytypeio/go-chash v0.0.2 h1:BSpyMC3HXNkf2eosQrHM4svov0DrvxL9tb4gnHbdmbA= @@ -389,8 +383,7 @@ github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-graphviz v0.0.9 h1:s/FMMJ1Joj6La3S5ApO3Jk2cwM4LpXECC2muFx3IPQQ= -github.com/goccy/go-graphviz v0.0.9/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk= +github.com/goccy/go-graphviz v0.1.0 h1:6OqQoQ5PeAiHYe/YcusyeulqBrOkUb16HQ4ctRdyVUU= github.com/goccy/go-graphviz v0.1.0/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -596,8 +589,8 @@ github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1Hy github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= -github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= +github.com/ipfs/go-block-format v0.1.1 h1:129vSO3zwbsYADcyQWcOYiuCpAqt462SFfqFHdFJhhI= github.com/ipfs/go-block-format v0.1.1/go.mod h1:+McEIT+g52p+zz5xGAABGSOKrzmrdX97bc0USBdWPUs= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= @@ -698,6 +691,8 @@ github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2 github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= github.com/ipfs/go-ipns v0.3.0 h1:ai791nTgVo+zTuq2bLvEGmWP1M0A6kGTXUsgv/Yq67A= github.com/ipfs/go-ipns v0.3.0/go.mod h1:3cLT2rbvgPZGkHJoPO1YMJeh6LtkxopCkKFcio/wE24= +github.com/ipfs/go-libipfs v0.3.0 h1:YvzFWGcl88eiz2tjOheNqaeQseH+dW3fUKrSaHOG/dU= +github.com/ipfs/go-libipfs v0.3.0/go.mod h1:pSUHZ5qPJTAidsxe9bAeHp3KIiw2ODEW2a2kM3v+iXI= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= @@ -707,8 +702,7 @@ github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JP github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= -github.com/ipfs/go-merkledag v0.8.1 h1:N3yrqSre/ffvdwtHL4MXy0n7XH+VzN8DlzDrJySPa94= -github.com/ipfs/go-merkledag v0.8.1/go.mod h1:uYUlWE34GhbcTjGuUDEcdPzsEtOdnOupL64NgSRjmWI= +github.com/ipfs/go-merkledag v0.9.0 h1:DFC8qZ96Dz1hMT7dtIpcY524eFFDiEWAF8hNJHWW2pk= github.com/ipfs/go-merkledag v0.9.0/go.mod h1:bPHqkHt5OZ0p1n3iqPeDiw2jIBkjAytRjS3WSBwjq90= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= @@ -719,8 +713,7 @@ github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68 github.com/ipfs/go-peertaskqueue v0.8.0 h1:JyNO144tfu9bx6Hpo119zvbEL9iQ760FHOiJYsUjqaU= github.com/ipfs/go-peertaskqueue v0.8.0/go.mod h1:cz8hEnnARq4Du5TGqiWKgMr/BOSQ5XOgMOh1K5YYKKM= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.4.1 h1:nmJFKvF+khK03PIWyCxxydD/nkQX315NZDcgvRqMXf0= -github.com/ipfs/go-unixfs v0.4.1/go.mod h1:2SUDFhUSzrcL408B1qpIkJJ5HznnyTzweViPXUAvkNg= +github.com/ipfs/go-unixfs v0.4.2 h1:hdQlsHHK5tek9gC9mjGVua8xyTqC+eopGseCRcbCZNg= github.com/ipfs/go-unixfs v0.4.2/go.mod h1:L+x6JRlFE0PfyMqeoLYVOKLhn5IeZHvNT7ZI51Y9Qyc= github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= @@ -1045,8 +1038,7 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= @@ -1445,8 +1437,7 @@ github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvS github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/whyrusleeping/cbor-gen v0.0.0-20200123233031-1cdf64d27158/go.mod h1:Xj/M2wWU+QdTdRbu/L/1dIZY8/Wb2K9pAhtroQuxJJI= -github.com/whyrusleeping/cbor-gen v0.0.0-20221213004032-c09a31a7d5e8 h1:wGJHI5UqTlrtrgpA5kaQACNegkEHGhG/6Lmc7QORfqI= -github.com/whyrusleeping/cbor-gen v0.0.0-20221213004032-c09a31a7d5e8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20221220214510-0333c149dec0 h1:obKzQ1ey5AJg5NKjgtTo/CKwLImVP4ETLRcsmzFJ4Qw= github.com/whyrusleeping/cbor-gen v0.0.0-20221220214510-0333c149dec0/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= @@ -1597,8 +1588,6 @@ golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20221110043201-43a038452099 h1:aIu0lKmfdgtn2uTj7JI2oN4TUrQvgB+wzTPO23bCKt8= -golang.org/x/mobile v0.0.0-20221110043201-43a038452099/go.mod h1:aAjjkJNdrh3PMckS4B10TGS2nag27cbKR1y2BpUxsiY= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= diff --git a/net/addrs/common.go b/net/addrs/common.go new file mode 100644 index 000000000..9540d1f97 --- /dev/null +++ b/net/addrs/common.go @@ -0,0 +1,44 @@ +package addrs + +import ( + "golang.org/x/exp/slices" + "net" +) + +type Interface struct { + net.Interface + Addrs []InterfaceAddr +} + +type InterfaceAddr struct { + Ip []byte + Prefix int +} + +type InterfacesAddrs struct { + Interfaces []net.Interface + Addrs []net.Addr +} + +func (i InterfacesAddrs) Equal(other InterfacesAddrs) bool { + if len(other.Interfaces) != len(i.Interfaces) { + return false + } + if len(other.Addrs) != len(i.Addrs) { + return false + } + myStr := getStrings(i) + otherStr := getStrings(other) + return slices.Equal(myStr, otherStr) +} + +func getStrings(i InterfacesAddrs) (allStrings []string) { + for _, i := range i.Interfaces { + allStrings = append(allStrings, i.Name) + } + for _, i := range i.Addrs { + allStrings = append(allStrings, i.String()) + } + slices.Sort(allStrings) + return +} diff --git a/net/addrs/interface.go b/net/addrs/interface.go index b2ecc2031..90a0ae005 100644 --- a/net/addrs/interface.go +++ b/net/addrs/interface.go @@ -9,21 +9,6 @@ func SetInterfaceAddrsGetter(getter InterfaceAddrsGetter) {} func SetInterfaceGetter(getter InterfaceGetter) {} -type Interface struct { - net.Interface - Addrs []InterfaceAddr -} - -type InterfaceAddr struct { - Ip []byte - Prefix int -} - -type InterfacesAddrs struct { - Interfaces []net.Interface - Addrs []net.Addr -} - type InterfaceGetter interface { Interfaces() []Interface } diff --git a/net/addrs/interface_android.go b/net/addrs/interface_android.go index 24d91b2a2..e8399f9a1 100644 --- a/net/addrs/interface_android.go +++ b/net/addrs/interface_android.go @@ -22,21 +22,6 @@ func SetInterfaceGetter(getter InterfaceGetter) { interfaceGetter = getter } -type InterfaceAddr struct { - Ip []byte - Prefix int -} - -type Interface struct { - net.Interface - Addrs []InterfaceAddr -} - -type InterfacesAddrs struct { - Interfaces []net.Interface - Addrs []net.Addr -} - type InterfaceGetter interface { Interfaces() []Interface } diff --git a/space/localdiscovery/localdiscovery.go b/space/localdiscovery/localdiscovery.go index d363d4fe3..d41c6eecb 100644 --- a/space/localdiscovery/localdiscovery.go +++ b/space/localdiscovery/localdiscovery.go @@ -7,6 +7,7 @@ import ( "github.com/anytypeio/any-sync/app" "github.com/anytypeio/any-sync/app/logger" "github.com/anytypeio/any-sync/net" + "github.com/anytypeio/any-sync/util/periodicsync" "github.com/anytypeio/go-anytype-middleware/core/anytype/config" "github.com/anytypeio/go-anytype-middleware/net/addrs" "github.com/libp2p/zeroconf/v2" @@ -49,6 +50,7 @@ type localDiscovery struct { cancel context.CancelFunc closeWait sync.WaitGroup interfacesAddrs addrs.InterfacesAddrs + periodicCheck periodicsync.PeriodicSync notifier Notifier } @@ -65,6 +67,7 @@ func (l *localDiscovery) Init(a *app.App) (err error) { l.peerId = a.MustComponent(accountservice.CName).(accountservice.Service).Account().PeerId addrs := a.MustComponent(config.CName).(net.ConfigGetter).GetNet().Server.ListenAddrs l.port, err = getPort(addrs) + l.periodicCheck = periodicsync.NewPeriodicSync(30, 0, l.checkAddrs, log) return } @@ -72,11 +75,7 @@ func (l *localDiscovery) Run(ctx context.Context) (err error) { if l.port == 0 { return } - l.ctx, l.cancel = context.WithCancel(ctx) - if err = l.startServer(); err != nil { - return - } - l.startQuerying(l.ctx) + l.periodicCheck.Run() return } @@ -88,19 +87,39 @@ func (l *localDiscovery) Close(ctx context.Context) (err error) { if len(l.addrs) == 0 { return } + l.periodicCheck.Close() l.cancel() if l.server != nil { l.server.Shutdown() + l.closeWait.Wait() } - l.closeWait.Wait() return nil } -func (l *localDiscovery) startServer() (err error) { - l.interfacesAddrs, err = addrs.GetInterfacesAddrs() +func (l *localDiscovery) checkAddrs(ctx context.Context) (err error) { + newAddrs, err := addrs.GetInterfacesAddrs() if err != nil { return } + if newAddrs.Equal(l.interfacesAddrs) && l.server != nil { + return + } + l.interfacesAddrs = newAddrs + if l.server != nil { + l.cancel() + l.server.Shutdown() + l.closeWait.Wait() + l.closeWait = sync.WaitGroup{} + } + l.ctx, l.cancel = context.WithCancel(ctx) + if err = l.startServer(); err != nil { + return + } + l.startQuerying(l.ctx) + return +} + +func (l *localDiscovery) startServer() (err error) { var ips []string for _, addr := range l.interfacesAddrs.Addrs { ip := strings.Split(addr.String(), "/")[0]