11const httpServer = require ( "http" ) . createServer ( ) ;
2+ const Redis = require ( "ioredis" ) ;
3+ const redisClient = new Redis ( ) ;
24const io = require ( "socket.io" ) ( httpServer , {
35 cors : {
46 origin : "http://localhost:8080" ,
57 } ,
8+ adapter : require ( "socket.io-redis" ) ( {
9+ pubClient : redisClient ,
10+ subClient : redisClient . duplicate ( ) ,
11+ } ) ,
612} ) ;
713
14+ const { setupWorker } = require ( "@socket.io/sticky" ) ;
815const crypto = require ( "crypto" ) ;
916const randomId = ( ) => crypto . randomBytes ( 8 ) . toString ( "hex" ) ;
1017
11- const { InMemorySessionStore } = require ( "./sessionStore" ) ;
12- const sessionStore = new InMemorySessionStore ( ) ;
18+ const { RedisSessionStore } = require ( "./sessionStore" ) ;
19+ const sessionStore = new RedisSessionStore ( redisClient ) ;
1320
14- const { InMemoryMessageStore } = require ( "./messageStore" ) ;
15- const messageStore = new InMemoryMessageStore ( ) ;
21+ const { RedisMessageStore } = require ( "./messageStore" ) ;
22+ const messageStore = new RedisMessageStore ( redisClient ) ;
1623
17- io . use ( ( socket , next ) => {
24+ io . use ( async ( socket , next ) => {
1825 const sessionID = socket . handshake . auth . sessionID ;
1926 if ( sessionID ) {
20- const session = sessionStore . findSession ( sessionID ) ;
27+ const session = await sessionStore . findSession ( sessionID ) ;
2128 if ( session ) {
2229 socket . sessionID = sessionID ;
2330 socket . userID = session . userID ;
@@ -35,7 +42,7 @@ io.use((socket, next) => {
3542 next ( ) ;
3643} ) ;
3744
38- io . on ( "connection" , ( socket ) => {
45+ io . on ( "connection" , async ( socket ) => {
3946 // persist session
4047 sessionStore . saveSession ( socket . sessionID , {
4148 userID : socket . userID ,
@@ -54,8 +61,12 @@ io.on("connection", (socket) => {
5461
5562 // fetch existing users
5663 const users = [ ] ;
64+ const [ messages , sessions ] = await Promise . all ( [
65+ messageStore . findMessagesForUser ( socket . userID ) ,
66+ sessionStore . findAllSessions ( ) ,
67+ ] ) ;
5768 const messagesPerUser = new Map ( ) ;
58- messageStore . findMessagesForUser ( socket . userID ) . forEach ( ( message ) => {
69+ messages . forEach ( ( message ) => {
5970 const { from, to } = message ;
6071 const otherUser = socket . userID === from ? to : from ;
6172 if ( messagesPerUser . has ( otherUser ) ) {
@@ -64,7 +75,8 @@ io.on("connection", (socket) => {
6475 messagesPerUser . set ( otherUser , [ message ] ) ;
6576 }
6677 } ) ;
67- sessionStore . findAllSessions ( ) . forEach ( ( session ) => {
78+
79+ sessions . forEach ( ( session ) => {
6880 users . push ( {
6981 userID : session . userID ,
7082 username : session . username ,
@@ -110,8 +122,4 @@ io.on("connection", (socket) => {
110122 } ) ;
111123} ) ;
112124
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