Skip to content

Commit c61d41a

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

File tree

2 files changed

+60
-38
lines changed

2 files changed

+60
-38
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: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,32 @@ export type Result<T, E> =
2424
function __makeEvents__<T extends Record<string, any>>(
2525
mappings: Record<keyof T, string>,
2626
) {
27+
const eventsProxies = Object.fromEntries(
28+
Object.keys(mappings).map((event: keyof T) => {
29+
const name = mappings[event];
30+
31+
const proxyHandlerGet = {
32+
listen: (arg: any) => TAURI_API_EVENT.listen(name, arg),
33+
once: (arg: any) => TAURI_API_EVENT.once(name, arg),
34+
emit: (arg: any) => TAURI_API_EVENT.emit(name, arg),
35+
};
36+
37+
const proxy = new Proxy<__EventObj__<T[keyof T]>>(
38+
(() => {}) as any,
39+
{
40+
apply: (_, __, [window]: [__WebviewWindow__]) => ({
41+
listen: (arg: any) => window.listen(name, arg),
42+
once: (arg: any) => window.once(name, arg),
43+
emit: (arg: any) => window.emit(name, arg),
44+
}),
45+
get: (_, command: keyof __EventObj__<any>) => proxyHandlerGet[command],
46+
},
47+
);
48+
49+
return [event, proxy];
50+
})
51+
);
52+
2753
return new Proxy(
2854
{} as unknown as {
2955
[K in keyof T]: __EventObj__<T[K]> & {
@@ -32,25 +58,10 @@ function __makeEvents__<T extends Record<string, any>>(
3258
},
3359
{
3460
get: (_, event) => {
35-
const name = mappings[event as keyof T];
36-
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-
});
61+
if (typeof event === "string") {
62+
return eventsProxies[event];
63+
}
64+
return undefined;
5465
},
5566
},
5667
);

0 commit comments

Comments
 (0)