From 42c317235755c8aae6337571cd7b2ccb03405517 Mon Sep 17 00:00:00 2001 From: Thomas Jarrand Date: Thu, 19 Oct 2023 15:35:23 +0200 Subject: [PATCH] Better text encoding --- package-lock.json | 5 ++--- src/encoder/codec/StringCodec.js | 24 ++++++++++++++---------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 01448c8..4cca806 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,15 @@ { "name": "netcode", - "version": "2.1.0", + "version": "2.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "netcode", - "version": "2.1.0", + "version": "2.1.1", "license": "MIT", "dependencies": { "tom32i-event-emitter.js": "^2.0.5", - "utf-8-validate": "^5.0.2", "ws": "^8.2.0" }, "devDependencies": { diff --git a/src/encoder/codec/StringCodec.js b/src/encoder/codec/StringCodec.js index b757bae..3dbfd47 100644 --- a/src/encoder/codec/StringCodec.js +++ b/src/encoder/codec/StringCodec.js @@ -4,24 +4,32 @@ import Codec from './Codec'; * String codec (limited to 255 chars) */ export default class StringCodec extends Codec { + constructor() { + super(); + + this.encoder = new TextEncoder(); + this.decoder = new TextDecoder(TextEncoder.encoding); + } + /** * @type {Number} */ getByteLength(data) { - return 1 + (data || '').length * 2; + return 1 + this.encoder.encode(data || '').length; } /** * {@inheritdoc} */ encode(buffer, offset, data) { - const view = new DataView(buffer, offset, this.getByteLength(data)); - const { length } = (data || ''); + const bytes = this.encoder.encode(data || ''); + const { length } = bytes; + const view = new DataView(buffer, offset, length + 1); view.setUint8(0, length); for (var index = 0; index < length; index++) { - view.setUint16(1 + (index * 2), data[index].charCodeAt(0)); + view.setUint8(index + 1, bytes[index]); } } @@ -31,12 +39,8 @@ export default class StringCodec extends Codec { decode(buffer, offset) { const view = new DataView(buffer, offset); const length = view.getUint8(0); - const chars = new Array(length); - - for (var index = 0; index < length; index++) { - chars[index] = view.getUint16(1 + index * 2); - } + const bytes = buffer.slice(offset + 1, offset + 1 + length); - return String.fromCharCode(...chars); + return this.decoder.decode(bytes); } }