From 0f85c86f659709a1d1943f8840d04bed6ff72385 Mon Sep 17 00:00:00 2001 From: Koushik Dutta <koushd@gmail.com> Date: Thu, 9 Nov 2023 09:17:21 -0800 Subject: [PATCH 1/2] remove lodash dependency from rtp and common packages --- packages/common/src/array.ts | 9 --------- packages/common/src/index.ts | 1 - packages/rtp/package.json | 2 -- packages/rtp/src/processor/nack.ts | 9 ++++++--- packages/rtp/src/rtcp/rr.ts | 6 ++---- packages/rtp/src/rtcp/rtpfb/nack.ts | 26 +++++++++++--------------- packages/rtp/src/rtcp/rtpfb/twcc.ts | 19 ++++++++++++------- packages/rtp/src/rtcp/sr.ts | 4 +--- packages/webrtc/src/utils.ts | 9 +++++++++ 9 files changed, 41 insertions(+), 44 deletions(-) delete mode 100644 packages/common/src/array.ts diff --git a/packages/common/src/array.ts b/packages/common/src/array.ts deleted file mode 100644 index 9960f2d07..000000000 --- a/packages/common/src/array.ts +++ /dev/null @@ -1,9 +0,0 @@ -import mergeWith from "lodash/mergeWith"; - -export const deepMerge = <T>(dst: T, src: T) => - mergeWith(dst, src, (obj, src) => { - if (!(src == undefined)) { - return src; - } - return obj; - }); diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 3ee820836..2a1abe1c6 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -2,6 +2,5 @@ export * from "./binary"; export * from "./number"; export * from "./promise"; export * from "./network"; -export * from "./array"; export * from "./type"; export * from "./log"; diff --git a/packages/rtp/package.json b/packages/rtp/package.json index 2f90e9557..adb2dfe3d 100644 --- a/packages/rtp/package.json +++ b/packages/rtp/package.json @@ -36,13 +36,11 @@ "buffer": "^6.0.3", "debug": "^4.3.4", "jspack": "^0.0.4", - "lodash": "^4.17.21", "rx.mini": "^1.2.2" }, "devDependencies": { "@types/aes-js": "^3.1.1", "@types/debug": "^4.1.7", - "@types/lodash": "^4.14.191", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.10", "react": "^18.2.0", diff --git a/packages/rtp/src/processor/nack.ts b/packages/rtp/src/processor/nack.ts index cf068483a..4f45a8cbb 100644 --- a/packages/rtp/src/processor/nack.ts +++ b/packages/rtp/src/processor/nack.ts @@ -1,5 +1,4 @@ import debug from "debug"; -import range from "lodash/range"; import Event from "rx.mini"; import { @@ -110,9 +109,13 @@ export class NackHandlerBase this.newEstSeqNum = sequenceNumber; } else if (sequenceNumber > uint16Add(this.newEstSeqNum, 1)) { // packet lost detected - range(uint16Add(this.newEstSeqNum, 1), sequenceNumber).forEach((seq) => { + for ( + let seq = uint16Add(this.newEstSeqNum, 1); + seq < sequenceNumber; + seq++ + ) { this.setLost(seq, 1); - }); + } // this.receiver.sendRtcpPLI(this.mediaSourceSsrc); this.newEstSeqNum = sequenceNumber; diff --git a/packages/rtp/src/rtcp/rr.ts b/packages/rtp/src/rtcp/rr.ts index afeaf43fe..2353d1141 100644 --- a/packages/rtp/src/rtcp/rr.ts +++ b/packages/rtp/src/rtcp/rr.ts @@ -1,5 +1,3 @@ -import range from "lodash/range"; - import { bufferReader, bufferWriter } from "../../../common/src"; import { RtcpPacketConverter } from "./rtcp"; @@ -31,10 +29,10 @@ export class RtcpRrPacket { const [ssrc] = bufferReader(data, [4]); let pos = 4; const reports: RtcpReceiverInfo[] = []; - range(count).forEach(() => { + for (let _ = 0; _ < count; _++) { reports.push(RtcpReceiverInfo.deSerialize(data.slice(pos, pos + 24))); pos += 24; - }); + } return new RtcpRrPacket({ ssrc, reports }); } } diff --git a/packages/rtp/src/rtcp/rtpfb/nack.ts b/packages/rtp/src/rtcp/rtpfb/nack.ts index ffe4a95c8..b952d92ca 100644 --- a/packages/rtp/src/rtcp/rtpfb/nack.ts +++ b/packages/rtp/src/rtcp/rtpfb/nack.ts @@ -1,5 +1,3 @@ -import range from "lodash/range"; - import { bufferReader, bufferWriter } from "../../../../common/src"; import { RtcpHeader } from "../header"; import { RtcpTransportLayerFeedback } from "."; @@ -42,19 +40,17 @@ export class GenericNack { static deSerialize(data: Buffer, header: RtcpHeader) { const [senderSsrc, mediaSourceSsrc] = bufferReader(data, [4, 4]); - const lost = range(8, data.length, 4) - .map((pos) => { - const lost: number[] = []; - const [pid, blp] = bufferReader(data.subarray(pos), [2, 2]); - lost.push(pid); - range(0, 16).forEach((diff) => { - if ((blp >> diff) & 1) { - lost.push(pid + diff + 1); - } - }); - return lost; - }) - .flatMap((v) => v); + + const lost: number[] = []; + for (let pos = 8; pos < data.length; pos += 4) { + const [pid, blp] = bufferReader(data.subarray(pos), [2, 2]); + lost.push(pid); + for (let diff = 0; diff < 16; diff++) { + if ((blp >> diff) & 1) { + lost.push(pid + diff + 1); + } + } + } return new GenericNack({ header, diff --git a/packages/rtp/src/rtcp/rtpfb/twcc.ts b/packages/rtp/src/rtcp/rtpfb/twcc.ts index 9a0765a55..a264c5f30 100644 --- a/packages/rtp/src/rtcp/rtpfb/twcc.ts +++ b/packages/rtp/src/rtcp/rtpfb/twcc.ts @@ -1,5 +1,4 @@ import debug from "debug"; -import range from "lodash/range"; import { BitWriter2, @@ -105,11 +104,11 @@ export class TransportWideCC { packetStatus.packetStatus === PacketStatus.TypeTCCPacketReceivedLargeDelta ) { - range(packetNumberToProcess).forEach(() => { + for (let _ = 0; _ < packetNumberToProcess; _++) { recvDeltas.push( new RecvDelta({ type: packetStatus.packetStatus as any }) ); - }); + } } processedPacketNum += packetNumberToProcess; } @@ -313,14 +312,20 @@ export class StatusVectorChunk { let symbolSize = getBit(data[0], 1, 1); const symbolList: number[] = []; + function range(n: number, cb: (i: number) => void) { + for (let i = 0; i < n; i++) { + cb(i); + } + } + switch (symbolSize) { case 0: - range(6).forEach((_, i) => symbolList.push(getBit(data[0], 2 + i, 1))); - range(8).forEach((_, i) => symbolList.push(getBit(data[1], i, 1))); + range(6, (i) => symbolList.push(getBit(data[0], 2 + i, 1))); + range(8, (i) => symbolList.push(getBit(data[1], i, 1))); break; case 1: - range(3).forEach((i) => symbolList.push(getBit(data[0], 2 + i * 2, 2))); - range(4).forEach((i) => symbolList.push(getBit(data[1], i * 2, 2))); + range(6, (i) => symbolList.push(getBit(data[0], 2 + i * 2, 2))); + range(6, (i) => symbolList.push(getBit(data[1], i * 2, 2))); break; default: symbolSize = (getBit(data[0], 2, 6) << 8) + data[1]; diff --git a/packages/rtp/src/rtcp/sr.ts b/packages/rtp/src/rtcp/sr.ts index 3edf35c85..542c11962 100644 --- a/packages/rtp/src/rtcp/sr.ts +++ b/packages/rtp/src/rtcp/sr.ts @@ -1,5 +1,3 @@ -import range from "lodash/range"; - import { bufferReader, bufferWriter } from "../../../common/src"; import { RtcpReceiverInfo } from "./rr"; import { RtcpPacketConverter } from "./rtcp"; @@ -81,7 +79,7 @@ export class RtcpSrPacket { const senderInfo = RtcpSenderInfo.deSerialize(payload.subarray(4, 24)); let pos = 24; const reports: RtcpReceiverInfo[] = []; - for (const _ of range(count)) { + for (let _ = 0; _ < count; _++) { reports.push( RtcpReceiverInfo.deSerialize(payload.subarray(pos, pos + 24)) ); diff --git a/packages/webrtc/src/utils.ts b/packages/webrtc/src/utils.ts index 80218d6ba..9fe19c3bd 100644 --- a/packages/webrtc/src/utils.ts +++ b/packages/webrtc/src/utils.ts @@ -1,6 +1,7 @@ /* eslint-disable prefer-const */ import { createHash } from "crypto"; import debug from "debug"; +import mergeWith from "lodash/mergeWith"; import { performance } from "perf_hooks"; import { @@ -131,3 +132,11 @@ export class RtpBuilder { */ export const createSelfSignedCertificate = CipherContext.createSelfSignedCertificateWithKey; + +export const deepMerge = <T>(dst: T, src: T) => + mergeWith(dst, src, (obj, src) => { + if (!(src == undefined)) { + return src; + } + return obj; + }); From 494244a5acb31ce609a70e7734ec8066e648a4f9 Mon Sep 17 00:00:00 2001 From: Koushik Dutta <koushd@gmail.com> Date: Mon, 13 Nov 2023 08:45:28 -0800 Subject: [PATCH 2/2] fix range bug copy paste --- packages/rtp/src/rtcp/rtpfb/twcc.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rtp/src/rtcp/rtpfb/twcc.ts b/packages/rtp/src/rtcp/rtpfb/twcc.ts index a264c5f30..ac70b2326 100644 --- a/packages/rtp/src/rtcp/rtpfb/twcc.ts +++ b/packages/rtp/src/rtcp/rtpfb/twcc.ts @@ -324,8 +324,8 @@ export class StatusVectorChunk { range(8, (i) => symbolList.push(getBit(data[1], i, 1))); break; case 1: - range(6, (i) => symbolList.push(getBit(data[0], 2 + i * 2, 2))); - range(6, (i) => symbolList.push(getBit(data[1], i * 2, 2))); + range(3, (i) => symbolList.push(getBit(data[0], 2 + i * 2, 2))); + range(4, (i) => symbolList.push(getBit(data[1], i * 2, 2))); break; default: symbolSize = (getBit(data[0], 2, 6) << 8) + data[1];