{ "version": 3, "sources": ["../../../../sim/cobblemon/cobbled-debug-server.ts"], "sourcesContent": ["import {BattleStream} from \"../battle-stream\";\nimport {Dex, toID} from \"../dex\";\nimport * as Net from \"net\";\nimport {Cobblemon} from \"./cobblemon\";\n\n/*-----------------------------------------------------------------------------------------------------------------\nNOTE: The functions in this file are used by SocketShowdownService, the debug/remote Showdown environment. For the\ncorresponding GraalShowdownService methods, see cobbled-index.js in this repo.\nSee ShowdownService.kt for where the interface is defined and configured on the main Cobblemon repo.\n-----------------------------------------------------------------------------------------------------------------*/\n\nexport function startServer(port: number): void {\n\tconst server = Net.createServer();\n\tconst battleMap = new Map();\n\n\tserver.listen(port, () => {\n\t\tconsole.log('Server listening for connection requests on socket localhost: ' + port);\n\t});\n\n\tserver.on('connection', socket => onConnection(socket, battleMap));\n}\n\nfunction onData(socket: Net.Socket, chunk: Buffer, battleMap: Map) {\n\tconst data = chunk.toString();\n\tconst lines = data.split('\\n');\n\n\tlines.forEach(line => {\n\t\tconsole.log('Data received from client: ' + line);\n\t\tconst parts = line.split(' ');\n\t\tconst command = parts[0];\n\n\t\tswitch (command) {\n\t\t\tcase '>startbattle': {\n\t\t\t\tconst battleId = parts[1];\n\t\t\t\tif (battleId) {\n\t\t\t\t\tbattleMap.set(battleId, new BattleStream());\n\t\t\t\t\tsocket.write('ACK');\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(\"Command '>startbattle' requires a battleId.\");\n\t\t\t\t\tsocket.write('ERR');\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase '>receiveData': {\n\t\t\t\tconst type = parts[1];\n\t\t\t\tconst registry = Cobblemon.getRegistry(type);\n\t\t\t\ttry {\n\t\t\t\t\tif (!registry) throw new Error();\n\n\t\t\t\t\tconst data = line.substring(command.length + type.length + 2);\n\t\t\t\t\tconst obj = () => {\n\t\t\t\t\t\ttry { return JSON.parse(data); }\n\t\t\t\t\t\tcatch { return eval(`(${data})`); }\n\t\t\t\t\t};\n\t\t\t\t\tfor (const [key, value] of Object.entries(obj())) {\n\t\t\t\t\t\tregistry.register(value as any, toID(key));\n\t\t\t\t\t};\n\t\t\t\t\tregistry.invalidate();\n\n\t\t\t\t\tsocket.write('ACK');\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(`Error processing >receiveData for type ${type}:`, e);\n\t\t\t\t\tsocket.write('ERR');\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase '>receiveEntry': {\n\t\t\t\tconst type = parts[1];\n\t\t\t\tconst registry = Cobblemon.getRegistry(type);\n\t\t\t\ttry {\n\t\t\t\t\tif (!registry) throw new Error();\n\n\t\t\t\t\tconst id = parts[2];\n\t\t\t\t\tconst data = line.substring(command.length + type.length + id.length + 2);\n\t\t\t\t\tconst obj = () => {\n\t\t\t\t\t\ttry { return JSON.parse(data); }\n\t\t\t\t\t\tcatch { return eval(`(${data})`); }\n\t\t\t\t\t};\n\t\t\t\t\tregistry.register(obj(), toID(id));\n\t\t\t\t\tregistry.invalidate();\n\n\t\t\t\t\tsocket.write('ACK');\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(`Error processing >receiveData for type ${type}:`, e);\n\t\t\t\t\tsocket.write('ERR');\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase '>getData': {\n\t\t\t\tconst type = parts[1];\n\t\t\t\tvar registry = Cobblemon.getRegistry(type);\n\t\t\t\ttry {\n\t\t\t\t\tif (!registry) throw new Error();\n\n\t\t\t\t\tconst payload = JSON.stringify(registry.all());\n\t\t\t\t\tsocket.write(padNumber(payload.length, 8) + payload);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(`Error processing >receiveData for type ${type}:`, e);\n\t\t\t\t\tsocket.write('ERR');\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase '>resetAll': {\n\t\t\t\tfor (const key of Cobblemon.registryKeys) {\n\t\t\t\t\tCobblemon.registries[key].reset();\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase '>resetData': {\n\t\t\t\tconst type = parts[1];\n\t\t\t\tvar registry = Cobblemon.getRegistry(type);\n\n\t\t\t\ttry {\n\t\t\t\t\tif (!registry) throw new Error();\n\n\t\t\t\t\tregistry.reset();\n\t\t\t\t\tsocket.write('ACK');\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(`Invalid registry type for >getData: ${type}`);\n\t\t\t\t\tsocket.write('ERR');\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase '>getTypeChart': {\n\t\t\t\tconst payload = JSON.stringify(Dex.data.TypeChart);\n\t\t\t\tsocket.write(padNumber(payload.length, 8) + payload);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase '>afterSpeciesInit': {\n\t\t\t\tDex.modsLoaded = false;\n\t\t\t\tDex.includeMods();\n\t\t\t\tsocket.write('ACK');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst [battleId, showdownMsg] = line.split('~');\n\t\t\t\tconst battleStream = battleMap.get(battleId);\n\n\t\t\t\tif (battleStream) {\n\t\t\t\t\ttry {\n\t\t\t\t\tvoid battleStream.write(showdownMsg);\n\t\t\t\t\t} catch (err: any) {\n\t\t\t\t\t\tconsole.error(err.stack);\n\t\t\t\t\t}\n\t\t\t\t\twriteBattleOutput(socket, battleStream);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction writeBattleOutput(socket: Net.Socket, battleStream: BattleStream) {\n\tconst messages = battleStream.buf;\n\tif (messages.length !== 0) {\n\t\tsocket.write(padNumber(messages.length, 8));\n\t\tfor (const message of messages) {\n\t\t\tsocket.write(padNumber(message.length, 8) + message);\n\t\t}\n\t} else {\n\t\twriteVoid(socket);\n\t}\n\tbattleStream.buf = [];\n}\n\nfunction writeVoid(socket: Net.Socket) {\n\tsocket.write('00000000');\n}\n\nfunction onConnection(socket: Net.Socket, battleMap: Map) {\n\tsocket.on('data', (chunk) => {\n\t\ttry {\n\t\t\tonData(socket, chunk, battleMap);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t}\n\t});\n\tsocket.on('end', () => console.log('Closing connection with the client'));\n\tsocket.on('error', (err) => console.error(err.stack));\n}\n\nfunction padNumber(num: number, size: number): string {\n\tlet numStr = num.toString();\n\twhile (numStr.length < size) numStr = \"0\" + numStr;\n\treturn numStr;\n}\n\n"], "mappings": "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", "names": ["battleMap", "socket", "type", "chunk"] }