@babelforce/manager-sdk 0.38.0 → 0.40.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.
package/dist/index.js CHANGED
@@ -3,6 +3,29 @@ import { createClient, createConfig, urlSearchParamsBodySerializer, formDataBody
3
3
  // src/client.ts
4
4
 
5
5
  // src/auth.ts
6
+ function base64url(bytes) {
7
+ let bin = "";
8
+ for (const b of bytes) bin += String.fromCharCode(b);
9
+ return btoa(bin).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
10
+ }
11
+ async function pkceChallenge() {
12
+ const codeVerifier = base64url(crypto.getRandomValues(new Uint8Array(32)));
13
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(codeVerifier));
14
+ return { codeVerifier, codeChallenge: base64url(new Uint8Array(digest)), codeChallengeMethod: "S256" };
15
+ }
16
+ function buildAuthorizeUrl(opts) {
17
+ const base = opts.baseUrl.replace(/\/+$/, "");
18
+ const params = new URLSearchParams({
19
+ response_type: "code",
20
+ client_id: opts.clientId,
21
+ redirect_uri: opts.redirectUri,
22
+ scope: opts.scope,
23
+ code_challenge: opts.codeChallenge,
24
+ code_challenge_method: opts.codeChallengeMethod ?? "S256"
25
+ });
26
+ if (opts.state !== void 0) params.set("state", opts.state);
27
+ return `${base}/oauth/authorize?${params.toString()}`;
28
+ }
6
29
  async function passwordGrant(opts) {
7
30
  const base = opts.baseUrl.replace(/\/+$/, "");
8
31
  const body = new URLSearchParams({
@@ -42,18 +65,71 @@ async function clientCredentialsGrant(opts) {
42
65
  }
43
66
  return json;
44
67
  }
68
+ async function authorizationCodeGrant(opts) {
69
+ const base = opts.baseUrl.replace(/\/+$/, "");
70
+ const body = new URLSearchParams({
71
+ grant_type: "authorization_code",
72
+ code: opts.code,
73
+ redirect_uri: opts.redirectUri,
74
+ client_id: opts.clientId,
75
+ code_verifier: opts.codeVerifier
76
+ });
77
+ if (opts.clientSecret !== void 0) body.set("client_secret", opts.clientSecret);
78
+ const doFetch = opts.fetch ?? fetch;
79
+ const resp = await doFetch(`${base}/oauth/token`, {
80
+ method: "POST",
81
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
82
+ body
83
+ });
84
+ const json = await resp.json().catch(() => ({}));
85
+ if (!resp.ok || !json.access_token) {
86
+ throw new Error(`authorization_code grant failed (status ${resp.status})`);
87
+ }
88
+ return json;
89
+ }
90
+ async function refreshTokenGrant(opts) {
91
+ const base = opts.baseUrl.replace(/\/+$/, "");
92
+ const body = new URLSearchParams({
93
+ grant_type: "refresh_token",
94
+ refresh_token: opts.refreshToken
95
+ });
96
+ if (opts.clientId !== void 0) body.set("client_id", opts.clientId);
97
+ if (opts.clientSecret !== void 0) body.set("client_secret", opts.clientSecret);
98
+ const doFetch = opts.fetch ?? fetch;
99
+ const resp = await doFetch(`${base}/oauth/token`, {
100
+ method: "POST",
101
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
102
+ body
103
+ });
104
+ const json = await resp.json().catch(() => ({}));
105
+ if (!resp.ok || !json.access_token) {
106
+ throw new Error(`refresh_token grant failed (status ${resp.status})`);
107
+ }
108
+ return json;
109
+ }
45
110
  var TokenManager = class {
46
- constructor(grant) {
111
+ constructor(grant, initialRefresh) {
47
112
  this.grant = grant;
113
+ this.refreshToken = initialRefresh;
48
114
  }
49
115
  grant;
50
116
  token;
51
117
  expiresAt = 0;
118
+ refreshToken;
119
+ inflight;
52
120
  async get() {
53
121
  if (this.token && Date.now() < this.expiresAt - 3e4) return this.token;
54
- const tok = await this.grant();
122
+ if (this.inflight) return this.inflight;
123
+ this.inflight = this.fetchToken().finally(() => {
124
+ this.inflight = void 0;
125
+ });
126
+ return this.inflight;
127
+ }
128
+ async fetchToken() {
129
+ const tok = await this.grant(this.refreshToken);
55
130
  this.token = tok.access_token;
56
131
  this.expiresAt = Date.now() + (tok.expires_in ? tok.expires_in * 1e3 : 36e5);
132
+ if (tok.refresh_token) this.refreshToken = tok.refresh_token;
57
133
  return this.token;
58
134
  }
59
135
  };
@@ -71,6 +147,19 @@ function buildAuthConfig(auth, baseUrl, fetchImpl) {
71
147
  );
72
148
  return { auth: (scheme) => scheme.scheme === "bearer" ? tokens.get() : void 0 };
73
149
  }
150
+ case "refreshToken": {
151
+ const tokens = new TokenManager(
152
+ (current) => refreshTokenGrant({
153
+ baseUrl,
154
+ refreshToken: current ?? auth.refreshToken,
155
+ clientId: auth.clientId,
156
+ clientSecret: auth.clientSecret,
157
+ fetch: fetchImpl
158
+ }),
159
+ auth.refreshToken
160
+ );
161
+ return { auth: (scheme) => scheme.scheme === "bearer" ? tokens.get() : void 0 };
162
+ }
74
163
  }
75
164
  }
76
165
 
@@ -8560,4 +8649,4 @@ var ManagerClient = class _ManagerClient {
8560
8649
  }
8561
8650
  };
8562
8651
 
8563
- export { AgentGroupsResource, AgentsResource, AppActionsResource, ApplicationsResource, AuthResource, AutomationsResource, BabeldeskResource, BabeldeskWidgetsResource, BusinessHoursResource, CalendarsResource, CallsResource, CampaignsResource, ConferencesResource, ConversationsResource, DEFAULT_BASE_URL, DashboardsResource, DialerBehavioursResource, DialerResource, EventsResource, ExpressionsResource, FilesResource, IntegrationsResource, LogsResource, ManagerApiError, ManagerClient, MeResource, MetricsResource, NumbersResource, OutboundResource, PhonebookResource, PromptsResource, QueueSelectionsResource, QueuesResource, RecordingsResource, ReportingResource, RoutingResource, SessionsResource, SettingAccessor, SettingsResource, SmsResource, SystemResource, TaskMetricsResource, TaskSchedulesResource, TaskScriptsResource, TaskSecretsResource, TaskSelectionConfigResource, TasksResource, TriggersResource, UsersResource, passwordGrant, withRetry };
8652
+ export { AgentGroupsResource, AgentsResource, AppActionsResource, ApplicationsResource, AuthResource, AutomationsResource, BabeldeskResource, BabeldeskWidgetsResource, BusinessHoursResource, CalendarsResource, CallsResource, CampaignsResource, ConferencesResource, ConversationsResource, DEFAULT_BASE_URL, DashboardsResource, DialerBehavioursResource, DialerResource, EventsResource, ExpressionsResource, FilesResource, IntegrationsResource, LogsResource, ManagerApiError, ManagerClient, MeResource, MetricsResource, NumbersResource, OutboundResource, PhonebookResource, PromptsResource, QueueSelectionsResource, QueuesResource, RecordingsResource, ReportingResource, RoutingResource, SessionsResource, SettingAccessor, SettingsResource, SmsResource, SystemResource, TaskMetricsResource, TaskSchedulesResource, TaskScriptsResource, TaskSecretsResource, TaskSelectionConfigResource, TasksResource, TriggersResource, UsersResource, authorizationCodeGrant, buildAuthorizeUrl, clientCredentialsGrant, passwordGrant, pkceChallenge, refreshTokenGrant, withRetry };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babelforce/manager-sdk",
3
- "version": "0.38.0",
3
+ "version": "0.40.0",
4
4
  "description": "TypeScript SDK for the babelforce manager APIs — auth, user & agent management, call reporting, metrics, and task automations.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",