ringcentral-softphone 1.3.2 → 1.3.4
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 -1
- package/dist/call-session/inbound.cjs +93 -0
- package/dist/call-session/inbound.js +64 -0
- package/dist/call-session/index.cjs +274 -0
- package/dist/{esm/call-session → call-session}/index.d.ts +6 -4
- package/dist/call-session/index.js +248 -0
- package/dist/call-session/outbound.cjs +100 -0
- package/dist/call-session/outbound.js +71 -0
- package/dist/call-session/streamer.cjs +112 -0
- package/dist/{esm/call-session → call-session}/streamer.d.ts +2 -2
- package/dist/call-session/streamer.js +83 -0
- package/dist/codec.cjs +85 -0
- package/dist/codec.js +66 -0
- package/dist/dtmf.cjs +66 -0
- package/dist/dtmf.d.ts +7 -0
- package/dist/dtmf.js +47 -0
- package/dist/index.cjs +260 -0
- package/dist/{cjs/index.d.ts → index.d.ts} +3 -3
- package/dist/index.js +242 -0
- package/dist/sip-message/inbound/index.cjs +51 -0
- package/dist/sip-message/inbound/index.js +22 -0
- package/dist/sip-message/index.cjs +49 -0
- package/dist/sip-message/index.js +12 -0
- package/dist/sip-message/outbound/index.cjs +41 -0
- package/dist/sip-message/outbound/index.js +12 -0
- package/dist/sip-message/outbound/request.cjs +62 -0
- package/dist/sip-message/outbound/request.js +33 -0
- package/dist/sip-message/outbound/response.cjs +55 -0
- package/dist/sip-message/outbound/response.js +26 -0
- package/dist/sip-message/response-codes.cjs +102 -0
- package/dist/sip-message/response-codes.js +83 -0
- package/dist/sip-message/sip-message.cjs +53 -0
- package/dist/sip-message/sip-message.js +34 -0
- package/dist/types.cjs +15 -0
- package/dist/types.js +0 -0
- package/dist/utils.cjs +80 -0
- package/dist/{cjs/utils.d.ts → utils.d.ts} +2 -2
- package/dist/utils.js +41 -0
- package/package.json +19 -13
- package/dist/cjs/call-session/inbound.js +0 -57
- package/dist/cjs/call-session/index.d.ts +0 -44
- package/dist/cjs/call-session/index.js +0 -239
- package/dist/cjs/call-session/outbound.js +0 -66
- package/dist/cjs/call-session/streamer.d.ts +0 -17
- package/dist/cjs/call-session/streamer.js +0 -76
- package/dist/cjs/codec.js +0 -65
- package/dist/cjs/dtmf.d.ts +0 -8
- package/dist/cjs/dtmf.js +0 -45
- package/dist/cjs/index.js +0 -209
- package/dist/cjs/sip-message/inbound/index.js +0 -22
- package/dist/cjs/sip-message/index.d.ts +0 -5
- package/dist/cjs/sip-message/index.js +0 -16
- package/dist/cjs/sip-message/outbound/index.js +0 -14
- package/dist/cjs/sip-message/outbound/request.js +0 -28
- package/dist/cjs/sip-message/outbound/response.js +0 -25
- package/dist/cjs/sip-message/response-codes.js +0 -83
- package/dist/cjs/sip-message/sip-message.js +0 -34
- package/dist/cjs/types.js +0 -2
- package/dist/cjs/utils.js +0 -40
- package/dist/esm/call-session/inbound.d.ts +0 -8
- package/dist/esm/call-session/inbound.js +0 -52
- package/dist/esm/call-session/index.js +0 -234
- package/dist/esm/call-session/outbound.d.ts +0 -11
- package/dist/esm/call-session/outbound.js +0 -61
- package/dist/esm/call-session/streamer.js +0 -71
- package/dist/esm/codec.d.ts +0 -15
- package/dist/esm/codec.js +0 -63
- package/dist/esm/dtmf.d.ts +0 -8
- package/dist/esm/dtmf.js +0 -43
- package/dist/esm/index.d.ts +0 -28
- package/dist/esm/index.js +0 -204
- package/dist/esm/sip-message/inbound/index.d.ts +0 -5
- package/dist/esm/sip-message/inbound/index.js +0 -17
- package/dist/esm/sip-message/index.js +0 -5
- package/dist/esm/sip-message/outbound/index.d.ts +0 -5
- package/dist/esm/sip-message/outbound/index.js +0 -9
- package/dist/esm/sip-message/outbound/request.d.ts +0 -7
- package/dist/esm/sip-message/outbound/request.js +0 -23
- package/dist/esm/sip-message/outbound/response.d.ts +0 -6
- package/dist/esm/sip-message/outbound/response.js +0 -20
- package/dist/esm/sip-message/response-codes.d.ts +0 -4
- package/dist/esm/sip-message/response-codes.js +0 -81
- package/dist/esm/sip-message/sip-message.d.ts +0 -11
- package/dist/esm/sip-message/sip-message.js +0 -32
- package/dist/esm/types.d.ts +0 -9
- package/dist/esm/types.js +0 -1
- package/dist/esm/utils.d.ts +0 -8
- package/dist/esm/utils.js +0 -28
- package/dist/{cjs/call-session → call-session}/inbound.d.ts +2 -2
- package/dist/{cjs/call-session → call-session}/outbound.d.ts +2 -2
- package/dist/{cjs/codec.d.ts → codec.d.ts} +0 -0
- package/dist/{cjs/sip-message → sip-message}/inbound/index.d.ts +0 -0
- package/dist/{esm/sip-message → sip-message}/index.d.ts +2 -2
- package/dist/{cjs/sip-message → sip-message}/outbound/index.d.ts +0 -0
- package/dist/{cjs/sip-message → sip-message}/outbound/request.d.ts +0 -0
- package/dist/{cjs/sip-message → sip-message}/outbound/response.d.ts +1 -1
- /package/dist/{cjs/sip-message → sip-message}/response-codes.d.ts +0 -0
- /package/dist/{cjs/sip-message → sip-message}/sip-message.d.ts +0 -0
- /package/dist/{cjs/types.d.ts → types.d.ts} +0 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import EventEmitter from "node:events";
|
|
2
|
+
import tls from "node:tls";
|
|
3
|
+
import waitFor from "wait-for-async";
|
|
4
|
+
import InboundCallSession from "./call-session/inbound.js";
|
|
5
|
+
import OutboundCallSession from "./call-session/outbound.js";
|
|
6
|
+
import Codec from "./codec.js";
|
|
7
|
+
import {
|
|
8
|
+
InboundMessage,
|
|
9
|
+
OutboundMessage,
|
|
10
|
+
RequestMessage,
|
|
11
|
+
ResponseMessage
|
|
12
|
+
} from "./sip-message/index.js";
|
|
13
|
+
import {
|
|
14
|
+
branch,
|
|
15
|
+
generateAuthorization,
|
|
16
|
+
localKey,
|
|
17
|
+
randomInt,
|
|
18
|
+
uuid
|
|
19
|
+
} from "./utils.js";
|
|
20
|
+
class Softphone extends EventEmitter {
|
|
21
|
+
sipInfo;
|
|
22
|
+
client;
|
|
23
|
+
codec;
|
|
24
|
+
fakeDomain = `${uuid()}.invalid`;
|
|
25
|
+
fakeEmail = `${uuid()}@${this.fakeDomain}`;
|
|
26
|
+
intervalHandle;
|
|
27
|
+
connected = false;
|
|
28
|
+
constructor(sipInfo) {
|
|
29
|
+
super();
|
|
30
|
+
if (sipInfo.codec === void 0) {
|
|
31
|
+
sipInfo.codec = "OPUS/16000";
|
|
32
|
+
}
|
|
33
|
+
this.codec = new Codec(sipInfo.codec);
|
|
34
|
+
this.sipInfo = sipInfo;
|
|
35
|
+
if (this.sipInfo.domain === void 0) {
|
|
36
|
+
this.sipInfo.domain = "sip.ringcentral.com";
|
|
37
|
+
}
|
|
38
|
+
if (this.sipInfo.outboundProxy === void 0) {
|
|
39
|
+
this.sipInfo.outboundProxy = "sip10.ringcentral.com:5096";
|
|
40
|
+
}
|
|
41
|
+
const tokens = this.sipInfo.outboundProxy.split(":");
|
|
42
|
+
this.client = tls.connect(
|
|
43
|
+
{
|
|
44
|
+
host: tokens[0],
|
|
45
|
+
port: parseInt(tokens[1], 10),
|
|
46
|
+
rejectUnauthorized: !this.sipInfo.ignoreTlsCertErrors
|
|
47
|
+
},
|
|
48
|
+
() => {
|
|
49
|
+
this.connected = true;
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
let cache = "";
|
|
53
|
+
this.client.on("data", (data) => {
|
|
54
|
+
cache += data.toString("utf-8");
|
|
55
|
+
if (!cache.endsWith("\r\n")) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const tempMessages = cache.split("\r\nContent-Length: 0\r\n\r\n").filter((message) => message.trim() !== "");
|
|
59
|
+
cache = "";
|
|
60
|
+
for (let i = 0; i < tempMessages.length; i++) {
|
|
61
|
+
if (!tempMessages[i].includes("Content-Length: ")) {
|
|
62
|
+
tempMessages[i] = `${tempMessages[i]}\r
|
|
63
|
+
Content-Length: 0`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
for (const message of tempMessages) {
|
|
67
|
+
this.emit("message", InboundMessage.fromString(message));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
instanceId = uuid();
|
|
72
|
+
registerCallId = uuid();
|
|
73
|
+
async register() {
|
|
74
|
+
if (!this.connected) {
|
|
75
|
+
await waitFor({
|
|
76
|
+
interval: 100,
|
|
77
|
+
times: 100,
|
|
78
|
+
condition: () => this.connected
|
|
79
|
+
});
|
|
80
|
+
if (!this.connected) {
|
|
81
|
+
throw new Error("Failed to register: connect to TLS timeout");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const sipRegister = async () => {
|
|
85
|
+
const fromTag = uuid();
|
|
86
|
+
const requestMessage = new RequestMessage(
|
|
87
|
+
`REGISTER sip:${this.sipInfo.domain} SIP/2.0`,
|
|
88
|
+
{
|
|
89
|
+
Via: `SIP/2.0/TLS ${this.client.localAddress}:${this.client.localPort};rport;branch=${branch()};alias`,
|
|
90
|
+
"Max-Forwards": "70",
|
|
91
|
+
From: `<sip:${this.sipInfo.username}@${this.sipInfo.domain}>;tag=${fromTag}`,
|
|
92
|
+
To: `<sip:${this.sipInfo.username}@${this.sipInfo.domain}>`,
|
|
93
|
+
"Call-ID": this.registerCallId,
|
|
94
|
+
Contact: `<sip:${this.sipInfo.username}@${this.client.localAddress}:${this.client.localPort};transport=TLS;ob>;reg-id=1;+sip.instance="<urn:uuid:${this.instanceId}>"`,
|
|
95
|
+
Expires: 3600,
|
|
96
|
+
Allow: "PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS"
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
const inboundMessage = await this.send(requestMessage, true);
|
|
100
|
+
if (inboundMessage.subject.startsWith("SIP/2.0 200 ")) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const wwwAuth = inboundMessage.getHeader("Www-Authenticate");
|
|
104
|
+
const nonce = wwwAuth.match(/, nonce="(.+?)"/)[1];
|
|
105
|
+
const newMessage = requestMessage.fork();
|
|
106
|
+
newMessage.headers.Authorization = generateAuthorization(
|
|
107
|
+
this.sipInfo,
|
|
108
|
+
nonce,
|
|
109
|
+
"REGISTER"
|
|
110
|
+
);
|
|
111
|
+
const message = await this.send(newMessage, true);
|
|
112
|
+
if (!message.subject.startsWith("SIP/2.0 200 ")) {
|
|
113
|
+
throw new Error(`Failed to register: ${message.subject}`);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
await sipRegister();
|
|
117
|
+
this.intervalHandle = setInterval(
|
|
118
|
+
() => {
|
|
119
|
+
sipRegister().catch((error) => {
|
|
120
|
+
this.emit("registrationError", error);
|
|
121
|
+
});
|
|
122
|
+
},
|
|
123
|
+
30 * 1e3
|
|
124
|
+
// refresh registration every 30 seconds
|
|
125
|
+
);
|
|
126
|
+
this.on("message", (inboundMessage) => {
|
|
127
|
+
if (!inboundMessage.subject.startsWith("INVITE sip:")) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const outboundMessage = new OutboundMessage("SIP/2.0 100 Trying", {
|
|
131
|
+
Via: inboundMessage.headers.Via,
|
|
132
|
+
"Call-ID": inboundMessage.getHeader("Call-ID"),
|
|
133
|
+
From: inboundMessage.headers.From,
|
|
134
|
+
To: inboundMessage.headers.To,
|
|
135
|
+
CSeq: inboundMessage.headers.CSeq,
|
|
136
|
+
"Content-Length": "0"
|
|
137
|
+
});
|
|
138
|
+
this.send(outboundMessage);
|
|
139
|
+
this.emit("invite", inboundMessage);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
enableDebugMode() {
|
|
143
|
+
this.on(
|
|
144
|
+
"message",
|
|
145
|
+
(message) => console.log(`Receiving...(${/* @__PURE__ */ new Date()})
|
|
146
|
+
${message.toString()}`)
|
|
147
|
+
);
|
|
148
|
+
const tlsWrite = this.client.write.bind(this.client);
|
|
149
|
+
this.client.write = (message) => {
|
|
150
|
+
console.log(`Sending...(${/* @__PURE__ */ new Date()})
|
|
151
|
+
${message}`);
|
|
152
|
+
return tlsWrite(message);
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
revoke() {
|
|
156
|
+
clearInterval(this.intervalHandle);
|
|
157
|
+
this.removeAllListeners();
|
|
158
|
+
this.client.removeAllListeners();
|
|
159
|
+
this.client.destroy();
|
|
160
|
+
}
|
|
161
|
+
send(message, waitForReply = false) {
|
|
162
|
+
this.client.write(message.toString());
|
|
163
|
+
if (!waitForReply) {
|
|
164
|
+
return new Promise((resolve) => {
|
|
165
|
+
resolve(void 0);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return new Promise((resolve) => {
|
|
169
|
+
const messageListerner = (inboundMessage) => {
|
|
170
|
+
if (inboundMessage.headers.CSeq.trim().split(/\s+/)[0] !== message.headers.CSeq.trim().split(/\s+/)[0]) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (inboundMessage.subject.startsWith("SIP/2.0 100 ")) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
this.off("message", messageListerner);
|
|
177
|
+
resolve(inboundMessage);
|
|
178
|
+
};
|
|
179
|
+
this.on("message", messageListerner);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
async answer(inviteMessage) {
|
|
183
|
+
const inboundCallSession = new InboundCallSession(this, inviteMessage);
|
|
184
|
+
await inboundCallSession.answer();
|
|
185
|
+
return inboundCallSession;
|
|
186
|
+
}
|
|
187
|
+
// decline an inbound call
|
|
188
|
+
async decline(inviteMessage) {
|
|
189
|
+
const newMessage = new ResponseMessage(inviteMessage, 603);
|
|
190
|
+
await this.send(newMessage);
|
|
191
|
+
}
|
|
192
|
+
async call(callee) {
|
|
193
|
+
const offerSDP = `
|
|
194
|
+
v=0
|
|
195
|
+
o=- ${Date.now()} 0 IN IP4 ${this.client.localAddress}
|
|
196
|
+
s=rc-softphone-ts
|
|
197
|
+
c=IN IP4 ${this.client.localAddress}
|
|
198
|
+
t=0 0
|
|
199
|
+
m=audio ${randomInt()} RTP/SAVP ${this.codec.id} 101
|
|
200
|
+
a=rtpmap:${this.codec.id} ${this.codec.name}
|
|
201
|
+
a=rtpmap:101 telephone-event/8000
|
|
202
|
+
a=fmtp:101 0-15
|
|
203
|
+
a=sendrecv
|
|
204
|
+
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:${localKey}
|
|
205
|
+
`.trim();
|
|
206
|
+
const inviteMessage = new RequestMessage(
|
|
207
|
+
`INVITE sip:${callee}@${this.sipInfo.domain} SIP/2.0`,
|
|
208
|
+
{
|
|
209
|
+
Via: `SIP/2.0/TLS ${this.client.localAddress}:${this.client.localPort};rport;branch=${branch()};alias`,
|
|
210
|
+
"Max-Forwards": 70,
|
|
211
|
+
From: `<sip:${this.sipInfo.username}@${this.sipInfo.domain}>;tag=${uuid()}`,
|
|
212
|
+
To: `<sip:${callee}@sip.ringcentral.com>`,
|
|
213
|
+
Contact: ` <sip:${this.sipInfo.username}@${this.client.localAddress}:${this.client.localPort};transport=TLS;ob>`,
|
|
214
|
+
"Call-ID": uuid(),
|
|
215
|
+
Route: `<sip:${this.sipInfo.outboundProxy};transport=tls;lr>`,
|
|
216
|
+
Allow: `PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS`,
|
|
217
|
+
Supported: `replaces, 100rel, timer, norefersub`,
|
|
218
|
+
"Session-Expires": 1800,
|
|
219
|
+
"Min-SE": 90,
|
|
220
|
+
"Content-Type": "application/sdp"
|
|
221
|
+
},
|
|
222
|
+
offerSDP
|
|
223
|
+
);
|
|
224
|
+
const inboundMessage = await this.send(inviteMessage, true);
|
|
225
|
+
const proxyAuthenticate = inboundMessage.getHeader("Proxy-Authenticate");
|
|
226
|
+
const nonce = proxyAuthenticate.match(/, nonce="(.+?)"/)[1];
|
|
227
|
+
const newMessage = inviteMessage.fork();
|
|
228
|
+
newMessage.headers["Proxy-Authorization"] = generateAuthorization(
|
|
229
|
+
this.sipInfo,
|
|
230
|
+
nonce,
|
|
231
|
+
"INVITE"
|
|
232
|
+
);
|
|
233
|
+
const progressMessage = await this.send(newMessage, true);
|
|
234
|
+
const outboundCallSession = new OutboundCallSession(this, progressMessage);
|
|
235
|
+
outboundCallSession.sdp = offerSDP;
|
|
236
|
+
return outboundCallSession;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
var index_default = Softphone;
|
|
240
|
+
export {
|
|
241
|
+
index_default as default
|
|
242
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var inbound_exports = {};
|
|
29
|
+
__export(inbound_exports, {
|
|
30
|
+
default: () => inbound_default
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(inbound_exports);
|
|
33
|
+
var import_utils = require("../../utils.js");
|
|
34
|
+
var import_sip_message = __toESM(require("../sip-message.js"), 1);
|
|
35
|
+
class InboundMessage extends import_sip_message.default {
|
|
36
|
+
static fromString(str) {
|
|
37
|
+
const sipMessage = new import_sip_message.default();
|
|
38
|
+
const [init, ...body] = str.split("\r\n\r\n");
|
|
39
|
+
sipMessage.body = body.join("\r\n\r\n");
|
|
40
|
+
const [subject, ...headers] = init.split("\r\n");
|
|
41
|
+
sipMessage.subject = subject;
|
|
42
|
+
sipMessage.headers = Object.fromEntries(
|
|
43
|
+
headers.map((line) => line.split(": "))
|
|
44
|
+
);
|
|
45
|
+
if (sipMessage.headers.To && !sipMessage.headers.To.includes(";tag=")) {
|
|
46
|
+
sipMessage.headers.To += `;tag=${(0, import_utils.uuid)()}`;
|
|
47
|
+
}
|
|
48
|
+
return sipMessage;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
var inbound_default = InboundMessage;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { uuid } from "../../utils.js";
|
|
2
|
+
import SipMessage from "../sip-message.js";
|
|
3
|
+
class InboundMessage extends SipMessage {
|
|
4
|
+
static fromString(str) {
|
|
5
|
+
const sipMessage = new SipMessage();
|
|
6
|
+
const [init, ...body] = str.split("\r\n\r\n");
|
|
7
|
+
sipMessage.body = body.join("\r\n\r\n");
|
|
8
|
+
const [subject, ...headers] = init.split("\r\n");
|
|
9
|
+
sipMessage.subject = subject;
|
|
10
|
+
sipMessage.headers = Object.fromEntries(
|
|
11
|
+
headers.map((line) => line.split(": "))
|
|
12
|
+
);
|
|
13
|
+
if (sipMessage.headers.To && !sipMessage.headers.To.includes(";tag=")) {
|
|
14
|
+
sipMessage.headers.To += `;tag=${uuid()}`;
|
|
15
|
+
}
|
|
16
|
+
return sipMessage;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
var inbound_default = InboundMessage;
|
|
20
|
+
export {
|
|
21
|
+
inbound_default as default
|
|
22
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var sip_message_exports = {};
|
|
29
|
+
__export(sip_message_exports, {
|
|
30
|
+
InboundMessage: () => import_inbound.default,
|
|
31
|
+
OutboundMessage: () => import_outbound.default,
|
|
32
|
+
RequestMessage: () => import_request.default,
|
|
33
|
+
ResponseMessage: () => import_response.default,
|
|
34
|
+
SipMessage: () => import_sip_message.default
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(sip_message_exports);
|
|
37
|
+
var import_inbound = __toESM(require("./inbound/index.js"), 1);
|
|
38
|
+
var import_outbound = __toESM(require("./outbound/index.js"), 1);
|
|
39
|
+
var import_request = __toESM(require("./outbound/request.js"), 1);
|
|
40
|
+
var import_response = __toESM(require("./outbound/response.js"), 1);
|
|
41
|
+
var import_sip_message = __toESM(require("./sip-message.js"), 1);
|
|
42
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
43
|
+
0 && (module.exports = {
|
|
44
|
+
InboundMessage,
|
|
45
|
+
OutboundMessage,
|
|
46
|
+
RequestMessage,
|
|
47
|
+
ResponseMessage,
|
|
48
|
+
SipMessage
|
|
49
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { default as default2 } from "./inbound/index.js";
|
|
2
|
+
import { default as default3 } from "./outbound/index.js";
|
|
3
|
+
import { default as default4 } from "./outbound/request.js";
|
|
4
|
+
import { default as default5 } from "./outbound/response.js";
|
|
5
|
+
import { default as default6 } from "./sip-message.js";
|
|
6
|
+
export {
|
|
7
|
+
default2 as InboundMessage,
|
|
8
|
+
default3 as OutboundMessage,
|
|
9
|
+
default4 as RequestMessage,
|
|
10
|
+
default5 as ResponseMessage,
|
|
11
|
+
default6 as SipMessage
|
|
12
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var outbound_exports = {};
|
|
29
|
+
__export(outbound_exports, {
|
|
30
|
+
default: () => outbound_default
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(outbound_exports);
|
|
33
|
+
var import_sip_message = __toESM(require("../sip-message.js"), 1);
|
|
34
|
+
class OutboundMessage extends import_sip_message.default {
|
|
35
|
+
constructor(subject = "", headers = {}, body = "") {
|
|
36
|
+
super(subject, headers, body);
|
|
37
|
+
this.headers["Content-Length"] = this.body.length.toString();
|
|
38
|
+
this.headers["User-Agent"] = "ringcentral-softphone-ts";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
var outbound_default = OutboundMessage;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import SipMessage from "../sip-message.js";
|
|
2
|
+
class OutboundMessage extends SipMessage {
|
|
3
|
+
constructor(subject = "", headers = {}, body = "") {
|
|
4
|
+
super(subject, headers, body);
|
|
5
|
+
this.headers["Content-Length"] = this.body.length.toString();
|
|
6
|
+
this.headers["User-Agent"] = "ringcentral-softphone-ts";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
var outbound_default = OutboundMessage;
|
|
10
|
+
export {
|
|
11
|
+
outbound_default as default
|
|
12
|
+
};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var request_exports = {};
|
|
29
|
+
__export(request_exports, {
|
|
30
|
+
default: () => request_default
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(request_exports);
|
|
33
|
+
var import_utils = require("../../utils.js");
|
|
34
|
+
var import_index = __toESM(require("./index.js"), 1);
|
|
35
|
+
let cseq = Math.floor(Math.random() * 1e4);
|
|
36
|
+
class RequestMessage extends import_index.default {
|
|
37
|
+
constructor(subject = "", headers = {}, body = "") {
|
|
38
|
+
super(subject, headers, body);
|
|
39
|
+
if (this.headers.CSeq === void 0) {
|
|
40
|
+
this.newCseq();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
newCseq() {
|
|
44
|
+
this.headers.CSeq = `${++cseq} ${this.subject.split(" ")[0]}`;
|
|
45
|
+
}
|
|
46
|
+
fork() {
|
|
47
|
+
const newMessage = new RequestMessage(
|
|
48
|
+
this.subject,
|
|
49
|
+
{ ...this.headers },
|
|
50
|
+
this.body
|
|
51
|
+
);
|
|
52
|
+
newMessage.newCseq();
|
|
53
|
+
if (newMessage.headers.Via) {
|
|
54
|
+
newMessage.headers.Via = newMessage.headers.Via.replace(
|
|
55
|
+
/;branch=.+?$/,
|
|
56
|
+
`;branch=${(0, import_utils.branch)()}`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
return newMessage;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
var request_default = RequestMessage;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { branch } from "../../utils.js";
|
|
2
|
+
import OutboundMessage from "./index.js";
|
|
3
|
+
let cseq = Math.floor(Math.random() * 1e4);
|
|
4
|
+
class RequestMessage extends OutboundMessage {
|
|
5
|
+
constructor(subject = "", headers = {}, body = "") {
|
|
6
|
+
super(subject, headers, body);
|
|
7
|
+
if (this.headers.CSeq === void 0) {
|
|
8
|
+
this.newCseq();
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
newCseq() {
|
|
12
|
+
this.headers.CSeq = `${++cseq} ${this.subject.split(" ")[0]}`;
|
|
13
|
+
}
|
|
14
|
+
fork() {
|
|
15
|
+
const newMessage = new RequestMessage(
|
|
16
|
+
this.subject,
|
|
17
|
+
{ ...this.headers },
|
|
18
|
+
this.body
|
|
19
|
+
);
|
|
20
|
+
newMessage.newCseq();
|
|
21
|
+
if (newMessage.headers.Via) {
|
|
22
|
+
newMessage.headers.Via = newMessage.headers.Via.replace(
|
|
23
|
+
/;branch=.+?$/,
|
|
24
|
+
`;branch=${branch()}`
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
return newMessage;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
var request_default = RequestMessage;
|
|
31
|
+
export {
|
|
32
|
+
request_default as default
|
|
33
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var response_exports = {};
|
|
29
|
+
__export(response_exports, {
|
|
30
|
+
default: () => response_default
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(response_exports);
|
|
33
|
+
var import_response_codes = __toESM(require("../response-codes.js"), 1);
|
|
34
|
+
var import_index = __toESM(require("./index.js"), 1);
|
|
35
|
+
class ResponseMessage extends import_index.default {
|
|
36
|
+
constructor(inboundMessage, responseCode, headers = {}, body = "") {
|
|
37
|
+
super(void 0, { ...headers }, body);
|
|
38
|
+
this.subject = `SIP/2.0 ${responseCode} ${import_response_codes.default[responseCode]}`;
|
|
39
|
+
const requiredKeys = /* @__PURE__ */ new Set(["via", "from", "to", "call-id", "cseq"]);
|
|
40
|
+
const allKeys = Object.keys(inboundMessage.headers).reduce(
|
|
41
|
+
(acc, key) => {
|
|
42
|
+
acc[key.toLowerCase()] = key;
|
|
43
|
+
return acc;
|
|
44
|
+
},
|
|
45
|
+
{}
|
|
46
|
+
);
|
|
47
|
+
for (const key of requiredKeys) {
|
|
48
|
+
if (allKeys[key]) {
|
|
49
|
+
const originalKey = allKeys[key];
|
|
50
|
+
this.headers[originalKey] = inboundMessage.headers[originalKey];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
var response_default = ResponseMessage;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import responseCodes from "../response-codes.js";
|
|
2
|
+
import OutboundMessage from "./index.js";
|
|
3
|
+
class ResponseMessage extends OutboundMessage {
|
|
4
|
+
constructor(inboundMessage, responseCode, headers = {}, body = "") {
|
|
5
|
+
super(void 0, { ...headers }, body);
|
|
6
|
+
this.subject = `SIP/2.0 ${responseCode} ${responseCodes[responseCode]}`;
|
|
7
|
+
const requiredKeys = /* @__PURE__ */ new Set(["via", "from", "to", "call-id", "cseq"]);
|
|
8
|
+
const allKeys = Object.keys(inboundMessage.headers).reduce(
|
|
9
|
+
(acc, key) => {
|
|
10
|
+
acc[key.toLowerCase()] = key;
|
|
11
|
+
return acc;
|
|
12
|
+
},
|
|
13
|
+
{}
|
|
14
|
+
);
|
|
15
|
+
for (const key of requiredKeys) {
|
|
16
|
+
if (allKeys[key]) {
|
|
17
|
+
const originalKey = allKeys[key];
|
|
18
|
+
this.headers[originalKey] = inboundMessage.headers[originalKey];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
var response_default = ResponseMessage;
|
|
24
|
+
export {
|
|
25
|
+
response_default as default
|
|
26
|
+
};
|