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
@@ -0,0 +1,102 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var response_codes_exports = {};
19
+ __export(response_codes_exports, {
20
+ default: () => response_codes_default
21
+ });
22
+ module.exports = __toCommonJS(response_codes_exports);
23
+ const responseCodes = {
24
+ 100: "Trying",
25
+ 180: "Ringing",
26
+ 181: "Call is Being Forwarded",
27
+ 182: "Queued",
28
+ 183: "Session Progress",
29
+ 199: "Early Dialog Terminated",
30
+ 200: "OK",
31
+ 202: "Accepted",
32
+ 204: "No Notification",
33
+ 300: "Multiple Choices",
34
+ 301: "Moved Permanently",
35
+ 302: "Moved Temporarily",
36
+ 305: "Use Proxy",
37
+ 380: "Alternative Service",
38
+ 400: "Bad Request",
39
+ 401: "Unauthorized",
40
+ 402: "Payment Required",
41
+ 403: "Forbidden",
42
+ 404: "Not Found",
43
+ 405: "Method Not Allowed",
44
+ 406: "Not Acceptable",
45
+ 407: "Proxy Authentication Required",
46
+ 408: "Request Timeout",
47
+ 409: "Conflict",
48
+ 410: "Gone",
49
+ 411: "Length Required",
50
+ 412: "Conditional Request Failed",
51
+ 413: "Request Entity Too Large",
52
+ 414: "Request-URI Too Long",
53
+ 415: "Unsupported Media Type",
54
+ 416: "Unsupported URI Scheme",
55
+ 417: "Unknown Resource-Priority",
56
+ 420: "Bad Extension",
57
+ 421: "Extension Required",
58
+ 422: "Session Interval Too Small",
59
+ 423: "Interval Too Brief",
60
+ 424: "Bad Location Information",
61
+ 425: "Bad Alert Message",
62
+ 428: "Use Identity Header",
63
+ 429: "Provide Referrer Identity",
64
+ 430: "Flow Failed",
65
+ 433: "Anonymity Disallowed",
66
+ 436: "Bad Identity-Info",
67
+ 437: "Unsupported Certificate",
68
+ 438: "Invalid Identity Header",
69
+ 439: "First Hop Lacks Outbound Support",
70
+ 440: "Max-Breadth Exceeded",
71
+ 469: "Bad Info Package",
72
+ 470: "Consent Needed",
73
+ 480: "Temporarily Unavailable",
74
+ 481: "Call/Transaction Does Not Exist",
75
+ 482: "Loop Detected",
76
+ 483: "Too Many Hops",
77
+ 484: "Address Incomplete",
78
+ 485: "Ambiguous",
79
+ 486: "Busy Here",
80
+ 487: "Request Terminated",
81
+ 488: "Not Acceptable Here",
82
+ 489: "Bad Event",
83
+ 491: "Request Pending",
84
+ 493: "Undecipherable",
85
+ 494: "Security Agreement Required",
86
+ 500: "Server Internal Error",
87
+ 501: "Not Implemented",
88
+ 502: "Bad Gateway",
89
+ 503: "Service Unavailable",
90
+ 504: "Server Time-out",
91
+ 505: "Version Not Supported",
92
+ 513: "Message Too Large",
93
+ 555: "Push Notification Service Not Supported",
94
+ 580: "Precondition Failure",
95
+ 600: "Busy Everywhere",
96
+ 603: "Decline",
97
+ 604: "Does Not Exist Anywhere",
98
+ 606: "Not Acceptable",
99
+ 607: "Unwanted",
100
+ 608: "Rejected"
101
+ };
102
+ var response_codes_default = responseCodes;
@@ -0,0 +1,83 @@
1
+ const responseCodes = {
2
+ 100: "Trying",
3
+ 180: "Ringing",
4
+ 181: "Call is Being Forwarded",
5
+ 182: "Queued",
6
+ 183: "Session Progress",
7
+ 199: "Early Dialog Terminated",
8
+ 200: "OK",
9
+ 202: "Accepted",
10
+ 204: "No Notification",
11
+ 300: "Multiple Choices",
12
+ 301: "Moved Permanently",
13
+ 302: "Moved Temporarily",
14
+ 305: "Use Proxy",
15
+ 380: "Alternative Service",
16
+ 400: "Bad Request",
17
+ 401: "Unauthorized",
18
+ 402: "Payment Required",
19
+ 403: "Forbidden",
20
+ 404: "Not Found",
21
+ 405: "Method Not Allowed",
22
+ 406: "Not Acceptable",
23
+ 407: "Proxy Authentication Required",
24
+ 408: "Request Timeout",
25
+ 409: "Conflict",
26
+ 410: "Gone",
27
+ 411: "Length Required",
28
+ 412: "Conditional Request Failed",
29
+ 413: "Request Entity Too Large",
30
+ 414: "Request-URI Too Long",
31
+ 415: "Unsupported Media Type",
32
+ 416: "Unsupported URI Scheme",
33
+ 417: "Unknown Resource-Priority",
34
+ 420: "Bad Extension",
35
+ 421: "Extension Required",
36
+ 422: "Session Interval Too Small",
37
+ 423: "Interval Too Brief",
38
+ 424: "Bad Location Information",
39
+ 425: "Bad Alert Message",
40
+ 428: "Use Identity Header",
41
+ 429: "Provide Referrer Identity",
42
+ 430: "Flow Failed",
43
+ 433: "Anonymity Disallowed",
44
+ 436: "Bad Identity-Info",
45
+ 437: "Unsupported Certificate",
46
+ 438: "Invalid Identity Header",
47
+ 439: "First Hop Lacks Outbound Support",
48
+ 440: "Max-Breadth Exceeded",
49
+ 469: "Bad Info Package",
50
+ 470: "Consent Needed",
51
+ 480: "Temporarily Unavailable",
52
+ 481: "Call/Transaction Does Not Exist",
53
+ 482: "Loop Detected",
54
+ 483: "Too Many Hops",
55
+ 484: "Address Incomplete",
56
+ 485: "Ambiguous",
57
+ 486: "Busy Here",
58
+ 487: "Request Terminated",
59
+ 488: "Not Acceptable Here",
60
+ 489: "Bad Event",
61
+ 491: "Request Pending",
62
+ 493: "Undecipherable",
63
+ 494: "Security Agreement Required",
64
+ 500: "Server Internal Error",
65
+ 501: "Not Implemented",
66
+ 502: "Bad Gateway",
67
+ 503: "Service Unavailable",
68
+ 504: "Server Time-out",
69
+ 505: "Version Not Supported",
70
+ 513: "Message Too Large",
71
+ 555: "Push Notification Service Not Supported",
72
+ 580: "Precondition Failure",
73
+ 600: "Busy Everywhere",
74
+ 603: "Decline",
75
+ 604: "Does Not Exist Anywhere",
76
+ 606: "Not Acceptable",
77
+ 607: "Unwanted",
78
+ 608: "Rejected"
79
+ };
80
+ var response_codes_default = responseCodes;
81
+ export {
82
+ response_codes_default as default
83
+ };
@@ -0,0 +1,53 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var sip_message_exports = {};
19
+ __export(sip_message_exports, {
20
+ default: () => sip_message_default
21
+ });
22
+ module.exports = __toCommonJS(sip_message_exports);
23
+ class SipMessage {
24
+ subject;
25
+ headers;
26
+ body;
27
+ constructor(subject = "", headers = {}, body = "") {
28
+ this.subject = subject;
29
+ this.headers = headers;
30
+ this.body = body.trim().split(/[\r\n]+/).join("\r\n");
31
+ if (this.body.length > 0) {
32
+ this.body += "\r\n";
33
+ }
34
+ }
35
+ toString() {
36
+ const r = [
37
+ this.subject,
38
+ ...Object.keys(this.headers).map((key) => `${key}: ${this.headers[key]}`),
39
+ "",
40
+ this.body
41
+ ].join("\r\n");
42
+ return r;
43
+ }
44
+ getHeader(key) {
45
+ const foundKey = Object.keys(this.headers).find(
46
+ (k) => k.toLowerCase() === key.toLowerCase()
47
+ );
48
+ if (foundKey) {
49
+ return this.headers[foundKey];
50
+ }
51
+ }
52
+ }
53
+ var sip_message_default = SipMessage;
@@ -0,0 +1,34 @@
1
+ class SipMessage {
2
+ subject;
3
+ headers;
4
+ body;
5
+ constructor(subject = "", headers = {}, body = "") {
6
+ this.subject = subject;
7
+ this.headers = headers;
8
+ this.body = body.trim().split(/[\r\n]+/).join("\r\n");
9
+ if (this.body.length > 0) {
10
+ this.body += "\r\n";
11
+ }
12
+ }
13
+ toString() {
14
+ const r = [
15
+ this.subject,
16
+ ...Object.keys(this.headers).map((key) => `${key}: ${this.headers[key]}`),
17
+ "",
18
+ this.body
19
+ ].join("\r\n");
20
+ return r;
21
+ }
22
+ getHeader(key) {
23
+ const foundKey = Object.keys(this.headers).find(
24
+ (k) => k.toLowerCase() === key.toLowerCase()
25
+ );
26
+ if (foundKey) {
27
+ return this.headers[foundKey];
28
+ }
29
+ }
30
+ }
31
+ var sip_message_default = SipMessage;
32
+ export {
33
+ sip_message_default as default
34
+ };
package/dist/types.cjs ADDED
@@ -0,0 +1,15 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __copyProps = (to, from, except, desc) => {
6
+ if (from && typeof from === "object" || typeof from === "function") {
7
+ for (let key of __getOwnPropNames(from))
8
+ if (!__hasOwnProp.call(to, key) && key !== except)
9
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
10
+ }
11
+ return to;
12
+ };
13
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
14
+ var types_exports = {};
15
+ module.exports = __toCommonJS(types_exports);
package/dist/types.js ADDED
File without changes
package/dist/utils.cjs ADDED
@@ -0,0 +1,80 @@
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 utils_exports = {};
29
+ __export(utils_exports, {
30
+ branch: () => branch,
31
+ extractAddress: () => extractAddress,
32
+ generateAuthorization: () => generateAuthorization,
33
+ localKey: () => localKey,
34
+ randomInt: () => randomInt,
35
+ uuid: () => uuid,
36
+ withoutTag: () => withoutTag
37
+ });
38
+ module.exports = __toCommonJS(utils_exports);
39
+ var import_node_crypto = __toESM(require("node:crypto"), 1);
40
+ const md5 = (s) => import_node_crypto.default.createHash("md5").update(s).digest("hex");
41
+ const generateResponse = (sipInfo, endpoint, nonce) => {
42
+ const ha1 = md5(
43
+ `${sipInfo.authorizationId}:${sipInfo.domain}:${sipInfo.password}`
44
+ );
45
+ const ha2 = md5(endpoint);
46
+ const response = md5(`${ha1}:${nonce}:${ha2}`);
47
+ return response;
48
+ };
49
+ const generateAuthorization = (sipInfo, nonce, method) => {
50
+ const authObj = {
51
+ "Digest algorithm": "MD5",
52
+ username: sipInfo.authorizationId,
53
+ realm: sipInfo.domain,
54
+ nonce,
55
+ uri: `sip:${sipInfo.domain}`,
56
+ response: generateResponse(
57
+ sipInfo,
58
+ `${method}:sip:${sipInfo.domain}`,
59
+ nonce
60
+ )
61
+ };
62
+ return Object.entries(authObj).map(([key, value]) => `${key}="${value}"`).join(", ");
63
+ };
64
+ const uuid = () => import_node_crypto.default.randomUUID();
65
+ const branch = () => `z9hG4bK-${uuid()}`;
66
+ const randomInt = () => Math.floor(Math.random() * (65535 - 1024 + 1)) + 1024;
67
+ const withoutTag = (s) => s.replace(/;tag=.*$/, "");
68
+ const extractAddress = (s) => s.match(/<(sip:.+?)>/)?.[1];
69
+ const keyAndSalt = import_node_crypto.default.randomBytes(30);
70
+ const localKey = keyAndSalt.toString("base64").replace(/=+$/, "");
71
+ // Annotate the CommonJS export names for ESM import in node:
72
+ 0 && (module.exports = {
73
+ branch,
74
+ extractAddress,
75
+ generateAuthorization,
76
+ localKey,
77
+ randomInt,
78
+ uuid,
79
+ withoutTag
80
+ });
@@ -1,8 +1,8 @@
1
- import { SoftPhoneOptions } from "./types.js";
1
+ import type { SoftPhoneOptions } from "./types.js";
2
2
  export declare const generateAuthorization: (sipInfo: SoftPhoneOptions, nonce: string, method: "REGISTER" | "INVITE") => string;
3
3
  export declare const uuid: () => `${string}-${string}-${string}-${string}-${string}`;
4
4
  export declare const branch: () => string;
5
5
  export declare const randomInt: () => number;
6
6
  export declare const withoutTag: (s: string) => string;
7
- export declare const extractAddress: (s: string) => string;
7
+ export declare const extractAddress: (s: string) => string | undefined;
8
8
  export declare const localKey: string;
package/dist/utils.js ADDED
@@ -0,0 +1,41 @@
1
+ import crypto from "node:crypto";
2
+ const md5 = (s) => crypto.createHash("md5").update(s).digest("hex");
3
+ const generateResponse = (sipInfo, endpoint, nonce) => {
4
+ const ha1 = md5(
5
+ `${sipInfo.authorizationId}:${sipInfo.domain}:${sipInfo.password}`
6
+ );
7
+ const ha2 = md5(endpoint);
8
+ const response = md5(`${ha1}:${nonce}:${ha2}`);
9
+ return response;
10
+ };
11
+ const generateAuthorization = (sipInfo, nonce, method) => {
12
+ const authObj = {
13
+ "Digest algorithm": "MD5",
14
+ username: sipInfo.authorizationId,
15
+ realm: sipInfo.domain,
16
+ nonce,
17
+ uri: `sip:${sipInfo.domain}`,
18
+ response: generateResponse(
19
+ sipInfo,
20
+ `${method}:sip:${sipInfo.domain}`,
21
+ nonce
22
+ )
23
+ };
24
+ return Object.entries(authObj).map(([key, value]) => `${key}="${value}"`).join(", ");
25
+ };
26
+ const uuid = () => crypto.randomUUID();
27
+ const branch = () => `z9hG4bK-${uuid()}`;
28
+ const randomInt = () => Math.floor(Math.random() * (65535 - 1024 + 1)) + 1024;
29
+ const withoutTag = (s) => s.replace(/;tag=.*$/, "");
30
+ const extractAddress = (s) => s.match(/<(sip:.+?)>/)?.[1];
31
+ const keyAndSalt = crypto.randomBytes(30);
32
+ const localKey = keyAndSalt.toString("base64").replace(/=+$/, "");
33
+ export {
34
+ branch,
35
+ extractAddress,
36
+ generateAuthorization,
37
+ localKey,
38
+ randomInt,
39
+ uuid,
40
+ withoutTag
41
+ };
package/package.json CHANGED
@@ -1,24 +1,27 @@
1
1
  {
2
2
  "name": "ringcentral-softphone",
3
- "version": "1.3.2",
3
+ "version": "1.3.4",
4
4
  "homepage": "https://github.com/ringcentral/ringcentral-softphone-ts",
5
5
  "license": "MIT",
6
- "types": "dist/esm/index.d.ts",
7
- "module": "dist/esm/index.js",
8
- "main": "dist/cjs/index.js",
6
+ "type": "module",
7
+ "types": "dist/index.d.ts",
8
+ "main": "dist/index.cjs",
9
+ "module": "dist/index.js",
9
10
  "files": [
10
11
  "dist"
11
12
  ],
12
13
  "exports": {
13
14
  ".": {
14
- "types": "./dist/esm/index.d.ts",
15
- "import": "./dist/esm/index.js",
16
- "require": "./dist/cjs/index.js"
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "require": "./dist/index.cjs",
18
+ "default": "./dist/index.js"
17
19
  },
18
20
  "./*": {
19
- "types": "./dist/esm/*.d.ts",
20
- "import": "./dist/esm/*.js",
21
- "require": "./dist/cjs/*.js"
21
+ "types": "./dist/*.d.ts",
22
+ "import": "./dist/*.js",
23
+ "require": "./dist/*.cjs",
24
+ "default": "./dist/*.js"
22
25
  }
23
26
  },
24
27
  "scripts": {
@@ -26,7 +29,8 @@
26
29
  "out": "rm -rf *.wav && tsx -r dotenv-override-true/config demos/outbound-call.ts",
27
30
  "join": "rm -rf *.wav && tsx -r dotenv-override-true/config demos/join-rcv-meeting.ts",
28
31
  "multi": "tsx -r dotenv-override-true/config demos/multiple-calls-sequentially.ts",
29
- "build": "tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json",
32
+ "lint": "biome check --write .",
33
+ "build": "tsup && tsc -p tsconfig.json --emitDeclarationOnly",
30
34
  "prepublishOnly": "yarn build",
31
35
  "postpublish": "rm -rf dist"
32
36
  },
@@ -37,10 +41,12 @@
37
41
  "werift-rtp": "^0.8.8"
38
42
  },
39
43
  "devDependencies": {
40
- "@types/node": "^25.2.0",
44
+ "@biomejs/biome": "^2.4.1",
45
+ "@types/node": "^25.6.0",
41
46
  "dotenv-override-true": "^6.2.2",
47
+ "tsup": "^8.5.1",
42
48
  "tsx": "^4.21.0",
43
- "typescript": "^5.9.3",
49
+ "typescript": "^6.0.3",
44
50
  "yarn-upgrade-all": "^0.7.5"
45
51
  },
46
52
  "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
@@ -1,57 +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 index_js_2 = require("../sip-message/index.js");
8
- const utils_js_1 = require("../utils.js");
9
- class InboundCallSession extends index_js_1.default {
10
- constructor(softphone, inviteMessage) {
11
- super(softphone, inviteMessage);
12
- this.localPeer = inviteMessage.headers.To;
13
- this.remotePeer = inviteMessage.headers.From;
14
- // inbound call from call queue, invite message may not have body
15
- if (inviteMessage.body.length > 0) {
16
- this.remoteKey = inviteMessage.body.match(/AES_CM_128_HMAC_SHA1_80 inline:([\w+/]+)/)[1];
17
- }
18
- }
19
- async answer() {
20
- const answerSDP = `
21
- v=0
22
- o=- ${Date.now()} 0 IN IP4 ${this.softphone.client.localAddress}
23
- s=rc-softphone-ts
24
- c=IN IP4 ${this.softphone.client.localAddress}
25
- t=0 0
26
- m=audio ${(0, utils_js_1.randomInt)()} RTP/SAVP ${this.softphone.codec.id} 101
27
- a=rtpmap:${this.softphone.codec.id} ${this.softphone.codec.name}
28
- a=rtpmap:101 telephone-event/8000
29
- a=fmtp:101 0-15
30
- a=sendrecv
31
- a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:${utils_js_1.localKey}
32
- `.trim();
33
- this.sdp = answerSDP;
34
- const newMessage = new index_js_2.OutboundMessage("SIP/2.0 200 OK", {
35
- Via: this.sipMessage.headers.Via,
36
- "Call-ID": this.sipMessage.getHeader("Call-ID"),
37
- From: this.sipMessage.headers.From,
38
- To: this.sipMessage.headers.To,
39
- CSeq: this.sipMessage.headers.CSeq,
40
- Contact: `<sip:${this.softphone.sipInfo.username}@${this.softphone.client.localAddress}:${this.softphone.client.localPort};transport=TLS;ob>`,
41
- Allow: "PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS",
42
- Supported: "replaces, 100rel, timer, norefersub",
43
- "Session-Expires": "14400;refresher=uac",
44
- Require: "timer",
45
- "Content-Type": "application/sdp",
46
- }, answerSDP);
47
- const ackMessage = await this.softphone.send(newMessage, true);
48
- // for inbound call from call queue, ack message may HAVE body (while invite message has no body)
49
- if (ackMessage.body.length > 0) {
50
- this.remoteIP = ackMessage.body.match(/c=IN IP4 ([\d.]+)/)[1];
51
- this.remotePort = parseInt(ackMessage.body.match(/m=audio (\d+) /)[1], 10);
52
- this.remoteKey = ackMessage.body.match(/AES_CM_128_HMAC_SHA1_80 inline:([\w+/]+)/)[1];
53
- }
54
- this.startLocalServices();
55
- }
56
- }
57
- exports.default = InboundCallSession;
@@ -1,44 +0,0 @@
1
- import dgram from "node:dgram";
2
- import EventEmitter from "node:events";
3
- import { Buffer } from "node:buffer";
4
- import { RtpPacket, SrtpSession } from "werift-rtp";
5
- import { type InboundMessage } from "../sip-message/index.js";
6
- import type Softphone from "../index.js";
7
- import Streamer from "./streamer.js";
8
- declare abstract class CallSession extends EventEmitter {
9
- softphone: Softphone;
10
- sipMessage: InboundMessage;
11
- socket: dgram.Socket;
12
- localPeer: string;
13
- remotePeer: string;
14
- remoteIP: string;
15
- remotePort: number;
16
- disposed: boolean;
17
- srtpSession: SrtpSession;
18
- encoder: {
19
- encode: (pcm: Buffer) => Buffer;
20
- };
21
- decoder: {
22
- decode: (audio: Buffer) => Buffer;
23
- };
24
- sdp: string;
25
- ssrc: number;
26
- sequenceNumber: number;
27
- timestamp: number;
28
- constructor(softphone: Softphone, sipMessage: InboundMessage);
29
- set remoteKey(key: string);
30
- get callId(): string;
31
- send(data: string | Buffer): void;
32
- hangup(): Promise<void>;
33
- sendDTMF(char: "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "*" | "#"): void;
34
- sendDTMFs(s: string, delay?: number): Promise<void>;
35
- streamAudio(input: Buffer): Streamer;
36
- sendPacket(rtpPacket: RtpPacket): void;
37
- protected startLocalServices(): void;
38
- protected dispose(): void;
39
- transfer(transferTo: string): Promise<void>;
40
- toggleReceive(toReceive: boolean): Promise<void>;
41
- hold(): Promise<void>;
42
- unhold(): Promise<void>;
43
- }
44
- export default CallSession;