github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/client/src/app/core/ui.js (about) 1 import {app} from 'electron'; 2 import path from 'path'; 3 import {spawn} from 'child_process'; 4 import express from 'express'; 5 import {portServer} from "../utils/consts"; 6 7 import {DEBUG, portClient} from '../utils/consts'; 8 import {logInfo, logErr} from '../utils/log'; 9 10 let _uiService; 11 12 export function startUIService() { 13 if (_uiService) { 14 return Promise.resolve(); 15 } 16 17 let {UI_SERVER_URL: uiServerUrl} = process.env; 18 19 if (!uiServerUrl && !DEBUG) { 20 uiServerUrl = path.resolve(process.resourcesPath, 'ui'); 21 } 22 23 if (uiServerUrl) { 24 if (/^https?:\/\//.test(uiServerUrl)) { 25 return Promise.resolve(uiServerUrl); 26 } 27 return new Promise((resolve, reject) => { 28 if (!path.isAbsolute(uiServerUrl)) { 29 uiServerUrl = path.resolve(app.getAppPath(), uiServerUrl); 30 } 31 32 const port = process.env.UI_SERVER_PORT || portClient; 33 logInfo(`>> starting ui serer at ${uiServerUrl} with port ${port}`); 34 35 const uiServer = express(); 36 uiServer.use(express.static(uiServerUrl)); 37 const server = uiServer.listen(port, serverError => { 38 if (serverError) { 39 console.error('>>> start ui server failed with error', serverError); 40 _uiService = null; 41 reject(serverError); 42 } else { 43 logInfo(`>> ui server started successfully on http://localhost:${port}.`); 44 resolve(`http://localhost:${port}`); 45 } 46 }); 47 server.on('close', () => { 48 _uiService = null; 49 }); 50 _uiService = uiServer; 51 }) 52 } 53 54 return new Promise((resolve, reject) => { 55 const cwd = path.resolve(app.getAppPath(), '../ui'); 56 logInfo(`>> starting ui development server with command "npm run serve" in "${cwd}"...`); 57 58 let resolved = false; 59 const cmd = spawn('npm', ['run', 'serve'], { 60 cwd, 61 shell: true, 62 }); 63 cmd.on('close', (code) => { 64 logInfo(`>> ui server closed with code ${code}`); 65 _uiService = null; 66 }); 67 cmd.stdout.on('data', data => { 68 if (resolved) { 69 return; 70 } 71 const dataString = String(data); 72 const lines = dataString.split('\n'); 73 for (let i = 0; i < lines.length; i++) { 74 const line = lines[i]; 75 if (DEBUG) { 76 logInfo('\t' + line); 77 } 78 if (line.includes('App running at:')) { 79 const nextLine = lines[i + 1] || lines[i + 2]; 80 if (DEBUG) { 81 logInfo('\t' + nextLine); 82 } 83 if (!nextLine) { 84 logErr('\t' + `cannot grabing running address after line "${line}".`); 85 throw new Error(`cannot grabing running address after line "${line}".`); 86 } 87 const url = nextLine.split('Local: ')[1]; 88 if (url) { 89 resolved = true; 90 resolve(url); 91 } 92 if (!DEBUG) { 93 break; 94 } 95 } 96 } 97 }); 98 cmd.on('error', spawnError => { 99 logErr('>>> start ui server failed, error' + spawnError); 100 reject(spawnError) 101 }); 102 _uiService = cmd; 103 }); 104 }