@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.
- 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
package/lib/src/storage.js
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { authLogger, credentialId, tokenMetadata } from "./_logging.js";
|
|
2
|
-
const logger = authLogger("memory-storage");
|
|
3
|
-
/**
|
|
4
|
-
* Process-local keyed mutex used by the in-memory store.
|
|
5
|
-
*
|
|
6
|
-
* Modeled on `@dbx-tools/core`'s `withProcessLock` coordinator: one holder per
|
|
7
|
-
* key, the rest queue in arrival order, distinct keys proceed concurrently.
|
|
8
|
-
* Waiting is purely promise-based, so a waiter never blocks the event loop and,
|
|
9
|
-
* by default, waits indefinitely - a holder may legitimately run for minutes
|
|
10
|
-
* (e.g. an interactive `databricks auth login` that opens a browser). A finite
|
|
11
|
-
* `timeoutMs` is opt-in for callers that prefer to fail fast.
|
|
12
|
-
*/
|
|
13
|
-
export class MemoryLockAdapter {
|
|
14
|
-
#states = new Map();
|
|
15
|
-
#sequence = 0;
|
|
16
|
-
acquire(key, timeoutMs) {
|
|
17
|
-
const credential = credentialId(key);
|
|
18
|
-
const state = this.#states.get(key);
|
|
19
|
-
if (!state) {
|
|
20
|
-
const lease = this.#nextLease(key);
|
|
21
|
-
this.#states.set(key, { lease, queue: [] });
|
|
22
|
-
logger.debug("memory lock acquired", { credential });
|
|
23
|
-
return Promise.resolve(lease);
|
|
24
|
-
}
|
|
25
|
-
logger.debug("waiting for memory lock", { credential, timeoutMs });
|
|
26
|
-
return new Promise((resolve, reject) => {
|
|
27
|
-
let timer;
|
|
28
|
-
const waiter = {
|
|
29
|
-
resolve: (lease) => {
|
|
30
|
-
if (timer)
|
|
31
|
-
clearTimeout(timer);
|
|
32
|
-
logger.debug("memory lock acquired", { credential });
|
|
33
|
-
resolve(lease);
|
|
34
|
-
},
|
|
35
|
-
reject: (error) => {
|
|
36
|
-
if (timer)
|
|
37
|
-
clearTimeout(timer);
|
|
38
|
-
reject(error);
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
state.queue.push(waiter);
|
|
42
|
-
// A timer is created only for a finite positive budget. Omitted, Infinity,
|
|
43
|
-
// or non-positive all mean "wait forever" - no timer to leak or fire.
|
|
44
|
-
if (timeoutMs !== undefined && Number.isFinite(timeoutMs) && timeoutMs > 0) {
|
|
45
|
-
timer = setTimeout(() => {
|
|
46
|
-
const index = state.queue.indexOf(waiter);
|
|
47
|
-
if (index >= 0)
|
|
48
|
-
state.queue.splice(index, 1);
|
|
49
|
-
waiter.reject(new Error(`Timed out waiting for lock ${key}`));
|
|
50
|
-
}, timeoutMs);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
release(lease) {
|
|
55
|
-
const key = lease.split(":").slice(1).join(":");
|
|
56
|
-
logger.debug("releasing memory lock", { credential: credentialId(key) });
|
|
57
|
-
const state = this.#states.get(key);
|
|
58
|
-
// Ignore a stale release from anyone who no longer owns the key (a timed-out
|
|
59
|
-
// or superseded lease). Honoring it would revoke the lock from the holder.
|
|
60
|
-
if (!state || state.lease !== lease)
|
|
61
|
-
return Promise.resolve();
|
|
62
|
-
const next = state.queue.shift();
|
|
63
|
-
if (!next) {
|
|
64
|
-
this.#states.delete(key);
|
|
65
|
-
return Promise.resolve();
|
|
66
|
-
}
|
|
67
|
-
state.lease = this.#nextLease(key);
|
|
68
|
-
next.resolve(state.lease);
|
|
69
|
-
return Promise.resolve();
|
|
70
|
-
}
|
|
71
|
-
#nextLease(key) {
|
|
72
|
-
return `${++this.#sequence}:${key}`;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/** Process-local credential store with per-key refresh locks. */
|
|
76
|
-
export class MemoryCredentialStore {
|
|
77
|
-
locks;
|
|
78
|
-
#tokens = new Map();
|
|
79
|
-
constructor(locks = new MemoryLockAdapter()) {
|
|
80
|
-
this.locks = locks;
|
|
81
|
-
}
|
|
82
|
-
async load(key) {
|
|
83
|
-
const token = this.#tokens.get(key);
|
|
84
|
-
logger.debug("loaded memory credential", {
|
|
85
|
-
credential: credentialId(key),
|
|
86
|
-
token: tokenMetadata(token),
|
|
87
|
-
});
|
|
88
|
-
return token ? structuredClone(token) : undefined;
|
|
89
|
-
}
|
|
90
|
-
async prepareWrite() { }
|
|
91
|
-
async save(key, token) {
|
|
92
|
-
this.#tokens.set(key, structuredClone(token));
|
|
93
|
-
logger.debug("saved memory credential", {
|
|
94
|
-
credential: credentialId(key),
|
|
95
|
-
token: tokenMetadata(token),
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
async remove(key) {
|
|
99
|
-
this.#tokens.delete(key);
|
|
100
|
-
logger.debug("removed memory credential", { credential: credentialId(key) });
|
|
101
|
-
}
|
|
102
|
-
acquireLock(key, timeoutMs) {
|
|
103
|
-
return this.locks.acquire(key, timeoutMs);
|
|
104
|
-
}
|
|
105
|
-
releaseLock(lease) {
|
|
106
|
-
return this.locks.release(lease);
|
|
107
|
-
}
|
|
108
|
-
name() {
|
|
109
|
-
return "memory";
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd4RSxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQXFCNUM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUNuQixPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7SUFDdEQsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUVkLE9BQU8sQ0FBQyxHQUFXLEVBQUUsU0FBa0I7UUFDckMsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDN0MsSUFBSSxL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QUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWE7UUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSTtRQUNGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGF1dGhMb2dnZXIsIGNyZWRlbnRpYWxJZCwgdG9rZW5NZXRhZGF0YSB9IGZyb20gXCIuL19sb2dnaW5nLnRzXCI7XG5pbXBvcnQgdHlwZSB7IENyZWRlbnRpYWxTdG9yZSwgTG9ja0FkYXB0ZXIsIFRva2VuIH0gZnJvbSBcIi4vdHlwZXMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gYXV0aExvZ2dlcihcIm1lbW9yeS1zdG9yYWdlXCIpO1xuXG4vKiogT25lIHF1ZXVlZCB3YWl0ZXIgZm9yIGEgaGVsZCBrZXk6IHJlc29sdmVkIHdoZW4gcHJvbW90ZWQsIHJlamVjdGVkIG9uIHRpbWVvdXQuICovXG5pbnRlcmZhY2UgTWVtb3J5TG9ja1dhaXRlciB7XG4gIHJlc29sdmU6IChsZWFzZTogc3RyaW5nKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogdW5rbm93bikgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBBIGtleSdzIGN1cnJlbnQgb3duZXIgbGVhc2UgcGx1cyBpdHMgRklGTyBxdWV1ZSBvZiB3YWl0ZXJzLlxuICpcbiAqIE93bmVyIGFuZCBxdWV1ZSBsaXZlIGluIG9uZSBlbnRyeSBzbyB0aGUga2V5IGlzIG5ldmVyIGhhbGYtcHJlc2VudDogaXQgaXNcbiAqIGRyb3BwZWQgb25seSB3aGVuIGl0IGlzIGJvdGggdW5vd25lZCBhbmQgdW53YW50ZWQuIEEgd2FpdGVyIHRoYXQgdGltZXMgb3V0XG4gKiByZW1vdmVzIG9ubHkgaXRzZWxmIGZyb20gYHF1ZXVlYCBhbmQgbmV2ZXIgZGlzdHVyYnMgYGxlYXNlYCwgc28gYSB0aW1lZC1vdXRcbiAqIHdhaXRlciBjYW4gbm8gbG9uZ2VyIGxldCBhIGxhdGVyIGNhbGxlciBieXBhc3MgdGhlIGFjdGl2ZSBob2xkZXIuXG4gKi9cbmludGVyZmFjZSBNZW1vcnlMb2NrU3RhdGUge1xuICBsZWFzZTogc3RyaW5nO1xuICBxdWV1ZTogTWVtb3J5TG9ja1dhaXRlcltdO1xufVxuXG4vKipcbiAqIFByb2Nlc3MtbG9jYWwga2V5ZWQgbXV0ZXggdXNlZCBieSB0aGUgaW4tbWVtb3J5IHN0b3JlLlxuICpcbiAqIE1vZGVsZWQgb24gYEBkYngtdG9vbHMvY29yZWAncyBgd2l0aFByb2Nlc3NMb2NrYCBjb29yZGluYXRvcjogb25lIGhvbGRlciBwZXJcbiAqIGtleSwgdGhlIHJlc3QgcXVldWUgaW4gYXJyaXZhbCBvcmRlciwgZGlzdGluY3Qga2V5cyBwcm9jZWVkIGNvbmN1cnJlbnRseS5cbiAqIFdhaXRpbmcgaXMgcHVyZWx5IHByb21pc2UtYmFzZWQsIHNvIGEgd2FpdGVyIG5ldmVyIGJsb2NrcyB0aGUgZXZlbnQgbG9vcCBhbmQsXG4gKiBieSBkZWZhdWx0LCB3YWl0cyBpbmRlZmluaXRlbHkgLSBhIGhvbGRlciBtYXkgbGVnaXRpbWF0ZWx5IHJ1biBmb3IgbWludXRlc1xuICogKGUuZy4gYW4gaW50ZXJhY3RpdmUgYGRhdGFicmlja3MgYXV0aCBsb2dpbmAgdGhhdCBvcGVucyBhIGJyb3dzZXIpLiBBIGZpbml0ZVxuICogYHRpbWVvdXRNc2AgaXMgb3B0LWluIGZvciBjYWxsZXJzIHRoYXQgcHJlZmVyIHRvIGZhaWwgZmFzdC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1lbW9yeUxvY2tBZGFwdGVyIGltcGxlbWVudHMgTG9ja0FkYXB0ZXIge1xuICByZWFkb25seSAjc3RhdGVzID0gbmV3IE1hcDxzdHJpbmcsIE1lbW9yeUxvY2tTdGF0ZT4oKTtcbiAgI3NlcXVlbmNlID0gMDtcblxuICBhY3F1aXJlKGtleTogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBjcmVkZW50aWFsSWQoa2V5KTtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuI3N0YXRlcy5nZXQoa2V5KTtcbiAgICBpZiAoIXN0YXRlKSB7XG4gICAgICBjb25zdCBsZWFzZSA9IHRoaXMuI25leHRMZWFzZShrZXkpO1xuICAgICAgdGhpcy4jc3RhdGVzLnNldChrZXksIHsgbGVhc2UsIHF1ZXVlOiBbXSB9KTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIm1lbW9yeSBsb2NrIGFjcXVpcmVkXCIsIHsgY3JlZGVudGlhbCB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobGVhc2UpO1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXCJ3YWl0aW5nIGZvciBtZW1vcnkgbG9ja1wiLCB7IGNyZWRlbnRpYWwsIHRpbWVvdXRNcyB9KTtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgd2FpdGVyOiBNZW1vcnlMb2NrV2FpdGVyID0ge1xuICAgICAgICByZXNvbHZlOiAobGVhc2UpID0+IHtcbiAgICAgICAgICBpZiAodGltZXIpIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFwibWVtb3J5IGxvY2sgYWNxdWlyZWRcIiwgeyBjcmVkZW50aWFsIH0pO1xuICAgICAgICAgIHJlc29sdmUobGVhc2UpO1xuICAgICAgICB9LFxuICAgICAgICByZWplY3Q6IChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmICh0aW1lcikgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHN0YXRlLnF1ZXVlLnB1c2god2FpdGVyKTtcbiAgICAgIC8vIEEgdGltZXIgaXMgY3JlYXRlZCBvbmx5IGZvciBhIGZpbml0ZSBwb3NpdGl2ZSBidWRnZXQuIE9taXR0ZWQsIEluZmluaXR5LFxuICAgICAgLy8gb3Igbm9uLXBvc2l0aXZlIGFsbCBtZWFuIFwid2FpdCBmb3JldmVyXCIgLSBubyB0aW1lciB0byBsZWFrIG9yIGZpcmUuXG4gICAgICBpZiAodGltZW91dE1zICE9PSB1bmRlZmluZWQgJiYgTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRNcykgJiYgdGltZW91dE1zID4gMCkge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RhdGUucXVldWUuaW5kZXhPZih3YWl0ZXIpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSBzdGF0ZS5xdWV1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIHdhaXRlci5yZWplY3QobmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgbG9jayAke2tleX1gKSk7XG4gICAgICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZWxlYXNlKGxlYXNlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBrZXkgPSBsZWFzZS5zcGxpdChcIjpcIikuc2xpY2UoMSkuam9pbihcIjpcIik7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVsZWFzaW5nIG1lbW9yeSBsb2NrXCIsIHsgY3JlZGVudGlhbDogY3JlZGVudGlhbElkKGtleSkgfSk7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLiNzdGF0ZXMuZ2V0KGtleSk7XG4gICAgLy8gSWdub3JlIGEgc3RhbGUgcmVsZWFzZSBmcm9tIGFueW9uZSB3aG8gbm8gbG9uZ2VyIG93bnMgdGhlIGtleSAoYSB0aW1lZC1vdXRcbiAgICAvLyBvciBzdXBlcnNlZGVkIGxlYXNlKS4gSG9ub3JpbmcgaXQgd291bGQgcmV2b2tlIHRoZSBsb2NrIGZyb20gdGhlIGhvbGRlci5cbiAgICBpZiAoIXN0YXRlIHx8IHN0YXRlLmxlYXNlICE9PSBsZWFzZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGNvbnN0IG5leHQgPSBzdGF0ZS5xdWV1ZS5zaGlmdCgpO1xuICAgIGlmICghbmV4dCkge1xuICAgICAgdGhpcy4jc3RhdGVzLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBzdGF0ZS5sZWFzZSA9IHRoaXMuI25leHRMZWFzZShrZXkpO1xuICAgIG5leHQucmVzb2x2ZShzdGF0ZS5sZWFzZSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgI25leHRMZWFzZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAkeysrdGhpcy4jc2VxdWVuY2V9OiR7a2V5fWA7XG4gIH1cbn1cblxuLyoqIFByb2Nlc3MtbG9jYWwgY3JlZGVudGlhbCBzdG9yZSB3aXRoIHBlci1rZXkgcmVmcmVzaCBsb2Nrcy4gKi9cbmV4cG9ydCBjbGFzcyBNZW1vcnlDcmVkZW50aWFsU3RvcmUgaW1wbGVtZW50cyBDcmVkZW50aWFsU3RvcmUge1xuICByZWFkb25seSAjdG9rZW5zID0gbmV3IE1hcDxzdHJpbmcsIFRva2VuPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbG9ja3M6IExvY2tBZGFwdGVyID0gbmV3IE1lbW9yeUxvY2tBZGFwdGVyKCkpIHt9XG5cbiAgYXN5bmMgbG9hZChrZXk6IHN0cmluZyk6IFByb21pc2U8VG9rZW4gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuI3Rva2Vucy5nZXQoa2V5KTtcbiAgICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgbWVtb3J5IGNyZWRlbnRpYWxcIiwge1xuICAgICAgY3JlZGVudGlhbDogY3JlZGVudGlhbElkKGtleSksXG4gICAgICB0b2tlbjogdG9rZW5NZXRhZGF0YSh0b2tlbiksXG4gICAgfSk7XG4gICAgcmV0dXJuIHRva2VuID8gc3RydWN0dXJlZENsb25lKHRva2VuKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFzeW5jIHByZXBhcmVXcml0ZSgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgYXN5bmMgc2F2ZShrZXk6IHN0cmluZywgdG9rZW46IFRva2VuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy4jdG9rZW5zLnNldChrZXksIHN0cnVjdHVyZWRDbG9uZSh0b2tlbikpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNhdmVkIG1lbW9yeSBjcmVkZW50aWFsXCIsIHtcbiAgICAgIGNyZWRlbnRpYWw6IGNyZWRlbnRpYWxJZChrZXkpLFxuICAgICAgdG9rZW46IHRva2VuTWV0YWRhdGEodG9rZW4pLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy4jdG9rZW5zLmRlbGV0ZShrZXkpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlbW92ZWQgbWVtb3J5IGNyZWRlbnRpYWxcIiwgeyBjcmVkZW50aWFsOiBjcmVkZW50aWFsSWQoa2V5KSB9KTtcbiAgfVxuXG4gIGFjcXVpcmVMb2NrKGtleTogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmxvY2tzLmFjcXVpcmUoa2V5LCB0aW1lb3V0TXMpO1xuICB9XG5cbiAgcmVsZWFzZUxvY2sobGVhc2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmxvY2tzLnJlbGVhc2UobGVhc2UpO1xuICB9XG5cbiAgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm1lbW9yeVwiO1xuICB9XG59XG4iXX0=
|
package/lib/src/types.d.ts
DELETED
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
/** Authentication strategy selected from Databricks configuration. */
|
|
2
|
-
export declare enum AuthKind {
|
|
3
|
-
UserToMachine = "user-to-machine",
|
|
4
|
-
MachineToMachine = "machine-to-machine",
|
|
5
|
-
PersonalAccessToken = "personal-access-token",
|
|
6
|
-
AppServicePrincipal = "app-service-principal",
|
|
7
|
-
AppOnBehalfOf = "app-on-behalf-of"
|
|
8
|
-
}
|
|
9
|
-
/** Scope of the Databricks authentication target. */
|
|
10
|
-
export declare enum TargetKind {
|
|
11
|
-
Workspace = "workspace",
|
|
12
|
-
Account = "account",
|
|
13
|
-
Unified = "unified"
|
|
14
|
-
}
|
|
15
|
-
/** Built-in credential storage backend. */
|
|
16
|
-
export declare enum Storage {
|
|
17
|
-
Auto = "auto",
|
|
18
|
-
Memory = "memory",
|
|
19
|
-
File = "file"
|
|
20
|
-
}
|
|
21
|
-
/** File organization used by a persistent credential store. */
|
|
22
|
-
export declare enum FileLayout {
|
|
23
|
-
Single = "single",
|
|
24
|
-
PerCredential = "per-credential"
|
|
25
|
-
}
|
|
26
|
-
/** Stored OAuth credential, including renewal metadata. */
|
|
27
|
-
export interface Token {
|
|
28
|
-
accessToken: string;
|
|
29
|
-
tokenType: string;
|
|
30
|
-
refreshToken?: string;
|
|
31
|
-
expiry?: string;
|
|
32
|
-
scopes: string[];
|
|
33
|
-
}
|
|
34
|
-
/** Public credential result; deliberately excludes the refresh token. */
|
|
35
|
-
export interface AccessToken {
|
|
36
|
-
accessToken: string;
|
|
37
|
-
tokenType: string;
|
|
38
|
-
expiry?: string;
|
|
39
|
-
scopes: string[];
|
|
40
|
-
}
|
|
41
|
-
/** Shared lifecycle configuration embedded by every provider. All times in milliseconds. */
|
|
42
|
-
export interface AuthOptions {
|
|
43
|
-
refreshBufferMs: number;
|
|
44
|
-
/**
|
|
45
|
-
* Opt-in cap, in milliseconds, on waiting to acquire the per-credential
|
|
46
|
-
* refresh lock. `0` (the default) means wait indefinitely: a holder may
|
|
47
|
-
* legitimately run for minutes (an interactive login that opens a browser),
|
|
48
|
-
* and the caller owns the overall request budget. Set a positive value to
|
|
49
|
-
* fail fast instead.
|
|
50
|
-
*/
|
|
51
|
-
lockTimeoutMs: number;
|
|
52
|
-
loginTimeoutMs: number;
|
|
53
|
-
}
|
|
54
|
-
/** Record-style factory retained for straightforward Node/Python bridging. */
|
|
55
|
-
export declare const AuthOptions: {
|
|
56
|
-
create(options?: Partial<AuthOptions>): AuthOptions;
|
|
57
|
-
defaults(): Readonly<AuthOptions>;
|
|
58
|
-
};
|
|
59
|
-
/** Secret-free metadata discovered from one Databricks CLI profile. */
|
|
60
|
-
export interface DatabricksProfileSummary {
|
|
61
|
-
name: string;
|
|
62
|
-
host?: string;
|
|
63
|
-
accountId?: string;
|
|
64
|
-
workspaceId?: string;
|
|
65
|
-
target: TargetKind;
|
|
66
|
-
authKind: AuthKind;
|
|
67
|
-
}
|
|
68
|
-
/** Resolved Databricks identity and active storage backend. */
|
|
69
|
-
export interface DatabricksAuthStatus {
|
|
70
|
-
profile: string;
|
|
71
|
-
host: string;
|
|
72
|
-
storage: Storage;
|
|
73
|
-
}
|
|
74
|
-
/** Public Databricks authentication options. */
|
|
75
|
-
export interface DatabricksAuthOptions {
|
|
76
|
-
profile?: string;
|
|
77
|
-
host?: string;
|
|
78
|
-
accountId?: string;
|
|
79
|
-
workspaceId?: string;
|
|
80
|
-
configFile?: string;
|
|
81
|
-
clientId?: string;
|
|
82
|
-
clientSecret?: string;
|
|
83
|
-
accessToken?: string;
|
|
84
|
-
groupId?: string;
|
|
85
|
-
authType?: string;
|
|
86
|
-
scopes?: string[];
|
|
87
|
-
target?: string;
|
|
88
|
-
cacheDir?: string;
|
|
89
|
-
auth?: AuthOptions;
|
|
90
|
-
requestHeaders?: Record<string, string>;
|
|
91
|
-
accessTokenHeader?: string;
|
|
92
|
-
installCliInApp?: boolean;
|
|
93
|
-
preferUserToMachine: boolean;
|
|
94
|
-
}
|
|
95
|
-
/** Record-style factory retained for callers migrating from generated bindings. */
|
|
96
|
-
export declare const DatabricksAuthOptions: {
|
|
97
|
-
create(options?: Partial<DatabricksAuthOptions>): DatabricksAuthOptions;
|
|
98
|
-
defaults(): Readonly<DatabricksAuthOptions>;
|
|
99
|
-
};
|
|
100
|
-
/** Resolved profile with secrets retained only for provider construction. */
|
|
101
|
-
export interface DatabricksProfile extends DatabricksProfileSummary {
|
|
102
|
-
host: string;
|
|
103
|
-
authType?: string;
|
|
104
|
-
clientId: string;
|
|
105
|
-
groupId?: string;
|
|
106
|
-
scopes: string[];
|
|
107
|
-
clientSecret?: string;
|
|
108
|
-
accessToken?: string;
|
|
109
|
-
cacheKey: string;
|
|
110
|
-
principal: string;
|
|
111
|
-
}
|
|
112
|
-
/** Cross-language lease adapter; implementations may use files, databases, or FFI. */
|
|
113
|
-
export interface LockAdapter {
|
|
114
|
-
/** Acquire the key's lease. Omit `timeoutMs` (or pass `0`) to wait indefinitely. */
|
|
115
|
-
acquire(key: string, timeoutMs?: number): Promise<string>;
|
|
116
|
-
release(lease: string): Promise<void>;
|
|
117
|
-
}
|
|
118
|
-
/** Cross-language credential persistence contract. */
|
|
119
|
-
export interface CredentialStore {
|
|
120
|
-
load(key: string): Promise<Token | undefined>;
|
|
121
|
-
prepareWrite(): Promise<void>;
|
|
122
|
-
save(key: string, token: Token): Promise<void>;
|
|
123
|
-
remove(key: string): Promise<void>;
|
|
124
|
-
acquireLock(key: string, timeoutMs?: number): Promise<string>;
|
|
125
|
-
releaseLock(lease: string): Promise<void>;
|
|
126
|
-
name(): string;
|
|
127
|
-
}
|
|
128
|
-
/** Provider-specific token acquisition. */
|
|
129
|
-
export interface TokenProvider {
|
|
130
|
-
authenticate(timeoutMs: number): Promise<Token>;
|
|
131
|
-
login(timeoutMs: number): Promise<Token>;
|
|
132
|
-
refresh(token: Token): Promise<Token>;
|
|
133
|
-
canAuthenticateSilently(): boolean;
|
|
134
|
-
}
|
|
135
|
-
/** Stable facade shared by Node, the CLI, and generated language bindings. */
|
|
136
|
-
export interface AuthClient {
|
|
137
|
-
challenge(): Promise<void>;
|
|
138
|
-
token(login?: boolean): Promise<AccessToken>;
|
|
139
|
-
authenticate(login?: boolean): Promise<Record<string, string>>;
|
|
140
|
-
authorizationHeaderForUrl(requestUrl: string, login?: boolean): Promise<string | undefined>;
|
|
141
|
-
requestHeadersForUrl(requestUrl: string, login?: boolean): Promise<Record<string, string>>;
|
|
142
|
-
forceRefreshToken(login?: boolean): Promise<AccessToken>;
|
|
143
|
-
refreshRejectedToken(staleAccessToken: string, login?: boolean): Promise<AccessToken>;
|
|
144
|
-
logout(): Promise<void>;
|
|
145
|
-
status(): DatabricksAuthStatus;
|
|
146
|
-
principal(): string;
|
|
147
|
-
workspaceId(): string | undefined;
|
|
148
|
-
authKind(): AuthKind;
|
|
149
|
-
profile(name?: string): DatabricksProfileSummary;
|
|
150
|
-
listProfiles(refresh?: boolean): DatabricksProfileSummary[];
|
|
151
|
-
}
|
|
152
|
-
/** Public OAuth client used by Databricks CLI-compatible user authentication. */
|
|
153
|
-
export declare const DEFAULT_CLIENT_ID = "databricks-cli";
|
|
154
|
-
/** Default Databricks profile configuration path. */
|
|
155
|
-
export declare const DEFAULT_CONFIG_FILE = "~/.databrickscfg";
|
|
156
|
-
/** Default Databricks account console origin. */
|
|
157
|
-
export declare const DEFAULT_ACCOUNTS_HOST = "https://accounts.cloud.databricks.com";
|
|
158
|
-
/** Canonical request header carrying a bearer access token. */
|
|
159
|
-
export declare const DEFAULT_ACCESS_TOKEN_HEADER = "authorization";
|
|
160
|
-
/** Canonical request header carrying the resolved Databricks workspace ID. */
|
|
161
|
-
export declare const WORKSPACE_ID_HEADER = "x-databricks-workspace-id";
|
|
162
|
-
/** Authentication type for Databricks App on-behalf-of request credentials. */
|
|
163
|
-
export declare const AUTH_TYPE_APP_OBO = "app_obo";
|
|
164
|
-
/** Authentication type for Databricks App service-principal credentials. */
|
|
165
|
-
export declare const AUTH_TYPE_APP_SP = "app_sp";
|
package/lib/src/types.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/** Authentication strategy selected from Databricks configuration. */
|
|
2
|
-
export var AuthKind;
|
|
3
|
-
(function (AuthKind) {
|
|
4
|
-
AuthKind["UserToMachine"] = "user-to-machine";
|
|
5
|
-
AuthKind["MachineToMachine"] = "machine-to-machine";
|
|
6
|
-
AuthKind["PersonalAccessToken"] = "personal-access-token";
|
|
7
|
-
AuthKind["AppServicePrincipal"] = "app-service-principal";
|
|
8
|
-
AuthKind["AppOnBehalfOf"] = "app-on-behalf-of";
|
|
9
|
-
})(AuthKind || (AuthKind = {}));
|
|
10
|
-
/** Scope of the Databricks authentication target. */
|
|
11
|
-
export var TargetKind;
|
|
12
|
-
(function (TargetKind) {
|
|
13
|
-
TargetKind["Workspace"] = "workspace";
|
|
14
|
-
TargetKind["Account"] = "account";
|
|
15
|
-
TargetKind["Unified"] = "unified";
|
|
16
|
-
})(TargetKind || (TargetKind = {}));
|
|
17
|
-
/** Built-in credential storage backend. */
|
|
18
|
-
export var Storage;
|
|
19
|
-
(function (Storage) {
|
|
20
|
-
Storage["Auto"] = "auto";
|
|
21
|
-
Storage["Memory"] = "memory";
|
|
22
|
-
Storage["File"] = "file";
|
|
23
|
-
})(Storage || (Storage = {}));
|
|
24
|
-
/** File organization used by a persistent credential store. */
|
|
25
|
-
export var FileLayout;
|
|
26
|
-
(function (FileLayout) {
|
|
27
|
-
FileLayout["Single"] = "single";
|
|
28
|
-
FileLayout["PerCredential"] = "per-credential";
|
|
29
|
-
})(FileLayout || (FileLayout = {}));
|
|
30
|
-
const AUTH_DEFAULTS = {
|
|
31
|
-
refreshBufferMs: 300_000,
|
|
32
|
-
lockTimeoutMs: 0,
|
|
33
|
-
loginTimeoutMs: 900_000,
|
|
34
|
-
};
|
|
35
|
-
/** Record-style factory retained for straightforward Node/Python bridging. */
|
|
36
|
-
export const AuthOptions = {
|
|
37
|
-
create(options = {}) {
|
|
38
|
-
return { ...AUTH_DEFAULTS, ...options };
|
|
39
|
-
},
|
|
40
|
-
defaults() {
|
|
41
|
-
return Object.freeze({ ...AUTH_DEFAULTS });
|
|
42
|
-
},
|
|
43
|
-
};
|
|
44
|
-
/** Record-style factory retained for callers migrating from generated bindings. */
|
|
45
|
-
export const DatabricksAuthOptions = {
|
|
46
|
-
create(options = {}) {
|
|
47
|
-
return { preferUserToMachine: true, ...options };
|
|
48
|
-
},
|
|
49
|
-
defaults() {
|
|
50
|
-
return Object.freeze({ preferUserToMachine: true });
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
/** Public OAuth client used by Databricks CLI-compatible user authentication. */
|
|
54
|
-
export const DEFAULT_CLIENT_ID = "databricks-cli";
|
|
55
|
-
/** Default Databricks profile configuration path. */
|
|
56
|
-
export const DEFAULT_CONFIG_FILE = "~/.databrickscfg";
|
|
57
|
-
/** Default Databricks account console origin. */
|
|
58
|
-
export const DEFAULT_ACCOUNTS_HOST = "https://accounts.cloud.databricks.com";
|
|
59
|
-
/** Canonical request header carrying a bearer access token. */
|
|
60
|
-
export const DEFAULT_ACCESS_TOKEN_HEADER = "authorization";
|
|
61
|
-
/** Canonical request header carrying the resolved Databricks workspace ID. */
|
|
62
|
-
export const WORKSPACE_ID_HEADER = "x-databricks-workspace-id";
|
|
63
|
-
/** Authentication type for Databricks App on-behalf-of request credentials. */
|
|
64
|
-
export const AUTH_TYPE_APP_OBO = "app_obo";
|
|
65
|
-
/** Authentication type for Databricks App service-principal credentials. */
|
|
66
|
-
export const AUTH_TYPE_APP_SP = "app_sp";
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0VBQXNFO0FBQ3RFLE1BQU0sQ0FBTixJQUFZLFFBTVg7QUFORCxXQUFZLFFBQVE7SUFDbEIsNkNBQWlDLENBQUE7SUFDakMsbURBQXVDLENBQUE7SUFDdkMseURBQTZDLENBQUE7SUFDN0MseURBQTZDLENBQUE7SUFDN0MsOENBQWtDLENBQUE7QUFDcEMsQ0FBQyxFQU5XLFFBQVEsS0FBUixRQUFRLFFBTW5CO0FBRUQscURBQXFEO0FBQ3JELE1BQU0sQ0FBTixJQUFZLFVBSVg7QUFKRCxXQUFZLFVBQVU7SUFDcEIscUNBQXVCLENBQUE7SUFDdkIsaUNBQW1CLENBQUE7SUFDbkIsaUNBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUpXLFVBQVUsS0FBVixVQUFVLFFBSXJCO0FBRUQsMkNBQTJDO0FBQzNDLE1BQU0sQ0FBTixJQUFZLE9BSVg7QUFKRCxXQUFZLE9BQU87SUFDakIsd0JBQWEsQ0FBQTtJQUNiLDRCQUFpQixDQUFBO0lBQ2pCLHdCQUFhLENBQUE7QUFDZixDQUFDLEVBSlcsT0FBTyxLQUFQLE9BQU8sUUFJbEI7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxDQUFOLElBQVksVUFHWDtBQUhELFdBQVksVUFBVTtJQUNwQiwrQkFBaUIsQ0FBQTtJQUNqQiw4Q0FBZ0MsQ0FBQTtBQUNsQyxDQUFDLEVBSFcsVUFBVSxLQUFWLFVBQVUsUUFHckI7QUFpQ0QsTUFBTSxhQUFhLEdBQWdCO0lBQ2pDLGVBQWUsRUFBRSxPQUFPO0lBQ3hCLGFBQWEsRUFBRSxDQUFDO0lBQ2hCLGNBQWMsRUFBRSxPQUFPO0NBQ3hCLENBQUM7QUFFRiw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHO0lBQ3pCLE1BQU0sQ0FBQyxVQUFnQyxFQUFFO1FBQ3ZDLE9BQU8sRUFBRSxHQUFHLGFBQWEsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFDRCxRQUFRO1FBQ04sT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRixDQUFDO0FBeUNGLG1GQUFtRjtBQUNuRixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRztJQUNuQyxNQUFNLENBQUMsVUFBMEMsRUFBRTtRQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUNELFFBQVE7UUFDTixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDRixDQUFDO0FBMkRGLGlGQUFpRjtBQUNqRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUNsRCxxREFBcUQ7QUFDckQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsa0JBQWtCLENBQUM7QUFDdEQsaURBQWlEO0FBQ2pELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHVDQUF1QyxDQUFDO0FBQzdFLCtEQUErRDtBQUMvRCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxlQUFlLENBQUM7QUFDM0QsOEVBQThFO0FBQzlFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLDJCQUEyQixDQUFDO0FBQy9ELCtFQUErRTtBQUMvRSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUM7QUFDM0MsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBBdXRoZW50aWNhdGlvbiBzdHJhdGVneSBzZWxlY3RlZCBmcm9tIERhdGFicmlja3MgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBlbnVtIEF1dGhLaW5kIHtcbiAgVXNlclRvTWFjaGluZSA9IFwidXNlci10by1tYWNoaW5lXCIsXG4gIE1hY2hpbmVUb01hY2hpbmUgPSBcIm1hY2hpbmUtdG8tbWFjaGluZVwiLFxuICBQZXJzb25hbEFjY2Vzc1Rva2VuID0gXCJwZXJzb25hbC1hY2Nlc3MtdG9rZW5cIixcbiAgQXBwU2VydmljZVByaW5jaXBhbCA9IFwiYXBwLXNlcnZpY2UtcHJpbmNpcGFsXCIsXG4gIEFwcE9uQmVoYWxmT2YgPSBcImFwcC1vbi1iZWhhbGYtb2ZcIixcbn1cblxuLyoqIFNjb3BlIG9mIHRoZSBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIHRhcmdldC4gKi9cbmV4cG9ydCBlbnVtIFRhcmdldEtpbmQge1xuICBXb3Jrc3BhY2UgPSBcIndvcmtzcGFjZVwiLFxuICBBY2NvdW50ID0gXCJhY2NvdW50XCIsXG4gIFVuaWZpZWQgPSBcInVuaWZpZWRcIixcbn1cblxuLyoqIEJ1aWx0LWluIGNyZWRlbnRpYWwgc3RvcmFnZSBiYWNrZW5kLiAqL1xuZXhwb3J0IGVudW0gU3RvcmFnZSB7XG4gIEF1dG8gPSBcImF1dG9cIixcbiAgTWVtb3J5ID0gXCJtZW1vcnlcIixcbiAgRmlsZSA9IFwiZmlsZVwiLFxufVxuXG4vKiogRmlsZSBvcmdhbml6YXRpb24gdXNlZCBieSBhIHBlcnNpc3RlbnQgY3JlZGVudGlhbCBzdG9yZS4gKi9cbmV4cG9ydCBlbnVtIEZpbGVMYXlvdXQge1xuICBTaW5nbGUgPSBcInNpbmdsZVwiLFxuICBQZXJDcmVkZW50aWFsID0gXCJwZXItY3JlZGVudGlhbFwiLFxufVxuXG4vKiogU3RvcmVkIE9BdXRoIGNyZWRlbnRpYWwsIGluY2x1ZGluZyByZW5ld2FsIG1ldGFkYXRhLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb2tlbiB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIHRva2VuVHlwZTogc3RyaW5nO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmc7XG4gIGV4cGlyeT86IHN0cmluZztcbiAgc2NvcGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqIFB1YmxpYyBjcmVkZW50aWFsIHJlc3VsdDsgZGVsaWJlcmF0ZWx5IGV4Y2x1ZGVzIHRoZSByZWZyZXNoIHRva2VuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NUb2tlbiB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIHRva2VuVHlwZTogc3RyaW5nO1xuICBleHBpcnk/OiBzdHJpbmc7XG4gIHNjb3Blczogc3RyaW5nW107XG59XG5cbi8qKiBTaGFyZWQgbGlmZWN5Y2xlIGNvbmZpZ3VyYXRpb24gZW1iZWRkZWQgYnkgZXZlcnkgcHJvdmlkZXIuIEFsbCB0aW1lcyBpbiBtaWxsaXNlY29uZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhPcHRpb25zIHtcbiAgcmVmcmVzaEJ1ZmZlck1zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcHQtaW4gY2FwLCBpbiBtaWxsaXNlY29uZHMsIG9uIHdhaXRpbmcgdG8gYWNxdWlyZSB0aGUgcGVyLWNyZWRlbnRpYWxcbiAgICogcmVmcmVzaCBsb2NrLiBgMGAgKHRoZSBkZWZhdWx0KSBtZWFucyB3YWl0IGluZGVmaW5pdGVseTogYSBob2xkZXIgbWF5XG4gICAqIGxlZ2l0aW1hdGVseSBydW4gZm9yIG1pbnV0ZXMgKGFuIGludGVyYWN0aXZlIGxvZ2luIHRoYXQgb3BlbnMgYSBicm93c2VyKSxcbiAgICogYW5kIHRoZSBjYWxsZXIgb3ducyB0aGUgb3ZlcmFsbCByZXF1ZXN0IGJ1ZGdldC4gU2V0IGEgcG9zaXRpdmUgdmFsdWUgdG9cbiAgICogZmFpbCBmYXN0IGluc3RlYWQuXG4gICAqL1xuICBsb2NrVGltZW91dE1zOiBudW1iZXI7XG4gIGxvZ2luVGltZW91dE1zOiBudW1iZXI7XG59XG5cbmNvbnN0IEFVVEhfREVGQVVMVFM6IEF1dGhPcHRpb25zID0ge1xuICByZWZyZXNoQnVmZmVyTXM6IDMwMF8wMDAsXG4gIGxvY2tUaW1lb3V0TXM6IDAsXG4gIGxvZ2luVGltZW91dE1zOiA5MDBfMDAwLFxufTtcblxuLyoqIFJlY29yZC1zdHlsZSBmYWN0b3J5IHJldGFpbmVkIGZvciBzdHJhaWdodGZvcndhcmQgTm9kZS9QeXRob24gYnJpZGdpbmcuICovXG5leHBvcnQgY29uc3QgQXV0aE9wdGlvbnMgPSB7XG4gIGNyZWF0ZShvcHRpb25zOiBQYXJ0aWFsPEF1dGhPcHRpb25zPiA9IHt9KTogQXV0aE9wdGlvbnMge1xuICAgIHJldHVybiB7IC4uLkFVVEhfREVGQVVMVFMsIC4uLm9wdGlvbnMgfTtcbiAgfSxcbiAgZGVmYXVsdHMoKTogUmVhZG9ubHk8QXV0aE9wdGlvbnM+IHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IC4uLkFVVEhfREVGQVVMVFMgfSk7XG4gIH0sXG59O1xuXG4vKiogU2VjcmV0LWZyZWUgbWV0YWRhdGEgZGlzY292ZXJlZCBmcm9tIG9uZSBEYXRhYnJpY2tzIENMSSBwcm9maWxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnkge1xuICBuYW1lOiBzdHJpbmc7XG4gIGhvc3Q/OiBzdHJpbmc7XG4gIGFjY291bnRJZD86IHN0cmluZztcbiAgd29ya3NwYWNlSWQ/OiBzdHJpbmc7XG4gIHRhcmdldDogVGFyZ2V0S2luZDtcbiAgYXV0aEtpbmQ6IEF1dGhLaW5kO1xufVxuXG4vKiogUmVzb2x2ZWQgRGF0YWJyaWNrcyBpZGVudGl0eSBhbmQgYWN0aXZlIHN0b3JhZ2UgYmFja2VuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc0F1dGhTdGF0dXMge1xuICBwcm9maWxlOiBzdHJpbmc7XG4gIGhvc3Q6IHN0cmluZztcbiAgc3RvcmFnZTogU3RvcmFnZTtcbn1cblxuLyoqIFB1YmxpYyBEYXRhYnJpY2tzIGF1dGhlbnRpY2F0aW9uIG9wdGlvbnMuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NBdXRoT3B0aW9ucyB7XG4gIHByb2ZpbGU/OiBzdHJpbmc7XG4gIGhvc3Q/OiBzdHJpbmc7XG4gIGFjY291bnRJZD86IHN0cmluZztcbiAgd29ya3NwYWNlSWQ/OiBzdHJpbmc7XG4gIGNvbmZpZ0ZpbGU/OiBzdHJpbmc7XG4gIGNsaWVudElkPzogc3RyaW5nO1xuICBjbGllbnRTZWNyZXQ/OiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICBncm91cElkPzogc3RyaW5nO1xuICBhdXRoVHlwZT86IHN0cmluZztcbiAgc2NvcGVzPzogc3RyaW5nW107XG4gIHRhcmdldD86IHN0cmluZztcbiAgY2FjaGVEaXI/OiBzdHJpbmc7XG4gIGF1dGg/OiBBdXRoT3B0aW9ucztcbiAgcmVxdWVzdEhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBhY2Nlc3NUb2tlbkhlYWRlcj86IHN0cmluZztcbiAgaW5zdGFsbENsaUluQXBwPzogYm9vbGVhbjtcbiAgcHJlZmVyVXNlclRvTWFjaGluZTogYm9vbGVhbjtcbn1cblxuLyoqIFJlY29yZC1zdHlsZSBmYWN0b3J5IHJldGFpbmVkIGZvciBjYWxsZXJzIG1pZ3JhdGluZyBmcm9tIGdlbmVyYXRlZCBiaW5kaW5ncy4gKi9cbmV4cG9ydCBjb25zdCBEYXRhYnJpY2tzQXV0aE9wdGlvbnMgPSB7XG4gIGNyZWF0ZShvcHRpb25zOiBQYXJ0aWFsPERhdGFicmlja3NBdXRoT3B0aW9ucz4gPSB7fSk6IERhdGFicmlja3NBdXRoT3B0aW9ucyB7XG4gICAgcmV0dXJuIHsgcHJlZmVyVXNlclRvTWFjaGluZTogdHJ1ZSwgLi4ub3B0aW9ucyB9O1xuICB9LFxuICBkZWZhdWx0cygpOiBSZWFkb25seTxEYXRhYnJpY2tzQXV0aE9wdGlvbnM+IHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IHByZWZlclVzZXJUb01hY2hpbmU6IHRydWUgfSk7XG4gIH0sXG59O1xuXG4vKiogUmVzb2x2ZWQgcHJvZmlsZSB3aXRoIHNlY3JldHMgcmV0YWluZWQgb25seSBmb3IgcHJvdmlkZXIgY29uc3RydWN0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzUHJvZmlsZSBleHRlbmRzIERhdGFicmlja3NQcm9maWxlU3VtbWFyeSB7XG4gIGhvc3Q6IHN0cmluZztcbiAgYXV0aFR5cGU/OiBzdHJpbmc7XG4gIGNsaWVudElkOiBzdHJpbmc7XG4gIGdyb3VwSWQ/OiBzdHJpbmc7XG4gIHNjb3Blczogc3RyaW5nW107XG4gIGNsaWVudFNlY3JldD86IHN0cmluZztcbiAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gIGNhY2hlS2V5OiBzdHJpbmc7XG4gIHByaW5jaXBhbDogc3RyaW5nO1xufVxuXG4vKiogQ3Jvc3MtbGFuZ3VhZ2UgbGVhc2UgYWRhcHRlcjsgaW1wbGVtZW50YXRpb25zIG1heSB1c2UgZmlsZXMsIGRhdGFiYXNlcywgb3IgRkZJLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NrQWRhcHRlciB7XG4gIC8qKiBBY3F1aXJlIHRoZSBrZXkncyBsZWFzZS4gT21pdCBgdGltZW91dE1zYCAob3IgcGFzcyBgMGApIHRvIHdhaXQgaW5kZWZpbml0ZWx5LiAqL1xuICBhY3F1aXJlKGtleTogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz47XG4gIHJlbGVhc2UobGVhc2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKiBDcm9zcy1sYW5ndWFnZSBjcmVkZW50aWFsIHBlcnNpc3RlbmNlIGNvbnRyYWN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkZW50aWFsU3RvcmUge1xuICBsb2FkKGtleTogc3RyaW5nKTogUHJvbWlzZTxUb2tlbiB8IHVuZGVmaW5lZD47XG4gIHByZXBhcmVXcml0ZSgpOiBQcm9taXNlPHZvaWQ+O1xuICBzYXZlKGtleTogc3RyaW5nLCB0b2tlbjogVG9rZW4pOiBQcm9taXNlPHZvaWQ+O1xuICByZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBhY3F1aXJlTG9jayhrZXk6IHN0cmluZywgdGltZW91dE1zPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+O1xuICByZWxlYXNlTG9jayhsZWFzZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgbmFtZSgpOiBzdHJpbmc7XG59XG5cbi8qKiBQcm92aWRlci1zcGVjaWZpYyB0b2tlbiBhY3F1aXNpdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5Qcm92aWRlciB7XG4gIGF1dGhlbnRpY2F0ZSh0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8VG9rZW4+O1xuICBsb2dpbih0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8VG9rZW4+O1xuICByZWZyZXNoKHRva2VuOiBUb2tlbik6IFByb21pc2U8VG9rZW4+O1xuICBjYW5BdXRoZW50aWNhdGVTaWxlbnRseSgpOiBib29sZWFuO1xufVxuXG4vKiogU3RhYmxlIGZhY2FkZSBzaGFyZWQgYnkgTm9kZSwgdGhlIENMSSwgYW5kIGdlbmVyYXRlZCBsYW5ndWFnZSBiaW5kaW5ncy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aENsaWVudCB7XG4gIGNoYWxsZW5nZSgpOiBQcm9taXNlPHZvaWQ+O1xuICB0b2tlbihsb2dpbj86IGJvb2xlYW4pOiBQcm9taXNlPEFjY2Vzc1Rva2VuPjtcbiAgYXV0aGVudGljYXRlKGxvZ2luPzogYm9vbGVhbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIGF1dGhvcml6YXRpb25IZWFkZXJGb3JVcmwocmVxdWVzdFVybDogc3RyaW5nLCBsb2dpbj86IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIHJlcXVlc3RIZWFkZXJzRm9yVXJsKHJlcXVlc3RVcmw6IHN0cmluZywgbG9naW4/OiBib29sZWFuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgZm9yY2VSZWZyZXNoVG9rZW4obG9naW4/OiBib29sZWFuKTogUHJvbWlzZTxBY2Nlc3NUb2tlbj47XG4gIHJlZnJlc2hSZWplY3RlZFRva2VuKHN0YWxlQWNjZXNzVG9rZW46IHN0cmluZywgbG9naW4/OiBib29sZWFuKTogUHJvbWlzZTxBY2Nlc3NUb2tlbj47XG4gIGxvZ291dCgpOiBQcm9taXNlPHZvaWQ+O1xuICBzdGF0dXMoKTogRGF0YWJyaWNrc0F1dGhTdGF0dXM7XG4gIHByaW5jaXBhbCgpOiBzdHJpbmc7XG4gIHdvcmtzcGFjZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgYXV0aEtpbmQoKTogQXV0aEtpbmQ7XG4gIHByb2ZpbGUobmFtZT86IHN0cmluZyk6IERhdGFicmlja3NQcm9maWxlU3VtbWFyeTtcbiAgbGlzdFByb2ZpbGVzKHJlZnJlc2g/OiBib29sZWFuKTogRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5W107XG59XG5cbi8qKiBQdWJsaWMgT0F1dGggY2xpZW50IHVzZWQgYnkgRGF0YWJyaWNrcyBDTEktY29tcGF0aWJsZSB1c2VyIGF1dGhlbnRpY2F0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ0xJRU5UX0lEID0gXCJkYXRhYnJpY2tzLWNsaVwiO1xuLyoqIERlZmF1bHQgRGF0YWJyaWNrcyBwcm9maWxlIGNvbmZpZ3VyYXRpb24gcGF0aC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTkZJR19GSUxFID0gXCJ+Ly5kYXRhYnJpY2tzY2ZnXCI7XG4vKiogRGVmYXVsdCBEYXRhYnJpY2tzIGFjY291bnQgY29uc29sZSBvcmlnaW4uICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BQ0NPVU5UU19IT1NUID0gXCJodHRwczovL2FjY291bnRzLmNsb3VkLmRhdGFicmlja3MuY29tXCI7XG4vKiogQ2Fub25pY2FsIHJlcXVlc3QgaGVhZGVyIGNhcnJ5aW5nIGEgYmVhcmVyIGFjY2VzcyB0b2tlbi4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FDQ0VTU19UT0tFTl9IRUFERVIgPSBcImF1dGhvcml6YXRpb25cIjtcbi8qKiBDYW5vbmljYWwgcmVxdWVzdCBoZWFkZXIgY2FycnlpbmcgdGhlIHJlc29sdmVkIERhdGFicmlja3Mgd29ya3NwYWNlIElELiAqL1xuZXhwb3J0IGNvbnN0IFdPUktTUEFDRV9JRF9IRUFERVIgPSBcIngtZGF0YWJyaWNrcy13b3Jrc3BhY2UtaWRcIjtcbi8qKiBBdXRoZW50aWNhdGlvbiB0eXBlIGZvciBEYXRhYnJpY2tzIEFwcCBvbi1iZWhhbGYtb2YgcmVxdWVzdCBjcmVkZW50aWFscy4gKi9cbmV4cG9ydCBjb25zdCBBVVRIX1RZUEVfQVBQX09CTyA9IFwiYXBwX29ib1wiO1xuLyoqIEF1dGhlbnRpY2F0aW9uIHR5cGUgZm9yIERhdGFicmlja3MgQXBwIHNlcnZpY2UtcHJpbmNpcGFsIGNyZWRlbnRpYWxzLiAqL1xuZXhwb3J0IGNvbnN0IEFVVEhfVFlQRV9BUFBfU1AgPSBcImFwcF9zcFwiO1xuIl19
|
package/src/_profile-core.ts
DELETED
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
import { parse as parseIni } from "ini";
|
|
2
|
-
|
|
3
|
-
import { authLogger } from "./_logging.ts";
|
|
4
|
-
import { AuthError } from "./errors.ts";
|
|
5
|
-
import {
|
|
6
|
-
AUTH_TYPE_APP_OBO,
|
|
7
|
-
AUTH_TYPE_APP_SP,
|
|
8
|
-
AuthKind,
|
|
9
|
-
DEFAULT_ACCESS_TOKEN_HEADER,
|
|
10
|
-
TargetKind,
|
|
11
|
-
} from "./types.ts";
|
|
12
|
-
|
|
13
|
-
const logger = authLogger("profile-selection");
|
|
14
|
-
|
|
15
|
-
export const SETTINGS_SECTION = "__settings__";
|
|
16
|
-
|
|
17
|
-
export type Environment = Readonly<Record<string, string | undefined>>;
|
|
18
|
-
export type IniConfig = Map<string, Map<string, string>>;
|
|
19
|
-
|
|
20
|
-
export interface RawProfile {
|
|
21
|
-
host?: string;
|
|
22
|
-
accountId?: string;
|
|
23
|
-
workspaceId?: string;
|
|
24
|
-
clientId?: string;
|
|
25
|
-
clientSecret?: string;
|
|
26
|
-
accessToken?: string;
|
|
27
|
-
groupId?: string;
|
|
28
|
-
scopes?: string;
|
|
29
|
-
authType?: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** Parse Databricks INI text through the maintained `ini` package. */
|
|
33
|
-
export function parseDatabricksConfig(source: string): IniConfig {
|
|
34
|
-
let parsed: Record<string, unknown>;
|
|
35
|
-
try {
|
|
36
|
-
parsed = parseIni(source) as Record<string, unknown>;
|
|
37
|
-
} catch (cause) {
|
|
38
|
-
throw new AuthError("config", "Databricks configuration is not valid INI", { cause });
|
|
39
|
-
}
|
|
40
|
-
const config: IniConfig = new Map();
|
|
41
|
-
for (const [name, value] of Object.entries(parsed)) {
|
|
42
|
-
if (!name.trim() || !isRecord(value))
|
|
43
|
-
throw new AuthError("config", "Databricks configuration values must belong to a profile");
|
|
44
|
-
const section = new Map<string, string>();
|
|
45
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
46
|
-
if (entry === undefined || entry === null) continue;
|
|
47
|
-
section.set(key.trim().toLowerCase(), String(entry).trim());
|
|
48
|
-
}
|
|
49
|
-
config.set(name.trim(), section);
|
|
50
|
-
}
|
|
51
|
-
return config;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function loadRawProfile(config: IniConfig | undefined, name: string): RawProfile {
|
|
55
|
-
const section = config?.get(name);
|
|
56
|
-
return {
|
|
57
|
-
host: section?.get("host"),
|
|
58
|
-
accountId: section?.get("account_id"),
|
|
59
|
-
workspaceId: section?.get("workspace_id"),
|
|
60
|
-
clientId: section?.get("client_id"),
|
|
61
|
-
clientSecret: section?.get("client_secret"),
|
|
62
|
-
accessToken: section?.get("token"),
|
|
63
|
-
groupId: section?.get("group_id"),
|
|
64
|
-
scopes: section?.get("scopes"),
|
|
65
|
-
authType: nonempty(section?.get("auth_type"))?.toLowerCase(),
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export function resolveProfileName(
|
|
70
|
-
requested: string | undefined,
|
|
71
|
-
explicit: boolean,
|
|
72
|
-
config: IniConfig | undefined,
|
|
73
|
-
preferUserToMachine: boolean,
|
|
74
|
-
): string {
|
|
75
|
-
let selected = requested;
|
|
76
|
-
let source = requested ? "requested" : undefined;
|
|
77
|
-
if (!selected) {
|
|
78
|
-
selected = nonempty(config?.get(SETTINGS_SECTION)?.get("default_profile"));
|
|
79
|
-
if (selected) source = "settings-default";
|
|
80
|
-
}
|
|
81
|
-
if (!selected && config?.has("DEFAULT")) {
|
|
82
|
-
selected = "DEFAULT";
|
|
83
|
-
source = "default-section";
|
|
84
|
-
}
|
|
85
|
-
if (!selected) {
|
|
86
|
-
const profiles = [...(config?.keys() ?? [])].filter((name) => name !== SETTINGS_SECTION);
|
|
87
|
-
if (profiles.length === 1) {
|
|
88
|
-
selected = profiles[0];
|
|
89
|
-
source = "sole-profile";
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
if (!selected) {
|
|
93
|
-
selected = "DEFAULT";
|
|
94
|
-
source = "fallback";
|
|
95
|
-
}
|
|
96
|
-
if (selected === SETTINGS_SECTION)
|
|
97
|
-
throw new AuthError("config", `${SETTINGS_SECTION} is reserved`);
|
|
98
|
-
if (explicit || !preferUserToMachine || !config) {
|
|
99
|
-
logger.debug("selected Databricks profile", {
|
|
100
|
-
profile: selected,
|
|
101
|
-
source,
|
|
102
|
-
explicit,
|
|
103
|
-
preferUserToMachine,
|
|
104
|
-
});
|
|
105
|
-
return selected;
|
|
106
|
-
}
|
|
107
|
-
const current = loadRawProfile(config, selected);
|
|
108
|
-
if (!isM2mProfile(current) || !current.host) {
|
|
109
|
-
logger.debug("selected Databricks profile", {
|
|
110
|
-
profile: selected,
|
|
111
|
-
source,
|
|
112
|
-
explicit,
|
|
113
|
-
preferUserToMachine,
|
|
114
|
-
});
|
|
115
|
-
return selected;
|
|
116
|
-
}
|
|
117
|
-
const matches = [...config.keys()].filter((name) => {
|
|
118
|
-
if (name === selected || name === SETTINGS_SECTION) return false;
|
|
119
|
-
const candidate = loadRawProfile(config, name);
|
|
120
|
-
return candidate.authType === "databricks-cli" && sameTarget(current, candidate);
|
|
121
|
-
});
|
|
122
|
-
const preferred = matches.length === 1 ? matches[0]! : selected;
|
|
123
|
-
logger.debug("selected Databricks profile", {
|
|
124
|
-
profile: preferred,
|
|
125
|
-
source: preferred === selected ? source : "matching-cli-profile",
|
|
126
|
-
originalProfile: preferred === selected ? undefined : selected,
|
|
127
|
-
explicit,
|
|
128
|
-
preferUserToMachine,
|
|
129
|
-
matchingCliProfiles: matches.length,
|
|
130
|
-
});
|
|
131
|
-
return preferred;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/** Normalize Databricks hosts and require TLS outside loopback development. */
|
|
135
|
-
export function normalizeHost(value: string | undefined, profile = "DEFAULT"): string {
|
|
136
|
-
const selected = nonempty(value);
|
|
137
|
-
if (!selected) throw new AuthError("config", `Profile ${profile} has no host`);
|
|
138
|
-
const withScheme = /^https?:\/\//i.test(selected) ? selected : `https://${selected}`;
|
|
139
|
-
let url: URL;
|
|
140
|
-
try {
|
|
141
|
-
url = new URL(withScheme);
|
|
142
|
-
} catch (cause) {
|
|
143
|
-
throw new AuthError("config", `Profile ${profile} has an invalid host`, { cause });
|
|
144
|
-
}
|
|
145
|
-
if (url.protocol !== "https:" && url.hostname !== "localhost" && url.hostname !== "127.0.0.1") {
|
|
146
|
-
throw new AuthError("config", "Databricks host must use HTTPS");
|
|
147
|
-
}
|
|
148
|
-
return url.toString().replace(/\/$/, "");
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export function resolveAuthKind(
|
|
152
|
-
authType: string | undefined,
|
|
153
|
-
clientId: string | undefined,
|
|
154
|
-
clientSecret: string | undefined,
|
|
155
|
-
accessToken: string | undefined,
|
|
156
|
-
): AuthKind {
|
|
157
|
-
switch (authType) {
|
|
158
|
-
case "databricks-cli":
|
|
159
|
-
case "oauth-u2m":
|
|
160
|
-
return AuthKind.UserToMachine;
|
|
161
|
-
case "oauth-m2m":
|
|
162
|
-
if (!clientId || !clientSecret)
|
|
163
|
-
throw new AuthError("config", "oauth-m2m requires client_id and client_secret");
|
|
164
|
-
return AuthKind.MachineToMachine;
|
|
165
|
-
case "pat":
|
|
166
|
-
if (!accessToken) throw new AuthError("config", "pat requires token");
|
|
167
|
-
return AuthKind.PersonalAccessToken;
|
|
168
|
-
case AUTH_TYPE_APP_OBO:
|
|
169
|
-
case "app-obo":
|
|
170
|
-
if (!accessToken)
|
|
171
|
-
throw new AuthError("config", "app_obo requires the configured access token header");
|
|
172
|
-
return AuthKind.AppOnBehalfOf;
|
|
173
|
-
case AUTH_TYPE_APP_SP:
|
|
174
|
-
case "app-sp":
|
|
175
|
-
if (!clientId || !clientSecret)
|
|
176
|
-
throw new AuthError("config", "app_sp requires client id and secret");
|
|
177
|
-
return AuthKind.AppServicePrincipal;
|
|
178
|
-
case undefined:
|
|
179
|
-
if (clientId && clientSecret) return AuthKind.MachineToMachine;
|
|
180
|
-
if (clientSecret) throw new AuthError("config", "oauth-m2m client_secret requires client_id");
|
|
181
|
-
return accessToken ? AuthKind.PersonalAccessToken : AuthKind.UserToMachine;
|
|
182
|
-
default:
|
|
183
|
-
throw new AuthError("config", `Authentication type ${authType} is not supported`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
export function requestOboToken(
|
|
188
|
-
headers?: Record<string, string>,
|
|
189
|
-
headerName = DEFAULT_ACCESS_TOKEN_HEADER,
|
|
190
|
-
): string | undefined {
|
|
191
|
-
const entry = Object.entries(headers ?? {}).find(
|
|
192
|
-
([name]) => name.toLowerCase() === headerName.toLowerCase(),
|
|
193
|
-
);
|
|
194
|
-
const value = nonempty(entry?.[1]);
|
|
195
|
-
if (!value) return undefined;
|
|
196
|
-
if (headerName.toLowerCase() !== DEFAULT_ACCESS_TOKEN_HEADER) return value;
|
|
197
|
-
const [scheme, ...parts] = value.split(/\s+/);
|
|
198
|
-
return scheme?.toLowerCase() === "bearer" ? nonempty(parts.join(" ")) : undefined;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
export function inferTarget(host: string | undefined, accountId: string | undefined): TargetKind {
|
|
202
|
-
if (accountId && host) {
|
|
203
|
-
try {
|
|
204
|
-
if (new URL(normalizeHost(host)).hostname === "accounts.cloud.databricks.com")
|
|
205
|
-
return TargetKind.Account;
|
|
206
|
-
} catch {}
|
|
207
|
-
}
|
|
208
|
-
return TargetKind.Workspace;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
export function parseTarget(value: string): TargetKind {
|
|
212
|
-
switch (value.trim().toLowerCase()) {
|
|
213
|
-
case TargetKind.Workspace:
|
|
214
|
-
return TargetKind.Workspace;
|
|
215
|
-
case TargetKind.Account:
|
|
216
|
-
return TargetKind.Account;
|
|
217
|
-
case TargetKind.Unified:
|
|
218
|
-
return TargetKind.Unified;
|
|
219
|
-
default:
|
|
220
|
-
throw new AuthError("config", "Target must be workspace, account, or unified");
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
export function cleanList(values: readonly string[]): string[] {
|
|
225
|
-
return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
export function nonempty(value: string | undefined): string | undefined {
|
|
229
|
-
const selected = value?.trim();
|
|
230
|
-
return selected ? selected : undefined;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
export function missing(profile: string, field: string): never {
|
|
234
|
-
throw new AuthError("config", `Profile ${profile} requires ${field}`);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
function sameTarget(left: RawProfile, right: RawProfile): boolean {
|
|
238
|
-
try {
|
|
239
|
-
if (normalizeHost(left.host) !== normalizeHost(right.host)) return false;
|
|
240
|
-
} catch {
|
|
241
|
-
return false;
|
|
242
|
-
}
|
|
243
|
-
return (
|
|
244
|
-
(!left.accountId || left.accountId === right.accountId) &&
|
|
245
|
-
(!left.workspaceId || left.workspaceId === right.workspaceId)
|
|
246
|
-
);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
function isM2mProfile(profile: RawProfile): boolean {
|
|
250
|
-
return (
|
|
251
|
-
profile.authType === "oauth-m2m" ||
|
|
252
|
-
(!profile.authType && Boolean(profile.clientId && profile.clientSecret))
|
|
253
|
-
);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
257
|
-
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
258
|
-
}
|