@osdk/oauth 0.3.0-beta.0 → 0.3.1

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.
@@ -1,16 +1,16 @@
1
1
  'use strict';
2
2
 
3
- var delay = require('delay');
4
3
  var oauth4webapi = require('oauth4webapi');
5
4
  var invariant = require('tiny-invariant');
6
5
  var typescriptEventTarget = require('typescript-event-target');
6
+ var delay = require('delay');
7
7
 
8
8
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
9
 
10
- var delay__default = /*#__PURE__*/_interopDefault(delay);
11
10
  var invariant__default = /*#__PURE__*/_interopDefault(invariant);
11
+ var delay__default = /*#__PURE__*/_interopDefault(delay);
12
12
 
13
- // src/createPublicOauthClient.ts
13
+ // src/createConfidentialOauthClient.ts
14
14
  function throwIfError(result) {
15
15
  if (oauth4webapi.isOAuth2Error(result)) {
16
16
  throw new Error(`Failed to get token: ${result.error}`);
@@ -18,39 +18,32 @@ function throwIfError(result) {
18
18
  return result;
19
19
  }
20
20
 
21
- // src/createPublicOauthClient.ts
22
- var storageKey = "asdfasdfdhjlkajhgj";
23
- function saveLocal(x) {
24
- localStorage.setItem(storageKey, JSON.stringify(x));
21
+ // src/common.ts
22
+ var CustomEvent = process.env.target === "browser" ? globalThis.CustomEvent : globalThis.CustomEvent ?? class CustomEvent2 extends Event {
23
+ #detail;
24
+ constructor(type, options) {
25
+ super(type, options);
26
+ this.#detail = options?.detail ?? null;
27
+ }
28
+ get detail() {
29
+ return this.#detail;
30
+ }
31
+ };
32
+ function saveLocal(client, x) {
33
+ globalThis.localStorage?.setItem(`@osdk/oauth : refresh : ${client.client_id}`, JSON.stringify(x));
25
34
  }
26
- function removeLocal() {
27
- localStorage.removeItem(storageKey);
35
+ function removeLocal(client) {
36
+ globalThis.localStorage?.removeItem(`@osdk/oauth : refresh : ${client.client_id}`);
28
37
  }
29
- function readLocal() {
30
- return JSON.parse(localStorage.getItem(storageKey) ?? "{}");
38
+ function readLocal(client) {
39
+ return JSON.parse(
40
+ // MUST `localStorage?` as nodejs does not have localStorage
41
+ globalThis.localStorage?.getItem(`@osdk/oauth : refresh : ${client.client_id}`) ?? "{}"
42
+ );
31
43
  }
32
- function createPublicOauthClient(client_id, url, redirectUrl, useHistory, loginPage, postLoginPage = window.location.toString(), scopes = ["api:read-data", "api:write-data"], fetchFn = globalThis.fetch, ctxPath = "/multipass") {
33
- const oauthHttpOptions = {
34
- [oauth4webapi.customFetch]: fetchFn
35
- };
44
+ function common(client, as, _signIn, oauthHttpOptions, refresh, scopes) {
45
+ let token;
36
46
  const eventTarget = new typescriptEventTarget.TypedEventTarget();
37
- const issuer = `${new URL(ctxPath, url)}`;
38
- const as = {
39
- token_endpoint: `${issuer}/api/oauth2/token`,
40
- authorization_endpoint: `${issuer}/api/oauth2/authorize`,
41
- revocation_endpoint: `${issuer}/api/oauth2/revoke_token`,
42
- issuer
43
- };
44
- const client = {
45
- client_id,
46
- token_endpoint_auth_method: "none"
47
- };
48
- async function go(x) {
49
- if (useHistory) return window.history.replaceState({}, "", x);
50
- else window.location.assign(x);
51
- await delay__default.default(1e3);
52
- throw new Error("Unable to redirect");
53
- }
54
47
  function makeTokenAndSaveRefresh(resp, type) {
55
48
  const {
56
49
  refresh_token,
@@ -58,8 +51,9 @@ function createPublicOauthClient(client_id, url, redirectUrl, useHistory, loginP
58
51
  access_token
59
52
  } = resp;
60
53
  !(expires_in != null) ? process.env.NODE_ENV !== "production" ? invariant__default.default(false) : invariant__default.default(false) : void 0;
61
- saveLocal({
62
- refresh_token
54
+ saveLocal(client, {
55
+ refresh_token,
56
+ requestedScopes: scopes
63
57
  });
64
58
  token = {
65
59
  refresh_token,
@@ -72,21 +66,129 @@ function createPublicOauthClient(client_id, url, redirectUrl, useHistory, loginP
72
66
  }));
73
67
  return token;
74
68
  }
69
+ let refreshTimeout;
70
+ function rmTimeout() {
71
+ if (refreshTimeout) clearTimeout(refreshTimeout);
72
+ }
73
+ function restartRefreshTimer(evt) {
74
+ if (refresh) {
75
+ rmTimeout();
76
+ refreshTimeout = setTimeout(refresh, evt.detail.expires_in * 1e3 - 60 * 1e3);
77
+ }
78
+ }
79
+ async function signOut() {
80
+ !token ? process.env.NODE_ENV !== "production" ? invariant__default.default(false, "not signed in") : invariant__default.default(false) : void 0;
81
+ const result = await oauth4webapi.processRevocationResponse(await oauth4webapi.revocationRequest(as, client, token.access_token, oauthHttpOptions));
82
+ rmTimeout();
83
+ removeLocal(client);
84
+ token = void 0;
85
+ throwIfError(result);
86
+ eventTarget.dispatchTypedEvent("signOut", new Event("signOut"));
87
+ }
88
+ let pendingSignIn;
89
+ async function signIn() {
90
+ if (pendingSignIn) {
91
+ return pendingSignIn;
92
+ }
93
+ try {
94
+ pendingSignIn = _signIn();
95
+ return await pendingSignIn;
96
+ } finally {
97
+ pendingSignIn = void 0;
98
+ }
99
+ }
100
+ eventTarget.addEventListener("signIn", restartRefreshTimer);
101
+ eventTarget.addEventListener("refresh", restartRefreshTimer);
102
+ const getToken = Object.assign(async function getToken2() {
103
+ if (!token || Date.now() >= token.expires_at) {
104
+ token = await signIn();
105
+ }
106
+ return token.access_token;
107
+ }, {
108
+ signIn,
109
+ refresh,
110
+ signOut,
111
+ rmTimeout,
112
+ addEventListener: eventTarget.addEventListener.bind(eventTarget),
113
+ removeEventListener: eventTarget.removeEventListener.bind(eventTarget)
114
+ });
115
+ return {
116
+ getToken,
117
+ makeTokenAndSaveRefresh
118
+ };
119
+ }
120
+ function createAuthorizationServer(ctxPath, url) {
121
+ const issuer = `${new URL(ctxPath, url)}`;
122
+ return {
123
+ token_endpoint: `${issuer}/api/oauth2/token`,
124
+ authorization_endpoint: `${issuer}/api/oauth2/authorize`,
125
+ revocation_endpoint: `${issuer}/api/oauth2/revoke_token`,
126
+ issuer
127
+ };
128
+ }
129
+
130
+ // src/createConfidentialOauthClient.ts
131
+ function createConfidentialOauthClient(client_id, client_secret, url, scopes = ["api:read-data", "api:write-data"], fetchFn = globalThis.fetch, ctxPath = "/multipass") {
132
+ const client = {
133
+ client_id,
134
+ client_secret
135
+ };
136
+ const authServer = createAuthorizationServer(ctxPath, url);
137
+ const oauthHttpOptions = {
138
+ [oauth4webapi.customFetch]: fetchFn
139
+ };
140
+ const joinedScopes = scopes.join(" ");
141
+ const {
142
+ getToken,
143
+ makeTokenAndSaveRefresh
144
+ } = common(client, authServer, _signIn, oauthHttpOptions, void 0, joinedScopes);
145
+ async function _signIn() {
146
+ return makeTokenAndSaveRefresh(throwIfError(await oauth4webapi.processClientCredentialsResponse(authServer, client, await oauth4webapi.clientCredentialsGrantRequest(authServer, client, new URLSearchParams({
147
+ scope: joinedScopes
148
+ }), oauthHttpOptions))), "signIn");
149
+ }
150
+ return getToken;
151
+ }
152
+ function createPublicOauthClient(client_id, url, redirectUrl, useHistory, loginPage, postLoginPage = window.location.toString(), scopes = ["api:read-data", "api:write-data"], fetchFn = globalThis.fetch, ctxPath = "/multipass") {
153
+ const client = {
154
+ client_id,
155
+ token_endpoint_auth_method: "none"
156
+ };
157
+ const authServer = createAuthorizationServer(ctxPath, url);
158
+ const oauthHttpOptions = {
159
+ [oauth4webapi.customFetch]: fetchFn
160
+ };
161
+ let joinedScopes = [...scopes ?? ["api:read-data", "api:write-data"]].sort().join(" ");
162
+ const {
163
+ makeTokenAndSaveRefresh,
164
+ getToken
165
+ } = common(client, authServer, _signIn, oauthHttpOptions, maybeRefresh.bind(globalThis, true), joinedScopes);
166
+ async function go(x) {
167
+ if (useHistory) return window.history.replaceState({}, "", x);
168
+ else window.location.assign(x);
169
+ await delay__default.default(1e3);
170
+ throw new Error("Unable to redirect");
171
+ }
75
172
  async function maybeRefresh(expectRefreshToken) {
76
173
  const {
77
- refresh_token
78
- } = readLocal();
174
+ refresh_token,
175
+ requestedScopes: initialRequestedScopes
176
+ } = readLocal(client);
79
177
  if (!refresh_token) {
80
178
  if (expectRefreshToken) throw new Error("No refresh token found");
81
179
  return;
82
180
  }
181
+ if (!refresh_token || !(initialRequestedScopes != null && joinedScopes === initialRequestedScopes)) {
182
+ if (expectRefreshToken) throw new Error("No refresh token found");
183
+ return;
184
+ }
83
185
  try {
84
- return makeTokenAndSaveRefresh(throwIfError(await oauth4webapi.processAuthorizationCodeOAuth2Response(as, client, await oauth4webapi.refreshTokenGrantRequest(as, client, refresh_token, oauthHttpOptions))), "refresh");
186
+ return makeTokenAndSaveRefresh(throwIfError(await oauth4webapi.processAuthorizationCodeOAuth2Response(authServer, client, await oauth4webapi.refreshTokenGrantRequest(authServer, client, refresh_token, oauthHttpOptions))), "refresh");
85
187
  } catch (e) {
86
188
  if (process?.env?.NODE_ENV !== "production") {
87
189
  console.warn("Failed to get OAuth2 refresh token. Removing refresh token", e);
88
190
  }
89
- removeLocal();
191
+ removeLocal(client);
90
192
  if (expectRefreshToken) {
91
193
  throw new Error("Could not refresh token");
92
194
  }
@@ -97,97 +199,53 @@ function createPublicOauthClient(client_id, url, redirectUrl, useHistory, loginP
97
199
  codeVerifier,
98
200
  state,
99
201
  oldUrl
100
- } = readLocal();
202
+ } = readLocal(client);
101
203
  if (!codeVerifier) return;
102
204
  try {
103
- const ret2 = makeTokenAndSaveRefresh(throwIfError(await oauth4webapi.processAuthorizationCodeOAuth2Response(as, client, await oauth4webapi.authorizationCodeGrantRequest(as, client, throwIfError(oauth4webapi.validateAuthResponse(as, client, new URL(window.location.href), state)), redirectUrl, codeVerifier, oauthHttpOptions))), "signIn");
205
+ const ret = makeTokenAndSaveRefresh(throwIfError(await oauth4webapi.processAuthorizationCodeOAuth2Response(authServer, client, await oauth4webapi.authorizationCodeGrantRequest(authServer, client, throwIfError(oauth4webapi.validateAuthResponse(authServer, client, new URL(window.location.href), state)), redirectUrl, codeVerifier, oauthHttpOptions))), "signIn");
104
206
  go(oldUrl);
105
- return ret2;
207
+ return ret;
106
208
  } catch (e) {
107
209
  if (process?.env?.NODE_ENV !== "production") {
108
210
  console.warn("Failed to get OAuth2 token using PKCE, removing PKCE and starting a new auth flow", e);
109
211
  }
110
- removeLocal();
212
+ removeLocal(client);
111
213
  }
112
214
  }
113
215
  async function initiateLoginRedirect() {
114
216
  if (loginPage && window.location.href !== loginPage) {
115
- saveLocal({
217
+ saveLocal(client, {
116
218
  oldUrl: postLoginPage
117
219
  });
118
220
  return await go(loginPage);
119
221
  }
120
222
  const state = oauth4webapi.generateRandomState();
121
223
  const codeVerifier = oauth4webapi.generateRandomCodeVerifier();
122
- const oldUrl = readLocal().oldUrl ?? window.location.toString();
123
- saveLocal({
224
+ const oldUrl = readLocal(client).oldUrl ?? window.location.toString();
225
+ saveLocal(client, {
124
226
  codeVerifier,
125
227
  state,
126
228
  oldUrl
127
229
  });
128
- window.location.assign(`${as.authorization_endpoint}?${new URLSearchParams({
230
+ window.location.assign(`${authServer.authorization_endpoint}?${new URLSearchParams({
129
231
  client_id,
130
232
  response_type: "code",
131
233
  state,
132
234
  redirect_uri: redirectUrl,
133
235
  code_challenge: await oauth4webapi.calculatePKCECodeChallenge(codeVerifier),
134
236
  code_challenge_method: "S256",
135
- scope: ["offline_access", ...scopes].join(" ")
237
+ scope: `offline_access ${joinedScopes}`
136
238
  })}`);
137
239
  await delay__default.default(1e3);
138
240
  throw new Error("Unable to redirect");
139
241
  }
140
- let refreshTimeout;
141
- function rmTimeout() {
142
- if (refreshTimeout) clearTimeout(refreshTimeout);
143
- }
144
- function restartRefreshTimer(evt) {
145
- rmTimeout();
146
- refreshTimeout = setTimeout(refresh, evt.detail.expires_in * 1e3 - 60 * 1e3);
147
- }
148
- const refresh = maybeRefresh.bind(globalThis, true);
149
- async function signOut() {
150
- !token ? process.env.NODE_ENV !== "production" ? invariant__default.default(false, "not signed in") : invariant__default.default(false) : void 0;
151
- const result = await oauth4webapi.processRevocationResponse(await oauth4webapi.revocationRequest(as, client, token.access_token, oauthHttpOptions));
152
- rmTimeout();
153
- removeLocal();
154
- token = void 0;
155
- throwIfError(result);
156
- eventTarget.dispatchTypedEvent("signOut", new Event("signOut"));
157
- }
158
- let pendingSignIn;
159
- async function signIn() {
160
- if (pendingSignIn) {
161
- return pendingSignIn;
162
- }
163
- try {
164
- pendingSignIn = _signIn();
165
- return await pendingSignIn;
166
- } finally {
167
- pendingSignIn = void 0;
168
- }
169
- }
170
242
  async function _signIn() {
171
- return token = await maybeRefresh() ?? await maybeHandleAuthReturn() ?? await initiateLoginRedirect();
243
+ return await maybeRefresh() ?? await maybeHandleAuthReturn() ?? await initiateLoginRedirect();
172
244
  }
173
- eventTarget.addEventListener("signIn", restartRefreshTimer);
174
- eventTarget.addEventListener("refresh", restartRefreshTimer);
175
- let token;
176
- const ret = Object.assign(async function ret2() {
177
- if (!token || Date.now() >= token.expires_at) {
178
- token = await signIn();
179
- }
180
- return token.access_token;
181
- }, {
182
- signIn,
183
- refresh,
184
- signOut,
185
- addEventListener: eventTarget.addEventListener.bind(eventTarget),
186
- removeEventListener: eventTarget.removeEventListener.bind(eventTarget)
187
- });
188
- return ret;
245
+ return getToken;
189
246
  }
190
247
 
248
+ exports.createConfidentialOauthClient = createConfidentialOauthClient;
191
249
  exports.createPublicOauthClient = createPublicOauthClient;
192
- //# sourceMappingURL=out.js.map
250
+ //# sourceMappingURL=index.cjs.map
193
251
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/createPublicOauthClient.ts","../../src/throwIfError.ts"],"names":["ret"],"mappings":"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","sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport delay from \"delay\";\nimport { authorizationCodeGrantRequest, calculatePKCECodeChallenge, customFetch, generateRandomCodeVerifier, generateRandomState, processAuthorizationCodeOAuth2Response, processRevocationResponse, refreshTokenGrantRequest, revocationRequest, validateAuthResponse } from \"oauth4webapi\";\nimport invariant from \"tiny-invariant\";\nimport { TypedEventTarget } from \"typescript-event-target\";\nimport { throwIfError } from \"./throwIfError.js\";\nconst storageKey = \"asdfasdfdhjlkajhgj\";\nfunction saveLocal(x) {\n localStorage.setItem(storageKey, JSON.stringify(x));\n}\nfunction removeLocal() {\n localStorage.removeItem(storageKey);\n}\nfunction readLocal() {\n return JSON.parse(localStorage.getItem(storageKey) ?? \"{}\");\n}\n\n/**\n * @param client_id\n * @param url the base url of your foundry server\n * @param redirectUrl the url configured for redirect in the oauth configuration on the server\n * @param useHistory if true, when possible uses `history.replaceState()`, otherwise uses `window.location.assign()`\n * @param loginPage if you want a custom landing page prior to logging in, set this to that url\n * @param postLoginPage if you want to customize where you return to after a completed authentication cycle. defaults to the url when the page loaded\n * @param scopes\n * @param fetchFn\n * @param ctxPath\n * @returns {PublicOauthClient} which can be used as a token provider\n */\nexport function createPublicOauthClient(client_id, url, redirectUrl, useHistory, loginPage, postLoginPage = window.location.toString(), scopes = [\"api:read-data\", \"api:write-data\"], fetchFn = globalThis.fetch, ctxPath = \"/multipass\") {\n const oauthHttpOptions = {\n [customFetch]: fetchFn\n };\n const eventTarget = new TypedEventTarget();\n const issuer = `${new URL(ctxPath, url)}`;\n const as = {\n token_endpoint: `${issuer}/api/oauth2/token`,\n authorization_endpoint: `${issuer}/api/oauth2/authorize`,\n revocation_endpoint: `${issuer}/api/oauth2/revoke_token`,\n issuer\n };\n const client = {\n client_id,\n token_endpoint_auth_method: \"none\"\n };\n async function go(x) {\n if (useHistory) return window.history.replaceState({}, \"\", x);else window.location.assign(x);\n await delay(1000);\n throw new Error(\"Unable to redirect\");\n }\n function makeTokenAndSaveRefresh(resp, type) {\n const {\n refresh_token,\n expires_in,\n access_token\n } = resp;\n !(expires_in != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false) : invariant(false) : void 0;\n saveLocal({\n refresh_token\n });\n token = {\n refresh_token,\n expires_in,\n access_token,\n expires_at: Date.now() + expires_in * 1000\n };\n eventTarget.dispatchTypedEvent(type, new CustomEvent(type, {\n detail: token\n }));\n return token;\n }\n async function maybeRefresh(expectRefreshToken) {\n const {\n refresh_token\n } = readLocal();\n if (!refresh_token) {\n if (expectRefreshToken) throw new Error(\"No refresh token found\");\n return;\n }\n try {\n // note, we don't use processRefreshTokenResponse because the mp oauth implementation\n // doesn't do refresh tokens quite right and this lets us skip the id check\n return makeTokenAndSaveRefresh(throwIfError(await processAuthorizationCodeOAuth2Response(as, client, await refreshTokenGrantRequest(as, client, refresh_token, oauthHttpOptions))), \"refresh\");\n } catch (e) {\n if (process?.env?.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to get OAuth2 refresh token. Removing refresh token\", e);\n }\n removeLocal();\n if (expectRefreshToken) {\n throw new Error(\"Could not refresh token\");\n }\n }\n }\n async function maybeHandleAuthReturn() {\n const {\n codeVerifier,\n state,\n oldUrl\n } = readLocal();\n if (!codeVerifier) return;\n try {\n const ret = makeTokenAndSaveRefresh(throwIfError(await processAuthorizationCodeOAuth2Response(as, client, await authorizationCodeGrantRequest(as, client, throwIfError(validateAuthResponse(as, client, new URL(window.location.href), state)), redirectUrl, codeVerifier, oauthHttpOptions))), \"signIn\");\n go(oldUrl);\n return ret;\n } catch (e) {\n if (process?.env?.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to get OAuth2 token using PKCE, removing PKCE and starting a new auth flow\", e);\n }\n removeLocal();\n }\n }\n async function initiateLoginRedirect() {\n if (loginPage && window.location.href !== loginPage) {\n saveLocal({\n oldUrl: postLoginPage\n });\n return await go(loginPage);\n }\n const state = generateRandomState();\n const codeVerifier = generateRandomCodeVerifier();\n const oldUrl = readLocal().oldUrl ?? window.location.toString();\n saveLocal({\n codeVerifier,\n state,\n oldUrl\n });\n window.location.assign(`${as.authorization_endpoint}?${new URLSearchParams({\n client_id,\n response_type: \"code\",\n state,\n redirect_uri: redirectUrl,\n code_challenge: await calculatePKCECodeChallenge(codeVerifier),\n code_challenge_method: \"S256\",\n scope: [\"offline_access\", ...scopes].join(\" \")\n })}`);\n\n // Give time for redirect to happen\n await delay(1000);\n throw new Error(\"Unable to redirect\");\n }\n let refreshTimeout;\n function rmTimeout() {\n if (refreshTimeout) clearTimeout(refreshTimeout);\n }\n function restartRefreshTimer(evt) {\n rmTimeout();\n refreshTimeout = setTimeout(refresh, evt.detail.expires_in * 1000 - 60 * 1000);\n }\n const refresh = maybeRefresh.bind(globalThis, true);\n async function signOut() {\n !token ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"not signed in\") : invariant(false) : void 0;\n const result = await processRevocationResponse(await revocationRequest(as, client, token.access_token, oauthHttpOptions));\n rmTimeout();\n\n // Clean up\n removeLocal();\n token = undefined;\n throwIfError(result);\n eventTarget.dispatchTypedEvent(\"signOut\", new Event(\"signOut\"));\n }\n let pendingSignIn;\n async function signIn() {\n if (pendingSignIn) {\n return pendingSignIn;\n }\n try {\n pendingSignIn = _signIn();\n return await pendingSignIn;\n } finally {\n pendingSignIn = undefined;\n }\n }\n /** Will throw if there is no token! */\n async function _signIn() {\n // 1. Check if we have a refresh token in local storage\n return token = (await maybeRefresh()\n // 2. If there is no refresh token we are likely trying to perform the callback\n ) ?? (await maybeHandleAuthReturn())\n // 3. If we haven't been able to load the token from one of the two above ways, we need to make the initial auth request\n ?? (await initiateLoginRedirect());\n }\n eventTarget.addEventListener(\"signIn\", restartRefreshTimer);\n eventTarget.addEventListener(\"refresh\", restartRefreshTimer);\n let token;\n const ret = Object.assign(async function ret() {\n if (!token || Date.now() >= token.expires_at) {\n token = await signIn();\n }\n return token.access_token;\n }, {\n signIn,\n refresh,\n signOut,\n addEventListener: eventTarget.addEventListener.bind(eventTarget),\n removeEventListener: eventTarget.removeEventListener.bind(eventTarget)\n });\n return ret;\n}","/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isOAuth2Error } from \"oauth4webapi\";\nexport function throwIfError(result) {\n if (isOAuth2Error(result)) {\n throw new Error(`Failed to get token: ${result.error}`);\n }\n return result;\n}"]}
1
+ {"version":3,"sources":["../../src/throwIfError.ts","../../src/common.ts","../../src/createConfidentialOauthClient.ts","../../src/createPublicOauthClient.ts"],"names":["isOAuth2Error","CustomEvent","TypedEventTarget","invariant","processRevocationResponse","revocationRequest","getToken","customFetch","processClientCredentialsResponse","clientCredentialsGrantRequest","delay","processAuthorizationCodeOAuth2Response","refreshTokenGrantRequest","authorizationCodeGrantRequest","validateAuthResponse","generateRandomState","generateRandomCodeVerifier","calculatePKCECodeChallenge"],"mappings":"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","file":"index.cjs","sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isOAuth2Error } from \"oauth4webapi\";\nexport function throwIfError(result) {\n if (isOAuth2Error(result)) {\n throw new Error(`Failed to get token: ${result.error}`);\n }\n return result;\n}","/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { processRevocationResponse, revocationRequest } from \"oauth4webapi\";\nimport invariant from \"tiny-invariant\";\nimport { TypedEventTarget } from \"typescript-event-target\";\nimport { throwIfError } from \"./throwIfError.js\";\n// Node 18 is supposed to have a `CustomEvent` but it is not exposed on `globalThis`\n// which creates a problem for making a single codebase for node and browser. This polyfill works around it\nconst CustomEvent = process.env.target === \"browser\" ? globalThis.CustomEvent : globalThis.CustomEvent ?? class CustomEvent extends Event {\n #detail;\n constructor(type, options) {\n super(type, options);\n this.#detail = options?.detail ?? null;\n }\n get detail() {\n return this.#detail;\n }\n};\nexport function saveLocal(client, x) {\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.setItem(`@osdk/oauth : refresh : ${client.client_id}`, JSON.stringify(x));\n}\nexport function removeLocal(client) {\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.removeItem(`@osdk/oauth : refresh : ${client.client_id}`);\n}\nexport function readLocal(client) {\n return JSON.parse(\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.getItem(`@osdk/oauth : refresh : ${client.client_id}`) ?? \"{}\");\n}\nexport function common(client, as, _signIn, oauthHttpOptions, refresh, scopes) {\n let token;\n const eventTarget = new TypedEventTarget();\n function makeTokenAndSaveRefresh(resp, type) {\n const {\n refresh_token,\n expires_in,\n access_token\n } = resp;\n !(expires_in != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false) : invariant(false) : void 0;\n saveLocal(client, {\n refresh_token,\n requestedScopes: scopes\n });\n token = {\n refresh_token,\n expires_in,\n access_token,\n expires_at: Date.now() + expires_in * 1000\n };\n eventTarget.dispatchTypedEvent(type, new CustomEvent(type, {\n detail: token\n }));\n return token;\n }\n let refreshTimeout;\n function rmTimeout() {\n if (refreshTimeout) clearTimeout(refreshTimeout);\n }\n function restartRefreshTimer(evt) {\n if (refresh) {\n rmTimeout();\n refreshTimeout = setTimeout(refresh, evt.detail.expires_in * 1000 - 60 * 1000);\n }\n }\n async function signOut() {\n !token ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"not signed in\") : invariant(false) : void 0;\n const result = await processRevocationResponse(await revocationRequest(as, client, token.access_token, oauthHttpOptions));\n rmTimeout();\n\n // Clean up\n removeLocal(client);\n token = undefined;\n throwIfError(result);\n eventTarget.dispatchTypedEvent(\"signOut\", new Event(\"signOut\"));\n }\n let pendingSignIn;\n async function signIn() {\n if (pendingSignIn) {\n return pendingSignIn;\n }\n try {\n pendingSignIn = _signIn();\n return await pendingSignIn;\n } finally {\n pendingSignIn = undefined;\n }\n }\n eventTarget.addEventListener(\"signIn\", restartRefreshTimer);\n eventTarget.addEventListener(\"refresh\", restartRefreshTimer);\n const getToken = Object.assign(async function getToken() {\n if (!token || Date.now() >= token.expires_at) {\n token = await signIn();\n }\n return token.access_token;\n }, {\n signIn,\n refresh,\n signOut,\n rmTimeout,\n addEventListener: eventTarget.addEventListener.bind(eventTarget),\n removeEventListener: eventTarget.removeEventListener.bind(eventTarget)\n });\n return {\n getToken,\n makeTokenAndSaveRefresh\n };\n}\nexport function createAuthorizationServer(ctxPath, url) {\n const issuer = `${new URL(ctxPath, url)}`;\n return {\n token_endpoint: `${issuer}/api/oauth2/token`,\n authorization_endpoint: `${issuer}/api/oauth2/authorize`,\n revocation_endpoint: `${issuer}/api/oauth2/revoke_token`,\n issuer\n };\n}","/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { clientCredentialsGrantRequest, customFetch, processClientCredentialsResponse } from \"oauth4webapi\";\nimport { common, createAuthorizationServer } from \"./common.js\";\nimport { throwIfError } from \"./throwIfError.js\";\n\n/**\n * @param client_id\n * @param client_secret\n * @param url the base url of your foundry server\n * @param scopes\n * @param fetchFn\n * @param ctxPath\n * @returns which can be used as a token provider\n */\nexport function createConfidentialOauthClient(client_id, client_secret, url, scopes = [\"api:read-data\", \"api:write-data\"], fetchFn = globalThis.fetch, ctxPath = \"/multipass\") {\n const client = {\n client_id,\n client_secret\n };\n const authServer = createAuthorizationServer(ctxPath, url);\n const oauthHttpOptions = {\n [customFetch]: fetchFn\n };\n const joinedScopes = scopes.join(\" \");\n const {\n getToken,\n makeTokenAndSaveRefresh\n } = common(client, authServer, _signIn, oauthHttpOptions, undefined, joinedScopes);\n async function _signIn() {\n return makeTokenAndSaveRefresh(throwIfError(await processClientCredentialsResponse(authServer, client, await clientCredentialsGrantRequest(authServer, client, new URLSearchParams({\n scope: joinedScopes\n }), oauthHttpOptions))), \"signIn\");\n }\n return getToken;\n}","/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport delay from \"delay\";\nimport { authorizationCodeGrantRequest, calculatePKCECodeChallenge, customFetch, generateRandomCodeVerifier, generateRandomState, processAuthorizationCodeOAuth2Response, refreshTokenGrantRequest, validateAuthResponse } from \"oauth4webapi\";\nimport { common, createAuthorizationServer, readLocal, removeLocal, saveLocal } from \"./common.js\";\nimport { throwIfError } from \"./throwIfError.js\";\n/**\n * @param client_id\n * @param url the base url of your foundry server\n * @param redirectUrl the url configured for redirect in the oauth configuration on the server\n * @param useHistory if true, when possible uses `history.replaceState()`, otherwise uses `window.location.assign()`\n * @param loginPage if you want a custom landing page prior to logging in, set this to that url\n * @param postLoginPage if you want to customize where you return to after a completed authentication cycle. defaults to the url when the page loaded\n * @param scopes\n * @param fetchFn\n * @param ctxPath\n * @returns {PublicOauthClient} which can be used as a token provider\n */\nexport function createPublicOauthClient(client_id, url, redirectUrl, useHistory, loginPage, postLoginPage = window.location.toString(), scopes = [\"api:read-data\", \"api:write-data\"], fetchFn = globalThis.fetch, ctxPath = \"/multipass\") {\n const client = {\n client_id,\n token_endpoint_auth_method: \"none\"\n };\n const authServer = createAuthorizationServer(ctxPath, url);\n const oauthHttpOptions = {\n [customFetch]: fetchFn\n };\n let joinedScopes = [...(scopes ?? [\"api:read-data\", \"api:write-data\"])].sort().join(\" \");\n const {\n makeTokenAndSaveRefresh,\n getToken\n } = common(client, authServer, _signIn, oauthHttpOptions, maybeRefresh.bind(globalThis, true), joinedScopes);\n async function go(x) {\n if (useHistory) return window.history.replaceState({}, \"\", x);else window.location.assign(x);\n await delay(1000);\n throw new Error(\"Unable to redirect\");\n }\n async function maybeRefresh(expectRefreshToken) {\n const {\n refresh_token,\n requestedScopes: initialRequestedScopes\n } = readLocal(client);\n if (!refresh_token) {\n if (expectRefreshToken) throw new Error(\"No refresh token found\");\n return;\n }\n if (!refresh_token || !(initialRequestedScopes != null && joinedScopes === initialRequestedScopes)) {\n if (expectRefreshToken) throw new Error(\"No refresh token found\");\n return;\n }\n try {\n // note, we don't use processRefreshTokenResponse because the mp oauth implementation\n // doesn't do refresh tokens quite right and this lets us skip the id check\n return makeTokenAndSaveRefresh(throwIfError(await processAuthorizationCodeOAuth2Response(authServer, client, await refreshTokenGrantRequest(authServer, client, refresh_token, oauthHttpOptions))), \"refresh\");\n } catch (e) {\n if (process?.env?.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to get OAuth2 refresh token. Removing refresh token\", e);\n }\n removeLocal(client);\n if (expectRefreshToken) {\n throw new Error(\"Could not refresh token\");\n }\n }\n }\n async function maybeHandleAuthReturn() {\n const {\n codeVerifier,\n state,\n oldUrl\n } = readLocal(client);\n if (!codeVerifier) return;\n try {\n const ret = makeTokenAndSaveRefresh(throwIfError(await processAuthorizationCodeOAuth2Response(authServer, client, await authorizationCodeGrantRequest(authServer, client, throwIfError(validateAuthResponse(authServer, client, new URL(window.location.href), state)), redirectUrl, codeVerifier, oauthHttpOptions))), \"signIn\");\n go(oldUrl);\n return ret;\n } catch (e) {\n if (process?.env?.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to get OAuth2 token using PKCE, removing PKCE and starting a new auth flow\", e);\n }\n removeLocal(client);\n }\n }\n async function initiateLoginRedirect() {\n if (loginPage && window.location.href !== loginPage) {\n saveLocal(client, {\n oldUrl: postLoginPage\n });\n return await go(loginPage);\n }\n const state = generateRandomState();\n const codeVerifier = generateRandomCodeVerifier();\n const oldUrl = readLocal(client).oldUrl ?? window.location.toString();\n saveLocal(client, {\n codeVerifier,\n state,\n oldUrl\n });\n window.location.assign(`${authServer.authorization_endpoint}?${new URLSearchParams({\n client_id,\n response_type: \"code\",\n state,\n redirect_uri: redirectUrl,\n code_challenge: await calculatePKCECodeChallenge(codeVerifier),\n code_challenge_method: \"S256\",\n scope: `offline_access ${joinedScopes}`\n })}`);\n\n // Give time for redirect to happen\n await delay(1000);\n throw new Error(\"Unable to redirect\");\n }\n\n /** Will throw if there is no token! */\n async function _signIn() {\n // 1. Check if we have a refresh token in local storage\n return (await maybeRefresh()\n // 2. If there is no refresh token we are likely trying to perform the callback\n ) ?? (await maybeHandleAuthReturn())\n // 3. If we haven't been able to load the token from one of the two above ways, we need to make the initial auth request\n ?? (await initiateLoginRedirect());\n }\n return getToken;\n}"]}
@@ -0,0 +1,14 @@
1
+ import type { Token } from "./Token.js";
2
+ export type Events = {
3
+ signIn: CustomEvent<Token>;
4
+ signOut: Event;
5
+ refresh: CustomEvent<Token>;
6
+ };
7
+ export interface BaseOauthClient<K extends keyof Events & string> {
8
+ (): Promise<string>;
9
+ signIn: () => Promise<Token>;
10
+ signOut: () => Promise<void>;
11
+ addEventListener: <T extends K>(type: T, listener: ((evt: Events[T]) => void) | null, options?: boolean | AddEventListenerOptions) => void;
12
+ removeEventListener: <T extends K>(type: T, callback: ((evt: Events[T]) => void) | null, options?: EventListenerOptions | boolean) => void;
13
+ }
14
+ //# sourceMappingURL=BaseOauthClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseOauthClient.d.ts","sourceRoot":"","sources":["../../src/BaseOauthClient.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,MAAM,MAAM,GAAG;IACnB,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;CAC7B,CAAC;AAEF,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM,MAAM,GAAG,MAAM;IAC9D,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpB,MAAM,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,gBAAgB,EAAE,CAAC,CAAC,SAAS,CAAC,EAC5B,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,EAC3C,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,KACxC,IAAI,CAAC;IAEV,mBAAmB,EAAE,CAAC,CAAC,SAAS,CAAC,EAC/B,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,EAC3C,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,KACrC,IAAI,CAAC;CACX"}
@@ -0,0 +1,4 @@
1
+ import type { BaseOauthClient } from "./BaseOauthClient.js";
2
+ export interface ConfidentialOauthClient extends BaseOauthClient<"signIn" | "signOut"> {
3
+ }
4
+ //# sourceMappingURL=ConfidentialOauthClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfidentialOauthClient.d.ts","sourceRoot":"","sources":["../../src/ConfidentialOauthClient.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,WAAW,uBACf,SAAQ,eAAe,CAAC,QAAQ,GAAG,SAAS,CAAC;CAE9C"}
@@ -1,15 +1,6 @@
1
+ import type { BaseOauthClient } from "./BaseOauthClient.js";
1
2
  import type { Token } from "./Token.js";
2
- export type Events = {
3
- signIn: CustomEvent<Token>;
4
- signOut: Event;
5
- refresh: CustomEvent<Token>;
6
- };
7
- export interface PublicOauthClient {
8
- (): Promise<string>;
9
- signIn: () => Promise<Token>;
3
+ export interface PublicOauthClient extends BaseOauthClient<"signIn" | "signOut" | "refresh"> {
10
4
  refresh: () => Promise<Token | undefined>;
11
- signOut: () => Promise<void>;
12
- addEventListener: <T extends keyof Events & string>(type: T, listener: ((evt: Events[T]) => void) | null, options?: boolean | AddEventListenerOptions) => void;
13
- removeEventListener: <T extends keyof Events & string>(type: T, callback: ((evt: Events[T]) => void) | null, options?: EventListenerOptions | boolean) => void;
14
5
  }
15
6
  //# sourceMappingURL=PublicOauthClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PublicOauthClient.d.ts","sourceRoot":"","sources":["../../src/PublicOauthClient.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,MAAM,MAAM,GAAG;IACnB,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;CAC7B,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpB,MAAM,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAC1C,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B,gBAAgB,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,GAAG,MAAM,EAChD,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,EAC3C,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,KACxC,IAAI,CAAC;IAEV,mBAAmB,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,GAAG,MAAM,EACnD,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,EAC3C,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,KACrC,IAAI,CAAC;CACX"}
1
+ {"version":3,"file":"PublicOauthClient.d.ts","sourceRoot":"","sources":["../../src/PublicOauthClient.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,iBACf,SAAQ,eAAe,CAAC,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAEzD,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;CAC3C"}
@@ -0,0 +1,40 @@
1
+ import type { AuthorizationServer, Client, HttpRequestOptions, OAuth2TokenEndpointResponse } from "oauth4webapi";
2
+ import type { BaseOauthClient, Events } from "./BaseOauthClient.js";
3
+ import type { Token } from "./Token.js";
4
+ type LocalStorageState = {
5
+ refresh_token?: never;
6
+ codeVerifier?: never;
7
+ state?: never;
8
+ oldUrl: string;
9
+ requestedScopes?: string;
10
+ } | {
11
+ refresh_token?: never;
12
+ codeVerifier: string;
13
+ state: string;
14
+ oldUrl: string;
15
+ requestedScopes?: string;
16
+ } | {
17
+ refresh_token?: string;
18
+ codeVerifier?: never;
19
+ state?: never;
20
+ oldUrl?: never;
21
+ requestedScopes?: string;
22
+ } | {
23
+ refresh_token?: never;
24
+ codeVerifier?: never;
25
+ state?: never;
26
+ oldUrl?: never;
27
+ requestedScopes?: string;
28
+ };
29
+ export declare function saveLocal(client: Client, x: LocalStorageState): void;
30
+ export declare function removeLocal(client: Client): void;
31
+ export declare function readLocal(client: Client): LocalStorageState;
32
+ export declare function common<R extends undefined | (() => Promise<Token | undefined>)>(client: Client, as: AuthorizationServer, _signIn: () => Promise<Token>, oauthHttpOptions: HttpRequestOptions, refresh: R, scopes: string): {
33
+ getToken: BaseOauthClient<keyof Events & string> & {
34
+ refresh: R;
35
+ };
36
+ makeTokenAndSaveRefresh: (resp: OAuth2TokenEndpointResponse, type: "signIn" | "refresh") => Token;
37
+ };
38
+ export declare function createAuthorizationServer(ctxPath: string, url: string): Required<Pick<AuthorizationServer, "issuer" | "token_endpoint" | "authorization_endpoint" | "revocation_endpoint">>;
39
+ export {};
40
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/common.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,mBAAmB,EACnB,MAAM,EACN,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAwBxC,KAAK,iBAAiB,GAElB;IACA,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IAGf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAEC;IACA,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAEC;IACA,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACC;IACA,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEJ,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,iBAAiB,QAM7D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,QAKzC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAQ3D;AAED,wBAAgB,MAAM,CACpB,CAAC,SAAS,SAAS,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,EAExD,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,mBAAmB,EACvB,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAC7B,gBAAgB,EAAE,kBAAkB,EACpC,OAAO,EAAE,CAAC,EACV,MAAM,EAAE,MAAM,GACb;IACD,QAAQ,EAAE,eAAe,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC,CAAA;KAAE,CAAC;IAClE,uBAAuB,EAAE,CACvB,IAAI,EAAE,2BAA2B,EACjC,IAAI,EAAE,QAAQ,GAAG,SAAS,KACvB,KAAK,CAAC;CACZ,CAkGA;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,QAAQ,CACT,IAAI,CACF,mBAAmB,EACjB,QAAQ,GACR,gBAAgB,GAChB,wBAAwB,GACxB,qBAAqB,CACxB,CACF,CAQA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=common.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.test.d.ts","sourceRoot":"","sources":["../../src/common.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { ConfidentialOauthClient } from "./ConfidentialOauthClient.js";
2
+ /**
3
+ * @param client_id
4
+ * @param client_secret
5
+ * @param url the base url of your foundry server
6
+ * @param scopes
7
+ * @param fetchFn
8
+ * @param ctxPath
9
+ * @returns which can be used as a token provider
10
+ */
11
+ export declare function createConfidentialOauthClient(client_id: string, client_secret: string, url: string, scopes?: string[], fetchFn?: typeof globalThis.fetch, ctxPath?: string): ConfidentialOauthClient;
12
+ //# sourceMappingURL=createConfidentialOauthClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createConfidentialOauthClient.d.ts","sourceRoot":"","sources":["../../src/createConfidentialOauthClient.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAG5E;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAM,EAAwC,EACtD,OAAO,GAAE,OAAO,UAAU,CAAC,KAAwB,EACnD,OAAO,GAAE,MAAqB,GAC7B,uBAAuB,CAkCzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"createPublicOauthClient.d.ts","sourceRoot":"","sources":["../../src/createPublicOauthClient.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAU,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAmDxE;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,OAAO,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,GAAE,MAAmC,EAClD,MAAM,GAAE,MAAM,EAAwC,EACtD,OAAO,GAAE,OAAO,UAAU,CAAC,KAAwB,EACnD,OAAO,GAAE,MAAqB,GAC7B,iBAAiB,CA0OnB"}
1
+ {"version":3,"file":"createPublicOauthClient.d.ts","sourceRoot":"","sources":["../../src/createPublicOauthClient.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAUhE;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,OAAO,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,GAAE,MAAmC,EAClD,MAAM,GAAE,MAAM,EAAwC,EACtD,OAAO,GAAE,OAAO,UAAU,CAAC,KAAwB,EACnD,OAAO,GAAE,MAAqB,GAC7B,iBAAiB,CA6JnB"}
@@ -1,3 +1,4 @@
1
+ export { createConfidentialOauthClient } from "./createConfidentialOauthClient.js";
1
2
  export { createPublicOauthClient } from "./createPublicOauthClient.js";
2
3
  export type { PublicOauthClient } from "./PublicOauthClient.js";
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}