Skip to content

Commit afa9d8e

Browse files
Merge pull request #294 from cmu15122/preview
tons of attempted socket fixes
2 parents cb9a71d + d6f0ce4 commit afa9d8e

File tree

5 files changed

+797
-179
lines changed

5 files changed

+797
-179
lines changed

client/src/services/SocketsService.tsx

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,60 @@ import Cookies from 'universal-cookie';
33

44
const cookies = new Cookies();
55

6-
let socket : Socket;
7-
const SOCKET_URL = process.env.REACT_APP_PROTOCOL + '://' + process.env.REACT_APP_DOMAIN;
6+
let socket: Socket;
7+
const SOCKET_URL =
8+
process.env.REACT_APP_PROTOCOL + '://' + process.env.REACT_APP_DOMAIN;
89
const SOCKET_PATH = process.env.REACT_APP_SOCKET_PATH;
910

1011
export const initiateSocket = () => {
1112
if (socket) {
1213
return;
1314
}
1415

15-
socket = io(SOCKET_URL, {path: SOCKET_PATH});
16+
socket = io(SOCKET_URL, {
17+
path: SOCKET_PATH,
18+
transports: ['polling', 'websocket'],
19+
closeOnBeforeunload: true,
20+
forceNew: true,
21+
tryAllTransports: true,
22+
withCredentials: true,
23+
});
1624

1725
const userCookies = cookies.get('user');
1826
if (userCookies != null) {
1927
socket.emit('authenticate', userCookies.access_token);
2028
}
2129

30+
socket.on('connect', () => {
31+
const transport = socket.io.engine.transport.name; // in most cases, "polling"
32+
33+
console.log('Connected with transport:', transport);
34+
35+
socket.io.engine.on('upgrade', () => {
36+
const upgradedTransport = socket.io.engine.transport.name; // in most cases, "websocket"
37+
console.log(
38+
'Transport upgraded from',
39+
transport,
40+
'to',
41+
upgradedTransport,
42+
);
43+
});
44+
});
45+
2246
socket.on('disconnect', (reason, details) => {
2347
console.log('Client disconnected, reconnecting', reason, details);
24-
25-
setTimeout(() => {
26-
socket.connect();
27-
}, 1000);
48+
ensureSocketConnected();
2849
});
2950

3051
socket.on('connect_error', (error) => {
3152
console.log('Connection error, reconnecting', error.message);
32-
setTimeout(() => {
33-
socket.connect();
34-
}, 1000);
53+
ensureSocketConnected();
3554
});
36-
37-
// dumbass brute force so nginx doesn't kill us
38-
setInterval(() => {
39-
socket.emit('ping');
40-
}, 5000);
4155
};
4256

57+
// use subscriptions when reconnecting to listen for all previous events
58+
const subscriptions = {};
59+
4360
export const socketSubscribeTo = (emission, callback) => {
4461
if (!socket) {
4562
initiateSocket();
@@ -48,6 +65,8 @@ export const socketSubscribeTo = (emission, callback) => {
4865
socket.on(emission, (data) => {
4966
callback(data);
5067
});
68+
69+
subscriptions[emission] = callback;
5170
};
5271

5372
export const socketUnsubscribeFrom = (emission) => {
@@ -56,6 +75,8 @@ export const socketUnsubscribeFrom = (emission) => {
5675
}
5776

5877
socket.off(emission);
78+
79+
delete subscriptions[emission];
5980
};
6081

6182
export const ensureSocketConnected = () => {
@@ -66,6 +87,13 @@ export const ensureSocketConnected = () => {
6687

6788
if (!socket.connected || !socket.active) {
6889
console.log('Existing socket not connected or inactive, reconnecting');
90+
socket.close();
91+
socket.removeAllListeners();
6992
socket.connect();
93+
94+
// re-subscribe to all previous events (don't call socketSubscribeTo to avoid infinite loop)
95+
Object.keys(subscriptions).forEach((emission) => {
96+
socket.on(emission, subscriptions[emission]);
97+
});
7098
}
7199
};

server/config/config.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
require('dotenv').config()
1+
require('dotenv').config();
22

33
module.exports = {
44
GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID,
@@ -15,5 +15,7 @@ module.exports = {
1515
CLIENT_PORT: process.env.CLIENT_PORT,
1616
TOKEN_KEY: process.env.TOKEN_KEY,
1717
OWNER_EMAIL: process.env.OWNER_EMAIL,
18-
OWNER_ACCESS_TOKEN: ''
19-
}
18+
SOCKET_ADMIN_MODE: process.env.SOCKET_ADMIN_MODE,
19+
SOCKET_ADMIN_PASSWORD: process.env.SOCKET_ADMIN_PASSWORD,
20+
OWNER_ACCESS_TOKEN: '',
21+
};

0 commit comments

Comments
 (0)