Squashed commit of the following:
commit 3191224d6de3d679ed7c3a35a383ebed27d3c181
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Thu Sep 26 18:20:04 2024 +0300
client: imp tests
commit 6cc4ed53a206657c5626a5894190a6851ebb3b01
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Thu Sep 26 18:04:36 2024 +0300
client: imp code
commit 79272b299ad16534ba4919e1f0616a875d7a15cb
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Thu Sep 26 16:10:06 2024 +0300
all: imp code
commit 0a001fffbe4dece198f9343b998d606e85f94703
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Tue Sep 24 20:05:47 2024 +0300
all: imp tests
commit 80f7e98d302f78332a4e297f243ad1c4a958cadd
Merge: df7492e9d e338214ad
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Tue Sep 24 19:10:13 2024 +0300
Merge branch 'master' into AG-27492-client-storage-runtime-sources
commit df7492e9de063e3c1b582e9f014554bc6cba7e90
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Tue Sep 24 19:06:37 2024 +0300
all: imp code
commit 23896ae5a6ee3f2d3a54dc15536d1c9349ba46b5
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Thu Sep 19 21:04:34 2024 +0300
client: fix typo
commit ba0ba2478ccd50d764d1a6a2d5c4b4b35b9b2a1c
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Thu Sep 19 21:02:13 2024 +0300
all: imp code
commit f7315be742422dda8d0adede6666b119761e67f4
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Thu Sep 12 14:35:38 2024 +0300
home: imp code
commit f63d0e80fb34f0d2799be7d51138ad1200449fc5
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Thu Sep 12 14:15:49 2024 +0300
all: imp code
commit 9feda414b6e469d911c9428d9ce1c5043d27cc93
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Tue Sep 10 17:53:42 2024 +0300
all: imp code
commit fafd7cbb52d36bea260c9d922b7c4204f73e7a66
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Mon Sep 9 21:13:05 2024 +0300
all: imp code
commit 2d2b8e02163e1bd03bf46d46ef7dbb6a50c4e844
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Thu Sep 5 20:55:10 2024 +0300
client: add tests
commit 4d394e6f2162f797c409073cb52e1e0de93a9d5e
Author: Stanislav Chzhen <s.chzhen@adguard.com>
Date: Thu Aug 29 20:40:38 2024 +0300
all: client storage runtime sources
73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
package client
|
|
|
|
import "net/netip"
|
|
|
|
// runtimeIndex stores information about runtime clients.
|
|
type runtimeIndex struct {
|
|
// index maps IP address to runtime client.
|
|
index map[netip.Addr]*Runtime
|
|
}
|
|
|
|
// newRuntimeIndex returns initialized runtime index.
|
|
func newRuntimeIndex() (ri *runtimeIndex) {
|
|
return &runtimeIndex{
|
|
index: map[netip.Addr]*Runtime{},
|
|
}
|
|
}
|
|
|
|
// client returns the saved runtime client by ip. If no such client exists,
|
|
// returns nil.
|
|
func (ri *runtimeIndex) client(ip netip.Addr) (rc *Runtime) {
|
|
return ri.index[ip]
|
|
}
|
|
|
|
// add saves the runtime client in the index. IP address of a client must be
|
|
// unique. See [Runtime.Client]. rc must not be nil.
|
|
func (ri *runtimeIndex) add(rc *Runtime) {
|
|
ip := rc.Addr()
|
|
ri.index[ip] = rc
|
|
}
|
|
|
|
// rangeClients calls f for each runtime client in an undefined order.
|
|
func (ri *runtimeIndex) rangeClients(f func(rc *Runtime) (cont bool)) {
|
|
for _, rc := range ri.index {
|
|
if !f(rc) {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
// setInfo sets the client information from cs for runtime client stored by ip.
|
|
// If no such client exists, it creates one.
|
|
func (ri *runtimeIndex) setInfo(ip netip.Addr, cs Source, hosts []string) (rc *Runtime) {
|
|
rc = ri.index[ip]
|
|
if rc == nil {
|
|
rc = NewRuntime(ip)
|
|
ri.add(rc)
|
|
}
|
|
|
|
rc.setInfo(cs, hosts)
|
|
|
|
return rc
|
|
}
|
|
|
|
// clearSource removes information from the specified source from all clients.
|
|
func (ri *runtimeIndex) clearSource(src Source) {
|
|
for _, rc := range ri.index {
|
|
rc.unset(src)
|
|
}
|
|
}
|
|
|
|
// removeEmpty removes empty runtime clients and returns the number of removed
|
|
// clients.
|
|
func (ri *runtimeIndex) removeEmpty() (n int) {
|
|
for ip, rc := range ri.index {
|
|
if rc.isEmpty() {
|
|
delete(ri.index, ip)
|
|
n++
|
|
}
|
|
}
|
|
|
|
return n
|
|
}
|