{"version":3,"file":"streamer.mjs","names":[],"sources":["../../src/call-session/streamer.ts"],"sourcesContent":["import { Buffer } from \"node:buffer\";\nimport EventEmitter from \"node:events\";\n\nimport { RtpHeader, RtpPacket } from \"werift-rtp\";\n\nimport type CallSession from \"./index.js\";\n\nclass Streamer extends EventEmitter {\n  public paused = false;\n  private callSession: CallSession;\n  private buffer: Buffer;\n  private originalBuffer: Buffer;\n\n  public constructor(callSession: CallSession, buffer: Buffer) {\n    super();\n    this.callSession = callSession;\n    this.buffer = buffer;\n    this.originalBuffer = buffer;\n  }\n\n  public start() {\n    this.buffer = this.originalBuffer;\n    this.paused = false;\n    this.sendPacket();\n  }\n\n  public stop() {\n    this.buffer = Buffer.alloc(0);\n  }\n\n  public pause() {\n    this.paused = true;\n  }\n\n  public resume() {\n    this.paused = false;\n    this.sendPacket();\n  }\n\n  public get finished() {\n    return (\n      this.callSession.disposed ||\n      this.buffer.length < this.callSession.softphone.codec.packetSize\n    );\n  }\n\n  private sendPacket() {\n    if (!this.paused && !this.finished) {\n      const temp = this.callSession.encoder.encode(\n        this.buffer.subarray(0, this.callSession.softphone.codec.packetSize),\n      );\n      const rtpPacket = new RtpPacket(\n        new RtpHeader({\n          version: 2,\n          padding: false,\n          paddingSize: 0,\n          extension: false,\n          marker: false,\n          payloadOffset: 12,\n          payloadType: this.callSession.softphone.codec.id,\n          sequenceNumber: this.callSession.sequenceNumber,\n          timestamp: this.callSession.timestamp,\n          ssrc: this.callSession.ssrc,\n          csrcLength: 0,\n          csrc: [],\n          extensionProfile: 48862,\n          extensionLength: undefined,\n          extensions: [],\n        }),\n        temp,\n      );\n      this.callSession.send(\n        this.callSession.srtpSession.encrypt(\n          rtpPacket.payload,\n          rtpPacket.header,\n        ),\n      );\n      this.callSession.sequenceNumber += 1;\n      if (this.callSession.sequenceNumber > 65535) {\n        this.callSession.sequenceNumber = 0;\n      }\n      this.callSession.timestamp +=\n        this.callSession.softphone.codec.timestampInterval;\n      this.buffer = this.buffer.subarray(\n        this.callSession.softphone.codec.packetSize,\n      );\n      if (this.finished) {\n        this.emit(\"finished\");\n      } else {\n        setTimeout(() => this.sendPacket(), 20);\n      }\n    }\n  }\n}\n\nexport default Streamer;\n"],"mappings":";;;;AAOA,IAAM,WAAN,cAAuB,aAAa;CAClC,SAAgB;CAChB;CACA;CACA;CAEA,YAAmB,aAA0B,QAAgB;EAC3D,OAAO;EACP,KAAK,cAAc;EACnB,KAAK,SAAS;EACd,KAAK,iBAAiB;;CAGxB,QAAe;EACb,KAAK,SAAS,KAAK;EACnB,KAAK,SAAS;EACd,KAAK,YAAY;;CAGnB,OAAc;EACZ,KAAK,SAAS,OAAO,MAAM,EAAE;;CAG/B,QAAe;EACb,KAAK,SAAS;;CAGhB,SAAgB;EACd,KAAK,SAAS;EACd,KAAK,YAAY;;CAGnB,IAAW,WAAW;EACpB,OACE,KAAK,YAAY,YACjB,KAAK,OAAO,SAAS,KAAK,YAAY,UAAU,MAAM;;CAI1D,aAAqB;EACnB,IAAI,CAAC,KAAK,UAAU,CAAC,KAAK,UAAU;GAClC,MAAM,OAAO,KAAK,YAAY,QAAQ,OACpC,KAAK,OAAO,SAAS,GAAG,KAAK,YAAY,UAAU,MAAM,WAAW,CACrE;GACD,MAAM,YAAY,IAAI,UACpB,IAAI,UAAU;IACZ,SAAS;IACT,SAAS;IACT,aAAa;IACb,WAAW;IACX,QAAQ;IACR,eAAe;IACf,aAAa,KAAK,YAAY,UAAU,MAAM;IAC9C,gBAAgB,KAAK,YAAY;IACjC,WAAW,KAAK,YAAY;IAC5B,MAAM,KAAK,YAAY;IACvB,YAAY;IACZ,MAAM,EAAE;IACR,kBAAkB;IAClB,iBAAiB,KAAA;IACjB,YAAY,EAAE;IACf,CAAC,EACF,KACD;GACD,KAAK,YAAY,KACf,KAAK,YAAY,YAAY,QAC3B,UAAU,SACV,UAAU,OACX,CACF;GACD,KAAK,YAAY,kBAAkB;GACnC,IAAI,KAAK,YAAY,iBAAiB,OACpC,KAAK,YAAY,iBAAiB;GAEpC,KAAK,YAAY,aACf,KAAK,YAAY,UAAU,MAAM;GACnC,KAAK,SAAS,KAAK,OAAO,SACxB,KAAK,YAAY,UAAU,MAAM,WAClC;GACD,IAAI,KAAK,UACP,KAAK,KAAK,WAAW;QAErB,iBAAiB,KAAK,YAAY,EAAE,GAAG"}