ChatApp / server /src /index.ts
Anuj-Panthri's picture
umm
c13f601
import express from "express";
import bodyParser from "body-parser";
import { getDB } from "./db.js";
import { lucia } from "./auth.js";
import { generateId, verifyRequestOrigin } from "lucia";
import { loginSchema, signUpSchema } from "./schemas.js";
import bcrypt from "bcrypt";
import dotenv from "dotenv";
import cors from "cors";
import mutler from "multer";
import { Server, Socket } from "socket.io";
import http from "http";
import path from "path";
import { authCookieMiddleware, isAuthAPIMiddleware, isAuthSocketMiddleware, login_handler, signup_handler } from "./authHandler.js";
import {
getMyChats,
getLastMessage,
getUnseenCount,
searchContacts,
addMessage,
markMessageSeen,
getAllMessages,
getContact,
} from "./chatHandler.js";
dotenv.config();
const __dirname = path.resolve();
var db = getDB();
var app = express();
const server = http.createServer(app);
const allowedOrigins = process.env.ALLOWED_ORIGINS || 'http://localhost:3001'
const allowed_origins = allowedOrigins.split(",").map(item => item.trim());
app.use(cors({
credentials: true,
// origin: true,
origin: allowed_origins,
}));
// parse application/json
app.use(bodyParser.json());
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));
// app.use(express.urlencoded());
app.use(mutler().array(""));
// The entire build/web directory is statically served.
app.use(express.static(path.join(__dirname, "../client/build")));
app.use(authCookieMiddleware);
// http://localhost:3000/session
app.get("/session", (req, res) => {
if (!res.locals.user) {
return res.status(403).send();
}
return res.status(200).send(res.locals.user);
})
app.post("/signup", signup_handler);
app.post("/login", login_handler);
app.get("/test", (req,res)=>{
console.log(req);
// console.log(res);
res.send("ok");
});
// Catch all. If we want to add pages later, then we should probably change this.
app.get("*", (_req, res) => {
res.sendFile(path.join(__dirname + "/../client/build/index.html"));
});
// socket.io server
const io = new Server(server, {
cors: {
origin: allowed_origins,
methods: ["GET", "POST"],
credentials: true,
}
});
io.use(isAuthSocketMiddleware);
io.on("connection", async (socket) => {
console.log(`socket ${socket.id} connected`);
// client.emit("search_contacts","ankit")
socket.on("search_contacts",(search_string:string)=>{
const contacts = searchContacts(socket.data.user.id,search_string);
socket.emit("search_results",contacts);
})
//Old chats
socket.on("get_chats", async () => {
// get all chats of client
const chats = getMyChats(socket.data.user.id);
socket.emit("chats", chats);
})
socket.on("get_messages", async (chat_id) => {
var messages = getAllMessages(socket.data.user.id, chat_id);
// console.log(socket.data.user.id, chat_id);
// console.log(messages);
socket.emit("messages", messages);
});
socket.on("send_message", async (data) => {
// an event was received from the client
console.log(data);
const message = addMessage({
content: data.content,
type: data.type,
sender_id: socket.data.user.id,
receiver_id: data.receiver_id,
})
console.log("saved message:", message.content , "from:",message.sender_id);
const sockets = await io.fetchSockets();
const receivers = sockets.filter((client)=>client.data.user.id==data.receiver_id);
receivers.forEach((client)=>{
client.emit("receive_message",message);
})
socket.emit("receive_message",message);
});
socket.on("mark_messages_seen", async (msg_ids: any) => {
// console.log(messages.length)
msg_ids.forEach((msg_id:any)=>{
markMessageSeen(socket.data.user.id,msg_id);
})
})
socket.on("get_contact", async contact_id => {
const contact: any = getContact(socket.data.user.id,contact_id);
socket.emit("contact", contact);
})
// upon disconnection
socket.on("disconnect", (reason) => {
console.log(`socket ${socket.id} disconnected due to ${reason}`);
});
});
const port = 3000;
server.listen(port, () => {
console.log(`Running at port ${port}`);
});