mirror of
https://github.com/pterodactyl/wings.git
synced 2025-12-10 15:40:14 -06:00
This change makes the environment handling logic execute independent of the server itself and should make it much easier for people to contribute changes and additional environment handlers down the road without polluting the server object even more. There is still a lot of work to do on this front to make things easier to work with, and there are some questionable design decisions at play I'm sure. Welcome to additional modifications and cleanup to make this code easier to reason about and work with.
74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
package websocket
|
|
|
|
import (
|
|
"context"
|
|
"github.com/pterodactyl/wings/events"
|
|
"github.com/pterodactyl/wings/server"
|
|
"time"
|
|
)
|
|
|
|
// Checks the time to expiration on the JWT every 30 seconds until the token has
|
|
// expired. If we are within 3 minutes of the token expiring, send a notice over
|
|
// the socket that it is expiring soon. If it has expired, send that notice as well.
|
|
func (h *Handler) ListenForExpiration(ctx context.Context) {
|
|
// Make a ticker and completion channel that is used to continuously poll the
|
|
// JWT stored in the session to send events to the socket when it is expiring.
|
|
ticker := time.NewTicker(time.Second * 30)
|
|
|
|
// Whenever this function is complete, end the ticker, close out the channel,
|
|
// and then close the websocket connection.
|
|
defer ticker.Stop()
|
|
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
return
|
|
case <-ticker.C:
|
|
jwt := h.GetJwt()
|
|
if jwt != nil {
|
|
if jwt.ExpirationTime.Unix()-time.Now().Unix() <= 0 {
|
|
_ = h.SendJson(&Message{Event: TokenExpiredEvent})
|
|
} else if jwt.ExpirationTime.Unix()-time.Now().Unix() <= 180 {
|
|
_ = h.SendJson(&Message{Event: TokenExpiringEvent})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Listens for different events happening on a server and sends them along
|
|
// to the connected websocket.
|
|
func (h *Handler) ListenForServerEvents(ctx context.Context) {
|
|
e := []string{
|
|
server.StatsEvent,
|
|
server.StatusEvent,
|
|
server.ConsoleOutputEvent,
|
|
server.InstallOutputEvent,
|
|
server.InstallStartedEvent,
|
|
server.InstallCompletedEvent,
|
|
server.DaemonMessageEvent,
|
|
server.BackupCompletedEvent,
|
|
}
|
|
|
|
eventChannel := make(chan events.Event)
|
|
for _, event := range e {
|
|
h.server.Events().Subscribe(event, eventChannel)
|
|
}
|
|
|
|
for d := range eventChannel {
|
|
select {
|
|
case <-ctx.Done():
|
|
for _, event := range e {
|
|
h.server.Events().Unsubscribe(event, eventChannel)
|
|
}
|
|
|
|
close(eventChannel)
|
|
default:
|
|
_ = h.SendJson(&Message{
|
|
Event: d.Topic,
|
|
Args: []string{d.Data},
|
|
})
|
|
}
|
|
}
|
|
}
|