This commit is contained in:
Liang Ding 2022-12-20 19:40:01 +08:00
parent fbfbe1b0ce
commit 1715b150a2
No known key found for this signature in database
GPG key ID: 136F30F901A2231D
3 changed files with 57 additions and 50 deletions

View file

@ -34,7 +34,6 @@ const isDevEnv = process.env.NODE_ENV === 'development'
const appVer = app.getVersion()
const confDir = path.join(app.getPath('home'), '.config', 'siyuan')
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 mainWindow // 从托盘处激活报错 https://github.com/siyuan-note/siyuan/issues/769
let firstOpenWindow, bootWindow
@ -42,7 +41,6 @@ let closeButtonBehavior = 0
let siyuanOpenURL
let firstOpen = false
let resetWindowStateOnRestart = false
let kernelPort = "6806"
const localhost = "127.0.0.1"
require('@electron/remote/main').initialize()
@ -51,10 +49,6 @@ if (!app.requestSingleInstanceLock()) {
return
}
const getServer = () => {
return "http://" + localhost + ":" + kernelPort
}
const showErrorWindow = (title, content) => {
let errorHTMLPath = path.join(appDir, 'app', 'electron', 'error.html')
if (isDevEnv) {
@ -554,6 +548,46 @@ const boot = () => {
}
}
let kernelPort = 6806
let tryGetPortCount = 0
const net = require("net");
const getAvailablePort = (port = kernelPort) => {
// https://gist.github.com/mikeal/1840641
const server = net.createServer()
return new Promise((resolve, reject) => server
.on('error', error => {
writeLog(error)
if (2048 < ++tryGetPortCount) {
writeLog('failed to get available port [tryCount=' + tryGetPortCount + ', port=' + port + ']')
reject(error)
return
}
server.listen(++port)
})
.on('listening', () => {
writeLog('found an available port [' + port + ']')
server.close(() => resolve(port))
})
.listen(port, '127.0.0.1'))
}
const getKernelPort = async () => {
if (isDevEnv) {
writeLog("got kernel port [" + kernelPort + "]")
return kernelPort
}
// 改进桌面端拉起内核 https://github.com/siyuan-note/siyuan/issues/6894
kernelPort = await getAvailablePort()
writeLog("got kernel available port [" + kernelPort + "]")
return kernelPort
}
const getServer = () => {
return "http://" + localhost + ":" + kernelPort
}
const initKernel = (initData) => {
return new Promise(async (resolve) => {
bootWindow = new BrowserWindow({
@ -577,7 +611,8 @@ const initKernel = (initData) => {
return
}
const cmds = ['--wd', appDir]
const availablePort = await getKernelPort()
const cmds = ['--port', availablePort, '--wd', appDir]
if (isDevEnv) {
cmds.push('--mode', 'dev')
}
@ -639,44 +674,6 @@ const initKernel = (initData) => {
})
}
const getKernelPort = async () => {
if (isDevEnv) {
return kernelPort
}
await sleep(200)
let gotPort = false
let count = 0
while (!gotPort) {
try {
const portJSON = JSON.parse(fs.readFileSync(portJSONPath, 'utf8'))
const ret = portJSON[kernelProcessPid]
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=' + kernelProcessPid + ']')
return
}
}
}
}
kernelPort = await getKernelPort()
if (!kernelPort) {
showErrorWindow('⚠️ 获取内核服务端口失败 Failed to get kernel serve port',
'<div>获取内核服务端口失败,请确保程序拥有网络权限并不受防火墙和杀毒软件阻止。</div><div>Failed to get kernel serve port, please make sure the program has network permissions and is not blocked by firewalls and antivirus software.</div>')
bootWindow.destroy()
resolve(false)
}
writeLog("got kernel port [" + kernelPort + "]")
let gotVersion = false
let apiData
let count = 0
@ -696,8 +693,12 @@ const initKernel = (initData) => {
count++
if (14 < count) {
writeLog('get kernel ver failed')
showErrorWindow('⚠️ 获取内核服务端口失败 Failed to get kernel serve port',
'<div>获取内核服务端口失败,请确保程序拥有网络权限并不受防火墙和杀毒软件阻止。</div><div>Failed to get kernel serve port, please make sure the program has network permissions and is not blocked by firewalls and antivirus software.</div>')
bootWindow.destroy()
resolve(false)
return
}
}
}

4
app/pnpm-lock.yaml generated
View file

@ -1928,10 +1928,10 @@ packages:
resolution: {integrity: sha512-m0+M53+HYMzqKxwNQZT143K7WwXEGUy9LY31l8dJphXx2P/FQod615mVbxHyqbDCG4J5bHdWm21qZ0e2DVY6CQ==}
engines: {node: '>=14.0.0'}
dependencies:
7zip-bin: 5.1.1
'@develar/schema-utils': 2.6.5
'@electron/universal': 1.2.1
'@malept/flatpak-bundler': 0.4.0
7zip-bin: 5.1.1
async-exit-hook: 2.0.1
bluebird-lst: 1.0.9
builder-util: 23.3.3
@ -2215,9 +2215,9 @@ packages:
/builder-util/23.3.3:
resolution: {integrity: sha512-MJZlUiq2PY5hjYv9+XNaoYdsITqvLgRDoHSFg/4nzpInbNxNjLQOolL04Zsyp+hgfcbFvMC4h0KkR1CMPHLWbA==}
dependencies:
7zip-bin: 5.1.1
'@types/debug': 4.1.7
'@types/fs-extra': 9.0.13
7zip-bin: 5.1.1
app-builder-bin: 4.0.0
bluebird-lst: 1.0.9
builder-util-runtime: 9.0.3

View file

@ -446,10 +446,16 @@ func GetDataAssetsAbsPath() (ret string) {
func tryLockWorkspace() {
WorkspaceLock = flock.New(filepath.Join(WorkspaceDir, ".lock"))
if err := WorkspaceLock.Lock(); nil != err {
logging.LogErrorf("lock workspace [%s] failed: %s", WorkspaceDir, err)
os.Exit(ExitCodeWorkspaceLocked)
ok, err := WorkspaceLock.TryLock()
if ok {
return
}
if nil != err {
logging.LogErrorf("lock workspace [%s] failed: %s", WorkspaceDir, err)
} else {
logging.LogErrorf("lock workspace [%s] failed", WorkspaceDir)
}
os.Exit(ExitCodeWorkspaceLocked)
}
func UnlockWorkspace() {