//start ws server with socket.io var http = require('http'); var express = require('express'); import { Request, Response } from 'express'; var app = express(); var server = http.createServer(app); var port = process.env.PORT || 8480; const { Server } = require("socket.io"); import { Socket } from 'socket.io'; const io = new Server(server); //get resolvecommand from commands.ts import { resolveCommand } from './commands/commands'; app.get('/', (req:Request, res:Response) => { res.sendFile(__dirname + '/website/index.html'); } ); app.get("/script.js", (req:Request, res:Response) => { res.sendFile(__dirname + '/website/script.js'); } ); app.get("/style.css", (req:Request, res:Response) => { res.sendFile(__dirname + '/website/style.css'); } ); //initialize buffer //var buffer = []; //add type for typescript var buffer: { [id: string]: string } = {}; //var filesystem = []; var filesystem: any = {}; //var curdir = []; var curdir: any = {}; //var sessions = []; var sessions: any = {}; //var curdirx = []; var curdirx: any = {}; //on connection function sendbuffer(socket:Socket, bufferx: { [id: string]: string }, forcefulload:boolean) { var bufx = bufferx[socket.id]; //add placeholder character(reserved unicode) for blinking cursor in client; bufx += "\u2588"; if(forcefulload) { socket.emit('buffer', bufx); } else { socket.emit('bufferx', bufx); } } io.on('connection', (socket:Socket) => { console.log('a user connected'); buffer[socket.id] = ""; filesystem[socket.id] = {}; curdir[socket.id] = filesystem[socket.id]; curdirx[socket.id] = []; //welcome message buffer[socket.id] = "Welcome to the console!\n"; buffer[socket.id] += "Type 'help' to see the available commands.\n"; buffer[socket.id] += "#"; //send buffer sendbuffer(socket, buffer, true); socket.on('keypress', (data) => { console.log('a key was pressed'); //get key //convert data to string var key = String.fromCharCode(data); //convert key to lowercase key = key.toLowerCase(); console.log(data); //check if key is enter if (data == 8){ //backspace //if line is not empty remove last character if it is not the first character var lines = buffer[socket.id].split("\n"); if (lines[lines.length - 1] != "#") { lines[lines.length - 1] = lines[lines.length - 1].slice(0, -1); socket.emit("lastline", lines[lines.length - 1]); buffer[socket.id] = lines.join("\n"); } } else if(data == 13) { //execute command let lines = buffer[socket.id].split('\n'); let command = lines[lines.length-1]; //remove # from command command = command.substring(1); //remove \n and everything after command = command.substring(command.indexOf('\n'), command.length); let args = command.split(' '); let commandName = args[0]; let commandArgs = args.slice(1); //remove trailing spaces commandArgs = commandArgs.map(function(arg) { return arg.trim(); }); //add \n to buffer buffer[socket.id] += "\n"; //remove # in beginning of commandname console.log("Executing command: \"" + commandName + "\" with arguments: \"" + commandArgs + "\""); var bufko = "\n" + resolveCommand(commandName, socket, commandArgs, buffer, sessions, filesystem, curdir, curdirx); console.log("This command \""+ commandName +"\" with args:\""+commandArgs+"\" returned \""+bufko+"\""); bufko += "#"; socket.emit("bufferx", "\n" + bufko+ '\u2588'); buffer[socket.id] += bufko; } else{ //add key to buffer buffer[socket.id] += key; socket.emit("bufferx", key+"\u2588"); } //send buffer to client }); }); io.on('disconnect', (socket:Socket) => { console.log('user disconnected'); buffer[socket.id] = ""; }); server.listen(port, function() { console.log('Server listening at port %d', port); });