Skip to content

Commit

Permalink
work in progress...
Browse files Browse the repository at this point in the history
  • Loading branch information
reel committed Jul 13, 2017
1 parent 8d720ae commit b277c19
Show file tree
Hide file tree
Showing 9 changed files with 245 additions and 95 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"pretest": "lerna bootstrap",
"test": "NODE_CONFIG_DIR=./packages/config/tests/config jest --coverage --forceExit --runInBand --verbose --bail",
"coveralls": "nyc --instrument=false --source-map=false report --temp-directory=./coverage --reporter=text-lcov | coveralls",
"test:watch": "NODE_CONFIG_DIR=./packages/config/tests/config jest --coverage --runInBand --verbose --bail --watch "
"test:watch": "NODE_CONFIG_DIR=./packages/config/tests/config jest --coverage --runInBand --verbose --bail --watch --notify"
},
"devDependencies": {
"@types/jest": "^20.0.2",
Expand Down
2 changes: 1 addition & 1 deletion packages/controller/tests/main.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ describe('controllers', () => {
expect(henri.controllers['b#cd']).not.toBeDefined();
henri.controllers['a#bc']({}, { send: res1 });
expect(res1).toBeCalled();
reloader = henri._loaders.list.pop();
reloader = henri._loaders.pop();
expect(reloader).toBeDefined();
henri.config.location.controllers =
'./packages/controller/tests/controllers-two';
Expand Down
3 changes: 3 additions & 0 deletions packages/log/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ log.fatalError = msg => {
throw new Error(msg);
};

// eslint-disable-next-line no-console
log.space = () => console.log(' ');

// We don't use addModule as it is not yet registered
henri.log = log;
henri.log.getColor = getColor;
Expand Down
2 changes: 1 addition & 1 deletion packages/model/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ async function reload() {

henri.addLoader(reload);

henri.addReaper(stop);
henri.addUnloader(stop);

module.exports = init();

Expand Down
92 changes: 31 additions & 61 deletions packages/server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ const {
prepareUrls,
} = require('react-dev-utils/WebpackDevServerUtils');
const openBrowser = require('react-dev-utils/openBrowser');
const detect = require('detect-port');

const { config, cwd, log, notify } = henri;
const { config, cwd, log } = henri;

const app = express();

Expand All @@ -28,20 +29,24 @@ app.use(cookieParser());

app.use(express.static(path.resolve(cwd, 'app/views/public')));

async function start(delay) {
port = process.env.NODE_ENV !== 'production'
? await choosePort('0.0.0.0', port)
: port;
app
async function start(delay, cb = null) {
if (henri.getStatus('http') && typeof cb === 'function') return cb();

port = henri.isTest ? await detect(port) : port;
port = henri.isDev ? await choosePort('0.0.0.0', port) : port;
app.use('*', (req, res) => res.status(404).end('page not found'));
return app
.listen(port, function() {
const bootTiming = delay
? ` (took ${Math.round(process.hrtime(delay)[1] / 1000000)}ms)`
: '';
const bootTiming = delay ? ` (took ${henri.getDiff(delay)}ms)` : '';
const urls = prepareUrls('http', '0.0.0.0', port);
log.info(`server started on port ${port}${bootTiming}`);
process.env.NODE_ENV !== 'production' && watch();
henri.localUrlForBrowser = urls.localUrlForBrowser;
henri.isDev && watch();
henri._url = urls.localUrlForBrowser;
henri._port = port;
henri.setStatus('http', true);
typeof cb === 'function' && cb();
})
.on('error', typeof cb === 'function' && cb)
.on('error', handleError);
}

Expand All @@ -51,7 +56,7 @@ async function watch() {
watcher.on('ready', () => {
watcher.on('all', (event, path) => {
log.warn('changes detected in', path);
reload();
henri.reload();
});
log.info('watching filesystem for changes...');
});
Expand All @@ -60,78 +65,41 @@ async function watch() {
data = data.toString();
const chr = data.charCodeAt(0);
if (chr === 3) {
await stop();
await henri.stop();
log.warn('exiting application...');
console.log('');
log.space();
process.exit(0);
}
if (chr === 18) {
log.warn('user-requested server reload...');
reload();
henri.reload();
}
if (chr === 14 || chr === 15) {
if (henri.localUrlForBrowser) {
openBrowser(henri.localUrlForBrowser);
if (henri._url) {
openBrowser(henri._url);
}
}
});
process.stdin.setRawMode(true);
setTimeout(() => {
console.log('');
log.space();
const cmdCtrl = process.platform === 'darwin' ? 'Cmd' : 'Ctrl';
log.info(`To reload the server codebase, use ${cmdCtrl}+R`);
log.info(
`To open the a new browser tab with the project, use ${cmdCtrl}+O or ${cmdCtrl}+N`
);
log.info(`To quit, use ${cmdCtrl}+C`);
console.log('');
log.space();
}, 2 * 1000);
}

async function reload() {
const start = process.hrtime();
const loaders = henri._loaders.list;
Object.keys(require.cache).forEach(function(id) {
delete require.cache[id];
});
try {
if (loaders.length > 0) {
for (let loader of loaders) {
await loader();
}
}
const end = Math.round(process.hrtime(start)[1] / 1000000);
log.info(`server hot reload completed in ${end}ms`);
console.log('');
notify('Hot-reload', 'Server-side hot reload completed..');
} catch (e) {
log.error(e);
}
}

async function stop() {
const start = process.hrtime();
const reapers = henri._reapers.list;
try {
if (reapers.length > 0) {
for (let reaper of reapers) {
await reaper();
}
}
const end = Math.round(process.hrtime(start)[1] / 1000000);
log.warn(`server tear down completed in ${end}ms`);
} catch (e) {
log.error(e);
}
}

function handleError(err) {
if (err.code === 'EADDRINUSE') {
log.error(`port ${port} is already in use`);
console.log('');
log.error('modify your config or kill the other process');
console.log('');
process.exit(-1);
log.fatalError(`
port ${port} is already in use
modify your config or kill the other process
`);
}
log.error(err);
}
Expand All @@ -143,4 +111,6 @@ henri.app = app;
henri.express = express;
henri.start = start;

module.exports = { start, handleError };

log.info('server module loaded.');
5 changes: 4 additions & 1 deletion packages/server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,19 @@
"compression": "^1.6.2",
"cookie-parser": "^1.4.3",
"cors": "^2.8.3",
"detect-port": "^1.2.1",
"express": "^4.15.3",
"path": "^0.12.7",
"react-dev-utils": "^3.0.2",
"server-timings": "^1.0.4"
"server-timings": "^1.0.4",
"supertest": "^3.0.0"
},
"devDependencies": {
"@types/body-parser": "^1.16.3",
"@types/compression": "^0.0.33",
"@types/cookie-parser": "^1.3.30",
"@types/express": "^4.0.35",
"@types/jest": "^20.0.2",
"@types/node": "^8.0.10"
}
}
15 changes: 15 additions & 0 deletions packages/server/tests/main.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const request = require('supertest');
require('../../config/index.js');
require('../index.js');

describe('server', () => {
let serv;
beforeAll(done => {
serv = henri.start(null, done);
});
afterAll(done => serv.close(done));
test('loads', async () => {
expect(henri.getStatus('http')).toBeTruthy();
await request(henri.app).get('/bb').expect(500);
});
});

0 comments on commit b277c19

Please sign in to comment.