Sybren A. Stüvel
2b89399206
SocketIO clients no longer automatically subscribe to the jobs updates. This is now done explicitly via the `allJobs` subscription type, and unsubscribing is also possible.
71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
// package webupdates uses SocketIO to send updates to a web client.
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
package webupdates
|
|
|
|
import (
|
|
gosocketio "github.com/graarh/golang-socketio"
|
|
"github.com/graarh/golang-socketio/transport"
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/rs/zerolog"
|
|
"github.com/rs/zerolog/log"
|
|
)
|
|
|
|
type BiDirComms struct {
|
|
sockserv *gosocketio.Server
|
|
}
|
|
|
|
type Message struct {
|
|
Name string `json:"name"`
|
|
Text string `json:"text"`
|
|
}
|
|
|
|
func New() *BiDirComms {
|
|
bdc := BiDirComms{
|
|
sockserv: gosocketio.NewServer(transport.GetDefaultWebsocketTransport()),
|
|
}
|
|
bdc.registerSIOEventHandlers()
|
|
return &bdc
|
|
}
|
|
|
|
func (b *BiDirComms) RegisterHandlers(router *echo.Echo) {
|
|
router.Any("/socket.io/", echo.WrapHandler(b.sockserv))
|
|
}
|
|
|
|
func (b *BiDirComms) registerSIOEventHandlers() {
|
|
log.Debug().Msg("initialising SocketIO")
|
|
|
|
sio := b.sockserv
|
|
// the sio.On() and c.Join() calls only return an error when there is no
|
|
// server connected to them, but that's not possible with our setup.
|
|
// Errors are explicitly silenced (by assigning to _) to reduce clutter.
|
|
|
|
// socket connection
|
|
_ = sio.On(gosocketio.OnConnection, func(c *gosocketio.Channel) {
|
|
logger := sioLogger(c)
|
|
logger.Debug().Msg("socketIO: connected")
|
|
_ = c.Join(string(SocketIORoomChat)) // All clients connect to the chat room.
|
|
})
|
|
|
|
// socket disconnection
|
|
_ = sio.On(gosocketio.OnDisconnection, func(c *gosocketio.Channel) {
|
|
logger := sioLogger(c)
|
|
logger.Debug().Msg("socketIO: disconnected")
|
|
})
|
|
|
|
_ = sio.On(gosocketio.OnError, func(c *gosocketio.Channel) {
|
|
logger := sioLogger(c)
|
|
logger.Warn().Msg("socketIO: socketio error")
|
|
})
|
|
|
|
b.registerChatEventHandlers()
|
|
b.registerRoomEventHandlers()
|
|
}
|
|
|
|
func sioLogger(c *gosocketio.Channel) zerolog.Logger {
|
|
logger := log.With().
|
|
Str("clientID", c.Id()).
|
|
Str("remoteAddr", c.Ip()).
|
|
Logger()
|
|
return logger
|
|
}
|