Commit ba3b1630 authored by Dennis Willers's avatar Dennis Willers
Browse files

Implement Socket for Multiplayer Gaming

parent 6a1bcda4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -42,6 +42,6 @@ docker-deploy:
  script:
    - ssh root@willers.digital -p 2233  "/usr/local/bin/docker login hub.willers.digital -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD"
    - ssh root@willers.digital -p 2233  "/usr/local/bin/docker pull hub.willers.digital/dennis.willers/tabu-middleware:latest"
    - ssh root@willers.digital -p 2233  "/usr/local/bin/docker run -d -p 3150:8080 --restart=on-failure:5 --mount type=bind,src=/volume1/docker/tmp6,dst=/tmp --name tabu-middleware hub.willers.digital/dennis.willers/tabu-middleware:latest"
    - ssh root@willers.digital -p 2233  "/usr/local/bin/docker run -d -p 3150:8080 -p 3000:3000 --restart=on-failure:5 --mount type=bind,src=/volume1/docker/tmp6,dst=/tmp --name tabu-middleware hub.willers.digital/dennis.willers/tabu-middleware:latest"
  only:
    - master
+1 −0
Original line number Diff line number Diff line
FROM node:12.18.1
ENV NODE_ENV=production
EXPOSE 8080
EXPOSE 3000
WORKDIR /app
COPY ["package.json", "package-lock.json*", "./"]
RUN npm install --production
+48 −11
Original line number Diff line number Diff line
const express = require('express');
const io = require("socket.io-client");
const socket = io('http://localhost:3000');

function createRouter(db) {
    const router = express.Router();

    var isTrue = function(req, res) {
    const isTrue = function(req, res) {
        res.status(200).json({status: 'true'});
    };

    var isSession = function isSession(req, res, next) {
    const isSession = function isSession(req, res, next) {
        const spielname = req.body.spielname;
        if (spielname.match(/^[0-9a-zA-Z]+$/) != null) {
            const sql = 'SELECT SessionName FROM Session WHERE SessionName = \''+spielname+'\';';
@@ -32,7 +34,7 @@ function createRouter(db) {
        }
    };

    var getGamestatus = function(req, res, next) {
    const getGamestatus = function(req, res) {
        const spielname = req.body.spielname;
        if (spielname.match(/^[0-9a-zA-Z]+$/) != null) {
            const sql = 'SELECT SessionID, Red, Blue, RedTurn, ActiveExplainer, ActiveWatchdog FROM Gamestatus WHERE SessionID = (SELECT SessionID FROM Session WHERE SessionName = \"'+spielname+'\")';
@@ -63,7 +65,7 @@ function createRouter(db) {
        }
    };

    var addSession = function addSession(req, res) {
    const addSession = function addSession(req, res) {
        const spielname = req.body.spielname;
        if (spielname.match(/^[0-9a-zA-Z]+$/) != null) {
            const sql = 'INSERT INTO Session (SessionName) VALUES (\"'+spielname+'\");';
@@ -99,7 +101,7 @@ function createRouter(db) {
        }
    };

    var session = function session(req, res) {
    const session = function session(req, res) {
        const sql = 'SELECT * FROM Session';
        console.log('Session: ', sql);
        db.query(
@@ -115,7 +117,7 @@ function createRouter(db) {
        );
    };

    var getS2C = function getS2C(req, res) {
    const getS2C = function getS2C(req, res) {
        const spielname = req.body.spielname;
        if (spielname.match(/^[0-9a-zA-Z]+$/) != null) {
            let card;
@@ -159,6 +161,7 @@ function createRouter(db) {
                                                tabu5: card.Tabu5,
                                            }
                                        );
                                        socket.emit('newCard', {'sessionName': spielname, 'cardID': card.CardID})
                                    }
                                }
                            );
@@ -172,7 +175,7 @@ function createRouter(db) {
        }
    };

    var newRound = function newRound(req, res) {
    const newRound = function newRound(req, res) {
        const spielname = req.body.spielname;
        if (spielname.match(/^[0-9a-zA-Z]+$/) != null) {
            const sql = 'UPDATE Gamestatus SET ActiveExplainer = 1, ActiveWatchdog=1 WHERE SessionID = (SELECT SessionID FROM Session WHERE SessionName = \"'+spielname+'\")';
@@ -193,7 +196,7 @@ function createRouter(db) {
        }
    };

    var endRound = function endRound(req, res) {
    const endRound = function endRound(req, res) {
        const spielname = req.body.spielname;
        if (spielname.match(/^[0-9a-zA-Z]+$/) != null) {
            const sql = 'UPDATE Gamestatus SET RedTurn = (SELECT 1-Gamestatus.RedTurn FROM Gamestatus INNER JOIN Session ON Session.SessionID=Gamestatus.SessionID WHERE Session.SessionName = \"'+spielname+'\"),  ActiveExplainer = 0, ActiveWatchdog=0 WHERE SessionID = (SELECT SessionID FROM Session WHERE SessionName = \"'+spielname+'\")';
@@ -214,7 +217,7 @@ function createRouter(db) {
        }
    };

    var newGame = function newGame(req, res) {
    const newGame = function newGame(req, res) {
        const spielname = req.body.spielname;
        if (spielname.match(/^[0-9a-zA-Z]+$/) != null) {
            const sql = 'UPDATE Gamestatus SET Red = 0, Blue = 0, RedTurn = '+Math.round(Math.random())+' WHERE SessionID = (SELECT SessionID FROM Session WHERE SessionName = \"'+spielname+'\")';
@@ -235,7 +238,7 @@ function createRouter(db) {
        }
    };

    var addPoint = function addPoint(req, res) {
    const addPoint = function addPoint(req, res) {
        console.log(req.body);
        const spielname = req.body.spielname;
        const team = req.body.team;
@@ -286,7 +289,7 @@ function createRouter(db) {
        }
    };

    var removePoint = function removePoint(req, res) {
    const removePoint = function removePoint(req, res) {
        console.log(req.body);
        const spielname = req.body.spielname;
        const team = req.body.team;
@@ -337,6 +340,37 @@ function createRouter(db) {
        }
    };

    const getCard = function getCard(req, res) {
        const cardID = req.body.cardID;
        if (Number.isInteger(cardID)) {
            const sql = 'SELECT CardID, Solution, Tabu1, Tabu2, Tabu3, Tabu4, Tabu5 FROM Card WHERE CardID = \"'+cardID+'\"';
            console.log('Session: ', sql);
            db.query(
                sql,
                (error, results) => {
                    if (error) {
                        console.log(error);
                        res.status(500).json({status: 'error'});
                    } else {
                        if (results.length > 0) {
                            res.status(200).json({
                                cardID: results[0].CardID,
                                solution: results[0].Solution,
                                tabu1: results[0].Tabu1,
                                tabu2: results[0].Tabu2,
                                tabu3: results[0].Tabu3,
                                tabu4: results[0].Tabu4,
                                tabu5: results[0].Tabu5
                            });
                        } else {
                            res.status(500).json({status: 'false'});
                        }
                    }
                }
            );
        }
    };

    // the routes are defined here

    //Generate new Session
@@ -369,6 +403,9 @@ function createRouter(db) {
    //Remove Point
    router.post('/removePoint', [removePoint]);

    //Get CardID
    router.post('/getCard', [getCard]);

    return router;

}
+245 −0
Original line number Diff line number Diff line
@@ -4,6 +4,26 @@
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "@types/component-emitter": {
      "version": "1.2.10",
      "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
      "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg=="
    },
    "@types/cookie": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz",
      "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg=="
    },
    "@types/cors": {
      "version": "2.8.9",
      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz",
      "integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg=="
    },
    "@types/node": {
      "version": "14.14.16",
      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.16.tgz",
      "integrity": "sha512-naXYePhweTi+BMv11TgioE2/FXU4fSl29HAH1ffxVciNsH3rYXjNP2yM8wqmSm7jS20gM8TIklKiTen+1iVncw=="
    },
    "accepts": {
      "version": "1.3.7",
      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
@@ -18,6 +38,21 @@
      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
    },
    "backo2": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
    },
    "base64-arraybuffer": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
      "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI="
    },
    "base64id": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
      "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
    },
    "bignumber.js": {
      "version": "9.0.0",
      "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
@@ -45,6 +80,16 @@
      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
    },
    "component-bind": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
      "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
    },
    "component-emitter": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
    },
    "content-disposition": {
      "version": "0.5.3",
      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
@@ -110,6 +155,85 @@
      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
    },
    "engine.io": {
      "version": "4.0.5",
      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.0.5.tgz",
      "integrity": "sha512-Ri+whTNr2PKklxQkfbGjwEo+kCBUM4Qxk4wtLqLrhH+b1up2NFL9g9pjYWiCV/oazwB0rArnvF/ZmZN2ab5Hpg==",
      "requires": {
        "accepts": "~1.3.4",
        "base64id": "2.0.0",
        "cookie": "~0.4.1",
        "cors": "~2.8.5",
        "debug": "~4.1.0",
        "engine.io-parser": "~4.0.0",
        "ws": "^7.1.2"
      },
      "dependencies": {
        "cookie": {
          "version": "0.4.1",
          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
          "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
        },
        "debug": {
          "version": "4.1.1",
          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
          "requires": {
            "ms": "^2.1.1"
          }
        },
        "ms": {
          "version": "2.1.3",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
        }
      }
    },
    "engine.io-client": {
      "version": "4.0.5",
      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-4.0.5.tgz",
      "integrity": "sha512-1lkn0QdekHQPMTcxUh8LqIuxQHNtKV5GvqkQzmZ1rYKAvB6puMm13U7K1ps3OQZ4joE46asQiAKrcdL9weNEVw==",
      "requires": {
        "base64-arraybuffer": "0.1.4",
        "component-emitter": "~1.3.0",
        "debug": "~4.1.0",
        "engine.io-parser": "~4.0.1",
        "has-cors": "1.1.0",
        "parseqs": "0.0.6",
        "parseuri": "0.0.6",
        "ws": "~7.2.1",
        "xmlhttprequest-ssl": "~1.5.4",
        "yeast": "0.1.2"
      },
      "dependencies": {
        "debug": {
          "version": "4.1.1",
          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
          "requires": {
            "ms": "^2.1.1"
          }
        },
        "ms": {
          "version": "2.1.3",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
        },
        "ws": {
          "version": "7.2.5",
          "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz",
          "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA=="
        }
      }
    },
    "engine.io-parser": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz",
      "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==",
      "requires": {
        "base64-arraybuffer": "0.1.4"
      }
    },
    "escape-html": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -181,6 +305,11 @@
      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
    },
    "has-cors": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
    },
    "http-errors": {
      "version": "1.7.2",
      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
@@ -283,6 +412,16 @@
        "ee-first": "1.1.1"
      }
    },
    "parseqs": {
      "version": "0.0.6",
      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
      "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
    },
    "parseuri": {
      "version": "0.0.6",
      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
      "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
    },
    "parseurl": {
      "version": "1.3.3",
      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -395,6 +534,97 @@
      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
    },
    "socket.io": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.0.4.tgz",
      "integrity": "sha512-Vj1jUoO75WGc9txWd311ZJJqS9Dr8QtNJJ7gk2r7dcM/yGe9sit7qOijQl3GAwhpBOz/W8CwkD7R6yob07nLbA==",
      "requires": {
        "@types/cookie": "^0.4.0",
        "@types/cors": "^2.8.8",
        "@types/node": "^14.14.7",
        "accepts": "~1.3.4",
        "base64id": "~2.0.0",
        "debug": "~4.1.0",
        "engine.io": "~4.0.0",
        "socket.io-adapter": "~2.0.3",
        "socket.io-parser": "~4.0.1"
      },
      "dependencies": {
        "debug": {
          "version": "4.1.1",
          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
          "requires": {
            "ms": "^2.1.1"
          }
        },
        "ms": {
          "version": "2.1.3",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
        }
      }
    },
    "socket.io-adapter": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.0.3.tgz",
      "integrity": "sha512-2wo4EXgxOGSFueqvHAdnmi5JLZzWqMArjuP4nqC26AtLh5PoCPsaRbRdah2xhcwTAMooZfjYiNVNkkmmSMaxOQ=="
    },
    "socket.io-client": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-3.0.4.tgz",
      "integrity": "sha512-qMvBuS+W9JIN2mkfAWDCxuIt+jpIKDf8C0604zEqx1JrPaPSS6cN0F3B2GYWC83TqBeVJXW66GFxWV3KD88n0Q==",
      "requires": {
        "@types/component-emitter": "^1.2.10",
        "backo2": "1.0.2",
        "component-bind": "1.0.0",
        "component-emitter": "~1.3.0",
        "debug": "~4.1.0",
        "engine.io-client": "~4.0.0",
        "parseuri": "0.0.6",
        "socket.io-parser": "~4.0.1"
      },
      "dependencies": {
        "debug": {
          "version": "4.1.1",
          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
          "requires": {
            "ms": "^2.1.1"
          }
        },
        "ms": {
          "version": "2.1.3",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
        }
      }
    },
    "socket.io-parser": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.2.tgz",
      "integrity": "sha512-Bs3IYHDivwf+bAAuW/8xwJgIiBNtlvnjYRc4PbXgniLmcP1BrakBoq/QhO24rgtgW7VZ7uAaswRGxutUnlAK7g==",
      "requires": {
        "@types/component-emitter": "^1.2.10",
        "component-emitter": "~1.3.0",
        "debug": "~4.1.0"
      },
      "dependencies": {
        "debug": {
          "version": "4.1.1",
          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
          "requires": {
            "ms": "^2.1.1"
          }
        },
        "ms": {
          "version": "2.1.3",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
        }
      }
    },
    "sqlstring": {
      "version": "2.3.1",
      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
@@ -446,6 +676,21 @@
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
    },
    "ws": {
      "version": "7.4.2",
      "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz",
      "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA=="
    },
    "xmlhttprequest-ssl": {
      "version": "1.5.5",
      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
      "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
    },
    "yeast": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
      "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
    }
  }
}
+3 −1
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@
  "dependencies": {
    "cors": "^2.8.5",
    "express": "^4.17.1",
    "mysql": "^2.18.1"
    "mysql": "^2.18.1",
    "socket.io": "^3.0.4",
    "socket.io-client": "^3.0.4"
  }
}
Loading