url handle

This commit is contained in:
srgooglo 2023-11-15 18:32:25 +01:00
parent f473468d25
commit 0e3bb54f54

View File

@ -20,11 +20,13 @@ global.sendToRenderer = (event, data) => {
} }
const { autoUpdater } = require("electron-differential-updater") const { autoUpdater } = require("electron-differential-updater")
const ProtocolRegistry = require("protocol-registry")
import path from "node:path" import path from "node:path"
import { app, shell, BrowserWindow, ipcMain } from "electron" import { app, shell, BrowserWindow, ipcMain } from "electron"
import { electronApp, optimizer, is } from "@electron-toolkit/utils" import { electronApp, optimizer, is } from "@electron-toolkit/utils"
import isDev from "electron-is-dev"
import open from "open" import open from "open"
@ -35,6 +37,8 @@ import setup from "./setup"
import PkgManager from "./pkg_mng" import PkgManager from "./pkg_mng"
import { readManifest } from "./utils/readManifest" import { readManifest } from "./utils/readManifest"
const protocolRegistryNamespace = "rsbundle"
class ElectronApp { class ElectronApp {
constructor() { constructor() {
this.pkgManager = new PkgManager() this.pkgManager = new PkgManager()
@ -121,7 +125,49 @@ class ElectronApp {
} }
} }
handleURLProtocol(url) {
console.log(url)
const urlStarter = `${protocolRegistryNamespace}://`
if (url.startsWith(urlStarter)) {
const [action, value] = url.split(urlStarter)[1].split("%3E")
switch (action) {
case "install": {
return this.sendToRender("installation:invoked", value)
}
default:
break;
}
}
}
async initialize() { async initialize() {
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
app.quit()
} else {
app.on("second-instance", (event, commandLine, workingDirectory) => {
event.preventDefault()
// Someone tried to run a second instance, we should focus our window.
if (this.win) {
if (this.win.isMinimized()) {
this.win.restore()
}
this.win.focus()
}
const url = commandLine.pop()
this.handleURLProtocol(url)
})
}
for (const key in this.handlers) { for (const key in this.handlers) {
ipcMain.handle(key, this.handlers[key]) ipcMain.handle(key, this.handlers[key])
} }
@ -135,6 +181,12 @@ class ElectronApp {
// Set app user model id for windows // Set app user model id for windows
electronApp.setAppUserModelId("com.electron") electronApp.setAppUserModelId("com.electron")
app.on("open-url", (event, url) => {
event.preventDefault()
this.handleURLProtocol(url)
})
app.on("browser-window-created", (_, window) => { app.on("browser-window-created", (_, window) => {
optimizer.watchWindowShortcuts(window) optimizer.watchWindowShortcuts(window)
}) })
@ -153,6 +205,26 @@ class ElectronApp {
this.sendToRender("update-available", info) this.sendToRender("update-available", info)
}) })
if (isDev) {
if (app.isDefaultProtocolClient("rsbundle")) {
app.removeAsDefaultProtocolClient("rsbundle")
}
ProtocolRegistry.register({
protocol: "rsbundle",
command: `"${process.execPath}" "${path.resolve(
process.argv[1]
)}" $_URL_`,
override: true,
script: true,
terminal: false,
})
} else {
if (!app.isDefaultProtocolClient("rsbundle")) {
app.setAsDefaultProtocolClient("rsbundle")
}
}
this.createWindow() this.createWindow()
app.on("activate", () => { app.on("activate", () => {