8 "github.com/anacrolix/torrent/generics"
9 "github.com/anacrolix/torrent/smartban"
12 type bannableAddr = netip.Addr
14 type smartBanCache = smartban.Cache[bannableAddr, RequestIndex, [sha1.Size]byte]
16 type blockCheckingWriter struct {
18 requestIndex RequestIndex
19 // Peers that didn't match blocks written now.
20 badPeers map[bannableAddr]struct{}
21 blockBuffer bytes.Buffer
25 func (me *blockCheckingWriter) checkBlock() {
26 b := me.blockBuffer.Next(me.chunkSize)
27 for _, peer := range me.cache.CheckBlock(me.requestIndex, b) {
28 generics.MakeMapIfNilAndSet(&me.badPeers, peer, struct{}{})
33 func (me *blockCheckingWriter) checkFullBlocks() {
34 for me.blockBuffer.Len() >= me.chunkSize {
39 func (me *blockCheckingWriter) Write(b []byte) (int, error) {
40 n, err := me.blockBuffer.Write(b)
42 // bytes.Buffer.Write should never fail.
49 // Check any remaining block data. Terminal pieces or piece sizes that don't divide into the chunk
50 // size cleanly may leave fragments that should be checked.
51 func (me *blockCheckingWriter) Flush() {
52 for me.blockBuffer.Len() != 0 {