game-sync-server 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. package/README.md +2 -0
  2. package/index.js +78 -0
  3. package/package.json +27 -0
package/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # game-sync-server
2
+ A framework for creating real-time multiplayer games
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
+ }