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  }