diff --git a/package.json b/package.json index b5a34cc8..9a9c4cc1 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "prismarine-realms": "^1.1.0", "protodef": "^1.14.0", "raknet-native": "^1.0.3", + "snappyjs": "^0.7.0", "uuid-1345": "^1.0.2" }, "optionalDependencies": { diff --git a/src/transforms/framer.js b/src/transforms/framer.js index a2d9c4f3..9565a14f 100644 --- a/src/transforms/framer.js +++ b/src/transforms/framer.js @@ -1,5 +1,6 @@ const [readVarInt, writeVarInt, sizeOfVarInt] = require('protodef').types.varint const zlib = require('zlib') +const snappy = require('snappyjs') // Concatenates packets into one batch packet, and adds length prefixs. class Framer { @@ -18,7 +19,7 @@ class Framer { compress (buffer) { switch (this.compressor) { case 'deflate': return zlib.deflateRawSync(buffer, { level: this.compressionLevel }) - case 'snappy': throw Error('Snappy compression not implemented') + case 'snappy': return snappy.compress(buffer) case 'none': return buffer } } @@ -30,7 +31,7 @@ class Framer { return zlib.inflateRawSync(buffer, { chunkSize: 512000 }) case 1: case 'snappy': - throw Error('Snappy compression not implemented') + return snappy.uncompress(buffer) case 'none': case 255: return buffer diff --git a/test/snappy.js b/test/snappy.js new file mode 100644 index 00000000..f04ea82e --- /dev/null +++ b/test/snappy.js @@ -0,0 +1,11 @@ +const mockClient = { + batchHeader: 0xFE, + compressionAlgorithm: 'snappy', + compressionLevel: 6, + compressionThreshold: 10, + compressionHeader: 1, + features: { compressorInHeader: true }, + compressionReady: true +} + +module.exports = { mockClient } diff --git a/test/snappy.test.js b/test/snappy.test.js new file mode 100644 index 00000000..0362fabf --- /dev/null +++ b/test/snappy.test.js @@ -0,0 +1,16 @@ +/* eslint-env jest */ +const { Framer } = require('bedrock-protocol/src/transforms/framer') +const { mockClient } = require('./snappy') + +describe('Framer Snappy Compression', function () { + test('compress and decompress using Snappy via Framer', () => { + const framer = new Framer(mockClient) + const inputBuffer = Buffer.from('This is a test for Snappy compression') + + const compressed = framer.compress(inputBuffer) + expect(compressed).not.toEqual(inputBuffer) + + const decompressed = Framer.decompress(mockClient.compressionAlgorithm, compressed) + expect(decompressed.toString()).toEqual(inputBuffer.toString()) + }) +})