'use strict'; const cp = require('child_process'); const chalk = require('chalk'); const InspectorProxy = require('inspector-proxy'); const debug = require('debug')('egg-bin'); const semver = require('semver'); const Command = require('./dev'); const newDebugger = semver.gte(process.version, '7.0.0'); class DebugCommand extends Command { constructor(rawArgv) { super(rawArgv); this.usage = 'Usage: egg-bin debug [dir] [options]'; this.options = { // set default to empty so `--inspect` will always pass to fork inspect: { description: 'V8 Inspector port', default() { /* istanbul ignore next */ return newDebugger ? '' : undefined; }, }, 'inspect-brk': { description: 'whether break at start', }, debug: { description: 'legacy debugger', default() { /* istanbul ignore next */ return newDebugger ? undefined : ''; }, }, proxy: { description: 'worker debug proxy port', default: 9999, }, }; process.env.EGG_DEBUG = 'true'; } get description() { return 'Start server at local debug mode'; } * run(context) { const proxyPort = context.argv.proxy; context.argv.proxy = undefined; const eggArgs = yield this.formatArgs(context); const options = { execArgv: context.execArgv, env: Object.assign({ NODE_ENV: 'development', EGG_DEBUG: true }, context.env), }; debug('%s %j %j, %j', this.serverBin, eggArgs, options.execArgv, options.env.NODE_ENV); // start egg const child = cp.fork(this.serverBin, eggArgs, options); // start debug proxy const proxy = new InspectorProxy({ port: proxyPort }); // proxy to new worker child.on('message', msg => { if (msg && msg.action === 'debug' && msg.from === 'app') { const { debugPort, pid } = msg.data; debug(`recieve new worker#${pid} debugPort: ${debugPort}`); proxy.start({ debugPort }).then(() => { // don't log within VSCode and WebStorm // TODO: don't start proxy within vscode and webstorm at next major if (!process.env.VSCODE_CLI && !process.env.NODE_DEBUG_OPTION && !process.env.JB_DEBUG_FILE) { console.log(chalk.yellow(`Debug Proxy online, now you could attach to ${proxyPort} without worry about reload.`)); if (newDebugger) console.log(chalk.yellow(`DevTools → ${proxy.url}`)); } }); } }); child.on('exit', () => proxy.end()); } } module.exports = DebugCommand;