Repository navigation
Expand file tree
/
Copy pathapp.ts
More file actions
75 lines (57 loc) · 1.74 KB
/
Copy pathapp.ts
File metadata and controls
75 lines (57 loc) · 1.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import { Server } from 'socket.io'
import { createServer } from "http"
import { GStatus } from './lib/types'
const port = parseInt(process.env.PORT || '3001')
const httpServer = createServer()
const io = new Server(httpServer, {
cors: {
origin: process.env.CLIENT_URL || '*',
}
});
httpServer.listen(port)
console.log("Server established at port", port)
interface Bot {
serverUrl: string;
username: string;
roomId: string;
status: GStatus;
}
const maxWorkerNum = parseInt(process.env.MAX_WORKER_NUM || '0');
var workers = new Array<Worker>()
var bots = new Array<Bot>()
io.on('connection', (socket) => {
socket.on('query', () => {
socket.emit('botlist', workers)
})
socket.on('add_bot', (arg) => {
if (maxWorkerNum && workers.length >= maxWorkerNum) {
socket.emit('error', 'Number of players exceeded.')
return
}
bots.push({...arg, status: 0})
const worker = new Worker("./worker.ts")
worker.onmessage = (ev) => {
console.log("Received from bot", ev.data.id, "STATUS:", ev.data.status)
let id = parseInt(ev.data.id)
bots[id].status = ev.data.status
socket.emit('botlist', bots)
}
worker.postMessage({ id: workers.length, ...arg })
workers.push(worker)
console.log("Added bot")
socket.emit('add_success')
socket.emit('botlist', bots)
})
socket.on('remove_bot', (arg) => {
let id = parseInt(arg)
console.log("Removing bot", id)
if (Number.isNaN(id) || id < 0 || id >= workers.length) {
socket.emit('error', 'Bot ID is invalid.')
return
}
workers[id].terminate()
workers = [...workers.filter((_, index) => index !== id)]
bots = [...bots.filter((_, index) => index !== id)]
socket.emit('botlist', bots)
})
})