From 817c5250154da97089787f342ec3ea9746e864b3 Mon Sep 17 00:00:00 2001 From: Cris Stringfellow <22254235+crislin2046@users.noreply.github.com> Date: Thu, 2 May 2024 00:45:17 +0800 Subject: [PATCH] ok --- server.js | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 server.js diff --git a/server.js b/server.js new file mode 100644 index 0000000..b757504 --- /dev/null +++ b/server.js @@ -0,0 +1,120 @@ +const express = require('express'); +const { Server } = require('ws'); +const https = require('https'); +const fs = require('fs'); +const readline = require('readline'); + +const SSLCERTS_DIR = path.resolve(os.homedir(), 'sslcerts'); +const app = express(); + +// SSL credentials +const options = { + key: fs.readFileSync(path.resolve(SSLCERTS_DIR, 'server.key')), + cert: fs.readFileSync(path.resolve(SSLCERTS_DIR, 'server.cert')) +}; + +const server = https.createServer(options, app); +const wss = new Server({ server }); + +app.get('/', (req, res) => { + res.send(` + + + + + + Jellyness - WebRTC Chat + + +

WebRTC Chat

+

+      
+      
+    
+    
+  `);
+});
+
+let adminId = null;
+const peers = new Map();
+
+wss.on('connection', function(ws) {
+  const id = Date.now();
+  let nickname = `User${id}`;
+
+  console.log(`Secure connection received: ${id}`);
+  peers.set(id, { ws, nickname });
+
+  ws.on('message', function(message) {
+    console.log(`Received: ${message} from ${nickname}`);
+
+    if (message.startsWith('/name ')) {
+      const newName = message.split(' ')[1];
+      peers.get(id).nickname = newName;
+      ws.send(`Name changed to ${newName}`);
+      return;
+    }
+
+    const formattedMessage = `${id === adminId ? '*' : ''}${nickname}: ${message}`;
+    for (let [peerId, peer] of peers) {
+      if (peer.ws.readyState === ws.OPEN) {
+        peer.ws.send(formattedMessage);
+      }
+    }
+  });
+
+  ws.on('close', () => {
+    peers.delete(id);
+    console.log(`Connection closed: ${id}`);
+  });
+});
+
+// REPL for command line interaction
+const rl = readline.createInterface({
+  input: process.stdin,
+  output: process.stdout,
+  prompt: 'talk> '
+});
+
+adminId = Date.now();  // Assigning admin ID on start
+peers.set(adminId, { ws: null, nickname: 'Admin' });
+
+rl.prompt();
+
+rl.on('line', (line) => {
+  if (line.startsWith('/name ')) {
+    const newName = line.split(' ')[1];
+    peers.get(adminId).nickname = newName;
+    console.log(`Admin name changed to ${newName}`);
+    rl.prompt();
+    return;
+  }
+
+  const message = `*${peers.get(adminId).nickname}: ${line}`;
+  for (let [id, peer] of peers) {
+    if (peer.ws && peer.ws.readyState === peer.ws.OPEN) {
+      peer.ws.send(message);
+    }
+  }
+  rl.prompt();
+});
+
+server.listen(8999, () => {
+  console.log('Secure server running on https://localhost:3000');
+});
+