farmcontrol-ui/public/electron.js

93 lines
2.2 KiB
JavaScript

import { app, ipcMain, shell, globalShortcut } from 'electron'
import { createRequire } from 'module'
import {
registerGlobalShortcuts,
setupSpotlightIPC
} from './spotlightWindow.js'
import {
createWindow,
setupMainWindowIPC,
setupMainWindowAppEvents,
setupDevAuthServer
} from './mainWindow.js'
// --- Keytar-backed auth session storage (main process) ---
const require = createRequire(import.meta.url)
let keytar = null
try {
// keytar is a native module; in some dev environments it may not be built yet.
keytar = require('keytar')
} catch (e) {
console.warn(
'[keytar] Not available; auth session persistence will be disabled.',
e?.message || e
)
}
const KEYTAR_SERVICE = app.name || 'Farm Control'
const KEYTAR_ACCOUNT = 'authSession'
app.whenReady().then(() => {
createWindow()
registerGlobalShortcuts()
setupSpotlightIPC()
setupMainWindowIPC()
setupMainWindowAppEvents(app)
setupDevAuthServer()
})
app.on('will-quit', () => {
globalShortcut.unregisterAll()
})
// IPC handler to get OS
ipcMain.handle('os-info', () => {
return {
platform: process.platform
}
})
ipcMain.handle('auth-session-get', async () => {
try {
if (!keytar) return null
const raw = await keytar.getPassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT)
if (!raw) return null
return JSON.parse(raw)
} catch (e) {
console.warn('[keytar] Failed to read auth session.', e?.message || e)
return null
}
})
ipcMain.handle('auth-session-set', async (event, session) => {
try {
if (!keytar) return false
if (!session || typeof session !== 'object') return false
await keytar.setPassword(
KEYTAR_SERVICE,
KEYTAR_ACCOUNT,
JSON.stringify(session)
)
return true
} catch (e) {
console.warn('[keytar] Failed to write auth session.', e?.message || e)
return false
}
})
ipcMain.handle('auth-session-clear', async () => {
try {
if (!keytar) return false
return await keytar.deletePassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT)
} catch (e) {
console.warn('[keytar] Failed to clear auth session.', e?.message || e)
return false
}
})
// IPC handler for opening external URLs
ipcMain.handle('open-external-url', (event, url) => {
console.log('Opening external url...')
shell.openExternal(url)
})