roster-server 1.8.8 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.js +55 -0
  2. package/package.json +2 -1
package/index.js CHANGED
@@ -13,6 +13,7 @@ class VirtualServer extends EventEmitter {
13
13
  super();
14
14
  this.domain = domain;
15
15
  this.requestListeners = [];
16
+ this.upgradeListeners = [];
16
17
 
17
18
  // Simulate http.Server properties
18
19
  this.listening = false;
@@ -27,6 +28,8 @@ class VirtualServer extends EventEmitter {
27
28
  on(event, listener) {
28
29
  if (event === 'request') {
29
30
  this.requestListeners.push(listener);
31
+ } else if (event === 'upgrade') {
32
+ this.upgradeListeners.push(listener);
30
33
  }
31
34
  return super.on(event, listener);
32
35
  }
@@ -39,6 +42,8 @@ class VirtualServer extends EventEmitter {
39
42
  listeners(event) {
40
43
  if (event === 'request') {
41
44
  return this.requestListeners.slice();
45
+ } else if (event === 'upgrade') {
46
+ return this.upgradeListeners.slice();
42
47
  }
43
48
  return super.listeners(event);
44
49
  }
@@ -49,6 +54,11 @@ class VirtualServer extends EventEmitter {
49
54
  if (index !== -1) {
50
55
  this.requestListeners.splice(index, 1);
51
56
  }
57
+ } else if (event === 'upgrade') {
58
+ const index = this.upgradeListeners.indexOf(listener);
59
+ if (index !== -1) {
60
+ this.upgradeListeners.splice(index, 1);
61
+ }
52
62
  }
53
63
  return super.removeListener(event, listener);
54
64
  }
@@ -56,6 +66,8 @@ class VirtualServer extends EventEmitter {
56
66
  removeAllListeners(event) {
57
67
  if (event === 'request') {
58
68
  this.requestListeners = [];
69
+ } else if (event === 'upgrade') {
70
+ this.upgradeListeners = [];
59
71
  }
60
72
  return super.removeAllListeners(event);
61
73
  }
@@ -94,6 +106,19 @@ class VirtualServer extends EventEmitter {
94
106
  res.end('No handler found');
95
107
  }
96
108
  }
109
+
110
+ // Process upgrade events (WebSocket)
111
+ processUpgrade(req, socket, head) {
112
+ // Emit to all registered upgrade listeners
113
+ for (const listener of this.upgradeListeners) {
114
+ listener(req, socket, head);
115
+ }
116
+
117
+ // If no listeners, destroy the socket
118
+ if (this.upgradeListeners.length === 0) {
119
+ socket.destroy();
120
+ }
121
+ }
97
122
  }
98
123
 
99
124
  class Roster {
@@ -375,6 +400,11 @@ class Roster {
375
400
  const httpServer = http.createServer(dispatcher);
376
401
  this.portServers[port] = httpServer;
377
402
 
403
+ // Handle WebSocket upgrade events
404
+ httpServer.on('upgrade', (req, socket, head) => {
405
+ virtualServer.processUpgrade(req, socket, head);
406
+ });
407
+
378
408
  httpServer.listen(port, 'localhost', () => {
379
409
  log.info(`🌐 ${domain} → http://localhost:${port}`);
380
410
  });
@@ -476,16 +506,38 @@ class Roster {
476
506
  log.info('HTTP server listening on port 80');
477
507
  });
478
508
 
509
+ // Create upgrade handler for WebSocket connections
510
+ const createUpgradeHandler = (portData) => {
511
+ return (req, socket, head) => {
512
+ const host = req.headers.host || '';
513
+ const hostWithoutPort = host.split(':')[0];
514
+ const domain = hostWithoutPort.startsWith('www.') ? hostWithoutPort.slice(4) : hostWithoutPort;
515
+
516
+ const virtualServer = portData.virtualServers[domain];
517
+
518
+ if (virtualServer) {
519
+ virtualServer.processUpgrade(req, socket, head);
520
+ } else {
521
+ // No virtual server found, destroy the socket
522
+ socket.destroy();
523
+ }
524
+ };
525
+ };
526
+
479
527
  // Handle different port types
480
528
  for (const [port, portData] of Object.entries(sitesByPort)) {
481
529
  const portNum = parseInt(port);
482
530
  const dispatcher = createDispatcher(portData);
531
+ const upgradeHandler = createUpgradeHandler(portData);
483
532
 
484
533
  if (portNum === this.defaultPort) {
485
534
  // Use Greenlock for default port (443) with SSL
486
535
  const httpsServer = glx.httpsServer(null, dispatcher);
487
536
  this.portServers[portNum] = httpsServer;
488
537
 
538
+ // Handle WebSocket upgrade events
539
+ httpsServer.on('upgrade', upgradeHandler);
540
+
489
541
  httpsServer.listen(portNum, this.hostname, () => {
490
542
  log.info(`HTTPS server listening on port ${portNum}`);
491
543
  });
@@ -520,6 +572,9 @@ class Roster {
520
572
 
521
573
  const httpsServer = https.createServer(httpsOptions, dispatcher);
522
574
 
575
+ // Handle WebSocket upgrade events
576
+ httpsServer.on('upgrade', upgradeHandler);
577
+
523
578
  httpsServer.on('error', (error) => {
524
579
  log.error(`HTTPS server error on port ${portNum}:`, error.message);
525
580
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "roster-server",
3
- "version": "1.8.8",
3
+ "version": "1.9.0",
4
4
  "description": "👾 RosterServer - A domain host router to host multiple HTTPS.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -25,6 +25,7 @@
25
25
  "websocket",
26
26
  "express",
27
27
  "greenlock-express",
28
+ "shotx",
28
29
  "clasen"
29
30
  ],
30
31
  "author": "Martin Clasen",