/
disconnect_handler.go
89 lines (71 loc) · 1.84 KB
/
disconnect_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package main
import (
"github.com/Cretezy/dSock/common"
"github.com/Cretezy/dSock/common/protos"
"github.com/gin-gonic/gin"
"google.golang.org/protobuf/proto"
"sync"
)
func disconnectHandler(c *gin.Context) {
connId := c.Query("id")
user := c.Query("user")
session := c.Query("session")
keepClaims := c.Query("keepClaims") == "true"
resolveOptions := common.ResolveOptions{
Connection: connId,
User: user,
Session: session,
}
// Get all worker IDs that the target is connected to
workerIds, apiError := resolveWorkers(resolveOptions)
if apiError != nil {
apiError.Send(c)
return
}
if !keepClaims {
// Expire claims instantly, must resolve all claims for target
claimIds, apiError := resolveClaims(resolveOptions)
if apiError != nil {
apiError.Send(c)
return
}
// Delete all resolved claims
claimKeys := make([]string, len(claimIds))
for index, claim := range claimIds {
claimKeys[index] = "claim:" + claim
}
redisClient.SRem("claim-user:"+user, claimIds)
redisClient.SRem("claim-user-session:"+user+"-"+session, claimIds)
redisClient.Del(claimKeys...)
}
// Prepare message for worker
message := &protos.Message{
User: user,
Connection: connId,
Session: session,
Type: protos.Message_DISCONNECT,
}
rawMessage, err := proto.Marshal(message)
if err != nil {
apiError := common.ApiError{
ErrorCode: common.ErrorMarshallingMessage,
StatusCode: 500,
}
apiError.Send(c)
return
}
// Send message to all resolved workers
var workersWaitGroup sync.WaitGroup
workersWaitGroup.Add(len(workerIds))
for _, workerId := range workerIds {
workerId := workerId
go func() {
defer workersWaitGroup.Done()
redisClient.Publish(workerId, rawMessage)
}()
}
workersWaitGroup.Wait()
c.AbortWithStatusJSON(200, map[string]interface{}{
"success": true,
})
}