Files
BetterDesk/web-nodejs/tests/wsRelay.framing.test.js
T
UNITRONIX e7e1bf31f0 fix(relay): preserve empty RustDesk raw frames
Accept valid zero-length BytesCodec frames in the Node and Go raw relay paths while continuing to reject empty protobuf control frames. This keeps native and mixed relay transports compatible with RustDesk peers and empty raw payloads.

Thanks: INSOLVE (Honorary); Marco Jakobs (@jacotec); MyNameisStitch (@MyNameisStitch); Redspin (@playerumpknow)
2026-09-24 22:48:02 +02:00

44 lines
1.7 KiB
JavaScript

'use strict';
const { _relayFraming } = require('../services/wsRelay');
describe('wsRelay RustDesk message/TCP framing bridge', () => {
test('round-trips fragmented BytesCodec frames at every header size', () => {
const sizes = [1, 63, 64, 16383, 16384, 0x400000];
const payloads = sizes.map((size, index) => Buffer.alloc(size, index + 1));
const stream = Buffer.concat(payloads.map(_relayFraming.encodeRelayFrame));
const decoder = _relayFraming.createRelayFrameDecoder();
const decoded = [];
const chunkSizes = [1, 2, 7, 31, 257, 4096, 65535];
let offset = 0;
let chunkIndex = 0;
while (offset < stream.length) {
const end = Math.min(stream.length, offset + chunkSizes[chunkIndex % chunkSizes.length]);
decoded.push(...decoder.feed(stream.subarray(offset, end)));
offset = end;
chunkIndex++;
}
expect(decoded).toHaveLength(payloads.length);
decoded.forEach((payload, index) => {
expect(payload.equals(payloads[index])).toBe(true);
});
});
test('round-trips an empty RustDesk raw payload', () => {
const frame = _relayFraming.encodeRelayFrame(Buffer.alloc(0));
expect(frame).toEqual(Buffer.from([0]));
const decoder = _relayFraming.createRelayFrameDecoder();
const decoded = decoder.feed(frame);
expect(decoded).toHaveLength(1);
expect(decoded[0]).toHaveLength(0);
});
test('accepts a fragmented zero-length TCP frame', () => {
const decoder = _relayFraming.createRelayFrameDecoder();
expect(decoder.feed(Buffer.from([0]))).toEqual([Buffer.alloc(0)]);
});
});