feat(peers): peerjs server as a standalone service
This commit is contained in:
parent
032f58738b
commit
d4dbb7c8bc
7 changed files with 1759 additions and 0 deletions
6
peers/.gitignore
vendored
Normal file
6
peers/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
.idea
|
||||
node_modules
|
||||
npm-debug.log
|
||||
.cache
|
||||
test.html
|
||||
/utils/
|
||||
14
peers/Dockerfile
Normal file
14
peers/Dockerfile
Normal 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
33
peers/build.sh
Normal 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
1584
peers/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
24
peers/package.json
Normal file
24
peers/package.json
Normal 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
33
peers/server.js
Normal 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};
|
||||
65
peers/servers/peerjs-server.js
Normal file
65
peers/servers/peerjs-server.js
Normal 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
|
||||
};
|
||||
Loading…
Add table
Reference in a new issue