this.pendingEvents = [];
}
-function writeResponse(response, data, terminate) {
- response[terminate ? "end" : "write"](data.length + data);
+function writeResponse(responseAndIsES, data, terminate) {
+ responseAndIsES[0][terminate ? "end" : "write"](
+ responseAndIsES[1]
+ ? "data:" + data + "\n\n"
+ : data.length + data
+ );
}
function newBoard() {
);
};
-Game.prototype.addListeningPlayer = function (playerName, response) {
+Game.prototype.addListeningPlayer = function (playerName, responseAndIsES) {
var that = this;
- that.listeningPlayers.push(response);
+ that.listeningPlayers.push(responseAndIsES);
- response.on("close", function () {
- var index = that.listeningPlayers.indexOf(response);
+ responseAndIsES[0].on("close", function () {
+ var index = that.listeningPlayers.indexOf(responseAndIsES);
if (index !== -1) {
that.listeningPlayers[index] = that.listeningPlayers[that.listeningPlayers.length - 1];
that.listeningPlayers.pop();
}
}
-function handleCommands(cmds, response) {
+function handleCommands(cmds, responseAndIsES) {
if (!cmds.cmds || !cmds.cmds.length) {
var game = games[cmds.gameNumber];
if (!game) {
- writeResponse(response, '{"error":1,"reason":"Missing or bad game number"}', true);
+ writeResponse(responseAndIsES, "{\"error\":1,\"reason\":\"Missing or bad game number\"}", true);
return;
}
- writeResponse(response,
- JSON.stringify(
- {
+ writeResponse(responseAndIsES,
"playerName": cmds.playerName,
"gameNumber": cmds.gameNumber,
"letterValues": game.letterValues,
)
);
- game.addListeningPlayer(cmds.playerName, response);
+ game.addListeningPlayer(cmds.playerName, responseAndIsES);
return;
}
+ var response = responseAndIsES[0];
+
response.write("[");
for (var i = 0; i < cmds.cmds.length; i++) {
});
request.on("end", function () {
- response.setHeader("Content-Type", "text/plain");
- response.setHeader("Transfer-Encoding", "chunked");
+ var isEventSource = false;
+ var eventSourceMatch = request.url.match(/\/:[^/]+\/sse\/(?<data>[\s\S]+)$/u);
+
+ if (eventSourceMatch) {
+ response.setHeader("Content-Type", "text/event-stream");
+ post = decodeURIComponent(eventSourceMatch.groups.data);
+ isEventSource = true;
+ } else {
+ response.setHeader("Content-Type", "text/plain");
+ response.setHeader("Transfer-Encoding", "chunked");
+ }
+
dateNow = Date.now();
- console.log("RECEIVED", post);
- handleCommands(post && JSON.parse(post), response);
+ console.log("RECEIVED", request.url, post, isEventSource);
+ handleCommands(post && JSON.parse(post), [response, isEventSource]);
});
}