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];