ringcentral-softphone 0.12.0 → 0.12.1
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/.prettierignore +0 -1
- package/demos/inbound-call.ts +5 -1
- package/demos/outbound-call.ts +5 -2
- package/dist/demos/inbound-call.js +3 -1
- package/dist/demos/inbound-call.js.map +1 -1
- package/dist/demos/outbound-call.js +3 -1
- package/dist/demos/outbound-call.js.map +1 -1
- package/dist/src/call-session/inbound.d.ts +1 -1
- package/dist/src/call-session/inbound.js +1 -1
- package/dist/src/call-session/inbound.js.map +1 -1
- package/dist/src/call-session/index.d.ts +1 -1
- package/dist/src/call-session/index.js +2 -2
- package/dist/src/call-session/index.js.map +1 -1
- package/dist/src/call-session/outbound.d.ts +1 -1
- package/dist/src/call-session/outbound.js +3 -2
- package/dist/src/call-session/outbound.js.map +1 -1
- package/dist/src/call-session/streamer.js +1 -1
- package/dist/src/call-session/streamer.js.map +1 -1
- package/dist/src/dtmf.js +17 -2
- package/dist/src/dtmf.js.map +1 -1
- package/dist/src/sip-message/inbound/index.js.map +1 -1
- package/dist/src/sip-message/outbound/request.js.map +1 -1
- package/dist/src/sip-message/outbound/response.js +0 -1
- package/dist/src/sip-message/outbound/response.js.map +1 -1
- package/dist/src/softphone.d.ts +3 -3
- package/dist/src/softphone.js +9 -5
- package/dist/src/softphone.js.map +1 -1
- package/dist/src/utils.js.map +1 -1
- package/dist/test/index.spec.d.ts +1 -0
- package/dist/test/index.spec.js +7 -0
- package/dist/test/index.spec.js.map +1 -0
- package/eslint.config.mjs +5 -0
- package/package.json +10 -19
- package/prettier.config.mjs +3 -0
- package/src/call-session/inbound.ts +2 -2
- package/src/call-session/index.ts +35 -19
- package/src/call-session/outbound.ts +25 -16
- package/src/call-session/streamer.ts +2 -1
- package/src/dtmf.ts +17 -2
- package/src/sip-message/inbound/index.ts +3 -1
- package/src/sip-message/outbound/request.ts +9 -2
- package/src/sip-message/outbound/response.ts +7 -3
- package/src/softphone.ts +35 -16
- package/src/utils.ts +22 -6
- package/test/index.spec.ts +5 -0
- package/.eslintignore +0 -2
- package/.eslintrc.js +0 -9
- package/.prettierrc.js +0 -3
package/.prettierignore
CHANGED
package/demos/inbound-call.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
|
+
|
|
2
3
|
import type { RtpPacket } from 'werift-rtp';
|
|
3
4
|
|
|
4
5
|
import Softphone from '../src/softphone';
|
|
6
|
+
|
|
5
7
|
// import waitFor from 'wait-for-async';
|
|
6
8
|
|
|
7
9
|
const softphone = new Softphone({
|
|
@@ -24,7 +26,9 @@ const main = async () => {
|
|
|
24
26
|
const callSession = await softphone.answer(inviteMessage);
|
|
25
27
|
|
|
26
28
|
// receive audio
|
|
27
|
-
const writeStream = fs.createWriteStream(`${callSession.callId}.raw`, {
|
|
29
|
+
const writeStream = fs.createWriteStream(`${callSession.callId}.raw`, {
|
|
30
|
+
flags: 'a',
|
|
31
|
+
});
|
|
28
32
|
callSession.on('audioPacket', (rtpPacket: RtpPacket) => {
|
|
29
33
|
writeStream.write(rtpPacket.payload);
|
|
30
34
|
});
|
package/demos/outbound-call.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
import waitFor from 'wait-for-async';
|
|
4
|
+
import type { RtpPacket } from 'werift-rtp';
|
|
4
5
|
|
|
5
6
|
import Softphone from '../src/softphone';
|
|
6
7
|
|
|
@@ -24,7 +25,9 @@ const main = async () => {
|
|
|
24
25
|
// callee answers the call
|
|
25
26
|
callSession.once('answered', async () => {
|
|
26
27
|
// receive audio
|
|
27
|
-
const writeStream = fs.createWriteStream(`${callSession.callId}.raw`, {
|
|
28
|
+
const writeStream = fs.createWriteStream(`${callSession.callId}.raw`, {
|
|
29
|
+
flags: 'a',
|
|
30
|
+
});
|
|
28
31
|
callSession.on('audioPacket', (rtpPacket: RtpPacket) => {
|
|
29
32
|
writeStream.write(rtpPacket.payload);
|
|
30
33
|
});
|
|
@@ -32,7 +32,9 @@ const main = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
32
32
|
// answer the call
|
|
33
33
|
const callSession = yield softphone.answer(inviteMessage);
|
|
34
34
|
// receive audio
|
|
35
|
-
const writeStream = fs_1.default.createWriteStream(`${callSession.callId}.raw`, {
|
|
35
|
+
const writeStream = fs_1.default.createWriteStream(`${callSession.callId}.raw`, {
|
|
36
|
+
flags: 'a',
|
|
37
|
+
});
|
|
36
38
|
callSession.on('audioPacket', (rtpPacket) => {
|
|
37
39
|
writeStream.write(rtpPacket.payload);
|
|
38
40
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbound-call.js","sourceRoot":"","sources":["../../demos/inbound-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;
|
|
1
|
+
{"version":3,"file":"inbound-call.js","sourceRoot":"","sources":["../../demos/inbound-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AAIpB,iEAAyC;AAEzC,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;YACpE,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;QACH,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"}
|
|
@@ -30,7 +30,9 @@ const main = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
30
30
|
// callee answers the call
|
|
31
31
|
callSession.once('answered', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
32
32
|
// receive audio
|
|
33
|
-
const writeStream = fs_1.default.createWriteStream(`${callSession.callId}.raw`, {
|
|
33
|
+
const writeStream = fs_1.default.createWriteStream(`${callSession.callId}.raw`, {
|
|
34
|
+
flags: 'a',
|
|
35
|
+
});
|
|
34
36
|
callSession.on('audioPacket', (rtpPacket) => {
|
|
35
37
|
writeStream.write(rtpPacket.payload);
|
|
36
38
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbound-call.js","sourceRoot":"","sources":["../../demos/outbound-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AAEpB,oEAAqC;
|
|
1
|
+
{"version":3,"file":"outbound-call.js","sourceRoot":"","sources":["../../demos/outbound-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AAEpB,oEAAqC;AAGrC,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;YACpE,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;QACH,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,6 +1,6 @@
|
|
|
1
|
+
import CallSession from '.';
|
|
1
2
|
import { type InboundMessage } from '../sip-message';
|
|
2
3
|
import type Softphone from '../softphone';
|
|
3
|
-
import CallSession from '.';
|
|
4
4
|
declare class InboundCallSession extends CallSession {
|
|
5
5
|
constructor(softphone: Softphone, inviteMessage: InboundMessage);
|
|
6
6
|
answer(): Promise<void>;
|
|
@@ -12,9 +12,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const _1 = __importDefault(require("."));
|
|
15
16
|
const sip_message_1 = require("../sip-message");
|
|
16
17
|
const utils_1 = require("../utils");
|
|
17
|
-
const _1 = __importDefault(require("."));
|
|
18
18
|
class InboundCallSession extends _1.default {
|
|
19
19
|
constructor(softphone, inviteMessage) {
|
|
20
20
|
super(softphone, inviteMessage);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbound.js","sourceRoot":"","sources":["../../../src/call-session/inbound.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,gDAAsE;
|
|
1
|
+
{"version":3,"file":"inbound.js","sourceRoot":"","sources":["../../../src/call-session/inbound.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,yCAA4B;AAC5B,gDAAsE;AAEtE,oCAAqC;AAErC,MAAM,kBAAmB,SAAQ,UAAW;IAC1C,YAAmB,SAAoB,EAAE,aAA6B;QACpE,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/C,CAAC;IAEY,MAAM;;YACjB,MAAM,SAAS,GAAG;;MAEhB,IAAA,iBAAS,GAAE;;;;UAIP,IAAA,iBAAS,GAAE;;;;;CAKpB,CAAC,IAAI,EAAE,CAAC;YACL,MAAM,UAAU,GAAG,IAAI,6BAAe,CACpC,IAAI,CAAC,UAAU,EACf,GAAG,EACH;gBACE,cAAc,EAAE,iBAAiB;aAClC,EACD,SAAS,CACV,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAEhC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;KAAA;CACF;AAED,kBAAe,kBAAkB,CAAC"}
|
|
@@ -12,12 +12,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const events_1 = __importDefault(require("events"));
|
|
16
15
|
const dgram_1 = __importDefault(require("dgram"));
|
|
16
|
+
const events_1 = __importDefault(require("events"));
|
|
17
17
|
const werift_rtp_1 = require("werift-rtp");
|
|
18
|
+
const dtmf_1 = __importDefault(require("../dtmf"));
|
|
18
19
|
const sip_message_1 = require("../sip-message");
|
|
19
20
|
const utils_1 = require("../utils");
|
|
20
|
-
const dtmf_1 = __importDefault(require("../dtmf"));
|
|
21
21
|
const streamer_1 = __importDefault(require("./streamer"));
|
|
22
22
|
class CallSession extends events_1.default {
|
|
23
23
|
constructor(softphone, sipMessage) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/call-session/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/call-session/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import CallSession from '.';
|
|
1
2
|
import { type InboundMessage } from '../sip-message';
|
|
2
3
|
import type Softphone from '../softphone';
|
|
3
|
-
import CallSession from '.';
|
|
4
4
|
declare class OutboundCallSession extends CallSession {
|
|
5
5
|
constructor(softphone: Softphone, answerMessage: InboundMessage);
|
|
6
6
|
init(): Promise<void>;
|
|
@@ -12,8 +12,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const sip_message_1 = require("../sip-message");
|
|
16
15
|
const _1 = __importDefault(require("."));
|
|
16
|
+
const sip_message_1 = require("../sip-message");
|
|
17
17
|
const utils_1 = require("../utils");
|
|
18
18
|
class OutboundCallSession extends _1.default {
|
|
19
19
|
constructor(softphone, answerMessage) {
|
|
@@ -26,7 +26,8 @@ class OutboundCallSession extends _1.default {
|
|
|
26
26
|
return __awaiter(this, void 0, void 0, function* () {
|
|
27
27
|
// wait for user to answer the call
|
|
28
28
|
const answerHandler = (message) => {
|
|
29
|
-
if (message.headers.CSeq === this.sipMessage.headers.CSeq
|
|
29
|
+
if (message.headers.CSeq === this.sipMessage.headers.CSeq &&
|
|
30
|
+
message.subject.startsWith('SIP/2.0 200')) {
|
|
30
31
|
this.softphone.off('message', answerHandler);
|
|
31
32
|
this.emit('answered');
|
|
32
33
|
const ackMessage = new sip_message_1.RequestMessage(`ACK ${(0, utils_1.extractAddress)(this.remotePeer)} SIP/2.0`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../../src/call-session/outbound.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,gDAAqE;AAErE,
|
|
1
|
+
{"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../../src/call-session/outbound.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,yCAA4B;AAC5B,gDAAqE;AAErE,oCAAsD;AAEtD,MAAM,mBAAoB,SAAQ,UAAW;IAC3C,YAAmB,SAAoB,EAAE,aAA6B;QACpE,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEY,IAAI;;YACf,mCAAmC;YACnC,MAAM,aAAa,GAAG,CAAC,OAAuB,EAAE,EAAE;gBAChD,IACE,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI;oBACrD,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EACzC,CAAC;oBACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;oBAC7C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAEtB,MAAM,UAAU,GAAG,IAAI,4BAAc,CACnC,OAAO,IAAA,sBAAc,EAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAChD;wBACE,SAAS,EAAE,IAAI,CAAC,MAAM;wBACtB,IAAI,EAAE,IAAI,CAAC,SAAS;wBACpB,EAAE,EAAE,IAAI,CAAC,UAAU;wBACnB,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG;wBAChC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;qBAC9D,CACF,CAAC;oBACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAS,EAAE,gDAAC,OAAA,IAAI,CAAC,kBAAkB,EAAE,CAAA,GAAA,CAAC,CAAC;QAC/D,CAAC;KAAA;IAEY,MAAM;;YACjB,MAAM,cAAc,GAAG,IAAI,4BAAc,CACvC,UAAU,IAAA,sBAAc,EAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EACnD;gBACE,SAAS,EAAE,IAAI,CAAC,MAAM;gBACtB,IAAI,EAAE,IAAI,CAAC,SAAS;gBACpB,EAAE,EAAE,IAAA,kBAAU,EAAC,IAAI,CAAC,UAAU,CAAC;gBAC/B,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG;gBAChC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;aACjE,CACF,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtC,CAAC;KAAA;CACF;AAED,kBAAe,mBAAmB,CAAC"}
|
|
@@ -12,8 +12,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const werift_rtp_1 = require("werift-rtp");
|
|
16
15
|
const events_1 = __importDefault(require("events"));
|
|
16
|
+
const werift_rtp_1 = require("werift-rtp");
|
|
17
17
|
const utils_1 = require("../utils");
|
|
18
18
|
class Streamer extends events_1.default {
|
|
19
19
|
constructor(callSesstion, buffer) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamer.js","sourceRoot":"","sources":["../../../src/call-session/streamer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"streamer.js","sourceRoot":"","sources":["../../../src/call-session/streamer.ts"],"names":[],"mappings":"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"}
|
package/dist/src/dtmf.js
CHANGED
|
@@ -2,8 +2,23 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
class DTMF {
|
|
4
4
|
}
|
|
5
|
-
DTMF.phoneChars = [
|
|
6
|
-
|
|
5
|
+
DTMF.phoneChars = [
|
|
6
|
+
'0',
|
|
7
|
+
'1',
|
|
8
|
+
'2',
|
|
9
|
+
'3',
|
|
10
|
+
'4',
|
|
11
|
+
'5',
|
|
12
|
+
'6',
|
|
13
|
+
'7',
|
|
14
|
+
'8',
|
|
15
|
+
'9',
|
|
16
|
+
'*',
|
|
17
|
+
'#',
|
|
18
|
+
];
|
|
19
|
+
DTMF.payloads = [
|
|
20
|
+
0x00060000, 0x000600a0, 0x00060140, 0x00860320, 0x00860320, 0x00860320,
|
|
21
|
+
];
|
|
7
22
|
DTMF.charToPayloads = (char) => {
|
|
8
23
|
const index = DTMF.phoneChars.indexOf(char[0]);
|
|
9
24
|
if (index === -1) {
|
package/dist/src/dtmf.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dtmf.js","sourceRoot":"","sources":["../../src/dtmf.ts"],"names":[],"mappings":";;AAAA,MAAM,IAAI;;AACe,eAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"dtmf.js","sourceRoot":"","sources":["../../src/dtmf.ts"],"names":[],"mappings":";;AAAA,MAAM,IAAI;;AACe,eAAU,GAAG;IAClC,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;CACJ,CAAC;AACsB,aAAQ,GAAG;IACjC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;CACvE,CAAC;AAEY,mBAAc,GAAG,CAAC,IAAY,EAAE,EAAE;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEY,kBAAa,GAAG,CAAC,OAAe,EAAE,EAAE;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;IAChD,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC,CAAC;AAGJ,kBAAe,IAAI,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sip-message/inbound/index.ts"],"names":[],"mappings":";;;;;AAAA,uCAAmC;AACnC,iEAAwC;AAExC,MAAM,cAAe,SAAQ,qBAAU;IAC9B,MAAM,CAAC,UAAU,CAAC,GAAW;QAClC,MAAM,UAAU,GAAG,IAAI,qBAAU,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9C,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7B,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sip-message/inbound/index.ts"],"names":[],"mappings":";;;;;AAAA,uCAAmC;AACnC,iEAAwC;AAExC,MAAM,cAAe,SAAQ,qBAAU;IAC9B,MAAM,CAAC,UAAU,CAAC,GAAW;QAClC,MAAM,UAAU,GAAG,IAAI,qBAAU,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9C,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7B,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CACrC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CACxC,CAAC;QACF,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtE,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,GAAG,IAAA,YAAI,GAAE,CAAC,CAAC,qBAAqB;QAClE,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AAED,kBAAe,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../../../src/sip-message/outbound/request.ts"],"names":[],"mappings":";;;;;AAAA,yCAAgC;AAChC,uCAAqC;AAErC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;AAE7C,MAAM,cAAe,SAAQ,UAAe;IAC1C,YAAmB,OAAO,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE;QACtD,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,CAAC;IAEM,IAAI;QACT,MAAM,UAAU,GAAG,IAAI,cAAc,
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../../../src/sip-message/outbound/request.ts"],"names":[],"mappings":";;;;;AAAA,yCAAgC;AAChC,uCAAqC;AAErC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;AAE7C,MAAM,cAAe,SAAQ,UAAe;IAC1C,YAAmB,OAAO,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE;QACtD,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,CAAC;IAEM,IAAI;QACT,MAAM,UAAU,GAAG,IAAI,cAAc,CACnC,IAAI,CAAC,OAAO,oBACP,IAAI,CAAC,OAAO,GACjB,IAAI,CAAC,IAAI,CACV,CAAC;QACF,UAAU,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC3B,UAAU,CAAC,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CACrD,cAAc,EACd,WAAW,IAAA,cAAM,GAAE,EAAE,CACtB,CAAC;QACJ,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AAED,kBAAe,cAAc,CAAC"}
|
|
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const _1 = __importDefault(require("."));
|
|
7
7
|
const response_codes_1 = __importDefault(require("../response-codes"));
|
|
8
8
|
class ResponseMessage extends _1.default {
|
|
9
|
-
// eslint-disable-next-line max-params
|
|
10
9
|
constructor(inboundMessage, responseCode, headers = {}, body = '') {
|
|
11
10
|
super(undefined, Object.assign({}, headers), body);
|
|
12
11
|
this.subject = `SIP/2.0 ${responseCode} ${response_codes_1.default[responseCode]}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../../src/sip-message/outbound/response.ts"],"names":[],"mappings":";;;;;AAAA,yCAAgC;
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../../src/sip-message/outbound/response.ts"],"names":[],"mappings":";;;;;AAAA,yCAAgC;AAEhC,uEAA8C;AAE9C,MAAM,eAAgB,SAAQ,UAAe;IAC3C,YACE,cAA8B,EAC9B,YAAoB,EACpB,OAAO,GAAG,EAAE,EACZ,IAAI,GAAG,EAAE;QAET,KAAK,CAAC,SAAS,oBAAO,OAAO,GAAI,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,WAAW,YAAY,IAAI,wBAAa,CAAC,YAAY,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,kBAAe,eAAe,CAAC"}
|
package/dist/src/softphone.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type SipInfoResponse from '@rc-ex/core/lib/definitions/SipInfoResponse';
|
|
2
1
|
import EventEmitter from 'events';
|
|
3
2
|
import net from 'net';
|
|
4
|
-
import type
|
|
5
|
-
import { InboundMessage } from './sip-message';
|
|
3
|
+
import type SipInfoResponse from '@rc-ex/core/lib/definitions/SipInfoResponse';
|
|
6
4
|
import InboundCallSession from './call-session/inbound';
|
|
7
5
|
import OutboundCallSession from './call-session/outbound';
|
|
6
|
+
import type { OutboundMessage } from './sip-message';
|
|
7
|
+
import { InboundMessage } from './sip-message';
|
|
8
8
|
declare class Softphone extends EventEmitter {
|
|
9
9
|
sipInfo: SipInfoResponse;
|
|
10
10
|
client: net.Socket;
|
package/dist/src/softphone.js
CHANGED
|
@@ -15,10 +15,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
const events_1 = __importDefault(require("events"));
|
|
16
16
|
const net_1 = __importDefault(require("net"));
|
|
17
17
|
const wait_for_async_1 = __importDefault(require("wait-for-async"));
|
|
18
|
-
const sip_message_1 = require("./sip-message");
|
|
19
|
-
const utils_1 = require("./utils");
|
|
20
18
|
const inbound_1 = __importDefault(require("./call-session/inbound"));
|
|
21
19
|
const outbound_1 = __importDefault(require("./call-session/outbound"));
|
|
20
|
+
const sip_message_1 = require("./sip-message");
|
|
21
|
+
const utils_1 = require("./utils");
|
|
22
22
|
class Softphone extends events_1.default {
|
|
23
23
|
constructor(sipInfo) {
|
|
24
24
|
super();
|
|
@@ -44,7 +44,9 @@ class Softphone extends events_1.default {
|
|
|
44
44
|
return; // haven't received a complete message yet
|
|
45
45
|
}
|
|
46
46
|
// received two empty body messages
|
|
47
|
-
const tempMessages = cache
|
|
47
|
+
const tempMessages = cache
|
|
48
|
+
.split('\r\nContent-Length: 0\r\n\r\n')
|
|
49
|
+
.filter((message) => message.trim() !== '');
|
|
48
50
|
cache = '';
|
|
49
51
|
for (let i = 0; i < tempMessages.length; i++) {
|
|
50
52
|
if (!tempMessages[i].includes('Content-Length: ')) {
|
|
@@ -74,7 +76,8 @@ class Softphone extends events_1.default {
|
|
|
74
76
|
// sometimes the server will return 200 OK directly
|
|
75
77
|
return;
|
|
76
78
|
}
|
|
77
|
-
const wwwAuth = inboundMessage.headers['Www-Authenticate'] ||
|
|
79
|
+
const wwwAuth = inboundMessage.headers['Www-Authenticate'] ||
|
|
80
|
+
inboundMessage.headers['WWW-Authenticate'];
|
|
78
81
|
const nonce = wwwAuth.match(/, nonce="(.+?)"/)[1];
|
|
79
82
|
const newMessage = requestMessage.fork();
|
|
80
83
|
newMessage.headers.Authorization = (0, utils_1.generateAuthorization)(this.sipInfo, nonce, 'REGISTER');
|
|
@@ -168,7 +171,8 @@ a=sendrecv
|
|
|
168
171
|
'Content-Type': 'application/sdp',
|
|
169
172
|
}, offerSDP);
|
|
170
173
|
if (callerId) {
|
|
171
|
-
inviteMessage.headers['P-Asserted-Identity'] =
|
|
174
|
+
inviteMessage.headers['P-Asserted-Identity'] =
|
|
175
|
+
`sip:${callerId}@${this.sipInfo.domain}`;
|
|
172
176
|
}
|
|
173
177
|
const inboundMessage = yield this.send(inviteMessage, true);
|
|
174
178
|
const proxyAuthenticate = inboundMessage.headers['Proxy-Authenticate'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"softphone.js","sourceRoot":"","sources":["../../src/softphone.ts"],"names":[],"mappings":";;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"softphone.js","sourceRoot":"","sources":["../../src/softphone.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,8CAAsB;AAGtB,oEAAqC;AAErC,qEAAwD;AACxD,uEAA0D;AAE1D,+CAAgF;AAChF,mCAAyE;AAEzE,MAAM,SAAU,SAAQ,gBAAY;IAUlC,YAAmB,OAAwB;QACzC,KAAK,EAAE,CAAC;QAPH,eAAU,GAAG,IAAA,YAAI,GAAE,GAAG,UAAU,CAAC;QACjC,cAAS,GAAG,IAAA,YAAI,GAAE,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;QAG1C,cAAS,GAAG,KAAK,CAAC;QAIxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,qBAAqB,CAAC;QAC9C,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,kCAAkC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,aAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE;YAC3D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,0CAA0C;YACpD,CAAC;YACD,mCAAmC;YACnC,MAAM,YAAY,GAAG,KAAK;iBACvB,KAAK,CAAC,+BAA+B,CAAC;iBACtC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9C,KAAK,GAAG,EAAE,CAAC;YACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAClD,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,uBAAuB,CAAC;gBAC9D,CAAC;YACH,CAAC;YACD,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,4BAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEY,QAAQ;;YACnB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,IAAA,wBAAO,EAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,WAAW,GAAG,GAAS,EAAE;gBAC7B,MAAM,cAAc,GAAG,IAAI,4BAAc,CACvC,gBAAgB,IAAI,CAAC,OAAO,CAAC,MAAM,UAAU,EAC7C;oBACE,SAAS,EAAE,IAAA,YAAI,GAAE;oBACjB,OAAO,EAAE,QAAQ,IAAI,CAAC,SAAS,6BAA6B;oBAC5D,IAAI,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,SAAS,IAAA,YAAI,GAAE,EAAE;oBAC3E,EAAE,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG;oBAC3D,GAAG,EAAE,eAAe,IAAI,CAAC,UAAU,WAAW,IAAA,cAAM,GAAE,EAAE;iBACzD,CACF,CAAC;gBACF,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;gBAC7D,IAAI,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;oBACtD,mDAAmD;oBACnD,OAAO;gBACT,CAAC;gBACD,MAAM,OAAO,GACX,cAAc,CAAC,OAAO,CAAC,kBAAkB,CAAC;oBAC1C,cAAe,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;gBAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAE,CAAC,CAAC,CAAC,CAAC;gBACnD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;gBACzC,UAAU,CAAC,OAAO,CAAC,aAAa,GAAG,IAAA,6BAAqB,EACtD,IAAI,CAAC,OAAO,EACZ,KAAK,EACL,UAAU,CACX,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC,CAAA,CAAC;YACF,WAAW,EAAE,CAAC;YACd,IAAI,CAAC,cAAc,GAAG,WAAW,CAC/B,GAAG,EAAE;gBACH,WAAW,EAAE,CAAC;YAChB,CAAC,EACD,CAAC,GAAG,EAAE,GAAG,IAAI,CACd,CAAC;YACF,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,EAAE;gBACpC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;oBACtD,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;IAEY,eAAe;;YAC1B,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAC7B,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAClE,CAAC;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;gBACrD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC,CAAC;QACJ,CAAC;KAAA;IAEY,MAAM;;YACjB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACxB,CAAC;KAAA;IAEM,IAAI,CAAC,OAAwB,EAAE,YAAY,GAAG,KAAK;QACxD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;gBACxC,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,EAAE;YAC7C,MAAM,gBAAgB,GAAG,CAAC,cAA8B,EAAE,EAAE;gBAC1D,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;oBACzD,OAAO;gBACT,CAAC;gBACD,IAAI,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;oBACtD,OAAO,CAAC,SAAS;gBACnB,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;gBACtC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC1B,CAAC,CAAC;YACF,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAEY,MAAM,CAAC,aAA6B;;YAC/C,MAAM,kBAAkB,GAAG,IAAI,iBAAkB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YACvE,MAAM,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO,kBAAkB,CAAC;QAC5B,CAAC;KAAA;IAED,0BAA0B;IACb,OAAO,CAAC,aAA6B;;YAChD,MAAM,UAAU,GAAG,IAAI,6BAAe,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;KAAA;IAEY,IAAI,CAAC,MAAc,EAAE,QAAiB;;YACjD,MAAM,QAAQ,GAAG;;MAEf,IAAA,iBAAS,GAAE;;;;UAIP,IAAA,iBAAS,GAAE;;;;;GAKlB,CAAC,IAAI,EAAE,CAAC;YACP,MAAM,aAAa,GAAG,IAAI,4BAAc,CACtC,cAAc,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,UAAU,EACrD;gBACE,SAAS,EAAE,IAAA,YAAI,GAAE;gBACjB,OAAO,EAAE,QAAQ,IAAI,CAAC,SAAS,6BAA6B;gBAC5D,IAAI,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,SAAS,IAAA,YAAI,GAAE,EAAE;gBAC3E,EAAE,EAAE,QAAQ,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG;gBAC5C,GAAG,EAAE,eAAe,IAAI,CAAC,UAAU,WAAW,IAAA,cAAM,GAAE,EAAE;gBACxD,cAAc,EAAE,iBAAiB;aAClC,EACD,QAAQ,CACT,CAAC;YACF,IAAI,QAAQ,EAAE,CAAC;gBACb,aAAa,CAAC,OAAO,CAAC,qBAAqB,CAAC;oBAC1C,OAAO,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC7C,CAAC;YACD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAC5D,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,iBAAiB,CAAE,CAAC,CAAC,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;YACxC,UAAU,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAA,6BAAqB,EAC/D,IAAI,CAAC,OAAO,EACZ,KAAK,EACL,QAAQ,CACT,CAAC;YACF,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC1D,OAAO,IAAI,kBAAmB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACxD,CAAC;KAAA;CACF;AAED,kBAAe,SAAS,CAAC"}
|
package/dist/src/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAI5B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,gBAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE5E,MAAM,gBAAgB,GAAG,CACvB,OAAwB,EACxB,QAAgB,EAChB,KAAa,EACb,EAAE;IACF,MAAM,GAAG,GAAG,GAAG,CACb,GAAG,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CACnE,CAAC;IACF,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEK,MAAM,qBAAqB,GAAG,CACnC,OAAwB,EACxB,KAAa,EACb,MAA6B,EAC7B,EAAE;IACF,MAAM,OAAO,GAAG;QACd,kBAAkB,EAAE,KAAK;QACzB,QAAQ,EAAE,OAAO,CAAC,eAAe;QACjC,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,KAAK;QACL,GAAG,EAAE,OAAO,OAAO,CAAC,MAAM,EAAE;QAC5B,QAAQ,EAAE,gBAAgB,CACxB,OAAO,EACP,GAAG,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,EACjC,KAAK,CACN;KACF,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;SACxB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;SACxC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC,CAAC;AApBW,QAAA,qBAAqB,yBAoBhC;AAEK,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,gBAAM,CAAC,UAAU,EAAE,CAAC;AAAjC,QAAA,IAAI,QAA6B;AACvC,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,GAAG,IAAA,YAAI,GAAE,CAAC;AAAnC,QAAA,MAAM,UAA6B;AAEzC,MAAM,SAAS,GAAG,GAAG,EAAE,CAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAD3C,QAAA,SAAS,aACkC;AAEjD,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAAtD,QAAA,UAAU,cAA4C;AAC5D,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAA1D,QAAA,cAAc,kBAA4C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../../test/index.spec.ts"],"names":[],"mappings":";;AAAA,mCAAsC;AAEtC,IAAA,aAAI,EAAC,UAAU,EAAE,GAAG,EAAE;IACpB,IAAA,eAAM,EAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,40 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ringcentral-softphone",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.1",
|
|
4
4
|
"homepage": "https://github.com/ringcentral/ringcentral-softphone-ts",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/src/softphone.js",
|
|
7
7
|
"types": "dist/src/softphone.d.ts",
|
|
8
8
|
"scripts": {
|
|
9
9
|
"in": "rm -rf *.raw && tsx -r dotenv-override-true/config demos/inbound-call.ts",
|
|
10
|
-
"lint": "eslint --fix
|
|
10
|
+
"lint": "eslint --fix . && prettier --write . && sort-package-json",
|
|
11
11
|
"out": "rm -rf *.raw && tsx -r dotenv-override-true/config demos/outbound-call.ts",
|
|
12
|
-
"prepublishOnly": "rm -rf *.raw && rm -rf dist && yarn tsc"
|
|
12
|
+
"prepublishOnly": "rm -rf *.raw && rm -rf dist && yarn tsc --skipLibCheck",
|
|
13
|
+
"test": "vitest run"
|
|
13
14
|
},
|
|
14
15
|
"dependencies": {
|
|
15
16
|
"@rc-ex/core": "^1.4.2",
|
|
16
17
|
"wait-for-async": "^0.7.0",
|
|
17
|
-
"werift-rtp": "^0.8.
|
|
18
|
+
"werift-rtp": "^0.8.2"
|
|
18
19
|
},
|
|
19
20
|
"devDependencies": {
|
|
20
|
-
"@types/node": "^22.7
|
|
21
|
-
"@typescript-eslint/eslint-plugin": "^8.11.0",
|
|
22
|
-
"@typescript-eslint/parser": "^8.11.0",
|
|
21
|
+
"@types/node": "^22.8.7",
|
|
23
22
|
"dotenv-override-true": "^6.2.2",
|
|
24
|
-
"eslint": "^
|
|
25
|
-
"eslint-config-alloy": "^5.1.2",
|
|
26
|
-
"eslint-config-prettier": "^9.1.0",
|
|
27
|
-
"eslint-plugin-prettier": "^5.2.1",
|
|
28
|
-
"prettier": "^3.3.3",
|
|
23
|
+
"eslint-config-tyler": "^0.2.1",
|
|
29
24
|
"sort-package-json": "^2.10.1",
|
|
30
|
-
"tsx": "^4.19.
|
|
31
|
-
"ttpt": "^0.
|
|
25
|
+
"tsx": "^4.19.2",
|
|
26
|
+
"ttpt": "^0.13.0",
|
|
32
27
|
"typescript": "^5.6.3",
|
|
28
|
+
"vitest": "^2.1.4",
|
|
33
29
|
"yarn-upgrade-all": "^0.7.4"
|
|
34
|
-
},
|
|
35
|
-
"yarn-upgrade-all": {
|
|
36
|
-
"ignore": [
|
|
37
|
-
"eslint"
|
|
38
|
-
]
|
|
39
30
|
}
|
|
40
31
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import CallSession from '.';
|
|
1
2
|
import { ResponseMessage, type InboundMessage } from '../sip-message';
|
|
2
|
-
import { randomInt } from '../utils';
|
|
3
3
|
import type Softphone from '../softphone';
|
|
4
|
-
import
|
|
4
|
+
import { randomInt } from '../utils';
|
|
5
5
|
|
|
6
6
|
class InboundCallSession extends CallSession {
|
|
7
7
|
public constructor(softphone: Softphone, inviteMessage: InboundMessage) {
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import EventEmitter from 'events';
|
|
2
1
|
import dgram from 'dgram';
|
|
2
|
+
import EventEmitter from 'events';
|
|
3
|
+
|
|
3
4
|
import { RtpHeader, RtpPacket } from 'werift-rtp';
|
|
4
5
|
|
|
5
|
-
import
|
|
6
|
+
import DTMF from '../dtmf';
|
|
7
|
+
import {
|
|
8
|
+
RequestMessage,
|
|
9
|
+
ResponseMessage,
|
|
10
|
+
type InboundMessage,
|
|
11
|
+
} from '../sip-message';
|
|
6
12
|
import type Softphone from '../softphone';
|
|
7
13
|
import { branch, extractAddress, randomInt } from '../utils';
|
|
8
|
-
import DTMF from '../dtmf';
|
|
9
14
|
import Streamer from './streamer';
|
|
10
15
|
|
|
11
16
|
abstract class CallSession extends EventEmitter {
|
|
@@ -23,7 +28,10 @@ abstract class CallSession extends EventEmitter {
|
|
|
23
28
|
this.softphone = softphone;
|
|
24
29
|
this.sipMessage = sipMessage;
|
|
25
30
|
this.remoteIP = this.sipMessage.body.match(/c=IN IP4 ([\d.]+)/)![1];
|
|
26
|
-
this.remotePort = parseInt(
|
|
31
|
+
this.remotePort = parseInt(
|
|
32
|
+
this.sipMessage.body.match(/m=audio (\d+) /)![1],
|
|
33
|
+
10,
|
|
34
|
+
);
|
|
27
35
|
}
|
|
28
36
|
|
|
29
37
|
public get callId() {
|
|
@@ -35,14 +43,17 @@ abstract class CallSession extends EventEmitter {
|
|
|
35
43
|
}
|
|
36
44
|
|
|
37
45
|
public async transfer(target: string) {
|
|
38
|
-
const requestMessage = new RequestMessage(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
const requestMessage = new RequestMessage(
|
|
47
|
+
`REFER sip:${extractAddress(this.remotePeer)} SIP/2.0`,
|
|
48
|
+
{
|
|
49
|
+
'Call-Id': this.callId,
|
|
50
|
+
From: this.localPeer,
|
|
51
|
+
To: this.remotePeer,
|
|
52
|
+
Via: `SIP/2.0/TCP ${this.softphone.fakeDomain};branch=${branch()}`,
|
|
53
|
+
'Refer-To': `sip:${target}@sip.ringcentral.com`,
|
|
54
|
+
'Referred-By': `<${extractAddress(this.localPeer)}>`,
|
|
55
|
+
},
|
|
56
|
+
);
|
|
46
57
|
this.softphone.send(requestMessage);
|
|
47
58
|
// reply to those NOTIFY messages
|
|
48
59
|
const notifyHandler = (inboundMessage: InboundMessage) => {
|
|
@@ -59,16 +70,21 @@ abstract class CallSession extends EventEmitter {
|
|
|
59
70
|
}
|
|
60
71
|
|
|
61
72
|
public async hangup() {
|
|
62
|
-
const requestMessage = new RequestMessage(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
73
|
+
const requestMessage = new RequestMessage(
|
|
74
|
+
`BYE sip:${this.softphone.sipInfo.domain} SIP/2.0`,
|
|
75
|
+
{
|
|
76
|
+
'Call-Id': this.callId,
|
|
77
|
+
From: this.localPeer,
|
|
78
|
+
To: this.remotePeer,
|
|
79
|
+
Via: `SIP/2.0/TCP ${this.softphone.fakeDomain};branch=${branch()}`,
|
|
80
|
+
},
|
|
81
|
+
);
|
|
68
82
|
this.softphone.send(requestMessage);
|
|
69
83
|
}
|
|
70
84
|
|
|
71
|
-
public async sendDTMF(
|
|
85
|
+
public async sendDTMF(
|
|
86
|
+
char: '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '*' | '#',
|
|
87
|
+
) {
|
|
72
88
|
const timestamp = Math.floor(Date.now() / 1000);
|
|
73
89
|
let sequenceNumber = timestamp % 65536;
|
|
74
90
|
const rtpHeader = new RtpHeader({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import CallSession from '.';
|
|
1
2
|
import { RequestMessage, type InboundMessage } from '../sip-message';
|
|
2
3
|
import type Softphone from '../softphone';
|
|
3
|
-
import CallSession from '.';
|
|
4
4
|
import { extractAddress, withoutTag } from '../utils';
|
|
5
5
|
|
|
6
6
|
class OutboundCallSession extends CallSession {
|
|
@@ -14,17 +14,23 @@ class OutboundCallSession extends CallSession {
|
|
|
14
14
|
public async init() {
|
|
15
15
|
// wait for user to answer the call
|
|
16
16
|
const answerHandler = (message: InboundMessage) => {
|
|
17
|
-
if (
|
|
17
|
+
if (
|
|
18
|
+
message.headers.CSeq === this.sipMessage.headers.CSeq &&
|
|
19
|
+
message.subject.startsWith('SIP/2.0 200')
|
|
20
|
+
) {
|
|
18
21
|
this.softphone.off('message', answerHandler);
|
|
19
22
|
this.emit('answered');
|
|
20
23
|
|
|
21
|
-
const ackMessage = new RequestMessage(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
const ackMessage = new RequestMessage(
|
|
25
|
+
`ACK ${extractAddress(this.remotePeer)} SIP/2.0`,
|
|
26
|
+
{
|
|
27
|
+
'Call-Id': this.callId,
|
|
28
|
+
From: this.localPeer,
|
|
29
|
+
To: this.remotePeer,
|
|
30
|
+
Via: this.sipMessage.headers.Via,
|
|
31
|
+
CSeq: this.sipMessage.headers.CSeq.replace(' INVITE', ' ACK'),
|
|
32
|
+
},
|
|
33
|
+
);
|
|
28
34
|
this.softphone.send(ackMessage);
|
|
29
35
|
}
|
|
30
36
|
};
|
|
@@ -33,13 +39,16 @@ class OutboundCallSession extends CallSession {
|
|
|
33
39
|
}
|
|
34
40
|
|
|
35
41
|
public async cancel() {
|
|
36
|
-
const requestMessage = new RequestMessage(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
const requestMessage = new RequestMessage(
|
|
43
|
+
`CANCEL ${extractAddress(this.remotePeer)} SIP/2.0`,
|
|
44
|
+
{
|
|
45
|
+
'Call-Id': this.callId,
|
|
46
|
+
From: this.localPeer,
|
|
47
|
+
To: withoutTag(this.remotePeer),
|
|
48
|
+
Via: this.sipMessage.headers.Via,
|
|
49
|
+
CSeq: this.sipMessage.headers.CSeq.replace(' INVITE', ' CANCEL'),
|
|
50
|
+
},
|
|
51
|
+
);
|
|
43
52
|
this.softphone.send(requestMessage);
|
|
44
53
|
}
|
|
45
54
|
}
|
package/src/dtmf.ts
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
class DTMF {
|
|
2
|
-
public static readonly phoneChars = [
|
|
3
|
-
|
|
2
|
+
public static readonly phoneChars = [
|
|
3
|
+
'0',
|
|
4
|
+
'1',
|
|
5
|
+
'2',
|
|
6
|
+
'3',
|
|
7
|
+
'4',
|
|
8
|
+
'5',
|
|
9
|
+
'6',
|
|
10
|
+
'7',
|
|
11
|
+
'8',
|
|
12
|
+
'9',
|
|
13
|
+
'*',
|
|
14
|
+
'#',
|
|
15
|
+
];
|
|
16
|
+
private static readonly payloads = [
|
|
17
|
+
0x00060000, 0x000600a0, 0x00060140, 0x00860320, 0x00860320, 0x00860320,
|
|
18
|
+
];
|
|
4
19
|
|
|
5
20
|
public static charToPayloads = (char: string) => {
|
|
6
21
|
const index = DTMF.phoneChars.indexOf(char[0]);
|
|
@@ -8,7 +8,9 @@ class InboundMessage extends SipMessage {
|
|
|
8
8
|
sipMessage.body = body.join('\r\n\r\n');
|
|
9
9
|
const [subject, ...headers] = init.split('\r\n');
|
|
10
10
|
sipMessage.subject = subject;
|
|
11
|
-
sipMessage.headers = Object.fromEntries(
|
|
11
|
+
sipMessage.headers = Object.fromEntries(
|
|
12
|
+
headers.map((line) => line.split(': ')),
|
|
13
|
+
);
|
|
12
14
|
if (sipMessage.headers.To && !sipMessage.headers.To.includes(';tag=')) {
|
|
13
15
|
sipMessage.headers.To += ';tag=' + uuid(); // generate local tag
|
|
14
16
|
}
|
|
@@ -16,10 +16,17 @@ class RequestMessage extends OutboundMessage {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
public fork() {
|
|
19
|
-
const newMessage = new RequestMessage(
|
|
19
|
+
const newMessage = new RequestMessage(
|
|
20
|
+
this.subject,
|
|
21
|
+
{ ...this.headers },
|
|
22
|
+
this.body,
|
|
23
|
+
);
|
|
20
24
|
newMessage.newCseq();
|
|
21
25
|
if (newMessage.headers.Via) {
|
|
22
|
-
newMessage.headers.Via = newMessage.headers.Via.replace(
|
|
26
|
+
newMessage.headers.Via = newMessage.headers.Via.replace(
|
|
27
|
+
/;branch=.+?$/,
|
|
28
|
+
`;branch=${branch()}`,
|
|
29
|
+
);
|
|
23
30
|
}
|
|
24
31
|
return newMessage;
|
|
25
32
|
}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import OutboundMessage from '.';
|
|
2
|
-
import responseCodes from '../response-codes';
|
|
3
2
|
import type InboundMessage from '../inbound';
|
|
3
|
+
import responseCodes from '../response-codes';
|
|
4
4
|
|
|
5
5
|
class ResponseMessage extends OutboundMessage {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
public constructor(
|
|
7
|
+
inboundMessage: InboundMessage,
|
|
8
|
+
responseCode: number,
|
|
9
|
+
headers = {},
|
|
10
|
+
body = '',
|
|
11
|
+
) {
|
|
8
12
|
super(undefined, { ...headers }, body);
|
|
9
13
|
this.subject = `SIP/2.0 ${responseCode} ${responseCodes[responseCode]}`;
|
|
10
14
|
const keys = ['Via', 'From', 'To', 'Call-Id', 'CSeq'];
|
package/src/softphone.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import type SipInfoResponse from '@rc-ex/core/lib/definitions/SipInfoResponse';
|
|
2
1
|
import EventEmitter from 'events';
|
|
3
2
|
import net from 'net';
|
|
3
|
+
|
|
4
|
+
import type SipInfoResponse from '@rc-ex/core/lib/definitions/SipInfoResponse';
|
|
4
5
|
import waitFor from 'wait-for-async';
|
|
5
6
|
|
|
7
|
+
import InboundCallSession from './call-session/inbound';
|
|
8
|
+
import OutboundCallSession from './call-session/outbound';
|
|
6
9
|
import type { OutboundMessage } from './sip-message';
|
|
7
10
|
import { InboundMessage, RequestMessage, ResponseMessage } from './sip-message';
|
|
8
11
|
import { branch, generateAuthorization, randomInt, uuid } from './utils';
|
|
9
|
-
import InboundCallSession from './call-session/inbound';
|
|
10
|
-
import OutboundCallSession from './call-session/outbound';
|
|
11
12
|
|
|
12
13
|
class Softphone extends EventEmitter {
|
|
13
14
|
public sipInfo: SipInfoResponse;
|
|
@@ -41,7 +42,9 @@ class Softphone extends EventEmitter {
|
|
|
41
42
|
return; // haven't received a complete message yet
|
|
42
43
|
}
|
|
43
44
|
// received two empty body messages
|
|
44
|
-
const tempMessages = cache
|
|
45
|
+
const tempMessages = cache
|
|
46
|
+
.split('\r\nContent-Length: 0\r\n\r\n')
|
|
47
|
+
.filter((message) => message.trim() !== '');
|
|
45
48
|
cache = '';
|
|
46
49
|
for (let i = 0; i < tempMessages.length; i++) {
|
|
47
50
|
if (!tempMessages[i].includes('Content-Length: ')) {
|
|
@@ -59,22 +62,31 @@ class Softphone extends EventEmitter {
|
|
|
59
62
|
await waitFor({ interval: 100, condition: () => this.connected });
|
|
60
63
|
}
|
|
61
64
|
const sipRegister = async () => {
|
|
62
|
-
const requestMessage = new RequestMessage(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
const requestMessage = new RequestMessage(
|
|
66
|
+
`REGISTER sip:${this.sipInfo.domain} SIP/2.0`,
|
|
67
|
+
{
|
|
68
|
+
'Call-Id': uuid(),
|
|
69
|
+
Contact: `<sip:${this.fakeEmail};transport=tcp>;expires=600`,
|
|
70
|
+
From: `<sip:${this.sipInfo.username}@${this.sipInfo.domain}>;tag=${uuid()}`,
|
|
71
|
+
To: `<sip:${this.sipInfo.username}@${this.sipInfo.domain}>`,
|
|
72
|
+
Via: `SIP/2.0/TCP ${this.fakeDomain};branch=${branch()}`,
|
|
73
|
+
},
|
|
74
|
+
);
|
|
69
75
|
const inboundMessage = await this.send(requestMessage, true);
|
|
70
76
|
if (inboundMessage.subject.startsWith('SIP/2.0 200 ')) {
|
|
71
77
|
// sometimes the server will return 200 OK directly
|
|
72
78
|
return;
|
|
73
79
|
}
|
|
74
|
-
const wwwAuth =
|
|
80
|
+
const wwwAuth =
|
|
81
|
+
inboundMessage.headers['Www-Authenticate'] ||
|
|
82
|
+
inboundMessage!.headers['WWW-Authenticate'];
|
|
75
83
|
const nonce = wwwAuth.match(/, nonce="(.+?)"/)![1];
|
|
76
84
|
const newMessage = requestMessage.fork();
|
|
77
|
-
newMessage.headers.Authorization = generateAuthorization(
|
|
85
|
+
newMessage.headers.Authorization = generateAuthorization(
|
|
86
|
+
this.sipInfo,
|
|
87
|
+
nonce,
|
|
88
|
+
'REGISTER',
|
|
89
|
+
);
|
|
78
90
|
this.send(newMessage);
|
|
79
91
|
};
|
|
80
92
|
sipRegister();
|
|
@@ -93,7 +105,9 @@ class Softphone extends EventEmitter {
|
|
|
93
105
|
}
|
|
94
106
|
|
|
95
107
|
public async enableDebugMode() {
|
|
96
|
-
this.on('message', (message) =>
|
|
108
|
+
this.on('message', (message) =>
|
|
109
|
+
console.log(`Receiving...(${new Date()})\n` + message.toString()),
|
|
110
|
+
);
|
|
97
111
|
const tcpWrite = this.client.write.bind(this.client);
|
|
98
112
|
this.client.write = (message) => {
|
|
99
113
|
console.log(`Sending...(${new Date()})\n` + message);
|
|
@@ -168,13 +182,18 @@ a=sendrecv
|
|
|
168
182
|
offerSDP,
|
|
169
183
|
);
|
|
170
184
|
if (callerId) {
|
|
171
|
-
inviteMessage.headers['P-Asserted-Identity'] =
|
|
185
|
+
inviteMessage.headers['P-Asserted-Identity'] =
|
|
186
|
+
`sip:${callerId}@${this.sipInfo.domain}`;
|
|
172
187
|
}
|
|
173
188
|
const inboundMessage = await this.send(inviteMessage, true);
|
|
174
189
|
const proxyAuthenticate = inboundMessage.headers['Proxy-Authenticate'];
|
|
175
190
|
const nonce = proxyAuthenticate.match(/, nonce="(.+?)"/)![1];
|
|
176
191
|
const newMessage = inviteMessage.fork();
|
|
177
|
-
newMessage.headers['Proxy-Authorization'] = generateAuthorization(
|
|
192
|
+
newMessage.headers['Proxy-Authorization'] = generateAuthorization(
|
|
193
|
+
this.sipInfo,
|
|
194
|
+
nonce,
|
|
195
|
+
'INVITE',
|
|
196
|
+
);
|
|
178
197
|
const progressMessage = await this.send(newMessage, true);
|
|
179
198
|
return new OutboundCallSession(this, progressMessage);
|
|
180
199
|
}
|
package/src/utils.ts
CHANGED
|
@@ -1,23 +1,38 @@
|
|
|
1
|
-
import type SipInfoResponse from '@rc-ex/core/lib/definitions/SipInfoResponse';
|
|
2
1
|
import crypto from 'crypto';
|
|
3
2
|
|
|
3
|
+
import type SipInfoResponse from '@rc-ex/core/lib/definitions/SipInfoResponse';
|
|
4
|
+
|
|
4
5
|
const md5 = (s: string) => crypto.createHash('md5').update(s).digest('hex');
|
|
5
6
|
|
|
6
|
-
const generateResponse = (
|
|
7
|
-
|
|
7
|
+
const generateResponse = (
|
|
8
|
+
sipInfo: SipInfoResponse,
|
|
9
|
+
endpoint: string,
|
|
10
|
+
nonce: string,
|
|
11
|
+
) => {
|
|
12
|
+
const ha1 = md5(
|
|
13
|
+
`${sipInfo.authorizationId}:${sipInfo.domain}:${sipInfo.password}`,
|
|
14
|
+
);
|
|
8
15
|
const ha2 = md5(endpoint);
|
|
9
16
|
const response = md5(`${ha1}:${nonce}:${ha2}`);
|
|
10
17
|
return response;
|
|
11
18
|
};
|
|
12
19
|
|
|
13
|
-
export const generateAuthorization = (
|
|
20
|
+
export const generateAuthorization = (
|
|
21
|
+
sipInfo: SipInfoResponse,
|
|
22
|
+
nonce: string,
|
|
23
|
+
method: 'REGISTER' | 'INVITE',
|
|
24
|
+
) => {
|
|
14
25
|
const authObj = {
|
|
15
26
|
'Digest algorithm': 'MD5',
|
|
16
27
|
username: sipInfo.authorizationId,
|
|
17
28
|
realm: sipInfo.domain,
|
|
18
29
|
nonce,
|
|
19
30
|
uri: `sip:${sipInfo.domain}`,
|
|
20
|
-
response: generateResponse(
|
|
31
|
+
response: generateResponse(
|
|
32
|
+
sipInfo,
|
|
33
|
+
`${method}:sip:${sipInfo.domain}`,
|
|
34
|
+
nonce,
|
|
35
|
+
),
|
|
21
36
|
};
|
|
22
37
|
return Object.keys(authObj)
|
|
23
38
|
.map((key) => `${key}="${authObj[key]}"`)
|
|
@@ -27,7 +42,8 @@ export const generateAuthorization = (sipInfo: SipInfoResponse, nonce: string, m
|
|
|
27
42
|
export const uuid = () => crypto.randomUUID();
|
|
28
43
|
export const branch = () => 'z9hG4bK-' + uuid();
|
|
29
44
|
|
|
30
|
-
export const randomInt = () =>
|
|
45
|
+
export const randomInt = () =>
|
|
46
|
+
Math.floor(Math.random() * (65535 - 1024 + 1)) + 1024;
|
|
31
47
|
|
|
32
48
|
export const withoutTag = (s: string) => s.replace(/;tag=.*$/, '');
|
|
33
49
|
export const extractAddress = (s: string) => s.match(/<(sip:.+?)>/)[1];
|
package/.eslintignore
DELETED
package/.eslintrc.js
DELETED
package/.prettierrc.js
DELETED