@dbx-tools/auth 0.9.32 → 0.9.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +49 -97
  2. package/index.ts +8 -26
  3. package/lib/index.d.ts +8 -26
  4. package/lib/index.js +6 -22
  5. package/lib/src/{databricks-cli.d.ts → _databricks-cli.d.ts} +3 -7
  6. package/lib/src/_databricks-cli.js +172 -0
  7. package/lib/src/_errors.d.ts +5 -0
  8. package/lib/src/_errors.js +10 -0
  9. package/lib/src/{lifecycle.d.ts → _lifecycle.d.ts} +5 -5
  10. package/lib/src/_lifecycle.js +214 -0
  11. package/lib/src/_logging.d.ts +1 -1
  12. package/lib/src/_logging.js +2 -2
  13. package/lib/src/{personal-access-token.d.ts → _personal-access-token.d.ts} +1 -1
  14. package/lib/src/_personal-access-token.js +30 -0
  15. package/lib/src/_profile-config.d.ts +43 -0
  16. package/lib/src/_profile-config.js +443 -0
  17. package/lib/src/{service-principal.d.ts → _service-principal.d.ts} +1 -1
  18. package/lib/src/_service-principal.js +69 -0
  19. package/lib/src/{storage.d.ts → _storage.d.ts} +2 -13
  20. package/lib/src/_storage.js +94 -0
  21. package/lib/src/_types.d.ts +40 -0
  22. package/lib/src/_types.js +2 -0
  23. package/lib/src/client.d.ts +30 -0
  24. package/lib/src/client.js +223 -0
  25. package/lib/src/config.d.ts +36 -0
  26. package/lib/src/config.js +15 -0
  27. package/lib/src/profile.d.ts +11 -0
  28. package/lib/src/profile.js +21 -0
  29. package/lib/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +34 -10
  31. package/src/{databricks-cli.ts → _databricks-cli.ts} +20 -109
  32. package/src/_errors.ts +11 -0
  33. package/src/{lifecycle.ts → _lifecycle.ts} +12 -40
  34. package/src/_logging.ts +2 -2
  35. package/src/{personal-access-token.ts → _personal-access-token.ts} +1 -1
  36. package/src/_profile-config.ts +545 -0
  37. package/src/{service-principal.ts → _service-principal.ts} +2 -2
  38. package/src/{storage.ts → _storage.ts} +2 -31
  39. package/src/_types.ts +45 -0
  40. package/src/client.ts +291 -0
  41. package/src/config.ts +44 -0
  42. package/src/profile.ts +33 -0
  43. package/lib/exports.d.ts +0 -2
  44. package/lib/exports.js +0 -3
  45. package/lib/src/_profile-core.d.ts +0 -28
  46. package/lib/src/_profile-core.js +0 -216
  47. package/lib/src/_profile.d.ts +0 -15
  48. package/lib/src/_profile.js +0 -236
  49. package/lib/src/databricks-auth.d.ts +0 -11
  50. package/lib/src/databricks-auth.js +0 -314
  51. package/lib/src/databricks-cli.js +0 -239
  52. package/lib/src/errors.d.ts +0 -7
  53. package/lib/src/errors.js +0 -14
  54. package/lib/src/file-storage.d.ts +0 -20
  55. package/lib/src/file-storage.js +0 -207
  56. package/lib/src/generated/databricks-cli-assets.json +0 -33
  57. package/lib/src/http-client.d.ts +0 -23
  58. package/lib/src/http-client.js +0 -116
  59. package/lib/src/lifecycle.js +0 -233
  60. package/lib/src/personal-access-token.js +0 -30
  61. package/lib/src/service-principal.js +0 -69
  62. package/lib/src/storage.js +0 -112
  63. package/lib/src/types.d.ts +0 -165
  64. package/lib/src/types.js +0 -67
  65. package/src/_profile-core.ts +0 -258
  66. package/src/_profile.ts +0 -319
  67. package/src/databricks-auth.ts +0 -416
  68. package/src/errors.ts +0 -16
  69. package/src/file-storage.ts +0 -230
  70. package/src/generated/databricks-cli-assets.json +0 -33
  71. package/src/http-client.ts +0 -147
  72. package/src/types.ts +0 -196
@@ -1,239 +0,0 @@
1
- import { homedir } from "node:os";
2
- import { join } from "node:path";
3
- import * as bin from "@dbx-tools/core/bin";
4
- import * as exec from "@dbx-tools/core/exec";
5
- import * as stringUtils from "@dbx-tools/shared-core/string-utils";
6
- import cliAssets from "./generated/databricks-cli-assets.json" with { type: "json" };
7
- import { authLogger, failureMetadata, tokenMetadata } from "./_logging.js";
8
- import { AuthError } from "./errors.js";
9
- const resolutionCache = new Map();
10
- const logger = authLogger("cli");
11
- /** Resolve a compatible Databricks CLI, installing the pinned build asset when needed. */
12
- export function resolveDatabricksCli(environment = process.env, options = {}) {
13
- const candidate = stringValue(environment.DATABRICKS_CLI_PATH) ?? "databricks";
14
- const key = `${candidate}\0${homedir()}\0${process.platform}\0${process.arch}\0${options.install !== false}`;
15
- const cached = resolutionCache.get(key);
16
- if (cached) {
17
- logger.debug("reused Databricks CLI resolution", {
18
- candidate,
19
- install: options.install !== false,
20
- });
21
- return cached;
22
- }
23
- logger.debug("resolving Databricks CLI", {
24
- candidate,
25
- install: options.install !== false,
26
- platform: process.platform,
27
- arch: process.arch,
28
- minimumVersion: cliAssets.minimumVersion,
29
- });
30
- const resolved = resolveDatabricksCliUncached(candidate, options.install !== false).catch((error) => {
31
- resolutionCache.delete(key);
32
- throw error;
33
- });
34
- resolutionCache.set(key, resolved);
35
- return resolved;
36
- }
37
- /** Clear cached CLI resolution, primarily after installation or environment changes. */
38
- export function resetDatabricksCliResolution() {
39
- resolutionCache.clear();
40
- logger.debug("cleared Databricks CLI resolution cache");
41
- }
42
- async function resolveDatabricksCliUncached(candidate, install) {
43
- if (await compatibleDatabricksCli(candidate)) {
44
- logger.debug("selected installed Databricks CLI", { executable: candidate });
45
- return candidate;
46
- }
47
- const managed = managedExecutable();
48
- if (await compatibleDatabricksCli(managed)) {
49
- logger.debug("selected managed Databricks CLI", { executable: managed });
50
- return managed;
51
- }
52
- if (!install) {
53
- logger.debug("compatible Databricks CLI unavailable and installation disabled");
54
- return undefined;
55
- }
56
- const asset = platformAsset();
57
- if (!asset) {
58
- logger.debug("no managed Databricks CLI asset for platform", {
59
- platform: process.platform,
60
- arch: process.arch,
61
- });
62
- return undefined;
63
- }
64
- const root = join(homedir(), ".databricks");
65
- const binDir = join(root, "bin");
66
- const executable = managedExecutableName();
67
- const installed = await bin.ensure("databricks", asset, {
68
- autoUnpackage: true,
69
- destination: { root, binDir, path: join(binDir, executable) },
70
- minVersion: cliAssets.minimumVersion,
71
- selector: ({ source }) => join(source, executable),
72
- versionParser: (output) => {
73
- const version = bin.parseVersion(output);
74
- return version === cliAssets.version ? version : undefined;
75
- },
76
- });
77
- logger.debug("ensured managed Databricks CLI", {
78
- executable: installed.path,
79
- version: cliAssets.version,
80
- });
81
- return installed.path;
82
- }
83
- function managedExecutable() {
84
- return join(homedir(), ".databricks", "bin", managedExecutableName());
85
- }
86
- function managedExecutableName() {
87
- return process.platform === "win32" ? "databricks.exe" : "databricks";
88
- }
89
- async function compatibleDatabricksCli(executable) {
90
- try {
91
- const result = await runProcess(executable, ["--version"], {}, 10_000);
92
- if (result.exitCode !== 0) {
93
- logger.debug("Databricks CLI version probe failed", {
94
- executable,
95
- exitCode: result.exitCode,
96
- });
97
- return false;
98
- }
99
- const version = bin.parseVersion(result);
100
- const compatible = version !== undefined && bin.isVersionAtLeast(version, cliAssets.minimumVersion);
101
- logger.debug("probed Databricks CLI version", {
102
- executable,
103
- version: version ?? "unknown",
104
- minimumVersion: cliAssets.minimumVersion,
105
- compatible,
106
- });
107
- return compatible;
108
- }
109
- catch (cause) {
110
- logger.debug("Databricks CLI version probe unavailable", {
111
- executable,
112
- error: failureMetadata(cause),
113
- });
114
- return false;
115
- }
116
- }
117
- function platformAsset() {
118
- const key = `${process.platform}-${process.arch}`;
119
- return cliAssets.assets[key];
120
- }
121
- /** Run interactive Databricks CLI login for one profile. */
122
- export async function databricksCliLogin(profile, timeoutMs, executable = process.env.DATABRICKS_CLI_PATH ?? "databricks", environment = {}) {
123
- logger.debug("starting Databricks CLI login", { profile, executable, timeoutMs });
124
- const result = await runProcess(executable, ["auth", "login", "--profile", profile, "--timeout", `${Math.ceil(timeoutMs / 1000)}s`], environment);
125
- if (result.exitCode !== 0)
126
- throw new AuthError("cli", result.stderr || `databricks auth login exited ${result.exitCode}`);
127
- logger.debug("Databricks CLI login completed", { profile, executable });
128
- }
129
- /** Request one profile token from the Databricks CLI. */
130
- export async function databricksCliToken(profile, forceRefresh = false, executable = process.env.DATABRICKS_CLI_PATH ?? "databricks", environment = {}) {
131
- logger.debug("requesting Databricks CLI token", { profile, executable, forceRefresh });
132
- const args = ["auth", "token", "--profile", profile, "--output", "json"];
133
- if (forceRefresh)
134
- args.push("--force-refresh");
135
- const result = await runProcess(executable, args, environment);
136
- if (result.exitCode !== 0)
137
- throw new AuthError("cli", result.stderr || `databricks auth token exited ${result.exitCode}`);
138
- let value;
139
- try {
140
- value = JSON.parse(result.stdout ?? "");
141
- }
142
- catch (cause) {
143
- throw new AuthError("cli", "Databricks CLI token output was not JSON", { cause });
144
- }
145
- const accessToken = stringValue(value.access_token ?? value.accessToken);
146
- if (!accessToken)
147
- throw new AuthError("cli", "Databricks CLI token output had no access token");
148
- const token = {
149
- accessToken,
150
- tokenType: stringValue(value.token_type ?? value.tokenType) ?? "Bearer",
151
- ...(stringValue(value.refresh_token ?? value.refreshToken)
152
- ? { refreshToken: stringValue(value.refresh_token ?? value.refreshToken) }
153
- : {}),
154
- ...(stringValue(value.expiry ?? value.expires_at)
155
- ? { expiry: stringValue(value.expiry ?? value.expires_at) }
156
- : {}),
157
- scopes: Array.isArray(value.scopes)
158
- ? value.scopes.filter((scope) => typeof scope === "string")
159
- : [],
160
- };
161
- logger.debug("received Databricks CLI token", {
162
- profile,
163
- forceRefresh,
164
- token: tokenMetadata(token),
165
- });
166
- return token;
167
- }
168
- async function runProcess(command, args, environment, timeoutMs) {
169
- const controller = timeoutMs === undefined ? undefined : new AbortController();
170
- const timeout = controller ? setTimeout(() => controller.abort(), timeoutMs) : undefined;
171
- try {
172
- return await exec.spawn(command, args, {
173
- env: { ...process.env, ...environment },
174
- stdin: "ignore",
175
- stdout: "capture",
176
- stderr: "capture",
177
- signal: controller?.signal,
178
- });
179
- }
180
- finally {
181
- if (timeout)
182
- clearTimeout(timeout);
183
- }
184
- }
185
- /** Provider that lazily delegates U2M credentials to the Databricks CLI. */
186
- export class DatabricksCliProvider {
187
- profile;
188
- executableOrResolver;
189
- environment;
190
- resolution;
191
- constructor(profile, executableOrResolver = () => resolveDatabricksCli(), environment = {}) {
192
- this.profile = profile;
193
- this.executableOrResolver = executableOrResolver;
194
- this.environment = environment;
195
- }
196
- async authenticate(_timeoutMs) {
197
- return databricksCliToken(this.profile, false, await this.resolveExecutable(), this.environment);
198
- }
199
- async login(timeoutMs) {
200
- const executable = await this.resolveExecutable();
201
- await databricksCliLogin(this.profile, timeoutMs, executable, this.environment);
202
- return databricksCliToken(this.profile, false, executable, this.environment);
203
- }
204
- async refresh(_token) {
205
- return databricksCliToken(this.profile, true, await this.resolveExecutable(), this.environment);
206
- }
207
- canAuthenticateSilently() {
208
- return true;
209
- }
210
- resolveExecutable() {
211
- if (typeof this.executableOrResolver === "string") {
212
- logger.debug("using configured Databricks CLI executable", {
213
- profile: this.profile,
214
- executable: this.executableOrResolver,
215
- });
216
- return Promise.resolve(this.executableOrResolver);
217
- }
218
- if (this.resolution) {
219
- logger.debug("reused provider CLI resolution", { profile: this.profile });
220
- return this.resolution;
221
- }
222
- logger.debug("resolving provider CLI lazily", { profile: this.profile });
223
- this.resolution = this.executableOrResolver()
224
- .then((executable) => {
225
- if (!executable)
226
- throw new AuthError("cli", "Databricks CLI is unavailable on this platform");
227
- return executable;
228
- })
229
- .catch((error) => {
230
- this.resolution = undefined;
231
- throw error;
232
- });
233
- return this.resolution;
234
- }
235
- }
236
- function stringValue(value) {
237
- return stringUtils.trimToNull(value) ?? undefined;
238
- }
239
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1jbGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJyaWNrcy1jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEtBQUssV0FBVyxNQUFNLHFDQUFxQyxDQUFDO0FBRW5FLE9BQU8sU0FBUyxNQUFNLHdDQUF3QyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3hDLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUF1QyxDQUFDO0FBQ3ZFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQWVqQywwRkFBMEY7QUFDMUYsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxjQUE0RCxPQUFPLENBQUMsR0FBRyxFQUN2RSxVQUEwQyxFQUFFO0lBRTVDLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxZQUFZLENBQUM7SUFDL0UsTUFBTSxHQUFHLEdBQUcsR0FBRyxTQUFTLEtBQUssT0FBTyxFQUFFLEtBQUssT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7SUFDN0csTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJ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QUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0ICogYXMgYmluIGZyb20gXCJAZGJ4LXRvb2xzL2NvcmUvYmluXCI7XG5pbXBvcnQgKiBhcyBleGVjIGZyb20gXCJAZGJ4LXRvb2xzL2NvcmUvZXhlY1wiO1xuaW1wb3J0ICogYXMgc3RyaW5nVXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvc3RyaW5nLXV0aWxzXCI7XG5cbmltcG9ydCBjbGlBc3NldHMgZnJvbSBcIi4vZ2VuZXJhdGVkL2RhdGFicmlja3MtY2xpLWFzc2V0cy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgeyBhdXRoTG9nZ2VyLCBmYWlsdXJlTWV0YWRhdGEsIHRva2VuTWV0YWRhdGEgfSBmcm9tIFwiLi9fbG9nZ2luZy50c1wiO1xuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFRva2VuLCBUb2tlblByb3ZpZGVyIH0gZnJvbSBcIi4vdHlwZXMudHNcIjtcblxuY29uc3QgcmVzb2x1dGlvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPj4oKTtcbmNvbnN0IGxvZ2dlciA9IGF1dGhMb2dnZXIoXCJjbGlcIik7XG5cbmludGVyZmFjZSBEYXRhYnJpY2tzQ2xpQXNzZXQge1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbiAgcmVhZG9ubHkgc2hhMjU2OiBzdHJpbmc7XG59XG5cbi8qKiBEZWZlcnJlZCBEYXRhYnJpY2tzIENMSSBsb29rdXAgdXNlZCBieSBVMk0gdG9rZW4gYWNxdWlzaXRpb24uICovXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzQ2xpUmVzb2x2ZXIgPSAoKSA9PiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbi8qKiBDb250cm9scyB3aGV0aGVyIENMSSByZXNvbHV0aW9uIG1heSBpbnN0YWxsIHRoZSBwaW5uZWQgbWFuYWdlZCBleGVjdXRhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzQ2xpUmVzb2x1dGlvbk9wdGlvbnMge1xuICBpbnN0YWxsPzogYm9vbGVhbjtcbn1cblxuLyoqIFJlc29sdmUgYSBjb21wYXRpYmxlIERhdGFicmlja3MgQ0xJLCBpbnN0YWxsaW5nIHRoZSBwaW5uZWQgYnVpbGQgYXNzZXQgd2hlbiBuZWVkZWQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NDbGkoXG4gIGVudmlyb25tZW50OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PiA9IHByb2Nlc3MuZW52LFxuICBvcHRpb25zOiBEYXRhYnJpY2tzQ2xpUmVzb2x1dGlvbk9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHN0cmluZ1ZhbHVlKGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJX1BBVEgpID8/IFwiZGF0YWJyaWNrc1wiO1xuICBjb25zdCBrZXkgPSBgJHtjYW5kaWRhdGV9XFwwJHtob21lZGlyKCl9XFwwJHtwcm9jZXNzLnBsYXRmb3JtfVxcMCR7cHJvY2Vzcy5hcmNofVxcMCR7b3B0aW9ucy5pbnN0YWxsICE9PSBmYWxzZX1gO1xuICBjb25zdCBjYWNoZWQgPSByZXNvbHV0aW9uQ2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXVzZWQgRGF0YWJyaWNrcyBDTEkgcmVzb2x1dGlvblwiLCB7XG4gICAgICBjYW5kaWRhdGUsXG4gICAgICBpbnN0YWxsOiBvcHRpb25zLmluc3RhbGwgIT09IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2aW5nIERhdGFicmlja3MgQ0xJXCIsIHtcbiAgICBjYW5kaWRhdGUsXG4gICAgaW5zdGFsbDogb3B0aW9ucy5pbnN0YWxsICE9PSBmYWxzZSxcbiAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgICBhcmNoOiBwcm9jZXNzLmFyY2gsXG4gICAgbWluaW11bVZlcnNpb246IGNsaUFzc2V0cy5taW5pbXVtVmVyc2lvbixcbiAgfSk7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZURhdGFicmlja3NDbGlVbmNhY2hlZChjYW5kaWRhdGUsIG9wdGlvbnMuaW5zdGFsbCAhPT0gZmFsc2UpLmNhdGNoKFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgcmVzb2x1dGlvbkNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSxcbiAgKTtcbiAgcmVzb2x1dGlvbkNhY2hlLnNldChrZXksIHJlc29sdmVkKTtcbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG4vKiogQ2xlYXIgY2FjaGVkIENMSSByZXNvbHV0aW9uLCBwcmltYXJpbHkgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9yIGVudmlyb25tZW50IGNoYW5nZXMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXREYXRhYnJpY2tzQ2xpUmVzb2x1dGlvbigpOiB2b2lkIHtcbiAgcmVzb2x1dGlvbkNhY2hlLmNsZWFyKCk7XG4gIGxvZ2dlci5kZWJ1ZyhcImNsZWFyZWQgRGF0YWJyaWNrcyBDTEkgcmVzb2x1dGlvbiBjYWNoZVwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NDbGlVbmNhY2hlZChcbiAgY2FuZGlkYXRlOiBzdHJpbmcsXG4gIGluc3RhbGw6IGJvb2xlYW4sXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoYXdhaXQgY29tcGF0aWJsZURhdGFicmlja3NDbGkoY2FuZGlkYXRlKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIGluc3RhbGxlZCBEYXRhYnJpY2tzIENMSVwiLCB7IGV4ZWN1dGFibGU6IGNhbmRpZGF0ZSB9KTtcbiAgICByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG4gIGNvbnN0IG1hbmFnZWQgPSBtYW5hZ2VkRXhlY3V0YWJsZSgpO1xuICBpZiAoYXdhaXQgY29tcGF0aWJsZURhdGFicmlja3NDbGkobWFuYWdlZCkpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBtYW5hZ2VkIERhdGFicmlja3MgQ0xJXCIsIHsgZXhlY3V0YWJsZTogbWFuYWdlZCB9KTtcbiAgICByZXR1cm4gbWFuYWdlZDtcbiAgfVxuICBpZiAoIWluc3RhbGwpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjb21wYXRpYmxlIERhdGFicmlja3MgQ0xJIHVuYXZhaWxhYmxlIGFuZCBpbnN0YWxsYXRpb24gZGlzYWJsZWRcIik7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBhc3NldCA9IHBsYXRmb3JtQXNzZXQoKTtcbiAgaWYgKCFhc3NldCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIm5vIG1hbmFnZWQgRGF0YWJyaWNrcyBDTEkgYXNzZXQgZm9yIHBsYXRmb3JtXCIsIHtcbiAgICAgIHBsYXRmb3JtOiBwcm9jZXNzLnBsYXRmb3JtLFxuICAgICAgYXJjaDogcHJvY2Vzcy5hcmNoLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgcm9vdCA9IGpvaW4oaG9tZWRpcigpLCBcIi5kYXRhYnJpY2tzXCIpO1xuICBjb25zdCBiaW5EaXIgPSBqb2luKHJvb3QsIFwiYmluXCIpO1xuICBjb25zdCBleGVjdXRhYmxlID0gbWFuYWdlZEV4ZWN1dGFibGVOYW1lKCk7XG4gIGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IGJpbi5lbnN1cmUoXCJkYXRhYnJpY2tzXCIsIGFzc2V0LCB7XG4gICAgYXV0b1VucGFja2FnZTogdHJ1ZSxcbiAgICBkZXN0aW5hdGlvbjogeyByb290LCBiaW5EaXIsIHBhdGg6IGpvaW4oYmluRGlyLCBleGVjdXRhYmxlKSB9LFxuICAgIG1pblZlcnNpb246IGNsaUFzc2V0cy5taW5pbXVtVmVyc2lvbixcbiAgICBzZWxlY3RvcjogKHsgc291cmNlIH0pID0+IGpvaW4oc291cmNlLCBleGVjdXRhYmxlKSxcbiAgICB2ZXJzaW9uUGFyc2VyOiAob3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gYmluLnBhcnNlVmVyc2lvbihvdXRwdXQpO1xuICAgICAgcmV0dXJuIHZlcnNpb24gPT09IGNsaUFzc2V0cy52ZXJzaW9uID8gdmVyc2lvbiA6IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9KTtcbiAgbG9nZ2VyLmRlYnVnKFwiZW5zdXJlZCBtYW5hZ2VkIERhdGFicmlja3MgQ0xJXCIsIHtcbiAgICBleGVjdXRhYmxlOiBpbnN0YWxsZWQucGF0aCxcbiAgICB2ZXJzaW9uOiBjbGlBc3NldHMudmVyc2lvbixcbiAgfSk7XG4gIHJldHVybiBpbnN0YWxsZWQucGF0aDtcbn1cblxuZnVuY3Rpb24gbWFuYWdlZEV4ZWN1dGFibGUoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oaG9tZWRpcigpLCBcIi5kYXRhYnJpY2tzXCIsIFwiYmluXCIsIG1hbmFnZWRFeGVjdXRhYmxlTmFtZSgpKTtcbn1cblxuZnVuY3Rpb24gbWFuYWdlZEV4ZWN1dGFibGVOYW1lKCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcImRhdGFicmlja3MuZXhlXCIgOiBcImRhdGFicmlja3NcIjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGF0aWJsZURhdGFicmlja3NDbGkoZXhlY3V0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuUHJvY2VzcyhleGVjdXRhYmxlLCBbXCItLXZlcnNpb25cIl0sIHt9LCAxMF8wMDApO1xuICAgIGlmIChyZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIkRhdGFicmlja3MgQ0xJIHZlcnNpb24gcHJvYmUgZmFpbGVkXCIsIHtcbiAgICAgICAgZXhlY3V0YWJsZSxcbiAgICAgICAgZXhpdENvZGU6IHJlc3VsdC5leGl0Q29kZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uID0gYmluLnBhcnNlVmVyc2lvbihyZXN1bHQpO1xuICAgIGNvbnN0IGNvbXBhdGlibGUgPVxuICAgICAgdmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGJpbi5pc1ZlcnNpb25BdExlYXN0KHZlcnNpb24sIGNsaUFzc2V0cy5taW5pbXVtVmVyc2lvbik7XG4gICAgbG9nZ2VyLmRlYnVnKFwicHJvYmVkIERhdGFicmlja3MgQ0xJIHZlcnNpb25cIiwge1xuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIHZlcnNpb246IHZlcnNpb24gPz8gXCJ1bmtub3duXCIsXG4gICAgICBtaW5pbXVtVmVyc2lvbjogY2xpQXNzZXRzLm1pbmltdW1WZXJzaW9uLFxuICAgICAgY29tcGF0aWJsZSxcbiAgICB9KTtcbiAgICByZXR1cm4gY29tcGF0aWJsZTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJEYXRhYnJpY2tzIENMSSB2ZXJzaW9uIHByb2JlIHVuYXZhaWxhYmxlXCIsIHtcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBlcnJvcjogZmFpbHVyZU1ldGFkYXRhKGNhdXNlKSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGxhdGZvcm1Bc3NldCgpOiBEYXRhYnJpY2tzQ2xpQXNzZXQgfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXkgPSBgJHtwcm9jZXNzLnBsYXRmb3JtfS0ke3Byb2Nlc3MuYXJjaH1gIGFzIGtleW9mIHR5cGVvZiBjbGlBc3NldHMuYXNzZXRzO1xuICByZXR1cm4gY2xpQXNzZXRzLmFzc2V0c1trZXldO1xufVxuXG4vKiogUnVuIGludGVyYWN0aXZlIERhdGFicmlja3MgQ0xJIGxvZ2luIGZvciBvbmUgcHJvZmlsZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkYXRhYnJpY2tzQ2xpTG9naW4oXG4gIHByb2ZpbGU6IHN0cmluZyxcbiAgdGltZW91dE1zOiBudW1iZXIsXG4gIGV4ZWN1dGFibGUgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0NMSV9QQVRIID8/IFwiZGF0YWJyaWNrc1wiLFxuICBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxvZ2dlci5kZWJ1ZyhcInN0YXJ0aW5nIERhdGFicmlja3MgQ0xJIGxvZ2luXCIsIHsgcHJvZmlsZSwgZXhlY3V0YWJsZSwgdGltZW91dE1zIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5Qcm9jZXNzKFxuICAgIGV4ZWN1dGFibGUsXG4gICAgW1wiYXV0aFwiLCBcImxvZ2luXCIsIFwiLS1wcm9maWxlXCIsIHByb2ZpbGUsIFwiLS10aW1lb3V0XCIsIGAke01hdGguY2VpbCh0aW1lb3V0TXMgLyAxMDAwKX1zYF0sXG4gICAgZW52aXJvbm1lbnQsXG4gICk7XG4gIGlmIChyZXN1bHQuZXhpdENvZGUgIT09IDApXG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNsaVwiLCByZXN1bHQuc3RkZXJyIHx8IGBkYXRhYnJpY2tzIGF1dGggbG9naW4gZXhpdGVkICR7cmVzdWx0LmV4aXRDb2RlfWApO1xuICBsb2dnZXIuZGVidWcoXCJEYXRhYnJpY2tzIENMSSBsb2dpbiBjb21wbGV0ZWRcIiwgeyBwcm9maWxlLCBleGVjdXRhYmxlIH0pO1xufVxuXG4vKiogUmVxdWVzdCBvbmUgcHJvZmlsZSB0b2tlbiBmcm9tIHRoZSBEYXRhYnJpY2tzIENMSS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkYXRhYnJpY2tzQ2xpVG9rZW4oXG4gIHByb2ZpbGU6IHN0cmluZyxcbiAgZm9yY2VSZWZyZXNoID0gZmFsc2UsXG4gIGV4ZWN1dGFibGUgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0NMSV9QQVRIID8/IFwiZGF0YWJyaWNrc1wiLFxuICBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuKTogUHJvbWlzZTxUb2tlbj4ge1xuICBsb2dnZXIuZGVidWcoXCJyZXF1ZXN0aW5nIERhdGFicmlja3MgQ0xJIHRva2VuXCIsIHsgcHJvZmlsZSwgZXhlY3V0YWJsZSwgZm9yY2VSZWZyZXNoIH0pO1xuICBjb25zdCBhcmdzID0gW1wiYXV0aFwiLCBcInRva2VuXCIsIFwiLS1wcm9maWxlXCIsIHByb2ZpbGUsIFwiLS1vdXRwdXRcIiwgXCJqc29uXCJdO1xuICBpZiAoZm9yY2VSZWZyZXNoKSBhcmdzLnB1c2goXCItLWZvcmNlLXJlZnJlc2hcIik7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1blByb2Nlc3MoZXhlY3V0YWJsZSwgYXJncywgZW52aXJvbm1lbnQpO1xuICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKVxuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjbGlcIiwgcmVzdWx0LnN0ZGVyciB8fCBgZGF0YWJyaWNrcyBhdXRoIHRva2VuIGV4aXRlZCAke3Jlc3VsdC5leGl0Q29kZX1gKTtcbiAgbGV0IHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgdHJ5IHtcbiAgICB2YWx1ZSA9IEpTT04ucGFyc2UocmVzdWx0LnN0ZG91dCA/PyBcIlwiKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY2xpXCIsIFwiRGF0YWJyaWNrcyBDTEkgdG9rZW4gb3V0cHV0IHdhcyBub3QgSlNPTlwiLCB7IGNhdXNlIH0pO1xuICB9XG4gIGNvbnN0IGFjY2Vzc1Rva2VuID0gc3RyaW5nVmFsdWUodmFsdWUuYWNjZXNzX3Rva2VuID8/IHZhbHVlLmFjY2Vzc1Rva2VuKTtcbiAgaWYgKCFhY2Nlc3NUb2tlbikgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNsaVwiLCBcIkRhdGFicmlja3MgQ0xJIHRva2VuIG91dHB1dCBoYWQgbm8gYWNjZXNzIHRva2VuXCIpO1xuICBjb25zdCB0b2tlbiA9IHtcbiAgICBhY2Nlc3NUb2tlbixcbiAgICB0b2tlblR5cGU6IHN0cmluZ1ZhbHVlKHZhbHVlLnRva2VuX3R5cGUgPz8gdmFsdWUudG9rZW5UeXBlKSA/PyBcIkJlYXJlclwiLFxuICAgIC4uLihzdHJpbmdWYWx1ZSh2YWx1ZS5yZWZyZXNoX3Rva2VuID8/IHZhbHVlLnJlZnJlc2hUb2tlbilcbiAgICAgID8geyByZWZyZXNoVG9rZW46IHN0cmluZ1ZhbHVlKHZhbHVlLnJlZnJlc2hfdG9rZW4gPz8gdmFsdWUucmVmcmVzaFRva2VuKSB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4oc3RyaW5nVmFsdWUodmFsdWUuZXhwaXJ5ID8/IHZhbHVlLmV4cGlyZXNfYXQpXG4gICAgICA/IHsgZXhwaXJ5OiBzdHJpbmdWYWx1ZSh2YWx1ZS5leHBpcnkgPz8gdmFsdWUuZXhwaXJlc19hdCkgfVxuICAgICAgOiB7fSksXG4gICAgc2NvcGVzOiBBcnJheS5pc0FycmF5KHZhbHVlLnNjb3BlcylcbiAgICAgID8gdmFsdWUuc2NvcGVzLmZpbHRlcigoc2NvcGUpOiBzY29wZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHNjb3BlID09PSBcInN0cmluZ1wiKVxuICAgICAgOiBbXSxcbiAgfTtcbiAgbG9nZ2VyLmRlYnVnKFwicmVjZWl2ZWQgRGF0YWJyaWNrcyBDTEkgdG9rZW5cIiwge1xuICAgIHByb2ZpbGUsXG4gICAgZm9yY2VSZWZyZXNoLFxuICAgIHRva2VuOiB0b2tlbk1ldGFkYXRhKHRva2VuKSxcbiAgfSk7XG4gIHJldHVybiB0b2tlbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJvY2VzcyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgZW52aXJvbm1lbnQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIHRpbWVvdXRNcz86IG51bWJlcixcbik6IFByb21pc2U8eyBleGl0Q29kZTogbnVtYmVyOyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmcgfT4ge1xuICBjb25zdCBjb250cm9sbGVyID0gdGltZW91dE1zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHRpbWVvdXQgPSBjb250cm9sbGVyID8gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXRNcykgOiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGV4ZWMuc3Bhd24oY29tbWFuZCwgYXJncywge1xuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnZpcm9ubWVudCB9LFxuICAgICAgc3RkaW46IFwiaWdub3JlXCIsXG4gICAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgICAgIHNpZ25hbDogY29udHJvbGxlcj8uc2lnbmFsLFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICh0aW1lb3V0KSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIH1cbn1cblxuLyoqIFByb3ZpZGVyIHRoYXQgbGF6aWx5IGRlbGVnYXRlcyBVMk0gY3JlZGVudGlhbHMgdG8gdGhlIERhdGFicmlja3MgQ0xJLiAqL1xuZXhwb3J0IGNsYXNzIERhdGFicmlja3NDbGlQcm92aWRlciBpbXBsZW1lbnRzIFRva2VuUHJvdmlkZXIge1xuICBwcml2YXRlIHJlc29sdXRpb24/OiBQcm9taXNlPHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9maWxlOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRhYmxlT3JSZXNvbHZlcjogc3RyaW5nIHwgRGF0YWJyaWNrc0NsaVJlc29sdmVyID0gKCkgPT5cbiAgICAgIHJlc29sdmVEYXRhYnJpY2tzQ2xpKCksXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuICApIHt9XG5cbiAgYXN5bmMgYXV0aGVudGljYXRlKF90aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8VG9rZW4+IHtcbiAgICByZXR1cm4gZGF0YWJyaWNrc0NsaVRva2VuKFxuICAgICAgdGhpcy5wcm9maWxlLFxuICAgICAgZmFsc2UsXG4gICAgICBhd2FpdCB0aGlzLnJlc29sdmVFeGVjdXRhYmxlKCksXG4gICAgICB0aGlzLmVudmlyb25tZW50LFxuICAgICk7XG4gIH1cblxuICBhc3luYyBsb2dpbih0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8VG9rZW4+IHtcbiAgICBjb25zdCBleGVjdXRhYmxlID0gYXdhaXQgdGhpcy5yZXNvbHZlRXhlY3V0YWJsZSgpO1xuICAgIGF3YWl0IGRhdGFicmlja3NDbGlMb2dpbih0aGlzLnByb2ZpbGUsIHRpbWVvdXRNcywgZXhlY3V0YWJsZSwgdGhpcy5lbnZpcm9ubWVudCk7XG4gICAgcmV0dXJuIGRhdGFicmlja3NDbGlUb2tlbih0aGlzLnByb2ZpbGUsIGZhbHNlLCBleGVjdXRhYmxlLCB0aGlzLmVudmlyb25tZW50KTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2goX3Rva2VuOiBUb2tlbik6IFByb21pc2U8VG9rZW4+IHtcbiAgICByZXR1cm4gZGF0YWJyaWNrc0NsaVRva2VuKHRoaXMucHJvZmlsZSwgdHJ1ZSwgYXdhaXQgdGhpcy5yZXNvbHZlRXhlY3V0YWJsZSgpLCB0aGlzLmVudmlyb25tZW50KTtcbiAgfVxuXG4gIGNhbkF1dGhlbnRpY2F0ZVNpbGVudGx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRXhlY3V0YWJsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5leGVjdXRhYmxlT3JSZXNvbHZlciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwidXNpbmcgY29uZmlndXJlZCBEYXRhYnJpY2tzIENMSSBleGVjdXRhYmxlXCIsIHtcbiAgICAgICAgcHJvZmlsZTogdGhpcy5wcm9maWxlLFxuICAgICAgICBleGVjdXRhYmxlOiB0aGlzLmV4ZWN1dGFibGVPclJlc29sdmVyLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZXhlY3V0YWJsZU9yUmVzb2x2ZXIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXNvbHV0aW9uKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZXVzZWQgcHJvdmlkZXIgQ0xJIHJlc29sdXRpb25cIiwgeyBwcm9maWxlOiB0aGlzLnByb2ZpbGUgfSk7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHV0aW9uO1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZpbmcgcHJvdmlkZXIgQ0xJIGxhemlseVwiLCB7IHByb2ZpbGU6IHRoaXMucHJvZmlsZSB9KTtcbiAgICB0aGlzLnJlc29sdXRpb24gPSB0aGlzLmV4ZWN1dGFibGVPclJlc29sdmVyKClcbiAgICAgIC50aGVuKChleGVjdXRhYmxlKSA9PiB7XG4gICAgICAgIGlmICghZXhlY3V0YWJsZSlcbiAgICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY2xpXCIsIFwiRGF0YWJyaWNrcyBDTEkgaXMgdW5hdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybVwiKTtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x1dGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJpbmdWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHZhbHVlKSA/PyB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -1,7 +0,0 @@
1
- /** Authentication failure with a stable category for callers and language shims. */
2
- export declare class AuthError extends Error {
3
- readonly kind: "config" | "oauth" | "storage" | "lock-timeout" | "cli" | "http";
4
- constructor(kind: "config" | "oauth" | "storage" | "lock-timeout" | "cli" | "http", message: string, options?: ErrorOptions);
5
- }
6
- /** Normalize arbitrary failures without erasing their original cause. */
7
- export declare function authError(kind: AuthError["kind"], message: string, cause?: unknown): AuthError;
package/lib/src/errors.js DELETED
@@ -1,14 +0,0 @@
1
- /** Authentication failure with a stable category for callers and language shims. */
2
- export class AuthError extends Error {
3
- kind;
4
- constructor(kind, message, options) {
5
- super(message, options);
6
- this.kind = kind;
7
- this.name = "AuthError";
8
- }
9
- }
10
- /** Normalize arbitrary failures without erasing their original cause. */
11
- export function authError(kind, message, cause) {
12
- return cause instanceof AuthError ? cause : new AuthError(kind, message, { cause });
13
- }
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvRkFBb0Y7QUFDcEYsTUFBTSxPQUFPLFNBQVUsU0FBUSxLQUFLO0lBRXZCO0lBRFgsWUFDVyxJQUFzRSxFQUMvRSxPQUFlLEVBQ2YsT0FBc0I7UUFFdEIsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUpmLFNBQUksR0FBSixJQUFJLENBQWtFO1FBSy9FLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQUVELHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQXVCLEVBQUUsT0FBZSxFQUFFLEtBQWU7SUFDakYsT0FBTyxLQUFLLFlBQVksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ3RGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQXV0aGVudGljYXRpb24gZmFpbHVyZSB3aXRoIGEgc3RhYmxlIGNhdGVnb3J5IGZvciBjYWxsZXJzIGFuZCBsYW5ndWFnZSBzaGltcy4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGtpbmQ6IFwiY29uZmlnXCIgfCBcIm9hdXRoXCIgfCBcInN0b3JhZ2VcIiB8IFwibG9jay10aW1lb3V0XCIgfCBcImNsaVwiIHwgXCJodHRwXCIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgIHRoaXMubmFtZSA9IFwiQXV0aEVycm9yXCI7XG4gIH1cbn1cblxuLyoqIE5vcm1hbGl6ZSBhcmJpdHJhcnkgZmFpbHVyZXMgd2l0aG91dCBlcmFzaW5nIHRoZWlyIG9yaWdpbmFsIGNhdXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1dGhFcnJvcihraW5kOiBBdXRoRXJyb3JbXCJraW5kXCJdLCBtZXNzYWdlOiBzdHJpbmcsIGNhdXNlPzogdW5rbm93bik6IEF1dGhFcnJvciB7XG4gIHJldHVybiBjYXVzZSBpbnN0YW5jZW9mIEF1dGhFcnJvciA/IGNhdXNlIDogbmV3IEF1dGhFcnJvcihraW5kLCBtZXNzYWdlLCB7IGNhdXNlIH0pO1xufVxuIl19
@@ -1,20 +0,0 @@
1
- import type { CredentialStore, LockAdapter, Token } from "./types.ts";
2
- import { FileLayout } from "./types.ts";
3
- /** File-backed credential store preserving unrelated Databricks CLI entries. */
4
- export declare class FileCredentialStore implements CredentialStore {
5
- private readonly root;
6
- private readonly layout;
7
- private readonly locks;
8
- constructor(root?: string, layout?: FileLayout, locks?: LockAdapter);
9
- load(key: string): Promise<Token | undefined>;
10
- prepareWrite(): Promise<void>;
11
- save(key: string, token: Token): Promise<void>;
12
- remove(key: string): Promise<void>;
13
- acquireLock(key: string, timeoutMs?: number): Promise<string>;
14
- releaseLock(lease: string): Promise<void>;
15
- name(): string;
16
- private forKey;
17
- private withCacheLock;
18
- private readCache;
19
- private writeCache;
20
- }
@@ -1,207 +0,0 @@
1
- import { createHash, randomUUID } from "node:crypto";
2
- import { chmod, mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
3
- import { homedir } from "node:os";
4
- import { basename, dirname, join } from "node:path";
5
- import { acquireFileLock } from "@dbx-tools/core/file-lock";
6
- import { authLogger, credentialId, tokenMetadata } from "./_logging.js";
7
- import { AuthError } from "./errors.js";
8
- import { FileLayout } from "./types.js";
9
- const logger = authLogger("file-storage");
10
- class FileLocks {
11
- lockDirectory;
12
- leases = new Map();
13
- constructor(lockDirectory) {
14
- this.lockDirectory = lockDirectory;
15
- }
16
- async acquire(key, timeoutMs) {
17
- logger.debug("waiting for file lock", {
18
- credential: credentialId(key),
19
- timeoutMs,
20
- });
21
- const lease = await acquireFileLock(key, { dir: this.lockDirectory, timeoutMs });
22
- const id = randomUUID();
23
- this.leases.set(id, lease);
24
- logger.debug("file lock acquired", {
25
- credential: credentialId(key),
26
- backend: lease.backend,
27
- });
28
- return id;
29
- }
30
- async release(id) {
31
- const lease = this.leases.get(id);
32
- if (!lease)
33
- return;
34
- this.leases.delete(id);
35
- await lease.release();
36
- logger.debug("file lock released", { backend: lease.backend });
37
- }
38
- }
39
- /** File-backed credential store preserving unrelated Databricks CLI entries. */
40
- export class FileCredentialStore {
41
- root;
42
- layout;
43
- locks;
44
- constructor(root = join(homedir(), ".databricks"), layout = FileLayout.Single, locks) {
45
- this.root = root;
46
- this.layout = layout;
47
- this.locks = locks ?? new FileLocks(join(root, "locks"));
48
- }
49
- async load(key) {
50
- const store = this.forKey(key);
51
- return store.withCacheLock(async () => {
52
- const token = deserializeToken((await store.readCache()).tokens[key]);
53
- logger.debug("loaded file credential", {
54
- credential: credentialId(key),
55
- layout: this.layout,
56
- token: tokenMetadata(token),
57
- });
58
- return token;
59
- });
60
- }
61
- async prepareWrite() {
62
- await ensureDirectory(this.root, 0o700);
63
- logger.debug("prepared credential directory", { layout: this.layout });
64
- }
65
- async save(key, token) {
66
- const store = this.forKey(key);
67
- await store.withCacheLock(async () => {
68
- const cache = await store.readCache();
69
- cache.tokens[key] = serializeToken(token);
70
- await store.writeCache(cache);
71
- logger.debug("saved file credential", {
72
- credential: credentialId(key),
73
- layout: this.layout,
74
- token: tokenMetadata(token),
75
- });
76
- });
77
- }
78
- async remove(key) {
79
- const store = this.forKey(key);
80
- await store.withCacheLock(async () => {
81
- const cache = await store.readCache();
82
- delete cache.tokens[key];
83
- await store.writeCache(cache);
84
- logger.debug("removed file credential", {
85
- credential: credentialId(key),
86
- layout: this.layout,
87
- });
88
- });
89
- }
90
- acquireLock(key, timeoutMs) {
91
- return this.locks.acquire(this.layout === FileLayout.Single ? `${this.root}:refresh` : `${this.root}:${key}:refresh`, timeoutMs);
92
- }
93
- releaseLock(lease) {
94
- return this.locks.release(lease);
95
- }
96
- name() {
97
- return "file";
98
- }
99
- forKey(key) {
100
- if (this.layout === FileLayout.Single)
101
- return this;
102
- const digest = createHash("sha256").update(key).digest("hex");
103
- return new FileCredentialStore(join(this.root, digest), FileLayout.Single, this.locks);
104
- }
105
- async withCacheLock(action) {
106
- await ensureDirectory(this.root, 0o700);
107
- const lease = await this.locks.acquire(`${this.root}:cache`, 30_000);
108
- try {
109
- return await action();
110
- }
111
- finally {
112
- await this.locks.release(lease);
113
- }
114
- }
115
- async readCache() {
116
- try {
117
- const source = await readTextFile(join(this.root, "token-cache.json"));
118
- const cache = source ? JSON.parse(source) : { version: 1, tokens: {} };
119
- if (cache.version !== 1 || typeof cache.tokens !== "object" || !cache.tokens) {
120
- throw new AuthError("storage", "Token cache must use version 1");
121
- }
122
- logger.debug("read token cache", {
123
- exists: Boolean(source),
124
- credentialCount: Object.keys(cache.tokens).length,
125
- });
126
- return cache;
127
- }
128
- catch (cause) {
129
- if (cause instanceof AuthError)
130
- throw cause;
131
- throw new AuthError("storage", "Could not read Databricks token cache", { cause });
132
- }
133
- }
134
- async writeCache(cache) {
135
- try {
136
- await atomicWriteTextFile(join(this.root, "token-cache.json"), `${JSON.stringify(cache, null, 2)}\n`, 0o600);
137
- logger.debug("wrote token cache", { credentialCount: Object.keys(cache.tokens).length });
138
- }
139
- catch (cause) {
140
- throw new AuthError("storage", "Could not write Databricks token cache", { cause });
141
- }
142
- }
143
- }
144
- async function ensureDirectory(path, mode) {
145
- await mkdir(path, { recursive: true, mode });
146
- await chmod(path, mode);
147
- }
148
- async function readTextFile(path) {
149
- try {
150
- return await readFile(path, "utf8");
151
- }
152
- catch (cause) {
153
- if (cause.code === "ENOENT")
154
- return undefined;
155
- throw cause;
156
- }
157
- }
158
- async function atomicWriteTextFile(path, content, mode) {
159
- const parent = dirname(path);
160
- await ensureDirectory(parent, 0o700);
161
- const temporary = join(parent, `.${basename(path)}-${randomUUID()}.tmp`);
162
- try {
163
- await writeFile(temporary, content, { mode, flag: "wx" });
164
- await chmod(temporary, mode);
165
- await rename(temporary, path);
166
- }
167
- finally {
168
- await unlink(temporary).catch((cause) => {
169
- if (cause.code !== "ENOENT")
170
- throw cause;
171
- });
172
- }
173
- }
174
- function serializeToken(token) {
175
- return {
176
- access_token: token.accessToken,
177
- token_type: token.tokenType,
178
- ...(token.refreshToken ? { refresh_token: token.refreshToken } : {}),
179
- ...(token.expiry ? { expiry: token.expiry } : {}),
180
- ...(token.scopes.length ? { scopes: token.scopes } : {}),
181
- };
182
- }
183
- function deserializeToken(value) {
184
- if (!value || typeof value !== "object")
185
- return undefined;
186
- const record = value;
187
- const accessToken = stringValue(record.access_token ?? record.accessToken);
188
- if (!accessToken)
189
- return undefined;
190
- return {
191
- accessToken,
192
- tokenType: stringValue(record.token_type ?? record.tokenType) ?? "Bearer",
193
- ...(stringValue(record.refresh_token ?? record.refreshToken)
194
- ? { refreshToken: stringValue(record.refresh_token ?? record.refreshToken) }
195
- : {}),
196
- ...(stringValue(record.expiry ?? record.expires_at)
197
- ? { expiry: stringValue(record.expiry ?? record.expires_at) }
198
- : {}),
199
- scopes: Array.isArray(record.scopes)
200
- ? record.scopes.filter((scope) => typeof scope === "string")
201
- : [],
202
- };
203
- }
204
- function stringValue(value) {
205
- return typeof value === "string" && value.trim() ? value : undefined;
206
- }
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZpbGUtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFzQixNQUFNLDJCQUEyQixDQUFDO0FBRWhGLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBTzFDLE1BQU0sU0FBUztJQUdnQjtJQUZaLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQUUzRCxZQUE2QixhQUFxQjtRQUFyQixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtJQUFHLENBQUM7SUFFdEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFXLEVBQUUsU0FBa0I7UUFDM0MsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRTtZQUNwQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUM3QixTQUFTO1NBQ1YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxlQUFlLENBQUMsR0FBRyxFQUFFLEVBQUUs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cnQgeyBjcmVhdGVIYXNoLCByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBjaG1vZCwgbWtkaXIsIHJlYWRGaWxlLCByZW5hbWUsIHVubGluaywgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IGFjcXVpcmVGaWxlTG9jaywgdHlwZSBGaWxlTG9ja0xlYXNlIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZS9maWxlLWxvY2tcIjtcblxuaW1wb3J0IHsgYXV0aExvZ2dlciwgY3JlZGVudGlhbElkLCB0b2tlbk1ldGFkYXRhIH0gZnJvbSBcIi4vX2xvZ2dpbmcudHNcIjtcbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuL2Vycm9ycy50c1wiO1xuaW1wb3J0IHR5cGUgeyBDcmVkZW50aWFsU3RvcmUsIExvY2tBZGFwdGVyLCBUb2tlbiB9IGZyb20gXCIuL3R5cGVzLnRzXCI7XG5pbXBvcnQgeyBGaWxlTGF5b3V0IH0gZnJvbSBcIi4vdHlwZXMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gYXV0aExvZ2dlcihcImZpbGUtc3RvcmFnZVwiKTtcblxuaW50ZXJmYWNlIFRva2VuQ2FjaGUge1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIHRva2VuczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmNsYXNzIEZpbGVMb2NrcyBpbXBsZW1lbnRzIExvY2tBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsZWFzZXMgPSBuZXcgTWFwPHN0cmluZywgRmlsZUxvY2tMZWFzZT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGxvY2tEaXJlY3Rvcnk6IHN0cmluZykge31cblxuICBhc3luYyBhY3F1aXJlKGtleTogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIndhaXRpbmcgZm9yIGZpbGUgbG9ja1wiLCB7XG4gICAgICBjcmVkZW50aWFsOiBjcmVkZW50aWFsSWQoa2V5KSxcbiAgICAgIHRpbWVvdXRNcyxcbiAgICB9KTtcbiAgICBjb25zdCBsZWFzZSA9IGF3YWl0IGFjcXVpcmVGaWxlTG9jayhrZXksIHsgZGlyOiB0aGlzLmxvY2tEaXJlY3RvcnksIHRpbWVvdXRNcyB9KTtcbiAgICBjb25zdCBpZCA9IHJhbmRvbVVVSUQoKTtcbiAgICB0aGlzLmxlYXNlcy5zZXQoaWQsIGxlYXNlKTtcbiAgICBsb2dnZXIuZGVidWcoXCJmaWxlIGxvY2sgYWNxdWlyZWRcIiwge1xuICAgICAgY3JlZGVudGlhbDogY3JlZGVudGlhbElkKGtleSksXG4gICAgICBiYWNrZW5kOiBsZWFzZS5iYWNrZW5kLFxuICAgIH0pO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2UoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxlYXNlID0gdGhpcy5sZWFzZXMuZ2V0KGlkKTtcbiAgICBpZiAoIWxlYXNlKSByZXR1cm47XG4gICAgdGhpcy5sZWFzZXMuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBsZWFzZS5yZWxlYXNlKCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZmlsZSBsb2NrIHJlbGVhc2VkXCIsIHsgYmFja2VuZDogbGVhc2UuYmFja2VuZCB9KTtcbiAgfVxufVxuXG4vKiogRmlsZS1iYWNrZWQgY3JlZGVudGlhbCBzdG9yZSBwcmVzZXJ2aW5nIHVucmVsYXRlZCBEYXRhYnJpY2tzIENMSSBlbnRyaWVzLiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVDcmVkZW50aWFsU3RvcmUgaW1wbGVtZW50cyBDcmVkZW50aWFsU3RvcmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tzOiBMb2NrQWRhcHRlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvb3QgPSBqb2luKGhvbWVkaXIoKSwgXCIuZGF0YWJyaWNrc1wiKSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxheW91dCA9IEZpbGVMYXlvdXQuU2luZ2xlLFxuICAgIGxvY2tzPzogTG9ja0FkYXB0ZXIsXG4gICkge1xuICAgIHRoaXMubG9ja3MgPSBsb2NrcyA/PyBuZXcgRmlsZUxvY2tzKGpvaW4ocm9vdCwgXCJsb2Nrc1wiKSk7XG4gIH1cblxuICBhc3luYyBsb2FkKGtleTogc3RyaW5nKTogUHJvbWlzZTxUb2tlbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5mb3JLZXkoa2V5KTtcbiAgICByZXR1cm4gc3RvcmUud2l0aENhY2hlTG9jayhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0b2tlbiA9IGRlc2VyaWFsaXplVG9rZW4oKGF3YWl0IHN0b3JlLnJlYWRDYWNoZSgpKS50b2tlbnNba2V5XSk7XG4gICAgICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgZmlsZSBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgY3JlZGVudGlhbDogY3JlZGVudGlhbElkKGtleSksXG4gICAgICAgIGxheW91dDogdGhpcy5sYXlvdXQsXG4gICAgICAgIHRva2VuOiB0b2tlbk1ldGFkYXRhKHRva2VuKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVdyaXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZURpcmVjdG9yeSh0aGlzLnJvb3QsIDBvNzAwKTtcbiAgICBsb2dnZXIuZGVidWcoXCJwcmVwYXJlZCBjcmVkZW50aWFsIGRpcmVjdG9yeVwiLCB7IGxheW91dDogdGhpcy5sYXlvdXQgfSk7XG4gIH1cblxuICBhc3luYyBzYXZlKGtleTogc3RyaW5nLCB0b2tlbjogVG9rZW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuZm9yS2V5KGtleSk7XG4gICAgYXdhaXQgc3RvcmUud2l0aENhY2hlTG9jayhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHN0b3JlLnJlYWRDYWNoZSgpO1xuICAgICAgY2FjaGUudG9rZW5zW2tleV0gPSBzZXJpYWxpemVUb2tlbih0b2tlbik7XG4gICAgICBhd2FpdCBzdG9yZS53cml0ZUNhY2hlKGNhY2hlKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNhdmVkIGZpbGUgY3JlZGVudGlhbFwiLCB7XG4gICAgICAgIGNyZWRlbnRpYWw6IGNyZWRlbnRpYWxJZChrZXkpLFxuICAgICAgICBsYXlvdXQ6IHRoaXMubGF5b3V0LFxuICAgICAgICB0b2tlbjogdG9rZW5NZXRhZGF0YSh0b2tlbiksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5mb3JLZXkoa2V5KTtcbiAgICBhd2FpdCBzdG9yZS53aXRoQ2FjaGVMb2NrKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgc3RvcmUucmVhZENhY2hlKCk7XG4gICAgICBkZWxldGUgY2FjaGUudG9rZW5zW2tleV07XG4gICAgICBhd2FpdCBzdG9yZS53cml0ZUNhY2hlKGNhY2hlKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInJlbW92ZWQgZmlsZSBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgY3JlZGVudGlhbDogY3JlZGVudGlhbElkKGtleSksXG4gICAgICAgIGxheW91dDogdGhpcy5sYXlvdXQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFjcXVpcmVMb2NrKGtleTogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmxvY2tzLmFjcXVpcmUoXG4gICAgICB0aGlzLmxheW91dCA9PT0gRmlsZUxheW91dC5TaW5nbGUgPyBgJHt0aGlzLnJvb3R9OnJlZnJlc2hgIDogYCR7dGhpcy5yb290fToke2tleX06cmVmcmVzaGAsXG4gICAgICB0aW1lb3V0TXMsXG4gICAgKTtcbiAgfVxuXG4gIHJlbGVhc2VMb2NrKGxlYXNlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2Nrcy5yZWxlYXNlKGxlYXNlKTtcbiAgfVxuXG4gIG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmaWxlXCI7XG4gIH1cblxuICBwcml2YXRlIGZvcktleShrZXk6IHN0cmluZyk6IEZpbGVDcmVkZW50aWFsU3RvcmUge1xuICAgIGlmICh0aGlzLmxheW91dCA9PT0gRmlsZUxheW91dC5TaW5nbGUpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGtleSkuZGlnZXN0KFwiaGV4XCIpO1xuICAgIHJldHVybiBuZXcgRmlsZUNyZWRlbnRpYWxTdG9yZShqb2luKHRoaXMucm9vdCwgZGlnZXN0KSwgRmlsZUxheW91dC5TaW5nbGUsIHRoaXMubG9ja3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3aXRoQ2FjaGVMb2NrPFQ+KGFjdGlvbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIGF3YWl0IGVuc3VyZURpcmVjdG9yeSh0aGlzLnJvb3QsIDBvNzAwKTtcbiAgICBjb25zdCBsZWFzZSA9IGF3YWl0IHRoaXMubG9ja3MuYWNxdWlyZShgJHt0aGlzLnJvb3R9OmNhY2hlYCwgMzBfMDAwKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFjdGlvbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmxvY2tzLnJlbGVhc2UobGVhc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZENhY2hlKCk6IFByb21pc2U8VG9rZW5DYWNoZT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkVGV4dEZpbGUoam9pbih0aGlzLnJvb3QsIFwidG9rZW4tY2FjaGUuanNvblwiKSk7XG4gICAgICBjb25zdCBjYWNoZSA9IHNvdXJjZSA/IChKU09OLnBhcnNlKHNvdXJjZSkgYXMgVG9rZW5DYWNoZSkgOiB7IHZlcnNpb246IDEsIHRva2Vuczoge30gfTtcbiAgICAgIGlmIChjYWNoZS52ZXJzaW9uICE9PSAxIHx8IHR5cGVvZiBjYWNoZS50b2tlbnMgIT09IFwib2JqZWN0XCIgfHwgIWNhY2hlLnRva2Vucykge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwic3RvcmFnZVwiLCBcIlRva2VuIGNhY2hlIG11c3QgdXNlIHZlcnNpb24gMVwiKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInJlYWQgdG9rZW4gY2FjaGVcIiwge1xuICAgICAgICBleGlzdHM6IEJvb2xlYW4oc291cmNlKSxcbiAgICAgICAgY3JlZGVudGlhbENvdW50OiBPYmplY3Qua2V5cyhjYWNoZS50b2tlbnMpLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBBdXRoRXJyb3IpIHRocm93IGNhdXNlO1xuICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcInN0b3JhZ2VcIiwgXCJDb3VsZCBub3QgcmVhZCBEYXRhYnJpY2tzIHRva2VuIGNhY2hlXCIsIHsgY2F1c2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUNhY2hlKGNhY2hlOiBUb2tlbkNhY2hlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGF0b21pY1dyaXRlVGV4dEZpbGUoXG4gICAgICAgIGpvaW4odGhpcy5yb290LCBcInRva2VuLWNhY2hlLmpzb25cIiksXG4gICAgICAgIGAke0pTT04uc3RyaW5naWZ5KGNhY2hlLCBudWxsLCAyKX1cXG5gLFxuICAgICAgICAwbzYwMCxcbiAgICAgICk7XG4gICAgICBsb2dnZXIuZGVidWcoXCJ3cm90ZSB0b2tlbiBjYWNoZVwiLCB7IGNyZWRlbnRpYWxDb3VudDogT2JqZWN0LmtleXMoY2FjaGUudG9rZW5zKS5sZW5ndGggfSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJzdG9yYWdlXCIsIFwiQ291bGQgbm90IHdyaXRlIERhdGFicmlja3MgdG9rZW4gY2FjaGVcIiwgeyBjYXVzZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5KHBhdGg6IHN0cmluZywgbW9kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBtb2RlIH0pO1xuICBhd2FpdCBjaG1vZChwYXRoLCBtb2RlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFRleHRGaWxlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRGaWxlKHBhdGgsIFwidXRmOFwiKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICBpZiAoKGNhdXNlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB0aHJvdyBjYXVzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhdG9taWNXcml0ZVRleHRGaWxlKHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBtb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFyZW50ID0gZGlybmFtZShwYXRoKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KHBhcmVudCwgMG83MDApO1xuICBjb25zdCB0ZW1wb3JhcnkgPSBqb2luKHBhcmVudCwgYC4ke2Jhc2VuYW1lKHBhdGgpfS0ke3JhbmRvbVVVSUQoKX0udG1wYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHRlbXBvcmFyeSwgY29udGVudCwgeyBtb2RlLCBmbGFnOiBcInd4XCIgfSk7XG4gICAgYXdhaXQgY2htb2QodGVtcG9yYXJ5LCBtb2RlKTtcbiAgICBhd2FpdCByZW5hbWUodGVtcG9yYXJ5LCBwYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCB1bmxpbmsodGVtcG9yYXJ5KS5jYXRjaCgoY2F1c2U6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGNhdXNlLmNvZGUgIT09IFwiRU5PRU5UXCIpIHRocm93IGNhdXNlO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVRva2VuKHRva2VuOiBUb2tlbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBhY2Nlc3NfdG9rZW46IHRva2VuLmFjY2Vzc1Rva2VuLFxuICAgIHRva2VuX3R5cGU6IHRva2VuLnRva2VuVHlwZSxcbiAgICAuLi4odG9rZW4ucmVmcmVzaFRva2VuID8geyByZWZyZXNoX3Rva2VuOiB0b2tlbi5yZWZyZXNoVG9rZW4gfSA6IHt9KSxcbiAgICAuLi4odG9rZW4uZXhwaXJ5ID8geyBleHBpcnk6IHRva2VuLmV4cGlyeSB9IDoge30pLFxuICAgIC4uLih0b2tlbi5zY29wZXMubGVuZ3RoID8geyBzY29wZXM6IHRva2VuLnNjb3BlcyB9IDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZVRva2VuKHZhbHVlOiB1bmtub3duKTogVG9rZW4gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVjb3JkID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGFjY2Vzc1Rva2VuID0gc3RyaW5nVmFsdWUocmVjb3JkLmFjY2Vzc190b2tlbiA/PyByZWNvcmQuYWNjZXNzVG9rZW4pO1xuICBpZiAoIWFjY2Vzc1Rva2VuKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuLFxuICAgIHRva2VuVHlwZTogc3RyaW5nVmFsdWUocmVjb3JkLnRva2VuX3R5cGUgPz8gcmVjb3JkLnRva2VuVHlwZSkgPz8gXCJCZWFyZXJcIixcbiAgICAuLi4oc3RyaW5nVmFsdWUocmVjb3JkLnJlZnJlc2hfdG9rZW4gPz8gcmVjb3JkLnJlZnJlc2hUb2tlbilcbiAgICAgID8geyByZWZyZXNoVG9rZW46IHN0cmluZ1ZhbHVlKHJlY29yZC5yZWZyZXNoX3Rva2VuID8/IHJlY29yZC5yZWZyZXNoVG9rZW4pIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzdHJpbmdWYWx1ZShyZWNvcmQuZXhwaXJ5ID8/IHJlY29yZC5leHBpcmVzX2F0KVxuICAgICAgPyB7IGV4cGlyeTogc3RyaW5nVmFsdWUocmVjb3JkLmV4cGlyeSA/PyByZWNvcmQuZXhwaXJlc19hdCkgfVxuICAgICAgOiB7fSksXG4gICAgc2NvcGVzOiBBcnJheS5pc0FycmF5KHJlY29yZC5zY29wZXMpXG4gICAgICA/IHJlY29yZC5zY29wZXMuZmlsdGVyKChzY29wZSk6IHNjb3BlIGlzIHN0cmluZyA9PiB0eXBlb2Ygc2NvcGUgPT09IFwic3RyaW5nXCIpXG4gICAgICA6IFtdLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUudHJpbSgpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -1,33 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "dbxToolsVersion": "0.9.21",
4
- "minimumVersion": "0.296.0",
5
- "version": "1.19.0",
6
- "publishedAt": "2026-09-30T13:13:22Z",
7
- "assets": {
8
- "darwin-arm64": {
9
- "url": "https://github.com/databricks/cli/releases/download/v1.19.0/databricks_cli_1.19.0_darwin_arm64.tar.gz",
10
- "sha256": "b84c6a8c623578308a724cdd7181b92b0816c2531564f16f8de7559b2a39f51f"
11
- },
12
- "darwin-x64": {
13
- "url": "https://github.com/databricks/cli/releases/download/v1.19.0/databricks_cli_1.19.0_darwin_amd64.tar.gz",
14
- "sha256": "d29a5dc1ea7d44d0d892fd4beac05d22daa932982ca6bf98a06d52c95f5ed4cd"
15
- },
16
- "linux-arm64": {
17
- "url": "https://github.com/databricks/cli/releases/download/v1.19.0/databricks_cli_1.19.0_linux_arm64.tar.gz",
18
- "sha256": "2997ccbda57090ee48bd9282d5cb3a5bef78025db64fd1573fbd7c8726856086"
19
- },
20
- "linux-x64": {
21
- "url": "https://github.com/databricks/cli/releases/download/v1.19.0/databricks_cli_1.19.0_linux_amd64.tar.gz",
22
- "sha256": "bddf87df3d72b61384da724b40f18ab483a98af742748260097a7bb8154b070e"
23
- },
24
- "win32-arm64": {
25
- "url": "https://github.com/databricks/cli/releases/download/v1.19.0/databricks_cli_1.19.0_windows_arm64.tar.gz",
26
- "sha256": "c28d098490ea1966230c07585312f8bc66e18d468e34b06319d44e29d61c4602"
27
- },
28
- "win32-x64": {
29
- "url": "https://github.com/databricks/cli/releases/download/v1.19.0/databricks_cli_1.19.0_windows_amd64.tar.gz",
30
- "sha256": "0ded24a2b001e001c815b9c1c66dc2ef1f6c2e60c64f63c6d9afb8e9fe85afdb"
31
- }
32
- }
33
- }
@@ -1,23 +0,0 @@
1
- import { type DatabricksAuthDependencies } from "./databricks-auth.ts";
2
- import type { AuthClient, DatabricksAuthOptions } from "./types.ts";
3
- /** Options for one Databricks JSON API request. */
4
- export interface DatabricksRequestOptions {
5
- method?: string;
6
- body?: unknown;
7
- headers?: Headers | Record<string, string> | [string, string][];
8
- login?: boolean;
9
- signal?: AbortSignal;
10
- }
11
- /** Dependency-light Databricks JSON client with one rejected-token refresh. */
12
- export declare class DatabricksClient {
13
- readonly auth: AuthClient;
14
- private readonly fetcher;
15
- private constructor();
16
- static create(options?: DatabricksAuthOptions, dependencies?: DatabricksAuthDependencies): Promise<DatabricksClient>;
17
- profile(): string;
18
- host(): string;
19
- principal(): string;
20
- workspaceId(): string | undefined;
21
- request(path: string, options?: DatabricksRequestOptions): Promise<unknown>;
22
- private send;
23
- }