soroban-abacus-flashcards/apps/web/server.js

91 lines
2.9 KiB
JavaScript

const { createServer } = require('http')
const { parse } = require('url')
const next = require('next')
const dev = process.env.NODE_ENV !== 'production'
const hostname = 'localhost'
const port = parseInt(process.env.PORT || '3000', 10)
const app = next({ dev, hostname, port })
const handle = app.getRequestHandler()
// Run migrations before starting server (only on primary/candidate nodes)
// LiteFS replicas are read-only, so migrations must run on the primary
const isLiteFSReplica = process.env.LITEFS_CANDIDATE === 'false'
if (isLiteFSReplica) {
console.log('📖 Skipping migrations (LiteFS replica - read-only)')
} else {
console.log('🔄 Running database migrations...')
const { migrate } = require('drizzle-orm/better-sqlite3/migrator')
const { db } = require('./dist/db/index')
try {
migrate(db, { migrationsFolder: './drizzle' })
console.log('✅ Migrations complete')
} catch (error) {
console.error('❌ Migration failed:', error)
process.exit(1)
}
}
app.prepare().then(() => {
const server = createServer(async (req, res) => {
try {
const parsedUrl = parse(req.url, true)
await handle(req, res, parsedUrl)
} catch (err) {
console.error('Error occurred handling', req.url, err)
res.statusCode = 500
res.end('internal server error')
}
})
// Debug: Check upgrade handlers at each stage
console.log('📊 Stage 1 - After server creation:')
console.log(` Upgrade handlers: ${server.listeners('upgrade').length}`)
// Initialize Socket.IO
let initializeSocketServer
try {
const socketServer = require('./dist/socket-server')
initializeSocketServer = socketServer.initializeSocketServer
console.log('✅ Socket server module loaded successfully')
} catch (error) {
console.error('❌ Failed to load socket-server module:', error)
process.exit(1)
}
console.log('📊 Stage 2 - Before initializeSocketServer:')
console.log(` Upgrade handlers: ${server.listeners('upgrade').length}`)
initializeSocketServer(server)
console.log('📊 Stage 3 - After initializeSocketServer:')
const allHandlers = server.listeners('upgrade')
console.log(` Upgrade handlers: ${allHandlers.length}`)
allHandlers.forEach((handler, i) => {
console.log(` [${i}] ${handler.name || 'anonymous'} (length: ${handler.length} params)`)
})
// Log all upgrade requests to see handler execution order
const originalEmit = server.emit.bind(server)
server.emit = (event, ...args) => {
if (event === 'upgrade') {
const req = args[0]
console.log(`\n🔄 UPGRADE REQUEST: ${req.url}`)
console.log(` ${allHandlers.length} handlers will be called`)
}
return originalEmit(event, ...args)
}
server
.once('error', (err) => {
console.error(err)
process.exit(1)
})
.listen(port, () => {
console.log(`> Ready on http://${hostname}:${port}`)
})
})