ringcentral-softphone 1.3.2 → 1.3.3

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 (98) 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 +270 -0
  5. package/dist/{esm/call-session → call-session}/index.d.ts +3 -3
  6. package/dist/call-session/index.js +244 -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/call-session/streamer.js +83 -0
  11. package/dist/codec.cjs +85 -0
  12. package/dist/codec.js +66 -0
  13. package/dist/dtmf.cjs +65 -0
  14. package/dist/dtmf.js +46 -0
  15. package/dist/index.cjs +258 -0
  16. package/dist/{cjs/index.d.ts → index.d.ts} +3 -3
  17. package/dist/index.js +240 -0
  18. package/dist/sip-message/inbound/index.cjs +51 -0
  19. package/dist/sip-message/inbound/index.js +22 -0
  20. package/dist/sip-message/index.cjs +49 -0
  21. package/dist/sip-message/index.js +12 -0
  22. package/dist/sip-message/outbound/index.cjs +41 -0
  23. package/dist/sip-message/outbound/index.js +12 -0
  24. package/dist/sip-message/outbound/request.cjs +62 -0
  25. package/dist/sip-message/outbound/request.js +33 -0
  26. package/dist/sip-message/outbound/response.cjs +55 -0
  27. package/dist/sip-message/outbound/response.js +26 -0
  28. package/dist/sip-message/response-codes.cjs +102 -0
  29. package/dist/sip-message/response-codes.js +83 -0
  30. package/dist/sip-message/sip-message.cjs +53 -0
  31. package/dist/sip-message/sip-message.js +34 -0
  32. package/dist/types.cjs +15 -0
  33. package/dist/types.js +0 -0
  34. package/dist/utils.cjs +80 -0
  35. package/dist/{cjs/utils.d.ts → utils.d.ts} +2 -2
  36. package/dist/utils.js +41 -0
  37. package/package.json +19 -13
  38. package/dist/cjs/call-session/inbound.js +0 -57
  39. package/dist/cjs/call-session/index.d.ts +0 -44
  40. package/dist/cjs/call-session/index.js +0 -239
  41. package/dist/cjs/call-session/outbound.js +0 -66
  42. package/dist/cjs/call-session/streamer.d.ts +0 -17
  43. package/dist/cjs/call-session/streamer.js +0 -76
  44. package/dist/cjs/codec.js +0 -65
  45. package/dist/cjs/dtmf.js +0 -45
  46. package/dist/cjs/index.js +0 -209
  47. package/dist/cjs/sip-message/inbound/index.js +0 -22
  48. package/dist/cjs/sip-message/index.d.ts +0 -5
  49. package/dist/cjs/sip-message/index.js +0 -16
  50. package/dist/cjs/sip-message/outbound/index.js +0 -14
  51. package/dist/cjs/sip-message/outbound/request.js +0 -28
  52. package/dist/cjs/sip-message/outbound/response.js +0 -25
  53. package/dist/cjs/sip-message/response-codes.js +0 -83
  54. package/dist/cjs/sip-message/sip-message.js +0 -34
  55. package/dist/cjs/types.js +0 -2
  56. package/dist/cjs/utils.js +0 -40
  57. package/dist/esm/call-session/inbound.d.ts +0 -8
  58. package/dist/esm/call-session/inbound.js +0 -52
  59. package/dist/esm/call-session/index.js +0 -234
  60. package/dist/esm/call-session/outbound.d.ts +0 -11
  61. package/dist/esm/call-session/outbound.js +0 -61
  62. package/dist/esm/call-session/streamer.js +0 -71
  63. package/dist/esm/codec.d.ts +0 -15
  64. package/dist/esm/codec.js +0 -63
  65. package/dist/esm/dtmf.d.ts +0 -8
  66. package/dist/esm/dtmf.js +0 -43
  67. package/dist/esm/index.d.ts +0 -28
  68. package/dist/esm/index.js +0 -204
  69. package/dist/esm/sip-message/inbound/index.d.ts +0 -5
  70. package/dist/esm/sip-message/inbound/index.js +0 -17
  71. package/dist/esm/sip-message/index.js +0 -5
  72. package/dist/esm/sip-message/outbound/index.d.ts +0 -5
  73. package/dist/esm/sip-message/outbound/index.js +0 -9
  74. package/dist/esm/sip-message/outbound/request.d.ts +0 -7
  75. package/dist/esm/sip-message/outbound/request.js +0 -23
  76. package/dist/esm/sip-message/outbound/response.d.ts +0 -6
  77. package/dist/esm/sip-message/outbound/response.js +0 -20
  78. package/dist/esm/sip-message/response-codes.d.ts +0 -4
  79. package/dist/esm/sip-message/response-codes.js +0 -81
  80. package/dist/esm/sip-message/sip-message.d.ts +0 -11
  81. package/dist/esm/sip-message/sip-message.js +0 -32
  82. package/dist/esm/types.d.ts +0 -9
  83. package/dist/esm/types.js +0 -1
  84. package/dist/esm/utils.d.ts +0 -8
  85. package/dist/esm/utils.js +0 -28
  86. package/dist/{cjs/call-session → call-session}/inbound.d.ts +2 -2
  87. package/dist/{cjs/call-session → call-session}/outbound.d.ts +2 -2
  88. package/dist/{esm/call-session → call-session}/streamer.d.ts +1 -1
  89. package/dist/{cjs/codec.d.ts → codec.d.ts} +0 -0
  90. package/dist/{cjs/dtmf.d.ts → dtmf.d.ts} +0 -0
  91. package/dist/{cjs/sip-message → sip-message}/inbound/index.d.ts +0 -0
  92. package/dist/{esm/sip-message → sip-message}/index.d.ts +2 -2
  93. package/dist/{cjs/sip-message → sip-message}/outbound/index.d.ts +0 -0
  94. package/dist/{cjs/sip-message → sip-message}/outbound/request.d.ts +0 -0
  95. package/dist/{cjs/sip-message → sip-message}/outbound/response.d.ts +1 -1
  96. /package/dist/{cjs/sip-message → sip-message}/response-codes.d.ts +0 -0
  97. /package/dist/{cjs/sip-message → sip-message}/sip-message.d.ts +0 -0
  98. /package/dist/{cjs/types.d.ts → types.d.ts} +0 -0
@@ -1,76 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const node_events_1 = __importDefault(require("node:events"));
7
- const node_buffer_1 = require("node:buffer");
8
- const werift_rtp_1 = require("werift-rtp");
9
- class Streamer extends node_events_1.default {
10
- paused = false;
11
- callSession;
12
- buffer;
13
- originalBuffer;
14
- constructor(callSesstion, buffer) {
15
- super();
16
- this.callSession = callSesstion;
17
- this.buffer = buffer;
18
- this.originalBuffer = buffer;
19
- }
20
- start() {
21
- this.buffer = this.originalBuffer;
22
- this.paused = false;
23
- this.sendPacket();
24
- }
25
- stop() {
26
- this.buffer = node_buffer_1.Buffer.alloc(0);
27
- }
28
- pause() {
29
- this.paused = true;
30
- }
31
- resume() {
32
- this.paused = false;
33
- this.sendPacket();
34
- }
35
- get finished() {
36
- return this.callSession.disposed ||
37
- this.buffer.length < this.callSession.softphone.codec.packetSize;
38
- }
39
- sendPacket() {
40
- if (!this.paused && !this.finished) {
41
- const temp = this.callSession.encoder.encode(this.buffer.subarray(0, this.callSession.softphone.codec.packetSize));
42
- const rtpPacket = new werift_rtp_1.RtpPacket(new werift_rtp_1.RtpHeader({
43
- version: 2,
44
- padding: false,
45
- paddingSize: 0,
46
- extension: false,
47
- marker: false,
48
- payloadOffset: 12,
49
- payloadType: this.callSession.softphone.codec.id,
50
- sequenceNumber: this.callSession.sequenceNumber,
51
- timestamp: this.callSession.timestamp,
52
- ssrc: this.callSession.ssrc,
53
- csrcLength: 0,
54
- csrc: [],
55
- extensionProfile: 48862,
56
- extensionLength: undefined,
57
- extensions: [],
58
- }), temp);
59
- this.callSession.send(this.callSession.srtpSession.encrypt(rtpPacket.payload, rtpPacket.header));
60
- this.callSession.sequenceNumber += 1;
61
- if (this.callSession.sequenceNumber > 65535) {
62
- this.callSession.sequenceNumber = 0;
63
- }
64
- this.callSession.timestamp +=
65
- this.callSession.softphone.codec.timestampInterval;
66
- this.buffer = this.buffer.subarray(this.callSession.softphone.codec.packetSize);
67
- if (this.finished) {
68
- this.emit("finished");
69
- }
70
- else {
71
- setTimeout(() => this.sendPacket(), 20);
72
- }
73
- }
74
- }
75
- }
76
- exports.default = Streamer;
package/dist/cjs/codec.js DELETED
@@ -1,65 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const node_buffer_1 = require("node:buffer");
4
- const opus_1 = require("@evan/opus");
5
- class Codec {
6
- id;
7
- name;
8
- packetSize;
9
- timestampInterval;
10
- createEncoder;
11
- createDecoder;
12
- constructor(name) {
13
- this.name = name;
14
- switch (name) {
15
- case "OPUS/16000": {
16
- this.createEncoder = () => {
17
- const encoder = new opus_1.Encoder({ channels: 1, sample_rate: 16000 });
18
- return { encode: (pcm) => node_buffer_1.Buffer.from(encoder.encode(pcm)) };
19
- };
20
- this.createDecoder = () => {
21
- const decoder = new opus_1.Decoder({ channels: 1, sample_rate: 16000 });
22
- return {
23
- decode: (opus) => node_buffer_1.Buffer.from(decoder.decode(opus)),
24
- };
25
- };
26
- this.id = 109;
27
- this.packetSize = 640;
28
- this.timestampInterval = 320;
29
- break;
30
- }
31
- case "OPUS/48000/2": {
32
- this.createEncoder = () => {
33
- const encoder = new opus_1.Encoder({ channels: 2, sample_rate: 48000 });
34
- return { encode: (pcm) => node_buffer_1.Buffer.from(encoder.encode(pcm)) };
35
- };
36
- this.createDecoder = () => {
37
- const decoder = new opus_1.Decoder({ channels: 2, sample_rate: 48000 });
38
- return {
39
- decode: (opus) => node_buffer_1.Buffer.from(decoder.decode(opus)),
40
- };
41
- };
42
- this.id = 111;
43
- this.packetSize = 3840;
44
- this.timestampInterval = 960;
45
- break;
46
- }
47
- case "PCMU/8000": {
48
- this.createEncoder = () => {
49
- return { encode: (pcm) => pcm };
50
- };
51
- this.createDecoder = () => {
52
- return { decode: (audio) => audio };
53
- };
54
- this.id = 0;
55
- this.packetSize = 160;
56
- this.timestampInterval = 160;
57
- break;
58
- }
59
- default: {
60
- throw new Error(`unsupported codec: ${name}`);
61
- }
62
- }
63
- }
64
- }
65
- exports.default = Codec;
package/dist/cjs/dtmf.js DELETED
@@ -1,45 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const node_buffer_1 = require("node:buffer");
4
- class DTMF {
5
- static 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
- static payloads = [
20
- 0x00060000,
21
- 0x000600a0,
22
- 0x00060140,
23
- 0x00860320,
24
- 0x00860320,
25
- 0x00860320,
26
- ];
27
- static charToPayloads = (char) => {
28
- const index = DTMF.phoneChars.indexOf(char[0]);
29
- if (index === -1) {
30
- throw new Error("invalid phone char");
31
- }
32
- return DTMF.payloads.map((payload) => {
33
- const temp = payload + index * 0x01000000;
34
- const buffer = node_buffer_1.Buffer.alloc(4);
35
- buffer.writeIntBE(temp, 0, 4);
36
- return buffer;
37
- });
38
- };
39
- static payloadToChar = (payload) => {
40
- const intBE = payload.readIntBE(0, 4);
41
- const index = (intBE - 0x00060000) / 0x01000000;
42
- return DTMF.phoneChars[index];
43
- };
44
- }
45
- exports.default = DTMF;
package/dist/cjs/index.js DELETED
@@ -1,209 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const node_events_1 = __importDefault(require("node:events"));
7
- const node_tls_1 = __importDefault(require("node:tls"));
8
- const wait_for_async_1 = __importDefault(require("wait-for-async"));
9
- const inbound_js_1 = __importDefault(require("./call-session/inbound.js"));
10
- const outbound_js_1 = __importDefault(require("./call-session/outbound.js"));
11
- const index_js_1 = require("./sip-message/index.js");
12
- const utils_js_1 = require("./utils.js");
13
- const codec_js_1 = __importDefault(require("./codec.js"));
14
- class Softphone extends node_events_1.default {
15
- sipInfo;
16
- client;
17
- codec;
18
- fakeDomain = (0, utils_js_1.uuid)() + ".invalid";
19
- fakeEmail = (0, utils_js_1.uuid)() + "@" + this.fakeDomain;
20
- intervalHandle;
21
- connected = false;
22
- constructor(sipInfo) {
23
- super();
24
- if (sipInfo.codec === undefined) {
25
- sipInfo.codec = "OPUS/16000";
26
- }
27
- this.codec = new codec_js_1.default(sipInfo.codec);
28
- this.sipInfo = sipInfo;
29
- if (this.sipInfo.domain === undefined) {
30
- this.sipInfo.domain = "sip.ringcentral.com";
31
- }
32
- if (this.sipInfo.outboundProxy === undefined) {
33
- this.sipInfo.outboundProxy = "sip10.ringcentral.com:5096";
34
- }
35
- const tokens = this.sipInfo.outboundProxy.split(":");
36
- this.client = node_tls_1.default.connect({
37
- host: tokens[0],
38
- port: parseInt(tokens[1], 10),
39
- rejectUnauthorized: !this.sipInfo.ignoreTlsCertErrors,
40
- }, () => {
41
- this.connected = true;
42
- });
43
- let cache = "";
44
- this.client.on("data", (data) => {
45
- cache += data.toString("utf-8");
46
- if (!cache.endsWith("\r\n")) {
47
- return; // haven't received a complete message yet
48
- }
49
- // received two empty body messages
50
- const tempMessages = cache
51
- .split("\r\nContent-Length: 0\r\n\r\n")
52
- .filter((message) => message.trim() !== "");
53
- cache = "";
54
- for (let i = 0; i < tempMessages.length; i++) {
55
- if (!tempMessages[i].includes("Content-Length: ")) {
56
- tempMessages[i] = tempMessages[i] + "\r\nContent-Length: 0";
57
- }
58
- }
59
- for (const message of tempMessages) {
60
- this.emit("message", index_js_1.InboundMessage.fromString(message));
61
- }
62
- });
63
- }
64
- instanceId = (0, utils_js_1.uuid)();
65
- registerCallId = (0, utils_js_1.uuid)();
66
- async register() {
67
- if (!this.connected) {
68
- await (0, wait_for_async_1.default)({
69
- interval: 100,
70
- times: 100,
71
- condition: () => this.connected,
72
- });
73
- if (!this.connected) {
74
- throw new Error("Failed to register: connect to TLS timeout");
75
- }
76
- }
77
- const sipRegister = async () => {
78
- const fromTag = (0, utils_js_1.uuid)();
79
- const requestMessage = new index_js_1.RequestMessage(`REGISTER sip:${this.sipInfo.domain} SIP/2.0`, {
80
- Via: `SIP/2.0/TLS ${this.client.localAddress}:${this.client.localPort};rport;branch=${(0, utils_js_1.branch)()};alias`,
81
- "Max-Forwards": "70",
82
- From: `<sip:${this.sipInfo.username}@${this.sipInfo.domain}>;tag=${fromTag}`,
83
- To: `<sip:${this.sipInfo.username}@${this.sipInfo.domain}>`,
84
- "Call-ID": this.registerCallId,
85
- Contact: `<sip:${this.sipInfo.username}@${this.client.localAddress}:${this.client.localPort};transport=TLS;ob>;reg-id=1;+sip.instance="<urn:uuid:${this.instanceId}>"`,
86
- Expires: 3600,
87
- Allow: "PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS",
88
- });
89
- const inboundMessage = await this.send(requestMessage, true);
90
- if (inboundMessage.subject.startsWith("SIP/2.0 200 ")) {
91
- // sometimes the server will return 200 OK directly
92
- return;
93
- }
94
- const wwwAuth = inboundMessage.getHeader("Www-Authenticate");
95
- const nonce = wwwAuth.match(/, nonce="(.+?)"/)[1];
96
- const newMessage = requestMessage.fork();
97
- newMessage.headers.Authorization = (0, utils_js_1.generateAuthorization)(this.sipInfo, nonce, "REGISTER");
98
- const message = await this.send(newMessage, true);
99
- if (!message.subject.startsWith("SIP/2.0 200 ")) {
100
- throw new Error("Failed to register: " + message.subject);
101
- }
102
- };
103
- await sipRegister();
104
- this.intervalHandle = setInterval(() => {
105
- sipRegister();
106
- }, 30 * 1000);
107
- this.on("message", (inboundMessage) => {
108
- if (!inboundMessage.subject.startsWith("INVITE sip:")) {
109
- return;
110
- }
111
- const outboundMessage = new index_js_1.OutboundMessage("SIP/2.0 100 Trying", {
112
- Via: inboundMessage.headers.Via,
113
- "Call-ID": inboundMessage.getHeader("Call-ID"),
114
- From: inboundMessage.headers.From,
115
- To: inboundMessage.headers.To,
116
- CSeq: inboundMessage.headers.CSeq,
117
- "Content-Length": "0",
118
- });
119
- this.send(outboundMessage);
120
- this.emit("invite", inboundMessage);
121
- });
122
- }
123
- enableDebugMode() {
124
- this.on("message", (message) => console.log(`Receiving...(${new Date()})\n` + message.toString()));
125
- const tlsWrite = this.client.write.bind(this.client);
126
- this.client.write = (message) => {
127
- console.log(`Sending...(${new Date()})\n` + message);
128
- return tlsWrite(message);
129
- };
130
- }
131
- revoke() {
132
- clearInterval(this.intervalHandle);
133
- this.removeAllListeners();
134
- this.client.removeAllListeners();
135
- this.client.destroy();
136
- }
137
- send(message, waitForReply = false) {
138
- this.client.write(message.toString());
139
- if (!waitForReply) {
140
- return new Promise((resolve) => {
141
- resolve(undefined);
142
- });
143
- }
144
- return new Promise((resolve) => {
145
- const messageListerner = (inboundMessage) => {
146
- // "12563 INVITE" vs "12563 ACK"
147
- if (inboundMessage.headers.CSeq.trim().split(/\s+/)[0] !==
148
- message.headers.CSeq.trim().split(/\s+/)[0]) {
149
- return;
150
- }
151
- if (inboundMessage.subject.startsWith("SIP/2.0 100 ")) {
152
- return; // ignore
153
- }
154
- this.off("message", messageListerner);
155
- resolve(inboundMessage);
156
- };
157
- this.on("message", messageListerner);
158
- });
159
- }
160
- async answer(inviteMessage) {
161
- const inboundCallSession = new inbound_js_1.default(this, inviteMessage);
162
- await inboundCallSession.answer();
163
- return inboundCallSession;
164
- }
165
- // decline an inbound call
166
- async decline(inviteMessage) {
167
- const newMessage = new index_js_1.ResponseMessage(inviteMessage, 603);
168
- await this.send(newMessage);
169
- }
170
- async call(callee) {
171
- const offerSDP = `
172
- v=0
173
- o=- ${Date.now()} 0 IN IP4 ${this.client.localAddress}
174
- s=rc-softphone-ts
175
- c=IN IP4 ${this.client.localAddress}
176
- t=0 0
177
- m=audio ${(0, utils_js_1.randomInt)()} RTP/SAVP ${this.codec.id} 101
178
- a=rtpmap:${this.codec.id} ${this.codec.name}
179
- a=rtpmap:101 telephone-event/8000
180
- a=fmtp:101 0-15
181
- a=sendrecv
182
- a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:${utils_js_1.localKey}
183
- `.trim();
184
- const inviteMessage = new index_js_1.RequestMessage(`INVITE sip:${callee}@${this.sipInfo.domain} SIP/2.0`, {
185
- Via: `SIP/2.0/TLS ${this.client.localAddress}:${this.client.localPort};rport;branch=${(0, utils_js_1.branch)()};alias`,
186
- "Max-Forwards": 70,
187
- From: `<sip:${this.sipInfo.username}@${this.sipInfo.domain}>;tag=${(0, utils_js_1.uuid)()}`,
188
- To: `<sip:${callee}@sip.ringcentral.com>`,
189
- Contact: ` <sip:${this.sipInfo.username}@${this.client.localAddress}:${this.client.localPort};transport=TLS;ob>`,
190
- "Call-ID": (0, utils_js_1.uuid)(),
191
- Route: `<sip:${this.sipInfo.outboundProxy};transport=tls;lr>`,
192
- Allow: `PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS`,
193
- Supported: `replaces, 100rel, timer, norefersub`,
194
- "Session-Expires": 1800,
195
- "Min-SE": 90,
196
- "Content-Type": "application/sdp",
197
- }, offerSDP);
198
- const inboundMessage = await this.send(inviteMessage, true);
199
- const proxyAuthenticate = inboundMessage.getHeader("Proxy-Authenticate");
200
- const nonce = proxyAuthenticate.match(/, nonce="(.+?)"/)[1];
201
- const newMessage = inviteMessage.fork();
202
- newMessage.headers["Proxy-Authorization"] = (0, utils_js_1.generateAuthorization)(this.sipInfo, nonce, "INVITE");
203
- const progressMessage = await this.send(newMessage, true);
204
- const outboundCallSession = new outbound_js_1.default(this, progressMessage);
205
- outboundCallSession.sdp = offerSDP;
206
- return outboundCallSession;
207
- }
208
- }
209
- exports.default = Softphone;
@@ -1,22 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const utils_js_1 = require("../../utils.js");
7
- const sip_message_js_1 = __importDefault(require("../sip-message.js"));
8
- class InboundMessage extends sip_message_js_1.default {
9
- static fromString(str) {
10
- const sipMessage = new sip_message_js_1.default();
11
- const [init, ...body] = str.split("\r\n\r\n");
12
- sipMessage.body = body.join("\r\n\r\n");
13
- const [subject, ...headers] = init.split("\r\n");
14
- sipMessage.subject = subject;
15
- sipMessage.headers = Object.fromEntries(headers.map((line) => line.split(": ")));
16
- if (sipMessage.headers.To && !sipMessage.headers.To.includes(";tag=")) {
17
- sipMessage.headers.To += ";tag=" + (0, utils_js_1.uuid)(); // generate local tag
18
- }
19
- return sipMessage;
20
- }
21
- }
22
- exports.default = InboundMessage;
@@ -1,5 +0,0 @@
1
- export { default as RequestMessage } from "./outbound/request.js";
2
- export { default as ResponseMessage } from "./outbound/response.js";
3
- export { default as OutboundMessage } from "./outbound/index.js";
4
- export { default as InboundMessage } from "./inbound/index.js";
5
- export { default as SipMessage } from "./sip-message.js";
@@ -1,16 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SipMessage = exports.InboundMessage = exports.OutboundMessage = exports.ResponseMessage = exports.RequestMessage = void 0;
7
- var request_js_1 = require("./outbound/request.js");
8
- Object.defineProperty(exports, "RequestMessage", { enumerable: true, get: function () { return __importDefault(request_js_1).default; } });
9
- var response_js_1 = require("./outbound/response.js");
10
- Object.defineProperty(exports, "ResponseMessage", { enumerable: true, get: function () { return __importDefault(response_js_1).default; } });
11
- var index_js_1 = require("./outbound/index.js");
12
- Object.defineProperty(exports, "OutboundMessage", { enumerable: true, get: function () { return __importDefault(index_js_1).default; } });
13
- var index_js_2 = require("./inbound/index.js");
14
- Object.defineProperty(exports, "InboundMessage", { enumerable: true, get: function () { return __importDefault(index_js_2).default; } });
15
- var sip_message_js_1 = require("./sip-message.js");
16
- Object.defineProperty(exports, "SipMessage", { enumerable: true, get: function () { return __importDefault(sip_message_js_1).default; } });
@@ -1,14 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const sip_message_js_1 = __importDefault(require("../sip-message.js"));
7
- class OutboundMessage extends sip_message_js_1.default {
8
- constructor(subject = "", headers = {}, body = "") {
9
- super(subject, headers, body);
10
- this.headers["Content-Length"] = this.body.length.toString();
11
- this.headers["User-Agent"] = "ringcentral-softphone-ts";
12
- }
13
- }
14
- exports.default = OutboundMessage;
@@ -1,28 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const index_js_1 = __importDefault(require("./index.js"));
7
- const utils_js_1 = require("../../utils.js");
8
- let cseq = Math.floor(Math.random() * 10000);
9
- class RequestMessage extends index_js_1.default {
10
- constructor(subject = "", headers = {}, body = "") {
11
- super(subject, headers, body);
12
- if (this.headers.CSeq === undefined) {
13
- this.newCseq();
14
- }
15
- }
16
- newCseq() {
17
- this.headers.CSeq = `${++cseq} ${this.subject.split(" ")[0]}`;
18
- }
19
- fork() {
20
- const newMessage = new RequestMessage(this.subject, { ...this.headers }, this.body);
21
- newMessage.newCseq();
22
- if (newMessage.headers.Via) {
23
- newMessage.headers.Via = newMessage.headers.Via.replace(/;branch=.+?$/, `;branch=${(0, utils_js_1.branch)()}`);
24
- }
25
- return newMessage;
26
- }
27
- }
28
- exports.default = RequestMessage;
@@ -1,25 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const index_js_1 = __importDefault(require("./index.js"));
7
- const response_codes_js_1 = __importDefault(require("../response-codes.js"));
8
- class ResponseMessage extends index_js_1.default {
9
- constructor(inboundMessage, responseCode, headers = {}, body = "") {
10
- super(undefined, { ...headers }, body);
11
- this.subject = `SIP/2.0 ${responseCode} ${response_codes_js_1.default[responseCode]}`;
12
- const requiredKeys = new Set(["via", "from", "to", "call-id", "cseq"]);
13
- const allKeys = Object.keys(inboundMessage.headers).reduce((acc, key) => {
14
- acc[key.toLowerCase()] = key;
15
- return acc;
16
- }, {});
17
- for (const key of requiredKeys) {
18
- if (allKeys[key]) {
19
- const originalKey = allKeys[key];
20
- this.headers[originalKey] = inboundMessage.headers[originalKey];
21
- }
22
- }
23
- }
24
- }
25
- exports.default = ResponseMessage;
@@ -1,83 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- // Ref: https://en.wikipedia.org/wiki/List_of_SIP_response_codes'
4
- const responseCodes = {
5
- 100: "Trying",
6
- 180: "Ringing",
7
- 181: "Call is Being Forwarded",
8
- 182: "Queued",
9
- 183: "Session Progress",
10
- 199: "Early Dialog Terminated",
11
- 200: "OK",
12
- 202: "Accepted",
13
- 204: "No Notification",
14
- 300: "Multiple Choices",
15
- 301: "Moved Permanently",
16
- 302: "Moved Temporarily",
17
- 305: "Use Proxy",
18
- 380: "Alternative Service",
19
- 400: "Bad Request",
20
- 401: "Unauthorized",
21
- 402: "Payment Required",
22
- 403: "Forbidden",
23
- 404: "Not Found",
24
- 405: "Method Not Allowed",
25
- 406: "Not Acceptable",
26
- 407: "Proxy Authentication Required",
27
- 408: "Request Timeout",
28
- 409: "Conflict",
29
- 410: "Gone",
30
- 411: "Length Required",
31
- 412: "Conditional Request Failed",
32
- 413: "Request Entity Too Large",
33
- 414: "Request-URI Too Long",
34
- 415: "Unsupported Media Type",
35
- 416: "Unsupported URI Scheme",
36
- 417: "Unknown Resource-Priority",
37
- 420: "Bad Extension",
38
- 421: "Extension Required",
39
- 422: "Session Interval Too Small",
40
- 423: "Interval Too Brief",
41
- 424: "Bad Location Information",
42
- 425: "Bad Alert Message",
43
- 428: "Use Identity Header",
44
- 429: "Provide Referrer Identity",
45
- 430: "Flow Failed",
46
- 433: "Anonymity Disallowed",
47
- 436: "Bad Identity-Info",
48
- 437: "Unsupported Certificate",
49
- 438: "Invalid Identity Header",
50
- 439: "First Hop Lacks Outbound Support",
51
- 440: "Max-Breadth Exceeded",
52
- 469: "Bad Info Package",
53
- 470: "Consent Needed",
54
- 480: "Temporarily Unavailable",
55
- 481: "Call/Transaction Does Not Exist",
56
- 482: "Loop Detected",
57
- 483: "Too Many Hops",
58
- 484: "Address Incomplete",
59
- 485: "Ambiguous",
60
- 486: "Busy Here",
61
- 487: "Request Terminated",
62
- 488: "Not Acceptable Here",
63
- 489: "Bad Event",
64
- 491: "Request Pending",
65
- 493: "Undecipherable",
66
- 494: "Security Agreement Required",
67
- 500: "Server Internal Error",
68
- 501: "Not Implemented",
69
- 502: "Bad Gateway",
70
- 503: "Service Unavailable",
71
- 504: "Server Time-out",
72
- 505: "Version Not Supported",
73
- 513: "Message Too Large",
74
- 555: "Push Notification Service Not Supported",
75
- 580: "Precondition Failure",
76
- 600: "Busy Everywhere",
77
- 603: "Decline",
78
- 604: "Does Not Exist Anywhere",
79
- 606: "Not Acceptable",
80
- 607: "Unwanted",
81
- 608: "Rejected",
82
- };
83
- exports.default = responseCodes;
@@ -1,34 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- class SipMessage {
4
- subject;
5
- headers;
6
- body;
7
- constructor(subject = "", headers = {}, body = "") {
8
- this.subject = subject;
9
- this.headers = headers;
10
- this.body = body
11
- .trim()
12
- .split(/[\r\n]+/)
13
- .join("\r\n");
14
- if (this.body.length > 0) {
15
- this.body += "\r\n";
16
- }
17
- }
18
- toString() {
19
- const r = [
20
- this.subject,
21
- ...Object.keys(this.headers).map((key) => `${key}: ${this.headers[key]}`),
22
- "",
23
- this.body,
24
- ].join("\r\n");
25
- return r;
26
- }
27
- getHeader(key) {
28
- const foundKey = Object.keys(this.headers).find((k) => k.toLowerCase() === key.toLowerCase());
29
- if (foundKey) {
30
- return this.headers[foundKey];
31
- }
32
- }
33
- }
34
- exports.default = SipMessage;
package/dist/cjs/types.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });