mirror of
https://github.com/go-gitea/gitea
synced 2025-02-05 03:47:44 +01:00
cleanup
This commit is contained in:
parent
17f4faf2ae
commit
948f1bdf9e
@ -9,6 +9,7 @@ import (
|
||||
issues_model "code.gitea.io/gitea/models/issues"
|
||||
repo_model "code.gitea.io/gitea/models/repo"
|
||||
user_model "code.gitea.io/gitea/models/user"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
notify_service "code.gitea.io/gitea/services/notify"
|
||||
"github.com/olahol/melody"
|
||||
)
|
||||
@ -31,7 +32,7 @@ func (n *webhookNotifier) CreateIssueComment(ctx context.Context, doer *user_mod
|
||||
// TODO: use proper message
|
||||
msg := []byte("<div hx-swap-oob=\"beforebegin:.timeline-item.comment.form\"><div class=\"hello\">hello world!</div></div>")
|
||||
|
||||
n.m.BroadcastFilter(msg, func(s *melody.Session) bool {
|
||||
err := n.m.BroadcastFilter(msg, func(s *melody.Session) bool {
|
||||
sessionData, err := getSessionData(s)
|
||||
if err != nil {
|
||||
return false
|
||||
@ -49,4 +50,7 @@ func (n *webhookNotifier) CreateIssueComment(ctx context.Context, doer *user_mod
|
||||
|
||||
return false
|
||||
})
|
||||
if err != nil {
|
||||
log.Error("Failed to broadcast message: %v", err)
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,6 @@
|
||||
// Copyright 2022 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package websocket
|
||||
|
||||
import (
|
||||
@ -7,8 +10,7 @@ import (
|
||||
)
|
||||
|
||||
type sessionData struct {
|
||||
uid int64
|
||||
unregister func()
|
||||
uid int64
|
||||
}
|
||||
|
||||
func getSessionData(s *melody.Session) (*sessionData, error) {
|
||||
|
@ -4,100 +4,23 @@
|
||||
package websocket
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"code.gitea.io/gitea/modules/context"
|
||||
"code.gitea.io/gitea/modules/eventsource"
|
||||
"code.gitea.io/gitea/modules/graceful"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/routers/web/auth"
|
||||
"github.com/olahol/melody"
|
||||
)
|
||||
|
||||
func HandleConnect(s *melody.Session) {
|
||||
ctx := context.GetWebContext(s.Request)
|
||||
|
||||
// Listen to connection close and un-register messageChan
|
||||
notify := ctx.Done()
|
||||
ctx.Resp.Flush()
|
||||
|
||||
if !ctx.IsSigned {
|
||||
// Return unauthorized status event
|
||||
event := &eventsource.Event{
|
||||
Name: "close",
|
||||
Data: "unauthorized",
|
||||
}
|
||||
_, _ = event.WriteTo(ctx.Resp)
|
||||
ctx.Resp.Flush()
|
||||
return
|
||||
}
|
||||
|
||||
shutdownCtx := graceful.GetManager().ShutdownContext()
|
||||
|
||||
uid := ctx.Doer.ID
|
||||
|
||||
messageChan := eventsource.GetManager().Register(uid)
|
||||
|
||||
sessionData := &sessionData{
|
||||
unregister: func() {
|
||||
eventsource.GetManager().Unregister(uid, messageChan)
|
||||
// ensure the messageChan is closed
|
||||
for {
|
||||
_, ok := <-messageChan
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
}
|
||||
},
|
||||
uid: uid,
|
||||
}
|
||||
|
||||
s.Set("data", sessionData)
|
||||
|
||||
timer := time.NewTicker(30 * time.Second)
|
||||
|
||||
loop:
|
||||
for {
|
||||
select {
|
||||
case <-notify:
|
||||
go sessionData.unregister()
|
||||
break loop
|
||||
case <-shutdownCtx.Done():
|
||||
go sessionData.unregister()
|
||||
break loop
|
||||
case event, ok := <-messageChan:
|
||||
if !ok {
|
||||
break loop
|
||||
}
|
||||
|
||||
// Handle logout
|
||||
if event.Name == "logout" {
|
||||
if ctx.Session.ID() == event.Data {
|
||||
_, _ = (&eventsource.Event{
|
||||
Name: "logout",
|
||||
Data: "here",
|
||||
}).WriteTo(ctx.Resp)
|
||||
ctx.Resp.Flush()
|
||||
go sessionData.unregister()
|
||||
auth.HandleSignOut(ctx)
|
||||
break loop
|
||||
}
|
||||
// Replace the event - we don't want to expose the session ID to the user
|
||||
event = &eventsource.Event{
|
||||
Name: "logout",
|
||||
Data: "elsewhere",
|
||||
}
|
||||
}
|
||||
|
||||
_, err := event.WriteTo(ctx.Resp)
|
||||
if err != nil {
|
||||
log.Error("Unable to write to EventStream for user %s: %v", ctx.Doer.Name, err)
|
||||
go sessionData.unregister()
|
||||
break loop
|
||||
}
|
||||
ctx.Resp.Flush()
|
||||
}
|
||||
}
|
||||
timer.Stop()
|
||||
}
|
||||
|
||||
func HandleMessage(s *melody.Session, msg []byte) {
|
||||
@ -105,11 +28,5 @@ func HandleMessage(s *melody.Session, msg []byte) {
|
||||
}
|
||||
|
||||
func HandleDisconnect(s *melody.Session) {
|
||||
data, err := getSessionData(s)
|
||||
if err != nil {
|
||||
log.Error("Unable to get session data: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
data.unregister()
|
||||
// TODO: Handle disconnect
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user