mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-18 07:30:12 +01:00
♻️ 桌面端内核进程端口号写入文件 port.json https://github.com/siyuan-note/siyuan/issues/6337
This commit is contained in:
parent
031d2a4736
commit
ec008b2fee
1 changed files with 51 additions and 22 deletions
|
|
@ -34,6 +34,7 @@ const isDevEnv = process.env.NODE_ENV === 'development'
|
||||||
const appVer = app.getVersion()
|
const appVer = app.getVersion()
|
||||||
const confDir = path.join(app.getPath('home'), '.config', 'siyuan')
|
const confDir = path.join(app.getPath('home'), '.config', 'siyuan')
|
||||||
const windowStatePath = path.join(confDir, 'windowState.json')
|
const windowStatePath = path.join(confDir, 'windowState.json')
|
||||||
|
const portJSONPath = path.join(confDir, 'port.json')
|
||||||
let tray // 托盘必须使用全局变量,以防止被垃圾回收 https://www.electronjs.org/docs/faq#my-apps-windowtray-disappeared-after-a-few-minutes
|
let tray // 托盘必须使用全局变量,以防止被垃圾回收 https://www.electronjs.org/docs/faq#my-apps-windowtray-disappeared-after-a-few-minutes
|
||||||
let mainWindow // 从托盘处激活报错 https://github.com/siyuan-note/siyuan/issues/769
|
let mainWindow // 从托盘处激活报错 https://github.com/siyuan-note/siyuan/issues/769
|
||||||
let firstOpenWindow, bootWindow
|
let firstOpenWindow, bootWindow
|
||||||
|
|
@ -41,6 +42,7 @@ let closeButtonBehavior = 0
|
||||||
let siyuanOpenURL
|
let siyuanOpenURL
|
||||||
let firstOpen = false
|
let firstOpen = false
|
||||||
let resetWindowStateOnRestart = false
|
let resetWindowStateOnRestart = false
|
||||||
|
let kernelPort = "6806"
|
||||||
require('@electron/remote/main').initialize()
|
require('@electron/remote/main').initialize()
|
||||||
|
|
||||||
if (!app.requestSingleInstanceLock()) {
|
if (!app.requestSingleInstanceLock()) {
|
||||||
|
|
@ -92,6 +94,7 @@ try {
|
||||||
}
|
}
|
||||||
|
|
||||||
const writeLog = (out) => {
|
const writeLog = (out) => {
|
||||||
|
console.log(out)
|
||||||
const logFile = path.join(confDir, 'app.log')
|
const logFile = path.join(confDir, 'app.log')
|
||||||
let log = ''
|
let log = ''
|
||||||
const maxLogLines = 1024
|
const maxLogLines = 1024
|
||||||
|
|
@ -263,7 +266,7 @@ const boot = () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
// 加载主界面
|
// 加载主界面
|
||||||
mainWindow.loadURL('http://127.0.0.1:6806/stage/build/app/index.html?v=' +
|
mainWindow.loadURL('http://127.0.0.1:' + kernelPort + '/stage/build/app/index.html?v=' +
|
||||||
new Date().getTime())
|
new Date().getTime())
|
||||||
|
|
||||||
// 菜单
|
// 菜单
|
||||||
|
|
@ -327,7 +330,7 @@ const boot = () => {
|
||||||
Menu.setApplicationMenu(menu)
|
Menu.setApplicationMenu(menu)
|
||||||
// 当前页面链接使用浏览器打开
|
// 当前页面链接使用浏览器打开
|
||||||
mainWindow.webContents.on('will-navigate', (event, url) => {
|
mainWindow.webContents.on('will-navigate', (event, url) => {
|
||||||
if (url.startsWith('http://127.0.0.1:6806')) {
|
if (url.startsWith('http://127.0.0.1:' + kernelPort)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -337,7 +340,7 @@ const boot = () => {
|
||||||
|
|
||||||
// IFrame 块不跟随重定向 https://github.com/siyuan-note/siyuan/issues/6327
|
// IFrame 块不跟随重定向 https://github.com/siyuan-note/siyuan/issues/6327
|
||||||
mainWindow.webContents.on('will-redirect', (event, url, isInPlace, isMainFrame) => {
|
mainWindow.webContents.on('will-redirect', (event, url, isInPlace, isMainFrame) => {
|
||||||
if (url.startsWith('http://127.0.0.1:6806')) {
|
if (url.startsWith('http://127.0.0.1:' + kernelPort)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -408,7 +411,7 @@ const boot = () => {
|
||||||
theme: nativeTheme.shouldUseDarkColors ? 'dark' : 'light',
|
theme: nativeTheme.shouldUseDarkColors ? 'dark' : 'light',
|
||||||
init: true,
|
init: true,
|
||||||
})
|
})
|
||||||
await fetch('http://127.0.0.1:6806/api/system/uiproc?pid=' + process.pid,
|
await fetch('http://127.0.0.1:' + kernelPort + '/api/system/uiproc?pid=' + process.pid,
|
||||||
{method: 'POST'})
|
{method: 'POST'})
|
||||||
})
|
})
|
||||||
ipcMain.on('siyuan-hotkey', (event, hotkey) => {
|
ipcMain.on('siyuan-hotkey', (event, hotkey) => {
|
||||||
|
|
@ -551,6 +554,7 @@ const initKernel = (initData) => {
|
||||||
stdio: 'ignore',
|
stdio: 'ignore',
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
writeLog('booted kernel process [pid=' + kernelProcess.pid + ']')
|
||||||
|
|
||||||
kernelProcess.on('close', (code) => {
|
kernelProcess.on('close', (code) => {
|
||||||
if (0 !== code) {
|
if (0 !== code) {
|
||||||
|
|
@ -561,11 +565,11 @@ const initKernel = (initData) => {
|
||||||
`<div>数据库文件正在被其他程序锁定。如果你使用了第三方同步盘,请在思源运行期间关闭同步。</div><div>The database file is being locked by another program. If you use a third-party sync disk, please turn off sync while SiYuan is running.</div>`)
|
`<div>数据库文件正在被其他程序锁定。如果你使用了第三方同步盘,请在思源运行期间关闭同步。</div><div>The database file is being locked by another program. If you use a third-party sync disk, please turn off sync while SiYuan is running.</div>`)
|
||||||
break
|
break
|
||||||
case 21:
|
case 21:
|
||||||
showErrorWindow('⚠️ 6806 端口不可用 The port 6806 is unavailable',
|
showErrorWindow('⚠️ ' + kernelPort + ' 端口不可用 The port ' + kernelPort + ' is unavailable',
|
||||||
'<div>思源需要监听 6806 端口,请确保该端口可用且不是其他程序的保留端口。可尝试使用管理员运行命令:' +
|
'<div>思源需要监听 ' + kernelPort + ' 端口,请确保该端口可用且不是其他程序的保留端口。可尝试使用管理员运行命令:' +
|
||||||
'<pre><code>net stop winnat\nnetsh interface ipv4 add excludedportrange protocol=tcp startport=6806 numberofports=1\nnet start winnat</code></pre></div>' +
|
'<pre><code>net stop winnat\nnetsh interface ipv4 add excludedportrange protocol=tcp startport=' + kernelPort + ' numberofports=1\nnet start winnat</code></pre></div>' +
|
||||||
'<div>SiYuan needs to listen to port 6806, please make sure this port is available, and not a reserved port by other software. Try running the command as an administrator: ' +
|
'<div>SiYuan needs to listen to port ' + kernelPort + ', please make sure this port is available, and not a reserved port by other software. Try running the command as an administrator: ' +
|
||||||
'<pre><code>net stop winnat\nnetsh interface ipv4 add excludedportrange protocol=tcp startport=6806 numberofports=1\nnet start winnat</code></pre></div>')
|
'<pre><code>net stop winnat\nnetsh interface ipv4 add excludedportrange protocol=tcp startport=' + kernelPort + ' numberofports=1\nnet start winnat</code></pre></div>')
|
||||||
break
|
break
|
||||||
case 22:
|
case 22:
|
||||||
showErrorWindow(
|
showErrorWindow(
|
||||||
|
|
@ -593,28 +597,54 @@ const initKernel = (initData) => {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
writeLog('booted kernel process')
|
|
||||||
|
|
||||||
const sleep = (ms) => {
|
const sleep = (ms) => {
|
||||||
return new Promise(resolve => setTimeout(resolve, ms))
|
return new Promise(resolve => setTimeout(resolve, ms))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getKernelPort = async () => {
|
||||||
|
await sleep(200)
|
||||||
|
let gotPort = false
|
||||||
|
let count = 0
|
||||||
|
while (!gotPort) {
|
||||||
|
try {
|
||||||
|
const portJSON = JSON.parse(fs.readFileSync(portJSONPath, 'utf8'))
|
||||||
|
const ret = portJSON[kernelProcess.pid.toString()]
|
||||||
|
if (ret) {
|
||||||
|
gotPort = true
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
await sleep(100)
|
||||||
|
} catch (e) {
|
||||||
|
await sleep(100)
|
||||||
|
} finally {
|
||||||
|
count++
|
||||||
|
if (64 < count) {
|
||||||
|
writeLog('get kernel port failed [pid=' + kernelProcess.pid + ']')
|
||||||
|
bootWindow.destroy()
|
||||||
|
resolve(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
kernelPort = await getKernelPort()
|
||||||
|
writeLog("got kernel port [" + kernelPort + "]")
|
||||||
|
|
||||||
let gotVersion = false
|
let gotVersion = false
|
||||||
let apiData
|
let apiData
|
||||||
let count = 0
|
let count = 0
|
||||||
writeLog('checking kernel version')
|
writeLog('checking kernel version')
|
||||||
while (!gotVersion) {
|
while (!gotVersion) {
|
||||||
try {
|
try {
|
||||||
const apiResult = await fetch(
|
const apiResult = await fetch('http://127.0.0.1:' + kernelPort + '/api/system/version')
|
||||||
'http://127.0.0.1:6806/api/system/version')
|
|
||||||
apiData = await apiResult.json()
|
apiData = await apiResult.json()
|
||||||
gotVersion = true
|
gotVersion = true
|
||||||
bootWindow.setResizable(false)
|
bootWindow.setResizable(false)
|
||||||
bootWindow.loadURL('http://127.0.0.1:6806/appearance/boot/index.html')
|
bootWindow.loadURL('http://127.0.0.1:' + kernelPort + '/appearance/boot/index.html')
|
||||||
bootWindow.show()
|
bootWindow.show()
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
writeLog('get kernel version failed: ' + e.message)
|
writeLog('get kernel version failed: ' + e.message)
|
||||||
await sleep(100)
|
await sleep(200)
|
||||||
} finally {
|
} finally {
|
||||||
count++
|
count++
|
||||||
if (64 < count) {
|
if (64 < count) {
|
||||||
|
|
@ -630,15 +660,14 @@ const initKernel = (initData) => {
|
||||||
if (!isDevEnv && apiData.data !== appVer) {
|
if (!isDevEnv && apiData.data !== appVer) {
|
||||||
writeLog(
|
writeLog(
|
||||||
`kernel [${apiData.data}] is running, shutdown it now and then start kernel [${appVer}]`)
|
`kernel [${apiData.data}] is running, shutdown it now and then start kernel [${appVer}]`)
|
||||||
fetch('http://127.0.0.1:6806/api/system/exit', {method: 'POST'})
|
fetch('http://127.0.0.1:' + kernelPort + '/api/system/exit', {method: 'POST'})
|
||||||
bootWindow.destroy()
|
bootWindow.destroy()
|
||||||
resolve(false)
|
resolve(false)
|
||||||
} else {
|
} else {
|
||||||
let progressing = false
|
let progressing = false
|
||||||
while (!progressing) {
|
while (!progressing) {
|
||||||
try {
|
try {
|
||||||
const progressResult = await fetch(
|
const progressResult = await fetch('http://127.0.0.1:' + kernelPort + '/api/system/bootProgress')
|
||||||
'http://127.0.0.1:6806/api/system/bootProgress')
|
|
||||||
const progressData = await progressResult.json()
|
const progressData = await progressResult.json()
|
||||||
if (progressData.data.progress >= 100) {
|
if (progressData.data.progress >= 100) {
|
||||||
resolve(true)
|
resolve(true)
|
||||||
|
|
@ -648,7 +677,7 @@ const initKernel = (initData) => {
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
writeLog('get boot progress failed: ' + e.message)
|
writeLog('get boot progress failed: ' + e.message)
|
||||||
fetch('http://127.0.0.1:6806/api/system/exit', {method: 'POST'})
|
fetch('http://127.0.0.1:' + kernelPort + '/api/system/exit', {method: 'POST'})
|
||||||
bootWindow.destroy()
|
bootWindow.destroy()
|
||||||
resolve(false)
|
resolve(false)
|
||||||
progressing = true
|
progressing = true
|
||||||
|
|
@ -778,15 +807,15 @@ const {powerMonitor} = require('electron')
|
||||||
|
|
||||||
powerMonitor.on('suspend', () => {
|
powerMonitor.on('suspend', () => {
|
||||||
writeLog('system suspend')
|
writeLog('system suspend')
|
||||||
fetch('http://127.0.0.1:6806/api/sync/performSync', {method: 'POST'})
|
fetch('http://127.0.0.1:' + kernelPort + '/api/sync/performSync', {method: 'POST'})
|
||||||
})
|
})
|
||||||
|
|
||||||
powerMonitor.on('resume', () => {
|
powerMonitor.on('resume', () => {
|
||||||
writeLog('system resume')
|
writeLog('system resume')
|
||||||
fetch('http://127.0.0.1:6806/api/sync/performSync', {method: 'POST'})
|
fetch('http://127.0.0.1:' + kernelPort + '/api/sync/performSync', {method: 'POST'})
|
||||||
})
|
})
|
||||||
|
|
||||||
powerMonitor.on('shutdown', () => {
|
powerMonitor.on('shutdown', () => {
|
||||||
writeLog('system shutdown')
|
writeLog('system shutdown')
|
||||||
fetch('http://127.0.0.1:6806/api/system/exit', {method: 'POST'})
|
fetch('http://127.0.0.1:' + kernelPort + '/api/system/exit', {method: 'POST'})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue