Skip to content

Commit 72db5fa

Browse files
authored
feat: Export Socket class (#104)
1 parent 99ece1e commit 72db5fa

23 files changed

+282
-349
lines changed

README.md

+27
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ React Native TCP socket API for Android & iOS with **client SSL/TLS support**. I
1010
## Table of Contents <!-- omit in toc -->
1111

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

44+
#### Overriding `net`
45+
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.
46+
47+
```json
48+
{
49+
"react-native": {
50+
"net": "react-native-tcp-socket"
51+
}
52+
}
53+
```
54+
55+
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.
56+
57+
```ts
58+
...
59+
declare module 'net' {
60+
import TcpSockets from 'react-native-tcp-socket';
61+
export = TcpSockets;
62+
}
63+
```
64+
65+
If you want to avoid duplicated `net` types, make sure not to use the default `node_modules/@types` in your `tsconfig.json` `"typeRoots"` property.
66+
67+
_Check the [example app](./examples/tcpsockets/) provided for a working example._
68+
69+
4370
#### Using React Native >= 0.60
4471
Linking the package manually is not required anymore with [Autolinking](https://github.com/react-native-community/cli/blob/master/docs/autolinking.md).
4572

__tests__/index.test.js

+5-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import { expect, test } from '@jest/globals';
2-
import TcpSockets from '../src/index';
3-
import TcpServer from '../src/Server';
4-
import TcpSocket from '../src/TcpSocket';
2+
import net from '../src/index';
53

64
test('create-client', () => {
75
const options = {
@@ -13,11 +11,11 @@ test('create-client', () => {
1311
// interface: "wifi"
1412
};
1513

16-
const socket = TcpSockets.createConnection(options, () => {});
17-
expect(socket).toBeInstanceOf(TcpSocket);
14+
const socket = net.createConnection(options, () => {});
15+
expect(socket).toBeInstanceOf(net.Socket);
1816
});
1917

2018
test('create-server', () => {
21-
const server = TcpSockets.createServer(() => {});
22-
expect(server).toBeInstanceOf(TcpServer);
19+
const server = net.createServer(() => {});
20+
expect(server).toBeInstanceOf(net.Server);
2321
});

android/src/main/java/com/asterinet/react/tcpsocket/TcpSocketModule.java

-2
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,6 @@ public void run() {
161161
try {
162162
TcpSocketServer server = new TcpSocketServer(socketMap, TcpSocketModule.this, cId, options);
163163
socketMap.put(cId, server);
164-
int port = server.getListeningPort();
165-
String host = options.getString("host");
166164
onListen(cId, server);
167165
} catch (Exception uhe) {
168166
onError(cId, uhe.getMessage());

examples/tcpsockets/.prettierrc

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"tabWidth": 4,
3+
"semi": true,
4+
"trailingComma": "es5",
5+
"singleQuote": true,
6+
"bracketSpacing": true,
7+
"printWidth": 100,
8+
"jsxBracketSameLine": true,
9+
"arrowParens": "always"
10+
}

examples/tcpsockets/.prettierrc.js

-6
This file was deleted.

examples/tcpsockets/App.js

+25-62
Original file line numberDiff line numberDiff line change
@@ -5,111 +5,74 @@
55
*/
66

77
import React from 'react';
8-
import {
9-
ScrollView,
10-
StyleSheet,
11-
Text,
12-
View
13-
} from 'react-native';
8+
import { ScrollView, StyleSheet, Text, View } from 'react-native';
149

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

1712
class App extends React.Component {
13+
/**
14+
* @param {any} props
15+
*/
1816
constructor(props) {
1917
super(props);
2018

2119
this.updateChatter = this.updateChatter.bind(this);
2220
this.state = { chatter: [] };
2321
}
2422

23+
/**
24+
* @param {string | Error} msg
25+
*/
2526
updateChatter(msg) {
2627
this.setState({
27-
chatter: this.state.chatter.concat([msg])
28+
// @ts-ignore
29+
chatter: this.state.chatter.concat([msg]),
2830
});
2931
}
3032

3133
componentDidMount() {
32-
const serverPort = Number(9 + (Math.random()*999).toFixed(0));
33-
const serverHost = "0.0.0.0";
34-
let server;
35-
let client;
36-
server = TcpSocket.createServer((socket) => {
37-
this.updateChatter('client connected to server on ' + JSON.stringify(socket.address()));
38-
console.log(
39-
'Server client',
40-
socket.localAddress,
41-
socket.localPort,
42-
socket.remoteAddress,
43-
socket.remotePort,
44-
socket.remoteFamily
45-
);
34+
server.on('connection', (socket) => {
35+
this.updateChatter('Client connected to server on ' + JSON.stringify(socket.address()));
4636

4737
socket.on('data', (data) => {
48-
this.updateChatter('Server Received: ' + data);
49-
socket.write('Echo server\r\n');
38+
this.updateChatter('Server client received: ' + data);
5039
});
5140

5241
socket.on('error', (error) => {
53-
this.updateChatter('server client error ' + error);
42+
this.updateChatter('Server client error ' + error);
5443
});
5544

5645
socket.on('close', (error) => {
57-
this.updateChatter('server client closed ' + (error ? error : ''));
46+
this.updateChatter('Server client closed ' + (error ? error : ''));
5847
});
59-
}).listen({port: serverPort, host: serverHost, reuseAddress: true}, () => {
60-
this.updateChatter('opened server on ' + JSON.stringify(server.address()));
6148
});
6249

6350
server.on('error', (error) => {
51+
this.updateChatter(error);
6452
this.updateChatter('Server error ' + error);
6553
});
6654

6755
server.on('close', () => {
68-
this.updateChatter('server close');
56+
this.updateChatter('Server closed');
6957
});
7058

71-
client = TcpSocket.createConnection({
72-
port: serverPort,
73-
host: serverHost,
74-
localAddress: "127.0.0.1",
75-
reuseAddress: true,
76-
// localPort: 20000,
77-
// interface: "wifi",
78-
// tls: true
79-
}, () => {
80-
this.updateChatter('opened client on ' + JSON.stringify(client.address()));
81-
client.write('Hello, server! Love, Client.');
59+
client.on('connect', () => {
60+
this.updateChatter('Opened client on ' + JSON.stringify(client.address()));
8261
});
8362

8463
client.on('data', (data) => {
85-
console.log(
86-
'Initial client',
87-
client.localAddress,
88-
client.localPort,
89-
client.remoteAddress,
90-
client.remotePort,
91-
client.remoteFamily
92-
);
93-
this.updateChatter('Client Received: ' + data);
94-
this.client.destroy(); // kill client after server's response
95-
this.server.close();
64+
this.updateChatter('Client received: ' + data);
9665
});
9766

9867
client.on('error', (error) => {
99-
this.updateChatter('client error ' + error);
68+
this.updateChatter('Client error ' + error);
10069
});
10170

102-
client.on('close', () => {
103-
this.updateChatter('client close');
71+
client.on('close', (error) => {
72+
this.updateChatter('Client closed ' + (error ? error : ''));
10473
});
10574

106-
this.server = server;
107-
this.client = client;
108-
}
109-
110-
componentWillUnmount() {
111-
this.server = null;
112-
this.client = null;
75+
init();
11376
}
11477

11578
render() {
@@ -127,7 +90,7 @@ class App extends React.Component {
12790
</View>
12891
);
12992
}
130-
};
93+
}
13194

13295
const styles = StyleSheet.create({
13396
container: {

examples/tcpsockets/declaration.d.ts

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
declare module 'net' {
2+
import TcpSockets from 'react-native-tcp-socket';
3+
export = TcpSockets;
4+
}
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Cross-Platform examples <!-- omit in toc -->
2+
3+
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.
4+
5+
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)).
6+
7+
Let us know if you find any issues. If you want to contribute or add a new example, feel free to submit a PR!
8+
9+
## Table of Contents <!-- omit in toc -->
10+
- [Echo server](#echo-server)
11+
12+
13+
### [Echo server](echo.js)
14+
15+
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.

examples/tcpsockets/examples/echo.js

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const net = require('net');
2+
const PORT = Number(9 + (Math.random() * 999).toFixed(0));
3+
4+
const server = new net.Server();
5+
const client = new net.Socket();
6+
7+
function init() {
8+
server.on('connection', (socket) => {
9+
socket.write('Echo server\r\n');
10+
});
11+
12+
server.listen({ port: PORT, host: '127.0.0.1', reuseAddress: true });
13+
14+
client.connect(
15+
// @ts-ignore
16+
{
17+
port: PORT,
18+
host: '127.0.0.1',
19+
localAddress: '127.0.0.1',
20+
reuseAddress: true,
21+
// localPort: 20000,
22+
// interface: "wifi",
23+
// tls: true
24+
},
25+
() => {
26+
client.write('Hello, server! Love, Client.');
27+
}
28+
);
29+
30+
client.on('data', () => {
31+
client.destroy(); // kill client after server's response
32+
});
33+
}
34+
35+
module.exports = { init, server, client };

examples/tcpsockets/examples/main.js

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Execute this file using NodeJS
2+
const { init, server, client } = require('./echo');
3+
4+
server.on('connection', (socket) => {
5+
console.log('Client connected to server on ' + JSON.stringify(socket.address()));
6+
7+
socket.on('data', (data) => {
8+
console.log('Server client received: ' + data);
9+
});
10+
11+
socket.on('error', (error) => {
12+
console.log('Server client error ' + error);
13+
});
14+
15+
socket.on('close', (error) => {
16+
console.log('Server client closed ' + (error ? error : ''));
17+
});
18+
});
19+
20+
server.on('error', (error) => {
21+
console.log('Server error ' + error);
22+
});
23+
24+
server.on('close', () => {
25+
console.log('Server closed');
26+
});
27+
28+
client.on('connect', () => {
29+
console.log('Opened client on ' + JSON.stringify(client.address()));
30+
});
31+
32+
client.on('data', (data) => {
33+
console.log('Client received: ' + data);
34+
});
35+
36+
client.on('error', (error) => {
37+
console.log('Client error ' + error);
38+
});
39+
40+
client.on('close', (error) => {
41+
console.log('Client closed ' + (error ? error : ''));
42+
});
43+
44+
init();

examples/tcpsockets/ios/Podfile.lock

+4-4
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ PODS:
186186
- React-cxxreact (= 0.63.2)
187187
- React-jsi (= 0.63.2)
188188
- React-jsinspector (0.63.2)
189-
- react-native-tcp-socket (4.5.5):
189+
- react-native-tcp-socket (5.1.0):
190190
- CocoaAsyncSocket
191191
- React-Core
192192
- React-RCTActionSheet (0.63.2):
@@ -269,7 +269,7 @@ DEPENDENCIES:
269269
- React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
270270
- React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
271271
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
272-
- react-native-tcp-socket (from `../node_modules/react-native-tcp-socket`)
272+
- react-native-tcp-socket (from `../../..`)
273273
- React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
274274
- React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
275275
- React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
@@ -319,7 +319,7 @@ EXTERNAL SOURCES:
319319
React-jsinspector:
320320
:path: "../node_modules/react-native/ReactCommon/jsinspector"
321321
react-native-tcp-socket:
322-
:path: "../node_modules/react-native-tcp-socket"
322+
:path: "../../.."
323323
React-RCTActionSheet:
324324
:path: "../node_modules/react-native/Libraries/ActionSheetIOS"
325325
React-RCTAnimation:
@@ -361,7 +361,7 @@ SPEC CHECKSUMS:
361361
React-jsi: 54245e1d5f4b690dec614a73a3795964eeef13a8
362362
React-jsiexecutor: 8ca588cc921e70590820ce72b8789b02c67cce38
363363
React-jsinspector: b14e62ebe7a66e9231e9581279909f2fc3db6606
364-
react-native-tcp-socket: 6b4108c9000d0ad48f5ea89d3c971fb2e73da6ca
364+
react-native-tcp-socket: 334094926111f66bd6b305859aac4d07745b8d81
365365
React-RCTActionSheet: 910163b6b09685a35c4ebbc52b66d1bfbbe39fc5
366366
React-RCTAnimation: 9a883bbe1e9d2e158d4fb53765ed64c8dc2200c6
367367
React-RCTBlob: 39cf0ece1927996c4466510e25d2105f67010e13

0 commit comments

Comments
 (0)