torinet
Version:
72 lines (57 loc) • 2.32 kB
JavaScript
const io = require("socket.io-client");
const ip = require("ip");
const EventEmitter = require("events").EventEmitter;
const aes256 = require("aes256");
function connect (login, password = "%NONE%", server, onServer, onSuccess, onFail) {
console.log(`http://${server}:13785`)
const socket = io(`http://${server}:13785`);
const connectEmitter = new EventEmitter();
let localState = {};
socket.on("state", (state) => {
localState = state;
connectEmitter.emit("state", state);
});
socket.on("newMessage", (message) => {
connectEmitter.emit("message", message);
})
socket.on("disconnect", () => {
if (localState.next === ip.address()) {
let newState = {...localState};
newState.connections = [];
for (let connection of localState.connections) {
if (connection.ip !== server) {
newState.connections.push(connection);
}
}
const server = require("./server")(newState.name, login, newState.password, newState);
onServer(server);
} else {
connect(login, password, localState.next);
}
});
const ctx = {
onState: (callback) => connectEmitter.on("state", (data) => callback(data)),
onJoin: (callback) => socket.on("joined", (user) => callback(user)),
onLeave: (callback) => socket.on("leave", (user) => callback(user)),
onMessage: (callback) => {
connectEmitter.on("message", (message) => {
sender = message.sender;
text = password !== "%NONE%" ? aes256.decrypt(password, message.text) : message.text;
callback(sender, text);
})
},
pushMessage: (text) => {
if (password !== "%NONE%") {
socket.emit("pushMessage", aes256.encrypt(password, text))
} else {
socket.emit("pushMessage", text);
}
},
disconnect: () => socket.disconnect()
};
socket.emit("auth", {
name: login, password
});
socket.on("checkAuth", (response) => response.success ? onSuccess(ctx) : onFail());
}
module.exports = connect;