Created sessions life loop

This commit is contained in:
2025-11-16 09:08:43 +03:00
parent bf921ea8d4
commit 6417964385
3 changed files with 111 additions and 13 deletions

19
api/helper.go Normal file
View File

@@ -0,0 +1,19 @@
package api
import (
"sync"
"time"
"github.com/gorilla/websocket"
)
type Session struct {
id string
aConn *websocket.Conn
bConn *websocket.Conn
lastInteractionTime time.Time
lastInteractedPartyIsA bool
}
var openSessions = make(map[string]Session)
var sessionsMu sync.RWMutex

View File

@@ -4,6 +4,9 @@ import (
"fmt" "fmt"
"log" "log"
"net/http" "net/http"
"time"
"echo/misc"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
@@ -22,29 +25,62 @@ func serveStaticFile(fileName string) http.HandlerFunc {
} }
func createSession(w http.ResponseWriter, r *http.Request) { func createSession(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, `
{ sessionsMu.RLock()
"sessionId":"XyZ123" var id string
for {
id, _ = misc.RandomString(10)
_, ok := openSessions[id]
if !ok {
break // make sure we don't have duplicated ids
}
} }
`) sessionsMu.RUnlock()
session := Session{
id: id,
lastInteractionTime: time.Now(),
lastInteractedPartyIsA: true,
}
sessionsMu.Lock()
openSessions[session.id] = session
sessionsMu.Unlock()
fmt.Fprintf(w,
`{
"sessionId":%s
}`, session.id)
} }
var upgrader = websocket.Upgrader{} var upgrader = websocket.Upgrader{}
func signalWS(w http.ResponseWriter, r *http.Request) { func signalWS(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r) vars := mux.Vars(r)
party := vars["party"] partyStr := vars["party"]
session := vars["session"] sessionId := vars["session"]
fmt.Printf("Initiating a websocket, party=%s session=%s\n", party, session) fmt.Printf("Initiating a websocket, party=%s session=%s\n", partyStr, sessionId)
partyIsA := true
switch partyStr {
case "A":
case "B":
partyIsA = false
default:
fmt.Printf("Party is invalid partyStr=%s", partyStr)
return
}
conn, err := upgrader.Upgrade(w, r, nil) conn, err := upgrader.Upgrade(w, r, nil)
if err != nil { if err != nil {
fmt.Printf("Error initiating websocket, r.URL=%s e=%s", r.URL.String(), err) fmt.Printf("Error initiating websocket, r.URL=%s party=%v e=%s", r.URL.String(), partyIsA, err)
} }
websocketSignaler(conn) websocketSignaler(conn, partyIsA, sessionId)
} }

View File

@@ -1,21 +1,64 @@
package api package api
import "github.com/gorilla/websocket" import (
"fmt"
"time"
func websocketSignaler(conn *websocket.Conn) { "github.com/gorilla/websocket"
)
func websocketSignaler(conn *websocket.Conn, partyIsA bool, sessionId string) {
defer conn.Close() defer conn.Close()
sessionsMu.RLock()
openSession, ok := openSessions[sessionId]
sessionsMu.RUnlock()
if !ok {
// conn.WriteMessage(1, "{Session not found or something}")
return
}
fmt.Println("Session", openSession)
if partyIsA {
if openSession.aConn != nil {
openSession.aConn.Close()
}
openSession.aConn = conn
if !openSession.lastInteractedPartyIsA {
openSession.lastInteractedPartyIsA = true
openSession.lastInteractionTime = time.Now()
}
} else {
if openSession.bConn != nil {
openSession.bConn.Close()
}
openSession.bConn = conn
if openSession.lastInteractedPartyIsA {
openSession.lastInteractedPartyIsA = false
openSession.lastInteractionTime = time.Now()
}
}
sessionsMu.Lock()
openSessions[openSession.id] = openSession
sessionsMu.Unlock()
for { for {
msgType, msg, err := conn.ReadMessage() msgType, msg, err := conn.ReadMessage()
if err != nil { if err != nil {
return break
} }
// Let's just echo for now as a placeholder // Let's just echo for now as a placeholder
err = conn.WriteMessage(msgType, msg) err = conn.WriteMessage(msgType, msg)
if err != nil { if err != nil {
return break
} }
} }
} }