room_id = room_get_id(&room),
}
- err := request_host(app.host.?, 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
}
+ response := wait_host_response(app, request_id)
+
app_add_room(app, room)
app_set_info_bar(app, "Room added.")
room_id = room_get_id(&room),
}
- err := request_host(app.host.?, 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
}
- buffer: [1_000]u8
- bytes_read, _ := net.recv_tcp(app.host.?, buffer[:])
- response := transmute(string)buffer[:bytes_read]
+ response := wait_host_response(app, request_id)
log.infof("Response %v", response)
room_id = room_get_id(room),
}
- err := request_host(app.host.?, 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
}
- buffer: [1_000]u8
- bytes_read, _ := net.recv_tcp(app.host.?, buffer[:])
- response := transmute(string)buffer[:bytes_read]
+ response := wait_host_response(app, request_id)
log.infof("Response %v", response)
import "core:crypto/ed25519"
import "core:encoding/endian"
import "core:io"
+import "core:math/rand"
import "core:net"
import "core:slice"
+import "core:sync"
import "core:time"
import "../common"
-request_host :: proc(host: net.TCP_Socket, inner: common.Client_Request_Inner, private_key: ^ed25519.Private_Key) -> (id: u32, err: Error) {
- client_request: Client_Request
- ed25519.public_key_set_priv(&client_request.public_key, private_key)
- client_request.inner = inner
- client_request.timestamp = time.time_to_unix_nano(time.now())
- client_request.signature = client_request_signature(client_request, private_key)
+request_host :: proc(
+ app: ^App,
+ inner: common.Client_Request_Inner,
+ private_key: ^ed25519.Private_Key
+) -> (id: u32, err: common.Error) {
+ request: common.Client_Request
+ ed25519.public_key_set_priv(&request.public_key, private_key)
+ request.inner = inner
+ request.timestamp = time.time_to_unix_nano(time.now())
+ request.signature = common.client_request_signature(request, private_key)
bytes_buf: [10_000]u8
bytes_buffer: bytes.Buffer
_, _ = io.write(request_stream, id_bytes[:])
// Request.
- _ = client_request_to_bytes(request_stream, request)
+ _ = common.client_request_to_bytes(request_stream, request)
// Length.
buffer_length := bytes.buffer_length(&bytes_buffer)
request_bytes := bytes.buffer_to_bytes(&bytes_buffer)
- _ = net.send_tcp(server, request_bytes) or_return
+ _ = net.send_tcp(app.host.?, request_bytes) or_return
return id, nil
}
-receive_host :: proc(host: net.TCP_Socket) -> Message {
-
+receive_host :: proc(app: ^App) -> (message: common.Server_Message, err: common.Error) {
+ buffer: [1_000]u8
+ packet := common.receive_packet(app.host.?) or_return
+ packet_buffer: bytes.Buffer
+ packet_buffer.buf = slice.into_dynamic(bytes_buf[:])
+ packet_stream := bytes.buffer_to_stream(&bytes_buffer)
+
+ // Message type.
+ message_type, _ := io.read_byte(packet_stream)
+
+ // Message ID.
+ id_bytes: [size_of(u32)]u8
+ _, _ = io.read(packet_stream, id_bytes[:])
+
+ id, _ := endian.get_u32(.Little, id_bytes[:])
+
+ switch message_type {
+ // Request.
+ case 0:
+
+ // Response.
+ case 1:
+
+ case:
+ return nil, common.Receive_Message_Error.Invalid_Type
+ }
+}
+
+wait_host_response :: proc(app: ^App, id: u32) -> common.Server_Response {
+ for {
+ time.sleep(1_000_000)
+
+ sync.mutex_lock(&app.mutex)
+ defer sync.mutex_unlock(&app.mutex)
+
+ for response in app.responses {
+ if response.id == id {
+ return response
+ }
+ }
+ }
}
seed_phrase_checksum: u8,
host: Maybe(net.TCP_Socket),
- waiting_respones: [dynamic]common.Server_Response,
+ waiting_responses: [dynamic]common.Server_Response,
selected_room: int,
}
time.sleep(1_000_000)
free_all(context.temp_allocator)
}
+
+ server_message := receive_host(&app)
+
+ #partial switch message in server_message {
+ case common.Server_Response:
+ response := message
+
+ sync.mutex_lock(&app.mutex)
+ defer sync.mutex_unlock(&app.mutex)
+
+ append(&app.waiting_responses, response)
+ }
}
}
encrypted_message = encrypted_message,
}
- err := common.request_server(app.host.?, request, &app.profile.private_key)
+ _, err := request_host(app, request, &app.profile.private_key)
if err != nil {
app_set_info_bar(app, "Failed to send message.")
MESSAGE_SIZE :: 1_000 * 4
Receive_Packet_Error :: enum {
+ Packet_Empty,
Packet_Too_Large,
}
Invalid_Request,
}
+Receive_Message_Error :: enum {
+ Invalid_Type,
+}
+
Client_Request_From_Bytes_Error :: enum {
Invalid_Inner_Kind,
Invalid_Public_Key,
return nil
}
-Server_Request :: union {}
+Server_Request :: struct {}
+
+Server_Response_Inner :: union {
+ string,
+}
+
+Server_Response :: struct {
+ id: u32,
+ inner: Server_Response_Inner,
+}
+
+Server_Message :: union {
+ Server_Request,
+ Server_Response,
+}
+
+receive_packet :: proc(socket: net.Socket, buffer: []u8) -> (packet: []u8, err: Error) {
+ length_bytes: [size_of(u32)]u8
+ _ = net.recv_tcp(client, length_bytes[:]) or_return
+
+ length, _ := endian.get_u32(length_bytes[:], .Little)
+
+ if length == 0 {
+ return {}, common.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
+ }
+
+ return 0, {}, common.Receive_Packet_Error.Packet_Too_Large
+ }
+
+ _ = net.recv_tcp(client, buffer[:length]) or_return
+
+ return buffer[:length], nil
+}
import "../common"
receive_request :: proc(client: net.TCP_Socket) -> (id: u32, request: common.Client_Request, err: common.Error) {
- length_bytes: [size_of(u32)]u8
- _ = net.recv_tcp(client, length_bytes[:]) or_return
-
- length, _ := endian.get_u32(length_bytes[:], .Little)
-
- if length == 0 {
- return 0, {}, nil
- }
-
buffer: [10_000]u8
+ packet := common.receive_packet(client, buffer[:]) or_return
- if int(length) > len(buffer) {
- // Empty the socket buffer.
- for _ in 0..<length {
- _ = net.recv_tcp(client, buffer[:]) or_return
- }
-
- return 0, {}, common.Receive_Packet_Error.Packet_Too_Large
- }
-
- _ = net.recv_tcp(client, buffer[:length]) or_return
-
- id_bytes := buffer[:size_of(u32)]
+ id_bytes := packet[:size_of(u32)]
id, _ = endian.get_u32(id_bytes[:], .Little)
- request_bytes := buffer[size_of(u32):]
+ request_bytes := packet[size_of(u32):]
request, err = common.client_request_from_bytes(request_bytes)
response_stream := bytes.buffer_to_stream(&bytes_buffer)
// Message type.
- _ = io.write_byte(response_stream, 0)
+ _ = io.write_byte(response_stream, 1)
// Reponse ID.
id_bytes: [size_of(u32)]u8