From 6dd70c918d056dbe698dd691e3c0c8ce815b4d01 Mon Sep 17 00:00:00 2001 From: ivanjoz Date: Sun, 26 May 2024 22:38:11 -0500 Subject: [PATCH] improve websocket connection and response with connected users --- backend/core/responses.go | 26 ++++++++++++++++++++++---- backend/handlers/webrtc.go | 21 +++++++++++++++++++-- backend/main.go | 1 + frontend/package.json | 4 ++-- frontend/src/services/connection.ts | 3 ++- start.sh | 23 +++++++++++++++++++++++ 6 files changed, 69 insertions(+), 9 deletions(-) create mode 100755 start.sh diff --git a/backend/core/responses.go b/backend/core/responses.go index b2a4d87..84c3e74 100644 --- a/backend/core/responses.go +++ b/backend/core/responses.go @@ -19,6 +19,7 @@ import ( "github.com/DmitriyVTitov/size" "github.com/andybalholm/brotli" "github.com/aws/aws-lambda-go/events" + "github.com/gorilla/websocket" ) type HandlerArgs struct { @@ -30,8 +31,6 @@ type HandlerArgs struct { QueryString string Method string Route string - ClientID string // websocket - ConnectionID string // websocket Authorization string MergedID int32 ResponseBody *string @@ -39,7 +38,11 @@ type HandlerArgs struct { ReqParams string Usuario IUsuario EventType string - IsWebSocket bool + // websocket + IsWebSocket bool + ClientID string + ConnectionID string + WebSocketConn *websocket.Conn } func PrintMemUsage() { @@ -580,6 +583,22 @@ func makeHeaders() map[string]string { // Crea una respuesta serializando un struct func (req *HandlerArgs) MakeResponse(respStruct any) HandlerResponse { + if req.IsWebSocket { + bodyBytes, err := json.Marshal(respStruct) + if err != nil { + return req.MakeErr("No se pudo serializar respuesta: " + err.Error()) + } + var bodyCompressed bytes.Buffer + gz := gzip.NewWriter(&bodyCompressed) + defer gz.Close() + if _, err := gz.Write(bodyBytes); err != nil { + log.Fatal(err) + } + if req.WebSocketConn != nil { + req.WebSocketConn.WriteMessage(websocket.BinaryMessage, bodyCompressed.Bytes()) + } + return HandlerResponse{} + } return MakeResponse(req, &respStruct) } @@ -608,7 +627,6 @@ func MakeResponse[T any](req *HandlerArgs, respStruct *T) HandlerResponse { fileName := fmt.Sprintf("output-%v", req.MergedID) response.BodyOnDisk = EncodeJsonToFileX(respStruct, fileName) } - return response } diff --git a/backend/handlers/webrtc.go b/backend/handlers/webrtc.go index efd8280..5e407ac 100644 --- a/backend/handlers/webrtc.go +++ b/backend/handlers/webrtc.go @@ -32,7 +32,7 @@ func MakeClientTable() aws.DynamoTableRecords[RtcClientOffer] { } func PostRtcOffer(args *core.HandlerArgs) core.HandlerResponse { - + core.Log("Body recibido::", *args.Body) offer := RtcClientOffer{} err := json.Unmarshal([]byte(*args.Body), &offer) if err != nil { @@ -40,10 +40,27 @@ func PostRtcOffer(args *core.HandlerArgs) core.HandlerResponse { return core.HandlerResponse{} } + if offer.Offer == "" { + core.Log("No se recibió el SPD Offer") + return core.HandlerResponse{} + } + offer.ClientID = args.ClientID + core.Print(offer) + dynamoTable := MakeClientTable() dynamoTable.PutItem(&offer, 1) - return core.HandlerResponse{} + // Devuelve los ultimos usuarios conectados + query := aws.DynamoQueryParam{Index: "sk", GreaterThan: "0", ScanIndexForward: true, Limit: 50} + records, err := dynamoTable.QueryBatch([]aws.DynamoQueryParam{query}) + if err != nil { + core.Log("Error al obtener las últimas conexiones:", err) + return core.HandlerResponse{} + } + + core.Log("Número de conexiones obtenidas::", len(records)) + + return args.MakeResponse(records) } diff --git a/backend/main.go b/backend/main.go index 1980b01..5f0c897 100644 --- a/backend/main.go +++ b/backend/main.go @@ -139,6 +139,7 @@ func LocalWssHandler(w http.ResponseWriter, r *http.Request) { core.Log("Recibido: ", string(message)) args := ParseWssMessage(message) args.IsWebSocket = true + args.WebSocketConn = ws mainHandler(args) } } diff --git a/frontend/package.json b/frontend/package.json index 87f08a7..a9e2977 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -2,9 +2,9 @@ "name": "example-basic", "type": "module", "scripts": { - "dev": "vinxi dev", + "dev": "vinxi dev --port 3588", "build": "vinxi build && node build.js", - "start": "vinxi start", + "start": "vinxi start --port 3588", "version": "vinxi version" }, "dependencies": { diff --git a/frontend/src/services/connection.ts b/frontend/src/services/connection.ts index 2d7da47..1c908a7 100644 --- a/frontend/src/services/connection.ts +++ b/frontend/src/services/connection.ts @@ -178,7 +178,8 @@ export class ConnectionManager { async sendOffer(){ const offerString = await webRTCManager.getOffer() - await this.sendMessage("PostRtcOffer",offerString) + const message = { offer: offerString } + await this.sendMessage("PostRtcOffer", JSON.stringify(message)) } } diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..17d7f9d --- /dev/null +++ b/start.sh @@ -0,0 +1,23 @@ +#!/bin/bash +if [[ "$OSTYPE" == "linux-gnu"* ]]; then # comando para LINUX + + konsole & sleep 1 + + qdbus org.kde.konsole-$! /konsole/MainWindow_1 org.kde.KMainWindow.activateAction split-view-left-right + + qdbus org.kde.konsole-$! /Windows/1 org.kde.konsole.Window.setCurrentSession 1 + qdbus org.kde.konsole-$! /Sessions/1 setTitle 1 'FRONTEND' + qdbus org.kde.konsole-$! /Sessions/1 runCommand 'cd ./frontend && npm run dev' + + qdbus org.kde.konsole-$! /Sessions/2 setTitle 1 'BACKEND' + qdbus org.kde.konsole-$! /Sessions/2 runCommand 'cd ./backend && air dev' + + qdbus org.kde.konsole-$! /Windows/2 org.kde.konsole.Window.setCurrentSession 1 + qdbus org.kde.konsole-$! /Sessions/0 setTitle 1 'GERP' + +else # comando para WINDOWS + + echo 'nada configurado' + echo 'probar cmder ==> https://www.eventslooped.com/posts/automate-open-tabs-in-cmder/' + +fi