]> jxnshi.xyz Git - mesange.git/commitdiff
Update
authorjxnshi <jxnshi@proton.me>
Mon, 3 Feb 2025 20:35:08 +0000 (21:35 +0100)
committerjxnshi <jxnshi@proton.me>
Mon, 3 Feb 2025 20:35:08 +0000 (21:35 +0100)
client-cli/client-cli
client-cli/command.odin
client-cli/host.odin
client-cli/main.odin
common/request.odin
server/client.odin
server/main.odin
server/server

index 04e65373e4402a8c144bef47b694fbca635160fd..b68c1dcbffc5d4d4605afc4b379e891a1e415099 100755 (executable)
Binary files a/client-cli/client-cli and b/client-cli/client-cli differ
index 9a6482b17f9c60627ff66974b5519d154b4f8ac1..878906737fba36109995beceefb7091e55b53132 100644 (file)
@@ -196,16 +196,16 @@ handle_command :: proc(app: ^App, command: string) -> Maybe(Handle_Command_Error
                 room_id = room_get_id(room),
             }
 
-            request_id, err := request_host(app, request, &app.profile.private_key)
+            // request_id, err := request_host(app, request, &app.profile.private_key)
 
-            if err != nil {
-                app_set_info_bar(app, "Could not subscribe to room.")
-                return .Command_Failed
-            }
+            // if err != nil {
+            //     app_set_info_bar(app, "Could not subscribe to room.")
+            //     return .Command_Failed
+            // }
 
-            response := wait_host_response(app, request_id)
+            // response := wait_host_response(app, request_id)
 
-            log.infof("Response %v", response)
+            // log.infof("Response %v", response)
 
             app_remove_room(app, app.selected_room)
             app_set_info_bar(app, "Room removed.")
index d1f280c0cd42280a932bf5757ab97264e35c7af4..d87e77f3059072a21c0369f369daad0ed7e0cfb5 100644 (file)
@@ -56,10 +56,10 @@ request_host :: proc(
 
 receive_host :: proc(app: ^App) -> (id: u32, message: common.Server_Message, err: common.Error) {
     buffer: [1_000]u8
-    packet := common.receive_packet(app.host.?) or_return
+    packet := common.receive_packet(app.host.?, buffer[:]) or_return
     packet_buffer: bytes.Buffer
-    packet_buffer.buf = slice.into_dynamic(bytes_buf[:])
-    packet_stream := bytes.buffer_to_stream(&bytes_buffer)
+    packet_buffer.buf = slice.into_dynamic(packet)
+    packet_stream := bytes.buffer_to_stream(&packet_buffer)
 
     return common.server_message_from_bytes(app.host.?, packet_stream)
 }
@@ -71,8 +71,9 @@ wait_host_response :: proc(app: ^App, id: u32) -> common.Server_Response {
         sync.mutex_lock(&app.mutex)
         defer sync.mutex_unlock(&app.mutex)
 
-        for response in app.responses {
-            if response.id == id {
+        for res_id, response in app.waiting_responses {
+            if res_id == id {
+                delete_key(&app.waiting_responses, res_id)
                 return response
             }
         }
index 9a7cb141f383a47bc7683048858aa4cea51adf6d..00009cb6fe150642bee3be07818557c7041e7fb6 100644 (file)
@@ -62,7 +62,7 @@ App :: struct {
     seed_phrase_checksum: u8,
 
     host: Maybe(net.TCP_Socket),
-    waiting_responses: [dynamic]common.Server_Response,
+    waiting_responses: map[u32]common.Server_Response,
 
     selected_room: int,
 }
@@ -113,7 +113,7 @@ app_init :: proc(storage_path: string) -> App {
         info_bar = info_bar,
         input_window = input_window,
 
-        waiting_responses = make([dynamic]common.Server_Response),
+        waiting_responses = make(map[u32]common.Server_Response),
     }
 
     app_update_info_bar(&app)
@@ -127,6 +127,10 @@ app_deinit :: proc(app: ^App) {
     sync.mutex_lock(&app.mutex)
     defer sync.mutex_unlock(&app.mutex)
 
+    for _, response in app.waiting_responses {
+        common.server_response_deinit(response)
+    }
+
     delete(app.waiting_responses)
 
     if host, ok := app.host.?; ok {
@@ -736,16 +740,33 @@ main :: proc() {
             free_all(context.temp_allocator)
         }
 
-        server_message := receive_host(&app)
-
-        #partial switch message in server_message {
-        case common.Server_Response:
-            response := message
+        state: State
 
+        {
             sync.mutex_lock(&app.mutex)
             defer sync.mutex_unlock(&app.mutex)
 
-            append(&app.waiting_responses, response)
+            state = app.state
         }
+
+        // #partial switch state {
+        // case .Room_List, .Room:
+        //     message_id, server_message, err := receive_host(&app)
+
+        //     if err != nil {
+        //         log.errorf("Failed to receive server message with error %v", err)
+        //         continue
+        //     }
+
+        //     #partial switch message in server_message {
+        //     case common.Server_Response:
+        //         response := message
+
+        //         sync.mutex_lock(&app.mutex)
+        //         defer sync.mutex_unlock(&app.mutex)
+
+        //         app.waiting_responses[message_id] = response
+        //     }
+        // }
     }
 }
index ecf77932576fcc64d81e5af9e7a141af50e0c1da..b8d59c124a67a45621eb27a9ca94a8785a3417a4 100644 (file)
@@ -10,6 +10,7 @@ import "core:net"
 import "core:math/rand"
 import "core:mem"
 import "core:slice"
+import "core:strings"
 import "core:time"
 
 ROOM_KEY_SIZE :: 32
@@ -41,6 +42,7 @@ Request_Verify_Error :: enum {
 Error :: union {
     Receive_Packet_Error,
     Receive_Request_Error,
+    Receive_Message_Error,
 
     Client_Request_From_Bytes_Error,
 
@@ -270,8 +272,20 @@ Server_Response :: union {
     string,
 }
 
+server_response_deinit :: proc(response: Server_Response) {
+    switch r in response {
+    case string:
+        delete(r)
+    }
+}
+
 server_response_from_bytes :: proc(stream: io.Stream) -> (response: Server_Response, err: Error) {
-    
+    buffer: [1_000]u8
+    _, _ = io.read(stream, buffer[:])
+
+    response, _ = strings.clone_from_bytes(buffer[:])
+
+    return response, nil
 }
 
 Server_Message :: union {
@@ -287,7 +301,7 @@ server_message_from_bytes :: proc(server: net.TCP_Socket, stream: io.Stream) ->
     id_bytes: [size_of(u32)]u8
     _, _ = io.read(stream, id_bytes[:])
 
-    id, _ := endian.get_u32(.Little, id_bytes[:])
+    id, _ = endian.get_u32(id_bytes[:], .Little)
 
     switch message_type {
     // Request.
@@ -295,33 +309,39 @@ server_message_from_bytes :: proc(server: net.TCP_Socket, stream: io.Stream) ->
 
     // Response.
     case 1:
-        
+        message, err = server_response_from_bytes(stream)
 
     case:
-        return nil, common.Receive_Message_Error.Invalid_Type
+        return 0, nil, Receive_Message_Error.Invalid_Type
     }
+
+    return id, message, err
 }
 
 receive_packet :: proc(socket: net.TCP_Socket, buffer: []u8) -> (packet: []u8, err: Error) {
     length_bytes: [size_of(u32)]u8
-    _ = net.recv_tcp(client, length_bytes[:]) or_return
+    bytes_read := net.recv_tcp(socket, length_bytes[:]) or_return
+
+    if bytes_read == 0 {
+        return {}, Receive_Packet_Error.Packet_Empty
+    }
 
     length, _ := endian.get_u32(length_bytes[:], .Little)
 
     if length == 0 {
-        return {}, common.Receive_Packet_Error.Packet_Empty
+        return {}, Receive_Packet_Error.Packet_Empty
     }
 
     if int(length) > len(buffer) {
         // Empty the socket buffer.
         for _ in 0..<length {
-            _ = net.recv_tcp(client, buffer) or_return
+            _ = net.recv_tcp(socket, buffer) or_return
         }
 
-        return 0, {}, common.Receive_Packet_Error.Packet_Too_Large
+        return {}, Receive_Packet_Error.Packet_Too_Large
     }
 
-    _ = net.recv_tcp(client, buffer[:length]) or_return
+    _ = net.recv_tcp(socket, buffer[:length]) or_return
 
     return buffer[:length], nil
 }
index 3582f51c511acc1bfe19e4bfae131795594fdae4..2177bcfc9be2d0743ac3a6144f9bc759fb6725b4 100644 (file)
@@ -17,10 +17,10 @@ receive_request :: proc(client: net.TCP_Socket) -> (id: u32, request: common.Cli
 
     request_bytes := packet[size_of(u32):]
     request_buffer: bytes.Buffer
-    request_buffer.buf = slice.into_dynamic(bytes_buf[:])
-    request_stream := bytes.buffer_to_stream(&bytes_buffer)
+    request_buffer.buf = slice.into_dynamic(request_bytes[:])
+    request_stream := bytes.buffer_to_stream(&request_buffer)
 
-        request, err = common.client_request_from_bytes(request_stream)
+    request, err = common.client_request_from_bytes(request_stream)
 
     return id, request, err
 }
index b4755dc5cb9241549d1443f2c3baa64239d9de2c..66e954e29b8d128489061151bdc9666d4114dbd8 100644 (file)
@@ -47,6 +47,22 @@ handle_client :: proc(data: Handle_Client_Data) {
         request_id, request, err1 := receive_request(client_socket)
 
         if err1 != nil {
+            #partial switch err in err1 {
+            case common.Receive_Packet_Error:
+                #partial switch err {
+                case .Packet_Empty:
+                    return
+                }
+
+            case net.Network_Error:
+                #partial switch err.(net.TCP_Recv_Error) {
+                case .Connection_Closed:
+                    return
+                }
+            }
+
+            log.infof("Request error %v", err1)
+
             response_string := "Invalid request"
             response = transmute([]u8)response_string
 
index 49703157c9f53f9144948010e576710332e16b75..829a1fad3fbdb16bac07b1d5ce004e9ae22d23e5 100755 (executable)
Binary files a/server/server and b/server/server differ