7 个版本
0.1.6 | 2021年7月23日 |
---|---|
0.1.5 | 2021年7月23日 |
0.1.2 | 2021年4月21日 |
0.1.1 | 2020年11月26日 |
#1558 in 开发工具
145KB
4K SLoC
Webwire 命令行界面
Webwire 是一个 基于合约的API系统,它具有接口描述语言、网络协议和服务器和客户端的代码生成器。
此仓库包含用于验证Webwire IDL文件并生成代码和文档的 命令行界面。
要了解有关Webwire的更多信息,请访问文档仓库 webwire/webwire-docs。
示例
以下示例假设有一个Rust服务器和TypeScript客户端。Webwire 并非仅限于这两种语言,但它们展示了Webwire的最佳潜力。
给定以下IDL文件
struct HelloRequest {
name: String,
}
struct HelloResponse {
message: String,
}
service Hello {
hello: HelloRequest -> HelloResponse
}
可以使用代码生成器生成服务器和客户端文件
$ webwire gen rust < api/chat.ww > server/src/api.rs
$ webwire gen ts < api/chat.ww > client/src/api.ts
给定代码的Rust服务器实现可能如下所示
use std::net::SocketAddr;
use std::sync::{Arc};
use async_trait::async_trait;
use ::api::chat;
use ::webwire::server::hyper::MakeHyperService;
use ::webwire::server::session::{Auth, AuthError};
use ::webwire::{Response, Router, Server, ConsumerError};
struct ChatService {
#[allow(dead_code)]
session: Arc<Session>,
server: Arc<Server<Session>>,
}
#[async_trait]
impl chat::Server<Session> for ChatService {
async fn send(&self, message: &chat::Message) -> Response<Result<(), chat::SendError>> {
let client = chat::ClientConsumer(&*self.server);
assert!(matches!(client.on_message(message).await, Err(ConsumerError::Broadcast)));
Ok(Ok(()))
}
}
#[derive(Default)]
struct Session {}
struct Sessions {}
impl Sessions {
pub fn new() -> Self {
Self {}
}
}
#[async_trait]
impl webwire::SessionHandler<Session> for Sessions {
async fn auth(&self, _auth: Option<Auth>) -> Result<Session, AuthError> {
Ok(Session::default())
}
async fn connect(&self, _session: &Session) {}
async fn disconnect(&self, _session: &Session) {}
}
#[tokio::main]
async fn main() {
// Create session handler
let session_handler = Sessions::new();
// Create service router
let router = Arc::new(Router::<Session>::new());
// Create webwire server
let server = Arc::new(webwire::server::Server::new(
session_handler,
router.clone(),
));
// Register services
router.service(chat::ServerProvider({
let server = server.clone();
move |session| ChatService {
session,
server: server.clone(),
}
}));
// Start hyper service
let addr = SocketAddr::from(([0, 0, 0, 0], 2323));
let make_service = MakeHyperService { server };
let server = hyper::Server::bind(&addr).serve(make_service);
if let Err(e) = server.await {
eprintln!("server error: {}", e);
}
}
使用生成的代码的TypeScript客户端可能如下所示
import { Client } from 'webwire'
import api from 'api' // this is the generated code
let client = new Client('https://127.0.0.1:8000/', [
api.chat.ClientProvider({
async on_message(message) {
console.log("Message received:", message)
}
})
])
assert(await client.connect())
let chat = api.chat.ServerConsumer(client)
let response = await chat.message({ text: "Hello world!" })
assert(response.Ok === null)
许可证
根据您的选择,许可协议为以下之一
- Apache许可证版本2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0))
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT))
。
依赖关系
~4.5MB
~89K SLoC