Skip to content

Commit

Permalink
feat: Export Socket class (#104)
Browse files Browse the repository at this point in the history
  • Loading branch information
Rapsssito committed Mar 12, 2021
1 parent 99ece1e commit 72db5fa
Show file tree
Hide file tree
Showing 23 changed files with 282 additions and 349 deletions.
27 changes: 27 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ React Native TCP socket API for Android & iOS with **client SSL/TLS support**. I
## Table of Contents <!-- omit in toc -->

- [Getting started](#getting-started)
- [Overriding `net`](#overriding-net)
- [Using React Native >= 0.60](#using-react-native--060)
- [Self-Signed SSL (only available for React Native > 0.60)](#self-signed-ssl-only-available-for-react-native--060)
- [Using React Native < 0.60](#using-react-native--060-1)
Expand Down Expand Up @@ -40,6 +41,32 @@ or npm:
npm install --save react-native-tcp-socket
```

#### Overriding `net`
Since `react-native-tcp-socket` offers the same API as Node's net, in case you want to import this module as `net` or use `require('net')` in your JavaScript, you must add the following lines to your `package.json` file.

```json
{
"react-native": {
"net": "react-native-tcp-socket"
}
}
```

In addition, in order to obtain the TS types (or autocompletion) provided by this module, you must also add the following to your custom declarations file.

```ts
...
declare module 'net' {
import TcpSockets from 'react-native-tcp-socket';
export = TcpSockets;
}
```

If you want to avoid duplicated `net` types, make sure not to use the default `node_modules/@types` in your `tsconfig.json` `"typeRoots"` property.

_Check the [example app](./examples/tcpsockets/) provided for a working example._


#### Using React Native >= 0.60
Linking the package manually is not required anymore with [Autolinking](https://github.com/react-native-community/cli/blob/master/docs/autolinking.md).

Expand Down
12 changes: 5 additions & 7 deletions __tests__/index.test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { expect, test } from '@jest/globals';
import TcpSockets from '../src/index';
import TcpServer from '../src/Server';
import TcpSocket from '../src/TcpSocket';
import net from '../src/index';

test('create-client', () => {
const options = {
Expand All @@ -13,11 +11,11 @@ test('create-client', () => {
// interface: "wifi"
};

const socket = TcpSockets.createConnection(options, () => {});
expect(socket).toBeInstanceOf(TcpSocket);
const socket = net.createConnection(options, () => {});
expect(socket).toBeInstanceOf(net.Socket);
});

test('create-server', () => {
const server = TcpSockets.createServer(() => {});
expect(server).toBeInstanceOf(TcpServer);
const server = net.createServer(() => {});
expect(server).toBeInstanceOf(net.Server);
});
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,6 @@ public void run() {
try {
TcpSocketServer server = new TcpSocketServer(socketMap, TcpSocketModule.this, cId, options);
socketMap.put(cId, server);
int port = server.getListeningPort();
String host = options.getString("host");
onListen(cId, server);
} catch (Exception uhe) {
onError(cId, uhe.getMessage());
Expand Down
10 changes: 10 additions & 0 deletions examples/tcpsockets/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"tabWidth": 4,
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"bracketSpacing": true,
"printWidth": 100,
"jsxBracketSameLine": true,
"arrowParens": "always"
}
6 changes: 0 additions & 6 deletions examples/tcpsockets/.prettierrc.js

This file was deleted.

87 changes: 25 additions & 62 deletions examples/tcpsockets/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,111 +5,74 @@
*/

import React from 'react';
import {
ScrollView,
StyleSheet,
Text,
View
} from 'react-native';
import { ScrollView, StyleSheet, Text, View } from 'react-native';

import TcpSocket from 'react-native-tcp-socket';
import { init, server, client } from './examples/echo';

class App extends React.Component {
/**
* @param {any} props
*/
constructor(props) {
super(props);

this.updateChatter = this.updateChatter.bind(this);
this.state = { chatter: [] };
}

/**
* @param {string | Error} msg
*/
updateChatter(msg) {
this.setState({
chatter: this.state.chatter.concat([msg])
// @ts-ignore
chatter: this.state.chatter.concat([msg]),
});
}

componentDidMount() {
const serverPort = Number(9 + (Math.random()*999).toFixed(0));
const serverHost = "0.0.0.0";
let server;
let client;
server = TcpSocket.createServer((socket) => {
this.updateChatter('client connected to server on ' + JSON.stringify(socket.address()));
console.log(
'Server client',
socket.localAddress,
socket.localPort,
socket.remoteAddress,
socket.remotePort,
socket.remoteFamily
);
server.on('connection', (socket) => {
this.updateChatter('Client connected to server on ' + JSON.stringify(socket.address()));

socket.on('data', (data) => {
this.updateChatter('Server Received: ' + data);
socket.write('Echo server\r\n');
this.updateChatter('Server client received: ' + data);
});

socket.on('error', (error) => {
this.updateChatter('server client error ' + error);
this.updateChatter('Server client error ' + error);
});

socket.on('close', (error) => {
this.updateChatter('server client closed ' + (error ? error : ''));
this.updateChatter('Server client closed ' + (error ? error : ''));
});
}).listen({port: serverPort, host: serverHost, reuseAddress: true}, () => {
this.updateChatter('opened server on ' + JSON.stringify(server.address()));
});

server.on('error', (error) => {
this.updateChatter(error);
this.updateChatter('Server error ' + error);
});

server.on('close', () => {
this.updateChatter('server close');
this.updateChatter('Server closed');
});

client = TcpSocket.createConnection({
port: serverPort,
host: serverHost,
localAddress: "127.0.0.1",
reuseAddress: true,
// localPort: 20000,
// interface: "wifi",
// tls: true
}, () => {
this.updateChatter('opened client on ' + JSON.stringify(client.address()));
client.write('Hello, server! Love, Client.');
client.on('connect', () => {
this.updateChatter('Opened client on ' + JSON.stringify(client.address()));
});

client.on('data', (data) => {
console.log(
'Initial client',
client.localAddress,
client.localPort,
client.remoteAddress,
client.remotePort,
client.remoteFamily
);
this.updateChatter('Client Received: ' + data);
this.client.destroy(); // kill client after server's response
this.server.close();
this.updateChatter('Client received: ' + data);
});

client.on('error', (error) => {
this.updateChatter('client error ' + error);
this.updateChatter('Client error ' + error);
});

client.on('close', () => {
this.updateChatter('client close');
client.on('close', (error) => {
this.updateChatter('Client closed ' + (error ? error : ''));
});

this.server = server;
this.client = client;
}

componentWillUnmount() {
this.server = null;
this.client = null;
init();
}

render() {
Expand All @@ -127,7 +90,7 @@ class App extends React.Component {
</View>
);
}
};
}

const styles = StyleSheet.create({
container: {
Expand Down
4 changes: 4 additions & 0 deletions examples/tcpsockets/declaration.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
declare module 'net' {
import TcpSockets from 'react-native-tcp-socket';
export = TcpSockets;
}
15 changes: 15 additions & 0 deletions examples/tcpsockets/examples/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Cross-Platform examples <!-- omit in toc -->

In this folder, you can find a variety of examples to help you get started in using `react-native-tcp-socket`. Every example has a specific purpose and **is compatible** with Node.js.

In order to run an example, you may import the `init`, `server` and clients from the example file and run it either from React Native ([`App.js`](../App.js)) or Node.js ([`main.js`](main.js)).

Let us know if you find any issues. If you want to contribute or add a new example, feel free to submit a PR!

## Table of Contents <!-- omit in toc -->
- [Echo server](#echo-server)


### [Echo server](echo.js)

An echo server just reflects a message received from a client to the same client. If we send a message saying "Hello, Server!", we will receive the same message, just like an echo. This example shows some basic TCP server and client interactions.
35 changes: 35 additions & 0 deletions examples/tcpsockets/examples/echo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const net = require('net');
const PORT = Number(9 + (Math.random() * 999).toFixed(0));

const server = new net.Server();
const client = new net.Socket();

function init() {
server.on('connection', (socket) => {
socket.write('Echo server\r\n');
});

server.listen({ port: PORT, host: '127.0.0.1', reuseAddress: true });

client.connect(
// @ts-ignore
{
port: PORT,
host: '127.0.0.1',
localAddress: '127.0.0.1',
reuseAddress: true,
// localPort: 20000,
// interface: "wifi",
// tls: true
},
() => {
client.write('Hello, server! Love, Client.');
}
);

client.on('data', () => {
client.destroy(); // kill client after server's response
});
}

module.exports = { init, server, client };
44 changes: 44 additions & 0 deletions examples/tcpsockets/examples/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Execute this file using NodeJS
const { init, server, client } = require('./echo');

server.on('connection', (socket) => {
console.log('Client connected to server on ' + JSON.stringify(socket.address()));

socket.on('data', (data) => {
console.log('Server client received: ' + data);
});

socket.on('error', (error) => {
console.log('Server client error ' + error);
});

socket.on('close', (error) => {
console.log('Server client closed ' + (error ? error : ''));
});
});

server.on('error', (error) => {
console.log('Server error ' + error);
});

server.on('close', () => {
console.log('Server closed');
});

client.on('connect', () => {
console.log('Opened client on ' + JSON.stringify(client.address()));
});

client.on('data', (data) => {
console.log('Client received: ' + data);
});

client.on('error', (error) => {
console.log('Client error ' + error);
});

client.on('close', (error) => {
console.log('Client closed ' + (error ? error : ''));
});

init();
8 changes: 4 additions & 4 deletions examples/tcpsockets/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ PODS:
- React-cxxreact (= 0.63.2)
- React-jsi (= 0.63.2)
- React-jsinspector (0.63.2)
- react-native-tcp-socket (4.5.5):
- react-native-tcp-socket (5.1.0):
- CocoaAsyncSocket
- React-Core
- React-RCTActionSheet (0.63.2):
Expand Down Expand Up @@ -269,7 +269,7 @@ DEPENDENCIES:
- React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
- React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
- react-native-tcp-socket (from `../node_modules/react-native-tcp-socket`)
- react-native-tcp-socket (from `../../..`)
- React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
- React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
- React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
Expand Down Expand Up @@ -319,7 +319,7 @@ EXTERNAL SOURCES:
React-jsinspector:
:path: "../node_modules/react-native/ReactCommon/jsinspector"
react-native-tcp-socket:
:path: "../node_modules/react-native-tcp-socket"
:path: "../../.."
React-RCTActionSheet:
:path: "../node_modules/react-native/Libraries/ActionSheetIOS"
React-RCTAnimation:
Expand Down Expand Up @@ -361,7 +361,7 @@ SPEC CHECKSUMS:
React-jsi: 54245e1d5f4b690dec614a73a3795964eeef13a8
React-jsiexecutor: 8ca588cc921e70590820ce72b8789b02c67cce38
React-jsinspector: b14e62ebe7a66e9231e9581279909f2fc3db6606
react-native-tcp-socket: 6b4108c9000d0ad48f5ea89d3c971fb2e73da6ca
react-native-tcp-socket: 334094926111f66bd6b305859aac4d07745b8d81
React-RCTActionSheet: 910163b6b09685a35c4ebbc52b66d1bfbbe39fc5
React-RCTAnimation: 9a883bbe1e9d2e158d4fb53765ed64c8dc2200c6
React-RCTBlob: 39cf0ece1927996c4466510e25d2105f67010e13
Expand Down
Loading

0 comments on commit 72db5fa

Please sign in to comment.