server for my chess game
| -rw-r--r-- | .gitignore | 10 | ||||
| -rw-r--r-- | .prettierrc | 4 | ||||
| -rw-r--r-- | package-lock.json | 21 | ||||
| -rw-r--r-- | package.json | 15 | ||||
| -rw-r--r-- | src/StreamTcp.js | 18 | ||||
| -rw-r--r-- | src/index.js | 33 |
6 files changed, 101 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1139b88 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# dependencies +/node_modules + +# misc +.idea +.DS_Store + +npm-debug.log* +yarn-debug.log* +yarn-error.log*
\ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..7a28161 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "tabWidth": 2, + "useTabs": false +}
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1fb35c1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,21 @@ +{ + "name": "gd-com-tcp-basic", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@gd-com/utils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@gd-com/utils/-/utils-4.1.0.tgz", + "integrity": "sha512-YYiMfg9x98KBnKqjLSyvVcvpBE2w64aJYS14CiOtWRQpvBzP30riVoe4CKAvII2WyuUoobS2P4hQ/eMS/kfzeg==", + "requires": { + "long": "^4.0.0" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..24f5391 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "gd-com-tcp-basic", + "version": "1.0.0", + "description": "", + "main": "src/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node src/index.js" + }, + "author": "", + "license": "MIT", + "dependencies": { + "@gd-com/utils": "^4.1.0" + } +} diff --git a/src/StreamTcp.js b/src/StreamTcp.js new file mode 100644 index 0000000..82306fe --- /dev/null +++ b/src/StreamTcp.js @@ -0,0 +1,18 @@ +const Transform = require('stream').Transform + +class StreamTcp extends Transform { + _transform (chunk, enc, done) { + let buffer = chunk + while (buffer.length > 0) { + const length = buffer.readUInt16LE(0) + + const bufferSplitted = buffer.slice(4, length + 4) // 4 cause the length bytes is in buffer + buffer = buffer.slice(length + 4, buffer.length) // 4 cause the length bytes is in buffer + + this.push(bufferSplitted) + } + done() + } +} + +module.exports = StreamTcp
\ No newline at end of file diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..5523449 --- /dev/null +++ b/src/index.js @@ -0,0 +1,33 @@ +const net = require('net') +const { putVar, getVar } = require('@gd-com/utils') +const StreamTcp = require('./StreamTcp') + +let server = net.createServer((socket) => { + const tcpSplit = new StreamTcp() + socket.pipe(tcpSplit).on('data', (data) => { + const packet = new Buffer.from(data) + + const decoded = getVar(packet) + console.log('receive :', decoded.value) + + const packetToSend = putVar(Math.random()) + + // we need to put the packet length on top cause it's tcp + const lengthBuffer = Buffer.alloc(4) + lengthBuffer.writeUInt32LE(packetToSend.length, 0) + const toSend = Buffer.concat([lengthBuffer, packetToSend]) + + console.log('send :', toSend) + socket.write(toSend) + }) + + socket.on('error', () => console.log('Bye :(')) +}) + +server.on('error', (err) => { + throw err +}) + +server.listen(9090, '127.0.0.1', () => { + console.log(`Server launched TCP 127.0.0.1:${9090}`) +}) |