Get working console websocket implementation and fix race condition

This commit is contained in:
Dane Everitt
2019-04-20 17:38:12 -07:00
parent 49ca2e2404
commit bed30d9229
4 changed files with 99 additions and 25 deletions

View File

@@ -228,7 +228,7 @@ func (d *DockerEnvironment) FollowConsoleOutput() error {
s := bufio.NewScanner(r)
for s.Scan() {
fmt.Println(s.Text())
d.Server.Emit(ConsoleOutputEvent, s.Text())
}
if err := s.Err(); err != nil {

46
server/events.go Normal file
View File

@@ -0,0 +1,46 @@
package server
type EventListeners map[string][]EventListenerFunction
type EventListenerFunction *func(string)
// Defines all of the possible output events for a server.
const (
ConsoleOutputEvent = "console"
)
// Adds an event listener for the server instance.
func (s *Server) AddListener(event string, f EventListenerFunction) {
if s.listeners == nil {
s.listeners = make(map[string][]EventListenerFunction)
}
if _, ok := s.listeners[event]; ok {
s.listeners[event] = append(s.listeners[event], f)
} else {
s.listeners[event] = []EventListenerFunction{f}
}
}
// Removes the event listener for the server instance.
func (s *Server) RemoveListener(event string, f EventListenerFunction) {
if _, ok := s.listeners[event]; ok {
for i := range s.listeners[event] {
if s.listeners[event][i] == f {
s.listeners[event] = append(s.listeners[event][:i], s.listeners[event][i+1:]...)
break
}
}
}
}
// Emits an event to all of the active listeners for a server.
func (s *Server) Emit(event string, data string) {
if _, ok := s.listeners[event]; ok {
for _, handler := range s.listeners[event] {
go func (f EventListenerFunction, d string) {
(*f)(d)
}(handler, data)
}
}
}

View File

@@ -1,7 +1,6 @@
package server
import (
"github.com/olebedev/emitter"
"github.com/patrickmn/go-cache"
"github.com/pkg/errors"
"github.com/pterodactyl/wings/config"
@@ -62,7 +61,8 @@ type Server struct {
// certain long operations return faster. For example, FS disk space usage.
Cache *cache.Cache `json:"-"`
Emitter *emitter.Emitter `json:"-"`
// All of the registered event listeners for this server instance.
listeners EventListeners
}
// The build settings for a given server that impact docker container creation and
@@ -206,7 +206,6 @@ func FromConfiguration(data []byte, cfg *config.SystemConfiguration) (*Server, e
return nil, err
}
s.Emitter = &emitter.Emitter{}
s.Environment = env
s.Cache = cache.New(time.Minute * 10, time.Minute * 15)
s.Filesystem = &Filesystem{