Changeset 741 in code for trunk/conn.go
- Timestamp:
- Dec 2, 2021, 10:52:29 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/conn.go
r703 r741 11 11 "unicode" 12 12 13 "golang.org/x/time/rate" 13 14 "gopkg.in/irc.v3" 14 15 "nhooyr.io/websocket" … … 119 120 } 120 121 121 type rateLimiter struct {122 C <-chan struct{}123 ticker *time.Ticker124 stopped chan struct{}125 }126 127 func newRateLimiter(delay time.Duration, burst int) *rateLimiter {128 ch := make(chan struct{}, burst)129 for i := 0; i < burst; i++ {130 ch <- struct{}{}131 }132 ticker := time.NewTicker(delay)133 stopped := make(chan struct{})134 go func() {135 for {136 select {137 case <-ticker.C:138 select {139 case ch <- struct{}{}:140 // This space is intentionally left blank141 case <-stopped:142 return143 }144 case <-stopped:145 return146 }147 }148 }()149 return &rateLimiter{150 C: ch,151 ticker: ticker,152 stopped: stopped,153 }154 }155 156 func (rl *rateLimiter) Stop() {157 rl.ticker.Stop()158 close(rl.stopped)159 }160 161 122 type connOptions struct { 162 123 Logger Logger … … 187 148 188 149 go func() { 189 var rl *rateLimiter 190 if options.RateLimitDelay > 0 && options.RateLimitBurst > 0 { 191 rl = newRateLimiter(options.RateLimitDelay, options.RateLimitBurst) 192 defer rl.Stop() 193 } 194 150 ctx, cancel := c.NewContext(context.Background()) 151 defer cancel() 152 153 rl := rate.NewLimiter(rate.Every(options.RateLimitDelay), options.RateLimitBurst) 195 154 for msg := range outgoing { 196 if rl!= nil {197 <-rl.C155 if err := rl.Wait(ctx); err != nil { 156 break 198 157 } 199 158
Note:
See TracChangeset
for help on using the changeset viewer.