Changeset 26 in code for trunk/downstream.go


Ignore:
Timestamp:
Feb 6, 2020, 8:52:04 PM (5 years ago)
Author:
contact
Message:

Write to downstream conn in dedicated goroutine

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r23 r26  
    4040
    4141type downstreamConn struct {
    42         net    net.Conn
    43         irc    *irc.Conn
    44         srv    *Server
    45         logger Logger
     42        net      net.Conn
     43        irc      *irc.Conn
     44        srv      *Server
     45        logger   Logger
     46        messages chan<- *irc.Message
    4647
    4748        registered bool
     
    5354
    5455func newDownstreamConn(srv *Server, netConn net.Conn) *downstreamConn {
    55         return &downstreamConn{
    56                 net:    netConn,
    57                 irc:    irc.NewConn(netConn),
    58                 srv:    srv,
    59                 logger: &prefixLogger{srv.Logger, fmt.Sprintf("downstream %q: ", netConn.RemoteAddr())},
    60         }
     56        msgs := make(chan *irc.Message, 64)
     57        conn := &downstreamConn{
     58                net:      netConn,
     59                irc:      irc.NewConn(netConn),
     60                srv:      srv,
     61                logger:   &prefixLogger{srv.Logger, fmt.Sprintf("downstream %q: ", netConn.RemoteAddr())},
     62                messages: msgs,
     63        }
     64
     65        go func() {
     66                for msg := range msgs {
     67                        if err := conn.irc.WriteMessage(msg); err != nil {
     68                                conn.logger.Printf("failed to write message: %v", err)
     69                        }
     70                }
     71        }()
     72
     73        return conn
    6174}
    6275
     
    7689                if ircErr, ok := err.(ircError); ok {
    7790                        ircErr.Message.Prefix = c.srv.prefix()
    78                         if err := c.WriteMessage(ircErr.Message); err != nil {
    79                                 return fmt.Errorf("failed to write IRC reply: %v", err)
    80                         }
     91                        c.messages <- ircErr.Message
    8192                } else if err != nil {
    8293                        return fmt.Errorf("failed to handle IRC command %q: %v", msg.Command, err)
     
    92103
    93104func (c *downstreamConn) Close() error {
     105        if c.closed {
     106                return fmt.Errorf("downstream connection already closed")
     107        }
    94108        if err := c.net.Close(); err != nil {
    95109                return err
    96110        }
     111        close(c.messages)
    97112        c.closed = true
    98113        return nil
    99114}
    100115
    101 func (c *downstreamConn) WriteMessage(msg *irc.Message) error {
     116func (c *downstreamConn) WriteMessage(msg *irc.Message) {
    102117        msg.Prefix = c.srv.prefix()
    103         return c.irc.WriteMessage(msg)
     118        c.messages <- msg
    104119}
    105120
     
    108123        case "PING":
    109124                // TODO: handle params
    110                 return c.WriteMessage(&irc.Message{
     125                c.WriteMessage(&irc.Message{
    111126                        Command: "PONG",
    112127                        Params:  []string{c.srv.Hostname},
    113128                })
     129                return nil
    114130        default:
    115131                if c.registered {
     
    149165        c.registered = true
    150166
    151         err := c.WriteMessage(&irc.Message{
     167        c.WriteMessage(&irc.Message{
    152168                Command: irc.RPL_WELCOME,
    153169                Params:  []string{c.nick, "Welcome to jounce, " + c.nick},
    154170        })
    155         if err != nil {
    156                 return err
    157         }
    158 
    159         err = c.WriteMessage(&irc.Message{
     171
     172        c.WriteMessage(&irc.Message{
    160173                Command: irc.RPL_YOURHOST,
    161174                Params:  []string{c.nick, "Your host is " + c.srv.Hostname},
    162175        })
    163         if err != nil {
    164                 return err
    165         }
    166 
    167         err = c.WriteMessage(&irc.Message{
     176
     177        c.WriteMessage(&irc.Message{
    168178                Command: irc.RPL_CREATED,
    169179                Params:  []string{c.nick, "This server was created <datetime>"}, // TODO
    170180        })
    171         if err != nil {
    172                 return err
    173         }
    174 
    175         err = c.WriteMessage(&irc.Message{
     181
     182        c.WriteMessage(&irc.Message{
    176183                Command: irc.RPL_MYINFO,
    177184                Params:  []string{c.nick, c.srv.Hostname, "unknown", "aiwroO", "OovaimnqpsrtklbeI"},
    178185        })
    179         if err != nil {
    180                 return err
    181         }
    182 
    183         err = c.WriteMessage(&irc.Message{
     186
     187        c.WriteMessage(&irc.Message{
    184188                Command: irc.ERR_NOMOTD,
    185189                Params:  []string{c.nick, "No MOTD"},
    186190        })
    187         if err != nil {
    188                 return err
    189         }
    190191
    191192        return nil
Note: See TracChangeset for help on using the changeset viewer.