29 个版本 (10 个重大更新)

0.10.0 2024 年 8 月 12 日
0.9.5 2024 年 6 月 24 日
0.8.0 2024 年 6 月 10 日

#1148 in 网络编程

Download history 253/week @ 2024-05-13 657/week @ 2024-05-20 796/week @ 2024-05-27 708/week @ 2024-06-03 216/week @ 2024-06-10 655/week @ 2024-06-17 145/week @ 2024-06-24 119/week @ 2024-07-01 51/week @ 2024-07-29 124/week @ 2024-08-12

每月 175 次下载

MIT 许可证

89KB
1K SLoC

Rust 581 SLoC // 0.1% comments TypeScript 524 SLoC // 0.2% comments JavaScript 9 SLoC // 0.4% comments Shell 6 SLoC Svelte 3 SLoC

Qubit:无缝 RPC For Rust & TypeScript

crates.io docs.rs npm checks

厌倦了与 RPC 模板代码的斗争?Qubit 简化了 Rust 服务与 TypeScript 客户端之间的通信,提供类型安全且功能丰富的开发体验,让您可以专注于构建出色的应用程序。

特性

  • 生成的类型安全客户端:告别手动类型定义,Qubit 根据您的 Rust API 自动生成 TypeScript 客户端,确保开发过程流畅。

  • 订阅:使用订阅构建实时、数据驱动的应用程序,允许 Rust 服务器直接将数据推送到连接的 TypeScript 客户端。

  • 构建模块化 API:将 API 处理器组织到嵌套路由中,确保在服务扩展时保持简单性和可维护性。

  • Serde 兼容性:利用 Serde 在 Rust 和 TypeScript 之间进行无缝数据序列化和反序列化。

  • 基于 JSONRPC 2.0 构建:需要非 TypeScript 客户端?使用任何语言中的 JSONRPC 客户端,通过 WebSocket 或 HTTP。

  • 经过验证的基础:基于用于类型生成的 ts-rs 和作为 JSONRPC 实现的 jsonrpsee 等已建立的库构建。

入门

  1. 添加所需的依赖项
# Cargo.toml
[dependencies]
qubit = "0.6.1"

ts-rs = "8.1.0" # Required to generate TS types
serde = { version = "1.0", features = ["derive"] } # Required for serialisable types
futures = "0.3.30" # Required for streaming functionality

tokio = { version = "1.38", features = ["full"] }
axum = "0.7"
hyper = { version = "1.0", features = ["server"] }
pnpm i @qubit-rs/client@latest
  1. 设置 Qubit 路由,并保存生成的类型
#[handler(query)]
async fn hello_world() -> String {
    "Hello, world!".to_string()
}

let router = Router::new()
    .handler(hello_world);

router.write_bindings_to_dir("./bindings");
  1. 将 Qubit 路由附加到 Axum 路由,并启动它
// Create a service and handle
let (qubit_service, qubit_handle) = router.to_service(());

// Nest into an Axum router
let axum_router = axum::Router::<()>::new()
    .nest_service("/rpc", qubit_service);

// Start a Hyper server
axum::serve(
    tokio::net::TcpListener::bind(&SocketAddr::from(([127, 0, 0, 1], 9944)))
        .await
        .unwrap(),
    axum_router,
)
.await
.unwrap();

qubit_handle.stop().unwrap();
  1. 从 TypeScript 客户端发送请求
// Import transport from client, and generated server type
import { build_client, http } from "@qubit-rs/client";
import type { QubitServer } from "./bindings";

// Connect with the API
const api = build_client<QubitServer>(http("https://127.0.0.1:9944/rpc"));

// Call the handlers
const message = await api.hello_world.query();
console.log("received from server:", message);

示例

查看 examples 目录中的所有示例。

常见问题解答

Qubit 是什么意思?

“Qubit”一词指的是量子信息的基本单位。正如量子比特可以存在于状态的叠加中一样,Qubit 在 Rust 和 TypeScript 之间架起了一座桥梁,使开发者能够创建真正出色的应用程序。

现有技术

  • rspc:具有相似的概念,但是使用定制的解决方案从Rust结构体生成TypeScript类型,这并不完全兼容Serde的所有序列化和反序列化结构体的功能。

  • trpc:无需介绍,但它仅限于TypeScript后端,对于Rust开发者来说相对无用。

依赖项

~12–22MB
~306K SLoC