@dbx-tools/auth 0.9.32 → 0.9.37

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
@@ -0,0 +1,214 @@
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
+ refreshBufferMs: options.refreshBufferMs,
20
+ lockTimeoutMs: options.lockTimeoutMs,
21
+ loginTimeoutMs: options.loginTimeoutMs,
22
+ silentProvider: provider.canAuthenticateSilently(),
23
+ });
24
+ }
25
+ async login() {
26
+ logger.debug("interactive login requested", this.context());
27
+ return this.withLock(async () => {
28
+ const token = validateToken(await this.provider.login(this.options.loginTimeoutMs));
29
+ await this.store.save(this.key, token);
30
+ logger.debug("interactive login stored credential", {
31
+ ...this.context(),
32
+ token: tokenMetadata(token, this.now()),
33
+ });
34
+ return publicToken(token);
35
+ });
36
+ }
37
+ token() {
38
+ return this.loadToken(false);
39
+ }
40
+ tokenOrLogin() {
41
+ return this.loadToken(true);
42
+ }
43
+ async tokenWithLogin(login) {
44
+ logger.debug("token requested", { ...this.context(), login: login ?? "auto" });
45
+ if (login === true)
46
+ return this.login();
47
+ if (login === false)
48
+ return this.token();
49
+ return this.tokenOrLogin();
50
+ }
51
+ forceRefresh(login = true) {
52
+ logger.debug("forced refresh requested", { ...this.context(), login });
53
+ return this.refresh(login);
54
+ }
55
+ async logout() {
56
+ logger.debug("logout requested", this.context());
57
+ await this.withLock(() => this.store.remove(this.key));
58
+ logger.debug("stored credential removed", this.context());
59
+ }
60
+ async loadToken(login) {
61
+ const existing = await this.store.load(this.key);
62
+ const reusable = Boolean(existing && this.canReuse(existing));
63
+ logger.debug("checked credential cache", {
64
+ ...this.context(),
65
+ login,
66
+ reusable,
67
+ token: tokenMetadata(existing, this.now()),
68
+ });
69
+ if (existing && reusable)
70
+ return publicToken(existing);
71
+ return this.withLock(async () => {
72
+ const current = await this.store.load(this.key);
73
+ const currentReusable = Boolean(current && this.canReuse(current));
74
+ logger.debug("rechecked credential cache after lock", {
75
+ ...this.context(),
76
+ reusable: currentReusable,
77
+ token: tokenMetadata(current, this.now()),
78
+ });
79
+ if (current && currentReusable)
80
+ return publicToken(current);
81
+ return this.renew(current, login);
82
+ });
83
+ }
84
+ async refresh(login) {
85
+ return this.withLock(async () => {
86
+ const current = await this.store.load(this.key);
87
+ return this.renew(current, login);
88
+ });
89
+ }
90
+ async renew(current, login) {
91
+ let token;
92
+ if (current) {
93
+ logger.debug("refreshing stored credential", {
94
+ ...this.context(),
95
+ loginFallback: login,
96
+ token: tokenMetadata(current, this.now()),
97
+ });
98
+ try {
99
+ token = await this.provider.refresh(current);
100
+ }
101
+ catch (error) {
102
+ logger.debug("credential refresh failed", {
103
+ ...this.context(),
104
+ loginFallback: login,
105
+ error: failureMetadata(error),
106
+ });
107
+ if (!login)
108
+ throw error;
109
+ logger.debug("falling back to interactive login", this.context());
110
+ token = await this.provider.login(this.options.loginTimeoutMs);
111
+ }
112
+ }
113
+ else if (this.provider.canAuthenticateSilently()) {
114
+ logger.debug("attempting silent credential acquisition", {
115
+ ...this.context(),
116
+ loginFallback: login,
117
+ });
118
+ try {
119
+ token = await this.provider.authenticate(this.options.loginTimeoutMs);
120
+ }
121
+ catch (error) {
122
+ logger.debug("silent credential acquisition failed", {
123
+ ...this.context(),
124
+ loginFallback: login,
125
+ error: failureMetadata(error),
126
+ });
127
+ if (!login)
128
+ throw error;
129
+ logger.debug("falling back to interactive login", this.context());
130
+ token = await this.provider.login(this.options.loginTimeoutMs);
131
+ }
132
+ }
133
+ else if (login) {
134
+ logger.debug("provider requires interactive login", this.context());
135
+ token = await this.provider.login(this.options.loginTimeoutMs);
136
+ }
137
+ else {
138
+ throw new AuthError("oauth", "No stored credential is available and interactive login is disabled");
139
+ }
140
+ token = validateToken(token, current);
141
+ logger.debug("credential acquisition completed", {
142
+ ...this.context(),
143
+ token: tokenMetadata(token, this.now()),
144
+ });
145
+ await this.store.save(this.key, token);
146
+ logger.debug("credential saved", this.context());
147
+ return publicToken(token);
148
+ }
149
+ canReuse(token) {
150
+ if (!isValid(token, this.now()))
151
+ return false;
152
+ if (!token.expiry)
153
+ return true;
154
+ return Date.parse(token.expiry) - this.now().getTime() > this.options.refreshBufferMs;
155
+ }
156
+ async withLock(action) {
157
+ logger.debug("waiting for credential lock", this.context());
158
+ // Omit the timeout (wait indefinitely) unless a positive cap is configured.
159
+ // The holder may run for minutes; the caller owns the overall request budget
160
+ // and the lock is always released when `action` settles (success or error).
161
+ const lockTimeoutMs = this.options.lockTimeoutMs > 0 ? this.options.lockTimeoutMs : undefined;
162
+ const lease = await this.store.acquireLock(this.key, lockTimeoutMs);
163
+ logger.debug("credential lock acquired", this.context());
164
+ let failure;
165
+ try {
166
+ return await action();
167
+ }
168
+ catch (error) {
169
+ failure = error;
170
+ throw error;
171
+ }
172
+ finally {
173
+ try {
174
+ await this.store.releaseLock(lease);
175
+ logger.debug("credential lock released", this.context());
176
+ }
177
+ catch (releaseError) {
178
+ logger.debug("credential lock release failed", {
179
+ ...this.context(),
180
+ error: failureMetadata(releaseError),
181
+ });
182
+ if (failure === undefined)
183
+ throw releaseError;
184
+ }
185
+ }
186
+ }
187
+ context() {
188
+ return { credential: credentialId(this.key) };
189
+ }
190
+ }
191
+ export function publicToken(token) {
192
+ return {
193
+ accessToken: token.accessToken,
194
+ tokenType: token.tokenType,
195
+ ...(token.expiry ? { expiry: token.expiry } : {}),
196
+ scopes: [...token.scopes],
197
+ };
198
+ }
199
+ export function validateToken(token, previous) {
200
+ if (!token.accessToken.trim()) {
201
+ throw new AuthError("oauth", "Token response did not contain an access token");
202
+ }
203
+ return {
204
+ accessToken: token.accessToken,
205
+ tokenType: token.tokenType || "Bearer",
206
+ refreshToken: token.refreshToken ?? previous?.refreshToken,
207
+ expiry: token.expiry,
208
+ scopes: token.scopes.length ? [...token.scopes] : [...(previous?.scopes ?? [])],
209
+ };
210
+ }
211
+ function isValid(token, now) {
212
+ return Boolean(token.accessToken) && (!token.expiry || Date.parse(token.expiry) > now.getTime());
213
+ }
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2xpZmVjeWNsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fbGlmZWN5Y2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUt6RixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdkMsdUZBQXVGO0FBQ3ZGLE1BQU0sT0FBTyxjQUFjO0lBRU47SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUxuQixZQUNtQixHQUFXLEVBQ1gsUUFBdUIsRUFDdkIsS0FBc0IsRUFDdEIsT0FBOEIsRUFDOUIsTUFBa0IsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUU7UUFKbEMsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUNYLGFBQVEsR0FBUixRQUFRLENBQWU7UUFDdkIsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUFDdEIsWUFBTyxHQUFQLE9BQU8sQ0FBdUI7UUFDOUIsUUFBRyxHQUFILEdBQUcsQ0FBK0I7UUFFbkQsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRTtZQUMvQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUM3QixlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7WUFDeEMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhO1lBQ3BDLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztZQUN0QyxjQUFjLEVBQUUsUUFBUSxDQUFDLHVCQUF1QixFQUFFO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDNUQsT0FBTyxJQUFJLENBQUMsUUFBUSxD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LEVBQUUsZ0RBQWdELENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsT0FBTztRQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztRQUM5QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsSUFBSSxRQUFRO1FBQ3RDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLFFBQVEsRUFBRSxZQUFZO1FBQzFELE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtRQUNwQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7S0FDaEYsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxLQUFZLEVBQUUsR0FBUztJQUN0QyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDbkcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuL19lcnJvcnMudHNcIjtcbmltcG9ydCB7IGF1dGhMb2dnZXIsIGNyZWRlbnRpYWxJZCwgZmFpbHVyZU1ldGFkYXRhLCB0b2tlbk1ldGFkYXRhIH0gZnJvbSBcIi4vX2xvZ2dpbmcudHNcIjtcbmltcG9ydCB0eXBlIHsgQ3JlZGVudGlhbFN0b3JlLCBUb2tlbiwgVG9rZW5Qcm92aWRlciB9IGZyb20gXCIuL190eXBlcy50c1wiO1xuaW1wb3J0IHR5cGUgeyBBY2Nlc3NUb2tlbiB9IGZyb20gXCIuL2NsaWVudC50c1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoT3B0aW9ucyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBhdXRoTG9nZ2VyKFwibGlmZWN5Y2xlXCIpO1xuXG4vKiogUHJvdmlkZXItbmV1dHJhbCBjaGVjay1sb2NrLWNoZWNrIGF1dGhlbnRpY2F0aW9uIGFuZCBwZXJzaXN0ZW50IHRva2VuIGxpZmVjeWNsZS4gKi9cbmV4cG9ydCBjbGFzcyBUb2tlbkxpZmVjeWNsZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkga2V5OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlcjogVG9rZW5Qcm92aWRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBDcmVkZW50aWFsU3RvcmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxBdXRoT3B0aW9ucz4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBub3c6ICgpID0+IERhdGUgPSAoKSA9PiBuZXcgRGF0ZSgpLFxuICApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVkIGF1dGhlbnRpY2F0aW9uIGxpZmVjeWNsZVwiLCB7XG4gICAgICBjcmVkZW50aWFsOiBjcmVkZW50aWFsSWQoa2V5KSxcbiAgICAgIHJlZnJlc2hCdWZmZXJNczogb3B0aW9ucy5yZWZyZXNoQnVmZmVyTXMsXG4gICAgICBsb2NrVGltZW91dE1zOiBvcHRpb25zLmxvY2tUaW1lb3V0TXMsXG4gICAgICBsb2dpblRpbWVvdXRNczogb3B0aW9ucy5sb2dpblRpbWVvdXRNcyxcbiAgICAgIHNpbGVudFByb3ZpZGVyOiBwcm92aWRlci5jYW5BdXRoZW50aWNhdGVTaWxlbnRseSgpLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbG9naW4oKTogUHJvbWlzZTxBY2Nlc3NUb2tlbj4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImludGVyYWN0aXZlIGxvZ2luIHJlcXVlc3RlZFwiLCB0aGlzLmNvbnRleHQoKSk7XG4gICAgcmV0dXJuIHRoaXMud2l0aExvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSB2YWxpZGF0ZVRva2VuKGF3YWl0IHRoaXMucHJvdmlkZXIubG9naW4odGhpcy5vcHRpb25zLmxvZ2luVGltZW91dE1zKSk7XG4gICAgICBhd2FpdCB0aGlzLnN0b3JlLnNhdmUodGhpcy5rZXksIHRva2VuKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImludGVyYWN0aXZlIGxvZ2luIHN0b3JlZCBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICAgIHRva2VuOiB0b2tlbk1ldGFkYXRhKHRva2VuLCB0aGlzLm5vdygpKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHB1YmxpY1Rva2VuKHRva2VuKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRva2VuKCk6IFByb21pc2U8QWNjZXNzVG9rZW4+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkVG9rZW4oZmFsc2UpO1xuICB9XG5cbiAgdG9rZW5PckxvZ2luKCk6IFByb21pc2U8QWNjZXNzVG9rZW4+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkVG9rZW4odHJ1ZSk7XG4gIH1cblxuICBhc3luYyB0b2tlbldpdGhMb2dpbihsb2dpbj86IGJvb2xlYW4pOiBQcm9taXNlPEFjY2Vzc1Rva2VuPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwidG9rZW4gcmVxdWVzdGVkXCIsIHsgLi4udGhpcy5jb250ZXh0KCksIGxvZ2luOiBsb2dpbiA/PyBcImF1dG9cIiB9KTtcbiAgICBpZiAobG9naW4gPT09IHRydWUpIHJldHVybiB0aGlzLmxvZ2luKCk7XG4gICAgaWYgKGxvZ2luID09PSBmYWxzZSkgcmV0dXJuIHRoaXMudG9rZW4oKTtcbiAgICByZXR1cm4gdGhpcy50b2tlbk9yTG9naW4oKTtcbiAgfVxuXG4gIGZvcmNlUmVmcmVzaChsb2dpbiA9IHRydWUpOiBQcm9taXNlPEFjY2Vzc1Rva2VuPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZm9yY2VkIHJlZnJlc2ggcmVxdWVzdGVkXCIsIHsgLi4udGhpcy5jb250ZXh0KCksIGxvZ2luIH0pO1xuICAgIHJldHVybiB0aGlzLnJlZnJlc2gobG9naW4pO1xuICB9XG5cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxvZ291dCByZXF1ZXN0ZWRcIiwgdGhpcy5jb250ZXh0KCkpO1xuICAgIGF3YWl0IHRoaXMud2l0aExvY2soKCkgPT4gdGhpcy5zdG9yZS5yZW1vdmUodGhpcy5rZXkpKTtcbiAgICBsb2dnZXIuZGVidWcoXCJzdG9yZWQgY3JlZGVudGlhbCByZW1vdmVkXCIsIHRoaXMuY29udGV4dCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFRva2VuKGxvZ2luOiBib29sZWFuKTogUHJvbWlzZTxBY2Nlc3NUb2tlbj4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zdG9yZS5sb2FkKHRoaXMua2V5KTtcbiAgICBjb25zdCByZXVzYWJsZSA9IEJvb2xlYW4oZXhpc3RpbmcgJiYgdGhpcy5jYW5SZXVzZShleGlzdGluZykpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNoZWNrZWQgY3JlZGVudGlhbCBjYWNoZVwiLCB7XG4gICAgICAuLi50aGlzLmNvbnRleHQoKSxcbiAgICAgIGxvZ2luLFxuICAgICAgcmV1c2FibGUsXG4gICAgICB0b2tlbjogdG9rZW5NZXRhZGF0YShleGlzdGluZywgdGhpcy5ub3coKSksXG4gICAgfSk7XG4gICAgaWYgKGV4aXN0aW5nICYmIHJldXNhYmxlKSByZXR1cm4gcHVibGljVG9rZW4oZXhpc3RpbmcpO1xuICAgIHJldHVybiB0aGlzLndpdGhMb2NrKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLnN0b3JlLmxvYWQodGhpcy5rZXkpO1xuICAgICAgY29uc3QgY3VycmVudFJldXNhYmxlID0gQm9vbGVhbihjdXJyZW50ICYmIHRoaXMuY2FuUmV1c2UoY3VycmVudCkpO1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmVjaGVja2VkIGNyZWRlbnRpYWwgY2FjaGUgYWZ0ZXIgbG9ja1wiLCB7XG4gICAgICAgIC4uLnRoaXMuY29udGV4dCgpLFxuICAgICAgICByZXVzYWJsZTogY3VycmVudFJldXNhYmxlLFxuICAgICAgICB0b2tlbjogdG9rZW5NZXRhZGF0YShjdXJyZW50LCB0aGlzLm5vdygpKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudFJldXNhYmxlKSByZXR1cm4gcHVibGljVG9rZW4oY3VycmVudCk7XG4gICAgICByZXR1cm4gdGhpcy5yZW5ldyhjdXJyZW50LCBsb2dpbik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2gobG9naW46IGJvb2xlYW4pOiBQcm9taXNlPEFjY2Vzc1Rva2VuPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aExvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuc3RvcmUubG9hZCh0aGlzLmtleSk7XG4gICAgICByZXR1cm4gdGhpcy5yZW5ldyhjdXJyZW50LCBsb2dpbik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmV3KGN1cnJlbnQ6IFRva2VuIHwgdW5kZWZpbmVkLCBsb2dpbjogYm9vbGVhbik6IFByb21pc2U8QWNjZXNzVG9rZW4+IHtcbiAgICBsZXQgdG9rZW46IFRva2VuO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZWZyZXNoaW5nIHN0b3JlZCBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICAgIGxvZ2luRmFsbGJhY2s6IGxvZ2luLFxuICAgICAgICB0b2tlbjogdG9rZW5NZXRhZGF0YShjdXJyZW50LCB0aGlzLm5vdygpKSxcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCB0aGlzLnByb3ZpZGVyLnJlZnJlc2goY3VycmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJjcmVkZW50aWFsIHJlZnJlc2ggZmFpbGVkXCIsIHtcbiAgICAgICAgICAuLi50aGlzLmNvbnRleHQoKSxcbiAgICAgICAgICBsb2dpbkZhbGxiYWNrOiBsb2dpbixcbiAgICAgICAgICBlcnJvcjogZmFpbHVyZU1ldGFkYXRhKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghbG9naW4pIHRocm93IGVycm9yO1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJmYWxsaW5nIGJhY2sgdG8gaW50ZXJhY3RpdmUgbG9naW5cIiwgdGhpcy5jb250ZXh0KCkpO1xuICAgICAgICB0b2tlbiA9IGF3YWl0IHRoaXMucHJvdmlkZXIubG9naW4odGhpcy5vcHRpb25zLmxvZ2luVGltZW91dE1zKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvdmlkZXIuY2FuQXV0aGVudGljYXRlU2lsZW50bHkoKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiYXR0ZW1wdGluZyBzaWxlbnQgY3JlZGVudGlhbCBhY3F1aXNpdGlvblwiLCB7XG4gICAgICAgIC4uLnRoaXMuY29udGV4dCgpLFxuICAgICAgICBsb2dpbkZhbGxiYWNrOiBsb2dpbixcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCB0aGlzLnByb3ZpZGVyLmF1dGhlbnRpY2F0ZSh0aGlzLm9wdGlvbnMubG9naW5UaW1lb3V0TXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwic2lsZW50IGNyZWRlbnRpYWwgYWNxdWlzaXRpb24gZmFpbGVkXCIsIHtcbiAgICAgICAgICAuLi50aGlzLmNvbnRleHQoKSxcbiAgICAgICAgICBsb2dpbkZhbGxiYWNrOiBsb2dpbixcbiAgICAgICAgICBlcnJvcjogZmFpbHVyZU1ldGFkYXRhKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghbG9naW4pIHRocm93IGVycm9yO1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJmYWxsaW5nIGJhY2sgdG8gaW50ZXJhY3RpdmUgbG9naW5cIiwgdGhpcy5jb250ZXh0KCkpO1xuICAgICAgICB0b2tlbiA9IGF3YWl0IHRoaXMucHJvdmlkZXIubG9naW4odGhpcy5vcHRpb25zLmxvZ2luVGltZW91dE1zKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGxvZ2luKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJwcm92aWRlciByZXF1aXJlcyBpbnRlcmFjdGl2ZSBsb2dpblwiLCB0aGlzLmNvbnRleHQoKSk7XG4gICAgICB0b2tlbiA9IGF3YWl0IHRoaXMucHJvdmlkZXIubG9naW4odGhpcy5vcHRpb25zLmxvZ2luVGltZW91dE1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcbiAgICAgICAgXCJvYXV0aFwiLFxuICAgICAgICBcIk5vIHN0b3JlZCBjcmVkZW50aWFsIGlzIGF2YWlsYWJsZSBhbmQgaW50ZXJhY3RpdmUgbG9naW4gaXMgZGlzYWJsZWRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRva2VuID0gdmFsaWRhdGVUb2tlbih0b2tlbiwgY3VycmVudCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlZGVudGlhbCBhY3F1aXNpdGlvbiBjb21wbGV0ZWRcIiwge1xuICAgICAgLi4udGhpcy5jb250ZXh0KCksXG4gICAgICB0b2tlbjogdG9rZW5NZXRhZGF0YSh0b2tlbiwgdGhpcy5ub3coKSksXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5zdG9yZS5zYXZlKHRoaXMua2V5LCB0b2tlbik7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlZGVudGlhbCBzYXZlZFwiLCB0aGlzLmNvbnRleHQoKSk7XG4gICAgcmV0dXJuIHB1YmxpY1Rva2VuKHRva2VuKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuUmV1c2UodG9rZW46IFRva2VuKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpc1ZhbGlkKHRva2VuLCB0aGlzLm5vdygpKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghdG9rZW4uZXhwaXJ5KSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gRGF0ZS5wYXJzZSh0b2tlbi5leHBpcnkpIC0gdGhpcy5ub3coKS5nZXRUaW1lKCkgPiB0aGlzLm9wdGlvbnMucmVmcmVzaEJ1ZmZlck1zO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3aXRoTG9jazxUPihhY3Rpb246ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJ3YWl0aW5nIGZvciBjcmVkZW50aWFsIGxvY2tcIiwgdGhpcy5jb250ZXh0KCkpO1xuICAgIC8vIE9taXQgdGhlIHRpbWVvdXQgKHdhaXQgaW5kZWZpbml0ZWx5KSB1bmxlc3MgYSBwb3NpdGl2ZSBjYXAgaXMgY29uZmlndXJlZC5cbiAgICAvLyBUaGUgaG9sZGVyIG1heSBydW4gZm9yIG1pbnV0ZXM7IHRoZSBjYWxsZXIgb3ducyB0aGUgb3ZlcmFsbCByZXF1ZXN0IGJ1ZGdldFxuICAgIC8vIGFuZCB0aGUgbG9jayBpcyBhbHdheXMgcmVsZWFzZWQgd2hlbiBgYWN0aW9uYCBzZXR0bGVzIChzdWNjZXNzIG9yIGVycm9yKS5cbiAgICBjb25zdCBsb2NrVGltZW91dE1zID0gdGhpcy5vcHRpb25zLmxvY2tUaW1lb3V0TXMgPiAwID8gdGhpcy5vcHRpb25zLmxvY2tUaW1lb3V0TXMgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGVhc2UgPSBhd2FpdCB0aGlzLnN0b3JlLmFjcXVpcmVMb2NrKHRoaXMua2V5LCBsb2NrVGltZW91dE1zKTtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVkZW50aWFsIGxvY2sgYWNxdWlyZWRcIiwgdGhpcy5jb250ZXh0KCkpO1xuICAgIGxldCBmYWlsdXJlOiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYWN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZhaWx1cmUgPSBlcnJvcjtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnJlbGVhc2VMb2NrKGxlYXNlKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiY3JlZGVudGlhbCBsb2NrIHJlbGVhc2VkXCIsIHRoaXMuY29udGV4dCgpKTtcbiAgICAgIH0gY2F0Y2ggKHJlbGVhc2VFcnJvcikge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJjcmVkZW50aWFsIGxvY2sgcmVsZWFzZSBmYWlsZWRcIiwge1xuICAgICAgICAgIC4uLnRoaXMuY29udGV4dCgpLFxuICAgICAgICAgIGVycm9yOiBmYWlsdXJlTWV0YWRhdGEocmVsZWFzZUVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChmYWlsdXJlID09PSB1bmRlZmluZWQpIHRocm93IHJlbGVhc2VFcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnRleHQoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7IGNyZWRlbnRpYWw6IGNyZWRlbnRpYWxJZCh0aGlzLmtleSkgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHVibGljVG9rZW4odG9rZW46IFRva2VuKTogQWNjZXNzVG9rZW4ge1xuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuOiB0b2tlbi5hY2Nlc3NUb2tlbixcbiAgICB0b2tlblR5cGU6IHRva2VuLnRva2VuVHlwZSxcbiAgICAuLi4odG9rZW4uZXhwaXJ5ID8geyBleHBpcnk6IHRva2VuLmV4cGlyeSB9IDoge30pLFxuICAgIHNjb3BlczogWy4uLnRva2VuLnNjb3Blc10sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRva2VuKHRva2VuOiBUb2tlbiwgcHJldmlvdXM/OiBUb2tlbik6IFRva2VuIHtcbiAgaWYgKCF0b2tlbi5hY2Nlc3NUb2tlbi50cmltKCkpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwib2F1dGhcIiwgXCJUb2tlbiByZXNwb25zZSBkaWQgbm90IGNvbnRhaW4gYW4gYWNjZXNzIHRva2VuXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYWNjZXNzVG9rZW46IHRva2VuLmFjY2Vzc1Rva2VuLFxuICAgIHRva2VuVHlwZTogdG9rZW4udG9rZW5UeXBlIHx8IFwiQmVhcmVyXCIsXG4gICAgcmVmcmVzaFRva2VuOiB0b2tlbi5yZWZyZXNoVG9rZW4gPz8gcHJldmlvdXM/LnJlZnJlc2hUb2tlbixcbiAgICBleHBpcnk6IHRva2VuLmV4cGlyeSxcbiAgICBzY29wZXM6IHRva2VuLnNjb3Blcy5sZW5ndGggPyBbLi4udG9rZW4uc2NvcGVzXSA6IFsuLi4ocHJldmlvdXM/LnNjb3BlcyA/PyBbXSldLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkKHRva2VuOiBUb2tlbiwgbm93OiBEYXRlKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKHRva2VuLmFjY2Vzc1Rva2VuKSAmJiAoIXRva2VuLmV4cGlyeSB8fCBEYXRlLnBhcnNlKHRva2VuLmV4cGlyeSkgPiBub3cuZ2V0VGltZSgpKTtcbn1cbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import * as log from "@dbx-tools/shared-core/log";
2
- import type { Token } from "./types.ts";
2
+ import type { Token } from "./_types.ts";
3
3
  /** Auth logger with a stable capability-specific tag. */
4
4
  export declare function authLogger(scope: string): log.Logger;
5
5
  /** Stable non-secret identifier for a credential cache key. */
@@ -1,6 +1,6 @@
1
1
  import * as hash from "@dbx-tools/shared-core/hash";
2
2
  import * as log from "@dbx-tools/shared-core/log";
3
- import { AuthError } from "./errors.js";
3
+ import { AuthError } from "./_errors.js";
4
4
  /** Auth logger with a stable capability-specific tag. */
5
5
  export function authLogger(scope) {
6
6
  return log.logger(`auth:${scope}`);
@@ -35,4 +35,4 @@ export function failureMetadata(cause) {
35
35
  ...(cause instanceof AuthError ? { kind: cause.kind } : {}),
36
36
  };
37
37
  }
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2xvZ2dpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX2xvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSw2QkFBNkIsQ0FBQztBQUNwRCxPQUFPLEtBQUssR0FBRyxNQUFNLDRCQUE0QixDQUFDO0FBRWxELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHeEMseURBQXlEO0FBQ3pELE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBYTtJQUN0QyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFXO0lBQ3RDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsNkRBQTZEO0FBQzdELE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBd0IsRUFBRSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUU7SUFDdEUsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckUsT0FBTztRQUNMLE9BQU8sRUFBRSxJQUFJO1FBQ2IsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1FBQzFCLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU07UUFDL0IsZUFBZSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQzVDLFNBQVMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNoQyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNyRCxDQUFDLENBQUM7Z0JBQ0UsT0FBTyxFQUFFLFFBQVEsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNsQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUNoRTtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDUixDQUFDO0FBQ0osQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWM7SUFDNUMsT0FBTztRQUNMLElBQUksRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUs7UUFDeEQsR0FBRyxDQUFDLEtBQUssWUFBWSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzVELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaGFzaCBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9oYXNoXCI7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvbG9nXCI7XG5cbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuL2Vycm9ycy50c1wiO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiB9IGZyb20gXCIuL3R5cGVzLnRzXCI7XG5cbi8qKiBBdXRoIGxvZ2dlciB3aXRoIGEgc3RhYmxlIGNhcGFiaWxpdHktc3BlY2lmaWMgdGFnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1dGhMb2dnZXIoc2NvcGU6IHN0cmluZyk6IGxvZy5Mb2dnZXIge1xuICByZXR1cm4gbG9nLmxvZ2dlcihgYXV0aDoke3Njb3BlfWApO1xufVxuXG4vKiogU3RhYmxlIG5vbi1zZWNyZXQgaWRlbnRpZmllciBmb3IgYSBjcmVkZW50aWFsIGNhY2hlIGtleS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVkZW50aWFsSWQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaGFzaC5mbnZIYXNoKGtleSk7XG59XG5cbi8qKiBTZWNyZXQtZnJlZSB0b2tlbiBsaWZlY3ljbGUgbWV0YWRhdGEgZm9yIGRlYnVnIG91dHB1dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbk1ldGFkYXRhKHRva2VuOiBUb2tlbiB8IHVuZGVmaW5lZCwgbm93ID0gbmV3IERhdGUoKSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKCF0b2tlbikgcmV0dXJuIHsgcHJlc2VudDogZmFsc2UgfTtcbiAgY29uc3QgZXhwaXJ5TXMgPSB0b2tlbi5leHBpcnkgPyBEYXRlLnBhcnNlKHRva2VuLmV4cGlyeSkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgcHJlc2VudDogdHJ1ZSxcbiAgICB0b2tlblR5cGU6IHRva2VuLnRva2VuVHlwZSxcbiAgICBzY29wZUNvdW50OiB0b2tlbi5zY29wZXMubGVuZ3RoLFxuICAgIGhhc1JlZnJlc2hUb2tlbjogQm9vbGVhbih0b2tlbi5yZWZyZXNoVG9rZW4pLFxuICAgIGhhc0V4cGlyeTogQm9vbGVhbih0b2tlbi5leHBpcnkpLFxuICAgIC4uLihleHBpcnlNcyAhPT0gdW5kZWZpbmVkICYmIE51bWJlci5pc0Zpbml0ZShleHBpcnlNcylcbiAgICAgID8ge1xuICAgICAgICAgIGV4cGlyZWQ6IGV4cGlyeU1zIDw9IG5vdy5nZXRUaW1lKCksXG4gICAgICAgICAgZXhwaXJlc0luU2Vjb25kczogTWF0aC5yb3VuZCgoZXhwaXJ5TXMgLSBub3cuZ2V0VGltZSgpKSAvIDEwMDApLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIEZhaWx1cmUgY2xhc3NpZmljYXRpb24gd2l0aG91dCBzZXJpYWxpemluZyBlcnJvciBtZXNzYWdlcyBvciBjYXVzZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZU1ldGFkYXRhKGNhdXNlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVzZS5uYW1lIDogdHlwZW9mIGNhdXNlLFxuICAgIC4uLihjYXVzZSBpbnN0YW5jZW9mIEF1dGhFcnJvciA/IHsga2luZDogY2F1c2Uua2luZCB9IDoge30pLFxuICB9O1xufVxuIl19
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2xvZ2dpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX2xvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSw2QkFBNkIsQ0FBQztBQUNwRCxPQUFPLEtBQUssR0FBRyxNQUFNLDRCQUE0QixDQUFDO0FBRWxELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHekMseURBQXlEO0FBQ3pELE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBYTtJQUN0QyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFXO0lBQ3RDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsNkRBQTZEO0FBQzdELE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBd0IsRUFBRSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUU7SUFDdEUsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckUsT0FBTztRQUNMLE9BQU8sRUFBRSxJQUFJO1FBQ2IsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1FBQzFCLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU07UUFDL0IsZUFBZSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQzVDLFNBQVMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNoQyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNyRCxDQUFDLENBQUM7Z0JBQ0UsT0FBTyxFQUFFLFFBQVEsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNsQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUNoRTtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDUixDQUFDO0FBQ0osQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWM7SUFDNUMsT0FBTztRQUNMLElBQUksRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUs7UUFDeEQsR0FBRyxDQUFDLEtBQUssWUFBWSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzVELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaGFzaCBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9oYXNoXCI7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvbG9nXCI7XG5cbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuL19lcnJvcnMudHNcIjtcbmltcG9ydCB0eXBlIHsgVG9rZW4gfSBmcm9tIFwiLi9fdHlwZXMudHNcIjtcblxuLyoqIEF1dGggbG9nZ2VyIHdpdGggYSBzdGFibGUgY2FwYWJpbGl0eS1zcGVjaWZpYyB0YWcuICovXG5leHBvcnQgZnVuY3Rpb24gYXV0aExvZ2dlcihzY29wZTogc3RyaW5nKTogbG9nLkxvZ2dlciB7XG4gIHJldHVybiBsb2cubG9nZ2VyKGBhdXRoOiR7c2NvcGV9YCk7XG59XG5cbi8qKiBTdGFibGUgbm9uLXNlY3JldCBpZGVudGlmaWVyIGZvciBhIGNyZWRlbnRpYWwgY2FjaGUga2V5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWRlbnRpYWxJZChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNoLmZudkhhc2goa2V5KTtcbn1cblxuLyoqIFNlY3JldC1mcmVlIHRva2VuIGxpZmVjeWNsZSBtZXRhZGF0YSBmb3IgZGVidWcgb3V0cHV0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRva2VuTWV0YWRhdGEodG9rZW46IFRva2VuIHwgdW5kZWZpbmVkLCBub3cgPSBuZXcgRGF0ZSgpKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAoIXRva2VuKSByZXR1cm4geyBwcmVzZW50OiBmYWxzZSB9O1xuICBjb25zdCBleHBpcnlNcyA9IHRva2VuLmV4cGlyeSA/IERhdGUucGFyc2UodG9rZW4uZXhwaXJ5KSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBwcmVzZW50OiB0cnVlLFxuICAgIHRva2VuVHlwZTogdG9rZW4udG9rZW5UeXBlLFxuICAgIHNjb3BlQ291bnQ6IHRva2VuLnNjb3Blcy5sZW5ndGgsXG4gICAgaGFzUmVmcmVzaFRva2VuOiBCb29sZWFuKHRva2VuLnJlZnJlc2hUb2tlbiksXG4gICAgaGFzRXhwaXJ5OiBCb29sZWFuKHRva2VuLmV4cGlyeSksXG4gICAgLi4uKGV4cGlyeU1zICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyLmlzRmluaXRlKGV4cGlyeU1zKVxuICAgICAgPyB7XG4gICAgICAgICAgZXhwaXJlZDogZXhwaXJ5TXMgPD0gbm93LmdldFRpbWUoKSxcbiAgICAgICAgICBleHBpcmVzSW5TZWNvbmRzOiBNYXRoLnJvdW5kKChleHBpcnlNcyAtIG5vdy5nZXRUaW1lKCkpIC8gMTAwMCksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG4vKiogRmFpbHVyZSBjbGFzc2lmaWNhdGlvbiB3aXRob3V0IHNlcmlhbGl6aW5nIGVycm9yIG1lc3NhZ2VzIG9yIGNhdXNlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlTWV0YWRhdGEoY2F1c2U6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm5hbWUgOiB0eXBlb2YgY2F1c2UsXG4gICAgLi4uKGNhdXNlIGluc3RhbmNlb2YgQXV0aEVycm9yID8geyBraW5kOiBjYXVzZS5raW5kIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- import type { Token, TokenProvider } from "./types.ts";
1
+ import type { Token, TokenProvider } from "./_types.ts";
2
2
  /** Non-refreshing provider for a configured Databricks personal access token. */
3
3
  export declare class DatabricksPersonalAccessTokenProvider implements TokenProvider {
4
4
  private readonly accessToken;
@@ -0,0 +1,30 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3BlcnNvbmFsLWFjY2Vzcy10b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fcGVyc29uYWwtYWNjZXNzLXRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRWpDLGlGQUFpRjtBQUNqRixNQUFNLE9BQU8scUNBQXFDO0lBQ25CO0lBQTdCLFlBQTZCLFdBQW1CO1FBQW5CLGdCQUFXLEdBQVgsV0FBVyxDQUFRO0lBQUcsQ0FBQztJQUVwRCxZQUFZO1FBQ1YsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sS0FBSztRQUNYLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUN2RCxPQUFPO1lBQ0wsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFNBQVMsRUFBRSxRQUFRO1lBQ25CLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGF1dGhMb2dnZXIgfSBmcm9tIFwiLi9fbG9nZ2luZy50c1wiO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiwgVG9rZW5Qcm92aWRlciB9IGZyb20gXCIuL190eXBlcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBhdXRoTG9nZ2VyKFwicGF0XCIpO1xuXG4vKiogTm9uLXJlZnJlc2hpbmcgcHJvdmlkZXIgZm9yIGEgY29uZmlndXJlZCBEYXRhYnJpY2tzIHBlcnNvbmFsIGFjY2VzcyB0b2tlbi4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYnJpY2tzUGVyc29uYWxBY2Nlc3NUb2tlblByb3ZpZGVyIGltcGxlbWVudHMgVG9rZW5Qcm92aWRlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYWNjZXNzVG9rZW46IHN0cmluZykge31cblxuICBhdXRoZW50aWNhdGUoKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy50b2tlbigpKTtcbiAgfVxuXG4gIGxvZ2luKCk6IFByb21pc2U8VG9rZW4+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMudG9rZW4oKSk7XG4gIH1cblxuICByZWZyZXNoKCk6IFByb21pc2U8VG9rZW4+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMudG9rZW4oKSk7XG4gIH1cblxuICBjYW5BdXRoZW50aWNhdGVTaWxlbnRseSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdG9rZW4oKTogVG9rZW4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInVzaW5nIGNvbmZpZ3VyZWQgcGVyc29uYWwgYWNjZXNzIHRva2VuXCIpO1xuICAgIHJldHVybiB7XG4gICAgICBhY2Nlc3NUb2tlbjogdGhpcy5hY2Nlc3NUb2tlbixcbiAgICAgIHRva2VuVHlwZTogXCJCZWFyZXJcIixcbiAgICAgIHNjb3BlczogW10sXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,43 @@
1
+ import { AuthType, TargetKind } from "@dbx-tools/shared-auth/config";
2
+ import type { DatabricksProfileSummary } from "@dbx-tools/shared-auth/profile";
3
+ import type { DatabricksProfile } from "./_types.ts";
4
+ import { type DatabricksAuthOptions } from "./config.ts";
5
+ export declare const SETTINGS_SECTION = "__settings__";
6
+ export type Environment = Readonly<Record<string, string | undefined>>;
7
+ export type IniConfig = Map<string, Map<string, string>>;
8
+ export interface RawProfile {
9
+ host?: string;
10
+ accountId?: string;
11
+ workspaceId?: string;
12
+ clientId?: string;
13
+ clientSecret?: string;
14
+ accessToken?: string;
15
+ groupId?: string;
16
+ scopes?: string;
17
+ authType?: string;
18
+ }
19
+ /** Resolve the selected Databricks configuration path. */
20
+ export declare function resolveConfigFile(explicit?: string, environment?: Environment): string;
21
+ /** Load and cache the selected Databricks configuration. */
22
+ export declare function loadConfig(configFile?: string, refresh?: boolean, environment?: Environment): IniConfig | undefined;
23
+ /** Invalidate cached configuration after an external write. */
24
+ export declare function invalidateConfigFile(configFile?: string): void;
25
+ /** Parse Databricks INI text through the maintained `ini` package. */
26
+ export declare function parseDatabricksConfig(source: string): IniConfig;
27
+ export declare function loadRawProfile(config: IniConfig | undefined, name: string): RawProfile;
28
+ export declare function resolveProfileName(requested: string | undefined, explicit: boolean, config: IniConfig | undefined, preferUserToMachine: boolean): string;
29
+ /** Normalize Databricks hosts and require TLS outside loopback development. */
30
+ export declare function normalizeHost(value: string | undefined, profile?: string): string;
31
+ export declare function resolveAuthType(authType: AuthType | undefined, clientId: string | undefined, clientSecret: string | undefined, accessToken: string | undefined): AuthType;
32
+ /** Parse one external auth-type value into the canonical enum. */
33
+ export declare function parseAuthType(value: string | undefined): AuthType | undefined;
34
+ export declare function requestOboToken(headers?: Record<string, string>, headerName?: string): string | undefined;
35
+ export declare function inferTarget(host: string | undefined, accountId: string | undefined): TargetKind;
36
+ export declare function parseTarget(value: string): TargetKind;
37
+ export declare function missing(profile: string, field: string): never;
38
+ /** Enumerate secret-free profile metadata from cached configuration. */
39
+ export declare function listDatabricksProfiles(configFile?: string, refresh?: boolean, environment?: Environment): DatabricksProfileSummary[];
40
+ /** Resolve options, environment, request headers, and configuration into credentials. */
41
+ export declare function resolveDatabricksProfile(options: DatabricksAuthOptions, environment?: Environment): DatabricksProfile;
42
+ /** Normalize OAuth scopes for machine credentials. */
43
+ export declare function machineScopes(scopes: readonly string[]): string[];