Skip to content
This repository was archived by the owner on May 1, 2020. It is now read-only.

Commit

Permalink
fix(serve): find an open port for the notification server if port is …
Browse files Browse the repository at this point in the history
…used.
  • Loading branch information
jthoms1 committed Dec 14, 2016
1 parent b68b00b commit d6de413
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 23 deletions.
56 changes: 33 additions & 23 deletions src/serve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { createNotificationServer } from './dev-server/notification-server';
import { createHttpServer } from './dev-server/http-server';
import { createLiveReloadServer } from './dev-server/live-reload';
import { ServeConfig, IONIC_LAB_URL } from './dev-server/serve-config';
import { findClosestOpenPort } from './util/network';

const DEV_LOGGER_DEFAULT_PORT = 53703;
const LIVE_RELOAD_DEFAULT_PORT = 35729;
Expand All @@ -17,29 +18,38 @@ const DEV_SERVER_DEFAULT_HOST = '0.0.0.0';

export function serve(context: BuildContext) {
setContext(context);
const config: ServeConfig = {
httpPort: getHttpServerPort(context),
host: getHttpServerHost(context),
rootDir: context.rootDir,
wwwDir: context.wwwDir,
buildDir: context.buildDir,
isCordovaServe: isCordovaServe(context),
launchBrowser: launchBrowser(context),
launchLab: launchLab(context),
browserToLaunch: browserToLaunch(context),
useLiveReload: useLiveReload(context),
liveReloadPort: getLiveReloadServerPort(context),
notificationPort: getNotificationPort(context),
useServerLogs: useServerLogs(context),
useProxy: useProxy(context),
notifyOnConsoleLog: sendClientConsoleLogs(context)
};

createNotificationServer(config);
createLiveReloadServer(config);
createHttpServer(config);

return watch(context)

let config: ServeConfig;
const notificationPort = getNotificationPort(context);
const host = getHttpServerHost(context);

return findClosestOpenPort(host, notificationPort)
.then((notificationPortFound) => {

config = {
httpPort: getHttpServerPort(context),
host: host,
rootDir: context.rootDir,
wwwDir: context.wwwDir,
buildDir: context.buildDir,
isCordovaServe: isCordovaServe(context),
launchBrowser: launchBrowser(context),
launchLab: launchLab(context),
browserToLaunch: browserToLaunch(context),
useLiveReload: useLiveReload(context),
liveReloadPort: getLiveReloadServerPort(context),
notificationPort: notificationPortFound,
useServerLogs: useServerLogs(context),
useProxy: useProxy(context),
notifyOnConsoleLog: sendClientConsoleLogs(context)
};

createNotificationServer(config);
createLiveReloadServer(config);
createHttpServer(config);

return watch(context);
})
.then(() => {
onReady(config, context);
}, (err: BuildError) => {
Expand Down
33 changes: 33 additions & 0 deletions src/util/network.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import * as net from 'net';

export function findClosestOpenPort(host: string, port: number): Promise<number> {
function t(portToCheck: number): Promise<number> {
return isPortTaken(host, portToCheck).then(isTaken => {
if (!isTaken) {
return portToCheck;
}
return t(portToCheck + 1);
});
}

return t(port);
}

export function isPortTaken(host: string, port: number): Promise<boolean> {
return new Promise((resolve, reject) => {
const tester = net.createServer()
.once('error', (err: any) => {
if (err.code !== 'EADDRINUSE') {
return resolve(true);
}
resolve(true);
})
.once('listening', () => {
tester.once('close', () => {
resolve(false);
})
.close();
})
.listen(port, host);
});
}

0 comments on commit d6de413

Please sign in to comment.