@teambit/toolbox.network.get-port
Advanced tools
Comparing version 1.0.8 to 1.0.9
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.Port = void 0; | ||
function _net() { | ||
const data = _interopRequireDefault(require("net")); | ||
_net = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _locked() { | ||
const data = require("./locked"); | ||
_locked = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } | ||
/* eslint-disable no-use-before-define */ | ||
// based on : https://github.com/sindresorhus/get-port/blob/main/index.js | ||
const net_1 = __importDefault(require("net")); | ||
const locked_1 = require("./locked"); | ||
class Port { | ||
get(options) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
var _a; | ||
const lockedPorts = { | ||
old: new Set(), | ||
young: new Set(), | ||
}; | ||
const portCheckSequence = function* (ports) { | ||
if (ports) { | ||
yield* ports; | ||
} | ||
yield 0; | ||
}; | ||
let ports; | ||
const releaseOldLockedPortsIntervalMs = 1000 * 15; | ||
// Lazily create interval on first use | ||
let interval; | ||
if (options) { | ||
ports = typeof options.port === 'number' ? [options.port] : options.port; | ||
} | ||
if (interval === undefined) { | ||
interval = setInterval(() => { | ||
lockedPorts.old = lockedPorts.young; | ||
lockedPorts.young = new Set(); | ||
}, releaseOldLockedPortsIntervalMs); | ||
// Does not exist in some environments (Electron, Jest jsdom env, browser, etc). | ||
if (interval.unref) { | ||
interval.unref(); | ||
} | ||
} | ||
for (const port of portCheckSequence(ports)) { | ||
try { | ||
if ((_a = options.usedPort) === null || _a === void 0 ? void 0 : _a.includes(port)) | ||
throw new locked_1.Locked(port); | ||
let availablePort = yield this.getAvailablePort(Object.assign(Object.assign({}, options), { port })); // eslint-disable-line no-await-in-loop | ||
while (lockedPorts.old.has(availablePort) || lockedPorts.young.has(availablePort)) { | ||
if (port !== 0) { | ||
throw new locked_1.Locked(port); | ||
} | ||
availablePort = yield this.getAvailablePort(Object.assign(Object.assign({}, options), { port })); // eslint-disable-line no-await-in-loop | ||
} | ||
lockedPorts.young.add(availablePort); | ||
return availablePort; | ||
} | ||
catch (error) { | ||
if (!['EADDRINUSE', 'EACCES'].includes(error.code) && !(error instanceof locked_1.Locked)) { | ||
throw error; | ||
} | ||
} | ||
} | ||
throw new Error('No available ports found'); | ||
}); | ||
async get(options) { | ||
const lockedPorts = { | ||
old: new Set(), | ||
young: new Set() | ||
}; | ||
const portCheckSequence = function* (ports) { | ||
if (ports) { | ||
yield* ports; | ||
} | ||
yield 0; | ||
}; | ||
let ports; | ||
const releaseOldLockedPortsIntervalMs = 1000 * 15; | ||
// Lazily create interval on first use | ||
let interval; | ||
if (options) { | ||
ports = typeof options.port === 'number' ? [options.port] : options.port; | ||
} | ||
getAvailablePort(options) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
return new Promise((resolve, reject) => { | ||
const server = net_1.default.createServer(); | ||
server.unref(); | ||
server.on('error', reject); | ||
server.listen(options, () => { | ||
const serverInfo = server.address(); | ||
server.close(() => { | ||
// @ts-ignore | ||
resolve(serverInfo === null || serverInfo === void 0 ? void 0 : serverInfo.port); | ||
}); | ||
}); | ||
}); | ||
}); | ||
if (interval === undefined) { | ||
interval = setInterval(() => { | ||
lockedPorts.old = lockedPorts.young; | ||
lockedPorts.young = new Set(); | ||
}, releaseOldLockedPortsIntervalMs); | ||
// Does not exist in some environments (Electron, Jest jsdom env, browser, etc). | ||
if (interval.unref) { | ||
interval.unref(); | ||
} | ||
} | ||
makeRange(from, to) { | ||
if (!Number.isInteger(from) || !Number.isInteger(to)) { | ||
throw new TypeError('`from` and `to` must be integer numbers'); | ||
for (const port of portCheckSequence(ports)) { | ||
try { | ||
if (options.usedPort?.includes(port)) throw new (_locked().Locked)(port); | ||
let availablePort = await this.getAvailablePort({ | ||
...options, | ||
port | ||
}); // eslint-disable-line no-await-in-loop | ||
while (lockedPorts.old.has(availablePort) || lockedPorts.young.has(availablePort)) { | ||
if (port !== 0) { | ||
throw new (_locked().Locked)(port); | ||
} | ||
availablePort = await this.getAvailablePort({ | ||
...options, | ||
port | ||
}); // eslint-disable-line no-await-in-loop | ||
} | ||
if (from < 1024 || from > 65535) { | ||
throw new RangeError('`from` must be between 1024 and 65535'); | ||
lockedPorts.young.add(availablePort); | ||
return availablePort; | ||
} catch (error) { | ||
if (!['EADDRINUSE', 'EACCES'].includes(error.code) && !(error instanceof _locked().Locked)) { | ||
throw error; | ||
} | ||
if (to < 1024 || to > 65536) { | ||
throw new RangeError('`to` must be between 1024 and 65536'); | ||
} | ||
if (to < from) { | ||
throw new RangeError('`to` must be greater than or equal to `from`'); | ||
} | ||
const generator = function* (f, t) { | ||
for (let port = f; port <= t; port += 1) { | ||
yield port; | ||
} | ||
}; | ||
return generator(from, to); | ||
} | ||
} | ||
static getPort(from, to, usedPort) { | ||
const port = new Port(); | ||
const range = port.makeRange(from, to); | ||
return port.get({ port: range, usedPort }); | ||
throw new Error('No available ports found'); | ||
} | ||
async getAvailablePort(options) { | ||
return new Promise((resolve, reject) => { | ||
const server = _net().default.createServer(); | ||
server.unref(); | ||
server.on('error', reject); | ||
server.listen(options, () => { | ||
const serverInfo = server.address(); | ||
server.close(() => { | ||
// @ts-ignore | ||
resolve(serverInfo?.port); | ||
}); | ||
}); | ||
}); | ||
} | ||
makeRange(from, to) { | ||
if (!Number.isInteger(from) || !Number.isInteger(to)) { | ||
throw new TypeError('`from` and `to` must be integer numbers'); | ||
} | ||
static getPortFromRange(range, usedPort) { | ||
const port = new Port(); | ||
const portsRange = typeof range === 'number' ? [range] : port.makeRange(range[0], range[1]); | ||
return port.get({ port: portsRange, usedPort }); | ||
if (from < 1024 || from > 65535) { | ||
throw new RangeError('`from` must be between 1024 and 65535'); | ||
} | ||
if (to < 1024 || to > 65536) { | ||
throw new RangeError('`to` must be between 1024 and 65536'); | ||
} | ||
if (to < from) { | ||
throw new RangeError('`to` must be greater than or equal to `from`'); | ||
} | ||
const generator = function* (f, t) { | ||
for (let port = f; port <= t; port += 1) { | ||
yield port; | ||
} | ||
}; | ||
return generator(from, to); | ||
} | ||
static getPort(from, to, usedPort) { | ||
const port = new Port(); | ||
const range = port.makeRange(from, to); | ||
return port.get({ | ||
port: range, | ||
usedPort | ||
}); | ||
} | ||
static getPortFromRange(range, usedPort) { | ||
const port = new Port(); | ||
const portsRange = typeof range === 'number' ? [range] : port.makeRange(range[0], range[1]); | ||
return port.get({ | ||
port: portsRange, | ||
usedPort | ||
}); | ||
} | ||
} | ||
exports.Port = Port; | ||
//# sourceMappingURL=get-port.js.map |
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const chai_1 = require("chai"); | ||
const get_port_1 = require("./get-port"); | ||
function _chai() { | ||
const data = require("chai"); | ||
_chai = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
function _getPort() { | ||
const data = require("./get-port"); | ||
_getPort = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
describe('Get port', () => { | ||
it('it should return port from range', () => __awaiter(void 0, void 0, void 0, function* () { | ||
const port = yield get_port_1.Port.getPort(3100, 3200); | ||
(0, chai_1.expect)(typeof port).to.equal('number'); | ||
})); | ||
it('it should return port', () => __awaiter(void 0, void 0, void 0, function* () { | ||
const port = yield get_port_1.Port.getPort(3300, 3400); | ||
(0, chai_1.expect)(port).to.equal(3300); | ||
})); | ||
it('it should return port', () => __awaiter(void 0, void 0, void 0, function* () { | ||
const port = yield get_port_1.Port.getPort(3500, 3600, [3500, 3501]); | ||
(0, chai_1.expect)(port).to.equal(3502); | ||
})); | ||
it('it should return port from range', () => __awaiter(void 0, void 0, void 0, function* () { | ||
const port = yield get_port_1.Port.getPortFromRange([7005, 7100]); | ||
(0, chai_1.expect)(port).to.equal(7005); | ||
})); | ||
it('it should return port from range', async () => { | ||
const port = await _getPort().Port.getPort(3100, 3200); | ||
(0, _chai().expect)(typeof port).to.equal('number'); | ||
}); | ||
it('it should return port', async () => { | ||
const port = await _getPort().Port.getPort(3300, 3400); | ||
(0, _chai().expect)(port).to.equal(3300); | ||
}); | ||
it('it should return port', async () => { | ||
const port = await _getPort().Port.getPort(3500, 3600, [3500, 3501]); | ||
(0, _chai().expect)(port).to.equal(3502); | ||
}); | ||
it('it should return port from range', async () => { | ||
const port = await _getPort().Port.getPortFromRange([7005, 7100]); | ||
(0, _chai().expect)(port).to.equal(7005); | ||
}); | ||
}); | ||
//# sourceMappingURL=get-port.spec.js.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.Port = void 0; | ||
const get_port_1 = require("./get-port"); | ||
Object.defineProperty(exports, "Port", { enumerable: true, get: function () { return get_port_1.Port; } }); | ||
exports.default = get_port_1.Port; | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
Object.defineProperty(exports, "Port", { | ||
enumerable: true, | ||
get: function () { | ||
return _getPort().Port; | ||
} | ||
}); | ||
exports.default = void 0; | ||
function _getPort() { | ||
const data = require("./get-port"); | ||
_getPort = function () { | ||
return data; | ||
}; | ||
return data; | ||
} | ||
var _default = exports.default = _getPort().Port; | ||
//# sourceMappingURL=index.js.map |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.Locked = void 0; | ||
class Locked extends Error { | ||
constructor(port) { | ||
super(`${port} is locked`); | ||
} | ||
constructor(port) { | ||
super(`${port} is locked`); | ||
} | ||
} | ||
exports.Locked = Locked; | ||
//# sourceMappingURL=locked.js.map |
{ | ||
"name": "@teambit/toolbox.network.get-port", | ||
"version": "1.0.8", | ||
"version": "1.0.9", | ||
"homepage": "https://bit.cloud/teambit/toolbox/network/get-port", | ||
@@ -9,3 +9,3 @@ "main": "dist/index.js", | ||
"name": "network/get-port", | ||
"version": "1.0.8" | ||
"version": "1.0.9" | ||
}, | ||
@@ -17,4 +17,3 @@ "dependencies": {}, | ||
"@types/mocha": "9.1.0", | ||
"@types/jest": "26.0.20", | ||
"@types/node": "22.10.5" | ||
"@teambit/node.envs.node-babel-mocha": "0.1.4" | ||
}, | ||
@@ -21,0 +20,0 @@ "peerDependencies": {}, |
@@ -8,8 +8,8 @@ declare module '*.png' { | ||
export const ReactComponent: FunctionComponent<SVGProps<SVGSVGElement> & { title?: string }>; | ||
export const ReactComponent: FunctionComponent< | ||
SVGProps<SVGSVGElement> & { title?: string } | ||
>; | ||
const src: string; | ||
export default src; | ||
} | ||
// @TODO Gilad | ||
declare module '*.jpg' { | ||
@@ -31,1 +31,13 @@ const value: any; | ||
} | ||
declare module '*.otf' { | ||
const value: any; | ||
export = value; | ||
} | ||
declare module '*.woff' { | ||
const value: any; | ||
export = value; | ||
} | ||
declare module '*.woff2' { | ||
const value: any; | ||
export = value; | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
23888
4
411
19