game-sync-server 0.0.1
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 +2 -0
- package/index.js +78 -0
- package/package.json +27 -0
package/README.md
ADDED
package/index.js
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
const WebSocket = require('ws');
|
2
|
+
const http = require('http');
|
3
|
+
const { v4: uuidv4 } = require('uuid');
|
4
|
+
|
5
|
+
const server = http.createServer();
|
6
|
+
const wss = new WebSocket.Server({ server });
|
7
|
+
|
8
|
+
let gameState = {};
|
9
|
+
let unhandledActions = [];
|
10
|
+
let clients = {};
|
11
|
+
|
12
|
+
function send(socket, data) {
|
13
|
+
socket.send(JSON.stringify(data));
|
14
|
+
}
|
15
|
+
|
16
|
+
function broadcast(data) {
|
17
|
+
wss.clients.forEach((client) => {
|
18
|
+
if (client.readyState === WebSocket.OPEN) {
|
19
|
+
send(client, data);
|
20
|
+
}
|
21
|
+
});
|
22
|
+
}
|
23
|
+
|
24
|
+
function broadcastExcept(socket, data) {
|
25
|
+
wss.clients.forEach((client) => {
|
26
|
+
if (client !== socket && client.readyState === WebSocket.OPEN) {
|
27
|
+
send(client, data);
|
28
|
+
}
|
29
|
+
});
|
30
|
+
}
|
31
|
+
|
32
|
+
wss.on('connection', (socket) => {
|
33
|
+
const clientId = uuidv4();
|
34
|
+
clients[clientId] = socket;
|
35
|
+
|
36
|
+
send(socket, {
|
37
|
+
type: 'welcome',
|
38
|
+
clientId,
|
39
|
+
gameState,
|
40
|
+
unhandledActions,
|
41
|
+
clients: Object.keys(clients),
|
42
|
+
});
|
43
|
+
|
44
|
+
broadcastExcept(socket, { type: 'clientJoined', clientId });
|
45
|
+
|
46
|
+
socket.on('message', (message) => {
|
47
|
+
const data = JSON.parse(message);
|
48
|
+
|
49
|
+
if (data.type === 'ping') {
|
50
|
+
send(socket, {
|
51
|
+
type: 'pong',
|
52
|
+
payload: data.payload,
|
53
|
+
serverTime: Date.now(),
|
54
|
+
});
|
55
|
+
} else if (data.type === 'gameStateUpdate') {
|
56
|
+
if (data.basedOnId === gameState.id) {
|
57
|
+
gameState = data.state;
|
58
|
+
unhandledActions = unhandledActions.filter(
|
59
|
+
(action) => !data.handledActionIds.includes(action.id)
|
60
|
+
);
|
61
|
+
broadcast({ type: 'gameStateUpdate', state: gameState });
|
62
|
+
}
|
63
|
+
} else if (data.type === 'playerAction') {
|
64
|
+
unhandledActions.push(data);
|
65
|
+
broadcast({ type: 'playerAction', action: data });
|
66
|
+
}
|
67
|
+
});
|
68
|
+
|
69
|
+
socket.on('close', () => {
|
70
|
+
delete clients[clientId];
|
71
|
+
broadcast({ type: 'clientLeft', clientId });
|
72
|
+
});
|
73
|
+
});
|
74
|
+
|
75
|
+
const port = process.env.PORT || 3000;
|
76
|
+
server.listen(port, () => {
|
77
|
+
console.log(`Server listening on port ${port}`);
|
78
|
+
});
|
package/package.json
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
{
|
2
|
+
"name": "game-sync-server",
|
3
|
+
"version": "0.0.1",
|
4
|
+
"description": "A framework for creating real-time multiplayer games",
|
5
|
+
"main": "index.js",
|
6
|
+
"scripts": {
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
8
|
+
},
|
9
|
+
"repository": {
|
10
|
+
"type": "git",
|
11
|
+
"url": "git+ssh://git@github.com/felixbade/game-sync-server.git"
|
12
|
+
},
|
13
|
+
"keywords": [
|
14
|
+
"game",
|
15
|
+
"websocket",
|
16
|
+
"realtime",
|
17
|
+
"networking",
|
18
|
+
"multiplayer",
|
19
|
+
"server"
|
20
|
+
],
|
21
|
+
"author": "Felix Bade",
|
22
|
+
"license": "ISC",
|
23
|
+
"bugs": {
|
24
|
+
"url": "https://github.com/felixbade/game-sync-server/issues"
|
25
|
+
},
|
26
|
+
"homepage": "https://github.com/felixbade/game-sync-server#readme"
|
27
|
+
}
|