@dbx-tools/auth 0.9.32 → 0.9.36

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 (72) hide show
  1. package/README.md +49 -97
  2. package/index.ts +8 -26
  3. package/lib/index.d.ts +8 -26
  4. package/lib/index.js +6 -22
  5. package/lib/src/{databricks-cli.d.ts → _databricks-cli.d.ts} +3 -7
  6. package/lib/src/_databricks-cli.js +172 -0
  7. package/lib/src/_errors.d.ts +5 -0
  8. package/lib/src/_errors.js +10 -0
  9. package/lib/src/{lifecycle.d.ts → _lifecycle.d.ts} +5 -5
  10. package/lib/src/_lifecycle.js +214 -0
  11. package/lib/src/_logging.d.ts +1 -1
  12. package/lib/src/_logging.js +2 -2
  13. package/lib/src/{personal-access-token.d.ts → _personal-access-token.d.ts} +1 -1
  14. package/lib/src/_personal-access-token.js +30 -0
  15. package/lib/src/_profile-config.d.ts +43 -0
  16. package/lib/src/_profile-config.js +443 -0
  17. package/lib/src/{service-principal.d.ts → _service-principal.d.ts} +1 -1
  18. package/lib/src/_service-principal.js +69 -0
  19. package/lib/src/{storage.d.ts → _storage.d.ts} +2 -13
  20. package/lib/src/_storage.js +94 -0
  21. package/lib/src/_types.d.ts +40 -0
  22. package/lib/src/_types.js +2 -0
  23. package/lib/src/client.d.ts +30 -0
  24. package/lib/src/client.js +223 -0
  25. package/lib/src/config.d.ts +36 -0
  26. package/lib/src/config.js +15 -0
  27. package/lib/src/profile.d.ts +11 -0
  28. package/lib/src/profile.js +21 -0
  29. package/lib/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +34 -10
  31. package/src/{databricks-cli.ts → _databricks-cli.ts} +20 -109
  32. package/src/_errors.ts +11 -0
  33. package/src/{lifecycle.ts → _lifecycle.ts} +12 -40
  34. package/src/_logging.ts +2 -2
  35. package/src/{personal-access-token.ts → _personal-access-token.ts} +1 -1
  36. package/src/_profile-config.ts +545 -0
  37. package/src/{service-principal.ts → _service-principal.ts} +2 -2
  38. package/src/{storage.ts → _storage.ts} +2 -31
  39. package/src/_types.ts +45 -0
  40. package/src/client.ts +291 -0
  41. package/src/config.ts +44 -0
  42. package/src/profile.ts +33 -0
  43. package/lib/exports.d.ts +0 -2
  44. package/lib/exports.js +0 -3
  45. package/lib/src/_profile-core.d.ts +0 -28
  46. package/lib/src/_profile-core.js +0 -216
  47. package/lib/src/_profile.d.ts +0 -15
  48. package/lib/src/_profile.js +0 -236
  49. package/lib/src/databricks-auth.d.ts +0 -11
  50. package/lib/src/databricks-auth.js +0 -314
  51. package/lib/src/databricks-cli.js +0 -239
  52. package/lib/src/errors.d.ts +0 -7
  53. package/lib/src/errors.js +0 -14
  54. package/lib/src/file-storage.d.ts +0 -20
  55. package/lib/src/file-storage.js +0 -207
  56. package/lib/src/generated/databricks-cli-assets.json +0 -33
  57. package/lib/src/http-client.d.ts +0 -23
  58. package/lib/src/http-client.js +0 -116
  59. package/lib/src/lifecycle.js +0 -233
  60. package/lib/src/personal-access-token.js +0 -30
  61. package/lib/src/service-principal.js +0 -69
  62. package/lib/src/storage.js +0 -112
  63. package/lib/src/types.d.ts +0 -165
  64. package/lib/src/types.js +0 -67
  65. package/src/_profile-core.ts +0 -258
  66. package/src/_profile.ts +0 -319
  67. package/src/databricks-auth.ts +0 -416
  68. package/src/errors.ts +0 -16
  69. package/src/file-storage.ts +0 -230
  70. package/src/generated/databricks-cli-assets.json +0 -33
  71. package/src/http-client.ts +0 -147
  72. package/src/types.ts +0 -196
@@ -1,116 +0,0 @@
1
- import { authLogger } from "./_logging.js";
2
- import { AuthError } from "./errors.js";
3
- import { createAuthClient } from "./databricks-auth.js";
4
- import { DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER } from "./types.js";
5
- const logger = authLogger("http");
6
- /** Dependency-light Databricks JSON client with one rejected-token refresh. */
7
- export class DatabricksClient {
8
- auth;
9
- fetcher;
10
- constructor(auth, fetcher) {
11
- this.auth = auth;
12
- this.fetcher = fetcher;
13
- }
14
- static async create(options = { preferUserToMachine: true }, dependencies = {}) {
15
- const client = new DatabricksClient(await createAuthClient(options, undefined, dependencies), dependencies.fetch ?? globalThis.fetch);
16
- logger.debug("created Databricks HTTP client", {
17
- profile: client.profile(),
18
- host: client.host(),
19
- hasWorkspaceId: Boolean(client.workspaceId()),
20
- });
21
- return client;
22
- }
23
- profile() {
24
- return this.auth.status().profile;
25
- }
26
- host() {
27
- return this.auth.status().host;
28
- }
29
- principal() {
30
- return this.auth.principal();
31
- }
32
- workspaceId() {
33
- return this.auth.workspaceId();
34
- }
35
- async request(path, options = {}) {
36
- const url = new URL(path, `${this.host().replace(/\/$/, "")}/`).toString();
37
- const method = options.method ?? (options.body === undefined ? "GET" : "POST");
38
- const requestUrl = new URL(url);
39
- logger.debug("sending Databricks API request", {
40
- method,
41
- origin: requestUrl.origin,
42
- path: requestUrl.pathname,
43
- hasBody: options.body !== undefined,
44
- login: options.login ?? "auto",
45
- });
46
- let authHeaders = await this.auth.authenticate(options.login);
47
- let response = await this.send(url, method, authHeaders, options);
48
- logger.debug("received Databricks API response", {
49
- method,
50
- path: requestUrl.pathname,
51
- status: response.status,
52
- attempt: 1,
53
- });
54
- if (response.status === 401) {
55
- logger.debug("refreshing rejected Databricks API credential", {
56
- method,
57
- path: requestUrl.pathname,
58
- });
59
- await this.auth.refreshRejectedToken(accessTokenFromHeaders(authHeaders), options.login ?? true);
60
- authHeaders = await this.auth.authenticate(false);
61
- response = await this.send(url, method, authHeaders, options);
62
- logger.debug("received Databricks API response", {
63
- method,
64
- path: requestUrl.pathname,
65
- status: response.status,
66
- attempt: 2,
67
- });
68
- }
69
- const text = await response.text();
70
- if (!response.ok)
71
- throw new AuthError("http", `Databricks API ${path} returned HTTP ${response.status}: ${text}`);
72
- if (!text) {
73
- logger.debug("Databricks API response had no body", {
74
- method,
75
- path: requestUrl.pathname,
76
- });
77
- return undefined;
78
- }
79
- try {
80
- const value = JSON.parse(text);
81
- logger.debug("parsed Databricks API JSON response", {
82
- method,
83
- path: requestUrl.pathname,
84
- });
85
- return value;
86
- }
87
- catch (cause) {
88
- throw new AuthError("http", `Databricks API ${path} did not return JSON`, { cause });
89
- }
90
- }
91
- send(url, method, authHeaders, options) {
92
- const headers = new Headers(options.headers);
93
- headers.delete(DEFAULT_ACCESS_TOKEN_HEADER);
94
- headers.delete(WORKSPACE_ID_HEADER);
95
- for (const [name, value] of Object.entries(authHeaders))
96
- headers.set(name, value);
97
- headers.set("accept", "application/json");
98
- if (options.body !== undefined)
99
- headers.set("content-type", "application/json");
100
- return this.fetcher(url, {
101
- method,
102
- headers,
103
- ...(options.body !== undefined ? { body: JSON.stringify(options.body) } : {}),
104
- signal: options.signal,
105
- });
106
- }
107
- }
108
- function accessTokenFromHeaders(headers) {
109
- const authorization = headers[DEFAULT_ACCESS_TOKEN_HEADER];
110
- const separator = authorization?.indexOf(" ") ?? -1;
111
- if (separator < 1 || !authorization?.slice(separator + 1).trim()) {
112
- throw new AuthError("http", "Authentication headers did not contain an access token");
113
- }
114
- return authorization.slice(separator + 1).trim();
115
- }
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBbUMsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFOUUsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBV2xDLCtFQUErRTtBQUMvRSxNQUFNLE9BQU8sZ0JBQWdCO0lBRWhCO0lBQ1E7SUFGbkIsWUFDVyxJQUFnQixFQUNSLE9BQWdDO1FBRHhDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDUixZQUFPLEdBQVAsT0FBTyxDQUF5QjtJQUNoRCxDQUFDO0lBRUosTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQ2pCLFVBQWlDLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEVBQzlELGVBQTJDLEVBQUU7UUFFN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxnQkFBZ0IsQ0FDakMsTUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUN4RCxZQUFZLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQ3ZDLENBQUM7UUFDRixNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFO1lBQzdDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ3pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ25CLGNBQWMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzlDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFD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SSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xGLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDMUMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVM7WUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDdkIsTUFBTTtZQUNOLE9BQU87WUFDUCxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3RSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxPQUErQjtJQUM3RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUMzRCxNQUFNLFNBQVMsR0FBRyxhQUFhLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDakUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsd0RBQXdELENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQ0QsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXV0aExvZ2dlciB9IGZyb20gXCIuL19sb2dnaW5nLnRzXCI7XG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMudHNcIjtcbmltcG9ydCB7IGNyZWF0ZUF1dGhDbGllbnQsIHR5cGUgRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMgfSBmcm9tIFwiLi9kYXRhYnJpY2tzLWF1dGgudHNcIjtcbmltcG9ydCB0eXBlIHsgQXV0aENsaWVudCwgRGF0YWJyaWNrc0F1dGhPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXMudHNcIjtcbmltcG9ydCB7IERFRkFVTFRfQUNDRVNTX1RPS0VOX0hFQURFUiwgV09SS1NQQUNFX0lEX0hFQURFUiB9IGZyb20gXCIuL3R5cGVzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGF1dGhMb2dnZXIoXCJodHRwXCIpO1xuXG4vKiogT3B0aW9ucyBmb3Igb25lIERhdGFicmlja3MgSlNPTiBBUEkgcmVxdWVzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1JlcXVlc3RPcHRpb25zIHtcbiAgbWV0aG9kPzogc3RyaW5nO1xuICBib2R5PzogdW5rbm93bjtcbiAgaGVhZGVycz86IEhlYWRlcnMgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgW3N0cmluZywgc3RyaW5nXVtdO1xuICBsb2dpbj86IGJvb2xlYW47XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogRGVwZW5kZW5jeS1saWdodCBEYXRhYnJpY2tzIEpTT04gY2xpZW50IHdpdGggb25lIHJlamVjdGVkLXRva2VuIHJlZnJlc2guICovXG5leHBvcnQgY2xhc3MgRGF0YWJyaWNrc0NsaWVudCB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgYXV0aDogQXV0aENsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZldGNoZXI6IHR5cGVvZiBnbG9iYWxUaGlzLmZldGNoLFxuICApIHt9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZShcbiAgICBvcHRpb25zOiBEYXRhYnJpY2tzQXV0aE9wdGlvbnMgPSB7IHByZWZlclVzZXJUb01hY2hpbmU6IHRydWUgfSxcbiAgICBkZXBlbmRlbmNpZXM6IERhdGFicmlja3NBdXRoRGVwZW5kZW5jaWVzID0ge30sXG4gICk6IFByb21pc2U8RGF0YWJyaWNrc0NsaWVudD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBEYXRhYnJpY2tzQ2xpZW50KFxuICAgICAgYXdhaXQgY3JlYXRlQXV0aENsaWVudChvcHRpb25zLCB1bmRlZmluZWQsIGRlcGVuZGVuY2llcyksXG4gICAgICBkZXBlbmRlbmNpZXMuZmV0Y2ggPz8gZ2xvYmFsVGhpcy5mZXRjaCxcbiAgICApO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZWQgRGF0YWJyaWNrcyBIVFRQIGNsaWVudFwiLCB7XG4gICAgICBwcm9maWxlOiBjbGllbnQucHJvZmlsZSgpLFxuICAgICAgaG9zdDogY2xpZW50Lmhvc3QoKSxcbiAgICAgIGhhc1dvcmtzcGFjZUlkOiBCb29sZWFuKGNsaWVudC53b3Jrc3BhY2VJZCgpKSxcbiAgICB9KTtcbiAgICByZXR1cm4gY2xpZW50O1xuICB9XG5cbiAgcHJvZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmF1dGguc3RhdHVzKCkucHJvZmlsZTtcbiAgfVxuXG4gIGhvc3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLnN0YXR1cygpLmhvc3Q7XG4gIH1cblxuICBwcmluY2lwYWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLnByaW5jaXBhbCgpO1xuICB9XG5cbiAgd29ya3NwYWNlSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLndvcmtzcGFjZUlkKCk7XG4gIH1cblxuICBhc3luYyByZXF1ZXN0KHBhdGg6IHN0cmluZywgb3B0aW9uczogRGF0YWJyaWNrc1JlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgsIGAke3RoaXMuaG9zdCgpLnJlcGxhY2UoL1xcLyQvLCBcIlwiKX0vYCkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZCA/PyAob3B0aW9ucy5ib2R5ID09PSB1bmRlZmluZWQgPyBcIkdFVFwiIDogXCJQT1NUXCIpO1xuICAgIGNvbnN0IHJlcXVlc3RVcmwgPSBuZXcgVVJMKHVybCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2VuZGluZyBEYXRhYnJpY2tzIEFQSSByZXF1ZXN0XCIsIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG9yaWdpbjogcmVxdWVzdFVybC5vcmlnaW4sXG4gICAgICBwYXRoOiByZXF1ZXN0VXJsLnBhdGhuYW1lLFxuICAgICAgaGFzQm9keTogb3B0aW9ucy5ib2R5ICE9PSB1bmRlZmluZWQsXG4gICAgICBsb2dpbjogb3B0aW9ucy5sb2dpbiA/PyBcImF1dG9cIixcbiAgICB9KTtcbiAgICBsZXQgYXV0aEhlYWRlcnMgPSBhd2FpdCB0aGlzLmF1dGguYXV0aGVudGljYXRlKG9wdGlvbnMubG9naW4pO1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZCh1cmwsIG1ldGhvZCwgYXV0aEhlYWRlcnMsIG9wdGlvbnMpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlY2VpdmVkIERhdGFicmlja3MgQVBJIHJlc3BvbnNlXCIsIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIHBhdGg6IHJlcXVlc3RVcmwucGF0aG5hbWUsXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIGF0dGVtcHQ6IDEsXG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoaW5nIHJlamVjdGVkIERhdGFicmlja3MgQVBJIGNyZWRlbnRpYWxcIiwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHBhdGg6IHJlcXVlc3RVcmwucGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMuYXV0aC5yZWZyZXNoUmVqZWN0ZWRUb2tlbihcbiAgICAgICAgYWNjZXNzVG9rZW5Gcm9tSGVhZGVycyhhdXRoSGVhZGVycyksXG4gICAgICAgIG9wdGlvbnMubG9naW4gPz8gdHJ1ZSxcbiAgICAgICk7XG4gICAgICBhdXRoSGVhZGVycyA9IGF3YWl0IHRoaXMuYXV0aC5hdXRoZW50aWNhdGUoZmFsc2UpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmQodXJsLCBtZXRob2QsIGF1dGhIZWFkZXJzLCBvcHRpb25zKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInJlY2VpdmVkIERhdGFicmlja3MgQVBJIHJlc3BvbnNlXCIsIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBwYXRoOiByZXF1ZXN0VXJsLnBhdGhuYW1lLFxuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgYXR0ZW1wdDogMixcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFxuICAgICAgICBcImh0dHBcIixcbiAgICAgICAgYERhdGFicmlja3MgQVBJICR7cGF0aH0gcmV0dXJuZWQgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7dGV4dH1gLFxuICAgICAgKTtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIkRhdGFicmlja3MgQVBJIHJlc3BvbnNlIGhhZCBubyBib2R5XCIsIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBwYXRoOiByZXF1ZXN0VXJsLnBhdGhuYW1lLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWUgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicGFyc2VkIERhdGFicmlja3MgQVBJIEpTT04gcmVzcG9uc2VcIiwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHBhdGg6IHJlcXVlc3RVcmwucGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImh0dHBcIiwgYERhdGFicmlja3MgQVBJICR7cGF0aH0gZGlkIG5vdCByZXR1cm4gSlNPTmAsIHsgY2F1c2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZW5kKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIGF1dGhIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIG9wdGlvbnM6IERhdGFicmlja3NSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpO1xuICAgIGhlYWRlcnMuZGVsZXRlKERFRkFVTFRfQUNDRVNTX1RPS0VOX0hFQURFUik7XG4gICAgaGVhZGVycy5kZWxldGUoV09SS1NQQUNFX0lEX0hFQURFUik7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF1dGhIZWFkZXJzKSkgaGVhZGVycy5zZXQobmFtZSwgdmFsdWUpO1xuICAgIGhlYWRlcnMuc2V0KFwiYWNjZXB0XCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICBpZiAob3B0aW9ucy5ib2R5ICE9PSB1bmRlZmluZWQpIGhlYWRlcnMuc2V0KFwiY29udGVudC10eXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICByZXR1cm4gdGhpcy5mZXRjaGVyKHVybCwge1xuICAgICAgbWV0aG9kLFxuICAgICAgaGVhZGVycyxcbiAgICAgIC4uLihvcHRpb25zLmJvZHkgIT09IHVuZGVmaW5lZCA/IHsgYm9keTogSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5ib2R5KSB9IDoge30pLFxuICAgICAgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhY2Nlc3NUb2tlbkZyb21IZWFkZXJzKGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICBjb25zdCBhdXRob3JpemF0aW9uID0gaGVhZGVyc1tERUZBVUxUX0FDQ0VTU19UT0tFTl9IRUFERVJdO1xuICBjb25zdCBzZXBhcmF0b3IgPSBhdXRob3JpemF0aW9uPy5pbmRleE9mKFwiIFwiKSA/PyAtMTtcbiAgaWYgKHNlcGFyYXRvciA8IDEgfHwgIWF1dGhvcml6YXRpb24/LnNsaWNlKHNlcGFyYXRvciArIDEpLnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJodHRwXCIsIFwiQXV0aGVudGljYXRpb24gaGVhZGVycyBkaWQgbm90IGNvbnRhaW4gYW4gYWNjZXNzIHRva2VuXCIpO1xuICB9XG4gIHJldHVybiBhdXRob3JpemF0aW9uLnNsaWNlKHNlcGFyYXRvciArIDEpLnRyaW0oKTtcbn1cbiJdfQ==
@@ -1,233 +0,0 @@
1
- import { AuthError } from "./errors.js";
2
- import { authLogger, credentialId, failureMetadata, tokenMetadata } from "./_logging.js";
3
- const logger = authLogger("lifecycle");
4
- /** Provider-neutral check-lock-check authentication and persistent token lifecycle. */
5
- export class TokenLifecycle {
6
- key;
7
- provider;
8
- store;
9
- options;
10
- now;
11
- constructor(key, provider, store, options, now = () => new Date()) {
12
- this.key = key;
13
- this.provider = provider;
14
- this.store = store;
15
- this.options = options;
16
- this.now = now;
17
- logger.debug("created authentication lifecycle", {
18
- credential: credentialId(key),
19
- storage: store.name(),
20
- refreshBufferMs: options.refreshBufferMs,
21
- lockTimeoutMs: options.lockTimeoutMs,
22
- loginTimeoutMs: options.loginTimeoutMs,
23
- silentProvider: provider.canAuthenticateSilently(),
24
- });
25
- }
26
- storeName() {
27
- return this.store.name();
28
- }
29
- async login() {
30
- logger.debug("interactive login requested", this.context());
31
- return this.withLock(async () => {
32
- await this.store.prepareWrite();
33
- const token = validateToken(await this.provider.login(this.options.loginTimeoutMs));
34
- await this.store.save(this.key, token);
35
- logger.debug("interactive login stored credential", {
36
- ...this.context(),
37
- token: tokenMetadata(token, this.now()),
38
- });
39
- return publicToken(token);
40
- });
41
- }
42
- token() {
43
- return this.loadToken(false);
44
- }
45
- tokenOrLogin() {
46
- return this.loadToken(true);
47
- }
48
- async tokenWithLogin(login) {
49
- logger.debug("token requested", { ...this.context(), login: login ?? "auto" });
50
- if (login === true)
51
- return this.login();
52
- if (login === false)
53
- return this.token();
54
- return this.tokenOrLogin();
55
- }
56
- forceRefresh(login = true) {
57
- logger.debug("forced refresh requested", { ...this.context(), login });
58
- return this.refreshRejected(undefined, login);
59
- }
60
- refreshRejectedToken(staleAccessToken, login = true) {
61
- logger.debug("rejected token refresh requested", { ...this.context(), login });
62
- return this.refreshRejected(staleAccessToken, login);
63
- }
64
- async logout() {
65
- logger.debug("logout requested", this.context());
66
- await this.withLock(() => this.store.remove(this.key));
67
- logger.debug("stored credential removed", this.context());
68
- }
69
- async loadToken(login) {
70
- const existing = await this.store.load(this.key);
71
- const reusable = Boolean(existing && this.canReuse(existing));
72
- logger.debug("checked credential cache", {
73
- ...this.context(),
74
- login,
75
- reusable,
76
- token: tokenMetadata(existing, this.now()),
77
- });
78
- if (existing && reusable)
79
- return publicToken(existing);
80
- return this.withLock(async () => {
81
- const current = await this.store.load(this.key);
82
- const currentReusable = Boolean(current && this.canReuse(current));
83
- logger.debug("rechecked credential cache after lock", {
84
- ...this.context(),
85
- reusable: currentReusable,
86
- token: tokenMetadata(current, this.now()),
87
- });
88
- if (current && currentReusable)
89
- return publicToken(current);
90
- return this.renew(current, login);
91
- });
92
- }
93
- async refreshRejected(staleAccessToken, login) {
94
- return this.withLock(async () => {
95
- const current = await this.store.load(this.key);
96
- if (staleAccessToken &&
97
- current?.accessToken &&
98
- current.accessToken !== staleAccessToken &&
99
- isValid(current, this.now())) {
100
- logger.debug("reused replacement for rejected credential", {
101
- ...this.context(),
102
- token: tokenMetadata(current, this.now()),
103
- });
104
- return publicToken(current);
105
- }
106
- return this.renew(current, login);
107
- });
108
- }
109
- async renew(current, login) {
110
- let token;
111
- if (current) {
112
- logger.debug("refreshing stored credential", {
113
- ...this.context(),
114
- loginFallback: login,
115
- token: tokenMetadata(current, this.now()),
116
- });
117
- try {
118
- token = await this.provider.refresh(current);
119
- }
120
- catch (error) {
121
- logger.debug("credential refresh failed", {
122
- ...this.context(),
123
- loginFallback: login,
124
- error: failureMetadata(error),
125
- });
126
- if (!login)
127
- throw error;
128
- logger.debug("falling back to interactive login", this.context());
129
- token = await this.provider.login(this.options.loginTimeoutMs);
130
- }
131
- }
132
- else if (this.provider.canAuthenticateSilently()) {
133
- logger.debug("attempting silent credential acquisition", {
134
- ...this.context(),
135
- loginFallback: login,
136
- });
137
- try {
138
- token = await this.provider.authenticate(this.options.loginTimeoutMs);
139
- }
140
- catch (error) {
141
- logger.debug("silent credential acquisition failed", {
142
- ...this.context(),
143
- loginFallback: login,
144
- error: failureMetadata(error),
145
- });
146
- if (!login)
147
- throw error;
148
- logger.debug("falling back to interactive login", this.context());
149
- token = await this.provider.login(this.options.loginTimeoutMs);
150
- }
151
- }
152
- else if (login) {
153
- logger.debug("provider requires interactive login", this.context());
154
- token = await this.provider.login(this.options.loginTimeoutMs);
155
- }
156
- else {
157
- throw new AuthError("oauth", "No stored credential is available and interactive login is disabled");
158
- }
159
- token = validateToken(token, current);
160
- logger.debug("credential acquisition completed", {
161
- ...this.context(),
162
- token: tokenMetadata(token, this.now()),
163
- });
164
- await this.store.prepareWrite();
165
- await this.store.save(this.key, token);
166
- logger.debug("credential saved", this.context());
167
- return publicToken(token);
168
- }
169
- canReuse(token) {
170
- if (!isValid(token, this.now()))
171
- return false;
172
- if (!token.expiry)
173
- return true;
174
- return (Date.parse(token.expiry) - this.now().getTime() > this.options.refreshBufferMs);
175
- }
176
- async withLock(action) {
177
- logger.debug("waiting for credential lock", this.context());
178
- // Omit the timeout (wait indefinitely) unless a positive cap is configured.
179
- // The holder may run for minutes; the caller owns the overall request budget
180
- // and the lock is always released when `action` settles (success or error).
181
- const lockTimeoutMs = this.options.lockTimeoutMs > 0 ? this.options.lockTimeoutMs : undefined;
182
- const lease = await this.store.acquireLock(this.key, lockTimeoutMs);
183
- logger.debug("credential lock acquired", this.context());
184
- let failure;
185
- try {
186
- return await action();
187
- }
188
- catch (error) {
189
- failure = error;
190
- throw error;
191
- }
192
- finally {
193
- try {
194
- await this.store.releaseLock(lease);
195
- logger.debug("credential lock released", this.context());
196
- }
197
- catch (releaseError) {
198
- logger.debug("credential lock release failed", {
199
- ...this.context(),
200
- error: failureMetadata(releaseError),
201
- });
202
- if (failure === undefined)
203
- throw releaseError;
204
- }
205
- }
206
- }
207
- context() {
208
- return { credential: credentialId(this.key), storage: this.store.name() };
209
- }
210
- }
211
- export function publicToken(token) {
212
- return {
213
- accessToken: token.accessToken,
214
- tokenType: token.tokenType,
215
- ...(token.expiry ? { expiry: token.expiry } : {}),
216
- scopes: [...token.scopes],
217
- };
218
- }
219
- export function validateToken(token, previous) {
220
- if (!token.accessToken.trim())
221
- throw new AuthError("oauth", "Token response did not contain an access token");
222
- return {
223
- accessToken: token.accessToken,
224
- tokenType: token.tokenType || "Bearer",
225
- refreshToken: token.refreshToken ?? previous?.refreshToken,
226
- expiry: token.expiry,
227
- scopes: token.scopes.length ? [...token.scopes] : [...(previous?.scopes ?? [])],
228
- };
229
- }
230
- function isValid(token, now) {
231
- return Boolean(token.accessToken) && (!token.expiry || Date.parse(token.expiry) > now.getTime());
232
- }
233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZWN5Y2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpZmVjeWNsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHekYsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRXZDLHVGQUF1RjtBQUN2RixNQUFNLE9BQU8sY0FBYztJQUVOO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFMbkIsWUFDbUIsR0FBVyxFQUNYLFFBQXVCLEVBQ3ZCLEtBQXNCLEVBQ3RCLE9BQW9CLEVBQ3BCLE1BQWtCLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFO1FBSmxDLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFDWCxhQUFRLEdBQVIsUUFBUSxDQUFlO1FBQ3ZCLFVBQUssR0FBTCxLQUFLLENBQWlCO1FBQ3RCLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDcEIsUUFBRyxHQUFILEdBQUcsQ0FBK0I7UUFFbkQsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRTtZQUMvQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUM3QixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRTtZQUNyQixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7WUFDeEMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhO1lBQ3BDLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztZQUN0QyxjQUFjLEVBQUUsUUFBUSxDQUFDLHVCQUF1QixFQUFFO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxLQUFLLENBQUMs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QVE7UUFDdEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksUUFBUSxFQUFFLFlBQVk7UUFDMUQsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQ3BCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztLQUNoRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFDLEtBQVksRUFBRSxHQUFTO0lBQ3RDLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUNuRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLnRzXCI7XG5pbXBvcnQgeyBhdXRoTG9nZ2VyLCBjcmVkZW50aWFsSWQsIGZhaWx1cmVNZXRhZGF0YSwgdG9rZW5NZXRhZGF0YSB9IGZyb20gXCIuL19sb2dnaW5nLnRzXCI7XG5pbXBvcnQgdHlwZSB7IEFjY2Vzc1Rva2VuLCBBdXRoT3B0aW9ucywgQ3JlZGVudGlhbFN0b3JlLCBUb2tlbiwgVG9rZW5Qcm92aWRlciB9IGZyb20gXCIuL3R5cGVzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGF1dGhMb2dnZXIoXCJsaWZlY3ljbGVcIik7XG5cbi8qKiBQcm92aWRlci1uZXV0cmFsIGNoZWNrLWxvY2stY2hlY2sgYXV0aGVudGljYXRpb24gYW5kIHBlcnNpc3RlbnQgdG9rZW4gbGlmZWN5Y2xlLiAqL1xuZXhwb3J0IGNsYXNzIFRva2VuTGlmZWN5Y2xlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBrZXk6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVyOiBUb2tlblByb3ZpZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmU6IENyZWRlbnRpYWxTdG9yZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEF1dGhPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbm93OiAoKSA9PiBEYXRlID0gKCkgPT4gbmV3IERhdGUoKSxcbiAgKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlZCBhdXRoZW50aWNhdGlvbiBsaWZlY3ljbGVcIiwge1xuICAgICAgY3JlZGVudGlhbDogY3JlZGVudGlhbElkKGtleSksXG4gICAgICBzdG9yYWdlOiBzdG9yZS5uYW1lKCksXG4gICAgICByZWZyZXNoQnVmZmVyTXM6IG9wdGlvbnMucmVmcmVzaEJ1ZmZlck1zLFxuICAgICAgbG9ja1RpbWVvdXRNczogb3B0aW9ucy5sb2NrVGltZW91dE1zLFxuICAgICAgbG9naW5UaW1lb3V0TXM6IG9wdGlvbnMubG9naW5UaW1lb3V0TXMsXG4gICAgICBzaWxlbnRQcm92aWRlcjogcHJvdmlkZXIuY2FuQXV0aGVudGljYXRlU2lsZW50bHkoKSxcbiAgICB9KTtcbiAgfVxuXG4gIHN0b3JlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLm5hbWUoKTtcbiAgfVxuXG4gIGFzeW5jIGxvZ2luKCk6IFByb21pc2U8QWNjZXNzVG9rZW4+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJpbnRlcmFjdGl2ZSBsb2dpbiByZXF1ZXN0ZWRcIiwgdGhpcy5jb250ZXh0KCkpO1xuICAgIHJldHVybiB0aGlzLndpdGhMb2NrKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmUucHJlcGFyZVdyaXRlKCk7XG4gICAgICBjb25zdCB0b2tlbiA9IHZhbGlkYXRlVG9rZW4oXG4gICAgICAgIGF3YWl0IHRoaXMucHJvdmlkZXIubG9naW4odGhpcy5vcHRpb25zLmxvZ2luVGltZW91dE1zKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLnN0b3JlLnNhdmUodGhpcy5rZXksIHRva2VuKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImludGVyYWN0aXZlIGxvZ2luIHN0b3JlZCBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICAgIHRva2VuOiB0b2tlbk1ldGFkYXRhKHRva2VuLCB0aGlzLm5vdygpKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHB1YmxpY1Rva2VuKHRva2VuKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRva2VuKCk6IFByb21pc2U8QWNjZXNzVG9rZW4+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkVG9rZW4oZmFsc2UpO1xuICB9XG5cbiAgdG9rZW5PckxvZ2luKCk6IFByb21pc2U8QWNjZXNzVG9rZW4+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkVG9rZW4odHJ1ZSk7XG4gIH1cblxuICBhc3luYyB0b2tlbldpdGhMb2dpbihsb2dpbj86IGJvb2xlYW4pOiBQcm9taXNlPEFjY2Vzc1Rva2VuPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwidG9rZW4gcmVxdWVzdGVkXCIsIHsgLi4udGhpcy5jb250ZXh0KCksIGxvZ2luOiBsb2dpbiA/PyBcImF1dG9cIiB9KTtcbiAgICBpZiAobG9naW4gPT09IHRydWUpIHJldHVybiB0aGlzLmxvZ2luKCk7XG4gICAgaWYgKGxvZ2luID09PSBmYWxzZSkgcmV0dXJuIHRoaXMudG9rZW4oKTtcbiAgICByZXR1cm4gdGhpcy50b2tlbk9yTG9naW4oKTtcbiAgfVxuXG4gIGZvcmNlUmVmcmVzaChsb2dpbiA9IHRydWUpOiBQcm9taXNlPEFjY2Vzc1Rva2VuPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZm9yY2VkIHJlZnJlc2ggcmVxdWVzdGVkXCIsIHsgLi4udGhpcy5jb250ZXh0KCksIGxvZ2luIH0pO1xuICAgIHJldHVybiB0aGlzLnJlZnJlc2hSZWplY3RlZCh1bmRlZmluZWQsIGxvZ2luKTtcbiAgfVxuXG4gIHJlZnJlc2hSZWplY3RlZFRva2VuKHN0YWxlQWNjZXNzVG9rZW46IHN0cmluZywgbG9naW4gPSB0cnVlKTogUHJvbWlzZTxBY2Nlc3NUb2tlbj4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlamVjdGVkIHRva2VuIHJlZnJlc2ggcmVxdWVzdGVkXCIsIHsgLi4udGhpcy5jb250ZXh0KCksIGxvZ2luIH0pO1xuICAgIHJldHVybiB0aGlzLnJlZnJlc2hSZWplY3RlZChzdGFsZUFjY2Vzc1Rva2VuLCBsb2dpbik7XG4gIH1cblxuICBhc3luYyBsb2dvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwibG9nb3V0IHJlcXVlc3RlZFwiLCB0aGlzLmNvbnRleHQoKSk7XG4gICAgYXdhaXQgdGhpcy53aXRoTG9jaygoKSA9PiB0aGlzLnN0b3JlLnJlbW92ZSh0aGlzLmtleSkpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInN0b3JlZCBjcmVkZW50aWFsIHJlbW92ZWRcIiwgdGhpcy5jb250ZXh0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkVG9rZW4obG9naW46IGJvb2xlYW4pOiBQcm9taXNlPEFjY2Vzc1Rva2VuPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnN0b3JlLmxvYWQodGhpcy5rZXkpO1xuICAgIGNvbnN0IHJldXNhYmxlID0gQm9vbGVhbihleGlzdGluZyAmJiB0aGlzLmNhblJldXNlKGV4aXN0aW5nKSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY2hlY2tlZCBjcmVkZW50aWFsIGNhY2hlXCIsIHtcbiAgICAgIC4uLnRoaXMuY29udGV4dCgpLFxuICAgICAgbG9naW4sXG4gICAgICByZXVzYWJsZSxcbiAgICAgIHRva2VuOiB0b2tlbk1ldGFkYXRhKGV4aXN0aW5nLCB0aGlzLm5vdygpKSxcbiAgICB9KTtcbiAgICBpZiAoZXhpc3RpbmcgJiYgcmV1c2FibGUpIHJldHVybiBwdWJsaWNUb2tlbihleGlzdGluZyk7XG4gICAgcmV0dXJuIHRoaXMud2l0aExvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuc3RvcmUubG9hZCh0aGlzLmtleSk7XG4gICAgICBjb25zdCBjdXJyZW50UmV1c2FibGUgPSBCb29sZWFuKGN1cnJlbnQgJiYgdGhpcy5jYW5SZXVzZShjdXJyZW50KSk7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZWNoZWNrZWQgY3JlZGVudGlhbCBjYWNoZSBhZnRlciBsb2NrXCIsIHtcbiAgICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICAgIHJldXNhYmxlOiBjdXJyZW50UmV1c2FibGUsXG4gICAgICAgIHRva2VuOiB0b2tlbk1ldGFkYXRhKGN1cnJlbnQsIHRoaXMubm93KCkpLFxuICAgICAgfSk7XG4gICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50UmV1c2FibGUpIHJldHVybiBwdWJsaWNUb2tlbihjdXJyZW50KTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmV3KGN1cnJlbnQsIGxvZ2luKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaFJlamVjdGVkKFxuICAgIHN0YWxlQWNjZXNzVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBsb2dpbjogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxBY2Nlc3NUb2tlbj4ge1xuICAgIHJldHVybiB0aGlzLndpdGhMb2NrKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLnN0b3JlLmxvYWQodGhpcy5rZXkpO1xuICAgICAgaWYgKFxuICAgICAgICBzdGFsZUFjY2Vzc1Rva2VuICYmXG4gICAgICAgIGN1cnJlbnQ/LmFjY2Vzc1Rva2VuICYmXG4gICAgICAgIGN1cnJlbnQuYWNjZXNzVG9rZW4gIT09IHN0YWxlQWNjZXNzVG9rZW4gJiZcbiAgICAgICAgaXNWYWxpZChjdXJyZW50LCB0aGlzLm5vdygpKVxuICAgICAgKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcInJldXNlZCByZXBsYWNlbWVudCBmb3IgcmVqZWN0ZWQgY3JlZGVudGlhbFwiLCB7XG4gICAgICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICAgICAgdG9rZW46IHRva2VuTWV0YWRhdGEoY3VycmVudCwgdGhpcy5ub3coKSksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHVibGljVG9rZW4oY3VycmVudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5yZW5ldyhjdXJyZW50LCBsb2dpbik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmV3KGN1cnJlbnQ6IFRva2VuIHwgdW5kZWZpbmVkLCBsb2dpbjogYm9vbGVhbik6IFByb21pc2U8QWNjZXNzVG9rZW4+IHtcbiAgICBsZXQgdG9rZW46IFRva2VuO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoaW5nIHN0b3JlZCBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICAgIGxvZ2luRmFsbGJhY2s6IGxvZ2luLFxuICAgICAgICB0b2tlbjogdG9rZW5NZXRhZGF0YShjdXJyZW50LCB0aGlzLm5vdygpKSxcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCB0aGlzLnByb3ZpZGVyLnJlZnJlc2goY3VycmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJjcmVkZW50aWFsIHJlZnJlc2ggZmFpbGVkXCIsIHtcbiAgICAgICAgICAuLi50aGlzLmNvbnRleHQoKSxcbiAgICAgICAgICBsb2dpbkZhbGxiYWNrOiBsb2dpbixcbiAgICAgICAgICBlcnJvcjogZmFpbHVyZU1ldGFkYXRhKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghbG9naW4pIHRocm93IGVycm9yO1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJmYWxsaW5nIGJhY2sgdG8gaW50ZXJhY3RpdmUgbG9naW5cIiwgdGhpcy5jb250ZXh0KCkpO1xuICAgICAgICB0b2tlbiA9IGF3YWl0IHRoaXMucHJvdmlkZXIubG9naW4odGhpcy5vcHRpb25zLmxvZ2luVGltZW91dE1zKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvdmlkZXIuY2FuQXV0aGVudGljYXRlU2lsZW50bHkoKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiYXR0ZW1wdGluZyBzaWxlbnQgY3JlZGVudGlhbCBhY3F1aXNpdGlvblwiLCB7XG4gICAgICAgIC4uLnRoaXMuY29udGV4dCgpLFxuICAgICAgICBsb2dpbkZhbGxiYWNrOiBsb2dpbixcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCB0aGlzLnByb3ZpZGVyLmF1dGhlbnRpY2F0ZSh0aGlzLm9wdGlvbnMubG9naW5UaW1lb3V0TXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwic2lsZW50IGNyZWRlbnRpYWwgYWNxdWlzaXRpb24gZmFpbGVkXCIsIHtcbiAgICAgICAgICAuLi50aGlzLmNvbnRleHQoKSxcbiAgICAgICAgICBsb2dpbkZhbGxiYWNrOiBsb2dpbixcbiAgICAgICAgICBlcnJvcjogZmFpbHVyZU1ldGFkYXRhKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghbG9naW4pIHRocm93IGVycm9yO1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJmYWxsaW5nIGJhY2sgdG8gaW50ZXJhY3RpdmUgbG9naW5cIiwgdGhpcy5jb250ZXh0KCkpO1xuICAgICAgICB0b2tlbiA9IGF3YWl0IHRoaXMucHJvdmlkZXIubG9naW4odGhpcy5vcHRpb25zLmxvZ2luVGltZW91dE1zKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGxvZ2luKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJwcm92aWRlciByZXF1aXJlcyBpbnRlcmFjdGl2ZSBsb2dpblwiLCB0aGlzLmNvbnRleHQoKSk7XG4gICAgICB0b2tlbiA9IGF3YWl0IHRoaXMucHJvdmlkZXIubG9naW4odGhpcy5vcHRpb25zLmxvZ2luVGltZW91dE1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcbiAgICAgICAgXCJvYXV0aFwiLFxuICAgICAgICBcIk5vIHN0b3JlZCBjcmVkZW50aWFsIGlzIGF2YWlsYWJsZSBhbmQgaW50ZXJhY3RpdmUgbG9naW4gaXMgZGlzYWJsZWRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRva2VuID0gdmFsaWRhdGVUb2tlbih0b2tlbiwgY3VycmVudCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlZGVudGlhbCBhY3F1aXNpdGlvbiBjb21wbGV0ZWRcIiwge1xuICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICB0b2tlbjogdG9rZW5NZXRhZGF0YSh0b2tlbiwgdGhpcy5ub3coKSksXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5zdG9yZS5wcmVwYXJlV3JpdGUoKTtcbiAgICBhd2FpdCB0aGlzLnN0b3JlLnNhdmUodGhpcy5rZXksIHRva2VuKTtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVkZW50aWFsIHNhdmVkXCIsIHRoaXMuY29udGV4dCgpKTtcbiAgICByZXR1cm4gcHVibGljVG9rZW4odG9rZW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5SZXVzZSh0b2tlbjogVG9rZW4pOiBib29sZWFuIHtcbiAgICBpZiAoIWlzVmFsaWQodG9rZW4sIHRoaXMubm93KCkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0b2tlbi5leHBpcnkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiAoXG4gICAgICBEYXRlLnBhcnNlKHRva2VuLmV4cGlyeSkgLSB0aGlzLm5vdygpLmdldFRpbWUoKSA+IHRoaXMub3B0aW9ucy5yZWZyZXNoQnVmZmVyTXNcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3aXRoTG9jazxUPihhY3Rpb246ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJ3YWl0aW5nIGZvciBjcmVkZW50aWFsIGxvY2tcIiwgdGhpcy5jb250ZXh0KCkpO1xuICAgIC8vIE9taXQgdGhlIHRpbWVvdXQgKHdhaXQgaW5kZWZpbml0ZWx5KSB1bmxlc3MgYSBwb3NpdGl2ZSBjYXAgaXMgY29uZmlndXJlZC5cbiAgICAvLyBUaGUgaG9sZGVyIG1heSBydW4gZm9yIG1pbnV0ZXM7IHRoZSBjYWxsZXIgb3ducyB0aGUgb3ZlcmFsbCByZXF1ZXN0IGJ1ZGdldFxuICAgIC8vIGFuZCB0aGUgbG9jayBpcyBhbHdheXMgcmVsZWFzZWQgd2hlbiBgYWN0aW9uYCBzZXR0bGVzIChzdWNjZXNzIG9yIGVycm9yKS5cbiAgICBjb25zdCBsb2NrVGltZW91dE1zID0gdGhpcy5vcHRpb25zLmxvY2tUaW1lb3V0TXMgPiAwID8gdGhpcy5vcHRpb25zLmxvY2tUaW1lb3V0TXMgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGVhc2UgPSBhd2FpdCB0aGlzLnN0b3JlLmFjcXVpcmVMb2NrKHRoaXMua2V5LCBsb2NrVGltZW91dE1zKTtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVkZW50aWFsIGxvY2sgYWNxdWlyZWRcIiwgdGhpcy5jb250ZXh0KCkpO1xuICAgIGxldCBmYWlsdXJlOiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYWN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZhaWx1cmUgPSBlcnJvcjtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnJlbGVhc2VMb2NrKGxlYXNlKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiY3JlZGVudGlhbCBsb2NrIHJlbGVhc2VkXCIsIHRoaXMuY29udGV4dCgpKTtcbiAgICAgIH0gY2F0Y2ggKHJlbGVhc2VFcnJvcikge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJjcmVkZW50aWFsIGxvY2sgcmVsZWFzZSBmYWlsZWRcIiwge1xuICAgICAgICAgIC4uLnRoaXMuY29udGV4dCgpLFxuICAgICAgICAgIGVycm9yOiBmYWlsdXJlTWV0YWRhdGEocmVsZWFzZUVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChmYWlsdXJlID09PSB1bmRlZmluZWQpIHRocm93IHJlbGVhc2VFcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnRleHQoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7IGNyZWRlbnRpYWw6IGNyZWRlbnRpYWxJZCh0aGlzLmtleSksIHN0b3JhZ2U6IHRoaXMuc3RvcmUubmFtZSgpIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHB1YmxpY1Rva2VuKHRva2VuOiBUb2tlbik6IEFjY2Vzc1Rva2VuIHtcbiAgcmV0dXJuIHtcbiAgICBhY2Nlc3NUb2tlbjogdG9rZW4uYWNjZXNzVG9rZW4sXG4gICAgdG9rZW5UeXBlOiB0b2tlbi50b2tlblR5cGUsXG4gICAgLi4uKHRva2VuLmV4cGlyeSA/IHsgZXhwaXJ5OiB0b2tlbi5leHBpcnkgfSA6IHt9KSxcbiAgICBzY29wZXM6IFsuLi50b2tlbi5zY29wZXNdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUb2tlbih0b2tlbjogVG9rZW4sIHByZXZpb3VzPzogVG9rZW4pOiBUb2tlbiB7XG4gIGlmICghdG9rZW4uYWNjZXNzVG9rZW4udHJpbSgpKVxuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJvYXV0aFwiLCBcIlRva2VuIHJlc3BvbnNlIGRpZCBub3QgY29udGFpbiBhbiBhY2Nlc3MgdG9rZW5cIik7XG4gIHJldHVybiB7XG4gICAgYWNjZXNzVG9rZW46IHRva2VuLmFjY2Vzc1Rva2VuLFxuICAgIHRva2VuVHlwZTogdG9rZW4udG9rZW5UeXBlIHx8IFwiQmVhcmVyXCIsXG4gICAgcmVmcmVzaFRva2VuOiB0b2tlbi5yZWZyZXNoVG9rZW4gPz8gcHJldmlvdXM/LnJlZnJlc2hUb2tlbixcbiAgICBleHBpcnk6IHRva2VuLmV4cGlyeSxcbiAgICBzY29wZXM6IHRva2VuLnNjb3Blcy5sZW5ndGggPyBbLi4udG9rZW4uc2NvcGVzXSA6IFsuLi4ocHJldmlvdXM/LnNjb3BlcyA/PyBbXSldLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkKHRva2VuOiBUb2tlbiwgbm93OiBEYXRlKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKHRva2VuLmFjY2Vzc1Rva2VuKSAmJiAoIXRva2VuLmV4cGlyeSB8fCBEYXRlLnBhcnNlKHRva2VuLmV4cGlyeSkgPiBub3cuZ2V0VGltZSgpKTtcbn1cbiJdfQ==
@@ -1,30 +0,0 @@
1
- import { authLogger } from "./_logging.js";
2
- const logger = authLogger("pat");
3
- /** Non-refreshing provider for a configured Databricks personal access token. */
4
- export class DatabricksPersonalAccessTokenProvider {
5
- accessToken;
6
- constructor(accessToken) {
7
- this.accessToken = accessToken;
8
- }
9
- authenticate() {
10
- return Promise.resolve(this.token());
11
- }
12
- login() {
13
- return Promise.resolve(this.token());
14
- }
15
- refresh() {
16
- return Promise.resolve(this.token());
17
- }
18
- canAuthenticateSilently() {
19
- return true;
20
- }
21
- token() {
22
- logger.debug("using configured personal access token");
23
- return {
24
- accessToken: this.accessToken,
25
- tokenType: "Bearer",
26
- scopes: [],
27
- };
28
- }
29
- }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc29uYWwtYWNjZXNzLXRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BlcnNvbmFsLWFjY2Vzcy10b2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUVqQyxpRkFBaUY7QUFDakYsTUFBTSxPQUFPLHFDQUFxQztJQUNuQjtJQUE3QixZQUE2QixXQUFtQjtRQUFuQixnQkFBVyxHQUFYLFdBQVcsQ0FBUTtJQUFHLENBQUM7SUFFcEQsWUFBWTtRQUNWLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLEtBQUs7UUFDWCxNQUFNLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDdkQsT0FBTztZQUNMLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixTQUFTLEVBQUUsUUFBUTtZQUNuQixNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhdXRoTG9nZ2VyIH0gZnJvbSBcIi4vX2xvZ2dpbmcudHNcIjtcbmltcG9ydCB0eXBlIHsgVG9rZW4sIFRva2VuUHJvdmlkZXIgfSBmcm9tIFwiLi90eXBlcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBhdXRoTG9nZ2VyKFwicGF0XCIpO1xuXG4vKiogTm9uLXJlZnJlc2hpbmcgcHJvdmlkZXIgZm9yIGEgY29uZmlndXJlZCBEYXRhYnJpY2tzIHBlcnNvbmFsIGFjY2VzcyB0b2tlbi4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYnJpY2tzUGVyc29uYWxBY2Nlc3NUb2tlblByb3ZpZGVyIGltcGxlbWVudHMgVG9rZW5Qcm92aWRlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYWNjZXNzVG9rZW46IHN0cmluZykge31cblxuICBhdXRoZW50aWNhdGUoKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy50b2tlbigpKTtcbiAgfVxuXG4gIGxvZ2luKCk6IFByb21pc2U8VG9rZW4+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMudG9rZW4oKSk7XG4gIH1cblxuICByZWZyZXNoKCk6IFByb21pc2U8VG9rZW4+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMudG9rZW4oKSk7XG4gIH1cblxuICBjYW5BdXRoZW50aWNhdGVTaWxlbnRseSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdG9rZW4oKTogVG9rZW4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInVzaW5nIGNvbmZpZ3VyZWQgcGVyc29uYWwgYWNjZXNzIHRva2VuXCIpO1xuICAgIHJldHVybiB7XG4gICAgICBhY2Nlc3NUb2tlbjogdGhpcy5hY2Nlc3NUb2tlbixcbiAgICAgIHRva2VuVHlwZTogXCJCZWFyZXJcIixcbiAgICAgIHNjb3BlczogW10sXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -1,69 +0,0 @@
1
- import * as oauth from "oauth4webapi";
2
- import { authLogger, failureMetadata, tokenMetadata } from "./_logging.js";
3
- import { AuthError } from "./errors.js";
4
- const logger = authLogger("service-principal");
5
- /** Databricks service-principal provider backed by client credentials. */
6
- export class DatabricksServicePrincipalProvider {
7
- config;
8
- authorizationServer;
9
- client;
10
- requestOptions;
11
- constructor(config) {
12
- this.config = config;
13
- this.authorizationServer = {
14
- issuer: new URL(config.tokenEndpoint).origin,
15
- token_endpoint: config.tokenEndpoint,
16
- };
17
- this.client = { client_id: config.clientId };
18
- this.requestOptions = {
19
- ...(config.fetch ? { [oauth.customFetch]: config.fetch } : {}),
20
- ...(config.allowInsecureRequests ? { [oauth.allowInsecureRequests]: true } : {}),
21
- };
22
- }
23
- authenticate() {
24
- return this.acquire();
25
- }
26
- login() {
27
- return this.acquire();
28
- }
29
- refresh() {
30
- return this.acquire();
31
- }
32
- canAuthenticateSilently() {
33
- return true;
34
- }
35
- async acquire() {
36
- logger.debug("requesting service-principal token", {
37
- tokenOrigin: new URL(this.config.tokenEndpoint).origin,
38
- scopeCount: this.config.scopes.length,
39
- hasGroupId: Boolean(this.config.groupId),
40
- allowInsecureRequests: Boolean(this.config.allowInsecureRequests),
41
- });
42
- try {
43
- const response = await oauth.clientCredentialsGrantRequest(this.authorizationServer, this.client, oauth.ClientSecretBasic(this.config.clientSecret), {
44
- scope: [...new Set(this.config.scopes)].sort().join(" "),
45
- ...(this.config.groupId ? { assume_group: this.config.groupId } : {}),
46
- }, this.requestOptions);
47
- const value = await oauth.processClientCredentialsResponse(this.authorizationServer, this.client, response);
48
- const token = {
49
- accessToken: value.access_token,
50
- tokenType: value.token_type.toLowerCase() === "bearer" ? "Bearer" : value.token_type,
51
- ...(value.expires_in !== undefined
52
- ? { expiry: new Date(Date.now() + value.expires_in * 1000).toISOString() }
53
- : {}),
54
- scopes: value.scope?.split(/\s+/).filter(Boolean) ?? [...this.config.scopes],
55
- };
56
- logger.debug("received service-principal token", { token: tokenMetadata(token) });
57
- return token;
58
- }
59
- catch (cause) {
60
- logger.debug("service-principal token request failed", {
61
- error: failureMetadata(cause),
62
- });
63
- throw new AuthError("oauth", "Databricks service-principal authentication failed", {
64
- cause,
65
- });
66
- }
67
- }
68
- }
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1wcmluY2lwYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZS1wcmluY2lwYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUM7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHeEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFhL0MsMEVBQTBFO0FBQzFFLE1BQU0sT0FBTyxrQ0FBa0M7SUFLaEI7SUFKWixtQkFBbUIsQ0FBNEI7SUFDL0MsTUFBTSxDQUFlO0lBQ3JCLGNBQWMsQ0FBb0Q7SUFFbkYsWUFBNkIsTUFBd0M7UUFBeEMsV0FBTSxHQUFOLE1BQU0sQ0FBa0M7UUFDbkUsSUFBSSxDQUFDLG1CQUFtQixHQUFHO1lBQ3pCLE1BQU0sRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTTtZQUM1QyxjQUFjLEVBQUUsTUFBTSxDQUFDLGFBQWE7U0FDckMsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxjQUFjLEdBQUc7WUFDcEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQWdDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pGLEdBQUcsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxD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LENBQUMsS0FBSyxDQUFDO2FBQzlCLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLG9EQUFvRCxFQUFFO2dCQUNqRixLQUFLO2FBQ04sQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG9hdXRoIGZyb20gXCJvYXV0aDR3ZWJhcGlcIjtcblxuaW1wb3J0IHsgYXV0aExvZ2dlciwgZmFpbHVyZU1ldGFkYXRhLCB0b2tlbk1ldGFkYXRhIH0gZnJvbSBcIi4vX2xvZ2dpbmcudHNcIjtcbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuL2Vycm9ycy50c1wiO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5Qcm92aWRlciB9IGZyb20gXCIuL3R5cGVzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGF1dGhMb2dnZXIoXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcblxuLyoqIENsaWVudC1jcmVkZW50aWFscyBpbnB1dHMgYW5kIHRyYW5zcG9ydCBvcHRpb25zIGZvciBEYXRhYnJpY2tzIE9BdXRoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzU2VydmljZVByaW5jaXBhbENvbmZpZyB7XG4gIHRva2VuRW5kcG9pbnQ6IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gIHNjb3Blczogc3RyaW5nW107XG4gIGdyb3VwSWQ/OiBzdHJpbmc7XG4gIGZldGNoPzogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG4gIGFsbG93SW5zZWN1cmVSZXF1ZXN0cz86IGJvb2xlYW47XG59XG5cbi8qKiBEYXRhYnJpY2tzIHNlcnZpY2UtcHJpbmNpcGFsIHByb3ZpZGVyIGJhY2tlZCBieSBjbGllbnQgY3JlZGVudGlhbHMuICovXG5leHBvcnQgY2xhc3MgRGF0YWJyaWNrc1NlcnZpY2VQcmluY2lwYWxQcm92aWRlciBpbXBsZW1lbnRzIFRva2VuUHJvdmlkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dGhvcml6YXRpb25TZXJ2ZXI6IG9hdXRoLkF1dGhvcml6YXRpb25TZXJ2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBvYXV0aC5DbGllbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdE9wdGlvbnM6IG9hdXRoLkh0dHBSZXF1ZXN0T3B0aW9uczxzdHJpbmcsIFVSTFNlYXJjaFBhcmFtcz47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb25maWc6IERhdGFicmlja3NTZXJ2aWNlUHJpbmNpcGFsQ29uZmlnKSB7XG4gICAgdGhpcy5hdXRob3JpemF0aW9uU2VydmVyID0ge1xuICAgICAgaXNzdWVyOiBuZXcgVVJMKGNvbmZpZy50b2tlbkVuZHBvaW50KS5vcmlnaW4sXG4gICAgICB0b2tlbl9lbmRwb2ludDogY29uZmlnLnRva2VuRW5kcG9pbnQsXG4gICAgfTtcbiAgICB0aGlzLmNsaWVudCA9IHsgY2xpZW50X2lkOiBjb25maWcuY2xpZW50SWQgfTtcbiAgICB0aGlzLnJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgLi4uKGNvbmZpZy5mZXRjaCA/IHsgW29hdXRoLmN1c3RvbUZldGNoXTogY29uZmlnLmZldGNoIGFzIHR5cGVvZiBnbG9iYWxUaGlzLmZldGNoIH0gOiB7fSksXG4gICAgICAuLi4oY29uZmlnLmFsbG93SW5zZWN1cmVSZXF1ZXN0cyA/IHsgW29hdXRoLmFsbG93SW5zZWN1cmVSZXF1ZXN0c106IHRydWUgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgYXV0aGVudGljYXRlKCk6IFByb21pc2U8VG9rZW4+IHtcbiAgICByZXR1cm4gdGhpcy5hY3F1aXJlKCk7XG4gIH1cblxuICBsb2dpbigpOiBQcm9taXNlPFRva2VuPiB7XG4gICAgcmV0dXJuIHRoaXMuYWNxdWlyZSgpO1xuICB9XG5cbiAgcmVmcmVzaCgpOiBQcm9taXNlPFRva2VuPiB7XG4gICAgcmV0dXJuIHRoaXMuYWNxdWlyZSgpO1xuICB9XG5cbiAgY2FuQXV0aGVudGljYXRlU2lsZW50bHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFjcXVpcmUoKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlcXVlc3Rpbmcgc2VydmljZS1wcmluY2lwYWwgdG9rZW5cIiwge1xuICAgICAgdG9rZW5PcmlnaW46IG5ldyBVUkwodGhpcy5jb25maWcudG9rZW5FbmRwb2ludCkub3JpZ2luLFxuICAgICAgc2NvcGVDb3VudDogdGhpcy5jb25maWcuc2NvcGVzLmxlbmd0aCxcbiAgICAgIGhhc0dyb3VwSWQ6IEJvb2xlYW4odGhpcy5jb25maWcuZ3JvdXBJZCksXG4gICAgICBhbGxvd0luc2VjdXJlUmVxdWVzdHM6IEJvb2xlYW4odGhpcy5jb25maWcuYWxsb3dJbnNlY3VyZVJlcXVlc3RzKSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvYXV0aC5jbGllbnRDcmVkZW50aWFsc0dyYW50UmVxdWVzdChcbiAgICAgICAgdGhpcy5hdXRob3JpemF0aW9uU2VydmVyLFxuICAgICAgICB0aGlzLmNsaWVudCxcbiAgICAgICAgb2F1dGguQ2xpZW50U2VjcmV0QmFzaWModGhpcy5jb25maWcuY2xpZW50U2VjcmV0KSxcbiAgICAgICAge1xuICAgICAgICAgIHNjb3BlOiBbLi4ubmV3IFNldCh0aGlzLmNvbmZpZy5zY29wZXMpXS5zb3J0KCkuam9pbihcIiBcIiksXG4gICAgICAgICAgLi4uKHRoaXMuY29uZmlnLmdyb3VwSWQgPyB7IGFzc3VtZV9ncm91cDogdGhpcy5jb25maWcuZ3JvdXBJZCB9IDoge30pLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnJlcXVlc3RPcHRpb25zLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgb2F1dGgucHJvY2Vzc0NsaWVudENyZWRlbnRpYWxzUmVzcG9uc2UoXG4gICAgICAgIHRoaXMuYXV0aG9yaXphdGlvblNlcnZlcixcbiAgICAgICAgdGhpcy5jbGllbnQsXG4gICAgICAgIHJlc3BvbnNlLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRva2VuID0ge1xuICAgICAgICBhY2Nlc3NUb2tlbjogdmFsdWUuYWNjZXNzX3Rva2VuLFxuICAgICAgICB0b2tlblR5cGU6IHZhbHVlLnRva2VuX3R5cGUudG9Mb3dlckNhc2UoKSA9PT0gXCJiZWFyZXJcIiA/IFwiQmVhcmVyXCIgOiB2YWx1ZS50b2tlbl90eXBlLFxuICAgICAgICAuLi4odmFsdWUuZXhwaXJlc19pbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGV4cGlyeTogbmV3IERhdGUoRGF0ZS5ub3coKSArIHZhbHVlLmV4cGlyZXNfaW4gKiAxMDAwKS50b0lTT1N0cmluZygpIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgc2NvcGVzOiB2YWx1ZS5zY29wZT8uc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbikgPz8gWy4uLnRoaXMuY29uZmlnLnNjb3Blc10sXG4gICAgICB9O1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmVjZWl2ZWQgc2VydmljZS1wcmluY2lwYWwgdG9rZW5cIiwgeyB0b2tlbjogdG9rZW5NZXRhZGF0YSh0b2tlbikgfSk7XG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNlcnZpY2UtcHJpbmNpcGFsIHRva2VuIHJlcXVlc3QgZmFpbGVkXCIsIHtcbiAgICAgICAgZXJyb3I6IGZhaWx1cmVNZXRhZGF0YShjYXVzZSksXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJvYXV0aFwiLCBcIkRhdGFicmlja3Mgc2VydmljZS1wcmluY2lwYWwgYXV0aGVudGljYXRpb24gZmFpbGVkXCIsIHtcbiAgICAgICAgY2F1c2UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==