Changeset 210 in code for trunk/upstream.go


Ignore:
Timestamp:
Apr 3, 2020, 2:35:08 PM (5 years ago)
Author:
contact
Message:

Introduce conn for common connection logic

This centralizes the common upstream & downstream bits.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/upstream.go

    r209 r210  
    3232
    3333type upstreamConn struct {
    34         network  *network
    35         logger   Logger
    36         net      net.Conn
    37         irc      *irc.Conn
    38         srv      *Server
    39         user     *user
    40         outgoing chan<- *irc.Message
    41         closed   chan struct{}
     34        conn
     35
     36        network *network
     37        user    *user
    4238
    4339        serverName            string
     
    9187        }
    9288
    93         setKeepAlive(netConn)
    94 
    95         outgoing := make(chan *irc.Message, 64)
    9689        uc := &upstreamConn{
     90                conn:                     *newConn(network.user.srv, netConn, logger),
    9791                network:                  network,
    98                 logger:                   logger,
    99                 net:                      netConn,
    100                 irc:                      irc.NewConn(netConn),
    101                 srv:                      network.user.srv,
    10292                user:                     network.user,
    103                 outgoing:                 outgoing,
    104                 closed:                   make(chan struct{}),
    10593                channels:                 make(map[string]*upstreamChannel),
    10694                caps:                     make(map[string]string),
     
    113101        }
    114102
    115         go func() {
    116                 for msg := range outgoing {
    117                         if uc.srv.Debug {
    118                                 uc.logger.Printf("sent: %v", msg)
    119                         }
    120                         uc.net.SetWriteDeadline(time.Now().Add(writeTimeout))
    121                         if err := uc.irc.WriteMessage(msg); err != nil {
    122                                 uc.logger.Printf("failed to write message: %v", err)
    123                                 break
    124                         }
    125                 }
    126                 if err := uc.net.Close(); err != nil {
    127                         uc.logger.Printf("failed to close connection: %v", err)
    128                 } else {
    129                         uc.logger.Printf("connection closed")
    130                 }
    131                 // Drain the outgoing channel to prevent SendMessage from blocking
    132                 for range outgoing {
    133                         // This space is intentionally left blank
    134                 }
    135         }()
    136 
    137103        return uc, nil
    138 }
    139 
    140 func (uc *upstreamConn) isClosed() bool {
    141         select {
    142         case <-uc.closed:
    143                 return true
    144         default:
    145                 return false
    146         }
    147 }
    148 
    149 // Close closes the connection. It is safe to call from any goroutine.
    150 func (uc *upstreamConn) Close() error {
    151         if uc.isClosed() {
    152                 return fmt.Errorf("upstream connection already closed")
    153         }
    154         close(uc.closed)
    155         close(uc.outgoing)
    156         return nil
    157104}
    158105
     
    14101357func (uc *upstreamConn) readMessages(ch chan<- event) error {
    14111358        for {
    1412                 msg, err := uc.irc.ReadMessage()
     1359                msg, err := uc.ReadMessage()
    14131360                if err == io.EOF {
    14141361                        break
     
    14171364                }
    14181365
    1419                 if uc.srv.Debug {
    1420                         uc.logger.Printf("received: %v", msg)
    1421                 }
    1422 
    14231366                ch <- eventUpstreamMessage{msg, uc}
    14241367        }
    14251368
    14261369        return nil
    1427 }
    1428 
    1429 // SendMessage queues a new outgoing message. It is safe to call from any
    1430 // goroutine.
    1431 func (uc *upstreamConn) SendMessage(msg *irc.Message) {
    1432         uc.outgoing <- msg
    14331370}
    14341371
Note: See TracChangeset for help on using the changeset viewer.