99 * @module
1010 */
1111
12- import * as eventApi from './helpers/event'
13- import type { EventCallback , UnlistenFn , Event } from './helpers/event'
12+ import { invoke , transformCallback } from './tauri'
1413
15- export type EventName = `${TauriEvent } ` | ( string & Record < never , never > )
14+ interface Event < T > {
15+ /** Event name */
16+ event : EventName
17+ /** The label of the window that emitted this event. */
18+ windowLabel : string
19+ /** Event identifier used to unlisten */
20+ id : number
21+ /** Event payload */
22+ payload : T
23+ }
24+
25+ type EventCallback < T > = ( event : Event < T > ) => void
26+
27+ type UnlistenFn = ( ) => void
28+
29+ type EventName = `${TauriEvent } ` | ( string & Record < never , never > )
30+
31+ interface Options {
32+ /**
33+ * Label of the window the function targets.
34+ *
35+ * When listening to events and using this value,
36+ * only events triggered by the window with the given label are received.
37+ *
38+ * When emitting events, only the window with the given label will receive it.
39+ */
40+ target ?: string
41+ }
1642
1743/**
1844 * @since 1.1.0
1945 */
20- export enum TauriEvent {
46+ enum TauriEvent {
2147 WINDOW_RESIZED = 'tauri://resize' ,
2248 WINDOW_MOVED = 'tauri://move' ,
2349 WINDOW_CLOSE_REQUESTED = 'tauri://close-requested' ,
@@ -33,6 +59,21 @@ export enum TauriEvent {
3359 MENU = 'tauri://menu'
3460}
3561
62+ /**
63+ * Unregister the event listener associated with the given name and id.
64+ *
65+ * @ignore
66+ * @param event The event name
67+ * @param eventId Event identifier
68+ * @returns
69+ */
70+ async function _unlisten ( event : string , eventId : number ) : Promise < void > {
71+ await invoke ( 'plugin:event|unlisten' , {
72+ event,
73+ eventId
74+ } )
75+ }
76+
3677/**
3778 * Listen to an event from the backend.
3879 *
@@ -56,9 +97,16 @@ export enum TauriEvent {
5697 */
5798async function listen < T > (
5899 event : EventName ,
59- handler : EventCallback < T >
100+ handler : EventCallback < T > ,
101+ options ?: Options
60102) : Promise < UnlistenFn > {
61- return eventApi . listen ( event , null , handler )
103+ return invoke < number > ( 'plugin:event|listen' , {
104+ event,
105+ windowLabel : options ?. target ,
106+ handler : transformCallback ( handler )
107+ } ) . then ( ( eventId ) => {
108+ return async ( ) => _unlisten ( event , eventId )
109+ } )
62110}
63111
64112/**
@@ -87,9 +135,17 @@ async function listen<T>(
87135 */
88136async function once < T > (
89137 event : EventName ,
90- handler : EventCallback < T >
138+ handler : EventCallback < T > ,
139+ options ?: Options
91140) : Promise < UnlistenFn > {
92- return eventApi . once ( event , null , handler )
141+ return listen < T > (
142+ event ,
143+ ( eventData ) => {
144+ handler ( eventData )
145+ _unlisten ( event , eventData . id ) . catch ( ( ) => { } )
146+ } ,
147+ options
148+ )
93149}
94150
95151/**
@@ -104,10 +160,18 @@ async function once<T>(
104160 *
105161 * @since 1.0.0
106162 */
107- async function emit ( event : string , payload ?: unknown ) : Promise < void > {
108- return eventApi . emit ( event , undefined , payload )
163+ async function emit (
164+ event : string ,
165+ payload ?: unknown ,
166+ options ?: Options
167+ ) : Promise < void > {
168+ await invoke ( 'plugin:event|emit' , {
169+ event,
170+ windowLabel : options ?. target ,
171+ payload
172+ } )
109173}
110174
111- export type { Event , EventCallback , UnlistenFn }
175+ export type { Event , EventCallback , UnlistenFn , EventName , Options }
112176
113- export { listen , once , emit }
177+ export { listen , once , emit , TauriEvent }
0 commit comments