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.
Files changed (99) hide show
  1. package/README.md +1 -1
  2. package/dist/call-session/inbound.cjs +93 -0
  3. package/dist/call-session/inbound.js +64 -0
  4. package/dist/call-session/index.cjs +274 -0
  5. package/dist/{esm/call-session → call-session}/index.d.ts +6 -4
  6. package/dist/call-session/index.js +248 -0
  7. package/dist/call-session/outbound.cjs +100 -0
  8. package/dist/call-session/outbound.js +71 -0
  9. package/dist/call-session/streamer.cjs +112 -0
  10. package/dist/{esm/call-session → call-session}/streamer.d.ts +2 -2
  11. package/dist/call-session/streamer.js +83 -0
  12. package/dist/codec.cjs +85 -0
  13. package/dist/codec.js +66 -0
  14. package/dist/dtmf.cjs +66 -0
  15. package/dist/dtmf.d.ts +7 -0
  16. package/dist/dtmf.js +47 -0
  17. package/dist/index.cjs +260 -0
  18. package/dist/{cjs/index.d.ts → index.d.ts} +3 -3
  19. package/dist/index.js +242 -0
  20. package/dist/sip-message/inbound/index.cjs +51 -0
  21. package/dist/sip-message/inbound/index.js +22 -0
  22. package/dist/sip-message/index.cjs +49 -0
  23. package/dist/sip-message/index.js +12 -0
  24. package/dist/sip-message/outbound/index.cjs +41 -0
  25. package/dist/sip-message/outbound/index.js +12 -0
  26. package/dist/sip-message/outbound/request.cjs +62 -0
  27. package/dist/sip-message/outbound/request.js +33 -0
  28. package/dist/sip-message/outbound/response.cjs +55 -0
  29. package/dist/sip-message/outbound/response.js +26 -0
  30. package/dist/sip-message/response-codes.cjs +102 -0
  31. package/dist/sip-message/response-codes.js +83 -0
  32. package/dist/sip-message/sip-message.cjs +53 -0
  33. package/dist/sip-message/sip-message.js +34 -0
  34. package/dist/types.cjs +15 -0
  35. package/dist/types.js +0 -0
  36. package/dist/utils.cjs +80 -0
  37. package/dist/{cjs/utils.d.ts → utils.d.ts} +2 -2
  38. package/dist/utils.js +41 -0
  39. package/package.json +19 -13
  40. package/dist/cjs/call-session/inbound.js +0 -57
  41. package/dist/cjs/call-session/index.d.ts +0 -44
  42. package/dist/cjs/call-session/index.js +0 -239
  43. package/dist/cjs/call-session/outbound.js +0 -66
  44. package/dist/cjs/call-session/streamer.d.ts +0 -17
  45. package/dist/cjs/call-session/streamer.js +0 -76
  46. package/dist/cjs/codec.js +0 -65
  47. package/dist/cjs/dtmf.d.ts +0 -8
  48. package/dist/cjs/dtmf.js +0 -45
  49. package/dist/cjs/index.js +0 -209
  50. package/dist/cjs/sip-message/inbound/index.js +0 -22
  51. package/dist/cjs/sip-message/index.d.ts +0 -5
  52. package/dist/cjs/sip-message/index.js +0 -16
  53. package/dist/cjs/sip-message/outbound/index.js +0 -14
  54. package/dist/cjs/sip-message/outbound/request.js +0 -28
  55. package/dist/cjs/sip-message/outbound/response.js +0 -25
  56. package/dist/cjs/sip-message/response-codes.js +0 -83
  57. package/dist/cjs/sip-message/sip-message.js +0 -34
  58. package/dist/cjs/types.js +0 -2
  59. package/dist/cjs/utils.js +0 -40
  60. package/dist/esm/call-session/inbound.d.ts +0 -8
  61. package/dist/esm/call-session/inbound.js +0 -52
  62. package/dist/esm/call-session/index.js +0 -234
  63. package/dist/esm/call-session/outbound.d.ts +0 -11
  64. package/dist/esm/call-session/outbound.js +0 -61
  65. package/dist/esm/call-session/streamer.js +0 -71
  66. package/dist/esm/codec.d.ts +0 -15
  67. package/dist/esm/codec.js +0 -63
  68. package/dist/esm/dtmf.d.ts +0 -8
  69. package/dist/esm/dtmf.js +0 -43
  70. package/dist/esm/index.d.ts +0 -28
  71. package/dist/esm/index.js +0 -204
  72. package/dist/esm/sip-message/inbound/index.d.ts +0 -5
  73. package/dist/esm/sip-message/inbound/index.js +0 -17
  74. package/dist/esm/sip-message/index.js +0 -5
  75. package/dist/esm/sip-message/outbound/index.d.ts +0 -5
  76. package/dist/esm/sip-message/outbound/index.js +0 -9
  77. package/dist/esm/sip-message/outbound/request.d.ts +0 -7
  78. package/dist/esm/sip-message/outbound/request.js +0 -23
  79. package/dist/esm/sip-message/outbound/response.d.ts +0 -6
  80. package/dist/esm/sip-message/outbound/response.js +0 -20
  81. package/dist/esm/sip-message/response-codes.d.ts +0 -4
  82. package/dist/esm/sip-message/response-codes.js +0 -81
  83. package/dist/esm/sip-message/sip-message.d.ts +0 -11
  84. package/dist/esm/sip-message/sip-message.js +0 -32
  85. package/dist/esm/types.d.ts +0 -9
  86. package/dist/esm/types.js +0 -1
  87. package/dist/esm/utils.d.ts +0 -8
  88. package/dist/esm/utils.js +0 -28
  89. package/dist/{cjs/call-session → call-session}/inbound.d.ts +2 -2
  90. package/dist/{cjs/call-session → call-session}/outbound.d.ts +2 -2
  91. package/dist/{cjs/codec.d.ts → codec.d.ts} +0 -0
  92. package/dist/{cjs/sip-message → sip-message}/inbound/index.d.ts +0 -0
  93. package/dist/{esm/sip-message → sip-message}/index.d.ts +2 -2
  94. package/dist/{cjs/sip-message → sip-message}/outbound/index.d.ts +0 -0
  95. package/dist/{cjs/sip-message → sip-message}/outbound/request.d.ts +0 -0
  96. package/dist/{cjs/sip-message → sip-message}/outbound/response.d.ts +1 -1
  97. /package/dist/{cjs/sip-message → sip-message}/response-codes.d.ts +0 -0
  98. /package/dist/{cjs/sip-message → sip-message}/sip-message.d.ts +0 -0
  99. /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
+ };