I’ve set up a websocket under src/socket-server/index.js
const { Server } = require('socket.io');
let io;
module.exports.emitSocketEvent = (event, data) => {
if (!io) {
console.log('Socket server not started');
return;
}
io.emit(event, data);
};
module.exports.startServer = () => {
if (io) {
return io;
}
console.log('Starting Socket server');
var server = http.createServer();
io = new Server(server, {
cors: {
origin: '*', // Allow all origins
methods: ['GET', 'POST'], // Allow GET and POST methods
allowedHeaders: ['my-custom-header'], // Allow specific custom headers
credentials: true, // Allow credentials
},
});
io.on('connection', function (socket) {
console.log('a user connected');
socket.on('disconnect', function () {
console.log('user disconnected');
});
});
server.listen(3333, function () {
console.log('listening on *:3333');
});
return io;
};
And I’m calling startSever in next.config.js like so
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: false,
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'wwgkpxkfgqjhcgrevcps.supabase.co',
},
],
},
webpack: (config, { isServer }) => {
if (isServer) {
const { startServer } = require('./src/socket-server/index.js');
startServer();
}
return config;
},
};
module.exports = nextConfig;
At this point client is successfully connecting to the websocket server.
However the io instance is still null
whenever I try to call emitSocketEvent
in src/actions/create-message.ts
. I assume this an issue with how importing the files
'use server';
import { createClient } from '@/src/utils/supabase/server';
import { generateResponse } from '@/src/doula';
import { createConversationSummary } from '@/src/actions';
import { emitSocketEvent } from '@/src/socket-server/index.js';
// const io = startServer();
export const createMessage = async ({
content,
conversationId,
}: {
content: string;
conversationId: string;
}) => {
const supabase = createClient();
const {
data: { user },
} = await supabase.auth.getUser();
if (!user) {
throw new Error('User not found');
}
const response = await generateResponse({
content,
userId: user.id,
conversationId,
});
// console.log('io ///////', io);
emitSocketEvent('message', response);
};