44 lines
1.3 KiB
Go
44 lines
1.3 KiB
Go
package ws
|
|
|
|
import (
|
|
"github.com/maddalax/htmgo/extensions/websocket/internal/wsutil"
|
|
"github.com/maddalax/htmgo/framework/h"
|
|
"github.com/maddalax/htmgo/framework/service"
|
|
"github.com/maddalax/htmgo/framework/session"
|
|
"log/slog"
|
|
"time"
|
|
)
|
|
|
|
// Every executes the given callback every interval, until the socket is disconnected, or the callback returns false.
|
|
func Every(ctx *h.RequestContext, interval time.Duration, cb func() bool) {
|
|
socketId := session.GetSessionId(ctx)
|
|
socketIdSlog := slog.String("socketId", string(socketId))
|
|
|
|
slog.Debug("ws-extension: starting every loop", socketIdSlog, slog.Duration("duration", interval))
|
|
|
|
go func() {
|
|
tries := 0
|
|
for {
|
|
locator := ctx.ServiceLocator()
|
|
socketManager := service.Get[wsutil.SocketManager](locator)
|
|
socket := socketManager.Get(string(socketId))
|
|
// This can run before the socket is established, lets try a few times and kill it if socket isn't connected after a bit.
|
|
if socket == nil {
|
|
if tries > 5 {
|
|
slog.Debug("ws-extension: socket disconnected, killing goroutine", socketIdSlog)
|
|
return
|
|
} else {
|
|
time.Sleep(time.Second)
|
|
tries++
|
|
slog.Debug("ws-extension: socket not connected yet, trying again", socketIdSlog, slog.Int("attempt", tries))
|
|
continue
|
|
}
|
|
}
|
|
success := cb()
|
|
if !success {
|
|
return
|
|
}
|
|
time.Sleep(interval)
|
|
}
|
|
}()
|
|
}
|