4.2.2 • Published 4 months ago

@superhero/tcp-record-channel v4.2.2

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

@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

npm install @superhero/tcp-record-channel

Usage

Basic Usage

Server Example

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

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:

OptionDefault ValueDescription
START_OF_TRANSMISSION\x02ASCII character to indicate ready state.
RECORD_SEPARATOR\x1EASCII character to separate records.
UNIT_SEPARATOR\x1FASCII character to separate units.
KEEP_ALIVE60000Keep-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:

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.

4.2.2

4 months ago

4.2.1

7 months ago

4.2.0

7 months ago

4.1.1

7 months ago

4.1.0

7 months ago

4.0.0

7 months ago