Skip to content

Commit 7247b40

Browse files
docs(examples): 3rd part of the "private messaging" example
See also: https://socket.io/get-started/private-messaging-part-3/
1 parent 992c938 commit 7247b40

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

examples/private-messaging/server/index.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ const randomId = () => crypto.randomBytes(8).toString("hex");
1111
const { InMemorySessionStore } = require("./sessionStore");
1212
const sessionStore = new InMemorySessionStore();
1313

14+
const { InMemoryMessageStore } = require("./messageStore");
15+
const messageStore = new InMemoryMessageStore();
16+
1417
io.use((socket, next) => {
1518
const sessionID = socket.handshake.auth.sessionID;
1619
if (sessionID) {
@@ -51,11 +54,22 @@ io.on("connection", (socket) => {
5154

5255
// fetch existing users
5356
const users = [];
57+
const messagesPerUser = new Map();
58+
messageStore.findMessagesForUser(socket.userID).forEach((message) => {
59+
const { from, to } = message;
60+
const otherUser = socket.userID === from ? to : from;
61+
if (messagesPerUser.has(otherUser)) {
62+
messagesPerUser.get(otherUser).push(message);
63+
} else {
64+
messagesPerUser.set(otherUser, [message]);
65+
}
66+
});
5467
sessionStore.findAllSessions().forEach((session) => {
5568
users.push({
5669
userID: session.userID,
5770
username: session.username,
5871
connected: session.connected,
72+
messages: messagesPerUser.get(session.userID) || [],
5973
});
6074
});
6175
socket.emit("users", users);
@@ -65,15 +79,18 @@ io.on("connection", (socket) => {
6579
userID: socket.userID,
6680
username: socket.username,
6781
connected: true,
82+
messages: [],
6883
});
6984

7085
// forward the private message to the right recipient (and to other tabs of the sender)
7186
socket.on("private message", ({ content, to }) => {
72-
socket.to(to).to(socket.userID).emit("private message", {
87+
const message = {
7388
content,
7489
from: socket.userID,
7590
to,
76-
});
91+
};
92+
socket.to(to).to(socket.userID).emit("private message", message);
93+
messageStore.saveMessage(message);
7794
});
7895

7996
// notify users upon disconnection
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/* abstract */ class MessageStore {
2+
saveMessage(message) {}
3+
findMessagesForUser(userID) {}
4+
}
5+
6+
class InMemoryMessageStore extends MessageStore {
7+
constructor() {
8+
super();
9+
this.messages = [];
10+
}
11+
12+
saveMessage(message) {
13+
this.messages.push(message);
14+
}
15+
16+
findMessagesForUser(userID) {
17+
return this.messages.filter(
18+
({ from, to }) => from === userID || to === userID
19+
);
20+
}
21+
}
22+
23+
module.exports = {
24+
InMemoryMessageStore,
25+
};

examples/private-messaging/src/components/Chat.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,19 @@ export default {
6868
});
6969
7070
const initReactiveProperties = (user) => {
71-
user.messages = [];
7271
user.hasNewMessages = false;
7372
};
7473
7574
socket.on("users", (users) => {
7675
users.forEach((user) => {
76+
user.messages.forEach((message) => {
77+
message.fromSelf = message.from === socket.userID;
78+
});
7779
for (let i = 0; i < this.users.length; i++) {
7880
const existingUser = this.users[i];
7981
if (existingUser.userID === user.userID) {
8082
existingUser.connected = user.connected;
83+
existingUser.messages = user.messages;
8184
return;
8285
}
8386
}

0 commit comments

Comments
 (0)