diff --git a/application/.gitignore b/application/.gitignore
new file mode 100644
index 0000000..1521c8b
--- /dev/null
+++ b/application/.gitignore
@@ -0,0 +1 @@
+dist
diff --git a/application/Cargo.toml b/application/Cargo.toml
index c1a43c2..d19efc4 100644
--- a/application/Cargo.toml
+++ b/application/Cargo.toml
@@ -6,3 +6,9 @@ edition = "2021"
[dependencies]
yew = { version = "0.21", features = ["csr"] }
yew-router = "0.18.0"
+gloo-net = "0.5.0"
+futures = "0.3.30"
+serde_json = "1.0.113"
+serde = "1.0.196"
+log = "0.4.6"
+wasm-logger = "0.2.0"
diff --git a/application/src/main.rs b/application/src/main.rs
index 5da4e12..c86de8c 100644
--- a/application/src/main.rs
+++ b/application/src/main.rs
@@ -1,3 +1,4 @@
+use serde::{Deserialize, Serialize};
use yew::prelude::*;
use yew_router::prelude::*;
@@ -6,6 +7,7 @@ use pages::*;
mod components;
mod pages;
+mod util;
#[derive(Clone, Routable, PartialEq)]
pub enum Route {
@@ -31,19 +33,65 @@ fn switch(route: Route) -> Html {
}
}
-#[function_component(App)]
-fn app() -> Html {
- html! {
-
-
-
- render={switch} /> // <- must be child of
-
-
-
+#[derive(Serialize, Deserialize)]
+#[serde(rename_all = "lowercase")]
+pub enum MsgTypes {
+ Users,
+ Register,
+ Message,
+}
+
+#[derive(Serialize, Deserialize)]
+#[serde(rename_all = "camelCase")]
+struct WebSocketMessage {
+ message_type: MsgTypes,
+ data_array: Option>,
+ data: Option,
+}
+
+#[derive(PartialEq, Properties, Default)]
+struct AppProps;
+
+struct App;
+
+impl Component for App {
+ type Message = ();
+ type Properties = AppProps;
+
+ fn create(_ctx: &Context) -> Self {
+ let wss = util::surrealdb::SurrealWebsocketService::new();
+
+ let message = WebSocketMessage {
+ message_type: MsgTypes::Register,
+ data: Some("Hi!".to_string()),
+ data_array: None,
+ };
+
+ if let Ok(_) = wss
+ .tx
+ .clone()
+ .try_send(serde_json::to_string(&message).unwrap())
+ {
+ log::debug!("Message send successfully")
+ }
+
+ App
+ }
+
+ fn view(&self, _ctx: &Context) -> Html {
+ html! {
+
+
+
+ render={switch} /> // <- must be child of
+
+
+
+ }
}
}
fn main() {
+ wasm_logger::init(wasm_logger::Config::default());
yew::Renderer::::new().render();
}
diff --git a/application/src/util.rs b/application/src/util.rs
new file mode 100644
index 0000000..9538350
--- /dev/null
+++ b/application/src/util.rs
@@ -0,0 +1 @@
+pub mod surrealdb;
diff --git a/application/src/util/surrealdb.rs b/application/src/util/surrealdb.rs
new file mode 100644
index 0000000..9b44d08
--- /dev/null
+++ b/application/src/util/surrealdb.rs
@@ -0,0 +1,45 @@
+use futures::{channel::mpsc::Sender, stream::SplitSink, SinkExt, StreamExt};
+use gloo_net::websocket::{futures::WebSocket, Message};
+use yew::platform::spawn_local;
+
+pub struct SurrealWebsocketService {
+ pub tx: Sender,
+}
+
+impl SurrealWebsocketService {
+ pub fn new() -> Self {
+ let ws = WebSocket::open("ws://localhost:80/rpc").unwrap();
+ let (mut write, mut read) = ws.split();
+
+ let (in_tx, mut in_rx) = futures::channel::mpsc::channel::(1000);
+
+ spawn_local(async move {
+ while let Some(s) = in_rx.next().await {
+ log::debug!("got event from channel! {}", s);
+ write.send(Message::Text(s)).await.unwrap();
+ }
+ });
+
+ spawn_local(async move {
+ while let Some(msg) = read.next().await {
+ match msg {
+ Ok(Message::Text(data)) => {
+ log::debug!("from websocket: {}", data);
+ }
+ Ok(Message::Bytes(b)) => {
+ let decoded = std::str::from_utf8(&b);
+ if let Ok(val) = decoded {
+ log::debug!("from websocket: {}", val);
+ }
+ }
+ Err(e) => {
+ log::error!("ws: {:?}", e)
+ }
+ }
+ }
+ log::debug!("WebSocket closed");
+ });
+
+ Self { tx: in_tx }
+ }
+}
diff --git a/flake.nix b/flake.nix
index 0105138..fcfcbaa 100644
--- a/flake.nix
+++ b/flake.nix
@@ -28,13 +28,9 @@
trunk
dart-sass
rust-analyzer
- openssl
- pkg-config
- cargo-insta
- llvmPackages_latest.llvm
- llvmPackages_latest.bintools
- zlib.out
- llvmPackages_latest.lld
+ llvmPackages.clangNoLibc
+ llvmPackages.lld
+ dap
(rust-bin.stable.latest.default.override {
extensions= [ "rust-src" "rust-analyzer" ];
targets = [ "wasm32-unknown-unknown" ];
@@ -44,6 +40,8 @@
shellHook = ''
alias grep=ripgrep
export PATH=$PATH:''${CARGO_HOME:-~/.cargo}/bin
+ export CC=clang
+ export CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_LINKER=lld
'';
};
}