telnyx 7.29.0 → 7.30.0-beta.0

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.
@@ -2,6 +2,7 @@ import { APIResource } from "../core/resource.js";
2
2
  import { APIPromise } from "../core/api-promise.js";
3
3
  import { DefaultFlatPagination, type DefaultFlatPaginationParams, PagePromise } from "../core/pagination.js";
4
4
  import { RequestOptions } from "../internal/request-options.js";
5
+ import { type LoginTokenOptions, type TokenMaterial } from "../lib/login-token.js";
5
6
  export declare class TelephonyCredentials extends APIResource {
6
7
  /**
7
8
  * Returns a paginated list of the on-demand telephony credentials on your account,
@@ -28,7 +29,7 @@ export declare class TelephonyCredentials extends APIResource {
28
29
  * });
29
30
  * ```
30
31
  */
31
- create(body: TelephonyCredentialCreateParams, options?: RequestOptions): APIPromise<TelephonyCredentialCreateResponse>;
32
+ create(params: TelephonyCredentialCreateParams, options?: RequestOptions): APIPromise<TelephonyCredentialCreateResponse>;
32
33
  /**
33
34
  * Permanently deletes the specified telephony credential, revoking any access it
34
35
  * provided.
@@ -60,6 +61,37 @@ export declare class TelephonyCredentials extends APIResource {
60
61
  * ```
61
62
  */
62
63
  update(id: string, body: TelephonyCredentialUpdateParams, options?: RequestOptions): APIPromise<TelephonyCredentialUpdateResponse>;
64
+ /**
65
+ * The material a login token is signed with (`kid`, `tel_token`,
66
+ * `signing_secret`), for a credential that did not come from `create`. Treat
67
+ * the result like the SIP password.
68
+ *
69
+ * @example
70
+ * ```ts
71
+ * const { data: tokenMaterial } =
72
+ * await client.telephonyCredentials.retrieveTokenMaterial('id');
73
+ * ```
74
+ */
75
+ retrieveTokenMaterial(id: string, options?: RequestOptions): APIPromise<TelephonyCredentialRetrieveTokenMaterialResponse>;
76
+ /**
77
+ * Mints a WebRTC login token for the credential locally: the same use as
78
+ * `createToken`, with no request to Telnyx per token. Uses the
79
+ * `token_material` of a credential from `create`, or `tokenMaterial` from the
80
+ * options, or fetches it once with `retrieveTokenMaterial`.
81
+ *
82
+ * `ttl` is the token lifetime in seconds, 1..86400, default one hour.
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * const { data: credential } = await client.telephonyCredentials.create({
87
+ * connection_id: '1234567890',
88
+ * });
89
+ * const loginToken = await client.telephonyCredentials.toJwt(credential);
90
+ * ```
91
+ */
92
+ toJwt(credential: TelephonyCredential, options?: LoginTokenOptions & {
93
+ requestOptions?: RequestOptions | undefined;
94
+ }): Promise<string>;
63
95
  /**
64
96
  * Create an Access Token (JWT) for the credential.
65
97
  *
@@ -114,6 +146,14 @@ export interface TelephonyCredential {
114
146
  * Identifies the user this credential is associated with.
115
147
  */
116
148
  user_id?: string;
149
+ /**
150
+ * What a login token is signed with. Returned by `create`; see `toJwt` and
151
+ * `retrieveTokenMaterial`.
152
+ */
153
+ token_material?: TokenMaterial;
154
+ }
155
+ export interface TelephonyCredentialRetrieveTokenMaterialResponse {
156
+ data?: TokenMaterial;
117
157
  }
118
158
  export interface TelephonyCredentialCreateResponse {
119
159
  data?: TelephonyCredential;
@@ -164,6 +204,11 @@ export declare namespace TelephonyCredentialListParams {
164
204
  }
165
205
  }
166
206
  export interface TelephonyCredentialCreateParams {
207
+ /**
208
+ * Query param: extra fields to return. `token_material` adds what `toJwt` signs
209
+ * with (as sensitive as `sip_password`; keep it on the server).
210
+ */
211
+ include?: 'token_material' | undefined;
167
212
  /**
168
213
  * Identifies the Credential Connection this credential is associated with.
169
214
  */
@@ -202,7 +247,8 @@ export interface TelephonyCredentialCreateTokenParams {
202
247
  */
203
248
  'Idempotency-Key'?: string;
204
249
  }
250
+ export type { LoginTokenOptions, TokenMaterial } from "../lib/login-token.js";
205
251
  export declare namespace TelephonyCredentials {
206
- export { type TelephonyCredential as TelephonyCredential, type TelephonyCredentialCreateResponse as TelephonyCredentialCreateResponse, type TelephonyCredentialRetrieveResponse as TelephonyCredentialRetrieveResponse, type TelephonyCredentialUpdateResponse as TelephonyCredentialUpdateResponse, type TelephonyCredentialDeleteResponse as TelephonyCredentialDeleteResponse, type TelephonyCredentialCreateTokenResponse as TelephonyCredentialCreateTokenResponse, type TelephonyCredentialsDefaultFlatPagination as TelephonyCredentialsDefaultFlatPagination, type TelephonyCredentialListParams as TelephonyCredentialListParams, type TelephonyCredentialCreateParams as TelephonyCredentialCreateParams, type TelephonyCredentialUpdateParams as TelephonyCredentialUpdateParams, type TelephonyCredentialCreateTokenParams as TelephonyCredentialCreateTokenParams, };
252
+ export { type TelephonyCredential as TelephonyCredential, type TelephonyCredentialCreateResponse as TelephonyCredentialCreateResponse, type TelephonyCredentialRetrieveResponse as TelephonyCredentialRetrieveResponse, type TelephonyCredentialUpdateResponse as TelephonyCredentialUpdateResponse, type TelephonyCredentialDeleteResponse as TelephonyCredentialDeleteResponse, type TelephonyCredentialCreateTokenResponse as TelephonyCredentialCreateTokenResponse, type TelephonyCredentialRetrieveTokenMaterialResponse as TelephonyCredentialRetrieveTokenMaterialResponse, type TokenMaterial as TokenMaterial, type TelephonyCredentialsDefaultFlatPagination as TelephonyCredentialsDefaultFlatPagination, type TelephonyCredentialListParams as TelephonyCredentialListParams, type TelephonyCredentialCreateParams as TelephonyCredentialCreateParams, type TelephonyCredentialUpdateParams as TelephonyCredentialUpdateParams, type TelephonyCredentialCreateTokenParams as TelephonyCredentialCreateTokenParams, };
207
253
  }
208
254
  //# sourceMappingURL=telephony-credentials.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"telephony-credentials.d.ts","sourceRoot":"","sources":["../src/resources/telephony-credentials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telephony-credentials.d.ts","sourceRoot":"","sources":["../src/resources/telephony-credentials.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ const resource_1 = require("../core/resource.js");
6
6
  const pagination_1 = require("../core/pagination.js");
7
7
  const headers_1 = require("../internal/headers.js");
8
8
  const path_1 = require("../internal/utils/path.js");
9
+ const login_token_1 = require("../lib/login-token.js");
9
10
  class TelephonyCredentials extends resource_1.APIResource {
10
11
  /**
11
12
  * Returns a paginated list of the on-demand telephony credentials on your account,
@@ -37,8 +38,14 @@ class TelephonyCredentials extends resource_1.APIResource {
37
38
  * });
38
39
  * ```
39
40
  */
40
- create(body, options) {
41
- return this._client.post('/telephony_credentials', { body, ...options });
41
+ create(params, options) {
42
+ // `include` is a query parameter; everything else is the body.
43
+ const { include, ...body } = params;
44
+ return this._client.post('/telephony_credentials', {
45
+ ...(include === undefined ? {} : { query: { include } }),
46
+ body,
47
+ ...options,
48
+ });
42
49
  }
43
50
  /**
44
51
  * Permanently deletes the specified telephony credential, revoking any access it
@@ -77,6 +84,43 @@ class TelephonyCredentials extends resource_1.APIResource {
77
84
  update(id, body, options) {
78
85
  return this._client.patch((0, path_1.path) `/telephony_credentials/${id}`, { body, ...options });
79
86
  }
87
+ /**
88
+ * The material a login token is signed with (`kid`, `tel_token`,
89
+ * `signing_secret`), for a credential that did not come from `create`. Treat
90
+ * the result like the SIP password.
91
+ *
92
+ * @example
93
+ * ```ts
94
+ * const { data: tokenMaterial } =
95
+ * await client.telephonyCredentials.retrieveTokenMaterial('id');
96
+ * ```
97
+ */
98
+ retrieveTokenMaterial(id, options) {
99
+ return this._client.get((0, path_1.path) `/telephony_credentials/${id}/token_material`, options);
100
+ }
101
+ /**
102
+ * Mints a WebRTC login token for the credential locally: the same use as
103
+ * `createToken`, with no request to Telnyx per token. Uses the
104
+ * `token_material` of a credential from `create`, or `tokenMaterial` from the
105
+ * options, or fetches it once with `retrieveTokenMaterial`.
106
+ *
107
+ * `ttl` is the token lifetime in seconds, 1..86400, default one hour.
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * const { data: credential } = await client.telephonyCredentials.create({
112
+ * connection_id: '1234567890',
113
+ * });
114
+ * const loginToken = await client.telephonyCredentials.toJwt(credential);
115
+ * ```
116
+ */
117
+ async toJwt(credential, options) {
118
+ const { requestOptions, ...tokenOptions } = options ?? {};
119
+ const tokenMaterial = tokenOptions.tokenMaterial ??
120
+ credential.token_material ??
121
+ (await this.retrieveTokenMaterial(credential.id ?? '', requestOptions)).data;
122
+ return (0, login_token_1.createLoginToken)(credential, { ...tokenOptions, tokenMaterial });
123
+ }
80
124
  /**
81
125
  * Create an Access Token (JWT) for the credential.
82
126
  *
@@ -1 +1 @@
1
- {"version":3,"file":"telephony-credentials.js","sourceRoot":"","sources":["../src/resources/telephony-credentials.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;AAEtF,kDAA+C;AAE/C,sDAA0G;AAC1G,oDAAmD;AAEnD,oDAA8C;AAE9C,MAAa,oBAAqB,SAAQ,sBAAW;IACnD;;;;;;;;;;;OAWG;IACH,IAAI,CACF,QAA0D,EAAE,EAC5D,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAA,kCAA0C,CAAA,EAAE;YACnG,KAAK;YACL,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CACJ,IAAqC,EACrC,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAU,EAAE,OAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAA,WAAI,EAAA,0BAA0B,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAU,EAAE,OAAwB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAA,WAAI,EAAA,0BAA0B,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CACJ,EAAU,EACV,IAAqC,EACrC,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAA,WAAI,EAAA,0BAA0B,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;IAED;;;;;;;;OAQG;IACH,WAAW,CACT,EAAU,EACV,SAAkE,EAAE,EACpE,OAAwB;QAExB,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAA,WAAI,EAAA,0BAA0B,EAAE,QAAQ,EAAE;YACjE,GAAG,OAAO;YACV,OAAO,EAAE,IAAA,sBAAY,EAAC;gBACpB;oBACE,MAAM,EAAE,YAAY;oBACpB,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;iBAChF;gBACD,OAAO,EAAE,OAAO;aACjB,CAAC;SACH,CAAC,CAAC;IACL,CAAC;CACF;AAhHD,oDAgHC"}
1
+ {"version":3,"file":"telephony-credentials.js","sourceRoot":"","sources":["../src/resources/telephony-credentials.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { APIResource } from "../core/resource.mjs";
3
3
  import { DefaultFlatPagination } from "../core/pagination.mjs";
4
4
  import { buildHeaders } from "../internal/headers.mjs";
5
5
  import { path } from "../internal/utils/path.mjs";
6
+ import { createLoginToken } from "../lib/login-token.mjs";
6
7
  export class TelephonyCredentials extends APIResource {
7
8
  /**
8
9
  * Returns a paginated list of the on-demand telephony credentials on your account,
@@ -34,8 +35,14 @@ export class TelephonyCredentials extends APIResource {
34
35
  * });
35
36
  * ```
36
37
  */
37
- create(body, options) {
38
- return this._client.post('/telephony_credentials', { body, ...options });
38
+ create(params, options) {
39
+ // `include` is a query parameter; everything else is the body.
40
+ const { include, ...body } = params;
41
+ return this._client.post('/telephony_credentials', {
42
+ ...(include === undefined ? {} : { query: { include } }),
43
+ body,
44
+ ...options,
45
+ });
39
46
  }
40
47
  /**
41
48
  * Permanently deletes the specified telephony credential, revoking any access it
@@ -74,6 +81,43 @@ export class TelephonyCredentials extends APIResource {
74
81
  update(id, body, options) {
75
82
  return this._client.patch(path `/telephony_credentials/${id}`, { body, ...options });
76
83
  }
84
+ /**
85
+ * The material a login token is signed with (`kid`, `tel_token`,
86
+ * `signing_secret`), for a credential that did not come from `create`. Treat
87
+ * the result like the SIP password.
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * const { data: tokenMaterial } =
92
+ * await client.telephonyCredentials.retrieveTokenMaterial('id');
93
+ * ```
94
+ */
95
+ retrieveTokenMaterial(id, options) {
96
+ return this._client.get(path `/telephony_credentials/${id}/token_material`, options);
97
+ }
98
+ /**
99
+ * Mints a WebRTC login token for the credential locally: the same use as
100
+ * `createToken`, with no request to Telnyx per token. Uses the
101
+ * `token_material` of a credential from `create`, or `tokenMaterial` from the
102
+ * options, or fetches it once with `retrieveTokenMaterial`.
103
+ *
104
+ * `ttl` is the token lifetime in seconds, 1..86400, default one hour.
105
+ *
106
+ * @example
107
+ * ```ts
108
+ * const { data: credential } = await client.telephonyCredentials.create({
109
+ * connection_id: '1234567890',
110
+ * });
111
+ * const loginToken = await client.telephonyCredentials.toJwt(credential);
112
+ * ```
113
+ */
114
+ async toJwt(credential, options) {
115
+ const { requestOptions, ...tokenOptions } = options ?? {};
116
+ const tokenMaterial = tokenOptions.tokenMaterial ??
117
+ credential.token_material ??
118
+ (await this.retrieveTokenMaterial(credential.id ?? '', requestOptions)).data;
119
+ return createLoginToken(credential, { ...tokenOptions, tokenMaterial });
120
+ }
77
121
  /**
78
122
  * Create an Access Token (JWT) for the credential.
79
123
  *
@@ -1 +1 @@
1
- {"version":3,"file":"telephony-credentials.mjs","sourceRoot":"","sources":["../src/resources/telephony-credentials.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,OAAO,EAAE,WAAW,EAAE,6BAAyB;AAE/C,OAAO,EAAE,qBAAqB,EAAiD,+BAA2B;AAC1G,OAAO,EAAE,YAAY,EAAE,gCAA4B;AAEnD,OAAO,EAAE,IAAI,EAAE,mCAA+B;AAE9C,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IACnD;;;;;;;;;;;OAWG;IACH,IAAI,CACF,QAA0D,EAAE,EAC5D,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAA,qBAA0C,CAAA,EAAE;YACnG,KAAK;YACL,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CACJ,IAAqC,EACrC,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAU,EAAE,OAAwB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAA,0BAA0B,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAU,EAAE,OAAwB;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAA,0BAA0B,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CACJ,EAAU,EACV,IAAqC,EACrC,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA,0BAA0B,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;IAED;;;;;;;;OAQG;IACH,WAAW,CACT,EAAU,EACV,SAAkE,EAAE,EACpE,OAAwB;QAExB,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA,0BAA0B,EAAE,QAAQ,EAAE;YACjE,GAAG,OAAO;YACV,OAAO,EAAE,YAAY,CAAC;gBACpB;oBACE,MAAM,EAAE,YAAY;oBACpB,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;iBAChF;gBACD,OAAO,EAAE,OAAO;aACjB,CAAC;SACH,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"telephony-credentials.mjs","sourceRoot":"","sources":["../src/resources/telephony-credentials.ts"],"names":[],"mappings":"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"}
package/src/client.ts CHANGED
@@ -966,10 +966,12 @@ import {
966
966
  TelephonyCredentialDeleteResponse,
967
967
  TelephonyCredentialListParams,
968
968
  TelephonyCredentialRetrieveResponse,
969
+ TelephonyCredentialRetrieveTokenMaterialResponse,
969
970
  TelephonyCredentialUpdateParams,
970
971
  TelephonyCredentialUpdateResponse,
971
972
  TelephonyCredentials,
972
973
  TelephonyCredentialsDefaultFlatPagination,
974
+ TokenMaterial,
973
975
  } from './resources/telephony-credentials';
974
976
  import {
975
977
  TexmlApplication,
@@ -5142,6 +5144,8 @@ export declare namespace Telnyx {
5142
5144
  type TelephonyCredentialUpdateResponse as TelephonyCredentialUpdateResponse,
5143
5145
  type TelephonyCredentialDeleteResponse as TelephonyCredentialDeleteResponse,
5144
5146
  type TelephonyCredentialCreateTokenResponse as TelephonyCredentialCreateTokenResponse,
5147
+ type TelephonyCredentialRetrieveTokenMaterialResponse as TelephonyCredentialRetrieveTokenMaterialResponse,
5148
+ type TokenMaterial as TokenMaterial,
5145
5149
  type TelephonyCredentialsDefaultFlatPagination as TelephonyCredentialsDefaultFlatPagination,
5146
5150
  type TelephonyCredentialListParams as TelephonyCredentialListParams,
5147
5151
  type TelephonyCredentialCreateParams as TelephonyCredentialCreateParams,
@@ -0,0 +1,219 @@
1
+ /**
2
+ * WebRTC login tokens minted locally, with no request to Telnyx.
3
+ *
4
+ * The token has the same shape as the one
5
+ * `POST /v2/telephony_credentials/{id}/token` returns, so it is used the same
6
+ * way: pass it to the WebRTC SDK as `login_token`. Telnyx verifies it on login.
7
+ * It is the same computation as `TelephonyCredential#to_jwt` in telnyx-ruby.
8
+ *
9
+ * The signing material comes from the credential: `token_material` is in the
10
+ * response of `POST /v2/telephony_credentials` and of
11
+ * `GET /v2/telephony_credentials/{id}/token_material`. It is as sensitive as
12
+ * the SIP password, so keep it on the server; never ship it to a browser.
13
+ *
14
+ * @example
15
+ * const { data: credential } = await client.telephonyCredentials.create({
16
+ * connection_id: '123',
17
+ * include: 'token_material', // the API returns the material only when asked
18
+ * });
19
+ * const loginToken = await client.telephonyCredentials.toJwt(credential); // 1 hour
20
+ * const shortLived = await client.telephonyCredentials.toJwt(credential, { ttl: 600 });
21
+ *
22
+ * To mint later with no request at all, store these with the user the credential
23
+ * belongs to, server side: `id`, `user_id`, `sip_username`, `expires_at` and
24
+ * `token_material`. The token is built from all of them.
25
+ *
26
+ * @example From stored values, without a request at all
27
+ * import { createLoginToken } from 'telnyx/lib/login-token';
28
+ * const loginToken = await createLoginToken({
29
+ * id: '...', user_id: '...', sip_username: 'gencred...', expires_at: '2027-01-01T00:00:00Z',
30
+ * token_material: { kid: 'v1', tel_token: '...', signing_secret: '...' },
31
+ * });
32
+ */
33
+
34
+ import { TelnyxError } from '../core/error';
35
+ import { fromBase64, toBase64 } from '../internal/utils/base64';
36
+ import { decodeUTF8, encodeUTF8 } from '../internal/utils/bytes';
37
+
38
+ /** Token lifetime when `ttl` is not given: one hour. */
39
+ export const LOGIN_TOKEN_DEFAULT_TTL = 3600;
40
+ /** Longest lifetime a login token can have: one day, the same as API-minted tokens. */
41
+ export const LOGIN_TOKEN_MAX_TTL = 86400;
42
+ /** `cty` header of a locally minted token; voice-sdk-proxy selects the verification path by it. */
43
+ export const LOGIN_TOKEN_CONTENT_TYPE = 'telnyx-webrtc;v=1';
44
+
45
+ /**
46
+ * What the API returns as `token_material`. `signing_secret` is base64url
47
+ * (unpadded) bytes of the HS256 key; `tel_token` goes into the token as is.
48
+ */
49
+ export interface TokenMaterial {
50
+ /** Which key the material was derived with (`v1` today). Goes in the JWT header. */
51
+ kid: string;
52
+ /** The SIP credential encrypted for the gateway, the same value `/token` puts in the `tel_token` claim. */
53
+ tel_token: string;
54
+ /** The HS256 key the token is signed with, base64url. */
55
+ signing_secret: string;
56
+ }
57
+
58
+ /** The fields of a telephony credential that a login token is built from. */
59
+ export interface LoginTokenCredential {
60
+ /** The telephony credential `id`. */
61
+ id?: string | undefined;
62
+ /** The credential's `user_id`. */
63
+ user_id?: string | undefined;
64
+ /** The credential's `sip_username`; the token's `identity`. */
65
+ sip_username?: string | undefined;
66
+ /** The credential's `expires_at`, as the API returns it, or null. */
67
+ expires_at?: string | null | undefined;
68
+ /** `kid`, `tel_token`, `signing_secret`; present on a credential from `create`. */
69
+ token_material?: TokenMaterial | undefined;
70
+ }
71
+
72
+ export interface LoginTokenOptions {
73
+ /** Token lifetime in seconds, 1..86400. Default one hour. */
74
+ ttl?: number | undefined;
75
+ /** Signing material to use instead of `credential.token_material`. */
76
+ tokenMaterial?: TokenMaterial | undefined;
77
+ /** The token's issue time; defaults to now. */
78
+ now?: Date | number | undefined;
79
+ }
80
+
81
+ export class TelnyxLoginTokenError extends TelnyxError {
82
+ constructor(message: string) {
83
+ super(message);
84
+ this.name = 'TelnyxLoginTokenError';
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Mints a login token for `credential`, valid from `now` for `ttl` seconds.
90
+ * Pure computation: HMAC-SHA256 over the token with `token_material.signing_secret`.
91
+ */
92
+ export async function createLoginToken(
93
+ credential: LoginTokenCredential,
94
+ options: LoginTokenOptions = {},
95
+ ): Promise<string> {
96
+ const credentialId = required(credential.id, 'id');
97
+ const userId = required(credential.user_id, 'user_id');
98
+ const identity = required(credential.sip_username, 'sip_username');
99
+ const material = normalizeMaterial(options.tokenMaterial ?? credential.token_material);
100
+ const ttl = clampTtl(options.ttl);
101
+ const now = options.now === undefined ? Date.now() : Number(options.now);
102
+ const iat = Math.floor(now / 1000);
103
+
104
+ // Same field order as the Ruby SDK, so the two produce the same bytes.
105
+ const header = { alg: 'HS256', typ: 'JWT', cty: LOGIN_TOKEN_CONTENT_TYPE, kid: material.kid };
106
+ const payload = {
107
+ sub: credentialId,
108
+ user_id: userId,
109
+ identity,
110
+ cred_exp: credential.expires_at ?? null,
111
+ tel_token: material.tel_token,
112
+ iat,
113
+ nbf: iat,
114
+ exp: iat + ttl,
115
+ jti: `${credentialId}-${iat}`,
116
+ };
117
+
118
+ const signingInput = `${base64url(JSON.stringify(header))}.${base64url(JSON.stringify(payload))}`;
119
+ return `${signingInput}.${base64url(await sign(signingInput, material.signing_secret))}`;
120
+ }
121
+
122
+ /**
123
+ * Checks a token minted by `createLoginToken` against `signingSecret` and
124
+ * returns its claims. For tests and debugging: Telnyx does the real
125
+ * verification on login.
126
+ */
127
+ export async function decodeLoginToken(jwt: string, signingSecret: string): Promise<Record<string, unknown>> {
128
+ const [head, body, sig, ...rest] = String(jwt).split('.');
129
+ if (!head || !body || sig === undefined || rest.length) {
130
+ throw new TelnyxLoginTokenError('not a JWT');
131
+ }
132
+ const expected = await sign(`${head}.${body}`, signingSecret);
133
+ const given = fromBase64url(sig);
134
+ if (!bytesEqual(given, expected)) {
135
+ throw new TelnyxLoginTokenError('Signature is invalid and does not match the payload');
136
+ }
137
+ return JSON.parse(decodeUTF8(fromBase64url(body))) as Record<string, unknown>;
138
+ }
139
+
140
+ function required(value: string | null | undefined, name: string): string {
141
+ if (value === undefined || value === null || String(value) === '') {
142
+ throw new TelnyxLoginTokenError(`${name} is required to mint a token`);
143
+ }
144
+ return String(value);
145
+ }
146
+
147
+ function normalizeMaterial(material: TokenMaterial | null | undefined): TokenMaterial {
148
+ if (!material || typeof material !== 'object') {
149
+ throw new TelnyxLoginTokenError('token_material is required to mint a token');
150
+ }
151
+ const out = {} as Record<keyof TokenMaterial, string>;
152
+ for (const field of ['kid', 'tel_token', 'signing_secret'] as const) {
153
+ const value = material[field];
154
+ if (value === undefined || value === null || String(value) === '') {
155
+ throw new TelnyxLoginTokenError(`token_material.${field} is missing`);
156
+ }
157
+ out[field] = String(value);
158
+ }
159
+ return out;
160
+ }
161
+
162
+ function clampTtl(ttl: number | undefined): number {
163
+ const n = ttl === undefined ? LOGIN_TOKEN_DEFAULT_TTL : Math.trunc(Number(ttl));
164
+ if (!Number.isFinite(n)) return LOGIN_TOKEN_DEFAULT_TTL;
165
+ return Math.min(LOGIN_TOKEN_MAX_TTL, Math.max(1, n));
166
+ }
167
+
168
+ function base64url(data: string | Uint8Array): string {
169
+ // Base64 pads with at most two '=': a bounded match keeps this linear on any input.
170
+ return toBase64(data)
171
+ .replace(/\+/g, '-')
172
+ .replace(/\//g, '_')
173
+ .replace(/={1,2}$/, '');
174
+ }
175
+
176
+ function fromBase64url(str: string): Uint8Array {
177
+ const b64 = str.replace(/-/g, '+').replace(/_/g, '/');
178
+ return fromBase64(b64 + '='.repeat((4 - (b64.length % 4)) % 4));
179
+ }
180
+
181
+ function bytesEqual(a: Uint8Array, b: Uint8Array): boolean {
182
+ if (a.length !== b.length) return false;
183
+ let diff = 0;
184
+ for (let i = 0; i < a.length; i++) diff |= a[i]! ^ b[i]!;
185
+ return diff === 0;
186
+ }
187
+
188
+ // HMAC-SHA256 through WebCrypto, which Node, Deno, Bun, browsers and edge runtimes all provide.
189
+ interface SubtleCryptoLike {
190
+ importKey(
191
+ format: string,
192
+ keyData: Uint8Array,
193
+ algorithm: { name: string; hash: string },
194
+ extractable: boolean,
195
+ keyUsages: string[],
196
+ ): Promise<unknown>;
197
+ sign(algorithm: string, key: unknown, data: Uint8Array): Promise<ArrayBuffer>;
198
+ }
199
+
200
+ async function getSubtle(): Promise<SubtleCryptoLike> {
201
+ if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.subtle) {
202
+ return globalThis.crypto.subtle as unknown as SubtleCryptoLike;
203
+ }
204
+ // Node.js < 19 may need webcrypto from crypto module
205
+ const nodeCrypto = await import('crypto');
206
+ return (nodeCrypto.webcrypto as unknown as { subtle: SubtleCryptoLike }).subtle;
207
+ }
208
+
209
+ async function sign(signingInput: string, signingSecret: string): Promise<Uint8Array> {
210
+ const subtle = await getSubtle();
211
+ const key = await subtle.importKey(
212
+ 'raw',
213
+ fromBase64url(signingSecret),
214
+ { name: 'HMAC', hash: 'SHA-256' },
215
+ false,
216
+ ['sign'],
217
+ );
218
+ return new Uint8Array(await subtle.sign('HMAC', key, encodeUTF8(signingInput)));
219
+ }
@@ -6,6 +6,7 @@ import { DefaultFlatPagination, type DefaultFlatPaginationParams, PagePromise }
6
6
  import { buildHeaders } from '../internal/headers';
7
7
  import { RequestOptions } from '../internal/request-options';
8
8
  import { path } from '../internal/utils/path';
9
+ import { createLoginToken, type LoginTokenOptions, type TokenMaterial } from '../lib/login-token';
9
10
 
10
11
  export class TelephonyCredentials extends APIResource {
11
12
  /**
@@ -43,10 +44,16 @@ export class TelephonyCredentials extends APIResource {
43
44
  * ```
44
45
  */
45
46
  create(
46
- body: TelephonyCredentialCreateParams,
47
+ params: TelephonyCredentialCreateParams,
47
48
  options?: RequestOptions,
48
49
  ): APIPromise<TelephonyCredentialCreateResponse> {
49
- return this._client.post('/telephony_credentials', { body, ...options });
50
+ // `include` is a query parameter; everything else is the body.
51
+ const { include, ...body } = params;
52
+ return this._client.post('/telephony_credentials', {
53
+ ...(include === undefined ? {} : { query: { include } }),
54
+ body,
55
+ ...options,
56
+ });
50
57
  }
51
58
 
52
59
  /**
@@ -93,6 +100,52 @@ export class TelephonyCredentials extends APIResource {
93
100
  return this._client.patch(path`/telephony_credentials/${id}`, { body, ...options });
94
101
  }
95
102
 
103
+ /**
104
+ * The material a login token is signed with (`kid`, `tel_token`,
105
+ * `signing_secret`), for a credential that did not come from `create`. Treat
106
+ * the result like the SIP password.
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * const { data: tokenMaterial } =
111
+ * await client.telephonyCredentials.retrieveTokenMaterial('id');
112
+ * ```
113
+ */
114
+ retrieveTokenMaterial(
115
+ id: string,
116
+ options?: RequestOptions,
117
+ ): APIPromise<TelephonyCredentialRetrieveTokenMaterialResponse> {
118
+ return this._client.get(path`/telephony_credentials/${id}/token_material`, options);
119
+ }
120
+
121
+ /**
122
+ * Mints a WebRTC login token for the credential locally: the same use as
123
+ * `createToken`, with no request to Telnyx per token. Uses the
124
+ * `token_material` of a credential from `create`, or `tokenMaterial` from the
125
+ * options, or fetches it once with `retrieveTokenMaterial`.
126
+ *
127
+ * `ttl` is the token lifetime in seconds, 1..86400, default one hour.
128
+ *
129
+ * @example
130
+ * ```ts
131
+ * const { data: credential } = await client.telephonyCredentials.create({
132
+ * connection_id: '1234567890',
133
+ * });
134
+ * const loginToken = await client.telephonyCredentials.toJwt(credential);
135
+ * ```
136
+ */
137
+ async toJwt(
138
+ credential: TelephonyCredential,
139
+ options?: LoginTokenOptions & { requestOptions?: RequestOptions | undefined },
140
+ ): Promise<string> {
141
+ const { requestOptions, ...tokenOptions } = options ?? {};
142
+ const tokenMaterial =
143
+ tokenOptions.tokenMaterial ??
144
+ credential.token_material ??
145
+ (await this.retrieveTokenMaterial(credential.id ?? '', requestOptions)).data;
146
+ return createLoginToken(credential, { ...tokenOptions, tokenMaterial });
147
+ }
148
+
96
149
  /**
97
150
  * Create an Access Token (JWT) for the credential.
98
151
  *
@@ -175,6 +228,16 @@ export interface TelephonyCredential {
175
228
  * Identifies the user this credential is associated with.
176
229
  */
177
230
  user_id?: string;
231
+
232
+ /**
233
+ * What a login token is signed with. Returned by `create`; see `toJwt` and
234
+ * `retrieveTokenMaterial`.
235
+ */
236
+ token_material?: TokenMaterial;
237
+ }
238
+
239
+ export interface TelephonyCredentialRetrieveTokenMaterialResponse {
240
+ data?: TokenMaterial;
178
241
  }
179
242
 
180
243
  export interface TelephonyCredentialCreateResponse {
@@ -237,6 +300,12 @@ export namespace TelephonyCredentialListParams {
237
300
  }
238
301
 
239
302
  export interface TelephonyCredentialCreateParams {
303
+ /**
304
+ * Query param: extra fields to return. `token_material` adds what `toJwt` signs
305
+ * with (as sensitive as `sip_password`; keep it on the server).
306
+ */
307
+ include?: 'token_material' | undefined;
308
+
240
309
  /**
241
310
  * Identifies the Credential Connection this credential is associated with.
242
311
  */
@@ -284,6 +353,8 @@ export interface TelephonyCredentialCreateTokenParams {
284
353
  'Idempotency-Key'?: string;
285
354
  }
286
355
 
356
+ export type { LoginTokenOptions, TokenMaterial } from '../lib/login-token';
357
+
287
358
  export declare namespace TelephonyCredentials {
288
359
  export {
289
360
  type TelephonyCredential as TelephonyCredential,
@@ -292,6 +363,8 @@ export declare namespace TelephonyCredentials {
292
363
  type TelephonyCredentialUpdateResponse as TelephonyCredentialUpdateResponse,
293
364
  type TelephonyCredentialDeleteResponse as TelephonyCredentialDeleteResponse,
294
365
  type TelephonyCredentialCreateTokenResponse as TelephonyCredentialCreateTokenResponse,
366
+ type TelephonyCredentialRetrieveTokenMaterialResponse as TelephonyCredentialRetrieveTokenMaterialResponse,
367
+ type TokenMaterial as TokenMaterial,
295
368
  type TelephonyCredentialsDefaultFlatPagination as TelephonyCredentialsDefaultFlatPagination,
296
369
  type TelephonyCredentialListParams as TelephonyCredentialListParams,
297
370
  type TelephonyCredentialCreateParams as TelephonyCredentialCreateParams,
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const VERSION = '7.29.0'; // x-release-please-version
1
+ export const VERSION = '7.30.0-beta.0'; // x-release-please-version
package/version.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "7.29.0";
1
+ export declare const VERSION = "7.30.0-beta.0";
2
2
  //# sourceMappingURL=version.d.mts.map
package/version.d.mts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.mts","sourceRoot":"","sources":["src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAC"}
1
+ {"version":3,"file":"version.d.mts","sourceRoot":"","sources":["src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,kBAAkB,CAAC"}
package/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "7.29.0";
1
+ export declare const VERSION = "7.30.0-beta.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/version.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,kBAAkB,CAAC"}