You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.ts 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import express from "express";
  2. import http, { ServerResponse } from "http";
  3. import socketIO from "socket.io";
  4. const app = express();
  5. const port = process.env.PORT || 80; // default port to listen
  6. const server = http.createServer(app);
  7. server.listen(port, () => {
  8. console.log(`listening on port: ${port}`);
  9. });
  10. const io = socketIO(server, {
  11. handlePreflightRequest: function(req, res) {
  12. var headers = {
  13. "Access-Control-Allow-Headers": "Content-Type, Authorization",
  14. "Access-Control-Allow-Origin": req.header ? req.header.origin : "*",
  15. "Access-Control-Allow-Credentials": true
  16. };
  17. res.writeHead(200, headers);
  18. res.end();
  19. }
  20. });
  21. io.on("connection", socket => {
  22. console.log("connection established!");
  23. io.to(`${socket.id}`).emit("init-room");
  24. socket.on("join-room", roomID => {
  25. console.log(`${socket.id} has joined ${roomID}`);
  26. socket.join(roomID);
  27. if (io.sockets.adapter.rooms[roomID].length <= 1) {
  28. io.to(`${socket.id}`).emit("first-in-room");
  29. } else {
  30. socket.broadcast.to(roomID).emit("new-user", socket.id);
  31. }
  32. io.in(roomID).emit(
  33. "room-user-count",
  34. io.sockets.adapter.rooms[roomID].length
  35. );
  36. });
  37. socket.on("server-broadcast", (roomID: string, encryptedData: ArrayBuffer, iv: Uint8Array) => {
  38. console.log(`${socket.id} sends update to ${roomID}`);
  39. socket.broadcast.to(roomID).emit("client-broadcast", encryptedData, iv);
  40. });
  41. socket.on("disconnecting", () => {
  42. const rooms = io.sockets.adapter.rooms;
  43. for (const roomID in socket.rooms) {
  44. const remaining = rooms[roomID].length - 1;
  45. if (remaining > 0) {
  46. socket.broadcast.to(roomID).emit("room-user-count", remaining);
  47. }
  48. }
  49. });
  50. socket.on("disconnect", () => {
  51. socket.removeAllListeners();
  52. });
  53. });