AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Tauri Syntax Events

skill-impertio-studio-tauri-2-claude-skill-package-tauri-syntax-events · by Impertio-Studio

>

No reviews yet
0 installs
9 views
0.0% view→install

Install

$ agentstack add skill-impertio-studio-tauri-2-claude-skill-package-tauri-syntax-events

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-impertio-studio-tauri-2-claude-skill-package-tauri-syntax-events)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
1mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Tauri Syntax Events? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

tauri-syntax-events

Quick Reference

Rust Event Traits (Tauri 2.x)

| Trait | Implemented By | Purpose | |-------|---------------|---------| | Emitter | App, AppHandle, Webview, WebviewWindow, Window | Send events | | Listener | App, AppHandle, Webview, WebviewWindow, Window | Receive events |

Emitter Methods

| Method | Scope | Description | |--------|-------|-------------| | emit(event, payload) | Global | Broadcast to ALL listeners | | emit_str(event, payload) | Global | Broadcast with pre-serialized JSON string | | emit_to(target, event, payload) | Targeted | Send to a specific window/webview label | | emit_filter(event, payload, filter_fn) | Filtered | Send to targets matching a predicate |

Listener Methods

| Method | Fires | Returns | |--------|-------|---------| | listen(event, handler) | Every time | EventId | | once(event, handler) | Once, then auto-removes | EventId | | listen_any(event, handler) | Every time, any source | EventId | | once_any(event, handler) | Once, any source | EventId | | unlisten(id) | N/A | () |

Frontend Event API (TypeScript)

| Function | Import | Description | |----------|--------|-------------| | listen(event, handler, options?) | @tauri-apps/api/event | Listen for events, returns Promise | | once(event, handler, options?) | @tauri-apps/api/event | Listen once, returns Promise | | emit(event, payload?) | @tauri-apps/api/event | Broadcast event globally | | emitTo(target, event, payload?) | @tauri-apps/api/event | Send event to specific target |

TauriEvent Built-in Events

| Member | Value | |--------|-------| | WINDOW_RESIZED | "tauri://resize" | | WINDOW_MOVED | "tauri://move" | | WINDOW_CLOSE_REQUESTED | "tauri://close-requested" | | WINDOW_DESTROYED | "tauri://destroyed" | | WINDOW_FOCUS | "tauri://focus" | | WINDOW_BLUR | "tauri://blur" | | WINDOW_SCALE_FACTOR_CHANGED | "tauri://scale-change" | | WINDOW_THEME_CHANGED | "tauri://theme-changed" | | WINDOW_CREATED | "tauri://window-created" | | WEBVIEW_CREATED | "tauri://webview-created" | | DRAG_ENTER | "tauri://drag-enter" | | DRAG_OVER | "tauri://drag-over" | | DRAG_DROP | "tauri://drag-drop" | | DRAG_LEAVE | "tauri://drag-leave" |


Critical Warnings

NEVER forget Clone on event payload structs — emit() requires Serialize + Clone. Omitting Clone causes a compile error that does not clearly indicate the source.

NEVER use special characters in event names — only alphanumeric, -, /, :, and _ are allowed. Other characters cause a runtime panic.

NEVER forget to call the unlisten function in frontend components — this causes memory leaks. In React, ALWAYS clean up in the useEffect return function.

NEVER forget to await the listen() call in TypeScript — listen() returns Promise, not UnlistenFn directly.

ALWAYS import the Emitter trait (use tauri::Emitter;) before calling emit() in Rust — the method is not available without the trait import.

ALWAYS import the Listener trait (use tauri::Listener;) before calling listen() in Rust.


Essential Patterns

Pattern 1: Rust to Frontend (Emitter)

// Tauri 2.x — Broadcast from Rust to all frontend listeners
use tauri::Emitter;

#[derive(Clone, serde::Serialize)]
struct ProgressUpdate {
    task_id: String,
    percent: f64,
    message: String,
}

// In a command or setup hook:
app_handle.emit("progress", ProgressUpdate {
    task_id: "download-1".into(),
    percent: 45.5,
    message: "Downloading file...".into(),
})?;

Pattern 2: Frontend Listening

// Tauri 2.x — Listen in TypeScript
import { listen } from '@tauri-apps/api/event';

interface ProgressUpdate {
  taskId: string;
  percent: number;
  message: string;
}

const unlisten = await listen('progress', (event) => {
  console.log(`${event.payload.taskId}: ${event.payload.percent}%`);
});

// When done:
unlisten();

Pattern 3: Frontend to Rust (Emit + Listen)

// Tauri 2.x — Frontend emits
import { emit } from '@tauri-apps/api/event';

await emit('user-action', { action: 'save', documentId: 42 });
// Tauri 2.x — Rust listens (typically in setup hook)
use tauri::Listener;

app.listen("user-action", |event| {
    println!("User action: {:?}", event.payload());
});

Pattern 4: Targeted Emission

// Tauri 2.x — Emit to specific window
use tauri::Emitter;

app_handle.emit_to("main", "notification", "Update available")?;

// Emit with filter
app_handle.emit_filter("sync", payload, |target| {
    matches!(target, tauri::EventTarget::WebviewWindow { label } if label != "settings")
})?;
// Tauri 2.x — Frontend targeted emit
import { emitTo } from '@tauri-apps/api/event';

await emitTo('settings', 'config-changed', { key: 'theme', value: 'dark' });

Pattern 5: React Cleanup Pattern

// Tauri 2.x — Correct cleanup in React useEffect
import { listen } from '@tauri-apps/api/event';

useEffect(() => {
  let unlisten: (() => void) | undefined;

  listen('update', (event) => {
    setState(event.payload);
  }).then((fn) => { unlisten = fn; });

  return () => {
    if (unlisten) unlisten();
  };
}, []);

Pattern 6: Once (Single-Fire Listener)

// Tauri 2.x — Rust: listen once, auto-removes
use tauri::Listener;

app.once("initialization-complete", |event| {
    println!("App initialized: {:?}", event.payload());
});
// Tauri 2.x — TypeScript: listen once
import { once } from '@tauri-apps/api/event';

await once('app-ready', (event) => {
  console.log('App initialized:', event.payload);
});

TypeScript Event Types

type EventName = string; // alphanumeric, hyphens, slashes, colons, underscores
type EventCallback = (event: Event) => void;
type UnlistenFn = () => void;

interface Event {
  event: EventName;
  id: number;
  payload: T;
}

interface Options {
  target?: string | EventTarget;
}

type EventTarget =
  | { kind: 'Any' }
  | { kind: 'AnyLabel'; label: string }
  | { kind: 'Window'; label: string }
  | { kind: 'Webview'; label: string }
  | { kind: 'WebviewWindow'; label: string };

Permissions Required

Events require core:event:default in the capability file:

{
  "$schema": "../gen/schemas/desktop-schema.json",
  "identifier": "default",
  "windows": ["main"],
  "permissions": [
    "core:event:default"
  ]
}

Reference Links

  • [references/methods.md](references/methods.md) — Complete Emitter and Listener trait signatures
  • [references/examples.md](references/examples.md) — Working code examples for common event scenarios
  • [references/anti-patterns.md](references/anti-patterns.md) — What NOT to do, with WHY explanations

Official Sources

  • https://v2.tauri.app/develop/calling-rust/#event-system
  • https://docs.rs/tauri/2/tauri/trait.Emitter.html
  • https://docs.rs/tauri/2/tauri/trait.Listener.html
  • https://v2.tauri.app/reference/javascript/api/namespaceevent/

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.