ringcentral-softphone 0.11.5 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -84,7 +84,10 @@ play -b 8 -r 8000 -e mu-law test.raw
84
84
  - do not hard code `domain` and `outboundProxy`
85
85
  - I tried `sip10.ringcentral.com:5096` as `outboundProxy`, it requires TLS instead of TCP
86
86
  - I made TLS work, however for inbound call there is no INVITE message coming in, for outbound call "488 Not Acceptable Here"
87
+ - change the codec list in SDP could solve the 488 issue.
87
88
  - check the code of PJSIP and refactor the code.
89
+ - with PJSIP 2.10, I have made TCP & TLS work.
90
+ - TLS is too complicated, next step is to copy PJSIP TCP example.
88
91
  - Provide an easy way for developers to check the call info, such as who is calling, who is being called, etc.
89
92
 
90
93
  ## Dev Notes
@@ -29,10 +29,18 @@ const main = async () => {
29
29
  writeStream.write(rtpPacket.payload);
30
30
  });
31
31
 
32
- // // // send audio to remote peer
32
+ // // send audio to remote peer
33
33
  // const streamer = callSession.streamAudio(fs.readFileSync('demos/test.raw'));
34
+ // // You may subscribe to the 'finished' event of the streamer to know when the audio sending is finished
35
+ // streamer.once('finished', () => {
36
+ // console.log('audio sending finished');
37
+ // });
38
+ // // you may pause/resume/stop audio sending at any time
34
39
  // await waitFor({ interval: 3000 });
35
- // // you may interrupt audio sending at any time
40
+ // streamer.pause();
41
+ // await waitFor({ interval: 3000 });
42
+ // streamer.resume();
43
+ // await waitFor({ interval: 2000 });
36
44
  // streamer.stop();
37
45
 
38
46
  // either you or the peer hang up
@@ -34,10 +34,13 @@ const main = async () => {
34
34
  });
35
35
 
36
36
  // // send audio to remote peer
37
- // await waitFor({ interval: 2000 });
38
37
  // const streamer = callSession.streamAudio(fs.readFileSync('demos/test.raw'));
39
- // await waitFor({ interval: 3000 });
38
+ // // You may subscribe to the 'finished' event of the streamer to know when the audio sending is finished
39
+ // streamer.once('finished', () => {
40
+ // console.log('audio sending finished');
41
+ // });
40
42
  // // you may pause/resume/stop audio sending at any time
43
+ // await waitFor({ interval: 3000 });
41
44
  // streamer.pause();
42
45
  // await waitFor({ interval: 3000 });
43
46
  // streamer.resume();
@@ -36,10 +36,18 @@ const main = () => __awaiter(void 0, void 0, void 0, function* () {
36
36
  callSession.on('audioPacket', (rtpPacket) => {
37
37
  writeStream.write(rtpPacket.payload);
38
38
  });
39
- // // // send audio to remote peer
39
+ // // send audio to remote peer
40
40
  // const streamer = callSession.streamAudio(fs.readFileSync('demos/test.raw'));
41
+ // // You may subscribe to the 'finished' event of the streamer to know when the audio sending is finished
42
+ // streamer.once('finished', () => {
43
+ // console.log('audio sending finished');
44
+ // });
45
+ // // you may pause/resume/stop audio sending at any time
41
46
  // await waitFor({ interval: 3000 });
42
- // // you may interrupt audio sending at any time
47
+ // streamer.pause();
48
+ // await waitFor({ interval: 3000 });
49
+ // streamer.resume();
50
+ // await waitFor({ interval: 2000 });
43
51
  // streamer.stop();
44
52
  // either you or the peer hang up
45
53
  callSession.once('disposed', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"inbound-call.js","sourceRoot":"","sources":["../../demos/inbound-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AAGpB,iEAAyC;AACzC,wCAAwC;AAExC,MAAM,SAAS,GAAG,IAAI,mBAAS,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;IACtD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;CACpC,CAAC,CAAC;AACH,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC,yBAAyB;AAEtD,MAAM,IAAI,GAAG,GAAS,EAAE;IACtB,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC3B,sBAAsB;IACtB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAO,aAAa,EAAE,EAAE;QAC7C,mBAAmB;QACnB,qCAAqC;QACrC,0CAA0C;QAE1C,kBAAkB;QAClB,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAE1D,gBAAgB;QAChB,MAAM,WAAW,GAAG,YAAE,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAAC,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACtF,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,SAAoB,EAAE,EAAE;YACrD,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,kCAAkC;QAClC,+EAA+E;QAC/E,qCAAqC;QACrC,iDAAiD;QACjD,mBAAmB;QAEnB,iCAAiC;QACjC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;YAChC,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,qCAAqC;QACrC,6BAA6B;QAC7B,qCAAqC;QACrC,6BAA6B;QAE7B,sBAAsB;QACtB,qCAAqC;QACrC,wBAAwB;QAExB,uBAAuB;QACvB,qCAAqC;QACrC,sEAAsE;IACxE,CAAC,CAAA,CAAC,CAAC;AACL,CAAC,CAAA,CAAC;AACF,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"inbound-call.js","sourceRoot":"","sources":["../../demos/inbound-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AAGpB,iEAAyC;AACzC,wCAAwC;AAExC,MAAM,SAAS,GAAG,IAAI,mBAAS,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;IACtD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;CACpC,CAAC,CAAC;AACH,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC,yBAAyB;AAEtD,MAAM,IAAI,GAAG,GAAS,EAAE;IACtB,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC3B,sBAAsB;IACtB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAO,aAAa,EAAE,EAAE;QAC7C,mBAAmB;QACnB,qCAAqC;QACrC,0CAA0C;QAE1C,kBAAkB;QAClB,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAE1D,gBAAgB;QAChB,MAAM,WAAW,GAAG,YAAE,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAAC,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACtF,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,SAAoB,EAAE,EAAE;YACrD,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,+BAA+B;QAC/B,+EAA+E;QAC/E,0GAA0G;QAC1G,oCAAoC;QACpC,2CAA2C;QAC3C,MAAM;QACN,yDAAyD;QACzD,qCAAqC;QACrC,oBAAoB;QACpB,qCAAqC;QACrC,qBAAqB;QACrB,qCAAqC;QACrC,mBAAmB;QAEnB,iCAAiC;QACjC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;YAChC,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,qCAAqC;QACrC,6BAA6B;QAC7B,qCAAqC;QACrC,6BAA6B;QAE7B,sBAAsB;QACtB,qCAAqC;QACrC,wBAAwB;QAExB,uBAAuB;QACvB,qCAAqC;QACrC,sEAAsE;IACxE,CAAC,CAAA,CAAC,CAAC;AACL,CAAC,CAAA,CAAC;AACF,IAAI,EAAE,CAAC"}
@@ -39,10 +39,13 @@ const main = () => __awaiter(void 0, void 0, void 0, function* () {
39
39
  writeStream.close();
40
40
  });
41
41
  // // send audio to remote peer
42
- // await waitFor({ interval: 2000 });
43
42
  // const streamer = callSession.streamAudio(fs.readFileSync('demos/test.raw'));
44
- // await waitFor({ interval: 3000 });
43
+ // // You may subscribe to the 'finished' event of the streamer to know when the audio sending is finished
44
+ // streamer.once('finished', () => {
45
+ // console.log('audio sending finished');
46
+ // });
45
47
  // // you may pause/resume/stop audio sending at any time
48
+ // await waitFor({ interval: 3000 });
46
49
  // streamer.pause();
47
50
  // await waitFor({ interval: 3000 });
48
51
  // streamer.resume();
@@ -1 +1 @@
1
- {"version":3,"file":"outbound-call.js","sourceRoot":"","sources":["../../demos/outbound-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AAEpB,oEAAqC;AAErC,iEAAyC;AAEzC,MAAM,SAAS,GAAG,IAAI,mBAAS,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;IACtD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;CACpC,CAAC,CAAC;AACH,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC,yBAAyB;AAEtD,MAAM,IAAI,GAAG,GAAS,EAAE;IACtB,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC3B,MAAM,IAAA,wBAAO,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAClC,+FAA+F;IAC/F,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,CACtC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAmB,EAAE,EAAE,CAAC,CAE9C,CAAC;IAEF,0BAA0B;IAC1B,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAS,EAAE;QACtC,gBAAgB;QAChB,MAAM,WAAW,GAAG,YAAE,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAAC,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACtF,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,SAAoB,EAAE,EAAE;YACrD,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,iCAAiC;QACjC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;YAChC,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,+BAA+B;QAC/B,qCAAqC;QACrC,+EAA+E;QAC/E,qCAAqC;QACrC,yDAAyD;QACzD,oBAAoB;QACpB,qCAAqC;QACrC,qBAAqB;QACrB,qCAAqC;QACrC,mBAAmB;QAEnB,eAAe;QACf,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,qCAAqC;QACrC,6BAA6B;QAC7B,qCAAqC;QACrC,6BAA6B;QAE7B,sBAAsB;QACtB,qCAAqC;QACrC,wBAAwB;QAExB,uBAAuB;QACvB,qCAAqC;QACrC,sEAAsE;IACxE,CAAC,CAAA,CAAC,CAAC;IAEH,+CAA+C;IAC/C,qCAAqC;IACrC,wBAAwB;AAC1B,CAAC,CAAA,CAAC;AACF,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"outbound-call.js","sourceRoot":"","sources":["../../demos/outbound-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AAEpB,oEAAqC;AAErC,iEAAyC;AAEzC,MAAM,SAAS,GAAG,IAAI,mBAAS,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;IACtD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;CACpC,CAAC,CAAC;AACH,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC,yBAAyB;AAEtD,MAAM,IAAI,GAAG,GAAS,EAAE;IACtB,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC3B,MAAM,IAAA,wBAAO,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAClC,+FAA+F;IAC/F,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,CACtC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAmB,EAAE,EAAE,CAAC,CAE9C,CAAC;IAEF,0BAA0B;IAC1B,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAS,EAAE;QACtC,gBAAgB;QAChB,MAAM,WAAW,GAAG,YAAE,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAAC,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACtF,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,SAAoB,EAAE,EAAE;YACrD,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,iCAAiC;QACjC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;YAChC,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,+BAA+B;QAC/B,+EAA+E;QAC/E,0GAA0G;QAC1G,oCAAoC;QACpC,2CAA2C;QAC3C,MAAM;QACN,yDAAyD;QACzD,qCAAqC;QACrC,oBAAoB;QACpB,qCAAqC;QACrC,qBAAqB;QACrB,qCAAqC;QACrC,mBAAmB;QAEnB,eAAe;QACf,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,qCAAqC;QACrC,6BAA6B;QAC7B,qCAAqC;QACrC,6BAA6B;QAE7B,sBAAsB;QACtB,qCAAqC;QACrC,wBAAwB;QAExB,uBAAuB;QACvB,qCAAqC;QACrC,sEAAsE;IACxE,CAAC,CAAA,CAAC,CAAC;IAEH,+CAA+C;IAC/C,qCAAqC;IACrC,wBAAwB;AAC1B,CAAC,CAAA,CAAC;AACF,IAAI,EAAE,CAAC"}
@@ -1,5 +1,6 @@
1
+ import EventEmitter from 'events';
1
2
  import type CallSession from '.';
2
- declare class Streamer {
3
+ declare class Streamer extends EventEmitter {
3
4
  paused: boolean;
4
5
  private callSession;
5
6
  private buffer;
@@ -8,11 +8,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
15
  const werift_rtp_1 = require("werift-rtp");
16
+ const events_1 = __importDefault(require("events"));
13
17
  const utils_1 = require("../utils");
14
- class Streamer {
18
+ class Streamer extends events_1.default {
15
19
  constructor(callSesstion, buffer) {
20
+ super();
16
21
  this.paused = false;
17
22
  this.sequenceNumber = (0, utils_1.randomInt)();
18
23
  this.timestamp = (0, utils_1.randomInt)();
@@ -50,7 +55,6 @@ class Streamer {
50
55
  sendPacket() {
51
56
  if (!this.callSession.disposed && !this.paused && !this.finished) {
52
57
  const temp = this.buffer.subarray(0, 160);
53
- this.buffer = this.buffer.subarray(160);
54
58
  const rtpPacket = new werift_rtp_1.RtpPacket(new werift_rtp_1.RtpHeader({
55
59
  version: 2,
56
60
  padding: false,
@@ -74,7 +78,13 @@ class Streamer {
74
78
  this.sequenceNumber = 0;
75
79
  }
76
80
  this.timestamp += 160; // inbound audio use this time interval, in my opinion, it should be 20
77
- setTimeout(() => this.sendPacket(), 20);
81
+ this.buffer = this.buffer.subarray(160);
82
+ if (this.finished) {
83
+ this.emit('finished');
84
+ }
85
+ else {
86
+ setTimeout(() => this.sendPacket(), 20);
87
+ }
78
88
  }
79
89
  }
80
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"streamer.js","sourceRoot":"","sources":["../../../src/call-session/streamer.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,2CAAkD;AAGlD,oCAAqC;AAErC,MAAM,QAAQ;IASZ,YAAmB,YAAyB,EAAE,MAAc;QARrD,WAAM,GAAG,KAAK,CAAC;QAId,mBAAc,GAAG,IAAA,iBAAS,GAAE,CAAC;QAC7B,cAAS,GAAG,IAAA,iBAAS,GAAE,CAAC;QACxB,SAAI,GAAG,IAAA,iBAAS,GAAE,CAAC;QAGzB,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;IAC/B,CAAC;IAEY,KAAK;;YAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;YAClC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;KAAA;IAEY,IAAI;;YACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;KAAA;IAEY,KAAK;;YAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;KAAA;IAEY,MAAM;;YACjB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;KAAA;IAED,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;IAClC,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,IAAI,sBAAS,CAC7B,IAAI,sBAAS,CAAC;gBACZ,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,KAAK;gBAChB,MAAM,EAAE,KAAK;gBACb,aAAa,EAAE,EAAE;gBACjB,WAAW,EAAE,CAAC;gBACd,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,UAAU,EAAE,CAAC;gBACb,IAAI,EAAE,EAAE;gBACR,gBAAgB,EAAE,KAAK;gBACvB,eAAe,EAAE,SAAS;gBAC1B,UAAU,EAAE,EAAE;aACf,CAAC,EACF,IAAI,CACL,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;YACzB,IAAI,IAAI,CAAC,cAAc,GAAG,KAAK,EAAE,CAAC;gBAChC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;YAC1B,CAAC;YACD,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC,uEAAuE;YAC9F,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;CACF;AAED,kBAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"streamer.js","sourceRoot":"","sources":["../../../src/call-session/streamer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ringcentral-softphone",
3
- "version": "0.11.5",
3
+ "version": "0.12.0",
4
4
  "homepage": "https://github.com/ringcentral/ringcentral-softphone-ts",
5
5
  "license": "MIT",
6
6
  "main": "dist/src/softphone.js",
@@ -12,24 +12,24 @@
12
12
  "prepublishOnly": "rm -rf *.raw && rm -rf dist && yarn tsc"
13
13
  },
14
14
  "dependencies": {
15
- "@rc-ex/core": "^1.4.0",
16
- "wait-for-async": "^0.6.1",
15
+ "@rc-ex/core": "^1.4.2",
16
+ "wait-for-async": "^0.7.0",
17
17
  "werift-rtp": "^0.8.1"
18
18
  },
19
19
  "devDependencies": {
20
- "@types/node": "^22.4.1",
21
- "@typescript-eslint/eslint-plugin": "^8.2.0",
22
- "@typescript-eslint/parser": "^8.2.0",
20
+ "@types/node": "^22.7.9",
21
+ "@typescript-eslint/eslint-plugin": "^8.11.0",
22
+ "@typescript-eslint/parser": "^8.11.0",
23
23
  "dotenv-override-true": "^6.2.2",
24
24
  "eslint": "^8.57.0",
25
25
  "eslint-config-alloy": "^5.1.2",
26
26
  "eslint-config-prettier": "^9.1.0",
27
27
  "eslint-plugin-prettier": "^5.2.1",
28
28
  "prettier": "^3.3.3",
29
- "sort-package-json": "^2.10.0",
30
- "tsx": "^4.17.0",
31
- "ttpt": "^0.11.1",
32
- "typescript": "^5.5.4",
29
+ "sort-package-json": "^2.10.1",
30
+ "tsx": "^4.19.1",
31
+ "ttpt": "^0.12.6",
32
+ "typescript": "^5.6.3",
33
33
  "yarn-upgrade-all": "^0.7.4"
34
34
  },
35
35
  "yarn-upgrade-all": {
@@ -1,9 +1,10 @@
1
1
  import { RtpHeader, RtpPacket } from 'werift-rtp';
2
+ import EventEmitter from 'events';
2
3
 
3
4
  import type CallSession from '.';
4
5
  import { randomInt } from '../utils';
5
6
 
6
- class Streamer {
7
+ class Streamer extends EventEmitter {
7
8
  public paused = false;
8
9
  private callSession: CallSession;
9
10
  private buffer: Buffer;
@@ -13,6 +14,7 @@ class Streamer {
13
14
  private ssrc = randomInt();
14
15
 
15
16
  public constructor(callSesstion: CallSession, buffer: Buffer) {
17
+ super();
16
18
  this.callSession = callSesstion;
17
19
  this.buffer = buffer;
18
20
  this.originalBuffer = buffer;
@@ -44,7 +46,6 @@ class Streamer {
44
46
  private sendPacket() {
45
47
  if (!this.callSession.disposed && !this.paused && !this.finished) {
46
48
  const temp = this.buffer.subarray(0, 160);
47
- this.buffer = this.buffer.subarray(160);
48
49
  const rtpPacket = new RtpPacket(
49
50
  new RtpHeader({
50
51
  version: 2,
@@ -71,7 +72,12 @@ class Streamer {
71
72
  this.sequenceNumber = 0;
72
73
  }
73
74
  this.timestamp += 160; // inbound audio use this time interval, in my opinion, it should be 20
74
- setTimeout(() => this.sendPacket(), 20);
75
+ this.buffer = this.buffer.subarray(160);
76
+ if (this.finished) {
77
+ this.emit('finished');
78
+ } else {
79
+ setTimeout(() => this.sendPacket(), 20);
80
+ }
75
81
  }
76
82
  }
77
83
  }