2 min read

Rust 向け依存 0 の HTTP/1.1 ライブラリと依存最小限の WebSocket ライブラリを公開した

時雨堂では Rust を積極的に利用し始めています。まず MP4 ライブラリから始めて、C++ で書かれていたツールを Rust 化したりしています。

開発にあたり「依存を少なくする」というのを方針として取っています。もともと時雨堂では依存をできるだけ減らしていく戦略なのですが、Rust で公開されているライブラリは依存が多いため、できる範囲で自分たちで依存が少ないライブラリを作っていくことにしました。

Rust チョットデキル には難しいライブラリの実装を押しつけて、自分は簡単なところから始めました。

HTTP/1.1

Rust 未経験の自分が手始めに作り始めたのが HTTP/1.1 ライブラリです。Rust はコアを小さくするということで標準ライブラリに HTTP がありません。ということで情報も沢山ありますし HTTP/1.1 を実装することにしました。

GitHub - shiguredo/http11-rs: HTTP/1.1 Library
HTTP/1.1 Library. Contribute to shiguredo/http11-rs development by creating an account on GitHub.

ちなみに知られていないかも知れませんが HTTP/1.1 の RFC は 9112 です。それをベースに依存 0 かつ Sans I/O で実装しています。Sans I/O は I/O なしの実装なので気軽に Tokio を組み合わせたりできます。

examples に Tokio と Rustls を組み合わせた HTTP クライアント、サーバー、リバプロを追加してあります。300 行程度でサクサク作れます。

テストは PBT のみで実現しています。カバレッジは 90% 以上です。

PROPTEST_CASES はデフォルトの 256

HTTP/1.1 が無事リバプロとして自社ウェブページが表示できたので、いったん完成としました。ちまちまメンテしていきます。

WebSocket

次は自社の Rust SDK に利用したいので WebSocket ライブラリを実装することにしました。WebSocket はさすがに依存 0 は難しそうなので、利用するライブラリを厳選しました。

base64 は自前実装しても良かったのですが、ほぼ標準ライブラリ扱いされているライブラリがあるようだったのでそれを採用しました。

sha1 は自前実装するのは危ないので Rust Crypto が提供している実装を採用する事にしました。random も自前実装は危ないのでよく使われている暗号的にも問題無い getrandom を採用しました。

圧縮は公式が提供してくれているライブラリがあったのでそちらを採用しました。

[dependencies]
# https://github.com/marshallpierce/rust-base64
base64 = "0.22"
# https://github.com/RustCrypto/hashes/tree/master/sha1
sha1 = "0.10"
# https://github.com/rust-lang/flate2-rs
flate2 = "1.1"
# https://github.com/rust-random/getrandom
getrandom = "0.3"
# https://github.com/shiguredo/http11-rs
shiguredo_http11 = { version = "2026.1.0-canary.0" }

テストは PBT のみで実現して、こちらもカバレッジ 90% 以上です。

PROPTEST_CASES はデフォルトの 256

RTMP や SRT や RTSP や MOQT

基本的な通信ライブラリはできたので、次は RTMP などのメディア通信ライブラリの開発を準備しています。RTMP と SRT のリリースに向けて開発を進めています。

RTMP は依存 0 で実現できそうです。SRT は暗号処理が入るのでさすがに依存 0 は無理でした。RTMP と SRT は FFmpeg や OBS Studio と問題無く接続ができることを確認しています。

リリースをお待ち頂ければと思います。


雑感

とにかく PBT と Fuzzing を徹底的にやりました。今後もやっていく予定です。PBT と Fuzzing はメンテナンスコストと実行コストが高いので CI には入れませんでした。

今後も自分たちが使うライブラリはできる範囲で自分たちで実装していければと思います。