thuck

A super simple protocol that concats crushed chunks emit by a TCP socket.

thuck

A super simple protocol that concats crushed chunks emit by a TCP socket.

npm install thuck

The original purpose of this project is that, when we send a bigger data via TCP sockets, the data is crushed by the underlying system into small pieces.

For example, once you "emit" 17KB of data on one side, the other side of the socket may triggers "data" serval times with 1KB chunks each. Then you may need to implement an algorithm to collect these pieces and concat them...

This project do this for you. The only thing you need to do is, send a byte of "flag" (which is defined by you and declare the beginning of the data) and four bytes (a integer) of the length.

Say you have a "client", in Java:

public void write(byte[] buffer) throws IOException {
    this.outStream.write(header(0xff, buffer.length))
    this.outStream.write(buffer)
    this.outStream.flush()
}
 
private static byte[] header(int flag, int length) {
    return new byte[] {
            (byte) flag,
            (byte) ((length & 0xff)),
            (byte) ((length >> 8) & 0xff),
            (byte) ((length >> 16) & 0xff),
            (byte) ((length >>> 24))
    };
}

Then on the "server" side, in JavaScript:

var tcp = require('net')
  , thuck = require('thuck')
 
tcp.createServer(function (socket) {
  var incoming = socket.pipe(thuck(0xff))
 
  incoming.on('data', function (data) {
    // ... 
  })
}).listen(7777)

The project is not perfect. It just fit my need well but some edge cases have not been considered yet:

  • If those 5 bytes of header is crushed?
  • If the session is not begins with a packet that starts with that 5-byte-header?
  • Packet longer than 4294967295 bytes?

Please let me know your solution!

npm test

This project is released under the terms of MIT License.