UNPKG

rtp.js

Version:

RTP stack for Node.js and browser written in TypeScript

579 lines (578 loc) 28.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const fs = require("fs"); const path = require("path"); const RtpPacket_1 = require("../../../packets/RTP/RtpPacket"); const helpers_1 = require("../../../utils/helpers"); describe('parse RTP packet 1', () => { const view = (0, helpers_1.nodeBufferToDataView)(fs.readFileSync(path.join(__dirname, '..', '..', 'data', 'rtppacket1.raw'))); let packet; test('isRtp() succeeds', () => { expect((0, RtpPacket_1.isRtp)(view)).toBe(true); }); test('packet processing succeeds', () => { packet = new RtpPacket_1.RtpPacket(view); expect(packet.getByteLength()).toBe(54); expect(packet.needsSerialization()).toBe(false); expect(packet.getPayloadType()).toBe(111); expect(packet.getSequenceNumber()).toBe(23617); expect(packet.getTimestamp()).toBe(1660241882); expect(packet.getSsrc()).toBe(2674985186); expect(packet.getCsrcs()).toEqual([]); expect(packet.getMarker()).toBe(false); expect(packet.getPadding()).toBe(0); expect(packet.hasOneByteExtensions()).toBe(true); expect(packet.hasTwoBytesExtensions()).toBe(false); expect(packet.getExtensions().size).toBe(1); expect(packet.getExtension(1)).toEqual((0, helpers_1.numericArrayToDataView)([255])); expect(packet.needsSerialization()).toBe(false); packet.setExtension(1, (0, helpers_1.stringToDataView)('foo œæ€å∫∂ ®†¥∂ƒ∑©√')); expect(packet.getExtensions().size).toBe(1); expect(packet.needsSerialization()).toBe(true); expect(packet.getExtension(1)).toEqual((0, helpers_1.stringToDataView)('foo œæ€å∫∂ ®†¥∂ƒ∑©√')); }); }); describe('parse RTP packet 2', () => { const view = (0, helpers_1.nodeBufferToDataView)(fs.readFileSync(path.join(__dirname, '..', '..', 'data', 'rtppacket2.raw'))); let packet; test('isRtp() succeeds', () => { expect((0, RtpPacket_1.isRtp)(view)).toBe(true); }); test('packet processing succeeds', () => { packet = new RtpPacket_1.RtpPacket(view); expect(packet.getByteLength()).toBe(102); expect(packet.getPayloadType()).toBe(111); expect(packet.getSequenceNumber()).toBe(19354); expect(packet.getTimestamp()).toBe(863466045); expect(packet.getSsrc()).toBe(235797202); expect(packet.getCsrcs()).toEqual([]); expect(packet.getMarker()).toBe(false); expect(packet.getPadding()).toBe(0); expect(packet.hasOneByteExtensions()).toBe(true); expect(packet.hasTwoBytesExtensions()).toBe(false); expect(packet.getExtension(3)).toEqual((0, helpers_1.numericArrayToDataView)([0x65, 0x34, 0x1e])); expect(packet.getPayload().byteLength).toBe(78); expect(packet.needsSerialization()).toBe(false); }); }); describe('parse RTP packet 3', () => { const array = new Uint8Array([ 0b10010000, 0b00000001, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0xbe, 0xde, 0x00, 0x03, // Header extension. 0b00010000, 0xff, 0b00100001, 0xff, 0xff, 0x00, 0x00, 0b00110011, 0xff, 0xff, 0xff, 0xff, ]); const view = new DataView(array.buffer, array.byteOffset, array.byteLength); let packet; test('isRtp() succeeds', () => { expect((0, RtpPacket_1.isRtp)(view)).toBe(true); }); test('packet processing succeeds', () => { packet = new RtpPacket_1.RtpPacket(view); expect(packet.getByteLength()).toBe(array.byteLength); expect(packet.getPayloadType()).toBe(1); expect(packet.getSequenceNumber()).toBe(8); expect(packet.getTimestamp()).toBe(4); expect(packet.getSsrc()).toBe(5); expect(packet.getCsrcs()).toEqual([]); expect(packet.getMarker()).toBe(false); expect(packet.getPadding()).toBe(0); expect(packet.hasOneByteExtensions()).toBe(true); expect(packet.hasTwoBytesExtensions()).toBe(false); expect(packet.getPayload().byteLength).toBe(0); expect(packet.needsSerialization()).toBe(false); }); }); describe('parse RTP packet 4', () => { const uselessExtensionAlignment = 4; // This RTP packet contains 4 extensions with id=0 meaning alignment so // those are discarded if the packet is serialized. const array = new Uint8Array([ 0b10010000, 0b00000001, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0b00010000, 0x00, 0x00, 0x04, // Header extension. 0x00, 0x00, 0x01, 0x00, 0x02, 0x01, 0x42, 0x00, 0x03, 0x02, 0x11, 0x22, 0x00, 0x00, 0x04, 0x00, ]); const view = new DataView(array.buffer, array.byteOffset, array.byteLength); let packet; test('isRtp() succeeds', () => { expect((0, RtpPacket_1.isRtp)(view)).toBe(true); }); test('packet processing succeeds', () => { packet = new RtpPacket_1.RtpPacket(view); expect(packet.getByteLength()).toBe(array.byteLength - uselessExtensionAlignment); expect(packet.getPayloadType()).toBe(1); expect(packet.getSequenceNumber()).toBe(8); expect(packet.getTimestamp()).toBe(4); expect(packet.getSsrc()).toBe(5); expect(packet.getCsrcs()).toEqual([]); expect(packet.getMarker()).toBe(false); expect(packet.getPadding()).toBe(0); expect(packet.hasOneByteExtensions()).toBe(false); expect(packet.hasTwoBytesExtensions()).toBe(true); expect(packet.getExtensions().size).toBe(4); expect(packet.getExtension(1)).toEqual(new DataView(new ArrayBuffer(0))); expect(packet.getExtension(2)).toEqual((0, helpers_1.numericArrayToDataView)([0x42])); expect(packet.getExtension(3)).toEqual((0, helpers_1.numericArrayToDataView)([0x11, 0x22])); expect(packet.getExtension(4)).toEqual(new DataView(new ArrayBuffer(0))); expect(packet.getExtension(5)).toBeUndefined(); expect(packet.getPayload().byteLength).toBe(0); expect(packet.needsSerialization()).toBe(false); packet.deleteExtension(2); expect(packet.getExtensions().size).toBe(3); expect(packet.needsSerialization()).toBe(true); expect(packet.getExtension(2)).toBeUndefined(); }); }); describe('parse RTP packet 5 with uncommon header extension value', () => { const array = new Uint8Array([ 0b10010000, 0b00000001, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0xa1, 0xb1, 0x00, 0x01, // Uncommon header extension id: 0xA1B1. 0xa2, 0xb2, 0xc2, 0xd2, // Uncommon header extension value: 0xA2B2C2D2) 0x11, 0x22, 0x33, 0x44, // Payload. ]); const view = new DataView(array.buffer, array.byteOffset, array.byteLength); let packet; test('isRtp() succeeds', () => { expect((0, RtpPacket_1.isRtp)(view)).toBe(true); }); test('packet processing succeeds', () => { packet = new RtpPacket_1.RtpPacket(view); const packetView = (0, helpers_1.clone)(packet.getView()); const payloadView = (0, helpers_1.clone)(packet.getPayload()); const packetDump = (0, helpers_1.clone)(packet.dump()); expect(packet.getByteLength()).toBe(array.byteLength); expect(packet.getPayloadType()).toBe(1); expect(packet.getSequenceNumber()).toBe(8); expect(packet.getTimestamp()).toBe(4); expect(packet.getSsrc()).toBe(5); expect(packet.getCsrcs()).toEqual([]); expect(packet.getMarker()).toBe(false); expect(packet.getPadding()).toBe(0); expect(packet.hasOneByteExtensions()).toBe(false); expect(packet.hasTwoBytesExtensions()).toBe(false); expect(packet.getExtensions().size).toBe(0); expect(packet.getPayload().byteLength).toBe(4); expect(packet.needsSerialization()).toBe(false); // Serialize and then compare DataViews. // NOTE: serialize() will NOT discard non RFC 5285 header extensions, so // the packet will match the parsed one. packet.serialize(); expect((0, helpers_1.areDataViewsEqual)(packet.getView(), packetView)).toBe(true); expect((0, helpers_1.areDataViewsEqual)(packet.getPayload(), payloadView)).toBe(true); expect(packet.dump()).toEqual(packetDump); }); }); describe('create RTP packet 6 from scratch', () => { let packet; test('packet processing succeeds', () => { packet = new RtpPacket_1.RtpPacket(); expect((0, RtpPacket_1.isRtp)(packet.getView())).toBe(true); expect(packet.getPayloadType()).toBe(0); expect(packet.getSequenceNumber()).toBe(0); expect(packet.getTimestamp()).toBe(0); expect(packet.getSsrc()).toBe(0); expect(packet.getCsrcs()).toEqual([]); expect(packet.getMarker()).toBe(false); expect(packet.getPayload()).toEqual(new DataView(new ArrayBuffer(0))); expect(packet.getPadding()).toBe(0); expect(packet.hasOneByteExtensions()).toBe(false); expect(packet.hasTwoBytesExtensions()).toBe(false); expect(packet.getExtensions().size).toBe(0); expect(packet.needsSerialization()).toBe(false); packet.setPayloadType(3); expect(packet.needsSerialization()).toBe(false); expect(packet.getPayloadType()).toBe(3); packet.setPayloadType(127); expect(packet.needsSerialization()).toBe(false); expect(packet.getPayloadType()).toBe(127); packet.setSequenceNumber(52345); expect(packet.needsSerialization()).toBe(false); expect(packet.getSequenceNumber()).toBe(52345); packet.setTimestamp(1234567890); expect(packet.needsSerialization()).toBe(false); expect(packet.getTimestamp()).toBe(1234567890); packet.setSsrc(3294967295); expect(packet.needsSerialization()).toBe(false); expect(packet.getSsrc()).toBe(3294967295); packet.setMarker(true); expect(packet.needsSerialization()).toBe(false); expect(packet.getMarker()).toBe(true); packet.setCsrcs([1111, 2222]); expect(packet.needsSerialization()).toBe(true); expect(packet.getCsrcs()).toEqual([1111, 2222]); packet.enableOneByteExtensions(); expect(packet.needsSerialization()).toBe(true); expect(packet.hasOneByteExtensions()).toBe(true); expect(packet.hasTwoBytesExtensions()).toBe(false); expect(packet.getExtensions().size).toBe(0); packet.enableTwoBytesExtensions(); expect(packet.needsSerialization()).toBe(true); expect(packet.hasOneByteExtensions()).toBe(false); expect(packet.hasTwoBytesExtensions()).toBe(true); expect(packet.getExtensions().size).toBe(0); packet.setExtension(1, (0, helpers_1.stringToDataView)('foo')); expect(packet.needsSerialization()).toBe(true); expect(packet.getExtensions().size).toBe(1); expect(packet.getExtension(1)).toEqual((0, helpers_1.stringToDataView)('foo')); packet.setExtension(2, (0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); expect(packet.getExtensions().size).toBe(2); expect(packet.needsSerialization()).toBe(true); expect(packet.getExtension(2)).toEqual((0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); packet.deleteExtension(1); expect(packet.getExtensions().size).toBe(1); expect(packet.needsSerialization()).toBe(true); expect(packet.getExtension(1)).toBeUndefined(); packet.clearExtensions(); expect(packet.needsSerialization()).toBe(true); expect(packet.getExtensions().size).toBe(0); expect(packet.getExtension(2)).toBeUndefined(); packet.setExtension(2, (0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); expect(packet.needsSerialization()).toBe(true); expect(packet.getExtensions().size).toBe(1); expect(packet.getExtension(2)).toEqual((0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); packet.setPayload((0, helpers_1.stringToDataView)('codec')); expect(packet.needsSerialization()).toBe(true); expect(packet.getPayload()).toEqual((0, helpers_1.stringToDataView)('codec')); }); test('packet.clone() succeeds', () => { // Serialize to reset serialization packet. packet.serialize(); expect(packet.needsSerialization()).toBe(false); const clonedPacket = packet.clone(); expect(packet.needsSerialization()).toBe(false); expect(clonedPacket.needsSerialization()).toBe(false); expect(clonedPacket.getPayloadType()).toBe(127); expect(clonedPacket.getSequenceNumber()).toBe(52345); expect(clonedPacket.getTimestamp()).toBe(1234567890); expect(clonedPacket.getSsrc()).toBe(3294967295); expect(clonedPacket.getMarker()).toBe(true); expect(clonedPacket.getCsrcs()).toEqual([1111, 2222]); expect(clonedPacket.hasOneByteExtensions()).toBe(false); expect(clonedPacket.hasTwoBytesExtensions()).toBe(true); expect(clonedPacket.getExtension(2)).toEqual((0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); expect(clonedPacket.getPayload()).toEqual((0, helpers_1.stringToDataView)('codec')); expect(clonedPacket.getPadding()).toBe(0); expect(clonedPacket.dump()).toEqual(packet.dump()); expect(clonedPacket.needsSerialization()).toBe(false); // Packet views and payload views must be the same. expect((0, helpers_1.areDataViewsEqual)(clonedPacket.getView(), packet.getView())).toBe(true); expect((0, helpers_1.areDataViewsEqual)(clonedPacket.getPayload(), packet.getPayload())).toBe(true); // DataViews instances must be different since it's a cloned packet. expect(clonedPacket.getView() === packet.getView()).toBe(false); expect(clonedPacket.getPayload() === packet.getPayload()).toBe(false); // Internal ArrayBuffer instances must be different. expect(clonedPacket.getView().buffer === packet.getView().buffer).toBe(false); expect(clonedPacket.getPayload().buffer === packet.getPayload().buffer).toBe(false); // Clone again, now in a given buffer. const cloneBuffer = new ArrayBuffer(1500); const byteOffset = 245; const clonedPacket2 = packet.clone(cloneBuffer, byteOffset); // DataViews instances must be different since it's a cloned packet. expect(clonedPacket2.getView() === packet.getView()).toBe(false); expect(clonedPacket2.getPayload() === packet.getPayload()).toBe(false); // Internal ArrayBuffer instances must be different. expect(clonedPacket2.getView().buffer === packet.getView().buffer).toBe(false); expect(clonedPacket2.getPayload().buffer === packet.getPayload().buffer).toBe(false); }); test('packet.rtxEncode() and packet.rtxDecode() succeed', () => { // Serialize to reset serialization needed. packet.serialize(); expect(packet.needsSerialization()).toBe(false); const payloadType = packet.getPayloadType(); const ssrc = packet.getSsrc(); const sequenceNumber = packet.getSequenceNumber(); const payloadLength = packet.getPayload().byteLength; const packetView = (0, helpers_1.clone)(packet.getView()); const payloadView = (0, helpers_1.clone)(packet.getPayload()); const packetDump = (0, helpers_1.clone)(packet.dump()); packet.rtxEncode(69, 69696969, 6969); expect(packet.needsSerialization()).toBe(true); // Serialize to reset serialization needed. packet.serialize(); const rtxPayloadView = packet.getPayload(); expect(packet.getPayloadType()).toBe(69); expect(packet.getSequenceNumber()).toBe(6969); expect(packet.getSsrc()).toBe(69696969); expect(rtxPayloadView.byteLength).toBe(payloadLength + 2); expect(rtxPayloadView.getUint16(0)).toBe(sequenceNumber); const payloadWithoutSeqNumberView = new DataView(packet.getPayload().buffer, packet.getPayload().byteOffset + 2, packet.getPayload().byteLength - 2); expect((0, helpers_1.areDataViewsEqual)(payloadWithoutSeqNumberView, payloadView)).toBe(true); packet.rtxDecode(payloadType, ssrc); expect(packet.needsSerialization()).toBe(true); expect(packet.getPayloadType()).toBe(payloadType); expect(packet.getSequenceNumber()).toBe(sequenceNumber); expect(packet.getSsrc()).toBe(ssrc); expect(packet.getPayload().byteLength).toBe(payloadLength); expect(packet.needsSerialization()).toBe(true); // Packet and payload views must be the same. expect((0, helpers_1.areDataViewsEqual)(packet.getView(), packetView)).toBe(true); expect((0, helpers_1.areDataViewsEqual)(packet.getPayload(), payloadView)).toBe(true); expect(packet.dump()).toEqual(packetDump); }); }); describe('create RTP packet 7 from scratch', () => { let packet; test('packet processing succeeds', () => { packet = new RtpPacket_1.RtpPacket(); // Adding an extension without having One-Byte or Two-Bytes extensions // enabled should force One-Byte. packet.setExtension(1, (0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); expect(packet.needsSerialization()).toBe(true); expect(packet.getExtensions().size).toBe(1); expect(packet.getExtension(1)).toEqual((0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); expect(packet.hasOneByteExtensions()).toBe(true); expect(packet.hasTwoBytesExtensions()).toBe(false); // Packet total length must match RTP fixed header length (12) + header // extension id/length (4) + extension id 1 (5) = 21. Must add padding so // it becomes 24; expect(packet.getView().byteLength).toBe(24); expect(packet.needsSerialization()).toBe(false); packet.clearExtensions(); expect(packet.needsSerialization()).toBe(true); expect(packet.getExtensions().size).toBe(0); expect(packet.getExtension(1)).toBeUndefined(); expect(packet.hasOneByteExtensions()).toBe(true); expect(packet.hasTwoBytesExtensions()).toBe(false); // Packet total length must match RTP fixed header length (12). // getView() serializes if needed. expect(packet.getView().byteLength).toBe(12); expect(packet.needsSerialization()).toBe(false); }); }); describe('create RTP packet 8 from scratch', () => { let packet; test('packet processing succeeds', () => { packet = new RtpPacket_1.RtpPacket(); packet.enableOneByteExtensions(); expect(packet.needsSerialization()).toBe(true); expect(packet.getExtensions().size).toBe(0); packet.setExtension(0, (0, helpers_1.stringToDataView)('ignore me')); packet.setExtension(1, (0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); packet.setExtension(15, (0, helpers_1.stringToDataView)('also ignore me')); packet.setExtension(16, (0, helpers_1.stringToDataView)('also ignore me')); // We don't validate extensions (`id` and value length) until the packet // is serialized. expect(packet.getExtensions().size).toBe(4); // Force serialization so extension with id 0 and id >= 15 must be ignored. packet.serialize(); expect(packet.getExtensions().size).toBe(1); expect(packet.getExtension(0)).toBeUndefined(); expect(packet.getExtension(1)).toEqual((0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); // Extension with id 16 (so 0 in 4 bits) must be ignored. expect(packet.getExtension(16)).toBeUndefined(); expect(packet.hasOneByteExtensions()).toBe(true); expect(packet.hasTwoBytesExtensions()).toBe(false); // Packet total length must match RTP fixed header length (12) + header // extension id/length (4) + extension id 1 (5) = 21. Must add padding so // it becomes 24; // getView() serializes if needed. expect(packet.getView().byteLength).toBe(24); expect(packet.needsSerialization()).toBe(false); // Adding a extension with value longer than 16 bytes is not allowed in // One-Byte extensions, so it must fail when serializing. packet.setExtension(5, new DataView(new ArrayBuffer(17))); expect(() => packet.serialize()).toThrow(RangeError); }); }); describe('create RTP packet 9 from scratch', () => { let packet; test('packet processing succeeds', () => { packet = new RtpPacket_1.RtpPacket(); packet.enableTwoBytesExtensions(); expect(packet.needsSerialization()).toBe(true); expect(packet.getExtensions().size).toBe(0); packet.setExtension(0, (0, helpers_1.stringToDataView)('ignore me')); packet.setExtension(1, (0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); packet.setExtension(256, (0, helpers_1.stringToDataView)('also ignore me')); packet.setExtension(257, (0, helpers_1.stringToDataView)('also ignore me')); // We don't validate extensions (`id` and value length) until the packet // is serialized. expect(packet.getExtensions().size).toBe(4); // Force serialization so extension with id 0, 256 and 257 must be ignored. packet.serialize(); expect(packet.getExtensions().size).toBe(1); expect(packet.getExtension(0)).toBeUndefined(); expect(packet.getExtension(1)).toEqual((0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); // Extension with id 256 (so 0 in 8 bits) must be ignored. expect(packet.getExtension(256)).toBeUndefined(); expect(packet.getExtension(257)).toBeUndefined(); expect(packet.hasOneByteExtensions()).toBe(false); expect(packet.hasTwoBytesExtensions()).toBe(true); // Packet total length must match RTP fixed header length (12) + header // extension id/length (4) + extension id 1 (6) = 22. Must add padding so // it becomes 24; // getView() serializes if needed. expect(packet.getView().byteLength).toBe(24); expect(packet.needsSerialization()).toBe(false); // Adding a extension with value longer than 255 bytes is not allowed in // Two-Bytes extensions, so it must fail when serializing. packet.setExtension(5, new DataView(new ArrayBuffer(256))); expect(() => packet.serialize()).toThrow(RangeError); }); }); describe('create RTP packet 10 from scratch', () => { let packet; test('packet processing succeeds', () => { packet = new RtpPacket_1.RtpPacket(); packet.setPayload((0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); expect(packet.needsSerialization()).toBe(true); // Packet total length must match RTP fixed header length (12) + payload // (4), so 16. expect(packet.getView().byteLength).toBe(16); expect(packet.getByteLength()).toBe(16); // Nothing to do since already padded to 4 bytes. packet.padTo4Bytes(); expect(packet.needsSerialization()).toBe(false); expect(packet.getView().byteLength).toBe(16); expect(packet.getByteLength()).toBe(16); expect(packet.getPadding()).toBe(0); // Padding a packet of 16 bytes (0 byte of padding) must become 16 bytes. packet.padTo4Bytes(); expect(packet.needsSerialization()).toBe(false); expect(packet.getView().byteLength).toBe(16); expect(packet.getByteLength()).toBe(16); expect(packet.getPadding()).toBe(0); packet.setPayload((0, helpers_1.numericArrayToDataView)([1, 2, 3, 4, 5])); expect(packet.getByteLength()).toBe(17); // Padding a packet of 17 bytes (0 bytes of padding) must become 20 bytes. packet.padTo4Bytes(); expect(packet.needsSerialization()).toBe(true); expect(packet.getView().byteLength).toBe(20); expect(packet.getByteLength()).toBe(20); expect(packet.getPadding()).toBe(3); }); }); describe('serialize packet into a given buffer', () => { const packet = new RtpPacket_1.RtpPacket(); packet.setPayload((0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); packet.serialize(); const packetView = (0, helpers_1.clone)(packet.getView()); const payloadView = (0, helpers_1.clone)(packet.getPayload()); const packetDump = (0, helpers_1.clone)(packet.dump()); test('serialization succeeds', () => { const buffer = new ArrayBuffer(2000); const byteOffset = 135; packet.serialize(buffer, byteOffset); // Packet and payload views must be the same. expect((0, helpers_1.areDataViewsEqual)(packet.getView(), packetView)).toBe(true); expect((0, helpers_1.areDataViewsEqual)(packet.getPayload(), payloadView)).toBe(true); expect(packet.getView().buffer === buffer).toBe(true); expect(packet.getView().byteOffset).toBe(byteOffset); expect(packet.dump()).toEqual(packetDump); }); test('serialization fails if given buffer do not have enough space', () => { // Packet length is 16 byrtes so let's pass only 15 bytes to make it throw. const buffer = new ArrayBuffer(16); const byteOffset = 1; expect(() => packet.serialize(buffer, byteOffset)).toThrow(RangeError); }); test('serialization fails if given buffer is the same as the internal one in the packet and given byteOffset would make serialization overlap the current packet content', () => { packet.setSequenceNumber(55555); expect(packet.needsSerialization()).toBe(false); expect(packet.getSequenceNumber()).toBe(55555); const buffer = new ArrayBuffer(1500); packet.serialize(buffer, 0); expect(packet.getSequenceNumber()).toBe(55555); // Here we are serializing the packet in its own buffer with an offset of 2, // so we are effectively overriding its current content. expect(() => packet.serialize(buffer, 2)).toThrow(RangeError); }); }); describe('clone packet into a given buffer', () => { const packet = new RtpPacket_1.RtpPacket(); packet.setPayload((0, helpers_1.numericArrayToDataView)([1, 2, 3, 4])); packet.serialize(); const packetView = (0, helpers_1.clone)(packet.getView()); const payloadView = (0, helpers_1.clone)(packet.getPayload()); const packetDump = (0, helpers_1.clone)(packet.dump()); test('cloning succeeds', () => { const buffer = new ArrayBuffer(2000); const byteOffset = 135; const clonedPacket = packet.clone(buffer, byteOffset); // Packet and payload views must be the same. expect((0, helpers_1.areDataViewsEqual)(clonedPacket.getView(), packetView)).toBe(true); expect((0, helpers_1.areDataViewsEqual)(clonedPacket.getPayload(), payloadView)).toBe(true); expect(clonedPacket.getView().buffer === buffer).toBe(true); expect(clonedPacket.getView().byteOffset).toBe(byteOffset); expect(clonedPacket.dump()).toEqual(packetDump); }); test('cloning fails if given buffer do not have enough space', () => { // Packet length is 16 byrtes so let's pass only 15 bytes to make it throw. const buffer = new ArrayBuffer(16); const byteOffset = 1; expect(() => packet.clone(buffer, byteOffset)).toThrow(RangeError); }); });