ringcentral-softphone 1.1.0 → 1.1.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/README.md +1 -5
- package/dist/cjs/call-session/inbound.d.ts +3 -3
- package/dist/cjs/call-session/inbound.js +26 -21
- package/dist/cjs/call-session/inbound.js.map +1 -1
- package/dist/cjs/call-session/index.d.ts +6 -5
- package/dist/cjs/call-session/index.js +98 -104
- package/dist/cjs/call-session/index.js.map +1 -1
- package/dist/cjs/call-session/outbound.d.ts +4 -4
- package/dist/cjs/call-session/outbound.js +45 -47
- package/dist/cjs/call-session/outbound.js.map +1 -1
- package/dist/cjs/call-session/streamer.d.ts +6 -5
- package/dist/cjs/call-session/streamer.js +8 -63
- package/dist/cjs/call-session/streamer.js.map +1 -1
- package/dist/cjs/codec.d.ts +1 -0
- package/dist/cjs/codec.js +5 -4
- package/dist/cjs/codec.js.map +1 -1
- package/dist/cjs/dtmf.d.ts +1 -0
- package/dist/cjs/dtmf.js +2 -1
- package/dist/cjs/dtmf.js.map +1 -1
- package/dist/cjs/index.d.ts +7 -7
- package/dist/cjs/index.js +43 -49
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/sip-message/inbound/index.d.ts +1 -1
- package/dist/cjs/sip-message/inbound/index.js +5 -5
- package/dist/cjs/sip-message/inbound/index.js.map +1 -1
- package/dist/cjs/sip-message/index.d.ts +5 -5
- package/dist/cjs/sip-message/index.js +10 -10
- package/dist/cjs/sip-message/index.js.map +1 -1
- package/dist/cjs/sip-message/outbound/index.d.ts +1 -1
- package/dist/cjs/sip-message/outbound/index.js +2 -2
- package/dist/cjs/sip-message/outbound/index.js.map +1 -1
- package/dist/cjs/sip-message/outbound/request.d.ts +1 -1
- package/dist/cjs/sip-message/outbound/request.js +4 -4
- package/dist/cjs/sip-message/outbound/request.js.map +1 -1
- package/dist/cjs/sip-message/outbound/response.d.ts +2 -2
- package/dist/cjs/sip-message/outbound/response.js +4 -4
- package/dist/cjs/sip-message/outbound/response.js.map +1 -1
- package/dist/esm/call-session/inbound.d.ts +3 -3
- package/dist/esm/call-session/inbound.js +25 -20
- package/dist/esm/call-session/inbound.js.map +1 -1
- package/dist/esm/call-session/index.d.ts +6 -5
- package/dist/esm/call-session/index.js +89 -95
- package/dist/esm/call-session/index.js.map +1 -1
- package/dist/esm/call-session/outbound.d.ts +4 -4
- package/dist/esm/call-session/outbound.js +44 -46
- package/dist/esm/call-session/outbound.js.map +1 -1
- package/dist/esm/call-session/streamer.d.ts +6 -5
- package/dist/esm/call-session/streamer.js +8 -63
- package/dist/esm/call-session/streamer.js.map +1 -1
- package/dist/esm/codec.d.ts +1 -0
- package/dist/esm/codec.js +1 -0
- package/dist/esm/codec.js.map +1 -1
- package/dist/esm/dtmf.d.ts +1 -0
- package/dist/esm/dtmf.js +1 -0
- package/dist/esm/dtmf.js.map +1 -1
- package/dist/esm/index.d.ts +7 -7
- package/dist/esm/index.js +24 -30
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/sip-message/inbound/index.d.ts +1 -1
- package/dist/esm/sip-message/inbound/index.js +2 -2
- package/dist/esm/sip-message/inbound/index.js.map +1 -1
- package/dist/esm/sip-message/index.d.ts +5 -5
- package/dist/esm/sip-message/index.js +5 -5
- package/dist/esm/sip-message/index.js.map +1 -1
- package/dist/esm/sip-message/outbound/index.d.ts +1 -1
- package/dist/esm/sip-message/outbound/index.js +1 -1
- package/dist/esm/sip-message/outbound/index.js.map +1 -1
- package/dist/esm/sip-message/outbound/request.d.ts +1 -1
- package/dist/esm/sip-message/outbound/request.js +2 -2
- package/dist/esm/sip-message/outbound/request.js.map +1 -1
- package/dist/esm/sip-message/outbound/response.d.ts +2 -2
- package/dist/esm/sip-message/outbound/response.js +2 -2
- package/dist/esm/sip-message/outbound/response.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -132,7 +132,7 @@ For complete examples, see [demos/](demos/)
|
|
|
132
132
|
- stream local audio to remote peer
|
|
133
133
|
- call transfer
|
|
134
134
|
|
|
135
|
-
|
|
135
|
+
## Audio codec
|
|
136
136
|
|
|
137
137
|
### By default it is `OPUS/16000`
|
|
138
138
|
|
|
@@ -260,10 +260,6 @@ callSession1.on("rtpPacket", (rtpPacket: RtpPacket) => {
|
|
|
260
260
|
});
|
|
261
261
|
```
|
|
262
262
|
|
|
263
|
-
## Todo
|
|
264
|
-
|
|
265
|
-
- Make codec configurable
|
|
266
|
-
|
|
267
263
|
---
|
|
268
264
|
|
|
269
265
|
## Dev Notes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import CallSession from "./index
|
|
2
|
-
import { type InboundMessage } from "../sip-message/index
|
|
3
|
-
import type Softphone from "../index
|
|
1
|
+
import CallSession from "./index";
|
|
2
|
+
import { type InboundMessage } from "../sip-message/index";
|
|
3
|
+
import type Softphone from "../index";
|
|
4
4
|
declare class InboundCallSession extends CallSession {
|
|
5
5
|
constructor(softphone: Softphone, inviteMessage: InboundMessage);
|
|
6
6
|
answer(): Promise<void>;
|
|
@@ -54,9 +54,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
54
54
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
55
55
|
};
|
|
56
56
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
-
var
|
|
58
|
-
var
|
|
59
|
-
var
|
|
57
|
+
var index_1 = __importDefault(require("./index"));
|
|
58
|
+
var index_2 = require("../sip-message/index");
|
|
59
|
+
var utils_1 = require("../utils");
|
|
60
60
|
var InboundCallSession = /** @class */ (function (_super) {
|
|
61
61
|
__extends(InboundCallSession, _super);
|
|
62
62
|
function InboundCallSession(softphone, inviteMessage) {
|
|
@@ -70,27 +70,32 @@ var InboundCallSession = /** @class */ (function (_super) {
|
|
|
70
70
|
return __awaiter(this, void 0, void 0, function () {
|
|
71
71
|
var answerSDP, newMessage;
|
|
72
72
|
return __generator(this, function (_a) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
73
|
+
switch (_a.label) {
|
|
74
|
+
case 0:
|
|
75
|
+
answerSDP = "\nv=0\no=- ".concat(Date.now(), " 0 IN IP4 ").concat(this.softphone.client.localAddress, "\ns=rc-softphone-ts\nc=IN IP4 ").concat(this.softphone.client.localAddress, "\nt=0 0\nm=audio ").concat((0, utils_1.randomInt)(), " RTP/SAVP ").concat(this.softphone.codec.id, " 101\na=rtpmap:").concat(this.softphone.codec.id, " ").concat(this.softphone.codec.name, "\na=rtpmap:101 telephone-event/8000\na=fmtp:101 0-15\na=sendrecv\na=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:").concat(utils_1.localKey, "\n").trim();
|
|
76
|
+
newMessage = new index_2.OutboundMessage("SIP/2.0 200 OK", {
|
|
77
|
+
Via: this.sipMessage.headers.Via,
|
|
78
|
+
"Call-ID": this.sipMessage.headers["Call-ID"],
|
|
79
|
+
From: this.sipMessage.headers.From,
|
|
80
|
+
To: this.sipMessage.headers.To,
|
|
81
|
+
CSeq: this.sipMessage.headers.CSeq,
|
|
82
|
+
Contact: "<sip:".concat(this.softphone.sipInfo.username, "@").concat(this.softphone.client.localAddress, ":").concat(this.softphone.client.localPort, ";transport=TLS;ob>"),
|
|
83
|
+
Allow: "PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS",
|
|
84
|
+
Supported: "replaces, 100rel, timer, norefersub",
|
|
85
|
+
"Session-Expires": "14400;refresher=uac",
|
|
86
|
+
Require: "timer",
|
|
87
|
+
"Content-Type": "application/sdp",
|
|
88
|
+
}, answerSDP);
|
|
89
|
+
return [4 /*yield*/, this.softphone.send(newMessage)];
|
|
90
|
+
case 1:
|
|
91
|
+
_a.sent();
|
|
92
|
+
this.startLocalServices();
|
|
93
|
+
return [2 /*return*/];
|
|
94
|
+
}
|
|
90
95
|
});
|
|
91
96
|
});
|
|
92
97
|
};
|
|
93
98
|
return InboundCallSession;
|
|
94
|
-
}(
|
|
99
|
+
}(index_1.default));
|
|
95
100
|
exports.default = InboundCallSession;
|
|
96
101
|
//# sourceMappingURL=inbound.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbound.js","sourceRoot":"","sources":["../../../src/call-session/inbound.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"inbound.js","sourceRoot":"","sources":["../../../src/call-session/inbound.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAAkC;AAClC,8CAA4E;AAE5E,kCAA+C;AAE/C;IAAiC,sCAAW;IAC1C,4BAAmB,SAAoB,EAAE,aAA6B;QACpE,YAAA,MAAK,YAAC,SAAS,EAAE,aAAa,CAAC,SAAC;QAChC,KAAI,CAAC,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,KAAI,CAAC,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;QAC7C,KAAI,CAAC,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CACvC,0CAA0C,CAC1C,CAAC,CAAC,CAAC,CAAC;;IACR,CAAC;IAEY,mCAAM,GAAnB;;;;;;wBACQ,SAAS,GAAG,qBAEhB,IAAI,CAAC,GAAG,EAAE,uBAAa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,2CAEpD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,8BAEnC,IAAA,iBAAS,GAAE,uBAAa,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,4BAC9C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,cAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,yHAInB,gBAAQ,OACnD,CAAC,IAAI,EAAE,CAAC;wBACC,UAAU,GAAG,IAAI,uBAAe,CACpC,gBAAgB,EAChB;4BACE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG;4BAChC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;4BAC7C,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI;4BAClC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;4BAC9B,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI;4BAClC,OAAO,EACL,eAAQ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,cAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,cAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,uBAAoB;4BACtI,KAAK,EACH,2FAA2F;4BAC7F,SAAS,EAAE,qCAAqC;4BAChD,iBAAiB,EAAE,qBAAqB;4BACxC,OAAO,EAAE,OAAO;4BAChB,cAAc,EAAE,iBAAiB;yBAClC,EACD,SAAS,CACV,CAAC;wBACF,qBAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAA;;wBAArC,SAAqC,CAAC;wBAEtC,IAAI,CAAC,kBAAkB,EAAE,CAAC;;;;;KAC3B;IACH,yBAAC;AAAD,CAAC,AA/CD,CAAiC,eAAW,GA+C3C;AAED,kBAAe,kBAAkB,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import dgram from "node:dgram";
|
|
2
2
|
import EventEmitter from "node:events";
|
|
3
|
+
import { Buffer } from "node:buffer";
|
|
3
4
|
import { RtpPacket, SrtpSession } from "werift-rtp";
|
|
4
|
-
import { type InboundMessage } from "../sip-message/index
|
|
5
|
-
import type Softphone from "../index
|
|
6
|
-
import Streamer from "./streamer
|
|
5
|
+
import { type InboundMessage } from "../sip-message/index";
|
|
6
|
+
import type Softphone from "../index";
|
|
7
|
+
import Streamer from "./streamer";
|
|
7
8
|
declare abstract class CallSession extends EventEmitter {
|
|
8
9
|
softphone: Softphone;
|
|
9
10
|
sipMessage: InboundMessage;
|
|
@@ -28,10 +29,10 @@ declare abstract class CallSession extends EventEmitter {
|
|
|
28
29
|
get callId(): string;
|
|
29
30
|
send(data: string | Buffer): void;
|
|
30
31
|
hangup(): Promise<void>;
|
|
31
|
-
sendDTMF(char: "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "*" | "#"):
|
|
32
|
+
sendDTMF(char: "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "*" | "#"): void;
|
|
32
33
|
streamAudio(input: Buffer): Streamer;
|
|
33
34
|
sendPacket(rtpPacket: RtpPacket): void;
|
|
34
|
-
protected startLocalServices():
|
|
35
|
+
protected startLocalServices(): void;
|
|
35
36
|
protected dispose(): void;
|
|
36
37
|
transfer(transferTo: string): void;
|
|
37
38
|
}
|
|
@@ -56,20 +56,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
56
56
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
57
|
var node_dgram_1 = __importDefault(require("node:dgram"));
|
|
58
58
|
var node_events_1 = __importDefault(require("node:events"));
|
|
59
|
+
var node_buffer_1 = require("node:buffer");
|
|
59
60
|
var werift_rtp_1 = require("werift-rtp");
|
|
60
|
-
var
|
|
61
|
-
var
|
|
62
|
-
var
|
|
63
|
-
var
|
|
61
|
+
var dtmf_1 = __importDefault(require("../dtmf"));
|
|
62
|
+
var index_1 = require("../sip-message/index");
|
|
63
|
+
var utils_1 = require("../utils");
|
|
64
|
+
var streamer_1 = __importDefault(require("./streamer"));
|
|
64
65
|
var CallSession = /** @class */ (function (_super) {
|
|
65
66
|
__extends(CallSession, _super);
|
|
66
67
|
function CallSession(softphone, sipMessage) {
|
|
67
68
|
var _this = _super.call(this) || this;
|
|
68
69
|
_this.disposed = false;
|
|
69
70
|
// for audio streaming
|
|
70
|
-
_this.ssrc = (0,
|
|
71
|
-
_this.sequenceNumber = (0,
|
|
72
|
-
_this.timestamp = (0,
|
|
71
|
+
_this.ssrc = (0, utils_1.randomInt)();
|
|
72
|
+
_this.sequenceNumber = (0, utils_1.randomInt)();
|
|
73
|
+
_this.timestamp = (0, utils_1.randomInt)();
|
|
73
74
|
_this.softphone = softphone;
|
|
74
75
|
_this.encoder = softphone.codec.createEncoder();
|
|
75
76
|
_this.decoder = softphone.codec.createDecoder();
|
|
@@ -80,8 +81,8 @@ var CallSession = /** @class */ (function (_super) {
|
|
|
80
81
|
}
|
|
81
82
|
Object.defineProperty(CallSession.prototype, "remoteKey", {
|
|
82
83
|
set: function (key) {
|
|
83
|
-
var localKeyBuffer = Buffer.from(
|
|
84
|
-
var remoteKeyBuffer = Buffer.from(key, "base64");
|
|
84
|
+
var localKeyBuffer = node_buffer_1.Buffer.from(utils_1.localKey, "base64");
|
|
85
|
+
var remoteKeyBuffer = node_buffer_1.Buffer.from(key, "base64");
|
|
85
86
|
this.srtpSession = new werift_rtp_1.SrtpSession({
|
|
86
87
|
profile: 0x0001,
|
|
87
88
|
keys: {
|
|
@@ -109,54 +110,53 @@ var CallSession = /** @class */ (function (_super) {
|
|
|
109
110
|
return __awaiter(this, void 0, void 0, function () {
|
|
110
111
|
var requestMessage;
|
|
111
112
|
return __generator(this, function (_a) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
113
|
+
switch (_a.label) {
|
|
114
|
+
case 0:
|
|
115
|
+
requestMessage = new index_1.RequestMessage("BYE sip:".concat(this.softphone.sipInfo.domain, " SIP/2.0"), {
|
|
116
|
+
"Call-ID": this.callId,
|
|
117
|
+
From: this.localPeer,
|
|
118
|
+
To: this.remotePeer,
|
|
119
|
+
Via: "SIP/2.0/TLS ".concat(this.softphone.fakeDomain, ";branch=").concat((0, utils_1.branch)()),
|
|
120
|
+
});
|
|
121
|
+
return [4 /*yield*/, this.softphone.send(requestMessage)];
|
|
122
|
+
case 1:
|
|
123
|
+
_a.sent();
|
|
124
|
+
return [2 /*return*/];
|
|
125
|
+
}
|
|
120
126
|
});
|
|
121
127
|
});
|
|
122
128
|
};
|
|
123
129
|
CallSession.prototype.sendDTMF = function (char) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
extensionProfile: 48862,
|
|
143
|
-
extensionLength: undefined,
|
|
144
|
-
extensions: [],
|
|
145
|
-
});
|
|
146
|
-
for (_i = 0, _a = dtmf_js_1.default.charToPayloads(char); _i < _a.length; _i++) {
|
|
147
|
-
payload = _a[_i];
|
|
148
|
-
rtpHeader.sequenceNumber = sequenceNumber++;
|
|
149
|
-
rtpPacket = new werift_rtp_1.RtpPacket(rtpHeader, payload);
|
|
150
|
-
this.send(this.srtpSession.encrypt(rtpPacket.payload, rtpPacket.header));
|
|
151
|
-
}
|
|
152
|
-
return [2 /*return*/];
|
|
153
|
-
});
|
|
130
|
+
var timestamp = Math.floor(Date.now() / 1000);
|
|
131
|
+
var sequenceNumber = timestamp % 65536;
|
|
132
|
+
var rtpHeader = new werift_rtp_1.RtpHeader({
|
|
133
|
+
version: 2,
|
|
134
|
+
padding: false,
|
|
135
|
+
paddingSize: 0,
|
|
136
|
+
extension: false,
|
|
137
|
+
marker: false,
|
|
138
|
+
payloadOffset: 12,
|
|
139
|
+
payloadType: 101,
|
|
140
|
+
sequenceNumber: sequenceNumber,
|
|
141
|
+
timestamp: timestamp,
|
|
142
|
+
ssrc: (0, utils_1.randomInt)(),
|
|
143
|
+
csrcLength: 0,
|
|
144
|
+
csrc: [],
|
|
145
|
+
extensionProfile: 48862,
|
|
146
|
+
extensionLength: undefined,
|
|
147
|
+
extensions: [],
|
|
154
148
|
});
|
|
149
|
+
for (var _i = 0, _a = dtmf_1.default.charToPayloads(char); _i < _a.length; _i++) {
|
|
150
|
+
var payload = _a[_i];
|
|
151
|
+
rtpHeader.sequenceNumber = sequenceNumber++;
|
|
152
|
+
var rtpPacket = new werift_rtp_1.RtpPacket(rtpHeader, payload);
|
|
153
|
+
this.send(this.srtpSession.encrypt(rtpPacket.payload, rtpPacket.header));
|
|
154
|
+
}
|
|
155
155
|
};
|
|
156
156
|
// buffer is the content of a audio file, it is supposed to be uncompressed PCM data
|
|
157
157
|
// The audio should be playable by command: play -t raw -b 16 -r 16000 -e signed-integer test.wav
|
|
158
158
|
CallSession.prototype.streamAudio = function (input) {
|
|
159
|
-
var streamer = new
|
|
159
|
+
var streamer = new streamer_1.default(this, input);
|
|
160
160
|
streamer.start();
|
|
161
161
|
return streamer;
|
|
162
162
|
};
|
|
@@ -168,60 +168,54 @@ var CallSession = /** @class */ (function (_super) {
|
|
|
168
168
|
this.send(this.srtpSession.encrypt(rtpPacket.payload, rtpPacket.header));
|
|
169
169
|
};
|
|
170
170
|
CallSession.prototype.startLocalServices = function () {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
console.error("opus decode failed", rtpPacket);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
// as I tested, we can use a random port here and it still works
|
|
208
|
-
// but it seems that in SDP we need to tell remote our local IP Address, not 127.0.0.1
|
|
209
|
-
this.socket.bind(); // random port
|
|
210
|
-
// send a message to remote server so that it knows where to reply
|
|
211
|
-
this.send("hello");
|
|
212
|
-
byeHandler = function (inboundMessage) {
|
|
213
|
-
if (inboundMessage.headers["Call-ID"] !== _this.callId) {
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
if (inboundMessage.headers.CSeq.endsWith(" BYE")) {
|
|
217
|
-
_this.softphone.off("message", byeHandler);
|
|
218
|
-
_this.dispose();
|
|
219
|
-
}
|
|
220
|
-
};
|
|
221
|
-
this.softphone.on("message", byeHandler);
|
|
222
|
-
return [2 /*return*/];
|
|
223
|
-
});
|
|
171
|
+
var _this = this;
|
|
172
|
+
this.socket = node_dgram_1.default.createSocket("udp4");
|
|
173
|
+
this.socket.on("message", function (message) {
|
|
174
|
+
var rtpPacket = werift_rtp_1.RtpPacket.deSerialize(_this.srtpSession.decrypt(message));
|
|
175
|
+
_this.emit("rtpPacket", rtpPacket);
|
|
176
|
+
if (rtpPacket.header.payloadType === 101) {
|
|
177
|
+
_this.emit("dtmfPacket", rtpPacket);
|
|
178
|
+
var char = dtmf_1.default.payloadToChar(rtpPacket.payload);
|
|
179
|
+
if (char) {
|
|
180
|
+
_this.emit("dtmf", char);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else if (rtpPacket.header.payloadType === _this.softphone.codec.id) {
|
|
184
|
+
if (rtpPacket.payload.length === 4 &&
|
|
185
|
+
rtpPacket.payload[0] >= 0x00 &&
|
|
186
|
+
rtpPacket.payload[0] < 0x0c &&
|
|
187
|
+
rtpPacket.payload[1] === 0x8a &&
|
|
188
|
+
rtpPacket.payload[2] === 0x03 &&
|
|
189
|
+
rtpPacket.payload[3] === 0xc0) {
|
|
190
|
+
// special DTMF packet in audio format
|
|
191
|
+
// first byte 0x00 to 0x0c means DTMF 0 to 9, *, #
|
|
192
|
+
// we ignore it since DTMF is handled by `if (rtpPacket.header.payloadType === 101) {`
|
|
193
|
+
return; // ignore it
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
rtpPacket.payload = _this.decoder.decode(rtpPacket.payload);
|
|
197
|
+
_this.emit("audioPacket", rtpPacket);
|
|
198
|
+
}
|
|
199
|
+
catch (_a) {
|
|
200
|
+
console.error("opus decode failed", rtpPacket);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
224
203
|
});
|
|
204
|
+
// as I tested, we can use a random port here and it still works
|
|
205
|
+
// but it seems that in SDP we need to tell remote our local IP Address, not 127.0.0.1
|
|
206
|
+
this.socket.bind(); // random port
|
|
207
|
+
// send a message to remote server so that it knows where to reply
|
|
208
|
+
this.send("hello");
|
|
209
|
+
var byeHandler = function (inboundMessage) {
|
|
210
|
+
if (inboundMessage.headers["Call-ID"] !== _this.callId) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (inboundMessage.headers.CSeq.endsWith(" BYE")) {
|
|
214
|
+
_this.softphone.off("message", byeHandler);
|
|
215
|
+
_this.dispose();
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
this.softphone.on("message", byeHandler);
|
|
225
219
|
};
|
|
226
220
|
CallSession.prototype.dispose = function () {
|
|
227
221
|
var _a, _b;
|
|
@@ -233,8 +227,8 @@ var CallSession = /** @class */ (function (_super) {
|
|
|
233
227
|
};
|
|
234
228
|
CallSession.prototype.transfer = function (transferTo) {
|
|
235
229
|
var _this = this;
|
|
236
|
-
var requestMessage = new
|
|
237
|
-
Via: "SIP/2.0/TLS ".concat(this.softphone.client.localAddress, ":").concat(this.softphone.client.localPort, ";rport;branch=").concat((0,
|
|
230
|
+
var requestMessage = new index_1.RequestMessage("REFER sip:".concat(this.softphone.sipInfo.username, "@").concat(this.softphone.sipInfo.outboundProxy, ";transport=tls SIP/2.0"), {
|
|
231
|
+
Via: "SIP/2.0/TLS ".concat(this.softphone.client.localAddress, ":").concat(this.softphone.client.localPort, ";rport;branch=").concat((0, utils_1.branch)(), ";alias"),
|
|
238
232
|
"Max-Forwards": 70,
|
|
239
233
|
From: this.localPeer,
|
|
240
234
|
To: this.remotePeer,
|
|
@@ -254,7 +248,7 @@ var CallSession = /** @class */ (function (_super) {
|
|
|
254
248
|
if (!inboundMessage.subject.startsWith("NOTIFY ")) {
|
|
255
249
|
return;
|
|
256
250
|
}
|
|
257
|
-
var responseMessage = new
|
|
251
|
+
var responseMessage = new index_1.ResponseMessage(inboundMessage, 200);
|
|
258
252
|
_this.softphone.send(responseMessage);
|
|
259
253
|
if (inboundMessage.body.trim() === "SIP/2.0 200 OK") {
|
|
260
254
|
_this.softphone.off("message", notifyHandler);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/call-session/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0DAA+B;AAC/B,4DAAuC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/call-session/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import CallSession from "./index
|
|
2
|
-
import { type InboundMessage } from "../sip-message/index
|
|
3
|
-
import type Softphone from "../index
|
|
1
|
+
import CallSession from "./index";
|
|
2
|
+
import { type InboundMessage } from "../sip-message/index";
|
|
3
|
+
import type Softphone from "../index";
|
|
4
4
|
declare class OutboundCallSession extends CallSession {
|
|
5
5
|
constructor(softphone: Softphone, answerMessage: InboundMessage);
|
|
6
|
-
init():
|
|
6
|
+
init(): void;
|
|
7
7
|
cancel(): Promise<void>;
|
|
8
8
|
}
|
|
9
9
|
export default OutboundCallSession;
|
|
@@ -54,9 +54,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
54
54
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
55
55
|
};
|
|
56
56
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
-
var
|
|
58
|
-
var
|
|
59
|
-
var
|
|
57
|
+
var index_1 = __importDefault(require("./index"));
|
|
58
|
+
var index_2 = require("../sip-message/index");
|
|
59
|
+
var utils_1 = require("../utils");
|
|
60
60
|
var OutboundCallSession = /** @class */ (function (_super) {
|
|
61
61
|
__extends(OutboundCallSession, _super);
|
|
62
62
|
function OutboundCallSession(softphone, answerMessage) {
|
|
@@ -68,58 +68,56 @@ var OutboundCallSession = /** @class */ (function (_super) {
|
|
|
68
68
|
return _this;
|
|
69
69
|
}
|
|
70
70
|
OutboundCallSession.prototype.init = function () {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
this.softphone.on("message", answerHandler);
|
|
99
|
-
this.once("answered", function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
100
|
-
return [2 /*return*/, this.startLocalServices()];
|
|
101
|
-
}); }); });
|
|
102
|
-
return [2 /*return*/];
|
|
103
|
-
});
|
|
104
|
-
});
|
|
71
|
+
var _this = this;
|
|
72
|
+
// wait for user to answer the call
|
|
73
|
+
var answerHandler = function (message) {
|
|
74
|
+
if (message.headers.CSeq !== _this.sipMessage.headers.CSeq) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (message.subject.startsWith("SIP/2.0 486")) {
|
|
78
|
+
_this.softphone.off("message", answerHandler);
|
|
79
|
+
_this.emit("busy");
|
|
80
|
+
_this.dispose();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (message.subject.startsWith("SIP/2.0 200")) {
|
|
84
|
+
_this.softphone.off("message", answerHandler);
|
|
85
|
+
_this.emit("answered");
|
|
86
|
+
var ackMessage = new index_2.RequestMessage("ACK ".concat((0, utils_1.extractAddress)(_this.remotePeer), " SIP/2.0"), {
|
|
87
|
+
"Call-ID": _this.callId,
|
|
88
|
+
From: _this.localPeer,
|
|
89
|
+
To: _this.remotePeer,
|
|
90
|
+
Via: _this.sipMessage.headers.Via,
|
|
91
|
+
CSeq: _this.sipMessage.headers.CSeq.replace(" INVITE", " ACK"),
|
|
92
|
+
});
|
|
93
|
+
_this.softphone.send(ackMessage);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
this.softphone.on("message", answerHandler);
|
|
97
|
+
this.once("answered", function () { return _this.startLocalServices(); });
|
|
105
98
|
};
|
|
106
99
|
OutboundCallSession.prototype.cancel = function () {
|
|
107
100
|
return __awaiter(this, void 0, void 0, function () {
|
|
108
101
|
var requestMessage;
|
|
109
102
|
return __generator(this, function (_a) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
103
|
+
switch (_a.label) {
|
|
104
|
+
case 0:
|
|
105
|
+
requestMessage = new index_2.RequestMessage("CANCEL ".concat((0, utils_1.extractAddress)(this.remotePeer), " SIP/2.0"), {
|
|
106
|
+
"Call-ID": this.callId,
|
|
107
|
+
From: this.localPeer,
|
|
108
|
+
To: (0, utils_1.withoutTag)(this.remotePeer),
|
|
109
|
+
Via: this.sipMessage.headers.Via,
|
|
110
|
+
CSeq: this.sipMessage.headers.CSeq.replace(" INVITE", " CANCEL"),
|
|
111
|
+
});
|
|
112
|
+
return [4 /*yield*/, this.softphone.send(requestMessage)];
|
|
113
|
+
case 1:
|
|
114
|
+
_a.sent();
|
|
115
|
+
return [2 /*return*/];
|
|
116
|
+
}
|
|
119
117
|
});
|
|
120
118
|
});
|
|
121
119
|
};
|
|
122
120
|
return OutboundCallSession;
|
|
123
|
-
}(
|
|
121
|
+
}(index_1.default));
|
|
124
122
|
exports.default = OutboundCallSession;
|
|
125
123
|
//# sourceMappingURL=outbound.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../../src/call-session/outbound.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"outbound.js","sourceRoot":"","sources":["../../../src/call-session/outbound.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import EventEmitter from "node:events";
|
|
2
|
-
import
|
|
2
|
+
import { Buffer } from "node:buffer";
|
|
3
|
+
import type CallSession from "./index";
|
|
3
4
|
declare class Streamer extends EventEmitter {
|
|
4
5
|
paused: boolean;
|
|
5
6
|
private callSession;
|
|
6
7
|
private buffer;
|
|
7
8
|
private originalBuffer;
|
|
8
9
|
constructor(callSesstion: CallSession, buffer: Buffer);
|
|
9
|
-
start():
|
|
10
|
-
stop():
|
|
11
|
-
pause():
|
|
12
|
-
resume():
|
|
10
|
+
start(): void;
|
|
11
|
+
stop(): void;
|
|
12
|
+
pause(): void;
|
|
13
|
+
resume(): void;
|
|
13
14
|
get finished(): boolean;
|
|
14
15
|
private sendPacket;
|
|
15
16
|
}
|