package transport import ( "ripple/config" "ripple/udpr" ) type senderWorker struct { ch chan sendRequest stopCh chan struct{} closeCh chan struct{} conn *udpr.UDPRConn } func newSenderWorker(conn *udpr.UDPRConn) *senderWorker { w := &senderWorker{ ch: make(chan sendRequest, config.BufferSize), stopCh: make(chan struct{}), closeCh: make(chan struct{}), conn: conn, } go w.run() return w } func (w *senderWorker) run() { defer close(w.closeCh) for { select { case <-w.stopCh: return case req := <-w.ch: _ = w.conn.WriteToUDPR(req.data, req.dest) } } } func (w *senderWorker) enqueue(req sendRequest) { select { case w.ch <- req: default: } } func (w *senderWorker) stop() { close(w.stopCh) <-w.closeCh }