-
Notifications
You must be signed in to change notification settings - Fork 6
/
Port.js
84 lines (69 loc) · 1.59 KB
/
Port.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
const portfinder = require('portfinder');
class Port {
constructor(port, project) {
this._port = port;
this._project = project;
this._usableCache = void 0;
this._usable().then((usable) => this._usableCache = usable);
}
free() {
this._project = void 0;
this._updateUsableCache();
}
get number() {
return this._port;
}
get project() {
return this._project;
}
set project(project) {
// Two way assign
if (!project.port) {
this._project = project;
project.port = this;
}
this._updateUsableCache();
}
/**
* Return lastest port check result.
* @return {Boolean}
*/
get usableCache() {
return this._usableCache;
}
/**
* If this port is non-occuppied and no project use this port.
* @return {Promise.<Boolean, Error>}
*/
get usable() {
return this._usable();
}
/**
* If this port is non-occuppied.
* @return {Promise.<Boolean, Error>}
*/
get isOccuppied() {
return this._isOccuppied();
}
async _usable() {
return this._usableCache = !(await this._isOccuppied()) && (!this._project);
}
async _isOccuppied() {
const
portNumber = await portfinder.getPortPromise({
port: this._port
}),
isOccuppied = (portNumber !== this._port);
// update usableCache
this._usableCache = !isOccuppied && !this._project;
return isOccuppied;
}
/**
* @private
* @return {Promise.<Boolean, Error>}
*/
async _updateUsableCache() {
return this._usableCache = !(await this._isOccuppied()) && (!this._project);
}
}
module.exports = Port;