Tsukuyomi 0.3.0 を公開しました

すっかり忘れていたのですが、0.2.2 から大きめの変更を加えていたので覚えているうちにリリースしておきました。

スコープ機能

ルーティング周りの実装を見直し、スコープを持たせられるようにしました。 次のように使います。

let pool = DbPool::init("postgres://username:password:localhost/database1")?;

let app = App::builder()
    .route(("/greeting", wrap_ready(greeting)))
    .mount("/api/v1", |scope| {
        // スコープ内でのみ pool の値へアクセスできる
        scope.set(pool);

        // スコープ内のルートに適用されるミドルウェア
        scope.modifier(JsonErrorHandler::new());

        scope.route(("/posts", wrap_async(posts_handler)));

        // サブスコープを作れる
        scope.mount("/users", |scope| { ... });
    })
    .finish()?;

WebSocket サポート

WebSocket のエンドポイントをサポートしました。次のような感じで使います。

use tsukuyomi::contrib::websocket::start;

fn websocket(input: &mut Input) -> impl Responder {
    start(input, None, |transport| {
        ....
    })
}

let app = App::builder()
    .route(("/ws", wrap_ready(websocket)))
    .finish()?;

その他

  • HTTP サーバの実装を独立したクレートとして切り出しました。tower-service で提供されているトレイトを使用しているので、汎用的な用途として用いることが出来ると思います。Hyper/Towerの今後の展望次第ですが、最終的にこのサーバ実装は他のもので完全に置き換えることを予定しています。