Skip to content

Commit b6e8768

Browse files
committed
Stable references for events in TS and JS
1 parent 5cd56fe commit b6e8768

File tree

2 files changed

+69
-49
lines changed

2 files changed

+69
-49
lines changed

src/lang/globals.js

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,29 +36,40 @@ import * as TAURI_API_EVENT from "@tauri-apps/api/event";
3636
* }}
3737
*/
3838
function __makeEvents__(mappings) {
39+
const eventsProxies = Object.fromEntries(
40+
Object.keys(mappings).map((event) => {
41+
const name = mappings[event];
42+
43+
const proxyHandlerGet = {
44+
listen: (arg) => TAURI_API_EVENT.listen(name, arg),
45+
once: (arg) => TAURI_API_EVENT.once(name, arg),
46+
emit: (arg) => TAURI_API_EVENT.emit(name, arg),
47+
};
48+
49+
const proxy = new Proxy(
50+
(() => {}),
51+
{
52+
apply: (_, __, [window]) => ({
53+
listen: (arg) => window.listen(name, arg),
54+
once: (arg) => window.once(name, arg),
55+
emit: (arg) => window.emit(name, arg),
56+
}),
57+
get: (_, command) => proxyHandlerGet[command],
58+
},
59+
);
60+
61+
return [event, proxy];
62+
})
63+
);
64+
3965
return new Proxy(
4066
{},
4167
{
4268
get: (_, event) => {
43-
const name = mappings[event];
44-
45-
new Proxy(() => {}, {
46-
apply: (_, __, [window]) => ({
47-
listen: (arg) => window.listen(name, arg),
48-
once: (arg) => window.once(name, arg),
49-
emit: (arg) => window.emit(name, arg),
50-
}),
51-
get: (_, command) => {
52-
switch (command) {
53-
case "listen":
54-
return (arg) => TAURI_API_EVENT.listen(name, arg);
55-
case "once":
56-
return (arg) => TAURI_API_EVENT.once(name, arg);
57-
case "emit":
58-
return (arg) => TAURI_API_EVENT.emit(name, arg);
59-
}
60-
},
61-
});
69+
if (typeof event === "string") {
70+
return eventsProxies[event];
71+
}
72+
return undefined;
6273
},
6374
},
6475
);

src/lang/globals.ts

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,31 @@
11
import {
2-
invoke as TAURI_INVOKE,
3-
Channel as TAURI_CHANNEL,
2+
invoke as TAURI_INVOKE,
3+
Channel as TAURI_CHANNEL,
44
} from "@tauri-apps/api/core";
55
import * as TAURI_API_EVENT from "@tauri-apps/api/event";
66
import { type WebviewWindow as __WebviewWindow__ } from "@tauri-apps/api/webviewWindow";
77

88
type __EventObj__<T> = {
9-
listen: (
10-
cb: TAURI_API_EVENT.EventCallback<T>,
11-
) => ReturnType<typeof TAURI_API_EVENT.listen<T>>;
12-
once: (
13-
cb: TAURI_API_EVENT.EventCallback<T>,
14-
) => ReturnType<typeof TAURI_API_EVENT.once<T>>;
15-
emit: null extends T
16-
? (payload?: T) => ReturnType<typeof TAURI_API_EVENT.emit>
17-
: (payload: T) => ReturnType<typeof TAURI_API_EVENT.emit>;
9+
listen: (
10+
cb: TAURI_API_EVENT.EventCallback<T>
11+
) => ReturnType<typeof TAURI_API_EVENT.listen<T>>;
12+
once: (
13+
cb: TAURI_API_EVENT.EventCallback<T>
14+
) => ReturnType<typeof TAURI_API_EVENT.once<T>>;
15+
emit: null extends T
16+
? (payload?: T) => ReturnType<typeof TAURI_API_EVENT.emit>
17+
: (payload: T) => ReturnType<typeof TAURI_API_EVENT.emit>;
1818
};
1919

2020
export type Result<T, E> =
21-
| { status: "ok"; data: T }
22-
| { status: "error"; error: E };
21+
| { status: "ok"; data: T }
22+
| { status: "error"; error: E };
2323

2424
function __makeEvents__<T extends Record<string, any>>(
2525
mappings: Record<keyof T, string>,
2626
) {
27+
const eventObjects: Record<string, T[keyof T]> = {};
28+
2729
return new Proxy(
2830
{} as unknown as {
2931
[K in keyof T]: __EventObj__<T[K]> & {
@@ -34,23 +36,30 @@ function __makeEvents__<T extends Record<string, any>>(
3436
get: (_, event) => {
3537
const name = mappings[event as keyof T];
3638

37-
return new Proxy((() => {}) as any, {
38-
apply: (_, __, [window]: [__WebviewWindow__]) => ({
39-
listen: (arg: any) => window.listen(name, arg),
40-
once: (arg: any) => window.once(name, arg),
41-
emit: (arg: any) => window.emit(name, arg),
42-
}),
43-
get: (_, command: keyof __EventObj__<any>) => {
44-
switch (command) {
45-
case "listen":
46-
return (arg: any) => TAURI_API_EVENT.listen(name, arg);
47-
case "once":
48-
return (arg: any) => TAURI_API_EVENT.once(name, arg);
49-
case "emit":
50-
return (arg: any) => TAURI_API_EVENT.emit(name, arg);
51-
}
52-
},
53-
});
39+
let eventObject = eventObjects[name];
40+
if (!eventObject) {
41+
eventObject = new Proxy((() => {}) as any, {
42+
apply: (_, __, [window]: [__WebviewWindow__]) => ({
43+
listen: (arg: any) => window.listen(name, arg),
44+
once: (arg: any) => window.once(name, arg),
45+
emit: (arg: any) => window.emit(name, arg),
46+
}),
47+
get: (_, command: keyof __EventObj__<any>) => {
48+
switch (command) {
49+
case "listen":
50+
return (arg: any) => TAURI_API_EVENT.listen(name, arg);
51+
case "once":
52+
return (arg: any) => TAURI_API_EVENT.once(name, arg);
53+
case "emit":
54+
return (arg: any) => TAURI_API_EVENT.emit(name, arg);
55+
}
56+
},
57+
});
58+
59+
eventObjects[name] = eventObject;
60+
}
61+
62+
return eventObject;
5463
},
5564
},
5665
);

0 commit comments

Comments
 (0)