Skip to content

Commit

Permalink
No longer throwing exception to module and just returns false. README…
Browse files Browse the repository at this point in the history
… and .npmignore modifications
  • Loading branch information
Odinvt committed Jun 9, 2016
1 parent 66bc3ab commit 133246e
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 59 deletions.
2 changes: 2 additions & 0 deletions .npmignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
node_modules/

build/
android/build/
.git/
*.pbxuser
!default.pbxuser
*.mode1v3
Expand Down
99 changes: 98 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,99 @@
# react-native-portavailable
A React Native Package for checking port availability on native android udp & tcp
> A React Native Package for checking tcp and udp port availability on native android.
This is an [implementation](http://svn.apache.org/viewvc/camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/AvailablePortFinder.java?view=markup#l130) coming from the Apache [camel](http://camel.apache.org/) project.

###### Support
This package is only supported on **android** devices, since i'm not much of an iOS Developer. The source code is pretty much straightforward so feel free to submit a PR of an iOS port i'll be happy to merge ! :)

### Install
npm i -S react-native-portavailable

#### Android


- Add the following line to the bottom of your project's `settings.gradle` file.

`project(':react-native-portavailable').projectDir = new File(settingsDir, '../node_modules/react-native-portavailable/android')`

- Change the `include` line of your project's `settings.gradle` to include the `:react-native-portavailable` project.

`include ':react-native-portavailable', ':app'`

- Open your app's `build.gradle` file and add the following line to the `dependencies` block.

`compile project(":react-native-portavailable")`

- In your app's `MainActivity.java` file, add `new PortAvailableReactModule()` to the return statement of the `getPackages()` function.

```
...
new MainReactPackage(),
new PortAvailableReactModule()
...
```

- Then in the same file add the import statement :
`import com.odinvt.portavailable.PortAvailableReactModule;`


### Usage

import PortAvailable from 'react-native-portavailable'

#### API

The calls to `PortAvailable` methods are static so you can go ahead and use it directly.

##### Methods

###### `PortAvailable.check(port)` Checks if the port 'port' is available


- This will return a `Promise` instance that resolves to a `boolean` of the availability of the port. We're handling sockets opened and closed on the native side so we do need to expect an async execution. There is no need to use a `catch` method on the Promise object since all the exceptions are caught on the native side and the Promise just resolves to false.

Example :

```javascript

PortAvailable.check(48500).then(available => {
// 'available' is true if the port 48500 is available
})

```

###### `PortAvailable.checkRange(min_port, max_port, stop = 0)` Checks which of the ports between 'min_port' and 'max_port' (included) are available

- This will return a `Promise` instance that resolves to an `array` of the available ports.
- The `stop` parameter is optional and tells the function at how much available ports it should stop checking and resolve. `stop = 0` is the default value and it tells the function to just check all the ports until `max_port`.

Example :

```javascript

PortAvailable.checkRange(48500, 48600, 5).then(ports => {
// 'ports' is an array of the available ports
// for example : ports = [48500, 48501, 48502, 48503, 48505] if 48504 is not available
})

```

###### `PortAvailable.getPorts()` Returns the ports discovered by the last `checkRange` method call

- This will return an `array` of the available ports.
- The preferred way of getting the discovered ports is inside the `PortAvailable.checkRange` `then` callback. This method is provided so you can access the discovered ports anywhere on your application **but only if** you're sure that the `PortAvailable.getPorts()` call is made after the `PortAvailable.checkRange` Promise resolves .

Example :

```javascript

let open_ports = PortAvailable.getPorts();
// open_ports = [48500, 48501, 48502, 48503, 48505]

```

### Babel

This component uses ES6. So if you're using `Webpack` you should launch `babel` on `main.js` and output to `main-tf.js` if for some reason the `npm postinstall` script didn't execute.

"postinstall": "babel main.js --out-file main-tf.js"
Original file line number Diff line number Diff line change
Expand Up @@ -27,40 +27,32 @@ public String getName() {
@ReactMethod
public void available(int port, Promise promise) {
boolean available;
try {
available = check(port);
available = check(port);

promise.resolve(available);
} catch (Exception e) {
promise.reject(e);
}
promise.resolve(available);
}

@ReactMethod
public void range(int min_port, int max_port, int stop, Promise promise) {
WritableArray ports = new WritableNativeArray();

try {
int found = 0;
for(int i = min_port; i <= max_port; i++) {
if(stop > 0 && found == stop) {
break;
}
if(check(i)) {
ports.pushInt(i);
found++;
}
int found = 0;
for(int i = min_port; i <= max_port; i++) {
if(stop > 0 && found == stop) {
break;
}
if(check(i)) {
ports.pushInt(i);
found++;
}

promise.resolve(ports);
} catch (Exception e) {
promise.reject(e);
}

promise.resolve(ports);
}

public boolean check(int port) throws IllegalArgumentException, IOException {
public boolean check(int port) {
if (port < MIN_PORT_NUMBER || port > MAX_PORT_NUMBER) {
throw new IllegalArgumentException("Invalid start port: " + port);
return false;
}

ServerSocket ss = null;
Expand All @@ -73,7 +65,7 @@ public boolean check(int port) throws IllegalArgumentException, IOException {
ds.setReuseAddress(true);
result = true;
} catch (IOException e) {
throw new IOException(e);
/*goes to the return false statement after closing the sockets*/
} finally {
if (ds != null) {
ds.close();
Expand All @@ -84,7 +76,6 @@ public boolean check(int port) throws IllegalArgumentException, IOException {
ss.close();
} catch (IOException e) {
/* should not be thrown */
throw new IOException(e);
}
}
}
Expand Down
30 changes: 0 additions & 30 deletions main-tf.js

This file was deleted.

4 changes: 0 additions & 4 deletions main.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@ export default class PortAvailable {
return new Promise((resolve, reject) => {
RNPortAvailable.available(port).then((available) => {
resolve(available);
}).catch(err => {
reject(err);
})
})
}
Expand All @@ -20,8 +18,6 @@ export default class PortAvailable {
RNPortAvailable.range(min_port, max_port, stop).then((availablePorts) => {
PortAvailable.available_ports = availablePorts;
resolve(availablePorts);
}).catch(err => {
reject(err);
})
})
}
Expand Down

0 comments on commit 133246e

Please sign in to comment.