Awesome
Sand
Sand is a very simple and lightweight implementation of the core node TCP socket, adding some usefull features like client management, packet separation, handshake and event oriented clients like socket.io.
Install
$ npm i -s sand-socket
Usage
The usage is very simple and inspired on socket.io, but you are going to use write instead of emit.
const SandSocket = require('sand-socket');
const server = new SandSocket();
// Listening for a new client connection
server.on('connected', async (client) => {
// Writing a chat message to the client
client.write('chat', JSON.stringify({
text: "Feel free to write anything you want.",
user: 'System'
}));
// Listening to a chat message from client
client.on('chat', message => {
// Sendin the message to all the other clients connected
socket.writeToAll("chat", message);
});
// Listening for this client disconnection
client.on('disconnected', message => {
console.log("Client " + client.id + " disconnected.");
});
});
// Starting server on the port 3000
server.listen(3000);
Server options
You can set options to the node server setting the serverOptions parameter in the Sand server options when creating it.
const SandSocket = require('sand-socket');
const options = {};
const server = new SandSocket({ serverOptions: options });
Delimiters
Sand packets are text-oriented, by default it just sends a string to the client using "\n" as the delimiter between packets, and "#e#" as the delimiter between event name and message. If you prefer, you can set any other delimiter by passing it to the socket constructor.
const SandSocket = require('sand-socket');
const packetDelimiter = "packetEndsHere";
const eventDelimiter = "eventNameEndsHere";
const server = new SandSocket(null, packetDelimiter, eventDelimiter);
TLS
Sand socket supports node core TLS implementation.
const fs = require("fs");
const SandSocket = require('sand-socket');
const options = {
key: fs.readFileSync("./path-to-key"),
cert: fs.readFileSync("./path-to-cert")
};
const server = new SandSocket({ tls: true, serverOptions: options });
Verbose logging
In case you want to see what is happening behind the scenes, just activate the verbose log.
const SandSocket = require('sand-socket');
const server = new SandSocket();
server.verboseLog = true;
Concerns
The performance was not enough tested yet, and as long as it is a TCP socket and is text-based, it may not be the best option for an application that requires a lot of packets per second, like an action game.
Roadmap
- Make logs optional. (Done)
- Find a more performatic way to separate event and message.
These are what I'm planning to implement in the short-term, in case you have a suggestion feel free to contact me or open an issue :)