Files
Termix/electron/preload.js
T

115 lines
4.4 KiB
JavaScript
Raw Normal View History

2026-10-01 16:20:16 -05:00
const { contextBridge, ipcRenderer, webFrame } = require("electron");
2025-09-12 14:42:00 -05:00
+17
2026-09-20 14:56:39 -05:00
const ALLOWED_INVOKE_CHANNELS = new Set([
"get-desktop-settings",
2026-10-01 16:20:16 -05:00
"get-previous-server-url",
+17
2026-09-20 14:56:39 -05:00
"save-desktop-settings",
"allow-invalid-certificate-for-origin",
]);
function invokeAllowed(channel, ...args) {
if (!ALLOWED_INVOKE_CHANNELS.has(channel)) {
return Promise.reject(new Error(`IPC channel is not allowed: ${channel}`));
}
return ipcRenderer.invoke(channel, ...args);
}
2026-10-18 00:34:50 -05:00
// The embedded backend's port, picked by the main process at startup.
const backendPortArg = process.argv.find((arg) =>
arg.startsWith("--termix-backend-port="),
);
const backendPort = backendPortArg
? Number(backendPortArg.split("=")[1])
: undefined;
2025-09-12 14:42:00 -05:00
contextBridge.exposeInMainWorld("electronAPI", {
2026-10-18 00:34:50 -05:00
backendPort,
2025-09-12 14:42:00 -05:00
getAppVersion: () => ipcRenderer.invoke("get-app-version"),
2026-10-01 16:20:16 -05:00
// Kept so the interface size can reset a zoom an earlier build applied.
setZoomFactor: (factor) => {
const value = Number(factor);
if (!Number.isFinite(value)) return;
webFrame.setZoomFactor(Math.min(2, Math.max(0.5, value)));
},
+5
2026-08-19 14:12:06 -05:00
getPlatform: () => ipcRenderer.invoke("get-platform"),
2026-10-20 16:03:29 -05:00
// Whether the app-drawn title bar shows in this window, and when it changes
// (full screen hides it).
getTitleBarVisible: () => ipcRenderer.invoke("get-title-bar-visible"),
onTitleBarVisibleChange: (callback) => {
const listener = (_event, visible) => callback(visible);
ipcRenderer.on("title-bar-visible-changed", listener);
return () =>
ipcRenderer.removeListener("title-bar-visible-changed", listener);
},
// Keeps the window controls the system draws in the colors of the theme.
setTitleBarOverlay: (colors) =>
ipcRenderer.invoke("set-title-bar-overlay", colors),
+17
2026-09-20 14:56:39 -05:00
getEmbeddedServerStatus: () =>
ipcRenderer.invoke("get-embedded-server-status"),
2025-09-12 14:42:00 -05:00
2026-10-12 11:35:48 -05:00
// App Store builds are updated by the store.
updates: process.mas
? undefined
: {
getState: () => ipcRenderer.invoke("desktop-update-get-state"),
check: () => ipcRenderer.invoke("desktop-update-check"),
download: () => ipcRenderer.invoke("desktop-update-download"),
install: () => ipcRenderer.invoke("desktop-update-install"),
setMode: (mode) => ipcRenderer.invoke("desktop-update-set-mode", mode),
onState: (callback) => {
const listener = (_event, state) => callback(state);
ipcRenderer.on("desktop-update-state", listener);
return () =>
ipcRenderer.removeListener("desktop-update-state", listener);
},
},
2025-09-12 14:42:00 -05:00
removeAllListeners: (channel) => ipcRenderer.removeAllListeners(channel),
isElectron: true,
isDev: process.env.NODE_ENV === "development",
2025-11-17 09:46:05 -06:00
getSetting: (key) => ipcRenderer.invoke("get-setting", key),
setSetting: (key, value) => ipcRenderer.invoke("set-setting", key, value),
+5
2026-08-19 14:12:06 -05:00
onCloseActiveTab: (callback) => {
const listener = () => callback();
ipcRenderer.on("close-active-tab", listener);
return () => ipcRenderer.removeListener("close-active-tab", listener);
},
+2
2026-07-26 18:47:27 -05:00
+5
2026-03-08 18:02:14 -05:00
clearSessionCookies: () => ipcRenderer.invoke("clear-session-cookies"),
2026-10-01 16:20:16 -05:00
externalBrowserLogin: (authUrl, callbackPort) =>
ipcRenderer.invoke("external-browser-login", authUrl, callbackPort),
2026-05-28 22:29:20 -05:00
2026-06-29 13:28:26 -05:00
showSaveDialog: (options) => ipcRenderer.invoke("show-save-dialog", options),
showOpenDialog: (options) => ipcRenderer.invoke("show-open-dialog", options),
createTempFile: (fileData) =>
ipcRenderer.invoke("create-temp-file", fileData),
createTempFolder: (folderData) =>
ipcRenderer.invoke("create-temp-folder", folderData),
startDragToDesktop: (dragData) =>
ipcRenderer.invoke("start-drag-to-desktop", dragData),
cleanupTempFile: (tempId) => ipcRenderer.invoke("cleanup-temp-file", tempId),
2026-10-20 16:03:29 -05:00
// Native web views placed over an element of the page (WebContentsView).
embeddedView: {
open: (options) => ipcRenderer.invoke("embedded-view-open", options),
setBounds: (id, bounds) =>
ipcRenderer.invoke("embedded-view-bounds", id, bounds),
setVisible: (id, visible) =>
ipcRenderer.invoke("embedded-view-visible", id, visible),
close: (id) => ipcRenderer.invoke("embedded-view-close", id),
+17
2026-09-20 14:56:39 -05:00
},
invoke: invokeAllowed,
2025-09-12 14:42:00 -05:00
});
+5
2026-03-08 18:02:14 -05:00
contextBridge.exposeInMainWorld("electronClipboard", {
2026-05-06 15:12:07 -05:00
writeText: (text) => ipcRenderer.invoke("clipboard-write-text", text),
readText: () => ipcRenderer.invoke("clipboard-read-text"),
+5
2026-03-08 18:02:14 -05:00
});
2025-09-12 14:42:00 -05:00
window.IS_ELECTRON = true;