Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
b88f52ba90 | |||
43c8f63ce6 | |||
b5eac3c54f | |||
fda63e4f95 |
2
package-lock.json
generated
2
package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@pushrocks/smartnetwork",
|
"name": "@pushrocks/smartnetwork",
|
||||||
"version": "1.1.1",
|
"version": "1.1.3",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@pushrocks/smartnetwork",
|
"name": "@pushrocks/smartnetwork",
|
||||||
"version": "1.1.1",
|
"version": "1.1.3",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "network diagnostics",
|
"description": "network diagnostics",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
|
@ -19,8 +19,8 @@ tap.test('should determine wether a port is free', async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should scan a port', async () => {
|
tap.test('should scan a port', async () => {
|
||||||
const portscanner = new smartnetwork.PortScanner();
|
await expect(testSmartNetwork.isRemotePortAvailable('google.com:80')).to.eventually.be.true;
|
||||||
expect(portscanner.checkPortStatus('google.com:80')).to.eventually.be.true;
|
await expect(testSmartNetwork.isRemotePortAvailable('67.207.79.63:12346')).to.eventually.be.false;
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.start();
|
tap.start();
|
||||||
|
@ -1,2 +1 @@
|
|||||||
export * from './smartnetwork.classes.portscanner';
|
export * from './smartnetwork.classes.smartnetwork';
|
||||||
export * from './smartnetwork.classes.speedtest';
|
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
import * as plugins from './smartnetwork.plugins';
|
|
||||||
|
|
||||||
export class PortScanner {
|
|
||||||
public async checkPortStatus(domainArg: string): Promise<boolean> {
|
|
||||||
const done = plugins.smartpromise.defer<boolean>();
|
|
||||||
const domainPart = domainArg.split(':')[0];
|
|
||||||
const port = parseInt(domainArg.split(':')[1], 10);
|
|
||||||
|
|
||||||
plugins.portscanner.checkPortStatus(port, domainPart, (err, status ) => {
|
|
||||||
if (err) {
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
if (status === 'open') {
|
|
||||||
done.resolve(true);
|
|
||||||
} else {
|
|
||||||
done.resolve(false)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
const result = await done.promise;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
@ -108,9 +108,7 @@ export class SmartNetwork {
|
|||||||
public async isRemotePortAvailable(domainArg: string, portArg?: number): Promise<boolean> {
|
public async isRemotePortAvailable(domainArg: string, portArg?: number): Promise<boolean> {
|
||||||
const done = plugins.smartpromise.defer<boolean>();
|
const done = plugins.smartpromise.defer<boolean>();
|
||||||
const domainPart = domainArg.split(':')[0];
|
const domainPart = domainArg.split(':')[0];
|
||||||
const port = (() => {
|
const port = portArg ? portArg : parseInt(domainArg.split(':')[1], 10);
|
||||||
return portArg ? portArg : parseInt(domainArg.split(':')[1], 10);
|
|
||||||
})()
|
|
||||||
|
|
||||||
plugins.portscanner.checkPortStatus(port, domainPart, (err, status ) => {
|
plugins.portscanner.checkPortStatus(port, domainPart, (err, status ) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -1,103 +0,0 @@
|
|||||||
import * as plugins from './smartnetwork.plugins';
|
|
||||||
|
|
||||||
export class ISpeedtestData {
|
|
||||||
speeds: {
|
|
||||||
download: number;
|
|
||||||
upload: number;
|
|
||||||
originalDownload: number;
|
|
||||||
originalUpload: number;
|
|
||||||
};
|
|
||||||
client: {
|
|
||||||
ip: string;
|
|
||||||
lat: number;
|
|
||||||
lon: number;
|
|
||||||
isp: string;
|
|
||||||
isprating: string;
|
|
||||||
rating: number;
|
|
||||||
ispdlavg: number;
|
|
||||||
ispulavg: number;
|
|
||||||
};
|
|
||||||
server: {
|
|
||||||
host: string;
|
|
||||||
lat: number;
|
|
||||||
lon: number;
|
|
||||||
location: string;
|
|
||||||
country: string;
|
|
||||||
cc: string;
|
|
||||||
sponsor: string;
|
|
||||||
distance: number;
|
|
||||||
distanceMi: number;
|
|
||||||
ping: number;
|
|
||||||
id: string;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SmartNetwork simplifies actions within the network
|
|
||||||
*/
|
|
||||||
export class SmartNetwork {
|
|
||||||
async getSpeed(measurementTime = 5000): Promise<ISpeedtestData> {
|
|
||||||
let done = plugins.smartpromise.defer<ISpeedtestData>();
|
|
||||||
const test = plugins.speedtestNet({ maxTime: measurementTime });
|
|
||||||
test.on('data', data => {
|
|
||||||
done.resolve(data);
|
|
||||||
});
|
|
||||||
test.on('error', err => {
|
|
||||||
done.reject(err);
|
|
||||||
});
|
|
||||||
return await done.promise;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* returns a promise with a boolean answer
|
|
||||||
* note: false also resolves with false as argument
|
|
||||||
* @param port
|
|
||||||
*/
|
|
||||||
async isLocalPortAvailable(port: number): Promise<boolean> {
|
|
||||||
const doneIpV4 = plugins.smartpromise.defer<boolean>();
|
|
||||||
const doneIpV6 = plugins.smartpromise.defer<boolean>();
|
|
||||||
const net = await import('net'); // creates only one instance of net ;) even on multiple calls
|
|
||||||
|
|
||||||
// test IPv4 space
|
|
||||||
const ipv4Test = net.createServer();
|
|
||||||
ipv4Test.once('error', function(err: any) {
|
|
||||||
if (err.code !== 'EADDRINUSE') {
|
|
||||||
doneIpV4.resolve(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
doneIpV4.resolve(false);
|
|
||||||
});
|
|
||||||
ipv4Test.once('listening', function() {
|
|
||||||
ipv4Test.once('close', () => {
|
|
||||||
doneIpV4.resolve(true);
|
|
||||||
});
|
|
||||||
ipv4Test.close();
|
|
||||||
});
|
|
||||||
ipv4Test.listen(port, '0.0.0.0');
|
|
||||||
|
|
||||||
await doneIpV4.promise;
|
|
||||||
|
|
||||||
// test IPv6 space
|
|
||||||
const test_ipv6 = net.createServer();
|
|
||||||
test_ipv6.once('error', function(err: any) {
|
|
||||||
if (err.code !== 'EADDRINUSE') {
|
|
||||||
doneIpV6.resolve(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
doneIpV6.resolve(false);
|
|
||||||
});
|
|
||||||
test_ipv6.once('listening', function() {
|
|
||||||
test_ipv6.once('close', () => {
|
|
||||||
doneIpV6.resolve(true);
|
|
||||||
});
|
|
||||||
test_ipv6.close();
|
|
||||||
});
|
|
||||||
test_ipv6.listen(port, '::');
|
|
||||||
|
|
||||||
// lets wait for the result
|
|
||||||
const resultIpV4 = await doneIpV4.promise;
|
|
||||||
const resultIpV6 = await doneIpV6.promise;
|
|
||||||
const result = resultIpV4 === true && resultIpV6 === true;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
Reference in New Issue
Block a user