9
9
* @module
10
10
*/
11
11
12
- import * as eventApi from './helpers/event'
13
- import type { EventCallback , UnlistenFn , Event } from './helpers/event'
12
+ import { invoke , transformCallback } from './tauri'
14
13
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
+ }
16
42
17
43
/**
18
44
* @since 1.1.0
19
45
*/
20
- export enum TauriEvent {
46
+ enum TauriEvent {
21
47
WINDOW_RESIZED = 'tauri://resize' ,
22
48
WINDOW_MOVED = 'tauri://move' ,
23
49
WINDOW_CLOSE_REQUESTED = 'tauri://close-requested' ,
@@ -33,6 +59,21 @@ export enum TauriEvent {
33
59
MENU = 'tauri://menu'
34
60
}
35
61
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
+
36
77
/**
37
78
* Listen to an event from the backend.
38
79
*
@@ -56,9 +97,16 @@ export enum TauriEvent {
56
97
*/
57
98
async function listen < T > (
58
99
event : EventName ,
59
- handler : EventCallback < T >
100
+ handler : EventCallback < T > ,
101
+ options ?: Options
60
102
) : 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
+ } )
62
110
}
63
111
64
112
/**
@@ -87,9 +135,17 @@ async function listen<T>(
87
135
*/
88
136
async function once < T > (
89
137
event : EventName ,
90
- handler : EventCallback < T >
138
+ handler : EventCallback < T > ,
139
+ options ?: Options
91
140
) : 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
+ )
93
149
}
94
150
95
151
/**
@@ -104,10 +160,18 @@ async function once<T>(
104
160
*
105
161
* @since 1.0.0
106
162
*/
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
+ } )
109
173
}
110
174
111
- export type { Event , EventCallback , UnlistenFn }
175
+ export type { Event , EventCallback , UnlistenFn , EventName , Options }
112
176
113
- export { listen , once , emit }
177
+ export { listen , once , emit , TauriEvent }
0 commit comments