JS から Rust へイベントを送る (emit)

Recipe ID: front-006

フロントエンドからイベントを発火し、Rust 側でそれを受信する方法を解説します。
invoke(コマンド呼び出し、リクエスト/レスポンス型)とは異なり、一方向の通知や、他のウィンドウへのブロードキャストに適しています。

フロントエンド側の実装

@tauri-apps/api/eventemit 関数を使用します。

import { emit } from '@tauri-apps/api/event';

async function notifyRust() {
  await emit('frontend-event', { status: 'ready', timestamp: Date.now() });
}

Rust 側の実装

app.listen (または window.listen, webview.listen) で受信します。

編集ファイル: src-tauri/src/lib.rs

use tauri::Listener;

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .setup(|app| {
            app.listen("frontend-event", |event| {
                println!("Received event from JS: {}", event.payload());
            });
            Ok(())
        })
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

※ フロントエンドから emit したイベントは、すべてのウィンドウ(および Rust)のリスナーに届きます(ブロードキャスト)。
自分のウィンドウだけに送りたい場合や、特定のウェブビューだけに送りたい場合は、ターゲット指定付きの emit (window.emit 等) を検討するか、素直に invoke を使うのが良いでしょう。