Deno 开源 fastwebsockets,Rust 编写的高性能 WebSocket 协议实现


Deno 开源了宣称速度极快的 fastwebsockets —— Rust 编写的高性能 WebSocket 协议 (RFC6455 WebSocket) 实现。

fastwebsockets 核心特性

  • 可用作原生 WebSocket 帧解析器、成熟的客户端/服务器
use fastwebsockets::{Frame, OpCode, WebSocket};

async fn handle_client(
mut socket: TcpStream,
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
handshake(&mut socket).await?;

let mut ws = WebSocket::after_handshake(socket);
ws.set_writev(true);
ws.set_auto_close(true);
ws.set_auto_pong(true);

loop {
let frame = ws.read_frame().await?;

match frame {
OpCode::Close => break,
OpCode::Text | OpCode::Binary => {
let frame = Frame::new(true, frame.opcode, None, frame.payload);
ws.write_frame(frame).await?;
}
}
}

Ok(())
}
  • 与 Hyper 集成

启用upgrade功能以进行服务器端升级,以及与客户端握手。

use fastwebsockets::upgrade::upgrade;
use hyper::{Request, Body, Response};

async fn server_upgrade(
mut req: Request<Body>,
) -> Result<Response<Body>, Box<dyn std::error::Error + Send + Sync>> {
let (response, fut) = upgrade::upgrade(&mut req)?;

tokio::spawn(async move {
if let Err(e) = handle_client(fut).await {
eprintln!("Error in websocket connection: {}", e);
}
});

Ok(response)
}

使用 handshake 模块进行客户端握手:

use fastwebsockets::handshake;
use fastwebsockets::WebSocket;
use hyper::{Request, Body, upgrade::Upgraded, header::{UPGRADE, CONNECTION}};
use tokio::net::TcpStream;
use std::future::Future;

// Define a type alias for convenience
type Result<T> =
std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;

async fn connect() -> Result<WebSocket<Upgraded>> {
let stream = TcpStream::connect("localhost:9001").await?;

let req = Request::builder()
.method("GET")
.uri("http://localhost:9001/")
.header("Host", "localhost:9001")
.header(UPGRADE, "websocket")
.header(CONNECTION, "upgrade")
.header(
"Sec-WebSocket-Key",
fastwebsockets:🤝:generate_key(),
)
.header("Sec-WebSocket-Version", "13")
.body(Body::empty())?;

let (ws, _) = handshake::client(&SpawnExecutor, req, stream).await?;
Ok(ws)
}

// Tie hyper's executor to tokio runtime
struct SpawnExecutor;

impl<Fut> hyper::rt::Executor<Fut> for SpawnExecutor
where
Fut: Future + Send + 'static,
Fut::Output: Send + 'static,
{
fn execute(&self, fut: Fut) {
tokio::task::spawn(fut);
}
}
  • 通过 Autobahn|TestSuite1 并使用 LLVM 的 libfuzzer 进行模糊测试

相關推薦

2023-02-01

Gleam 是一种类型安全且可扩展的编程语言,可用于 Erlang 虚拟机和 JavaScript 运行时。 最近发布的 0.26 版本引入了增量编译。该项特性改进了构建工具,仅在必要的情况下编译所需模块,而不是整个包,从而显著提升 Gleam 编译器

2022-06-23

js 的延续,可以让开发者使用 JavaScript 进行服务器端脚本编写。Deno 试图解决 Node.js 缺乏互操作性的问题,而且与 Node.js 不同,它为 Serverless 计算进行了优化。 在上个月,Deno 还与 Cloudflare 和 Node.js 达成合作,承诺改善 JavaScript

2023-10-30

Wasmer 团队开源了一款用 Rust 编写的 JavaScript Service Worker:WinterJS。 WinterJS 开源地址:https://github.com/wasmerio/winterjs 据介绍,WinterJS 使用 SpiderMonkey 运行时执行 JavaScript(与 Firefox 使用的运行时相同),并遵循 WinterCG 规范,目的

2023-04-02

、基本介绍 MobileIMSDK-微信小程序端是一套基于微信原生WebSocket的即时通讯库: 1)超轻量级、无任何第3方库依赖(开箱即用); 2)纯JS编写、ES6语法、高度提炼,简单易用; 3)基于微信原生WebSocket API,简洁优雅; 4)

2023-05-02

效率对开发者和用户来说很重要。此版本改进了 HTTP 和 WebSocket 服务器的性能,并为进一步的性能工作奠定了基础。 提升安全性。安全性内置于 Deno 中,具有选择加入权限模型,因此开发者始终都能知道代码可以访问什么数据

2022-08-29

引入了一个新的实验性 HTTP 服务器,旨在提供一流的 HTTP 性能。我们的基准显示,与 Node.js 相比,每秒的 hello-world 请求性能提高了 4 倍,与我们现有的网络服务器相比,提高了 3 倍。新的服务器甚至比 Rust HTTP 服务器 Hyper 的单

2023-06-15

Bun 是采用 Zig 语言编写的高性能 “全家桶” JavaScript 运行时,官方称其为 "all-in-one JavaScript runtime"。 所谓 "all in one",是因为 Bun 提供了打包、转译、安装和运行 JavaScript & TypeScript 项目的功能,内置原生打包器 (nat

2023-11-04

deno run --env :对 .env 文件的内置支持 改进 WebSockets:支持 HTTP/2 上的 RFC8841 Websocket 以及修复错误 deno task 支持 head 命令 针对 VSCode 扩展和语言服务器的稳定性改进 REPL 中的 Deno.test 支持:与 Ju

2022-06-14

发者的全栈现代 Web 框架,可帮助他们轻松创建高质量、高性能、稳定性好,以及支持定制的 Web 应用。 Fresh 核心是路由框架和模板引擎的组合,支持在服务器上按需渲染页面。除了在服务器中提供的即时 (JIT) 渲染之外,Fresh

2023-06-17

Deno 1.34.3 正式发布,值得关注的更新包括: kv 队列实现 避免在导入无效的模块名时崩溃 修复编译输出中缺少一些 npm 依赖项的问题 加载前不对配置文件路径进行规范化处理 在 onListen 参数中包含主机名 将 await Deno.se

2022-07-23

o 1.24 已发布,值得关注的更新包括: 类型检查和发射的性能改进 以前,当指定 --check 标志时,Deno 内部使用 TypeScript 编译器将 TypeScript 代码转换为 JavaScript,否则就使用 swc。在这个版本中,所有的发射都是用 swc 完成的,这要

2023-11-09

发的 QUIC 协议库 - TQUIC,旨在打造一个稳定、快速、高性能并具有广泛技术影响力的传输协议库。 “由于QUIC所具备的广泛性、长期性、创新性特点,我们开源了自研的TQUIC协议库,也希望借TQUIC开源的机会, 吸引更多的同学

2023-03-24

支持 ES 装饰器,但在未来的版本中将默认启用它们。 性能改进:除了 TypeScript 5.0 带来的其他性能优势外,Deno 的初始类型检查在不对远程模块进行类型检查时变得非常快。在大多数情况下,这一改进对减少 CI 上的类型检查

2024-10-09

供应用内更新。 文件上传:通过 HTTP 上传文件。 WebSocket:使用 Rust 客户端在 JavaScript 中打开 WebSocket 连接。 窗口自定义:自定义窗口状态,包括窗口大小和位置。 详情查看发布公告:https://tauri.app/blog/tauri-20/