Skip to content

Commit b954177

Browse files
committed
partila
1 parent 9371b3c commit b954177

File tree

2 files changed

+127
-1
lines changed

2 files changed

+127
-1
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ require (
5151
github.com/google/uuid v1.3.0
5252
github.com/gorilla/feeds v1.1.1
5353
github.com/gorilla/sessions v1.2.1
54+
github.com/gorilla/websocket v1.4.2
5455
github.com/hashicorp/go-version v1.4.0
5556
github.com/hashicorp/golang-lru v0.5.4
5657
github.com/huandu/xstrings v1.3.2
@@ -194,7 +195,6 @@ require (
194195
github.com/gorilla/handlers v1.5.1 // indirect
195196
github.com/gorilla/mux v1.8.0 // indirect
196197
github.com/gorilla/securecookie v1.1.1 // indirect
197-
github.com/gorilla/websocket v1.4.2 // indirect
198198
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
199199
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
200200
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect

routers/web/events/websocket.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// Copyright 2022 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package events
6+
7+
import (
8+
"code.gitea.io/gitea/modules/context"
9+
"code.gitea.io/gitea/modules/eventsource"
10+
"code.gitea.io/gitea/modules/graceful"
11+
"code.gitea.io/gitea/modules/json"
12+
"code.gitea.io/gitea/modules/log"
13+
"code.gitea.io/gitea/routers/web/auth"
14+
"github.com/gorilla/websocket"
15+
)
16+
17+
type readMessage struct {
18+
messageType int
19+
message []byte
20+
err error
21+
}
22+
23+
// Events listens for events
24+
func Websocket(ctx *context.Context) {
25+
upgrader := websocket.Upgrader{
26+
ReadBufferSize: 1024,
27+
WriteBufferSize: 1024,
28+
}
29+
30+
conn, err := upgrader.Upgrade(ctx.Resp, ctx.Req, nil)
31+
if err != nil {
32+
log.Error("Unable to upgrade due to error: %v", err)
33+
return
34+
}
35+
defer conn.Close()
36+
37+
notify := ctx.Done()
38+
shutdownCtx := graceful.GetManager().ShutdownContext()
39+
40+
eventChan := make(<-chan *eventsource.Event)
41+
uid := int64(0)
42+
unregister := func() {}
43+
if ctx.IsSigned {
44+
uid = ctx.Doer.ID
45+
eventChan = eventsource.GetManager().Register(uid)
46+
unregister = func() {
47+
go func() {
48+
eventsource.GetManager().Unregister(uid, eventChan)
49+
// ensure the messageChan is closed
50+
for {
51+
_, ok := <-eventChan
52+
if !ok {
53+
break
54+
}
55+
}
56+
}()
57+
}
58+
}
59+
defer unregister()
60+
61+
readChan := make(chan readMessage, 20)
62+
go func() {
63+
for {
64+
messageType, message, err := conn.ReadMessage()
65+
readChan <- readMessage{
66+
messageType: messageType,
67+
message: message,
68+
err: err,
69+
}
70+
if err != nil {
71+
close(readChan)
72+
return
73+
}
74+
}
75+
}()
76+
77+
for {
78+
select {
79+
case <-notify:
80+
return
81+
case <-shutdownCtx.Done():
82+
return
83+
case _, ok := <-readChan:
84+
if !ok {
85+
break
86+
}
87+
case event, ok := <-eventChan:
88+
if !ok {
89+
break
90+
}
91+
if event.Name == "logout" {
92+
if ctx.Session.ID() == event.Data {
93+
_, _ = (&eventsource.Event{
94+
Name: "logout",
95+
Data: "here",
96+
}).WriteTo(ctx.Resp)
97+
ctx.Resp.Flush()
98+
go unregister()
99+
auth.HandleSignOut(ctx)
100+
break
101+
}
102+
// Replace the event - we don't want to expose the session ID to the user
103+
event = &eventsource.Event{
104+
Name: "logout",
105+
Data: "elsewhere",
106+
}
107+
}
108+
109+
w, err := conn.NextWriter(websocket.TextMessage)
110+
if err != nil {
111+
log.Warn("Unable to get writer for websocket %v", err)
112+
return
113+
}
114+
115+
if err := json.NewEncoder(w).Encode(event); err != nil {
116+
log.Error("Unable to create encoder for %v %v", event, err)
117+
return
118+
}
119+
if err := w.Close(); err != nil {
120+
log.Warn("Unable to close writer for websocket %v", err)
121+
return
122+
}
123+
124+
}
125+
}
126+
}

0 commit comments

Comments
 (0)