fix: deep link handling at electron startup

This commit is contained in:
Elysia
2026-01-31 16:07:15 +08:00
parent 3fe37f2773
commit 0ed7f64a21
6 changed files with 100 additions and 31 deletions

View File

@@ -3,6 +3,9 @@
* Author: juxnpxblo@github
*/
import { app } from "electron";
import pino from "pino";
const logger = pino({ 'name': 'deeplink.ts' });
type Query = Record<string, string>;
export type Listener = (query: Query) => any;
@@ -48,13 +51,13 @@ const listeners = new ListenersMap();
export const deepLink = {
on: (event: string, listener: Listener) => {
const count = listeners.add(event, listener);
console.log(
logger.info(
`Deep link: listener added for event ${event}. Total event listeners: ${count}`
);
},
off: (event: string, listener: Listener) => {
const count = listeners.remove(event, listener);
console.log(
logger.info(
`Deep link: listener removed for event ${event}. Total event listeners: ${count}`
);
},
@@ -67,29 +70,33 @@ export const deepLink = {
},
};
app.on("second-instance", (_e, commandLine) => {
export function handleCommandLine(commandLine: string[]) {
const target = commandLine.find((arg) =>
protocols.some((protocol) => arg.startsWith(protocol + "://"))
);
if (!target) return;
console.log(`Deep link: protocol link got: ${target}`);
logger.info(`Deep link: protocol link got: ${target}`);
try {
const url = new URL(target);
const action = url.hostname;
console.log(`Deep link: action found: ${action}`);
logger.info(`Deep link: action found: ${action}`);
const query: Query = {};
url.searchParams.forEach((value, key) => {
query[key] = value;
});
console.log(`Deep link: query found: ${JSON.stringify(query)}`);
logger.info(`Deep link: query found: ${JSON.stringify(query)}`);
const emitCount = listeners.emit(action, query);
console.log(`Deep link: emitted for ${emitCount} listeners`);
logger.info(`Deep link: emitted for ${emitCount} listeners`);
} catch (error) {
console.error(`Deep link: error parsing URL: ${error}`);
logger.error(`Deep link: error parsing URL: ${error}`);
}
}
app.on("second-instance", (_e, commandLine) => {
handleCommandLine(commandLine);
});