|
68 | 68 | server.isStandaloneHTTPS = false;
|
69 | 69 | }
|
70 | 70 |
|
71 |
| -const wss = new WebSocket.WebSocketServer({ |
| 71 | +const wss_for_everyone = new WebSocket.WebSocketServer({ |
72 | 72 | noServer: true,
|
73 | 73 | perMessageDeflate: config.perMessageDeflate || false
|
74 | 74 | });
|
75 | 75 |
|
| 76 | +const wss_for_apple = new WebSocket.WebSocketServer({ |
| 77 | + noServer: true, |
| 78 | + perMessageDeflate: false |
| 79 | +}); |
| 80 | + |
76 | 81 | const favicon = fs.existsSync(config.favicon) ? fs.readFileSync(config.favicon) : null;
|
77 | 82 |
|
78 | 83 | server.on('request', (req, res) => {
|
@@ -145,13 +150,20 @@ server.on('request', (req, res) => {
|
145 | 150 |
|
146 | 151 | server.on('upgrade', (req, sock, head) => {
|
147 | 152 | const ip = req.headers["x-forwarded-for"]?.split(",")[0] || sock.address()?.address;
|
| 153 | + const ua = req.headers["user-agent"] |
| 154 | + const isApple = ua?.length && (ua.includes("CFNetwork") || ua.includes("Safari")) && !ua.includes("Chrome") && !ua.includes("Firefox") |
148 | 155 |
|
149 | 156 | if (config.blocked_hosts && config.blocked_hosts.includes(ip)) return sock.destroy();
|
150 | 157 | if (connectedHosts.filter(i => i === ip).length >= (config.max_conn_per_ip || Infinity)) return sock.destroy();
|
151 | 158 |
|
152 | 159 | connectedHosts.push(ip);
|
153 | 160 |
|
154 |
| - wss.handleUpgrade(req, sock, head, _ => bouncer.handleConnection(_, req, _ => delete connectedHosts[connectedHosts.indexOf(ip)])); |
| 161 | + let the_wss |
| 162 | + |
| 163 | + if (isApple) the_wss = wss_for_apple; |
| 164 | + else the_wss = wss_for_everyone; |
| 165 | + |
| 166 | + the_wss.handleUpgrade(req, sock, head, _ => bouncer.handleConnection(_, req, _ => delete connectedHosts[connectedHosts.indexOf(ip)])); |
155 | 167 | });
|
156 | 168 |
|
157 | 169 | const listened = server.listen(process.env.PORT || config.port, config.address || "0.0.0.0", _ => {
|
|
0 commit comments