Skip to content

Commit

Permalink
Stable references for events in TS and JS
Browse files Browse the repository at this point in the history
  • Loading branch information
Raicuparta committed Jan 16, 2025
1 parent 5cd56fe commit c61d41a
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 38 deletions.
49 changes: 30 additions & 19 deletions src/lang/globals.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,29 +36,40 @@ import * as TAURI_API_EVENT from "@tauri-apps/api/event";
* }}
*/
function __makeEvents__(mappings) {
const eventsProxies = Object.fromEntries(
Object.keys(mappings).map((event) => {
const name = mappings[event];

const proxyHandlerGet = {
listen: (arg) => TAURI_API_EVENT.listen(name, arg),
once: (arg) => TAURI_API_EVENT.once(name, arg),
emit: (arg) => TAURI_API_EVENT.emit(name, arg),
};

const proxy = new Proxy(
(() => {}),
{
apply: (_, __, [window]) => ({
listen: (arg) => window.listen(name, arg),
once: (arg) => window.once(name, arg),
emit: (arg) => window.emit(name, arg),
}),
get: (_, command) => proxyHandlerGet[command],
},
);

return [event, proxy];
})
);

return new Proxy(
{},
{
get: (_, event) => {
const name = mappings[event];

new Proxy(() => {}, {
apply: (_, __, [window]) => ({
listen: (arg) => window.listen(name, arg),
once: (arg) => window.once(name, arg),
emit: (arg) => window.emit(name, arg),
}),
get: (_, command) => {
switch (command) {
case "listen":
return (arg) => TAURI_API_EVENT.listen(name, arg);
case "once":
return (arg) => TAURI_API_EVENT.once(name, arg);
case "emit":
return (arg) => TAURI_API_EVENT.emit(name, arg);
}
},
});
if (typeof event === "string") {
return eventsProxies[event];
}
return undefined;
},
},
);
Expand Down
49 changes: 30 additions & 19 deletions src/lang/globals.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,32 @@ export type Result<T, E> =
function __makeEvents__<T extends Record<string, any>>(
mappings: Record<keyof T, string>,
) {
const eventsProxies = Object.fromEntries(
Object.keys(mappings).map((event: keyof T) => {
const name = mappings[event];

const proxyHandlerGet = {
listen: (arg: any) => TAURI_API_EVENT.listen(name, arg),
once: (arg: any) => TAURI_API_EVENT.once(name, arg),
emit: (arg: any) => TAURI_API_EVENT.emit(name, arg),
};

const proxy = new Proxy<__EventObj__<T[keyof T]>>(
(() => {}) as any,
{
apply: (_, __, [window]: [__WebviewWindow__]) => ({
listen: (arg: any) => window.listen(name, arg),
once: (arg: any) => window.once(name, arg),
emit: (arg: any) => window.emit(name, arg),
}),
get: (_, command: keyof __EventObj__<any>) => proxyHandlerGet[command],
},
);

return [event, proxy];
})
);

return new Proxy(
{} as unknown as {
[K in keyof T]: __EventObj__<T[K]> & {
Expand All @@ -32,25 +58,10 @@ function __makeEvents__<T extends Record<string, any>>(
},
{
get: (_, event) => {
const name = mappings[event as keyof T];

return new Proxy((() => {}) as any, {
apply: (_, __, [window]: [__WebviewWindow__]) => ({
listen: (arg: any) => window.listen(name, arg),
once: (arg: any) => window.once(name, arg),
emit: (arg: any) => window.emit(name, arg),
}),
get: (_, command: keyof __EventObj__<any>) => {
switch (command) {
case "listen":
return (arg: any) => TAURI_API_EVENT.listen(name, arg);
case "once":
return (arg: any) => TAURI_API_EVENT.once(name, arg);
case "emit":
return (arg: any) => TAURI_API_EVENT.emit(name, arg);
}
},
});
if (typeof event === "string") {
return eventsProxies[event];
}
return undefined;
},
},
);
Expand Down

0 comments on commit c61d41a

Please sign in to comment.