@superhero/tcp-record-channel
Version:
TCP record channel is intended to be used as a low level bidirectional TCP socket communication server-to-server
171 lines (127 loc) • 5.75 kB
Markdown
# @superhero/tcp-record-channel
TCP Record Channel is a lightweight library for low-level, bidirectional TCP socket communication, supporting both plain TCP and TLS. It uses ASCII delimited encoding to transmit and decode structured records.
## Features
- **ASCII Delimited Encoding**: Encode and decode structured records with configurable delimiters.
- **TLS and Plain TCP Support**: Provides methods for creating secure and non-secure socket connections.
- **Server and Client Support**: Create servers and clients for secure or plain communication.
- **Event-Driven Architecture**: Emits events for complete records, simplifying integration into event-based systems.
- **Keep-Alive Support**: Automatically configures sockets with keep-alive settings for improved stability.
- **Broadcast Functionality**: Transmit data to multiple sockets.
## Installation
```bash
npm install @superhero/tcp-record-channel
```
## Usage
### Basic Usage
#### Server Example
```javascript
import Channel from '@superhero/tcp-record-channel';
const serverChannel = new Channel();
const serverConfig = { cert: 'path/to/cert.pem', key: 'path/to/key.pem', ca: 'path/to/ca.pem' };
const server = serverChannel.createTlsServer(serverConfig, (clientSocket) => {
clientSocket.authorized = true;
});
server.listen(443, () => console.log('Server listening on port 443'));
serverChannel.on('record', (record, socket) => {
console.log('Received record:', record);
});
```
#### Client Example
```javascript
import Channel from '@superhero/tcp-record-channel';
const clientChannel = new Channel();
const clientConfig = { host: 'localhost', port: 443, ca: 'path/to/ca.pem' };
const clientSocket = await clientChannel.createTlsClient(clientConfig);
clientChannel.transmit(clientSocket, ['example', 'data', '123']);
clientChannel.on('record', (record) => {
console.log('Received record from server:', record);
});
```
### Configuration
The `Channel` constructor accepts an optional configuration object:
| Option | Default Value | Description |
|-------------------------|---------------|------------------------------------------|
| `START_OF_TRANSMISSION` | `\x02` | ASCII character to indicate ready state. |
| `RECORD_SEPARATOR` | `\x1E` | ASCII character to separate records. |
| `UNIT_SEPARATOR` | `\x1F` | ASCII character to separate units. |
| `KEEP_ALIVE` | `60000` | Keep-alive interval in milliseconds. |
### API
#### `createTlsServer(config, onConnection)`
Creates a TLS server.
- **Parameters**:
- `config`: TLS configuration object (e.g., `cert`, `key`, `ca`).
- `onConnection`: Callback invoked for each client connection.
- **Returns**: `tls.Server`
#### `createNetServer(config, onConnection)`
Creates a plain TCP server.
- **Parameters**:
- `config`: TCP configuration object.
- `onConnection`: Callback invoked for each client connection.
- **Returns**: `net.Server`
#### `createTlsClient(config)`
Creates a TLS client.
- **Parameters**:
- `config`: TLS connection options (e.g., `host`, `port`, `ca`).
- **Returns**: `tls.TLSSocket`
#### `createNetClient(config)`
Creates a plain TCP client.
- **Parameters**:
- `config`: TCP connection options (e.g., `host`, `port`).
- **Returns**: `net.Socket`
#### `transmit(socket, units)`
Encodes and sends a record over a socket.
- **Parameters**:
- `socket`: The target socket.
- `units`: An array of strings representing the record units.
#### `broadcast(sockets, units)`
Sends a record to multiple sockets.
- **Parameters**:
- `sockets`: An array of sockets.
- `units`: An array of strings representing the record units.
## Events
### `record`
Emitted when a complete record is received.
- **Parameters**:
- `units`: An array of strings representing the record.
- `socket`: The socket from which the record was received.
## Testing
Run the test suite using:
```bash
npm test
```
The tests include scenarios for both application-level and mutual TLS authorization, handling unauthorized clients and servers, and validating record transmission.
### Test Coverage
```
▶ @superhero/tcp-record-channel
✔ Application Level Authorization (92.98876ms)
▶ Mutual TLS Authorization
✔ Server and Client is Authorized (15.082166ms)
▶ Server Unauthorized
✔ Missing CA (15.014342ms)
✔ Missing Server CA (11.170845ms)
✔ Missing Root CA (11.32546ms)
✔ Client Unauthorized by Server (10.849463ms)
✔ Server Unauthorized (49.865721ms)
▶ Client Unauthorized
✔ Missing root CA in the client (9.39734ms)
✔ Missing client CA in the client certificate chain (10.045138ms)
✔ Missing Root CA in the client (8.474439ms)
✔ Client Unauthorized (28.702489ms)
✔ Mutual TLS Authorization (94.056886ms)
✔ @superhero/tcp-record-channel (209.480811ms)
tests 9
suites 4
pass 9
---------------------------------------------------------------------------------------------
file | line % | branch % | funcs % | uncovered lines
---------------------------------------------------------------------------------------------
index.js | 84.98 | 80.95 | 86.67 | 54-58 95-101 191-198 222-224 229-234 243-251
index.test.js | 100.00 | 100.00 | 100.00 |
---------------------------------------------------------------------------------------------
all files | 92.20 | 93.75 | 96.49 |
---------------------------------------------------------------------------------------------
```
## License
This project is licensed under the MIT License.
## Contributing
Feel free to submit issues or pull requests for improvements or additional features.