mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-31 04:12:10 +03:00
* fix(electron): bump electron 42→43 + build better-sqlite3 from source (ABI 148) (#6605)
fix(electron): bump electron 42→43 + rebuild better-sqlite3 from source against the Electron ABI (148).
Electron 43 raises NODE_MODULE_VERSION to 148; better-sqlite3@12.11.1 has no electron-v148 prebuild, so the packaged app died with 'Nenhum driver SQLite disponível'. prepare-electron-standalone now compiles better-sqlite3 from source against the electron headers into build/Release (where 'bindings' resolves it). Validated by Electron Package Smoke (green) + local (node_register_module_v148).
Supersedes #6378. (--admin: the only reds are SonarQube/SonarCloud failing on a coverage-report artifact digest-mismatch — a GitHub Actions infra flake, not this diff; Sonar is green on main and the diff touches only the electron build.)
* deps: bump the development group across 1 directory with 6 updates (#6588)
deps: bump the development group (6 updates). Rebased onto current main; all checks green after the electron-smoke fix (#6605).
* fix(proxy): force CONNECT tunnel for HTTP proxied requests (undici 8.7) + production deps bump (#6620)
fix(proxy): force CONNECT tunnel for HTTP proxied requests (undici 8.7) + production deps bump.
undici 8.6+ changed ProxyAgent to forward plain-HTTP via request-proxy instead of CONNECT, breaking OAuth refresh through a connection proxy (501). proxyDispatcher now passes proxyTunnel:true. Validated: Unit Tests 3/8 (the OAuth-proxy test) green, new regression test green (fails without the fix on undici 8.7), SonarQube green.
Supersedes #6380. (--admin: the only red is Electron Package Smoke failing on a next-build artifact 'digest-mismatch' — a GitHub Actions infra flake corrupting the asar ('file data stream has unexpected number of bytes'); the better-sqlite3 rebuild itself succeeded (gyp ok) and the electron path is unchanged from #6605 which passed the smoke. Not this diff.)
* chore(deps): bump github/codeql-action/analyze from 4.36.3 to 4.37.0
Bumps [github/codeql-action/analyze](https://github.com/github/codeql-action) from 4.36.3 to 4.37.0.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](54f647b7e1...99df26d4f1)
---
updated-dependencies:
- dependency-name: github/codeql-action/analyze
dependency-version: 4.37.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Diego Rodrigues de Sa e Souza <8016841+diegosouzapw@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
OmniRoute Electron Desktop App
This directory contains the Electron desktop application wrapper for OmniRoute.
Architecture (v1.6.4)
electron/
├── main.js # Main process — window, tray, server lifecycle, CSP, IPC
├── preload.js # Preload script — secure IPC bridge with disposer pattern
├── package.json # Electron-specific dependencies & electron-builder config
├── types.d.ts # TypeScript definitions (AppInfo, ServerStatus, ElectronAPI)
└── assets/ # Application icons and resources
src/shared/hooks/
└── useElectron.ts # React hooks — useSyncExternalStore, zero re-renders
Key Design Decisions
| Decision | Rationale |
|---|---|
waitForServer() polling |
Prevents blank screen on cold start — polls http://localhost:PORT before loading |
stdio: 'pipe' |
Captures server stdout/stderr for logging + readiness detection (not inherit) |
| Disposer pattern | onServerStatus() returns () => void for precise listener cleanup (no removeAllListeners) |
useSyncExternalStore |
Zero re-renders for useIsElectron() — no useState + useEffect cycle |
| CSP via session headers | Content-Security-Policy restricts script-src, connect-src etc. per Electron best practices |
| Platform-conditional titlebar | titleBarStyle: 'hiddenInset' only on macOS; default on Windows/Linux |
Development
Prerequisites
- Build the Next.js app first:
npm run build
- Install Electron dependencies:
cd electron
npm install
Running in Development
- Start the Next.js development server:
npm run dev
- In another terminal, start Electron:
cd electron
npm run dev
Running in Production Mode
- Build Next.js in standalone mode:
npm run build
- Start Electron:
cd electron
npm start
Building
Build for Current Platform
cd electron
npm run build
Build for Specific Platforms
# Windows
npm run build:win
# macOS (x64 + arm64)
npm run build:mac
# Linux
npm run build:linux
Output
Built applications are placed in dist-electron/:
- Windows:
.exeinstaller (NSIS) + portable.exe - macOS:
.dmginstaller (Intel + Apple Silicon) - Linux:
.AppImage
Installation
macOS
- Download the latest
.dmgfrom the Releases page. - Open the
.dmgfile. - Drag
OmniRoute.appto the Applications folder. - Launch from Applications.
⚠️ Note: The app is not signed with an Apple Developer certificate yet. If macOS blocks the app, run:
xattr -cr /Applications/OmniRoute.appOr right-click the app → Open → Open (to bypass Gatekeeper on first launch).
Windows
Installer (Recommended):
- Download
OmniRoute.Setup.*.exefrom Releases. - Run the installer.
- Launch from Start Menu or Desktop shortcut.
Portable (No Installation):
- Download
OmniRoute.exefrom Releases. - Run directly from any folder.
Linux
- Download the
.AppImagefrom Releases. - Make it executable:
chmod +x OmniRoute-*.AppImage - Run:
./OmniRoute-*.AppImage
Features
- Server Readiness — Waits for health check before showing window
- System Tray — Minimize to tray with quick actions (open, port change, quit)
- Port Management — Change port from tray menu (server restarts automatically)
- Window Controls — Custom minimize, maximize, close via IPC
- Content Security Policy — Restrictive CSP via session headers
- Offline Support — Bundled Next.js standalone server
- Single Instance — Only one app instance can run at a time
Configuration
Environment Variables
| Variable | Default | Description |
|---|---|---|
OMNIROUTE_PORT |
20128 |
Server port |
OMNIROUTE_MEMORY_MB |
512 |
Node.js heap limit (64–16384 MB) |
NODE_ENV |
production |
Set to development for dev mode |
Custom Icon
Place your icons in assets/:
icon.ico— Windows icon (256×256)icon.icns— macOS icon bundleicon.png— Linux/general use (512×512)tray-icon.png— System tray icon (16×16 or 32×32)
IPC Channels
Invoke (Renderer → Main, async)
| Channel | Returns | Description |
|---|---|---|
get-app-info |
AppInfo |
App name, version, platform, isDev, port |
open-external |
void |
Open URL in default browser (http/https only) |
get-data-dir |
string |
Get userData directory path |
restart-server |
{ success } |
Stop + restart server (5s timeout + SIGKILL) |
Send (Renderer → Main, fire-and-forget)
| Channel | Description |
|---|---|
window-minimize |
Minimize window |
window-maximize |
Toggle maximize/restore |
window-close |
Close window (minimize to tray) |
Receive (Main → Renderer, events)
| Channel | Payload | Emitted When |
|---|---|---|
server-status |
ServerStatus |
Server starts, stops, errors, or restarts |
port-changed |
number |
Port change via tray menu |
Note
: Listeners return disposer functions for precise cleanup. See
useServerStatusandusePortChangedhooks.
Security
| Feature | Implementation |
|---|---|
| Context Isolation | contextIsolation: true — renderer cannot access Node.js |
| Node Integration | nodeIntegration: false — no require() in renderer |
| IPC Whitelist | Channel names validated in preload via safeInvoke/safeSend/safeOn |
| URL Validation | shell.openExternal() only allows http: / https: protocols |
| CSP | Content-Security-Policy header set via session.webRequest.onHeadersReceived |
| Web Security | webSecurity: true — same-origin policy enforced |
React Hooks
| Hook | Returns | Description |
|---|---|---|
useIsElectron() |
boolean |
Zero-render detection via useSyncExternalStore |
useElectronAppInfo() |
{ appInfo, loading, error } |
App info from main process |
useDataDir() |
{ dataDir, loading, error } |
User data directory |
useWindowControls() |
{ minimize, maximize, close } |
Window control actions |
useOpenExternal() |
{ openExternal } |
Open URLs in browser |
useServerControls() |
{ restart, restarting } |
Server restart control |
useServerStatus(cb) |
Disposer | Listen for server status events |
usePortChanged(cb) |
Disposer | Listen for port change events |
Troubleshooting
App Won't Start
- Check if port 20128 is available:
lsof -i :20128 - Check console logs for
[Electron]prefix - Verify the build output exists in
.build/next/standalone
White Screen
- Verify Next.js build exists — server readiness waits 30s max
- Check
[Server]and[Server:err]log output - Look for CSP violations in developer console
Build Fails
Ensure you have build tools installed:
- Windows: Visual Studio Build Tools
- macOS: Xcode Command Line Tools
- Linux:
build-essential,libsecret-1-dev
License
MIT