{"id":18556333,"url":"https://github.com/rsocket/rsocket-rust","last_synced_at":"2025-04-12T23:34:51.252Z","repository":{"id":40616863,"uuid":"213209773","full_name":"rsocket/rsocket-rust","owner":"rsocket","description":"RSocket Rust Implementation using Tokio","archived":false,"fork":false,"pushed_at":"2024-06-26T12:28:23.000Z","size":597,"stargazers_count":213,"open_issues_count":3,"forks_count":19,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-04-12T23:34:32.238Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rsocket.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-10-06T17:10:22.000Z","updated_at":"2025-03-01T07:14:30.000Z","dependencies_parsed_at":"2024-06-26T15:39:19.140Z","dependency_job_id":null,"html_url":"https://github.com/rsocket/rsocket-rust","commit_stats":{"total_commits":164,"total_committers":9,"mean_commits":18.22222222222222,"dds":0.08536585365853655,"last_synced_commit":"822405fd6afb3e5e5fe05ed469f9151f3e8769a8"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsocket%2Frsocket-rust","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsocket%2Frsocket-rust/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsocket%2Frsocket-rust/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsocket%2Frsocket-rust/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rsocket","download_url":"https://codeload.github.com/rsocket/rsocket-rust/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248647259,"owners_count":21139081,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-06T21:29:54.905Z","updated_at":"2025-04-12T23:34:51.227Z","avatar_url":"https://github.com/rsocket.png","language":"Rust","readme":"# rsocket-rust\n\n![GitHub Workflow Status](https://github.com/rsocket/rsocket-rust/workflows/Rust/badge.svg)\n[![Build Status](https://travis-ci.com/rsocket/rsocket-rust.svg?branch=master)](https://travis-ci.com/rsocket/rsocket-rust)\n[![Crates.io](https://img.shields.io/crates/v/rsocket_rust)](https://crates.io/crates/rsocket_rust)\n[![Crates.io](https://img.shields.io/crates/d/rsocket_rust)](https://crates.io/crates/rsocket_rust)\n[![License](https://img.shields.io/github/license/rsocket/rsocket-rust.svg)](https://github.com/rsocket/rsocket-rust/blob/master/LICENSE)\n[![GitHub Release](https://img.shields.io/github/release-pre/rsocket/rsocket-rust.svg)](https://github.com/rsocket/rsocket-rust/releases)\n\n\u003e rsocket-rust is an implementation of the RSocket protocol in Rust(1.39+). It's\n\u003e an **alpha** version and still under active development. **Do not use it in a\n\u003e production environment!**\n\n## Example\n\n\u003e Here are some example codes which show how RSocket works in Rust.\n\n### Dependencies\n\nAdd dependencies in your `Cargo.toml`.\n\n```toml\n[dependencies]\ntokio = \"1.0.3\"\nrsocket_rust = \"0.7\"\n\n# add transport dependencies:\n# rsocket_rust_transport_tcp = \"0.7\"\n# rsocket_rust_transport_websocket = \"0.7\"\n```\n\n### Server\n\n```rust\nextern crate log;\n\nuse futures::executor::block_on;\nuse rsocket_rust::prelude::*;\nuse rsocket_rust::utils::EchoRSocket;\nuse rsocket_rust::Result;\nuse rsocket_rust_transport_tcp::*;\n\n#[tokio::main]\nasync fn main() -\u003e Result\u003c()\u003e {\n    env_logger::builder().format_timestamp_millis().init();\n\n    RSocketFactory::receive()\n        .transport(TcpServerTransport::from(\"127.0.0.1:7979\"))\n        .acceptor(Box::new(|setup, _sending_socket| {\n            info!(\"incoming socket: setup={:?}\", setup);\n            Ok(Box::new(block_on(async move {\n                RSocketFactory::connect()\n                    .transport(TcpClientTransport::from(\"127.0.0.1:7878\"))\n                    .acceptor(Box::new(|| Box::new(EchoRSocket)))\n                    .setup(Payload::from(\"I'm Rust!\"))\n                    .start()\n                    .await\n                    .unwrap()\n            })))\n        }))\n        .serve()\n        .await\n}\n```\n\n### Client\n\n```rust\nextern crate log;\n\nuse rsocket_rust::prelude::*;\nuse rsocket_rust::utils::EchoRSocket;\nuse rsocket_rust::Result;\nuse rsocket_rust_transport_tcp::TcpClientTransport;\n\n#[tokio::main]\nasync fn main() -\u003e Result\u003c()\u003e {\n     env_logger::builder().format_timestamp_millis().init();\n    let client = RSocketFactory::connect()\n        .transport(TcpClientTransport::from(\"127.0.0.1:7878\"))\n        .acceptor(Box::new(|| {\n            // Return a responder.\n            Box::new(EchoRSocket)\n        }))\n        .start()\n        .await\n        .expect(\"Connect failed!\");\n\n    let req = Payload::builder().set_data_utf8(\"Ping!\").build();\n\n    match client.request_response(req).await {\n        Ok(res) =\u003e info!(\"{:?}\", res),\n        Err(e) =\u003e error!(\"{}\", e),\n    }\n\n    Ok(())\n}\n```\n\n### Implement RSocket trait\n\nExample for access Redis([crates](https://crates.io/crates/redis)):\n\n\u003e NOTICE: add dependency in Cargo.toml =\u003e redis = { version = \"0.19.0\", features\n\u003e = [ \"aio\" ] }\n\n```rust\nuse std::str::FromStr;\n\nuse redis::Client as RedisClient;\nuse rsocket_rust::async_trait;\nuse rsocket_rust::prelude::*;\nuse rsocket_rust::Result;\n\n#[derive(Clone)]\npub struct RedisDao {\n    inner: RedisClient,\n}\n\n// Create RedisDao from str.\n// Example: RedisDao::from_str(\"redis://127.0.0.1\").expect(\"Connect redis failed!\");\nimpl FromStr for RedisDao {\n    type Err = redis::RedisError;\n\n    fn from_str(s: \u0026str) -\u003e std::result::Result\u003cSelf, Self::Err\u003e {\n        let client = redis::Client::open(s)?;\n        Ok(RedisDao { inner: client })\n    }\n}\n\n#[async_trait]\nimpl RSocket for RedisDao {\n    async fn request_response(\u0026self, req: Payload) -\u003e Result\u003cOption\u003cPayload\u003e\u003e {\n        let client = self.inner.clone();\n        let mut conn = client.get_async_connection().await?;\n        let value: redis::RedisResult\u003cOption\u003cString\u003e\u003e = redis::cmd(\"GET\")\n            .arg(\u0026[req.data_utf8()])\n            .query_async(\u0026mut conn)\n            .await;\n        match value {\n            Ok(Some(value)) =\u003e Ok(Some(Payload::builder().set_data_utf8(\u0026value).build())),\n            Ok(None) =\u003e Ok(None),\n            Err(e) =\u003e Err(e.into()),\n        }\n    }\n\n    async fn metadata_push(\u0026self, _req: Payload) -\u003e Result\u003c()\u003e {\n        todo!()\n    }\n\n    async fn fire_and_forget(\u0026self, _req: Payload) -\u003e Result\u003c()\u003e {\n        todo!()\n    }\n\n    fn request_stream(\u0026self, _req: Payload) -\u003e Flux\u003cResult\u003cPayload\u003e\u003e {\n        todo!()\n    }\n\n    fn request_channel(\u0026self, _reqs: Flux\u003cResult\u003cPayload\u003e\u003e) -\u003e Flux\u003cResult\u003cPayload\u003e\u003e {\n        todo!()\n    }\n}\n```\n\n## TODO\n\n- Operations\n  - [x] METADATA_PUSH\n  - [x] REQUEST_FNF\n  - [x] REQUEST_RESPONSE\n  - [x] REQUEST_STREAM\n  - [x] REQUEST_CHANNEL\n- More Operations\n  - [x] Error\n  - [ ] Cancel\n  - [x] Fragmentation\n  - [ ] Resume\n  - [x] Keepalive\n- QoS\n  - [ ] RequestN\n  - [ ] Lease\n- Transport\n  - [x] TCP\n  - [x] Websocket\n  - [x] WASM\n- Reactor\n  - [ ] ...\n- High Level APIs\n  - [x] Client\n  - [x] Server\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frsocket%2Frsocket-rust","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frsocket%2Frsocket-rust","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frsocket%2Frsocket-rust/lists"}