/* * @Author: 李皓 hao_li_work@163.com * @Date: 2026-07-28 16:31:45 * @LastEditors: 李皓 hao_li_work@163.com * @LastEditTime: 2026-07-28 16:44:07 * @FilePath: \pc\preload.js * @Description: * @Version: 1.0.0 */ const { contextBridge, ipcRenderer } = require('electron') const nodeNet = require('net') const dns = require('dns') /** * 尝试通过 TCP 连接指定端口检测主机是否可达 */ function tryConnect(host, port, timeout) { return new Promise((resolve) => { const socket = new nodeNet.Socket() socket.setTimeout(timeout) socket.on('connect', () => { socket.destroy(); resolve(true) }) socket.on('error', () => { socket.destroy(); resolve(false) }) socket.on('timeout', () => { socket.destroy(); resolve(false) }) socket.connect(port, host) }) } /** * 网络检测对象 */ const networkUtil = { /** * 检测目标主机网络连通性 * @param {string} host - 目标主机地址 * @param {number} timeout - 超时时间(毫秒) * @returns {Promise} - 是否可达 */ async ping(host, timeout) { // 1. 先检查 DNS 能否解析 try { await dns.promises.resolve(host) } catch { return false } // 2. 依次尝试常见端口(443 优先,80 兜底) const ports = [443, 80] for (const port of ports) { const ok = await tryConnect(host, port, timeout) if (ok) return true } return false } } /** * 应用传感器对象 */ const appSensor = { version: '1.0.0', name: 'appSensor' } /** * 应用缓存对象(数据持久化到本地文件) */ const app = { /** * 获取缓存数据 * @param {string} key - 缓存键名 * @returns {Promise} 缓存值 */ getCache(key) { return ipcRenderer.invoke('get-cache', key) }, /** * 设置缓存数据 * @param {string} key - 缓存键名 * @param {any} value - 缓存值(建议传入 JSON.stringify 后的字符串) * @returns {Promise} */ setCache(key, value) { return ipcRenderer.invoke('set-cache', key, value) } } // 安全暴露 API 给渲染进程 contextBridge.exposeInMainWorld('net', networkUtil) contextBridge.exposeInMainWorld('appSensor', appSensor) contextBridge.exposeInMainWorld('app', app)