1
1
const httpServer = require ( "http" ) . createServer ( ) ;
2
+ const Redis = require ( "ioredis" ) ;
3
+ const redisClient = new Redis ( ) ;
2
4
const io = require ( "socket.io" ) ( httpServer , {
3
5
cors : {
4
6
origin : "http://localhost:8080" ,
5
7
} ,
8
+ adapter : require ( "socket.io-redis" ) ( {
9
+ pubClient : redisClient ,
10
+ subClient : redisClient . duplicate ( ) ,
11
+ } ) ,
6
12
} ) ;
7
13
14
+ const { setupWorker } = require ( "@socket.io/sticky" ) ;
8
15
const crypto = require ( "crypto" ) ;
9
16
const randomId = ( ) => crypto . randomBytes ( 8 ) . toString ( "hex" ) ;
10
17
11
- const { InMemorySessionStore } = require ( "./sessionStore" ) ;
12
- const sessionStore = new InMemorySessionStore ( ) ;
18
+ const { RedisSessionStore } = require ( "./sessionStore" ) ;
19
+ const sessionStore = new RedisSessionStore ( redisClient ) ;
13
20
14
- const { InMemoryMessageStore } = require ( "./messageStore" ) ;
15
- const messageStore = new InMemoryMessageStore ( ) ;
21
+ const { RedisMessageStore } = require ( "./messageStore" ) ;
22
+ const messageStore = new RedisMessageStore ( redisClient ) ;
16
23
17
- io . use ( ( socket , next ) => {
24
+ io . use ( async ( socket , next ) => {
18
25
const sessionID = socket . handshake . auth . sessionID ;
19
26
if ( sessionID ) {
20
- const session = sessionStore . findSession ( sessionID ) ;
27
+ const session = await sessionStore . findSession ( sessionID ) ;
21
28
if ( session ) {
22
29
socket . sessionID = sessionID ;
23
30
socket . userID = session . userID ;
@@ -35,7 +42,7 @@ io.use((socket, next) => {
35
42
next ( ) ;
36
43
} ) ;
37
44
38
- io . on ( "connection" , ( socket ) => {
45
+ io . on ( "connection" , async ( socket ) => {
39
46
// persist session
40
47
sessionStore . saveSession ( socket . sessionID , {
41
48
userID : socket . userID ,
@@ -54,8 +61,12 @@ io.on("connection", (socket) => {
54
61
55
62
// fetch existing users
56
63
const users = [ ] ;
64
+ const [ messages , sessions ] = await Promise . all ( [
65
+ messageStore . findMessagesForUser ( socket . userID ) ,
66
+ sessionStore . findAllSessions ( ) ,
67
+ ] ) ;
57
68
const messagesPerUser = new Map ( ) ;
58
- messageStore . findMessagesForUser ( socket . userID ) . forEach ( ( message ) => {
69
+ messages . forEach ( ( message ) => {
59
70
const { from, to } = message ;
60
71
const otherUser = socket . userID === from ? to : from ;
61
72
if ( messagesPerUser . has ( otherUser ) ) {
@@ -64,7 +75,8 @@ io.on("connection", (socket) => {
64
75
messagesPerUser . set ( otherUser , [ message ] ) ;
65
76
}
66
77
} ) ;
67
- sessionStore . findAllSessions ( ) . forEach ( ( session ) => {
78
+
79
+ sessions . forEach ( ( session ) => {
68
80
users . push ( {
69
81
userID : session . userID ,
70
82
username : session . username ,
@@ -110,8 +122,4 @@ io.on("connection", (socket) => {
110
122
} ) ;
111
123
} ) ;
112
124
113
- const PORT = process . env . PORT || 3000 ;
114
-
115
- httpServer . listen ( PORT , ( ) =>
116
- console . log ( `server listening at http://localhost:${ PORT } ` )
117
- ) ;
125
+ setupWorker ( io ) ;
0 commit comments