@dbx-tools/databricks 0.9.153 → 0.9.157
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/index.ts +5 -4
- package/lib/index.d.ts +5 -4
- package/lib/index.js +6 -5
- package/lib/src/cloud.d.ts +3 -3
- package/lib/src/cloud.js +15 -15
- package/lib/src/databricks-fs.js +18 -18
- package/lib/src/databricks-path.d.ts +0 -3
- package/lib/src/databricks-path.js +12 -14
- package/lib/src/net.d.ts +2 -2
- package/lib/src/net.js +6 -6
- package/lib/src/workspace-client.d.ts +2 -2
- package/lib/src/workspace-client.js +11 -11
- package/package.json +8 -56
- package/src/cloud.ts +29 -16
- package/src/databricks-fs.ts +18 -18
- package/src/databricks-path.ts +17 -14
- package/src/net.ts +12 -6
- package/src/workspace-client.ts +11 -11
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
* @module
|
|
7
7
|
*/
|
|
8
8
|
import { createWorkspaceClient as _createWorkspaceClient, } from "@databricks/appkit";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
9
|
+
import { tryGetExecutionContext } from "@dbx-tools/appkit";
|
|
10
|
+
import { createAuthClient } from "@dbx-tools/auth";
|
|
11
|
+
import { memoize, urlBuilder, trimToUndefined } from "@dbx-tools/shared-core";
|
|
12
12
|
/** Databricks workspace ids are a 10-20 digit run embedded in the host. */
|
|
13
13
|
const WORKSPACE_ID_REGEX = /\d{10,20}/;
|
|
14
14
|
const workspaceAuth = new WeakMap();
|
|
@@ -22,7 +22,7 @@ const workspaceAuth = new WeakMap();
|
|
|
22
22
|
* execution.
|
|
23
23
|
*/
|
|
24
24
|
export async function createWorkspaceClient(options = {}) {
|
|
25
|
-
const auth = await
|
|
25
|
+
const auth = await createAuthClient(options);
|
|
26
26
|
const client = _createWorkspaceClient({ host: auth.host });
|
|
27
27
|
client.config.credentials = {
|
|
28
28
|
name: "pat",
|
|
@@ -58,14 +58,14 @@ export function toLegacyWorkspaceClient(client) {
|
|
|
58
58
|
* construction happens at most once per process. Used only when there's no
|
|
59
59
|
* AppKit execution context to borrow a client from.
|
|
60
60
|
*/
|
|
61
|
-
const getDefaultWorkspaceClient =
|
|
61
|
+
const getDefaultWorkspaceClient = memoize(async () => (await createWorkspaceClient()).toLegacyWorkspaceClient());
|
|
62
62
|
/**
|
|
63
63
|
* The AppKit execution-context workspace client when available, otherwise
|
|
64
64
|
* `undefined`. Never constructs a fallback client and never throws for a
|
|
65
65
|
* missing AppKit scope.
|
|
66
66
|
*/
|
|
67
67
|
export function tryGetWorkspaceClient() {
|
|
68
|
-
return
|
|
68
|
+
return tryGetExecutionContext()?.client.toLegacyWorkspaceClient();
|
|
69
69
|
}
|
|
70
70
|
/**
|
|
71
71
|
* Resolve a {@link WorkspaceClient}: {@link tryGetWorkspaceClient} first, else
|
|
@@ -95,7 +95,7 @@ async function getWorkspaceConfig() {
|
|
|
95
95
|
* calls `currentUser.me()` on {@link client} (or {@link getWorkspaceClient}).
|
|
96
96
|
*/
|
|
97
97
|
export async function getCurrentUserName(client) {
|
|
98
|
-
const contextUser = readContextUserName(
|
|
98
|
+
const contextUser = readContextUserName(tryGetExecutionContext());
|
|
99
99
|
if (contextUser)
|
|
100
100
|
return contextUser;
|
|
101
101
|
const resolved = client ?? (await getWorkspaceClient());
|
|
@@ -111,7 +111,7 @@ function readContextUserName(ctx) {
|
|
|
111
111
|
if (typeof ctx !== "object" || ctx === null || !("userName" in ctx))
|
|
112
112
|
return undefined;
|
|
113
113
|
const value = ctx.userName;
|
|
114
|
-
return
|
|
114
|
+
return trimToUndefined(value);
|
|
115
115
|
}
|
|
116
116
|
/**
|
|
117
117
|
* Resolve the current workspace host as a `net.UrlBuilder`: the workspace
|
|
@@ -120,11 +120,11 @@ function readContextUserName(ctx) {
|
|
|
120
120
|
export async function getWorkspaceUrl() {
|
|
121
121
|
const config = await getWorkspaceConfig();
|
|
122
122
|
if (config) {
|
|
123
|
-
const configHost =
|
|
123
|
+
const configHost = urlBuilder(await config.getHost());
|
|
124
124
|
if (configHost)
|
|
125
125
|
return configHost;
|
|
126
126
|
}
|
|
127
|
-
const databricksHost =
|
|
127
|
+
const databricksHost = urlBuilder(process.env.DATABRICKS_HOST);
|
|
128
128
|
if (databricksHost)
|
|
129
129
|
return databricksHost;
|
|
130
130
|
return undefined;
|
|
@@ -146,4 +146,4 @@ export async function getWorkspaceId(workspaceHost) {
|
|
|
146
146
|
}
|
|
147
147
|
return undefined;
|
|
148
148
|
}
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2UtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFDTCxxQkFBcUIsSUFBSSxzQkFBc0IsR0FFaEQsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sSUFBSSxVQUFVLEVBQStDLE1BQU0saUJBQWlCLENBQUM7QUFDcEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekUsMkVBQTJFO0FBQzNFLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0FBQ3ZDLE1BQU0sYUFBYSxHQUFHLElBQUksT0FBTyxFQUFxQyxDQUFDO0FBTXZFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxxQkFBcUIsQ0FDekMsVUFBaUMsRUFBRTtJQUVuQyxNQUFNLElBQUksR0FBRyxNQUFNLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRztRQUMxQixJQUFJLEVBQUUsS0FBSztRQUNYLEtBQUssQ0FBQyxTQUFTO1lBQ2IsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQ3ZCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDakUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJ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RUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlO0lBQ25DLE1BQU0sTUFBTSxHQUFHLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQztJQUMxQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzFELElBQUksVUFBVTtZQUFFLE9BQU8sVUFBVSxDQUFDO0lBQ3BDLENBQUM7SUFDRCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbkUsSUFBSSxjQUFjO1FBQUUsT0FBTyxjQUFjLENBQUM7SUFDMUMsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxhQUFzQjtJQUN6RCxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQztJQUM5RCxJQUFJLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUNwQyxhQUFhLEdBQUcsYUFBYSxJQUFJLENBQUMsTUFBTSxlQUFlLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUNqRSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNvbHZlIHRoZSBjdXJyZW50IERhdGFicmlja3Mgd29ya3NwYWNlJ3MgVVJMLCBudW1lcmljIGlkLCBhbmQgY2xpZW50IGZyb21cbiAqIHRoZSBhY3RpdmUgZXhlY3V0aW9uIGNvbnRleHQgKEFwcEtpdCwgd2hlbiBpbml0aWFsaXplZCksIGEgZGVmYXVsdFxuICoge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0sIG9yIHRoZSBlbnZpcm9ubWVudC4gU2VydmVyLW9ubHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCBhcyBfY3JlYXRlV29ya3NwYWNlQ2xpZW50LFxuICB0eXBlIFdvcmtzcGFjZUNsaWVudCBhcyBBcHBLaXRXb3Jrc3BhY2VDbGllbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY2xpZW50IGFzIGF1dGhDbGllbnQsIHR5cGUgQXV0aENsaWVudCwgdHlwZSBEYXRhYnJpY2tzQXV0aE9wdGlvbnMgfSBmcm9tIFwiQGRieC10b29scy9hdXRoXCI7XG5pbXBvcnQgeyBmdW5jdGlvblV0aWxzLCBuZXQsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuLyoqIERhdGFicmlja3Mgd29ya3NwYWNlIGlkcyBhcmUgYSAxMC0yMCBkaWdpdCBydW4gZW1iZWRkZWQgaW4gdGhlIGhvc3QuICovXG5jb25zdCBXT1JLU1BBQ0VfSURfUkVHRVggPSAvXFxkezEwLDIwfS87XG5jb25zdCB3b3Jrc3BhY2VBdXRoID0gbmV3IFdlYWtNYXA8QXBwS2l0V29ya3NwYWNlQ2xpZW50LCBBdXRoQ2xpZW50PigpO1xuXG4vKiogTGVnYWN5IFNESyBjbGllbnQgZXhwb3NlZCBieSBBcHBLaXQgZm9yIEFQSXMgbm90IHlldCBvbiBpdHMgZmFjYWRlLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlQ2xpZW50ID0gUmV0dXJuVHlwZTxBcHBLaXRXb3Jrc3BhY2VDbGllbnRbXCJ0b0xlZ2FjeVdvcmtzcGFjZUNsaWVudFwiXT47XG50eXBlIENvbmZpZyA9IFdvcmtzcGFjZUNsaWVudFtcImNvbmZpZ1wiXTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gQXBwS2l0IHdvcmtzcGFjZSBjbGllbnQgd2hvc2UgU0RLIGNyZWRlbnRpYWwgdmlzaXRvciBkZWxlZ2F0ZXMgdG9cbiAqIGBAZGJ4LXRvb2xzL2F1dGhgLlxuICpcbiAqIFRoZSBhdXRoIHBhY2thZ2UgcmVzb2x2ZXMgdGhlIGFjdGl2ZSBwcm9maWxlLCBob3N0LCB0b2tlbiBsaWZlY3ljbGUsIGFuZFxuICogdW5pZmllZC13b3Jrc3BhY2UgaGVhZGVyIHdpdGhvdXQgcmVxdWlyaW5nIGNhbGxlcnMgdG8gbWlycm9yIHByb2ZpbGUgdmFsdWVzXG4gKiBpbnRvIGVudmlyb25tZW50IHZhcmlhYmxlcy4gVGhlIFNESyBzdGlsbCBvd25zIHdvcmtzcGFjZSBBUElzIGFuZCByZXF1ZXN0XG4gKiBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVXb3Jrc3BhY2VDbGllbnQoXG4gIG9wdGlvbnM6IERhdGFicmlja3NBdXRoT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxBcHBLaXRXb3Jrc3BhY2VDbGllbnQ+IHtcbiAgY29uc3QgYXV0aCA9IGF3YWl0IGF1dGhDbGllbnQuY3JlYXRlQXV0aENsaWVudChvcHRpb25zKTtcbiAgY29uc3QgY2xpZW50ID0gX2NyZWF0ZVdvcmtzcGFjZUNsaWVudCh7IGhvc3Q6IGF1dGguaG9zdCB9KTtcbiAgY2xpZW50LmNvbmZpZy5jcmVkZW50aWFscyA9IHtcbiAgICBuYW1lOiBcInBhdFwiLFxuICAgIGFzeW5jIGNvbmZpZ3VyZSgpIHtcbiAgICAgIHJldHVybiBhc3luYyAoaGVhZGVycykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXdhaXQgYXV0aC5oZWFkZXJzKCkpKSB7XG4gICAgICAgICAgaGVhZGVycy5zZXQobmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gIH07XG4gIHdvcmtzcGFjZUF1dGguc2V0KGNsaWVudCwgYXV0aCk7XG4gIHJldHVybiBjbGllbnQ7XG59XG5cbi8qKlxuICogUmVmcmVzaCB0aGUgZGJ4LXRvb2xzIGNyZWRlbnRpYWwgbGlmZWN5Y2xlIGF0dGFjaGVkIGJ5XG4gKiB7QGxpbmsgY3JlYXRlV29ya3NwYWNlQ2xpZW50fS4gUmV0dXJucyBgZmFsc2VgIGZvciBleHRlcm5hbGx5IHN1cHBsaWVkXG4gKiBBcHBLaXQgY2xpZW50cyB3aG9zZSBjcmVkZW50aWFsIG93bmVyIGlzIHVua25vd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZyZXNoV29ya3NwYWNlQ2xpZW50QXV0aGVudGljYXRpb24oXG4gIGNsaWVudDogQXBwS2l0V29ya3NwYWNlQ2xpZW50LFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGF1dGggPSB3b3Jrc3BhY2VBdXRoLmdldChjbGllbnQpO1xuICBpZiAoIWF1dGgpIHJldHVybiBmYWxzZTtcbiAgYXdhaXQgYXV0aC5oZWFkZXJzKHsgbG9naW46IGZhbHNlLCByZWZyZXNoOiB0cnVlIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFJlc29sdmUgQXBwS2l0J3MgZmFjYWRlIG9yIGFuIGV4aXN0aW5nIGxlZ2FjeSBjbGllbnQgdG8gdGhlIGxlZ2FjeSBTREsgc3VyZmFjZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0xlZ2FjeVdvcmtzcGFjZUNsaWVudChcbiAgY2xpZW50OiBBcHBLaXRXb3Jrc3BhY2VDbGllbnQgfCBXb3Jrc3BhY2VDbGllbnQsXG4pOiBXb3Jrc3BhY2VDbGllbnQge1xuICByZXR1cm4gXCJ0b0xlZ2FjeVdvcmtzcGFjZUNsaWVudFwiIGluIGNsaWVudCA/IGNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudCgpIDogY2xpZW50O1xufVxuXG4vKipcbiAqIExhemlseS1jb25zdHJ1Y3RlZCBkZWZhdWx0IGBXb3Jrc3BhY2VDbGllbnRgIChlbnYgLyBwcm9maWxlIGF1dGgpLCBtZW1vaXplZCBzb1xuICogY29uc3RydWN0aW9uIGhhcHBlbnMgYXQgbW9zdCBvbmNlIHBlciBwcm9jZXNzLiBVc2VkIG9ubHkgd2hlbiB0aGVyZSdzIG5vXG4gKiBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQgdG8gYm9ycm93IGEgY2xpZW50IGZyb20uXG4gKi9cbmNvbnN0IGdldERlZmF1bHRXb3Jrc3BhY2VDbGllbnQgPSBmdW5jdGlvblV0aWxzLm1lbW9pemUoYXN5bmMgKCkgPT5cbiAgKGF3YWl0IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpKS50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudCgpLFxuKTtcblxuLyoqXG4gKiBUaGUgQXBwS2l0IGV4ZWN1dGlvbi1jb250ZXh0IHdvcmtzcGFjZSBjbGllbnQgd2hlbiBhdmFpbGFibGUsIG90aGVyd2lzZVxuICogYHVuZGVmaW5lZGAuIE5ldmVyIGNvbnN0cnVjdHMgYSBmYWxsYmFjayBjbGllbnQgYW5kIG5ldmVyIHRocm93cyBmb3IgYVxuICogbWlzc2luZyBBcHBLaXQgc2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlHZXRXb3Jrc3BhY2VDbGllbnQoKTogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudCgpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fToge0BsaW5rIHRyeUdldFdvcmtzcGFjZUNsaWVudH0gZmlyc3QsIGVsc2VcbiAqIGEgbWVtb2l6ZWQgZGVmYXVsdCBjbGllbnQgZnJvbSBlbnYgLyBwcm9maWxlIGF1dGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VDbGllbnQoKTogUHJvbWlzZTxXb3Jrc3BhY2VDbGllbnQ+IHtcbiAgcmV0dXJuIHRyeUdldFdvcmtzcGFjZUNsaWVudCgpID8/IChhd2FpdCBnZXREZWZhdWx0V29ya3NwYWNlQ2xpZW50KCkpO1xufVxuXG4vKipcbiAqIFRoZSBhY3RpdmUgd29ya3NwYWNlIGBDb25maWdgOiB0aGUgQXBwS2l0IGV4ZWN1dGlvbi1jb250ZXh0IGNsaWVudCdzIGNvbmZpZ1xuICogd2hlbiBBcHBLaXQgaXMgaW5pdGlhbGl6ZWQsIGVsc2UgdGhlIGRlZmF1bHQgY2xpZW50J3MuIFJldHVybnMgYHVuZGVmaW5lZGBcbiAqIChuZXZlciB0aHJvd3MpIHdoZW4gbmVpdGhlciBpcyBhdmFpbGFibGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFdvcmtzcGFjZUNvbmZpZygpOiBQcm9taXNlPENvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiAoYXdhaXQgZ2V0V29ya3NwYWNlQ2xpZW50KCkpLmNvbmZpZztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEN1cnJlbnQgRGF0YWJyaWNrcyB1c2VybmFtZSBmb3Igd29ya3NwYWNlIGhvbWUgcGF0aHNcbiAqIChgL1dvcmtzcGFjZS9Vc2Vycy88dXNlck5hbWU+YCkuXG4gKlxuICogUHJlZmVycyBgdXNlck5hbWVgIG9uIHRoZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQgd2hlbiBzZXQsIG90aGVyd2lzZVxuICogY2FsbHMgYGN1cnJlbnRVc2VyLm1lKClgIG9uIHtAbGluayBjbGllbnR9IChvciB7QGxpbmsgZ2V0V29ya3NwYWNlQ2xpZW50fSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50VXNlck5hbWUoY2xpZW50PzogV29ya3NwYWNlQ2xpZW50KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29udGV4dFVzZXIgPSByZWFkQ29udGV4dFVzZXJOYW1lKGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCkpO1xuICBpZiAoY29udGV4dFVzZXIpIHJldHVybiBjb250ZXh0VXNlcjtcblxuICBjb25zdCByZXNvbHZlZCA9IGNsaWVudCA/PyAoYXdhaXQgZ2V0V29ya3NwYWNlQ2xpZW50KCkpO1xuICBjb25zdCBtZSA9IGF3YWl0IHJlc29sdmVkLmN1cnJlbnRVc2VyLm1lKCk7XG4gIGNvbnN0IHVzZXJOYW1lID0gbWUudXNlck5hbWU/LnRyaW0oKTtcbiAgaWYgKCF1c2VyTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGFicmlja3MgY3VycmVudFVzZXIubWUoKSBkaWQgbm90IHJldHVybiBhIHVzZXJOYW1lXCIpO1xuICB9XG4gIHJldHVybiB1c2VyTmFtZTtcbn1cblxuLyoqIEJlc3QtZWZmb3J0IGB1c2VyTmFtZWAgb2ZmIGFuIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCAoc2hhcGUgdmFyaWVzIGJ5IG1vZGUpLiAqL1xuZnVuY3Rpb24gcmVhZENvbnRleHRVc2VyTmFtZShjdHg6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIGN0eCAhPT0gXCJvYmplY3RcIiB8fCBjdHggPT09IG51bGwgfHwgIShcInVzZXJOYW1lXCIgaW4gY3R4KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdmFsdWUgPSAoY3R4IGFzIHsgdXNlck5hbWU/OiB1bmtub3duIH0pLnVzZXJOYW1lO1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBjdXJyZW50IHdvcmtzcGFjZSBob3N0IGFzIGEgYG5ldC5VcmxCdWlsZGVyYDogdGhlIHdvcmtzcGFjZVxuICogYENvbmZpZ2AgaG9zdCBmaXJzdCwgdGhlbiB0aGUgYERBVEFCUklDS1NfSE9TVGAgZW52IHZhciwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdvcmtzcGFjZVVybCgpOiBQcm9taXNlPG5ldC5VcmxCdWlsZGVyIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGdldFdvcmtzcGFjZUNvbmZpZygpO1xuICBpZiAoY29uZmlnKSB7XG4gICAgY29uc3QgY29uZmlnSG9zdCA9IG5ldC51cmxCdWlsZGVyKGF3YWl0IGNvbmZpZy5nZXRIb3N0KCkpO1xuICAgIGlmIChjb25maWdIb3N0KSByZXR1cm4gY29uZmlnSG9zdDtcbiAgfVxuICBjb25zdCBkYXRhYnJpY2tzSG9zdCA9IG5ldC51cmxCdWlsZGVyKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfSE9TVCk7XG4gIGlmIChkYXRhYnJpY2tzSG9zdCkgcmV0dXJuIGRhdGFicmlja3NIb3N0O1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIG51bWVyaWMgd29ya3NwYWNlIGlkOiB0aGUgd29ya3NwYWNlIGBDb25maWdgJ3MgYHdvcmtzcGFjZUlkYFxuICogZmlyc3QsIGVsc2UgdGhlIDEwLTIwIGRpZ2l0IHJ1biBvZiBgd29ya3NwYWNlSG9zdGAgKGRlZmF1bHRpbmcgdG9cbiAqIHtAbGluayBnZXRXb3Jrc3BhY2VVcmx9J3MgaG9zdCkuIGB1bmRlZmluZWRgIHdoZW4gbmVpdGhlciB5aWVsZHMgYW4gaWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VJZCh3b3Jrc3BhY2VIb3N0Pzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgd29ya3NwYWNlSWQgPSAoYXdhaXQgZ2V0V29ya3NwYWNlQ29uZmlnKCkpPy53b3Jrc3BhY2VJZDtcbiAgaWYgKHdvcmtzcGFjZUlkKSByZXR1cm4gd29ya3NwYWNlSWQ7XG4gIHdvcmtzcGFjZUhvc3QgPSB3b3Jrc3BhY2VIb3N0ID8/IChhd2FpdCBnZXRXb3Jrc3BhY2VVcmwoKSk/Lmhvc3Q7XG4gIGlmICh3b3Jrc3BhY2VIb3N0KSB7XG4gICAgY29uc3QgbWF0Y2ggPSB3b3Jrc3BhY2VIb3N0Lm1hdGNoKFdPUktTUEFDRV9JRF9SRUdFWCk/LlswXTtcbiAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2UtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFDTCxxQkFBcUIsSUFBSSxzQkFBc0IsR0FFaEQsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRCxPQUFPLEVBQStDLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEcsT0FBTyxFQUFFLE9BQU8sRUFBbUIsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9GLDJFQUEyRTtBQUMzRSxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQztBQUN2QyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBcUMsQ0FBQztBQU12RTs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLFVBQWlDLEVBQUU7SUFFbkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRztRQUMxQixJQUFJLEVBQUUsS0FBSztRQUNYLEtBQUssQ0FBQyxTQUFTO1lBQ2IsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQ3ZCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDakUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxD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LEdBQUcsTUFBTSxrQkFBa0IsRUFBRSxDQUFDO0lBQzFDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN0RCxJQUFJLFVBQVU7WUFBRSxPQUFPLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDL0QsSUFBSSxjQUFjO1FBQUUsT0FBTyxjQUFjLENBQUM7SUFDMUMsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxhQUFzQjtJQUN6RCxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQztJQUM5RCxJQUFJLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUNwQyxhQUFhLEdBQUcsYUFBYSxJQUFJLENBQUMsTUFBTSxlQUFlLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUNqRSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNvbHZlIHRoZSBjdXJyZW50IERhdGFicmlja3Mgd29ya3NwYWNlJ3MgVVJMLCBudW1lcmljIGlkLCBhbmQgY2xpZW50IGZyb21cbiAqIHRoZSBhY3RpdmUgZXhlY3V0aW9uIGNvbnRleHQgKEFwcEtpdCwgd2hlbiBpbml0aWFsaXplZCksIGEgZGVmYXVsdFxuICoge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0sIG9yIHRoZSBlbnZpcm9ubWVudC4gU2VydmVyLW9ubHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCBhcyBfY3JlYXRlV29ya3NwYWNlQ2xpZW50LFxuICB0eXBlIFdvcmtzcGFjZUNsaWVudCBhcyBBcHBLaXRXb3Jrc3BhY2VDbGllbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IHRyeUdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IHR5cGUgQXV0aENsaWVudCwgdHlwZSBEYXRhYnJpY2tzQXV0aE9wdGlvbnMsIGNyZWF0ZUF1dGhDbGllbnQgfSBmcm9tIFwiQGRieC10b29scy9hdXRoXCI7XG5pbXBvcnQgeyBtZW1vaXplLCB0eXBlIFVybEJ1aWxkZXIsIHVybEJ1aWxkZXIsIHRyaW1Ub1VuZGVmaW5lZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbi8qKiBEYXRhYnJpY2tzIHdvcmtzcGFjZSBpZHMgYXJlIGEgMTAtMjAgZGlnaXQgcnVuIGVtYmVkZGVkIGluIHRoZSBob3N0LiAqL1xuY29uc3QgV09SS1NQQUNFX0lEX1JFR0VYID0gL1xcZHsxMCwyMH0vO1xuY29uc3Qgd29ya3NwYWNlQXV0aCA9IG5ldyBXZWFrTWFwPEFwcEtpdFdvcmtzcGFjZUNsaWVudCwgQXV0aENsaWVudD4oKTtcblxuLyoqIExlZ2FjeSBTREsgY2xpZW50IGV4cG9zZWQgYnkgQXBwS2l0IGZvciBBUElzIG5vdCB5ZXQgb24gaXRzIGZhY2FkZS4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZUNsaWVudCA9IFJldHVyblR5cGU8QXBwS2l0V29ya3NwYWNlQ2xpZW50W1widG9MZWdhY3lXb3Jrc3BhY2VDbGllbnRcIl0+O1xudHlwZSBDb25maWcgPSBXb3Jrc3BhY2VDbGllbnRbXCJjb25maWdcIl07XG5cbi8qKlxuICogQ3JlYXRlIGFuIEFwcEtpdCB3b3Jrc3BhY2UgY2xpZW50IHdob3NlIFNESyBjcmVkZW50aWFsIHZpc2l0b3IgZGVsZWdhdGVzIHRvXG4gKiBgQGRieC10b29scy9hdXRoYC5cbiAqXG4gKiBUaGUgYXV0aCBwYWNrYWdlIHJlc29sdmVzIHRoZSBhY3RpdmUgcHJvZmlsZSwgaG9zdCwgdG9rZW4gbGlmZWN5Y2xlLCBhbmRcbiAqIHVuaWZpZWQtd29ya3NwYWNlIGhlYWRlciB3aXRob3V0IHJlcXVpcmluZyBjYWxsZXJzIHRvIG1pcnJvciBwcm9maWxlIHZhbHVlc1xuICogaW50byBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFRoZSBTREsgc3RpbGwgb3ducyB3b3Jrc3BhY2UgQVBJcyBhbmQgcmVxdWVzdFxuICogZXhlY3V0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlV29ya3NwYWNlQ2xpZW50KFxuICBvcHRpb25zOiBEYXRhYnJpY2tzQXV0aE9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8QXBwS2l0V29ya3NwYWNlQ2xpZW50PiB7XG4gIGNvbnN0IGF1dGggPSBhd2FpdCBjcmVhdGVBdXRoQ2xpZW50KG9wdGlvbnMpO1xuICBjb25zdCBjbGllbnQgPSBfY3JlYXRlV29ya3NwYWNlQ2xpZW50KHsgaG9zdDogYXV0aC5ob3N0IH0pO1xuICBjbGllbnQuY29uZmlnLmNyZWRlbnRpYWxzID0ge1xuICAgIG5hbWU6IFwicGF0XCIsXG4gICAgYXN5bmMgY29uZmlndXJlKCkge1xuICAgICAgcmV0dXJuIGFzeW5jIChoZWFkZXJzKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhd2FpdCBhdXRoLmhlYWRlcnMoKSkpIHtcbiAgICAgICAgICBoZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbiAgd29ya3NwYWNlQXV0aC5zZXQoY2xpZW50LCBhdXRoKTtcbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuLyoqXG4gKiBSZWZyZXNoIHRoZSBkYngtdG9vbHMgY3JlZGVudGlhbCBsaWZlY3ljbGUgYXR0YWNoZWQgYnlcbiAqIHtAbGluayBjcmVhdGVXb3Jrc3BhY2VDbGllbnR9LiBSZXR1cm5zIGBmYWxzZWAgZm9yIGV4dGVybmFsbHkgc3VwcGxpZWRcbiAqIEFwcEtpdCBjbGllbnRzIHdob3NlIGNyZWRlbnRpYWwgb3duZXIgaXMgdW5rbm93bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hXb3Jrc3BhY2VDbGllbnRBdXRoZW50aWNhdGlvbihcbiAgY2xpZW50OiBBcHBLaXRXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgYXV0aCA9IHdvcmtzcGFjZUF1dGguZ2V0KGNsaWVudCk7XG4gIGlmICghYXV0aCkgcmV0dXJuIGZhbHNlO1xuICBhd2FpdCBhdXRoLmhlYWRlcnMoeyBsb2dpbjogZmFsc2UsIHJlZnJlc2g6IHRydWUgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogUmVzb2x2ZSBBcHBLaXQncyBmYWNhZGUgb3IgYW4gZXhpc3RpbmcgbGVnYWN5IGNsaWVudCB0byB0aGUgbGVnYWN5IFNESyBzdXJmYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KFxuICBjbGllbnQ6IEFwcEtpdFdvcmtzcGFjZUNsaWVudCB8IFdvcmtzcGFjZUNsaWVudCxcbik6IFdvcmtzcGFjZUNsaWVudCB7XG4gIHJldHVybiBcInRvTGVnYWN5V29ya3NwYWNlQ2xpZW50XCIgaW4gY2xpZW50ID8gY2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KCkgOiBjbGllbnQ7XG59XG5cbi8qKlxuICogTGF6aWx5LWNvbnN0cnVjdGVkIGRlZmF1bHQgYFdvcmtzcGFjZUNsaWVudGAgKGVudiAvIHByb2ZpbGUgYXV0aCksIG1lbW9pemVkIHNvXG4gKiBjb25zdHJ1Y3Rpb24gaGFwcGVucyBhdCBtb3N0IG9uY2UgcGVyIHByb2Nlc3MuIFVzZWQgb25seSB3aGVuIHRoZXJlJ3Mgbm9cbiAqIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCB0byBib3Jyb3cgYSBjbGllbnQgZnJvbS5cbiAqL1xuY29uc3QgZ2V0RGVmYXVsdFdvcmtzcGFjZUNsaWVudCA9IG1lbW9pemUoYXN5bmMgKCkgPT5cbiAgKGF3YWl0IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpKS50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudCgpLFxuKTtcblxuLyoqXG4gKiBUaGUgQXBwS2l0IGV4ZWN1dGlvbi1jb250ZXh0IHdvcmtzcGFjZSBjbGllbnQgd2hlbiBhdmFpbGFibGUsIG90aGVyd2lzZVxuICogYHVuZGVmaW5lZGAuIE5ldmVyIGNvbnN0cnVjdHMgYSBmYWxsYmFjayBjbGllbnQgYW5kIG5ldmVyIHRocm93cyBmb3IgYVxuICogbWlzc2luZyBBcHBLaXQgc2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlHZXRXb3Jrc3BhY2VDbGllbnQoKTogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHtAbGluayBXb3Jrc3BhY2VDbGllbnR9OiB7QGxpbmsgdHJ5R2V0V29ya3NwYWNlQ2xpZW50fSBmaXJzdCwgZWxzZVxuICogYSBtZW1vaXplZCBkZWZhdWx0IGNsaWVudCBmcm9tIGVudiAvIHByb2ZpbGUgYXV0aC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdvcmtzcGFjZUNsaWVudCgpOiBQcm9taXNlPFdvcmtzcGFjZUNsaWVudD4ge1xuICByZXR1cm4gdHJ5R2V0V29ya3NwYWNlQ2xpZW50KCkgPz8gKGF3YWl0IGdldERlZmF1bHRXb3Jrc3BhY2VDbGllbnQoKSk7XG59XG5cbi8qKlxuICogVGhlIGFjdGl2ZSB3b3Jrc3BhY2UgYENvbmZpZ2A6IHRoZSBBcHBLaXQgZXhlY3V0aW9uLWNvbnRleHQgY2xpZW50J3MgY29uZmlnXG4gKiB3aGVuIEFwcEtpdCBpcyBpbml0aWFsaXplZCwgZWxzZSB0aGUgZGVmYXVsdCBjbGllbnQncy4gUmV0dXJucyBgdW5kZWZpbmVkYFxuICogKG5ldmVyIHRocm93cykgd2hlbiBuZWl0aGVyIGlzIGF2YWlsYWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V29ya3NwYWNlQ29uZmlnKCk6IFByb21pc2U8Q29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCBnZXRXb3Jrc3BhY2VDbGllbnQoKSkuY29uZmlnO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQ3VycmVudCBEYXRhYnJpY2tzIHVzZXJuYW1lIGZvciB3b3Jrc3BhY2UgaG9tZSBwYXRoc1xuICogKGAvV29ya3NwYWNlL1VzZXJzLzx1c2VyTmFtZT5gKS5cbiAqXG4gKiBQcmVmZXJzIGB1c2VyTmFtZWAgb24gdGhlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCB3aGVuIHNldCwgb3RoZXJ3aXNlXG4gKiBjYWxscyBgY3VycmVudFVzZXIubWUoKWAgb24ge0BsaW5rIGNsaWVudH0gKG9yIHtAbGluayBnZXRXb3Jrc3BhY2VDbGllbnR9KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyTmFtZShjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb250ZXh0VXNlciA9IHJlYWRDb250ZXh0VXNlck5hbWUodHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpKTtcbiAgaWYgKGNvbnRleHRVc2VyKSByZXR1cm4gY29udGV4dFVzZXI7XG5cbiAgY29uc3QgcmVzb2x2ZWQgPSBjbGllbnQgPz8gKGF3YWl0IGdldFdvcmtzcGFjZUNsaWVudCgpKTtcbiAgY29uc3QgbWUgPSBhd2FpdCByZXNvbHZlZC5jdXJyZW50VXNlci5tZSgpO1xuICBjb25zdCB1c2VyTmFtZSA9IG1lLnVzZXJOYW1lPy50cmltKCk7XG4gIGlmICghdXNlck5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYnJpY2tzIGN1cnJlbnRVc2VyLm1lKCkgZGlkIG5vdCByZXR1cm4gYSB1c2VyTmFtZVwiKTtcbiAgfVxuICByZXR1cm4gdXNlck5hbWU7XG59XG5cbi8qKiBCZXN0LWVmZm9ydCBgdXNlck5hbWVgIG9mZiBhbiBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQgKHNoYXBlIHZhcmllcyBieSBtb2RlKS4gKi9cbmZ1bmN0aW9uIHJlYWRDb250ZXh0VXNlck5hbWUoY3R4OiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBjdHggIT09IFwib2JqZWN0XCIgfHwgY3R4ID09PSBudWxsIHx8ICEoXCJ1c2VyTmFtZVwiIGluIGN0eCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHZhbHVlID0gKGN0eCBhcyB7IHVzZXJOYW1lPzogdW5rbm93biB9KS51c2VyTmFtZTtcbiAgcmV0dXJuIHRyaW1Ub1VuZGVmaW5lZCh2YWx1ZSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgY3VycmVudCB3b3Jrc3BhY2UgaG9zdCBhcyBhIGBuZXQuVXJsQnVpbGRlcmA6IHRoZSB3b3Jrc3BhY2VcbiAqIGBDb25maWdgIGhvc3QgZmlyc3QsIHRoZW4gdGhlIGBEQVRBQlJJQ0tTX0hPU1RgIGVudiB2YXIsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VVcmwoKTogUHJvbWlzZTxVcmxCdWlsZGVyIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGdldFdvcmtzcGFjZUNvbmZpZygpO1xuICBpZiAoY29uZmlnKSB7XG4gICAgY29uc3QgY29uZmlnSG9zdCA9IHVybEJ1aWxkZXIoYXdhaXQgY29uZmlnLmdldEhvc3QoKSk7XG4gICAgaWYgKGNvbmZpZ0hvc3QpIHJldHVybiBjb25maWdIb3N0O1xuICB9XG4gIGNvbnN0IGRhdGFicmlja3NIb3N0ID0gdXJsQnVpbGRlcihwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0hPU1QpO1xuICBpZiAoZGF0YWJyaWNrc0hvc3QpIHJldHVybiBkYXRhYnJpY2tzSG9zdDtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBudW1lcmljIHdvcmtzcGFjZSBpZDogdGhlIHdvcmtzcGFjZSBgQ29uZmlnYCdzIGB3b3Jrc3BhY2VJZGBcbiAqIGZpcnN0LCBlbHNlIHRoZSAxMC0yMCBkaWdpdCBydW4gb2YgYHdvcmtzcGFjZUhvc3RgIChkZWZhdWx0aW5nIHRvXG4gKiB7QGxpbmsgZ2V0V29ya3NwYWNlVXJsfSdzIGhvc3QpLiBgdW5kZWZpbmVkYCB3aGVuIG5laXRoZXIgeWllbGRzIGFuIGlkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V29ya3NwYWNlSWQod29ya3NwYWNlSG9zdD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHdvcmtzcGFjZUlkID0gKGF3YWl0IGdldFdvcmtzcGFjZUNvbmZpZygpKT8ud29ya3NwYWNlSWQ7XG4gIGlmICh3b3Jrc3BhY2VJZCkgcmV0dXJuIHdvcmtzcGFjZUlkO1xuICB3b3Jrc3BhY2VIb3N0ID0gd29ya3NwYWNlSG9zdCA/PyAoYXdhaXQgZ2V0V29ya3NwYWNlVXJsKCkpPy5ob3N0O1xuICBpZiAod29ya3NwYWNlSG9zdCkge1xuICAgIGNvbnN0IG1hdGNoID0gd29ya3NwYWNlSG9zdC5tYXRjaChXT1JLU1BBQ0VfSURfUkVHRVgpPy5bMF07XG4gICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2g7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -24,12 +24,12 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@databricks/appkit": "0.81.0",
|
|
27
|
-
"@dbx-tools/appkit": "^0.9.
|
|
28
|
-
"@dbx-tools/auth": "^0.9.
|
|
29
|
-
"@dbx-tools/cli-service": "^0.9.
|
|
30
|
-
"@dbx-tools/core": "^0.9.
|
|
31
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
32
|
-
"@dbx-tools/shared-fs": "^0.9.
|
|
27
|
+
"@dbx-tools/appkit": "^0.9.157",
|
|
28
|
+
"@dbx-tools/auth": "^0.9.157",
|
|
29
|
+
"@dbx-tools/cli-service": "^0.9.157",
|
|
30
|
+
"@dbx-tools/core": "^0.9.157",
|
|
31
|
+
"@dbx-tools/shared-core": "^0.9.157",
|
|
32
|
+
"@dbx-tools/shared-fs": "^0.9.157"
|
|
33
33
|
},
|
|
34
34
|
"main": "./lib/index.js",
|
|
35
35
|
"license": "Apache-2.0",
|
|
@@ -42,34 +42,10 @@
|
|
|
42
42
|
"types": "./lib/index.d.ts",
|
|
43
43
|
"default": "./lib/index.js"
|
|
44
44
|
},
|
|
45
|
-
"./cloud": {
|
|
46
|
-
"types": "./lib/src/cloud.d.ts",
|
|
47
|
-
"default": "./lib/src/cloud.js"
|
|
48
|
-
},
|
|
49
|
-
"./databricks-fs": {
|
|
50
|
-
"types": "./lib/src/databricks-fs.d.ts",
|
|
51
|
-
"default": "./lib/src/databricks-fs.js"
|
|
52
|
-
},
|
|
53
|
-
"./databricks-path": {
|
|
54
|
-
"types": "./lib/src/databricks-path.d.ts",
|
|
55
|
-
"default": "./lib/src/databricks-path.js"
|
|
56
|
-
},
|
|
57
|
-
"./net": {
|
|
58
|
-
"types": "./lib/src/net.d.ts",
|
|
59
|
-
"default": "./lib/src/net.js"
|
|
60
|
-
},
|
|
61
|
-
"./workspace-client": {
|
|
62
|
-
"types": "./lib/src/workspace-client.d.ts",
|
|
63
|
-
"default": "./lib/src/workspace-client.js"
|
|
64
|
-
},
|
|
65
|
-
"./*": {
|
|
66
|
-
"types": "./lib/src/*/index.d.ts",
|
|
67
|
-
"default": "./lib/src/*/index.js"
|
|
68
|
-
},
|
|
69
45
|
"./package.json": "./package.json"
|
|
70
46
|
}
|
|
71
47
|
},
|
|
72
|
-
"version": "0.9.
|
|
48
|
+
"version": "0.9.157",
|
|
73
49
|
"types": "./lib/index.d.ts",
|
|
74
50
|
"dbxToolsConfig": {
|
|
75
51
|
"tags": [
|
|
@@ -82,34 +58,10 @@
|
|
|
82
58
|
"types": "./lib/index.d.ts",
|
|
83
59
|
"default": "./lib/index.js"
|
|
84
60
|
},
|
|
85
|
-
"./cloud": {
|
|
86
|
-
"types": "./lib/src/cloud.d.ts",
|
|
87
|
-
"default": "./lib/src/cloud.js"
|
|
88
|
-
},
|
|
89
|
-
"./databricks-fs": {
|
|
90
|
-
"types": "./lib/src/databricks-fs.d.ts",
|
|
91
|
-
"default": "./lib/src/databricks-fs.js"
|
|
92
|
-
},
|
|
93
|
-
"./databricks-path": {
|
|
94
|
-
"types": "./lib/src/databricks-path.d.ts",
|
|
95
|
-
"default": "./lib/src/databricks-path.js"
|
|
96
|
-
},
|
|
97
|
-
"./net": {
|
|
98
|
-
"types": "./lib/src/net.d.ts",
|
|
99
|
-
"default": "./lib/src/net.js"
|
|
100
|
-
},
|
|
101
|
-
"./workspace-client": {
|
|
102
|
-
"types": "./lib/src/workspace-client.d.ts",
|
|
103
|
-
"default": "./lib/src/workspace-client.js"
|
|
104
|
-
},
|
|
105
|
-
"./*": {
|
|
106
|
-
"types": "./lib/src/*/index.d.ts",
|
|
107
|
-
"default": "./lib/src/*/index.js"
|
|
108
|
-
},
|
|
109
61
|
"./package.json": "./package.json"
|
|
110
62
|
},
|
|
111
63
|
"files": [
|
|
112
|
-
"index
|
|
64
|
+
"index*.ts",
|
|
113
65
|
"src",
|
|
114
66
|
"lib"
|
|
115
67
|
],
|
package/src/cloud.ts
CHANGED
|
@@ -23,8 +23,21 @@ import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
|
23
23
|
import { tmpdir } from "node:os";
|
|
24
24
|
import { dirname, join } from "node:path";
|
|
25
25
|
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
26
|
+
import { statSync } from "@dbx-tools/core";
|
|
27
|
+
import {
|
|
28
|
+
log,
|
|
29
|
+
toError,
|
|
30
|
+
memoize,
|
|
31
|
+
fnvHash,
|
|
32
|
+
id,
|
|
33
|
+
createFetchError,
|
|
34
|
+
parse,
|
|
35
|
+
type Cidr,
|
|
36
|
+
type UrlLike,
|
|
37
|
+
parseIp,
|
|
38
|
+
findContainingCidr,
|
|
39
|
+
parseCidr,
|
|
40
|
+
} from "@dbx-tools/shared-core";
|
|
28
41
|
import { resolveHostIps } from "./net.ts";
|
|
29
42
|
|
|
30
43
|
const logger = log.logger("cloud");
|
|
@@ -67,7 +80,7 @@ export interface CloudLocation {
|
|
|
67
80
|
}
|
|
68
81
|
|
|
69
82
|
/** A parsed CIDR block tagged with the region it belongs to. */
|
|
70
|
-
interface RegionCidr extends
|
|
83
|
+
interface RegionCidr extends Cidr {
|
|
71
84
|
region: string;
|
|
72
85
|
}
|
|
73
86
|
|
|
@@ -96,7 +109,7 @@ interface ProviderRanges {
|
|
|
96
109
|
* // { provider: CloudProvider.Aws,
|
|
97
110
|
* // region: "us-west-2", ip: "...", cidr: "..." }
|
|
98
111
|
*/
|
|
99
|
-
export async function resolveCloudLocation(input:
|
|
112
|
+
export async function resolveCloudLocation(input: UrlLike): Promise<CloudLocation | null> {
|
|
100
113
|
const ips = await resolveHostIps(input);
|
|
101
114
|
if (ips.length === 0) {
|
|
102
115
|
logger.debug("no ips resolved", { input: String(input) });
|
|
@@ -104,10 +117,10 @@ export async function resolveCloudLocation(input: net.UrlLike): Promise<CloudLoc
|
|
|
104
117
|
}
|
|
105
118
|
const providers = await loadProviderRanges();
|
|
106
119
|
for (const ip of ips) {
|
|
107
|
-
const parsed =
|
|
120
|
+
const parsed = parseIp(ip);
|
|
108
121
|
if (!parsed) continue;
|
|
109
122
|
for (const { provider, ranges } of providers) {
|
|
110
|
-
const match =
|
|
123
|
+
const match = findContainingCidr(parsed, ranges);
|
|
111
124
|
if (match) {
|
|
112
125
|
return { provider, region: match.region, ip, cidr: match.cidr };
|
|
113
126
|
}
|
|
@@ -132,7 +145,7 @@ export async function loadProviderRanges(): Promise<ProviderRanges[]> {
|
|
|
132
145
|
if (result.status === "fulfilled") {
|
|
133
146
|
out.push(result.value);
|
|
134
147
|
} else {
|
|
135
|
-
logger.warn("provider range load failed", { error:
|
|
148
|
+
logger.warn("provider range load failed", { error: toError(result.reason) });
|
|
136
149
|
}
|
|
137
150
|
}
|
|
138
151
|
return out;
|
|
@@ -142,9 +155,9 @@ export async function loadProviderRanges(): Promise<ProviderRanges[]> {
|
|
|
142
155
|
// Per-provider cached loaders
|
|
143
156
|
// ────────────────────────────────────────────────────────────────
|
|
144
157
|
|
|
145
|
-
const loadAwsRanges =
|
|
146
|
-
const loadAzureRanges =
|
|
147
|
-
const loadGcpRanges =
|
|
158
|
+
const loadAwsRanges = memoize(fetchAwsRanges, { ttlMs: RANGE_CACHE_TTL_MS });
|
|
159
|
+
const loadAzureRanges = memoize(fetchAzureRanges, { ttlMs: RANGE_CACHE_TTL_MS });
|
|
160
|
+
const loadGcpRanges = memoize(fetchGcpRanges, { ttlMs: RANGE_CACHE_TTL_MS });
|
|
148
161
|
|
|
149
162
|
// ────────────────────────────────────────────────────────────────
|
|
150
163
|
// Provider feed fetch + parse
|
|
@@ -233,7 +246,7 @@ async function fetchAzureRanges(): Promise<ProviderRanges> {
|
|
|
233
246
|
/** Parse `cidr` and, when valid and `region` is set, push a tagged range. */
|
|
234
247
|
function addRange(ranges: RegionCidr[], cidr?: string, region?: string): void {
|
|
235
248
|
if (!cidr || !region) return;
|
|
236
|
-
const parsed =
|
|
249
|
+
const parsed = parseCidr(cidr);
|
|
237
250
|
if (parsed) ranges.push({ ...parsed, region });
|
|
238
251
|
}
|
|
239
252
|
|
|
@@ -245,7 +258,7 @@ function addRange(ranges: RegionCidr[], cidr?: string, region?: string): void {
|
|
|
245
258
|
*/
|
|
246
259
|
async function fetchJson<T>(url: string): Promise<T> {
|
|
247
260
|
const text = await fetchText(url);
|
|
248
|
-
const parsed =
|
|
261
|
+
const parsed = parse<T>(text);
|
|
249
262
|
if (parsed === undefined) {
|
|
250
263
|
throw new Error(`range feed returned non-JSON content: ${url}`);
|
|
251
264
|
}
|
|
@@ -262,7 +275,7 @@ async function fetchJson<T>(url: string): Promise<T> {
|
|
|
262
275
|
async function fetchText(url: string): Promise<string> {
|
|
263
276
|
const cacheDir = join(tmpdir(), "dbx-tools", "shared", "cloud");
|
|
264
277
|
const cacheDirCreated = await mkdir(cacheDir, { recursive: true });
|
|
265
|
-
const cachePath = join(cacheDir, `fetch-${
|
|
278
|
+
const cachePath = join(cacheDir, `fetch-${fnvHash(url)}.txt`);
|
|
266
279
|
const createdAt = cacheDirCreated ? undefined : await getCreated(cachePath);
|
|
267
280
|
if (createdAt) {
|
|
268
281
|
const expiresAt = new Date(createdAt.getTime() + RANGE_CACHE_TTL_MS);
|
|
@@ -271,11 +284,11 @@ async function fetchText(url: string): Promise<string> {
|
|
|
271
284
|
return readFile(cachePath, "utf8");
|
|
272
285
|
}
|
|
273
286
|
}
|
|
274
|
-
let tempPath: string | null = join(cacheDir, `${
|
|
287
|
+
let tempPath: string | null = join(cacheDir, `${id()}.txt`);
|
|
275
288
|
try {
|
|
276
289
|
const response = await fetch(url);
|
|
277
290
|
if (!response.ok) {
|
|
278
|
-
throw await
|
|
291
|
+
throw await createFetchError(response, url);
|
|
279
292
|
}
|
|
280
293
|
const responseText = await response.text();
|
|
281
294
|
await mkdir(dirname(tempPath), { recursive: true });
|
|
@@ -294,5 +307,5 @@ async function fetchText(url: string): Promise<string> {
|
|
|
294
307
|
|
|
295
308
|
/** Birth time of `path`, or `undefined` when it doesn't exist yet. */
|
|
296
309
|
async function getCreated(path: string): Promise<Date | undefined> {
|
|
297
|
-
return (await
|
|
310
|
+
return (await statSync(path))?.birthtime;
|
|
298
311
|
}
|
package/src/databricks-fs.ts
CHANGED
|
@@ -13,19 +13,19 @@
|
|
|
13
13
|
* @module
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import {
|
|
16
|
+
import { fnvHash, toDate } from "@dbx-tools/shared-core";
|
|
17
17
|
import {
|
|
18
18
|
BaseFileSystem,
|
|
19
|
-
baseFS,
|
|
20
19
|
FileSystemError,
|
|
21
|
-
posixPath,
|
|
22
20
|
type CopyOptions,
|
|
23
21
|
type FileEntry,
|
|
24
22
|
type FileStat,
|
|
25
23
|
type WriteFileOptions,
|
|
24
|
+
mapFileSystemError,
|
|
25
|
+
isHomeRelativePath,
|
|
26
|
+
basename,
|
|
26
27
|
} from "@dbx-tools/shared-fs";
|
|
27
28
|
import {
|
|
28
|
-
isHomeRelativePath,
|
|
29
29
|
normalizeDatabricksRoot,
|
|
30
30
|
resolveDatabricksFilesBackend,
|
|
31
31
|
resolveDatabricksRoot,
|
|
@@ -121,7 +121,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
|
|
|
121
121
|
constructor(options: DatabricksFileSystemOptions) {
|
|
122
122
|
const root = normalizeDatabricksRoot(options.root, { userName: options.userName });
|
|
123
123
|
super({
|
|
124
|
-
id: options.id ?? `databricks-${
|
|
124
|
+
id: options.id ?? `databricks-${fnvHash(root)}`,
|
|
125
125
|
backend: "databricks",
|
|
126
126
|
root,
|
|
127
127
|
readOnly: options.readOnly,
|
|
@@ -174,7 +174,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
|
|
|
174
174
|
},
|
|
175
175
|
});
|
|
176
176
|
} catch (error) {
|
|
177
|
-
throw
|
|
177
|
+
throw mapFileSystemError(error, resolvedPath);
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
|
|
@@ -206,7 +206,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
|
|
|
206
206
|
}),
|
|
207
207
|
});
|
|
208
208
|
} catch (error) {
|
|
209
|
-
throw
|
|
209
|
+
throw mapFileSystemError(error, resolvedPath);
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
212
|
|
|
@@ -306,13 +306,13 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
|
|
|
306
306
|
return this.dispatch<FileEntry[]>(resolvedPath, {
|
|
307
307
|
dbfs: (client) =>
|
|
308
308
|
collect(client.dbfs.list({ path: resolvedPath }), (info) => ({
|
|
309
|
-
name:
|
|
309
|
+
name: basename(info.path ?? ""),
|
|
310
310
|
type: info.is_dir ? "directory" : "file",
|
|
311
311
|
size: info.file_size,
|
|
312
312
|
})),
|
|
313
313
|
workspace: (client) =>
|
|
314
314
|
collect(client.workspace.list({ path: resolvedPath }), (info) => ({
|
|
315
|
-
name:
|
|
315
|
+
name: basename(info.path ?? ""),
|
|
316
316
|
type: info.object_type === "DIRECTORY" ? "directory" : "file",
|
|
317
317
|
metadata: {
|
|
318
318
|
createdAt: info.created_at,
|
|
@@ -322,7 +322,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
|
|
|
322
322
|
})),
|
|
323
323
|
volumes: (client) =>
|
|
324
324
|
collect(client.files.listDirectoryContents({ directory_path: resolvedPath }), (entry) => ({
|
|
325
|
-
name: entry.name ??
|
|
325
|
+
name: entry.name ?? basename(entry.path ?? ""),
|
|
326
326
|
type: entry.is_directory ? "directory" : "file",
|
|
327
327
|
size: entry.file_size,
|
|
328
328
|
})),
|
|
@@ -330,13 +330,13 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
|
|
|
330
330
|
}
|
|
331
331
|
|
|
332
332
|
protected override async statAt(resolvedPath: string): Promise<Omit<FileStat, "path">> {
|
|
333
|
-
const fallbackName =
|
|
333
|
+
const fallbackName = basename(resolvedPath) || basename(this.root);
|
|
334
334
|
return this.dispatch<Omit<FileStat, "path">>(resolvedPath, {
|
|
335
335
|
dbfs: async (client) => {
|
|
336
336
|
const info = await client.dbfs.getStatus({ path: resolvedPath });
|
|
337
|
-
const modified =
|
|
337
|
+
const modified = toDate(info.modification_time);
|
|
338
338
|
return {
|
|
339
|
-
name:
|
|
339
|
+
name: basename(info.path ?? resolvedPath) || fallbackName,
|
|
340
340
|
type: info.is_dir ? "directory" : "file",
|
|
341
341
|
size: info.file_size,
|
|
342
342
|
createdAt: modified,
|
|
@@ -346,10 +346,10 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
|
|
|
346
346
|
workspace: async (client) => {
|
|
347
347
|
const info = await client.workspace.getStatus({ path: resolvedPath });
|
|
348
348
|
return {
|
|
349
|
-
name:
|
|
349
|
+
name: basename(info.path ?? resolvedPath) || fallbackName,
|
|
350
350
|
type: info.object_type === "DIRECTORY" ? "directory" : "file",
|
|
351
|
-
createdAt:
|
|
352
|
-
modifiedAt:
|
|
351
|
+
createdAt: toDate(info.created_at),
|
|
352
|
+
modifiedAt: toDate(info.modified_at),
|
|
353
353
|
};
|
|
354
354
|
},
|
|
355
355
|
volumes: (client) => this.statVolumePath(client, resolvedPath, fallbackName),
|
|
@@ -416,7 +416,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
|
|
|
416
416
|
): Promise<Omit<FileStat, "path">> {
|
|
417
417
|
try {
|
|
418
418
|
const metadata = await client.files.getMetadata({ file_path: absolutePath });
|
|
419
|
-
const modified =
|
|
419
|
+
const modified = toDate(metadata["last-modified"]);
|
|
420
420
|
return {
|
|
421
421
|
name: fallbackName,
|
|
422
422
|
type: "file",
|
|
@@ -428,7 +428,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
|
|
|
428
428
|
} catch (fileErr) {
|
|
429
429
|
// A directory has no file metadata, and an unreadable one reports as
|
|
430
430
|
// missing / denied - both are worth a directory probe before failing.
|
|
431
|
-
const code =
|
|
431
|
+
const code = mapFileSystemError(fileErr, absolutePath).code;
|
|
432
432
|
if (code !== "NOT_FOUND" && code !== "PERMISSION_DENIED") throw fileErr;
|
|
433
433
|
await client.files.getDirectoryMetadata({ directory_path: absolutePath });
|
|
434
434
|
return { name: fallbackName, type: "directory" };
|
package/src/databricks-path.ts
CHANGED
|
@@ -11,7 +11,13 @@
|
|
|
11
11
|
* @module
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
isHomeRelativePath,
|
|
16
|
+
toPosix,
|
|
17
|
+
expandHome,
|
|
18
|
+
normalizeRoot,
|
|
19
|
+
isAbsolute,
|
|
20
|
+
} from "@dbx-tools/shared-fs";
|
|
15
21
|
import { getCurrentUserName, type WorkspaceClient } from "./workspace-client.ts";
|
|
16
22
|
|
|
17
23
|
/** Which Databricks Files API serves an absolute path. */
|
|
@@ -37,9 +43,6 @@ export interface ResolveDatabricksRootOptions {
|
|
|
37
43
|
client?: WorkspaceClient;
|
|
38
44
|
}
|
|
39
45
|
|
|
40
|
-
/** True when {@link input} is `~` or a path under `~/`. See {@link posixPath.isHomeRelativePath}. */
|
|
41
|
-
export const isHomeRelativePath = posixPath.isHomeRelativePath;
|
|
42
|
-
|
|
43
46
|
/**
|
|
44
47
|
* Expand `~` / `~/...` to `/Workspace/Users/<userName>/...`.
|
|
45
48
|
* Non-home inputs are returned unchanged (POSIX separators only).
|
|
@@ -50,9 +53,9 @@ export function expandHomePath(input: string, userName: string): string {
|
|
|
50
53
|
throw new TypeError("Databricks home expansion requires a non-empty userName");
|
|
51
54
|
}
|
|
52
55
|
if (!isHomeRelativePath(input)) {
|
|
53
|
-
return
|
|
56
|
+
return toPosix(input.trim());
|
|
54
57
|
}
|
|
55
|
-
return
|
|
58
|
+
return expandHome(input, `/Workspace/Users/${name}`);
|
|
56
59
|
}
|
|
57
60
|
|
|
58
61
|
/**
|
|
@@ -80,26 +83,26 @@ export function normalizeDatabricksRoot(
|
|
|
80
83
|
`Databricks home path "${root}" requires userName; use resolveDatabricksRoot() or pass userName`,
|
|
81
84
|
);
|
|
82
85
|
}
|
|
83
|
-
return
|
|
86
|
+
return normalizeRoot(expandHomePath(trimmed, options.userName));
|
|
84
87
|
}
|
|
85
88
|
|
|
86
89
|
const threePart = VOLUME_THREE_PART.exec(trimmed);
|
|
87
90
|
if (threePart) {
|
|
88
|
-
return
|
|
91
|
+
return normalizeRoot(`/Volumes/${threePart[1]}/${threePart[2]}/${threePart[3]}`);
|
|
89
92
|
}
|
|
90
93
|
|
|
91
|
-
let posix =
|
|
94
|
+
let posix = toPosix(trimmed);
|
|
92
95
|
if (posix === "/Volume" || posix.startsWith("/Volume/")) {
|
|
93
96
|
posix = `/Volumes${posix.slice("/Volume".length)}`;
|
|
94
97
|
}
|
|
95
98
|
|
|
96
|
-
if (!
|
|
99
|
+
if (!isAbsolute(posix)) {
|
|
97
100
|
throw new TypeError(
|
|
98
101
|
`Databricks filesystem root must be absolute, catalog.schema.volume, or ~, got: ${root}`,
|
|
99
102
|
);
|
|
100
103
|
}
|
|
101
104
|
|
|
102
|
-
return
|
|
105
|
+
return normalizeRoot(posix);
|
|
103
106
|
}
|
|
104
107
|
|
|
105
108
|
/**
|
|
@@ -119,7 +122,7 @@ export async function resolveDatabricksRoot(
|
|
|
119
122
|
|
|
120
123
|
/** True when {@link absolutePath} is served by the workspace objects API. */
|
|
121
124
|
export function isWorkspaceFilesPath(absolutePath: string): boolean {
|
|
122
|
-
const p =
|
|
125
|
+
const p = toPosix(absolutePath);
|
|
123
126
|
return (
|
|
124
127
|
p === "/Workspace" ||
|
|
125
128
|
p.startsWith("/Workspace/") ||
|
|
@@ -131,13 +134,13 @@ export function isWorkspaceFilesPath(absolutePath: string): boolean {
|
|
|
131
134
|
|
|
132
135
|
/** True when {@link absolutePath} is a Unity Catalog volume path. */
|
|
133
136
|
export function isVolumesPath(absolutePath: string): boolean {
|
|
134
|
-
const p =
|
|
137
|
+
const p = toPosix(absolutePath);
|
|
135
138
|
return p === "/Volumes" || p.startsWith("/Volumes/");
|
|
136
139
|
}
|
|
137
140
|
|
|
138
141
|
/** True when {@link absolutePath} is a DBFS path. */
|
|
139
142
|
export function isDbfsPath(absolutePath: string): boolean {
|
|
140
|
-
const p =
|
|
143
|
+
const p = toPosix(absolutePath);
|
|
141
144
|
return p === "/dbfs" || p.startsWith("/dbfs/");
|
|
142
145
|
}
|
|
143
146
|
|
package/src/net.ts
CHANGED
|
@@ -8,14 +8,20 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { lookup } from "node:dns/promises";
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
memoize,
|
|
13
|
+
createFetchError,
|
|
14
|
+
type UrlLike,
|
|
15
|
+
urlBuilder,
|
|
16
|
+
parseIp,
|
|
17
|
+
} from "@dbx-tools/shared-core";
|
|
12
18
|
|
|
13
19
|
/**
|
|
14
20
|
* This process's outbound public IP, cached for 5 minutes. Asks Cloudflare's
|
|
15
21
|
* `cdn-cgi/trace` first and falls back to ipify. Useful for allowlisting or for
|
|
16
22
|
* reasoning about egress from a Databricks App.
|
|
17
23
|
*/
|
|
18
|
-
export const getPublicIp =
|
|
24
|
+
export const getPublicIp = memoize(
|
|
19
25
|
async () => {
|
|
20
26
|
const cloudflareResponse = await fetch("https://cloudflare.com/cdn-cgi/trace");
|
|
21
27
|
if (cloudflareResponse.ok) {
|
|
@@ -30,7 +36,7 @@ export const getPublicIp = functionUtils.memoize(
|
|
|
30
36
|
}
|
|
31
37
|
const ipifyResponse = await fetch("https://api.ipify.org?format=json");
|
|
32
38
|
if (!ipifyResponse.ok) {
|
|
33
|
-
throw await
|
|
39
|
+
throw await createFetchError(ipifyResponse);
|
|
34
40
|
}
|
|
35
41
|
const ipifyData = (await ipifyResponse.json()) as { ip?: string };
|
|
36
42
|
const ip = ipifyData?.ip;
|
|
@@ -53,11 +59,11 @@ export const getPublicIp = functionUtils.memoize(
|
|
|
53
59
|
* platform resolver order are honored, matching what an outbound connection to
|
|
54
60
|
* the host would actually use.
|
|
55
61
|
*/
|
|
56
|
-
export async function resolveHostIps(input:
|
|
57
|
-
const host =
|
|
62
|
+
export async function resolveHostIps(input: UrlLike): Promise<string[]> {
|
|
63
|
+
const host = urlBuilder(input)?.hostname;
|
|
58
64
|
if (!host) return [];
|
|
59
65
|
// WHATWG `URL.hostname` brackets IPv6 literals; strip before parsing.
|
|
60
|
-
const literal =
|
|
66
|
+
const literal = parseIp(host.replace(/^\[|\]$/g, ""));
|
|
61
67
|
if (literal) return [host.replace(/^\[|\]$/g, "")];
|
|
62
68
|
try {
|
|
63
69
|
const results = await lookup(host, { all: true });
|