Skip to content

Commit b233e8f

Browse files
tiaguinhoalexeagle
authored andcommitted
refactor(@angular-devkit/build-angular): improve check port
Closes 8595
1 parent 886b5c3 commit b233e8f

File tree

4 files changed

+30
-30
lines changed

4 files changed

+30
-30
lines changed

packages/angular_devkit/build_angular/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
"minimatch": "3.0.4",
3030
"parse5": "4.0.0",
3131
"opn": "5.4.0",
32-
"portfinder": "1.0.20",
3332
"postcss": "7.0.7",
3433
"postcss-import": "12.0.1",
3534
"postcss-loader": "3.0.0",

packages/angular_devkit/build_angular/src/angular-cli-files/utilities/check-port.ts

+28-18
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,36 @@
55
* Use of this source code is governed by an MIT-style license that can be
66
* found in the LICENSE file at https://angular.io/license
77
*/
8+
import * as net from 'net';
89

9-
import { Observable } from 'rxjs';
10-
const portfinder = require('portfinder');
10+
export function checkPort(port: number, host: string, basePort = 49152): Promise<number> {
11+
return new Promise<number>((resolve, reject) => {
12+
function _getPort(portNumber: number) {
13+
if (portNumber > 65535) {
14+
reject(new Error(`There is no port available.`));
15+
}
1116

17+
const server = net.createServer();
1218

13-
export function checkPort(port: number, host: string, basePort = 49152): Observable<number> {
14-
return new Observable(obs => {
15-
portfinder.basePort = basePort;
16-
// tslint:disable:no-any
17-
portfinder.getPort({ port, host }, (err: any, foundPort: number) => {
18-
if (err) {
19-
obs.error(err);
20-
} else if (port !== foundPort && port !== 0) {
21-
// If the port isn't available and we weren't looking for any port, throw error.
22-
obs.error(`Port ${port} is already in use. Use '--port' to specify a different port.`);
23-
} else {
24-
// Otherwise, our found port is good.
25-
obs.next(foundPort);
26-
obs.complete();
27-
}
28-
});
19+
server.once('error', (err: Error & {code: string}) => {
20+
if (err.code !== 'EADDRINUSE') {
21+
reject(err);
22+
} else if (port === 0) {
23+
_getPort(portNumber + 1);
24+
} else {
25+
// If the port isn't available and we weren't looking for any port, throw error.
26+
reject(
27+
new Error(`Port ${port} is already in use. Use '--port' to specify a different port.`),
28+
);
29+
}
30+
})
31+
.once('listening', () => {
32+
server.close();
33+
resolve(portNumber);
34+
})
35+
.listen(portNumber, host);
36+
}
37+
38+
_getPort(port || basePort);
2939
});
3040
}

packages/angular_devkit/build_angular/src/dev-server/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { WebpackDevServerBuilder } from '@angular-devkit/build-webpack';
1616
import { Path, getSystemPath, resolve, tags, virtualFs } from '@angular-devkit/core';
1717
import { Stats, existsSync, readFileSync } from 'fs';
1818
import * as path from 'path';
19-
import { Observable, throwError } from 'rxjs';
19+
import { Observable, from, throwError } from 'rxjs';
2020
import { concatMap, map, tap } from 'rxjs/operators';
2121
import * as url from 'url';
2222
import * as webpack from 'webpack';
@@ -67,7 +67,7 @@ export class DevServerBuilder implements Builder<DevServerBuilderOptions> {
6767
let first = true;
6868
let opnAddress: string;
6969

70-
return checkPort(options.port, options.host).pipe(
70+
return from(checkPort(options.port, options.host)).pipe(
7171
tap((port) => options.port = port),
7272
concatMap(() => this._getBrowserOptions(options)),
7373
tap(opts => browserOptions = normalizeBuilderSchema(

yarn.lock

-9
Original file line numberDiff line numberDiff line change
@@ -7574,15 +7574,6 @@ popper.js@^1.14.1:
75747574
resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.4.tgz#8eec1d8ff02a5a3a152dd43414a15c7b79fd69b6"
75757575
integrity sha1-juwdj/AqWjoVLdQ0FKFce3n9abY=
75767576

7577-
7578-
version "1.0.20"
7579-
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a"
7580-
integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==
7581-
dependencies:
7582-
async "^1.5.2"
7583-
debug "^2.2.0"
7584-
mkdirp "0.5.x"
7585-
75867577
portfinder@^1.0.9:
75877578
version "1.0.19"
75887579
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.19.tgz#07e87914a55242dcda5b833d42f018d6875b595f"

0 commit comments

Comments
 (0)