Created sessions life loop
This commit is contained in:
19
api/helper.go
Normal file
19
api/helper.go
Normal 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
|
||||||
@@ -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)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user