Projet d'apprentissage de Rust et de webassembly via une application P2P. Chaque developpement est live sur twitch.
Les features envisagees:
- Chat textuel
- Chat video
- Partage de fichier
- Wizz ❤️
-
Notre projet
- P2P chat / video / file share en Rust compilation en webassembly (wasm)
- Apprentissage de Rust
- Apprentissage de webassembly
-
Installation RUST
-
Rust
- Traits:
- Closures:
RAS
- Design HTML / CSS
- Hierarchie de composants
- Passage d'informations entre composants
-
Design complet page (chat mode mais pas beau)
-
Exploration CSS / YEW
-
Structure pour l'envoi de message
-
Rust
-
Console logging => Ne semble pas fonctionner avec std-web
-
Cargo-web
- Ne fonctionne pas avec web-sys
- Derniere MAJ il y a 9 mois
-
Wasm-bindgen / Wasm-pack
- Support par rustwasm group
- Fonctionne avec web-sys
- Derniere maj il y a 30min
-
Plus possible de lancer le projet dans l'etat actuel
- Explication rework vers web-sys
- Installation de wasm bindgen :
cargo install wasm-bindgen-cli
- Remove de cargo-web
cargo uninstall cargo-web
🙏 - Change the Cargo.toml to use websys + wasm-bindgen
cargo build --features "console_error_panic_hook" --target wasm32-unknown-unknown
wasm-bindgen --target web --no-typescript --out-dir static/ --out-name app target/wasm32-unknown-unknown/debug/prust.wasm
- cd static && python3 -m http.server
- Installation de wasm bindgen :
- Console Logging / Debugging
- Rework textarea via reference
- Communication entre composants => envoyer le contenu du textarea dans le composant de conversation
- Utilisation d'un systeme d'acteurs ?
-
Tooling
- (Cargo watch)[https://github.com/passcod/cargo-watch] => Now !
- (Cargo makefile)[https://github.com/sagiegurari/cargo-make] => Soon ?
- Notre commande watch
cargo watch -x 'build --features "console_error_panic_hook" --target wasm32-unknown-unknown' -s 'wasm-bindgen --target web --no-typescript --out-dir static/ --out-name app target/wasm32-unknown-unknown/debug/prust.wasm'
-
Communication entre composants => envoyer le contenu du textarea dans le composant de conversation
- Gestion des callbacks parent / enfant
- Regarder plus en détail ce qu'est un Callback en RUST
- Piste : (Elm}[https://elm-lang.org/] (Yew est apparemment inspiré de Elm)
- (Test in doc)[https://doc.rust-lang.org/rustdoc/documentation-tests.html]
-
Callback enfant1 => parent
- example: https://github.com/yewstack/yew/tree/master/examples/node_refs
- Utilisation de callback et de emit() pour passer les informations entre les composants
-
Callback parent => enfant2
- Utilisation des props pour trigger la méthode
change
du composant enfant - change
- Utilisation des props pour trigger la méthode
-
Rust
- LinkedList
- Vectors doc rustbook
RAS
- If let cleanup
- Nettoyer Input text on send => set_value sur node_ref.
- CTRL + ENTER pour envoyer un message (ENTER ne fait pas d'erreurs console)
- Formatting des messages via HTML dans conversation.rs
- Structure custom pour afficher le sender (moi / autre)
- Historisation ? Page de list de message par ex.
-
Yew
-
Rust
- If let
- Pour voir la doc de notre projet et ses dépendances :
cargo doc --open
- Display trait
- Formating des messages via HTML
- Split main / lib
- Formatting messages HTML en fonction de la provenance
- Mock envoit message reseau
- Un peu de borrowing
- Discussion autour du P2P et next steps
- Code cleaning
- Utiliser une implémentation sans le trait Component pour ChatMessage
- Gérer les lifetimes https://doc.rust-lang.org/1.9.0/book/lifetimes.html
- P2P code
- Récap WebRTC
- Création d'une RtcPeerConnection
- Garder les sauts de ligne
- Full connexion WebRTC
- Create offer call
- Re-explication diagramme de sequence
- Finalisation create_offer et explication lifetime / Box
- Le plan de la base du feu
- parsing d'une JSValue vers un objet RTCSessionInitDescription dans le but de set la local_description
- Pokiro
- Problème de lifetime modification de la connection dans closure
- Envoi offre
- Ajouter les éléments pour le signaling manuel
- Signaling server WebRTC, Thomas nous dit tout
- Coder en Rust, après les vacances ...
- Nouvelles interfaces
- Explications WebRTC
- Début de la structure de modules
- Début du composant de connexion
- Wtf : Recursive limit ?
- Belle structure de module
- OK
- Début Websocket + WebRTC !
- Presentation modifications server
- WebSocket => Ajout des premiers messages
- Serialisation:
- Serde: https://serde.rs/
- Deserialization en fonction du type: https://serde.rs/enum-representations.html#externally-tagged
- Refacto dans utils
- améliorer la lisibilité du code (gestion des closures)
- type alias sur les cast des closures
- continuer la gestion des websocket (améliorer la serde)
-
Misc
-
PRUST
- Parsing du message reçu : dyn_into => JsString
- Parsing de la JsString avec
serde_json::from_str::
=> nos types
- New way to start the project
- cargo make
cargo make --makefile Makefile.toml dev
cargo make --makefile Makefile.toml serve
- type alias sur les cast des closures
- améliorer serde (implement From for SocketMessage ?)
- continuer la gestion des websocket
- améliorer la lisibilité du code (gestion des closures) // Peut on les sortir
- fix
cargo make
- type alias ok
- amélioration serde
- implémentation du trait
TryFrom
- management des erreurs custom
- utilisation de l'opérateur
?
- problème Object VS String VS Websockets
- implémentation du trait
- cargo make concurrence entre build / wasm-bind (lol)
- cleanup des TODOs
- améliorer la lisibilité du code (gestion des closures)
- continuer la gestion des websocket
- SDP implement
- Premier message envoyé ?
- Cleanup handle_message function (trop grosse)
- Ajout de nouveau handlers
- Prise en compte de callbacks WebRTC:
-
on_ice_candidate_callback
-
on_signaling_callback
- Raffraîchissement WebRTC
- Prise en compte de callbacks WebRTC:
-
on_negociation_needed
- Faire l'implémentation de
handle_sdp_message
- Premier message envoyé ?
- on_negotiation_needed : OK
- start handle_sdp_message : ONGOING
- Terminer l'implémentation de
handle_sdp_message
- Premier message envoyé ?
- handle_sdp_message = quasi OK
- problème référence socket :(
- Fix sockets ? OK !
- block_on: NOP NOP NOP
- Problème avec borrow_mut T_T => OK !
- Correction de la perte de types du RTCSessionDescription
- (mapping serde)
- Trait TryFrom
- Définition de l'expression "sur des chapeaux de roues"
- ICE candidates:
- https://media.prod.mdn.mozit.cloud/attachments/2016/01/27/12365/b5bcd9ecac08ae0bc89b6a3e08cfe93c/WebRTC%20-%20ICE%20Candidate%20Exchange.svg
- Faire le mapper pour les ICECandidates (on perd des informations)
- Ça fucking marche !
- Merci la vie.
- Display du message dans la chatbox
- Présentation du prochain projet
- Gestion des dates:
- Vecteurs:
- Merge => extends / append
- Sort => sort_by
- Utiliser des Closures Rust en JS
- Rust Nightly => Finalement pas utile car pas de closures Rust/Js
- Agent Yew
- Annoter les étapes ICE
- Extraire le code de l'agent dans des fichiers séparés
- Utiliser l'agent pour envoyer les messages au lieu des properties (petit warn a cause de yewstack/yew#870)
$ cargo clippy
est content- Fonctions pour get les callbacks
- La serialization des enums est toujours un mystère
- Gestion des erreurs / exceptions
- Notification connexion WebRTC OK
❤️