const net = require("net");
const openpgp = require("openpgp");
const utils = require("./utils");
const chalk = require("chalk");
const aes = require("./aes");
const SecureConnection = require("./secure_connection");
/**
 * 
 * @param {SecsockCallback} listener The callback for when the connection is established
 * @param {number} port The port of the server
 * @param {string} host The hostname of the server
 * 
 * @class
 */
function SecsockClient (listener = (listener) => {}, port, host = "0.0.0.0") {
	var socket = net.createConnection({
		port,
		host
	});
	var sc;
	var publicKey;
	var aesKey = utils.unique();
	socket.on("data", async data => {
		if (!publicKey) {
			utils.log(`Received public key from server`);
			publicKey = data.toString();
			let options = {
				message: openpgp.message.fromText(aesKey),
				publicKeys: (await openpgp.key.readArmored(publicKey)).keys
			}
			openpgp.encrypt(options).then(ciphertext => {
				socket.write(ciphertext.data);
				sc = new SecureConnection(socket, aesKey);
				listener(sc);
			});
		} else {
			sc.process(data);
		}
	});
}
module.exports = SecsockClient;
/**
 * @callback SecsockCallback
 * @param {SecureConnection} secure
 * @private
 */