1// Copyright (C) 2021 The Android Open Source Project 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15const path = require('path'); 16const http = require('http'); 17const child_process = require('child_process'); 18 19module.exports = async function() { 20 // Start the local HTTP server. 21 const ROOT_DIR = path.dirname(path.dirname(__dirname)); 22 const node = path.join(ROOT_DIR, 'ui', 'node'); 23 const args = [ 24 path.join(ROOT_DIR, 'ui', 'build.js'), 25 '--serve', 26 '--no-build', 27 '--out=.' 28 ]; 29 const spwOpts = {stdio: ['ignore', 'inherit', 'inherit']}; 30 const srvProc = child_process.spawn(node, args, spwOpts); 31 global.__DEV_SERVER__ = srvProc; 32 33 // Wait for the HTTP server to be ready. 34 let attempts = 10; 35 for (; attempts > 0; attempts--) { 36 await new Promise(r => setTimeout(r, 1000)); 37 try { 38 await new Promise((resolve, reject) => { 39 const req = http.request('http://127.0.0.1:10000/frontend_bundle.js'); 40 req.end(); 41 req.on('error', err => reject(err)); 42 req.on('finish', () => resolve()); 43 }); 44 break; 45 } catch (err) { 46 console.error('Waiting for HTTP server to come up', err.message); 47 continue; 48 } 49 } 50 if (attempts == 0) { 51 throw new Error('HTTP server didn\'t come up'); 52 } 53 if (srvProc.exitCode !== null) { 54 throw new Error( 55 `The dev server unexpectedly exited, code=${srvProc.exitCode}`); 56 } 57} 58