Skip to content

Commit

Permalink
Merge pull request #1 from onfranciis/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
onfranciis authored Sep 24, 2023
2 parents b51a234 + 8c15b43 commit bcefdcf
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 17 deletions.
23 changes: 17 additions & 6 deletions index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import http from "http";
import { WebSocketServer } from "ws";
import { v4 as uuid } from "uuid";
import User, { users } from "./utils/user";
import User, { broadcastMessage, users } from "./utils/user";
import {
numberOfUsers,
toEveryoneExceptSender,
toSender,
} from "./utils/message";

const PORT = process.env.PORT || 5050;
const server = http.createServer();
Expand All @@ -12,18 +17,24 @@ ws.on("connection", (res) => {
const client = new User(userId, res);
const { ID, Details, getNumberOfUsers, sendMessage, disconnect } = client;
console.log(`Received a new connection and connected user ${userId}`);
console.log(`Number of connected users: ${getNumberOfUsers()}`);
res.send(toSender("You're connected"));
toEveryoneExceptSender(ID);
broadcastMessage(numberOfUsers());

res.onmessage = (message) => {
const { data } = message;
const { receivedMessage } = sendMessage(data, ID);
console.log(receivedMessage);
const response = sendMessage(data, ID);

if (response?.receivedMessage) {
const receivedMessage = response.receivedMessage;
console.log(receivedMessage, "received message");
toEveryoneExceptSender(ID, receivedMessage, "message");
}
};

res.on("close", () => {
console.log(`${ID} has disconnected`);
delete users[ID];
disconnect();
disconnect(ID);
});
});

Expand Down
47 changes: 47 additions & 0 deletions utils/message.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { WebSocket } from "ws";
import { users } from "./user";
import { v4 as uuid } from "uuid";
import { messageType } from "./types";

export const numberOfUsers = () => {
try {
return JSON.stringify({
type: "users",
message: Object.keys(users),
});
} catch (error) {
console.log(error);
}
};

export const toSender = (message: string) => {
return JSON.stringify({
type: "to_sender",
message: message,
});
};

export const toEveryoneExceptSender = (
senderID: string,
message?: string,
type?: messageType
) => {
for (let userID in users) {
const user = users[userID];

if (user.readyState === WebSocket.OPEN) {
if (userID === senderID) {
// Same user
} else {
user.send(
JSON.stringify({
type: type || "notification",
message: message || `${senderID} has joined the chat`,
key: uuid(),
user: senderID,
})
);
}
}
}
};
2 changes: 2 additions & 0 deletions utils/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Moment } from "moment";
import { WebSocket } from "ws";

export type messageType = "users" | "message" | "notification" | "to_everyone";
export interface usersType {
[userId: string]: WebSocket;
}
Expand All @@ -9,4 +10,5 @@ export interface messagesDataType {
user: string;
message: string;
time: Moment;
type: messageType;
}
52 changes: 41 additions & 11 deletions utils/user.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { Data, WebSocket } from "ws";
import { v4 as uuid } from "uuid";
import { messagesDataType, usersType } from "./types";
import moment from "moment";
import { numberOfUsers } from "./message";

export const users: usersType = {};
export const messagesData: messagesDataType[] = [];
Expand All @@ -18,32 +20,60 @@ class User {
}

sendMessage(message: Data, ID: string) {
const receivedMessage = JSON.parse(message.toString()).message;
try {
const receivedMessage = JSON.parse(message.toString()).message;

messagesData.push({
message: receivedMessage,
time: moment(),
user: ID,
});
if (receivedMessage) {
messagesData.push({
message: receivedMessage,
time: moment(),
user: ID,
type: "message",
});

return { receivedMessage };
console.log("Received message: ", receivedMessage);
return { receivedMessage, ID };
} else {
console.log("Error");
}
} catch (err) {
console.log(err);
return { receivedMessage: "Invalid data" };
}
}

getNumberOfUsers() {
return Object.keys(users).length;
}

disconnect() {
disconnect(ID: string) {
delete users[ID];
console.log(`Number of connected users: ${Object.keys(users).length}`);
broadcastMessage(numberOfUsers());
broadcastMessage(`${ID} left the chat`);
}
}

export const broadcastMessage = (message: string | undefined, ID?: string) => {
if (typeof message == "string")
for (let userID in users) {
const user = users[userID];

if (user.readyState === WebSocket.OPEN) {
user.send("Someone left the chat");
if (ID) {
user.send(
JSON.stringify({
user: ID,
key: uuid(),
message,
type: "message",
})
);
} else {
user.send(message);
}
}
}
}
}
};

export default User;

0 comments on commit bcefdcf

Please sign in to comment.