DEV Community

Freecodez
Freecodez

Posted on

Socket.Io Code To Create A Realtime Chat Application In Express Js

Image description

require("dotenv").config();
const express = require("express");
process.env.TZ = "Asia/Kolkata";
const bodyparser = require("body-parser");
const cookieparser = require("cookie-parser");
const mongoose = require("mongoose");
const config = require("./src/Config/db").get(process.env.NODE_ENV);
let cors = require("cors");

const allowedOrigins = [
  "http://localhost:3000",
];
const corsOptions = {
  origin: allowedOrigins,
  credentials: true,
  optionSuccessStatus: 200,
};

const app = express();
PORT = 8000;
app.use(cors(corsOptions));
app.use(bodyparser.urlencoded({ extended: false }));
app.use(bodyparser.json());
app.use(bodyparser.text({ type: "text/html" }));
app.use(cookieparser());

app.use("/public", express.static(path.join(__dirname, "public")));

mongoose.set("strictQuery", true);
mongoose.Promise = global.Promise;
mongoose
  .connect(config.DATABASE, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  })
  .then(() => {
    console.log("Database connected!");
  })
  .catch((err) => {
    console.log("Database not connecting!");
  });

app.get("/", (req, res) => {
  return res.send("Welcome");
});

const server = app.listen(PORT, (error) => {
  if (!error) console.log("Server is Running at PORT: ", PORT);
  else console.log("Error occurred, server can't start", error?.message);
});

const io = require("socket.io")(server, {
  pingTimeout: 60000,
  cors: {
    origin: allowedOrigins,
    methods: ["GET", "POST", "PUT", "DELETE"],
    credentials: true,
  },
});
global.onlineUsers = new Map();
io.on("connection", (socket, req) => {
  global.chatSocket = socket;
  socket.on("join", (id) => {
    onlineUsers.set(id, socket.id);
    onlineUsers.set(socket.id, id);
    const newUsers = Array.from(onlineUsers.keys());
    setTimeout(() => {
      io.emit("online", newUsers);
    }, 1000);
  });

  socket.on("typing", (user) => {
    const receiver = onlineUsers.get(user.receiver);
    if (receiver) {
      socket.to(receiver).emit("typing", user);
    }
  });

  socket.on("stop-typing", (user) => {
    const receiver = onlineUsers.get(user.receiver);
    if (receiver) {
      socket.to(receiver).emit("stop-typing", user);
    }
  });

  socket.on("send", (message) => {
    const receiver = onlineUsers.get(message.receiver);
    if (receiver) {
      socket.to(receiver).emit("receive", message);
    }
  });

  socket.on("disconnect", () => {
    const key = onlineUsers.get(socket.id);
    if (key) {
      onlineUsers.delete(key);
      onlineUsers.delete(socket.id);
    }
    const remainingUsers = Array.from(onlineUsers.keys());
    setTimeout(() => {
      socket.broadcast.emit("online", remainingUsers);
    }, 1000);
  });
});
Enter fullscreen mode Exit fullscreen mode

For more : visit - https://freecodez.com/post/074niht

Thank You!

Top comments (0)