@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.
- package/README.md +49 -97
- package/index.ts +8 -26
- package/lib/index.d.ts +8 -26
- package/lib/index.js +6 -22
- package/lib/src/{databricks-cli.d.ts → _databricks-cli.d.ts} +3 -7
- package/lib/src/_databricks-cli.js +172 -0
- package/lib/src/_errors.d.ts +5 -0
- package/lib/src/_errors.js +10 -0
- package/lib/src/{lifecycle.d.ts → _lifecycle.d.ts} +5 -5
- package/lib/src/_lifecycle.js +214 -0
- package/lib/src/_logging.d.ts +1 -1
- package/lib/src/_logging.js +2 -2
- package/lib/src/{personal-access-token.d.ts → _personal-access-token.d.ts} +1 -1
- package/lib/src/_personal-access-token.js +30 -0
- package/lib/src/_profile-config.d.ts +43 -0
- package/lib/src/_profile-config.js +443 -0
- package/lib/src/{service-principal.d.ts → _service-principal.d.ts} +1 -1
- package/lib/src/_service-principal.js +69 -0
- package/lib/src/{storage.d.ts → _storage.d.ts} +2 -13
- package/lib/src/_storage.js +94 -0
- package/lib/src/_types.d.ts +40 -0
- package/lib/src/_types.js +2 -0
- package/lib/src/client.d.ts +30 -0
- package/lib/src/client.js +223 -0
- package/lib/src/config.d.ts +36 -0
- package/lib/src/config.js +15 -0
- package/lib/src/profile.d.ts +11 -0
- package/lib/src/profile.js +21 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +34 -10
- package/src/{databricks-cli.ts → _databricks-cli.ts} +20 -109
- package/src/_errors.ts +11 -0
- package/src/{lifecycle.ts → _lifecycle.ts} +12 -40
- package/src/_logging.ts +2 -2
- package/src/{personal-access-token.ts → _personal-access-token.ts} +1 -1
- package/src/_profile-config.ts +545 -0
- package/src/{service-principal.ts → _service-principal.ts} +2 -2
- package/src/{storage.ts → _storage.ts} +2 -31
- package/src/_types.ts +45 -0
- package/src/client.ts +291 -0
- package/src/config.ts +44 -0
- package/src/profile.ts +33 -0
- package/lib/exports.d.ts +0 -2
- package/lib/exports.js +0 -3
- package/lib/src/_profile-core.d.ts +0 -28
- package/lib/src/_profile-core.js +0 -216
- package/lib/src/_profile.d.ts +0 -15
- package/lib/src/_profile.js +0 -236
- package/lib/src/databricks-auth.d.ts +0 -11
- package/lib/src/databricks-auth.js +0 -314
- package/lib/src/databricks-cli.js +0 -239
- package/lib/src/errors.d.ts +0 -7
- package/lib/src/errors.js +0 -14
- package/lib/src/file-storage.d.ts +0 -20
- package/lib/src/file-storage.js +0 -207
- package/lib/src/generated/databricks-cli-assets.json +0 -33
- package/lib/src/http-client.d.ts +0 -23
- package/lib/src/http-client.js +0 -116
- package/lib/src/lifecycle.js +0 -233
- package/lib/src/personal-access-token.js +0 -30
- package/lib/src/service-principal.js +0 -69
- package/lib/src/storage.js +0 -112
- package/lib/src/types.d.ts +0 -165
- package/lib/src/types.js +0 -67
- package/src/_profile-core.ts +0 -258
- package/src/_profile.ts +0 -319
- package/src/databricks-auth.ts +0 -416
- package/src/errors.ts +0 -16
- package/src/file-storage.ts +0 -230
- package/src/generated/databricks-cli-assets.json +0 -33
- package/src/http-client.ts +0 -147
- 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==
|
package/lib/src/_logging.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as log from "@dbx-tools/shared-core/log";
|
|
2
|
-
import type { Token } from "./
|
|
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. */
|
package/lib/src/_logging.js
CHANGED
|
@@ -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 "./
|
|
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,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2xvZ2dpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX2xvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSw2QkFBNkIsQ0FBQztBQUNwRCxPQUFPLEtBQUssR0FBRyxNQUFNLDRCQUE0QixDQUFDO0FBRWxELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHekMseURBQXlEO0FBQ3pELE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBYTtJQUN0QyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFXO0lBQ3RDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsNkRBQTZEO0FBQzdELE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBd0IsRUFBRSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUU7SUFDdEUsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckUsT0FBTztRQUNMLE9BQU8sRUFBRSxJQUFJO1FBQ2IsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1FBQzFCLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU07UUFDL0IsZUFBZSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQzVDLFNBQVMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNoQyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNyRCxDQUFDLENBQUM7Z0JBQ0UsT0FBTyxFQUFFLFFBQVEsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNsQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUNoRTtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDUixDQUFDO0FBQ0osQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWM7SUFDNUMsT0FBTztRQUNMLElBQUksRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUs7UUFDeEQsR0FBRyxDQUFDLEtBQUssWUFBWSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzVELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaGFzaCBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9oYXNoXCI7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvbG9nXCI7XG5cbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuL19lcnJvcnMudHNcIjtcbmltcG9ydCB0eXBlIHsgVG9rZW4gfSBmcm9tIFwiLi9fdHlwZXMudHNcIjtcblxuLyoqIEF1dGggbG9nZ2VyIHdpdGggYSBzdGFibGUgY2FwYWJpbGl0eS1zcGVjaWZpYyB0YWcuICovXG5leHBvcnQgZnVuY3Rpb24gYXV0aExvZ2dlcihzY29wZTogc3RyaW5nKTogbG9nLkxvZ2dlciB7XG4gIHJldHVybiBsb2cubG9nZ2VyKGBhdXRoOiR7c2NvcGV9YCk7XG59XG5cbi8qKiBTdGFibGUgbm9uLXNlY3JldCBpZGVudGlmaWVyIGZvciBhIGNyZWRlbnRpYWwgY2FjaGUga2V5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWRlbnRpYWxJZChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNoLmZudkhhc2goa2V5KTtcbn1cblxuLyoqIFNlY3JldC1mcmVlIHRva2VuIGxpZmVjeWNsZSBtZXRhZGF0YSBmb3IgZGVidWcgb3V0cHV0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRva2VuTWV0YWRhdGEodG9rZW46IFRva2VuIHwgdW5kZWZpbmVkLCBub3cgPSBuZXcgRGF0ZSgpKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAoIXRva2VuKSByZXR1cm4geyBwcmVzZW50OiBmYWxzZSB9O1xuICBjb25zdCBleHBpcnlNcyA9IHRva2VuLmV4cGlyeSA/IERhdGUucGFyc2UodG9rZW4uZXhwaXJ5KSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBwcmVzZW50OiB0cnVlLFxuICAgIHRva2VuVHlwZTogdG9rZW4udG9rZW5UeXBlLFxuICAgIHNjb3BlQ291bnQ6IHRva2VuLnNjb3Blcy5sZW5ndGgsXG4gICAgaGFzUmVmcmVzaFRva2VuOiBCb29sZWFuKHRva2VuLnJlZnJlc2hUb2tlbiksXG4gICAgaGFzRXhwaXJ5OiBCb29sZWFuKHRva2VuLmV4cGlyeSksXG4gICAgLi4uKGV4cGlyeU1zICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyLmlzRmluaXRlKGV4cGlyeU1zKVxuICAgICAgPyB7XG4gICAgICAgICAgZXhwaXJlZDogZXhwaXJ5TXMgPD0gbm93LmdldFRpbWUoKSxcbiAgICAgICAgICBleHBpcmVzSW5TZWNvbmRzOiBNYXRoLnJvdW5kKChleHBpcnlNcyAtIG5vdy5nZXRUaW1lKCkpIC8gMTAwMCksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG4vKiogRmFpbHVyZSBjbGFzc2lmaWNhdGlvbiB3aXRob3V0IHNlcmlhbGl6aW5nIGVycm9yIG1lc3NhZ2VzIG9yIGNhdXNlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlTWV0YWRhdGEoY2F1c2U6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm5hbWUgOiB0eXBlb2YgY2F1c2UsXG4gICAgLi4uKGNhdXNlIGluc3RhbmNlb2YgQXV0aEVycm9yID8geyBraW5kOiBjYXVzZS5raW5kIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Token, TokenProvider } from "./
|
|
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[];
|