- Restored original root-level src/, package.json, etc. - Added skills/ directory with Claude Code skills - Added original-docs/ with source documentation - Added codebases/z-ai-tooling/ as reference codebase - Updated README.md with complete documentation Total: Combined 82 original files + new skills structure
138 lines
3.5 KiB
TypeScript
Executable File
138 lines
3.5 KiB
TypeScript
Executable File
import { createServer } from 'http'
|
|
import { Server } from 'socket.io'
|
|
|
|
const httpServer = createServer()
|
|
const io = new Server(httpServer, {
|
|
// DO NOT change the path, it is used by Caddy to forward the request to the correct port
|
|
path: '/',
|
|
cors: {
|
|
origin: "*",
|
|
methods: ["GET", "POST"]
|
|
},
|
|
pingTimeout: 60000,
|
|
pingInterval: 25000,
|
|
})
|
|
|
|
interface User {
|
|
id: string
|
|
username: string
|
|
}
|
|
|
|
interface Message {
|
|
id: string
|
|
username: string
|
|
content: string
|
|
timestamp: Date
|
|
type: 'user' | 'system'
|
|
}
|
|
|
|
const users = new Map<string, User>()
|
|
|
|
const generateMessageId = () => Math.random().toString(36).substr(2, 9)
|
|
|
|
const createSystemMessage = (content: string): Message => ({
|
|
id: generateMessageId(),
|
|
username: 'System',
|
|
content,
|
|
timestamp: new Date(),
|
|
type: 'system'
|
|
})
|
|
|
|
const createUserMessage = (username: string, content: string): Message => ({
|
|
id: generateMessageId(),
|
|
username,
|
|
content,
|
|
timestamp: new Date(),
|
|
type: 'user'
|
|
})
|
|
|
|
io.on('connection', (socket) => {
|
|
console.log(`User connected: ${socket.id}`)
|
|
|
|
// Add test event handler
|
|
socket.on('test', (data) => {
|
|
console.log('Received test message:', data)
|
|
socket.emit('test-response', {
|
|
message: 'Server received test message',
|
|
data: data,
|
|
timestamp: new Date().toISOString()
|
|
})
|
|
})
|
|
|
|
socket.on('join', (data: { username: string }) => {
|
|
const { username } = data
|
|
|
|
// Create user object
|
|
const user: User = {
|
|
id: socket.id,
|
|
username
|
|
}
|
|
|
|
// Add to user list
|
|
users.set(socket.id, user)
|
|
|
|
// Send join message to all users
|
|
const joinMessage = createSystemMessage(`${username} joined the chat room`)
|
|
io.emit('user-joined', { user, message: joinMessage })
|
|
|
|
// Send current user list to new user
|
|
const usersList = Array.from(users.values())
|
|
socket.emit('users-list', { users: usersList })
|
|
|
|
console.log(`${username} joined the chat room, current online users: ${users.size}`)
|
|
})
|
|
|
|
socket.on('message', (data: { content: string; username: string }) => {
|
|
const { content, username } = data
|
|
const user = users.get(socket.id)
|
|
|
|
if (user && user.username === username) {
|
|
const message = createUserMessage(username, content)
|
|
io.emit('message', message)
|
|
console.log(`${username}: ${content}`)
|
|
}
|
|
})
|
|
|
|
socket.on('disconnect', () => {
|
|
const user = users.get(socket.id)
|
|
|
|
if (user) {
|
|
// Remove from user list
|
|
users.delete(socket.id)
|
|
|
|
// Send leave message to all users
|
|
const leaveMessage = createSystemMessage(`${user.username} left the chat room`)
|
|
io.emit('user-left', { user: { id: socket.id, username: user.username }, message: leaveMessage })
|
|
|
|
console.log(`${user.username} left the chat room, current online users: ${users.size}`)
|
|
} else {
|
|
console.log(`User disconnected: ${socket.id}`)
|
|
}
|
|
})
|
|
|
|
socket.on('error', (error) => {
|
|
console.error(`Socket error (${socket.id}):`, error)
|
|
})
|
|
})
|
|
|
|
const PORT = 3003
|
|
httpServer.listen(PORT, () => {
|
|
console.log(`WebSocket server running on port ${PORT}`)
|
|
})
|
|
|
|
// Graceful shutdown
|
|
process.on('SIGTERM', () => {
|
|
console.log('Received SIGTERM signal, shutting down server...')
|
|
httpServer.close(() => {
|
|
console.log('WebSocket server closed')
|
|
process.exit(0)
|
|
})
|
|
})
|
|
|
|
process.on('SIGINT', () => {
|
|
console.log('Received SIGINT signal, shutting down server...')
|
|
httpServer.close(() => {
|
|
console.log('WebSocket server closed')
|
|
process.exit(0)
|
|
})
|
|
}) |