| 
									
										
										
										
											2015-10-08 00:24:56 +00:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"golang.org/x/net/websocket" | 
					
						
							| 
									
										
										
										
											2015-11-10 22:27:06 +00:00
										 |  |  | 	"sync" | 
					
						
							| 
									
										
										
										
											2015-10-19 02:07:37 +00:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2015-10-08 00:24:56 +00:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type uibroadcaster struct { | 
					
						
							| 
									
										
										
										
											2015-11-10 23:44:00 +00:00
										 |  |  | 	sockets    []*websocket.Conn | 
					
						
							| 
									
										
										
										
											2015-11-10 22:49:44 +00:00
										 |  |  | 	sockets_mu *sync.Mutex | 
					
						
							| 
									
										
										
										
											2015-11-10 23:44:00 +00:00
										 |  |  | 	messages   chan []byte | 
					
						
							| 
									
										
										
										
											2015-10-08 00:24:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func NewUIBroadcaster() *uibroadcaster { | 
					
						
							|  |  |  | 	ret := &uibroadcaster{ | 
					
						
							| 
									
										
										
										
											2015-11-10 22:27:06 +00:00
										 |  |  | 		sockets:    make([]*websocket.Conn, 0), | 
					
						
							|  |  |  | 		sockets_mu: &sync.Mutex{}, | 
					
						
							|  |  |  | 		messages:   make(chan []byte, 1024), | 
					
						
							| 
									
										
										
										
											2015-10-08 00:24:56 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	go ret.writer() | 
					
						
							|  |  |  | 	return ret | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (u *uibroadcaster) Send(msg []byte) { | 
					
						
							|  |  |  | 	u.messages <- msg | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (u *uibroadcaster) AddSocket(sock *websocket.Conn) { | 
					
						
							| 
									
										
										
										
											2015-11-10 22:27:06 +00:00
										 |  |  | 	u.sockets_mu.Lock() | 
					
						
							| 
									
										
										
										
											2015-10-08 00:24:56 +00:00
										 |  |  | 	u.sockets = append(u.sockets, sock) | 
					
						
							| 
									
										
										
										
											2015-11-10 22:27:06 +00:00
										 |  |  | 	u.sockets_mu.Unlock() | 
					
						
							| 
									
										
										
										
											2015-10-08 00:24:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (u *uibroadcaster) writer() { | 
					
						
							|  |  |  | 	for { | 
					
						
							|  |  |  | 		msg := <-u.messages | 
					
						
							|  |  |  | 		// Send to all.
 | 
					
						
							|  |  |  | 		p := make([]*websocket.Conn, 0) // Keep a list of the writeable sockets.
 | 
					
						
							| 
									
										
										
										
											2015-11-10 22:27:06 +00:00
										 |  |  | 		u.sockets_mu.Lock() | 
					
						
							| 
									
										
										
										
											2015-10-08 00:24:56 +00:00
										 |  |  | 		for _, sock := range u.sockets { | 
					
						
							| 
									
										
										
										
											2015-10-19 02:06:33 +00:00
										 |  |  | 			err := sock.SetWriteDeadline(time.Now().Add(time.Second)) | 
					
						
							|  |  |  | 			_, err2 := sock.Write(msg) | 
					
						
							|  |  |  | 			if err == nil && err2 == nil { | 
					
						
							| 
									
										
										
										
											2015-10-08 00:24:56 +00:00
										 |  |  | 				p = append(p, sock) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		u.sockets = p // Save the list of writeable sockets.
 | 
					
						
							| 
									
										
										
										
											2015-11-10 22:27:06 +00:00
										 |  |  | 		u.sockets_mu.Unlock() | 
					
						
							| 
									
										
										
										
											2015-10-08 00:24:56 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |