livekit-client
Version:
JavaScript/TypeScript client SDK for LiveKit
132 lines (124 loc) • 4.03 kB
text/typescript
/* eslint-disable @typescript-eslint/no-unused-vars */
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { DataTrackFrameInternal } from './frame';
import { DataTrackHandle } from './handle';
import { FrameMarker } from './packet';
import { DataTrackExtensions } from './packet/extensions';
import DataTrackPacketizer from './packetizer';
import { DataTrackTimestamp } from './utils';
describe('DataTrackPacketizer', () => {
it('should packetize a large payload properly', () => {
const packetizer = new DataTrackPacketizer(DataTrackHandle.fromNumber(1), 100);
const packets = Array.from(
packetizer.packetize(
{
payload: new Uint8Array(300).fill(0xbe),
extensions: new DataTrackExtensions(),
},
{ now: DataTrackTimestamp.fromRtpTicks(1804548298) },
),
);
expect(packets.map((packet) => packet.toJSON())).toStrictEqual([
{
header: {
extensions: {
e2ee: null,
userTimestamp: null,
},
frameNumber: 0,
marker: FrameMarker.Start,
sequence: 0,
timestamp: 1804548298,
trackHandle: 1,
},
payload: new Uint8Array(88).fill(0xbe),
},
{
header: {
extensions: {
e2ee: null,
userTimestamp: null,
},
frameNumber: 0,
marker: FrameMarker.Inter,
sequence: 1,
timestamp: 1804548298,
trackHandle: 1,
},
payload: new Uint8Array(88).fill(0xbe),
},
{
header: {
extensions: {
e2ee: null,
userTimestamp: null,
},
frameNumber: 0,
marker: FrameMarker.Inter,
sequence: 2,
timestamp: 1804548298,
trackHandle: 1,
},
payload: new Uint8Array(88).fill(0xbe),
},
{
header: {
extensions: {
e2ee: null,
userTimestamp: null,
},
frameNumber: 0,
marker: FrameMarker.Final,
sequence: 3,
timestamp: 1804548298,
trackHandle: 1,
},
payload: new Uint8Array(36 /* 300 total bytes - (88 bytes * 3 full length packets) */).fill(
0xbe,
),
},
]);
});
it.each([
[0, 1_024, 'zero payload'],
[128, 1_024, 'single packet'],
[20_480, 1_024, 'multi packet'],
[40_960, 16_000, 'multi packet mtu 16000'],
])('should test packetizer edge cases', (payloadSizeBytes, mtuSizeBytes, label) => {
const packetizer = new DataTrackPacketizer(DataTrackHandle.fromNumber(1), mtuSizeBytes);
const frame: DataTrackFrameInternal = {
payload: new Uint8Array(payloadSizeBytes).fill(0xab),
extensions: new DataTrackExtensions(),
};
const packets = Array.from(
packetizer.packetize(frame, {
now: DataTrackTimestamp.fromRtpTicks(0),
}),
);
if (packets.length === 0) {
expect(payloadSizeBytes, `${label}: Should be no packets for zero payload`).toStrictEqual(0);
}
let index = 0;
for (const packet of packets) {
const packetHeaderJson = packet.header.toJSON();
expect(packetHeaderJson.marker).toStrictEqual(
DataTrackPacketizer.computeFrameMarker(index, packets.length),
);
expect(packetHeaderJson.frameNumber).toStrictEqual(0);
expect(packetHeaderJson.trackHandle).toStrictEqual(1);
expect(packetHeaderJson.sequence).toStrictEqual(index);
expect(packetHeaderJson.extensions).toStrictEqual(frame.extensions.toJSON());
index += 1;
}
});
it.each([
[0, 1, FrameMarker.Single],
[0, 10, FrameMarker.Start],
[4, 10, FrameMarker.Inter],
[9, 10, FrameMarker.Final],
])('should test frame marker utility function', (index, packetCount, expectedMarker) => {
expect(DataTrackPacketizer.computeFrameMarker(index, packetCount)).toStrictEqual(
expectedMarker,
);
});
});