| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /*
- Copyright 2013 CoreOS Inc.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package web
- type hub struct {
- // status
- open bool
- // Registered connections.
- connections map[*connection]bool
- // Inbound messages from the connections.
- broadcast chan string
- // Register requests from the connections.
- register chan *connection
- // Unregister requests from connections.
- unregister chan *connection
- }
- var h = hub{
- open: false,
- broadcast: make(chan string),
- register: make(chan *connection),
- unregister: make(chan *connection),
- connections: make(map[*connection]bool),
- }
- func Hub() *hub {
- return &h
- }
- func HubOpen() bool {
- return h.open
- }
- func (h *hub) run() {
- h.open = true
- for {
- select {
- case c := <-h.register:
- h.connections[c] = true
- case c := <-h.unregister:
- delete(h.connections, c)
- close(c.send)
- case m := <-h.broadcast:
- for c := range h.connections {
- select {
- case c.send <- m:
- default:
- delete(h.connections, c)
- close(c.send)
- go c.ws.Close()
- }
- }
- }
- }
- }
- func (h *hub) Send(msg string) {
- h.broadcast <- msg
- }
|