fix: resolve socket-server import path for Next.js build

Create a wrapper module in src/lib/socket-io.ts that provides access
to the socket.io server instance for API routes, avoiding the build
error caused by importing from outside the src directory.

The wrapper uses dynamic imports to lazy-load the socket server module
only on the server-side, making it safe for Next.js to bundle.

Changes:
- Add src/lib/socket-io.ts with async getSocketIO() function
- Update join route to use @/lib/socket-io import
- Update leave route to use @/lib/socket-io import
- Both routes now await getSocketIO() since it's async

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Thomas Hallock
2025-10-08 08:55:21 -05:00
parent 5c32209a2c
commit 12c3c37ff8
3 changed files with 43 additions and 4 deletions

View File

@@ -3,7 +3,7 @@ import { getRoomById, touchRoom } from '@/lib/arcade/room-manager'
import { addRoomMember, getOnlineRoomMembers } from '@/lib/arcade/room-membership'
import { getActivePlayers, getRoomActivePlayers } from '@/lib/arcade/player-manager'
import { getViewerId } from '@/lib/viewer'
import { getSocketIO } from '../../../../../../socket-server'
import { getSocketIO } from '@/lib/socket-io'
type RouteContext = {
params: Promise<{ roomId: string }>
@@ -58,7 +58,7 @@ export async function POST(req: NextRequest, context: RouteContext) {
await touchRoom(roomId)
// Broadcast to all users in the room via socket
const io = getSocketIO()
const io = await getSocketIO()
if (io) {
try {
const onlineMembers = await getOnlineRoomMembers(roomId)

View File

@@ -3,7 +3,7 @@ import { getRoomById } from '@/lib/arcade/room-manager'
import { getOnlineRoomMembers, isMember, removeMember } from '@/lib/arcade/room-membership'
import { getRoomActivePlayers } from '@/lib/arcade/player-manager'
import { getViewerId } from '@/lib/viewer'
import { getSocketIO } from '../../../../../../socket-server'
import { getSocketIO } from '@/lib/socket-io'
type RouteContext = {
params: Promise<{ roomId: string }>
@@ -34,7 +34,7 @@ export async function POST(_req: NextRequest, context: RouteContext) {
await removeMember(roomId, viewerId)
// Broadcast to all remaining users in the room via socket
const io = getSocketIO()
const io = await getSocketIO()
if (io) {
try {
const onlineMembers = await getOnlineRoomMembers(roomId)

View File

@@ -0,0 +1,39 @@
/**
* Socket.IO server instance accessor for API routes
* This module provides a way for API routes to access the socket.io server
* to broadcast real-time updates.
*/
import type { Server as SocketIOServerType } from 'socket.io'
// Import the socket server module (this is safe because it's only used in Node.js context)
let socketServer: { getSocketIO: () => SocketIOServerType | null } | null = null
// Lazy-load the socket server module (only works on server-side)
async function loadSocketServer() {
if (typeof window !== 'undefined') {
// Client-side: return null
return null
}
if (!socketServer) {
try {
// Dynamic import to avoid bundling issues
socketServer = await import('../../socket-server')
} catch (error) {
console.error('[Socket IO] Failed to load socket server:', error)
return null
}
}
return socketServer
}
/**
* Get the socket.io server instance
* Returns null if not initialized or if called on client-side
*/
export async function getSocketIO(): Promise<SocketIOServerType | null> {
const server = await loadSocketServer()
return server ? server.getSocketIO() : null
}