Add base code

This commit is contained in:
Mihaela Dumitru 2022-09-13 12:01:11 +03:00
commit b46bf94c21
9 changed files with 12059 additions and 0 deletions

1
.env.development Normal file
View file

@ -0,0 +1 @@
PORT=3002

2
.eslintignore Normal file
View file

@ -0,0 +1,2 @@
dist
node_modules

3
.eslintrc.json Normal file
View file

@ -0,0 +1,3 @@
{
"extends": "@jitsi/eslint-config"
}

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
.DS_Store
dist
node_modules

1
babel.config.json Normal file
View file

@ -0,0 +1 @@
{}

11885
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

53
package.json Normal file
View file

@ -0,0 +1,53 @@
{
"name": "excalidraw-backend",
"version": "1.0.0",
"main": "src/index.js",
"description": "Excalidraw backend",
"repository": {
"type": "git",
"url": "https://github.com/jitsi/excalidraw-backend"
},
"private": true,
"engines": {
"node": ">=14.0.0",
"npm": ">=7.0.0"
},
"dependencies": {
"@babel/core": "7.16.0",
"@babel/eslint-parser": "7.16.0",
"@babel/plugin-proposal-export-default-from": "7.16.0",
"@babel/preset-env": "7.16.0",
"@babel/runtime": "7.16.0",
"@excalidraw/eslint-config": "1.0.1",
"@excalidraw/prettier-config": "1.0.2",
"@jitsi/eslint-config": "^4.1.0",
"@types/debug": "4.1.5",
"@types/express": "4.17.11",
"@types/node": "14.14.31",
"@types/socket.io": "2.1.4",
"@typescript-eslint/eslint-plugin": "5.30.5",
"@typescript-eslint/parser": "5.30.4",
"babel-loader": "8.2.3",
"babel-plugin-optional-require": "0.3.1",
"circular-dependency-plugin": "5.2.0",
"clean-css-cli": "4.3.0",
"copy-webpack-plugin": "^9.0.0",
"cross-env": "^7.0.3",
"css-loader": "3.6.0",
"debug": "4.3.1",
"dotenv": "^10.0.0",
"eslint": "8.1.0",
"eslint-plugin-import": "2.25.2",
"eslint-plugin-jsdoc": "37.0.3",
"express": "4.17.1",
"socket.io": "^2.5.0",
"ts-node-dev": "^1.1.8",
"typescript": "4.2.3"
},
"license": "MIT",
"scripts": {
"build": "tsc",
"start": "tsc && node dist/index.js",
"start:dev": "cross-env NODE_ENV=development ts-node-dev --respawn --transpile-only src/index.ts"
}
}

94
src/index.ts Normal file
View file

@ -0,0 +1,94 @@
import debug from "debug";
import express from "express";
import http from "http";
import socketIO from "socket.io";
const serverDebug = debug("server");
const ioDebug = debug("io");
const socketDebug = debug("socket");
require("dotenv").config(
process.env.NODE_ENV !== "development"
? { path: ".env.production" }
: { path: ".env.development" },
);
const app = express();
const port = process.env.PORT || 80; // default port to listen
app.use(express.static("public"));
app.get("/", (req, res) => {
res.send("Excalidraw backend is up :)");
});
const server = http.createServer(app);
server.listen(port, () => {
serverDebug(`listening on port: ${port}`);
});
const io = socketIO(server, {
handlePreflightRequest: (req, res) => {
const headers = {
"Access-Control-Allow-Headers": "Content-Type, Authorization",
"Access-Control-Allow-Origin":
(req.header && req.header.origin) || "https://meet.jit.si",
"Access-Control-Allow-Credentials": true,
};
res.writeHead(200, headers);
res.end();
},
});
io.on("connection", (socket) => {
ioDebug("connection established!");
io.to(`${socket.id}`).emit("init-room");
socket.on("join-room", (roomID) => {
socketDebug(`${socket.id} has joined ${roomID}`);
socket.join(roomID);
if (io.sockets.adapter.rooms[roomID].length <= 1) {
io.to(`${socket.id}`).emit("first-in-room");
} else {
socket.broadcast.to(roomID).emit("new-user", socket.id);
}
io.in(roomID).emit(
"room-user-change",
Object.keys(io.sockets.adapter.rooms[roomID].sockets),
);
});
socket.on(
"server-broadcast",
(roomID: string, encryptedData: ArrayBuffer, iv: Uint8Array) => {
socketDebug(`${socket.id} sends update to ${roomID}`);
socket.broadcast.to(roomID).emit("client-broadcast", encryptedData, iv);
},
);
socket.on(
"server-volatile-broadcast",
(roomID: string, encryptedData: ArrayBuffer, iv: Uint8Array) => {
socketDebug(`${socket.id} sends volatile update to ${roomID}`);
socket.volatile.broadcast
.to(roomID)
.emit("client-broadcast", encryptedData, iv);
},
);
socket.on("disconnecting", () => {
const rooms = io.sockets.adapter.rooms;
for (const roomID in socket.rooms) {
const clients = Object.keys(rooms[roomID].sockets).filter(
(id) => id !== socket.id,
);
if (clients.length > 0) {
socket.broadcast.to(roomID).emit("room-user-change", clients);
}
}
});
socket.on("disconnect", () => {
socket.removeAllListeners();
});
});

17
tsconfig.json Normal file
View file

@ -0,0 +1,17 @@
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"strict": true,
"moduleResolution": "Node",
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"isolatedModules": true,
"outDir": "dist"
}
}