anysocket
v0.4.27
Published
An abstract networking layer over multiple transports, client/server agnostic with support for E2EE
Downloads
147
Maintainers
Readme
AnySocket
An abstract networking layer over multiple transports, client/server agnostic with support for E2EE
- Features
- Benchmarks
- Installation
- Usage
- Documentation / API
- Upcoming Features
- License
Important
This is a work in progress and API is subject to change.
Features
- Client / Server agnostic
- Support for request/reply
- Custom AUTH method
- E2EE between peers with forward secrecy
- RPC support
- NTP Sync between peers support
- P2P using a proxy server (with support for direct E2EE between peers)
- Binary support (see: AnySocket.Packer)
- Browser support - 31kb footprint (see:
/dist/anysocket.browser.js
) - Multiple transports *(implemented atm: ws/wss, http/https)
- All peers have a UUIDv4 associated
- Disconnect detection using a heartbeat
- Not Battle Tested ...yet
** http transport is experimental
Info: Binary RPC arguments and responses are auto packed/unpacked (AnySocket.Packer.pack/AnySocket.Packer.unpack).
Benchmarks
See benchmarks
Installation
npm install --save anysocket
or
<script src="/dist/anysocket.browser.js"></script>
or (if using AnySocketHTTP)
<script src="@anysocket"></script>
How to use
The following example starts a websocket server on port 3000.
const AnySocket = require("anysocket");
const server = new AnySocket();
const PORT = 3000;
server.listen("ws", PORT)
.then(() => {
console.log("Listening on port:", PORT);
})
.catch((err) => {
console.error("Failed to start server:", err);
});
server.on("connected", async (peer) => {
console.log("Connected", peer.id);
console.log(await peer.getSyncedTime()) // { time: 1674671482107, rtt: 2, offset: 0 }
peer.send({
hello: "world"
});
});
server.on("message", (packet) => {
console.log("From:", packet.peer.id, "Message:", packet.msg);
});
server.on("disconnected", (peer, reason) => {
console.log("Disconnected", peer.id, "Reason:", reason);
});
The following example connects to a websocket on port 3000
const AnySocket = require("anysocket");
const client = new AnySocket();
const PORT = 3000;
client.connect("ws", "127.0.0.1", PORT)
.then(() => {
console.log("Connected to server");
})
.catch((err) => {
console.error("Failed to connect to server:", err);
});
// after negotiating the AUTH packet, it will trigger the connect event
client.on("connected", async (peer) => {
console.log("Connected", peer.id);
console.log(await peer.getSyncedTime()) // { time: 1674671482107, rtt: 2, offset: 0 }
peer.send({
hello: "world"
});
});
client.on("message", (packet) => {
console.log("From:", packet.peer.id, "Message:", packet.msg);
});
client.on("disconnected", (peer, reason) => {
console.log("Disconnected", peer.id, "Reason:", reason);
});
More in the examples
folder.
Documentation
See documentation and examples folder
Upcoming Features
- Mesh Network
- Multiple transports: tcp, udp*, ipc
- Client reconnection
* this will require a change in the protocol, as the protocol assumes the packets are sent using a reliable, ordered connection
License
MIT