-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathdisconnect.js
More file actions
84 lines (71 loc) · 2.77 KB
/
Copy pathdisconnect.js
File metadata and controls
84 lines (71 loc) · 2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB.DocumentClient();
require('./disconnect-patch.js');
const TABLE_NAME = "game-session";
let dissconnectWs = undefined;
let wsStatus = undefined;
function init(event) {
console.log(event)
const apigwManagementApi = new AWS.ApiGatewayManagementApi({ apiVersion: '2018-11-29', endpoint: event.requestContext.domainName + '/' + event.requestContext.stage });
dissconnectWs = async(connectionId) => {
await apigwManagementApi.deleteConnection({ ConnectionId: connectionId }).promise();
}
}
function getGameSession(playerId) {
return ddb.scan({
TableName: TABLE_NAME,
FilterExpression: "#p1 = :playerId or #p2 = :playerId",
ExpressionAttributeNames: {
"#p1": "player1",
"#p2": "player2"
},
ExpressionAttributeValues: {
":playerId": playerId
}
}).promise();
}
async function closeGame(uuid) {
ddb.update({
TableName: TABLE_NAME,
Key: {
"uuid": uuid
},
UpdateExpression: "set gameStatus = :status",
ExpressionAttributeValues: {
":status": "closed"
}
}).promise();
}
exports.handler = (event, context, callback) => {
console.log("Disconnect event received: %j", event);
init(event);
const connectionIdForCurrentRequest = event.requestContext.connectionId;
console.log("Request from player: " + connectionIdForCurrentRequest);
getGameSession(connectionIdForCurrentRequest).then((data) => {
console.log("getGameSession: " + data.Items[0].uuid);
if (data.Items[0].player1 == connectionIdForCurrentRequest) {
closeGame(data.Items[0].uuid);
// player1 disconnected, now disconnect player 2
if (data.Items[0].player2 !== 'empty') {
console.log("Disconnecting player 2: " + data.Items[0].player2);
dissconnectWs(data.Items[0].player2).then(() => {}, (err) => {
console.log("Error closing connection, player 2 probably already closed.");
console.log(err);
});
}
else {
console.log("Player2 was never filled")
}
}
else {
// player2 disconnected, now disconnect player 1
console.log("Disconnecting player 1: " + data.Items[0].player1);
closeGame(data.Items[0].uuid);
dissconnectWs(data.Items[0].player1).then(() => {}, (err) => {
console.log("Error closing connection, player 1 probably already closed.");
console.log(err);
});;
}
});
return callback(null, { statusCode: 200, });
}