-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsocketManager.js
More file actions
146 lines (133 loc) · 3.7 KB
/
Copy pathsocketManager.js
File metadata and controls
146 lines (133 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
const socketIO = require("socket.io");
const http = require("http");
const express = require("express");
const app = express();
const server = http.createServer(app);
const io = socketIO(server, {
cors: {
origin: [
process.env.LOCAL_ALLOWED_ORIGIN,
process.env.PRODUCTION_ALLOWED_ORIGIN,
process.env.ANDROID_ALLOWED_ORIGIN
],
// origin:
// process.env.DEBUG === "true"
// ? process.env.LOCAL_ALLOWED_ORIGIN
// : process.env.PRODUCTION_ALLOWED_ORIGIN,
methods: ["GET", "POST", "PATH", "DELETE"],
},
});
const sellerSockets = {};
const userSockets = {};
const RequestQueue = {};
const UpdatedRequestQueue = {};
const DeletedRequestQueue = {};
const ResponseQueue = {};
const UpdatedResponseQueue = {};
const DeletedResponseQueue = {};
io.on("connection", (socket) => {
console.log("Client Enterd with id: ", socket.id);
// Handle seller identification
socket.on("identifySeller", (sellerId) => {
sellerSockets[sellerId] = socket.id;
console.log(`Seller ${sellerId} identified with socket ${socket.id}`);
try {
// if new request has been made and seller where offline
sendQueuedMessages(socket, sellerId, RequestQueue, "newRequest");
sendQueuedMessages(
socket,
sellerId,
UpdatedRequestQueue,
"requestUpdated"
);
sendQueuedMessages(
socket,
sellerId,
DeletedRequestQueue,
"requestDeleted"
);
} catch (error) {
console.error(`Error in identifySeller: ${error}`);
}
});
// Handle response from seller to user
socket.on("identifyBuyer", (userId) => {
userSockets[userId] = socket.id;
console.log(`Buyer ${userId} identified with socket ${socket.id}`);
try {
// if new response made and user where offline
sendQueuedMessages(socket, userId, ResponseQueue, "newResponse");
sendQueuedMessages(
socket,
userId,
UpdatedResponseQueue,
"responseUpdated"
);
sendQueuedMessages(
socket,
userId,
DeletedResponseQueue,
"responseDeleted"
);
} catch (error) {
console.error(`Error in identifyBuyer: ${error}`);
}
});
socket.on("DisconnectSeller", () => {
try {
// Clean up the mapping when a seller disconnects
const disconnectedSeller = Object.keys(sellerSockets).find(
(key) => sellerSockets[key] === socket.id
);
if (disconnectedSeller) {
delete sellerSockets[disconnectedSeller];
console.log(`Seller ${disconnectedSeller} disconnected`);
}
} catch (error) {
console.error(`Error in DisconnectSeller: ${error}`);
}
});
socket.on("DisconnectBuyer", () => {
try {
// Clean up the mapping when a seller disconnects
const disconnectedBuyer = Object.keys(userSockets).find(
(key) => userSockets[key] === socket.id
);
if (disconnectedBuyer) {
delete userSockets[disconnectedBuyer];
console.log(`Buyer ${disconnectedBuyer} disconnected`);
}
} catch (error) {
console.error(`Error in DisconnectBuyer: ${error}`);
}
});
});
function sendQueuedMessages(socket, recipientId, queue, eventName) {
const messages = queue[recipientId];
if (messages) {
messages.forEach((message) => {
socket.emit(eventName, message);
});
delete queue[recipientId];
}
}
function addToQueue(queue, userId, message) {
if (!queue[userId]) {
queue[userId] = [];
}
queue[userId].push(message);
}
module.exports = {
io,
sellerSockets,
userSockets,
RequestQueue,
UpdatedRequestQueue,
DeletedRequestQueue,
ResponseQueue,
UpdatedResponseQueue,
DeletedResponseQueue,
addToQueue,
server,
app,
};