feat(peers): peerjs server as a standalone service

This commit is contained in:
Taha Yassine Kraiem 2022-04-13 18:55:49 +02:00
parent 032f58738b
commit d4dbb7c8bc
7 changed files with 1759 additions and 0 deletions

6
peers/.gitignore vendored Normal file
View file

@ -0,0 +1,6 @@
.idea
node_modules
npm-debug.log
.cache
test.html
/utils/

14
peers/Dockerfile Normal file
View file

@ -0,0 +1,14 @@
FROM node:17-stretch
WORKDIR /work
COPY . .
RUN npm install
# Add Tini
# Startup daemon
ENV TINI_VERSION v0.19.0
ARG envarg
ENV ENTERPRISE_BUILD ${envarg}
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]
CMD npm start

33
peers/build.sh Normal file
View file

@ -0,0 +1,33 @@
#!/bin/bash
# Script to build api module
# flags to accept:
# Default will be OSS build.
# Usage: IMAGE_TAG=latest DOCKER_REPO=myDockerHubID bash build.sh <ee>
git_sha1=${IMAGE_TAG:-$(git rev-parse HEAD)}
check_prereq() {
which docker || {
echo "Docker not installed, please install docker."
exit=1
}
[[ exit -eq 1 ]] && exit 1
}
function build_api(){
cp -R ../utilities/utils .
# Copy enterprise code
[[ $1 == "ee" ]] && {
cp -rf ../ee/peers/* ./
}
docker build -f ./Dockerfile -t ${DOCKER_REPO:-'local'}/peers:${git_sha1} .
[[ $PUSH_IMAGE -eq 1 ]] && {
docker push ${DOCKER_REPO:-'local'}/peers:${git_sha1}
docker tag ${DOCKER_REPO:-'local'}/peers:${git_sha1} ${DOCKER_REPO:-'local'}/peers:latest
docker push ${DOCKER_REPO:-'local'}/peers:latest
}
}
check_prereq
build_api $1

1584
peers/package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

24
peers/package.json Normal file
View file

@ -0,0 +1,24 @@
{
"name": "utilities_server",
"version": "1.0.0",
"description": "assist server to get live sessions & sourcemaps reader to get stack trace",
"main": "peerjs-server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/openreplay/openreplay.git"
},
"author": "KRAIEM Taha Yassine <tahayk2@gmail.com>",
"license": "MIT",
"bugs": {
"url": "https://github.com/openreplay/openreplay/issues"
},
"homepage": "https://github.com/openreplay/openreplay#readme",
"dependencies": {
"express": "^4.17.1",
"peer": "^0.6.1"
}
}

33
peers/server.js Normal file
View file

@ -0,0 +1,33 @@
const dumps = require('./utils/HeapSnapshot');
const {request_logger} = require('./utils/helper');
const {peerRouter, peerConnection, peerDisconnect, peerError} = require('./servers/peerjs-server');
const express = require('express');
const {ExpressPeerServer} = require('peer');
const HOST = '0.0.0.0';
const PORT = 9000;
const app = express();
app.use(request_logger("[app]"));
app.use(`/${process.env.S3_KEY}/assist`, peerRouter);
app.use(`/${process.env.S3_KEY}/heapdump`, dumps.router);
const server = app.listen(PORT, HOST, () => {
console.log(`App listening on http://${HOST}:${PORT}`);
console.log('Press Ctrl+C to quit.');
});
const peerServer = ExpressPeerServer(server, {
debug: true,
path: '/',
proxied: true,
allow_discovery: false
});
peerServer.on('connection', peerConnection);
peerServer.on('disconnect', peerDisconnect);
peerServer.on('error', peerError);
app.use('/', peerServer);
app.enable('trust proxy');
module.exports = {server};

View file

@ -0,0 +1,65 @@
const express = require('express');
const peerRouter = express.Router();
const {extractPeerId} = require('../utils/helper');
let debug = process.env.debug === "1" || false;
const connectedPeers = {};
const peerConnection = (client) => {
debug && console.log(`initiating ${client.id}`);
const {projectKey, sessionId} = extractPeerId(client.id);
if (projectKey === undefined || sessionId === undefined) {
return;
}
connectedPeers[projectKey] = connectedPeers[projectKey] || [];
if (connectedPeers[projectKey].indexOf(sessionId) === -1) {
debug && console.log(`new connexion ${client.id}`);
connectedPeers[projectKey].push(sessionId);
} else {
debug && console.log(`reconnecting peer ${client.id}`);
}
};
const peerDisconnect = (client) => {
debug && console.log(`disconnect ${client.id}`);
const {projectKey, sessionId} = extractPeerId(client.id);
if (projectKey === undefined || sessionId === undefined) {
return;
}
const i = (connectedPeers[projectKey] || []).indexOf(sessionId);
if (i === -1) {
debug && console.log(`session not found ${client.id}`);
} else {
connectedPeers[projectKey].splice(i, 1);
}
}
const peerError = (error) => {
console.error('error fired');
console.error(error);
}
peerRouter.get(`/peers`, function (req, res) {
debug && console.log("looking for all available sessions");
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({"data": connectedPeers}));
});
peerRouter.get(`/peers/:projectKey`, function (req, res) {
debug && console.log(`looking for available sessions for ${req.params.projectKey}`);
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({"data": connectedPeers[req.params.projectKey] || []}));
});
module.exports = {
peerRouter,
peerConnection,
peerDisconnect,
peerError,
extractPeerId
};