require('dotenv').config();
const Agent = require(`./Models/agentModel`);
const logger = require(`./logger`);
const adminRoom = 'admin-room';
const socketapi = {
io: null
};
function setupSocket(io) {
io.on('connection', (socket) => {
console.log('Client connected:', socket.id);
socket.on('authenticate', async (agentId) => {
console.log('Authenticate event:', agentId);
console.log(agentId.agentId);
socket.agentId = agentId.agentId;
const agent = await Agent.findOne({ agentId: agentId.agentId }, { user_role: 1, agentId: 1 }).lean();
if (!agent) {
logger.warn(`No Agent found in the DB, so can't join it in any room`);
return;
}
if (agent && (agent.user_role === 'USR-1000' || agent.user_role === 'USR-1001')) {
socket.join(adminRoom);
}
const agentRoom = `crm:${agent.agentId}`;
socket.join(agentRoom);
io.to(agentRoom).emit('hello', "hello");
console.log(`Agent has successfully joined the socket room with room name as`, agentRoom);
});
socket.on('disconnect', () => {
logger.info(`Client disconnected from the server: ${socket.agentId}`);
});
socket.on('error', (error) => {
logger.error(`Socket error: ${error.message}`);
});
socket.on('message', (msg) => {
console.log('Received message:', msg);
});
});
}
module.exports = { socketapi, adminRoom, setupSocket };
here is my socketApi.js file
require('dotenv').config();
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const createError = require('http-errors');
const cors = require('cors');
const http = require('http');
const debug = require('debug')('login:server');
const { socketapi, setupSocket } = require('./socketApi');
const app = express();
const port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
// Create HTTP server and attach Socket.IO
const server = http.createServer(app);
const io = require('socket.io')(server, {
cors: {
origin: "*",
methods: ["GET", "POST", "PUT", "DELETE", "PATCH"],
perMessageDeflate: false,
},
transports: ['websocket'],
});
socketapi.io = io;
setupSocket(io);
io.engine.on('initial_headers', (headers, req) => {
console.log('WebSocket initial headers:', headers);
});
io.engine.on('headers', (headers, req) => {
console.log('WebSocket response headers:', headers);
});
// Swagger documentation route
app.use('/doc', swaggerUi.serve, swaggerUi.setup(swaggerFile));
app.use(status());
// Connect to the database
require("./Models/Database.js").connectDatabase();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.set('trust proxy', true);
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(cors());
app.use(function (req, res, next) {
next(createError(404));
});
// Error handling
const ErrorHandler = require("./utils/errorHandler.js");
const { generatedErrors } = require("./middlewares/errors.js");
app.all("*", (req, res, next) => {
next(new ErrorHandler(`Requested URL Not Found: ${req.url}`, 404));
});
app.use(generatedErrors);
if (process.env.Run_Cron) {
logger.info(`Cron jobs starting`);
leadPriorityCronJob.start();
oneHourCron.stop();
} else {
logger.info(`Cron jobs stopped`);
leadPriorityCronJob.stop();
oneHourCron.stop();
}
server.listen(port, '0.0.0.0', () => {
logger.info(`Server is running on PORT: ${port}`);
});
server.on('error', onError);
server.on('listening', onListening);
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) return val;
if (port >= 0) return port;
return false;
}
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port;
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port;
debug('Listening on ' + bind);
}
module.exports = { app, server };
here is my app.js file
whenever i test the following code in localhost via postman everything works fine but when i deploy the server on render it always gives the error message that "Error: Invalid WebSocket frame: RSV1 must be clear" , "sec-websocket-extensions: permessage-deflate; client_max_window_bits"
here are the logs from the server : WebSocket initial headers: { 'Access-Control-Allow-Origin': '' } WebSocket response headers: { 'Access-Control-Allow-Origin': '' }
can anyone please tell me why this issue is arising when i deploy the server what could be the reason, i already tried permessage: flase / true both but it ain't working.
can anyone please tell me why this issue is arising when i deploy the server what could be the reason, i already tried permessage: flase / true both but it ain't working.