roster-server 1.8.4 → 1.8.8
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.
- package/README.md +4 -1
- package/demo/package-lock.json +1248 -0
- package/demo/package.json +17 -0
- package/demo/socketio.js +29 -0
- package/demo/www/shotx.example.com/client.js +18 -0
- package/demo/www/shotx.example.com/index.js +11 -0
- package/demo/www/sio.example.com/index.js +1 -0
- package/index.js +30 -2
- package/package.json +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "demo",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"license": "ISC",
|
|
6
|
+
"author": "",
|
|
7
|
+
"type": "commonjs",
|
|
8
|
+
"main": "index.js",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"express": "^5.2.1",
|
|
14
|
+
"shotx": "^1.4.2",
|
|
15
|
+
"socket.io": "^4.8.1"
|
|
16
|
+
}
|
|
17
|
+
}
|
package/demo/socketio.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const Roster = require('../index.js');
|
|
2
|
+
const { Server } = require('socket.io');
|
|
3
|
+
|
|
4
|
+
const roster = new Roster({ local: true });
|
|
5
|
+
|
|
6
|
+
roster.register('example.com', (httpsServer) => {
|
|
7
|
+
const io = new Server(httpsServer);
|
|
8
|
+
|
|
9
|
+
io.on('connection', (socket) => {
|
|
10
|
+
console.log('A user connected');
|
|
11
|
+
|
|
12
|
+
socket.on('chat:message', (msg) => {
|
|
13
|
+
console.log('Message received:', msg);
|
|
14
|
+
io.emit('chat:message', msg);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
socket.on('disconnect', () => {
|
|
18
|
+
console.log('User disconnected');
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
return (req, res) => {
|
|
23
|
+
if (req.url && req.url.startsWith(io.opts.path)) return;
|
|
24
|
+
res.writeHead(404);
|
|
25
|
+
res.end('Not found');
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
roster.start();
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const SxClient = require('shotx/client').default;
|
|
2
|
+
|
|
3
|
+
const client = new SxClient('http://localhost:3002');
|
|
4
|
+
|
|
5
|
+
(async () => {
|
|
6
|
+
|
|
7
|
+
const login = await client.connect('valid');
|
|
8
|
+
console.log('CLIENT --> Login:', login);
|
|
9
|
+
|
|
10
|
+
// Join a room
|
|
11
|
+
await client.join('user-room');
|
|
12
|
+
console.log('CLIENT --> Joined room: user-room');
|
|
13
|
+
|
|
14
|
+
// Set up message handlers for specific routes
|
|
15
|
+
client.onMessage('notification', async (data, socket) => {
|
|
16
|
+
console.log('CLIENT --> Received notification:', data);
|
|
17
|
+
});
|
|
18
|
+
})();
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const SxServer = require('shotx/server').default;
|
|
2
|
+
|
|
3
|
+
module.exports = (httpsServer) => {
|
|
4
|
+
const server = new SxServer(httpsServer, {}, { auto404: true });
|
|
5
|
+
|
|
6
|
+
return (req, res) => {
|
|
7
|
+
if (req.url && req.url.startsWith(server.io.opts.path)) return;
|
|
8
|
+
res.writeHead(200);
|
|
9
|
+
res.end('ShotX server running');
|
|
10
|
+
};
|
|
11
|
+
}
|
package/index.js
CHANGED
|
@@ -67,8 +67,31 @@ class VirtualServer extends EventEmitter {
|
|
|
67
67
|
|
|
68
68
|
// Process request with this virtual server's listeners
|
|
69
69
|
processRequest(req, res) {
|
|
70
|
+
let handled = false;
|
|
71
|
+
|
|
72
|
+
// Track if response was handled
|
|
73
|
+
const originalEnd = res.end;
|
|
74
|
+
res.end = function(...args) {
|
|
75
|
+
handled = true;
|
|
76
|
+
return originalEnd.apply(this, args);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// Try all listeners
|
|
70
80
|
for (const listener of this.requestListeners) {
|
|
71
|
-
|
|
81
|
+
if (!handled) {
|
|
82
|
+
listener(req, res);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Restore original end method
|
|
87
|
+
res.end = originalEnd;
|
|
88
|
+
|
|
89
|
+
// If no listener handled the request, try fallback handler
|
|
90
|
+
if (!handled && this.fallbackHandler) {
|
|
91
|
+
this.fallbackHandler(req, res);
|
|
92
|
+
} else if (!handled) {
|
|
93
|
+
res.writeHead(404);
|
|
94
|
+
res.end('No handler found');
|
|
72
95
|
}
|
|
73
96
|
}
|
|
74
97
|
}
|
|
@@ -138,7 +161,7 @@ class Roster {
|
|
|
138
161
|
this.sites[d] = siteApp;
|
|
139
162
|
});
|
|
140
163
|
|
|
141
|
-
log.info(`(✔) Loaded site:
|
|
164
|
+
log.info(`(✔) Loaded site: https://${domain}`);
|
|
142
165
|
} else {
|
|
143
166
|
log.warn(`⚠️ No index file (js/mjs/cjs) found in ${domainPath}`);
|
|
144
167
|
}
|
|
@@ -335,6 +358,9 @@ class Roster {
|
|
|
335
358
|
|
|
336
359
|
// Create simple dispatcher for this domain
|
|
337
360
|
const dispatcher = (req, res) => {
|
|
361
|
+
// Set fallback handler on virtual server for non-Socket.IO requests
|
|
362
|
+
virtualServer.fallbackHandler = appHandler;
|
|
363
|
+
|
|
338
364
|
if (virtualServer.requestListeners.length > 0) {
|
|
339
365
|
virtualServer.processRequest(req, res);
|
|
340
366
|
} else if (appHandler) {
|
|
@@ -432,6 +458,8 @@ class Roster {
|
|
|
432
458
|
const appHandler = portData.appHandlers[domain];
|
|
433
459
|
|
|
434
460
|
if (virtualServer && virtualServer.requestListeners.length > 0) {
|
|
461
|
+
// Set fallback handler on virtual server for non-Socket.IO requests
|
|
462
|
+
virtualServer.fallbackHandler = appHandler;
|
|
435
463
|
// App registered listeners on virtual server - use them
|
|
436
464
|
virtualServer.processRequest(req, res);
|
|
437
465
|
} else if (appHandler) {
|