PrivateRookie / ws-tool

High perform & easy to use websocket client/server
Apache License 2.0
194 stars 22 forks source link

Easier api when server handling tls & add blocking tls server handling #12

Open PrivateRookie opened 2 years ago

lithbitren commented 1 month ago

性能这么好,但api好像过于low level了,如果能封装得更易用就好了,就axum/warp/reqwest的封hyper的那种级别。

这个issue都提这么久了,在rustcc看到,感觉大佬不是太有时间做这个,别人也能做,但封装应用层api这种事情,还是得和author/owner商量着搞,毕竟每个人能接受的封装尺度不一样。

API风格最好能接近前端oop的回调式API,但也可以结合rust的web框架那样搞类型识别式的不定参数句柄,方便解决stream或sender的所有权问题,不用clone来clone去的。

比如最简单的三五行就启动了服务器了,不需要use太多模块,其他心跳,关闭连接啥的都自动实现了。

ws_tool::Server::serve("0.0.0.0:3000")
  .on_message(|tx: Sender, msg: String| async move {
    tx.send(msg).await?;
  }).await?;

onmessage可以像web框架那样实现多次,函数(闭包)参数类型`Request,Headers,ConnectInfo,Stream,Sender,Message,String/&str/Cow<', str>...,Vec/&[u8]/Bytes...,Status(MyStatus)`等等参数。

Request/Headers/ConnectInfo也可以单独放进一个on_request里单独处理,算是对客户端请求的一次性响应。

其中字符串和二进制数组在同一个句柄里互斥,分别代表接受不同类型的消息,不写的直接接受消息再判断类型也行,也可以完全不写只接受消息,也可以传入类似actix的Date以及axum的Status/Extension那样的共享状态,参数顺序也可以不定,主要通过类型来识别传参。

多个on_message可以多次处理同一个Message类型,按声明顺序调用,类似中间件调用链,可以用extensions的map作为来共享状态。

wss传入key/crt文件路径就可以了,合法性判断全部封装起来。

心跳间隔/重连次数/重连间隔/错误响应/关闭响应,都是封装好然后默认自带的,可以提供API单独修改。

客户端同理也是像reqwest封装hyper客户端一样,其中最重要的就是写清楚connect和on_message,其他都可以省略:

let my_status = MyStatus::new();
ws_tool::Client::connect("wss://0.0.0.0:3000")
  .Status(my_status.clone())
  .on_respond(...)
  .on_message(...)
  .on_error(...)
  .on_close(...)
  .await?

这些调用过程的中间类型实际可以是ServerBuilder和ClientBuilder。

PrivateRookie commented 1 month ago

谢谢建议, 这段确实没什么时间处理这些issue, 但真要开工, 这也值得参看.