github.com/graemephi/kahugo@v0.62.3-0.20211121071557-d78c0423784d/livereload/hub.go (about)

     1  // Copyright 2015 The Hugo Authors. All rights reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  // http://www.apache.org/licenses/LICENSE-2.0
     7  //
     8  // Unless required by applicable law or agreed to in writing, software
     9  // distributed under the License is distributed on an "AS IS" BASIS,
    10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package livereload
    15  
    16  type hub struct {
    17  	// Registered connections.
    18  	connections map[*connection]bool
    19  
    20  	// Inbound messages from the connections.
    21  	broadcast chan []byte
    22  
    23  	// Register requests from the connections.
    24  	register chan *connection
    25  
    26  	// Unregister requests from connections.
    27  	unregister chan *connection
    28  }
    29  
    30  var wsHub = hub{
    31  	broadcast:   make(chan []byte),
    32  	register:    make(chan *connection),
    33  	unregister:  make(chan *connection),
    34  	connections: make(map[*connection]bool),
    35  }
    36  
    37  func (h *hub) run() {
    38  	for {
    39  		select {
    40  		case c := <-h.register:
    41  			h.connections[c] = true
    42  		case c := <-h.unregister:
    43  			delete(h.connections, c)
    44  			c.close()
    45  		case m := <-h.broadcast:
    46  			for c := range h.connections {
    47  				select {
    48  				case c.send <- m:
    49  				default:
    50  					delete(h.connections, c)
    51  					c.close()
    52  				}
    53  			}
    54  		}
    55  	}
    56  }