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