Skip to content

Commit 57c43a1

Browse files
authored
Feature/client socket adjustments (#212)
* Changed default listening port to something slightly more meaningful * Removed TCP socket and made websocket the default option (as opposed to 'None') * Updated template * Updated ReceivedBuffer to allow direct message forwarding * ignoring vscode directory * Push messages mechanism for websocket client-clients * Removed flawed chunking example * ... but added bunch of websocket examples in return! * Moves js example directory * Cargo fmt * Removed old listener code
1 parent e7b8ab8 commit 57c43a1

36 files changed

+1110
-957
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ target
77
.env
88
/.vscode/settings.json
99
validator/.vscode
10-
sample-configs/validator-config.toml
10+
sample-configs/validator-config.toml
11+
.vscode

clients/desktop/examples/chunking.rs

-69
This file was deleted.

clients/desktop/examples/dummy_file

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam quis efficitur neque. Quisque aliquet vulputate ante, eget vehicula odio feugiat ac. Nulla ut mattis magna. Aenean tincidunt quis nulla eget eleifend. Cras in pretium sem. Nunc lorem metus, blandit sit amet egestas ut, feugiat quis tellus. Aenean tristique, enim a tincidunt condimentum, eros est blandit nunc, id viverra metus erat at nulla. Vivamus at tellus sodales, feugiat odio vel, laoreet neque. Vivamus posuere nulla ac sodales bibendum.
2+
3+
Vestibulum pulvinar nisi non ultricies egestas. Integer finibus ultrices justo vitae suscipit. Etiam interdum eu justo vel interdum. Morbi sagittis ac nisl quis consequat. Mauris dapibus ut risus ac facilisis. Pellentesque non tortor feugiat, consectetur arcu vel, ullamcorper sapien. Proin sodales purus non orci bibendum, sit amet ultrices justo ullamcorper. Nullam ac risus ac justo ultricies efficitur auctor nec arcu. Etiam sed finibus felis. Suspendisse potenti. Phasellus malesuada velit ac ullamcorper egestas. Sed elementum diam ut est gravida ultricies.
4+
5+
Pellentesque sed metus massa. Cras imperdiet lacus sit amet dolor aliquam, luctus posuere justo hendrerit. Morbi augue ex, gravida a metus sed, scelerisque euismod lacus. Nam consequat sapien ac pellentesque sagittis. Morbi a ultrices massa, vel aliquet ex. Maecenas ac sem diam. Nunc sed erat et ipsum volutpat auctor. Etiam elit felis, commodo vitae ipsum ac, fermentum lobortis arcu. Aliquam eu tempus enim. Curabitur vulputate imperdiet aliquam. Morbi iaculis rhoncus risus at malesuada. Donec accumsan feugiat ligula ut facilisis. Nunc porttitor sit amet est eget malesuada. Sed sed consectetur augue, non dapibus orci. Mauris aliquam pellentesque quam, sit amet pellentesque velit cursus vitae. Morbi sit amet molestie risus.
6+
7+
Nam gravida non ligula a egestas. Fusce sodales, purus id rhoncus mattis, purus est vehicula urna, vel finibus augue velit et est. Donec dictum erat eleifend lobortis iaculis. Praesent id venenatis ante. Donec feugiat, ipsum eget porttitor pulvinar, nisl odio posuere lorem, ut placerat elit nulla a ligula. Suspendisse nec nibh tincidunt, sollicitudin mi a, volutpat ligula. In maximus quam lacus, eget semper dolor sagittis sit amet.
8+
9+
In vitae hendrerit est, quis facilisis dui. In eu ante enim. Nullam hendrerit odio sit amet odio tincidunt eleifend. Aliquam erat volutpat. Curabitur commodo, purus pharetra lobortis rhoncus, tortor massa imperdiet nisl, vel dignissim tortor sem at orci. Aliquam maximus lobortis lacus, eu porttitor purus dapibus ut. Praesent at dapibus felis, efficitur blandit tortor. In hac habitasse platea dictumst. Aenean ultrices, nisl a pretium sagittis, tellus sapien mollis erat, eu consectetur erat mauris sed libero. Duis feugiat dapibus mi, vel ornare velit vehicula mattis. Ut suscipit pharetra leo et sollicitudin.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam quis efficitur neque. Quisque aliquet vulputate ante, eget vehicula odio feugiat ac. Nulla ut mattis magna. Aenean tincidunt quis nulla eget eleifend. Cras in pretium sem. Nunc lorem metus, blandit sit amet egestas ut, feugiat quis tellus. Aenean tristique, enim a tincidunt condimentum, eros est blandit nunc, id viverra metus erat at nulla. Vivamus at tellus sodales, feugiat odio vel, laoreet neque. Vivamus posuere nulla ac sodales bibendum.
2+
3+
Vestibulum pulvinar nisi non ultricies egestas. Integer finibus ultrices justo vitae suscipit. Etiam interdum eu justo vel interdum. Morbi sagittis ac nisl quis consequat. Mauris dapibus ut risus ac facilisis. Pellentesque non tortor feugiat, consectetur arcu vel, ullamcorper sapien. Proin sodales purus non orci bibendum, sit amet ultrices justo ullamcorper. Nullam ac risus ac justo ultricies efficitur auctor nec arcu. Etiam sed finibus felis. Suspendisse potenti. Phasellus malesuada velit ac ullamcorper egestas. Sed elementum diam ut est gravida ultricies.
4+
5+
Pellentesque sed metus massa. Cras imperdiet lacus sit amet dolor aliquam, luctus posuere justo hendrerit. Morbi augue ex, gravida a metus sed, scelerisque euismod lacus. Nam consequat sapien ac pellentesque sagittis. Morbi a ultrices massa, vel aliquet ex. Maecenas ac sem diam. Nunc sed erat et ipsum volutpat auctor. Etiam elit felis, commodo vitae ipsum ac, fermentum lobortis arcu. Aliquam eu tempus enim. Curabitur vulputate imperdiet aliquam. Morbi iaculis rhoncus risus at malesuada. Donec accumsan feugiat ligula ut facilisis. Nunc porttitor sit amet est eget malesuada. Sed sed consectetur augue, non dapibus orci. Mauris aliquam pellentesque quam, sit amet pellentesque velit cursus vitae. Morbi sit amet molestie risus.
6+
7+
Nam gravida non ligula a egestas. Fusce sodales, purus id rhoncus mattis, purus est vehicula urna, vel finibus augue velit et est. Donec dictum erat eleifend lobortis iaculis. Praesent id venenatis ante. Donec feugiat, ipsum eget porttitor pulvinar, nisl odio posuere lorem, ut placerat elit nulla a ligula. Suspendisse nec nibh tincidunt, sollicitudin mi a, volutpat ligula. In maximus quam lacus, eget semper dolor sagittis sit amet.
8+
9+
In vitae hendrerit est, quis facilisis dui. In eu ante enim. Nullam hendrerit odio sit amet odio tincidunt eleifend. Aliquam erat volutpat. Curabitur commodo, purus pharetra lobortis rhoncus, tortor massa imperdiet nisl, vel dignissim tortor sem at orci. Aliquam maximus lobortis lacus, eu porttitor purus dapibus ut. Praesent at dapibus felis, efficitur blandit tortor. In hac habitasse platea dictumst. Aenean ultrices, nisl a pretium sagittis, tellus sapien mollis erat, eu consectetur erat mauris sed libero. Duis feugiat dapibus mi, vel ornare velit vehicula mattis. Ut suscipit pharetra leo et sollicitudin.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"github.com/btcsuite/btcutil/base58"
7+
"github.com/gorilla/websocket"
8+
"io/ioutil"
9+
)
10+
11+
func getSelfAddress(conn *websocket.Conn) string {
12+
selfAddressRequest, err := json.Marshal(map[string]string{"type": "selfAddress"})
13+
if err != nil {
14+
panic(err)
15+
}
16+
17+
if err = conn.WriteMessage(websocket.TextMessage, []byte(selfAddressRequest)); err != nil {
18+
panic(err)
19+
}
20+
21+
responseJSON := make(map[string]interface{})
22+
err = conn.ReadJSON(&responseJSON)
23+
if err != nil {
24+
panic(err)
25+
}
26+
27+
return responseJSON["address"].(string)
28+
}
29+
30+
func main() {
31+
uri := "ws://localhost:1977"
32+
33+
conn, _, err := websocket.DefaultDialer.Dial(uri, nil)
34+
if err != nil {
35+
panic(err)
36+
}
37+
defer conn.Close()
38+
39+
selfAddress := getSelfAddress(conn)
40+
fmt.Printf("our address is: %v\n", selfAddress)
41+
decodedAddress := base58.Decode(selfAddress)
42+
43+
read_data, err := ioutil.ReadFile("dummy_file")
44+
if err != nil {
45+
panic(err)
46+
}
47+
48+
payload := append(decodedAddress[:], read_data[:]...)
49+
fmt.Printf("sending content of 'dummy file' over the mix network...\n")
50+
if err = conn.WriteMessage(websocket.BinaryMessage, payload); err != nil {
51+
panic(err)
52+
}
53+
sendConfirmationJSON := make(map[string]interface{})
54+
err = conn.ReadJSON(&sendConfirmationJSON)
55+
if err != nil {
56+
panic(err)
57+
}
58+
if sendConfirmationJSON["type"].(string) != "send" {
59+
panic("invalid send confirmation")
60+
}
61+
62+
fmt.Printf("waiting to receive a message from the mix network...\n")
63+
_, receivedMessage, err := conn.ReadMessage()
64+
if err != nil {
65+
panic(err)
66+
}
67+
68+
fmt.Printf("writing the file back to the disk!\n")
69+
ioutil.WriteFile("received_file", receivedMessage, 0644)
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
7+
"github.com/gorilla/websocket"
8+
)
9+
10+
func getSelfAddress(conn *websocket.Conn) string {
11+
selfAddressRequest, err := json.Marshal(map[string]string{"type": "selfAddress"})
12+
if err != nil {
13+
panic(err)
14+
}
15+
16+
if err = conn.WriteMessage(websocket.TextMessage, []byte(selfAddressRequest)); err != nil {
17+
panic(err)
18+
}
19+
20+
responseJSON := make(map[string]interface{})
21+
err = conn.ReadJSON(&responseJSON)
22+
if err != nil {
23+
panic(err)
24+
}
25+
26+
return responseJSON["address"].(string)
27+
}
28+
29+
func main() {
30+
message := "Hello Nym!"
31+
32+
uri := "ws://localhost:1977"
33+
34+
conn, _, err := websocket.DefaultDialer.Dial(uri, nil)
35+
if err != nil {
36+
panic(err)
37+
}
38+
defer conn.Close()
39+
40+
selfAddress := getSelfAddress(conn)
41+
fmt.Printf("our address is: %v\n", selfAddress)
42+
sendRequest, err := json.Marshal(map[string]string{"type": "send", "recipient": selfAddress, "message": message})
43+
if err != nil {
44+
panic(err)
45+
}
46+
47+
fmt.Printf("sending '%v' over the mix network...\n", message)
48+
if err = conn.WriteMessage(websocket.TextMessage, []byte(sendRequest)); err != nil {
49+
panic(err)
50+
}
51+
52+
sendConfirmationJSON := make(map[string]interface{})
53+
err = conn.ReadJSON(&sendConfirmationJSON)
54+
if err != nil {
55+
panic(err)
56+
}
57+
if sendConfirmationJSON["type"].(string) != "send" {
58+
panic("invalid send confirmation")
59+
}
60+
61+
fmt.Printf("waiting to receive a message from the mix network...\n")
62+
_, receivedMessage, err := conn.ReadMessage()
63+
if err != nil {
64+
panic(err)
65+
}
66+
fmt.Printf("received %v from the mix network!\n", string(receivedMessage))
67+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam quis efficitur neque. Quisque aliquet vulputate ante, eget vehicula odio feugiat ac. Nulla ut mattis magna. Aenean tincidunt quis nulla eget eleifend. Cras in pretium sem. Nunc lorem metus, blandit sit amet egestas ut, feugiat quis tellus. Aenean tristique, enim a tincidunt condimentum, eros est blandit nunc, id viverra metus erat at nulla. Vivamus at tellus sodales, feugiat odio vel, laoreet neque. Vivamus posuere nulla ac sodales bibendum.
2+
3+
Vestibulum pulvinar nisi non ultricies egestas. Integer finibus ultrices justo vitae suscipit. Etiam interdum eu justo vel interdum. Morbi sagittis ac nisl quis consequat. Mauris dapibus ut risus ac facilisis. Pellentesque non tortor feugiat, consectetur arcu vel, ullamcorper sapien. Proin sodales purus non orci bibendum, sit amet ultrices justo ullamcorper. Nullam ac risus ac justo ultricies efficitur auctor nec arcu. Etiam sed finibus felis. Suspendisse potenti. Phasellus malesuada velit ac ullamcorper egestas. Sed elementum diam ut est gravida ultricies.
4+
5+
Pellentesque sed metus massa. Cras imperdiet lacus sit amet dolor aliquam, luctus posuere justo hendrerit. Morbi augue ex, gravida a metus sed, scelerisque euismod lacus. Nam consequat sapien ac pellentesque sagittis. Morbi a ultrices massa, vel aliquet ex. Maecenas ac sem diam. Nunc sed erat et ipsum volutpat auctor. Etiam elit felis, commodo vitae ipsum ac, fermentum lobortis arcu. Aliquam eu tempus enim. Curabitur vulputate imperdiet aliquam. Morbi iaculis rhoncus risus at malesuada. Donec accumsan feugiat ligula ut facilisis. Nunc porttitor sit amet est eget malesuada. Sed sed consectetur augue, non dapibus orci. Mauris aliquam pellentesque quam, sit amet pellentesque velit cursus vitae. Morbi sit amet molestie risus.
6+
7+
Nam gravida non ligula a egestas. Fusce sodales, purus id rhoncus mattis, purus est vehicula urna, vel finibus augue velit et est. Donec dictum erat eleifend lobortis iaculis. Praesent id venenatis ante. Donec feugiat, ipsum eget porttitor pulvinar, nisl odio posuere lorem, ut placerat elit nulla a ligula. Suspendisse nec nibh tincidunt, sollicitudin mi a, volutpat ligula. In maximus quam lacus, eget semper dolor sagittis sit amet.
8+
9+
In vitae hendrerit est, quis facilisis dui. In eu ante enim. Nullam hendrerit odio sit amet odio tincidunt eleifend. Aliquam erat volutpat. Curabitur commodo, purus pharetra lobortis rhoncus, tortor massa imperdiet nisl, vel dignissim tortor sem at orci. Aliquam maximus lobortis lacus, eu porttitor purus dapibus ut. Praesent at dapibus felis, efficitur blandit tortor. In hac habitasse platea dictumst. Aenean ultrices, nisl a pretium sagittis, tellus sapien mollis erat, eu consectetur erat mauris sed libero. Duis feugiat dapibus mi, vel ornare velit vehicula mattis. Ut suscipit pharetra leo et sollicitudin.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
2+
import asyncio
3+
import base58
4+
import json
5+
import websockets
6+
7+
self_address_request = json.dumps({
8+
"type": "selfAddress"
9+
})
10+
11+
12+
async def send_file():
13+
uri = "ws://localhost:1977"
14+
async with websockets.connect(uri) as websocket:
15+
await websocket.send(self_address_request)
16+
self_address = json.loads(await websocket.recv())
17+
print("our address is: {}".format(self_address["address"]))
18+
19+
bin_payload = bytearray(base58.b58decode(self_address["address"]))
20+
with open("dummy_file", "rb") as input_file:
21+
read_data = input_file.read()
22+
bin_payload += read_data
23+
24+
print("sending content of 'dummy_file' over the mix network...")
25+
await websocket.send(bin_payload)
26+
msg_send_confirmation = json.loads(await websocket.recv())
27+
assert msg_send_confirmation["type"], "send"
28+
29+
print("waiting to receive the 'dummy_file' from the mix network...")
30+
received_data = await websocket.recv()
31+
with open("received_file", "wb") as output_file:
32+
print("writing the file back to the disk!")
33+
output_file.write(received_data)
34+
35+
asyncio.get_event_loop().run_until_complete(send_file())
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
2+
import asyncio
3+
import base58
4+
import json
5+
import websockets
6+
7+
self_address_request = json.dumps({
8+
"type": "selfAddress"
9+
})
10+
11+
12+
async def send_file():
13+
message = "Hello Nym!"
14+
15+
uri = "ws://localhost:1977"
16+
async with websockets.connect(uri) as websocket:
17+
await websocket.send(self_address_request)
18+
self_address = json.loads(await websocket.recv())
19+
print("our address is: {}".format(self_address["address"]))
20+
21+
text_send = json.dumps({
22+
"type": "send",
23+
"message": message,
24+
"recipient": self_address["address"]
25+
})
26+
27+
print("sending '{}' over the mix network...".format(message))
28+
await websocket.send(text_send)
29+
msg_send_confirmation = json.loads(await websocket.recv())
30+
assert msg_send_confirmation["type"], "send"
31+
32+
print("waiting to receive a message from the mix network...")
33+
received_message = await websocket.recv()
34+
print("received {} from the mix network!".format(received_message))
35+
36+
asyncio.get_event_loop().run_until_complete(send_file())
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
use bs58;
2+
use futures::{SinkExt, StreamExt};
3+
use nym_client::websocket::{BinaryClientRequest, ClientRequest, ServerResponse};
4+
use nymsphinx::DestinationAddressBytes;
5+
use std::convert::TryFrom;
6+
use tokio_tungstenite::{connect_async, tungstenite::protocol::Message};
7+
#[tokio::main]
8+
async fn main() {
9+
let uri = "ws://localhost:1977";
10+
let (mut ws_stream, _) = connect_async(uri).await.unwrap();
11+
12+
let self_address_request = ClientRequest::SelfAddress;
13+
ws_stream.send(self_address_request.into()).await.unwrap();
14+
15+
let raw_response = ws_stream.next().await.unwrap().unwrap();
16+
// what we received now is just a json, but we know it's exact format
17+
// so might as well use that
18+
let response = match raw_response {
19+
Message::Text(txt_msg) => ServerResponse::try_from(txt_msg).unwrap(),
20+
_ => panic!("received an unexpected response type!"),
21+
};
22+
23+
let self_address = match response {
24+
ServerResponse::SelfAddress { address } => address,
25+
_ => panic!("received an unexpected response type!"),
26+
};
27+
println!("our address is: {}", self_address.clone());
28+
29+
let mut address_bytes = [0; 32];
30+
bs58::decode(self_address).into(&mut address_bytes).unwrap();
31+
32+
// this is equivalent to just sending bs58 decoding of the address, which is always 32 bytes
33+
let decoded_address = DestinationAddressBytes::from_bytes(address_bytes);
34+
let read_data = std::fs::read("examples/dummy_file").unwrap();
35+
36+
let send_request = BinaryClientRequest::Send {
37+
recipient_address: decoded_address,
38+
data: read_data,
39+
};
40+
41+
println!("sending content of 'dummy_file' over the mix network...");
42+
ws_stream.send(send_request.into()).await.unwrap();
43+
44+
let raw_send_confirmation = ws_stream.next().await.unwrap().unwrap();
45+
let _send_confirmation = match raw_send_confirmation {
46+
Message::Text(txt_msg) => match ServerResponse::try_from(txt_msg).unwrap() {
47+
ServerResponse::Send => (),
48+
_ => panic!("received an unexpected response type!"),
49+
},
50+
_ => panic!("received an unexpected response type!"),
51+
};
52+
53+
println!("waiting to receive the 'dummy_file' from the mix network...");
54+
let raw_message = ws_stream.next().await.unwrap().unwrap();
55+
let message = match raw_message {
56+
Message::Binary(bin_payload) => bin_payload,
57+
_ => panic!("received an unexpected response type!"),
58+
};
59+
60+
println!("writing the file back to the disk!");
61+
std::fs::write("examples/received_file", message).unwrap();
62+
}

0 commit comments

Comments
 (0)