@dbx-tools/tunnel 0.6.111 → 0.6.113
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 +2 -0
- package/index.ts +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/src/frp.d.ts +6 -0
- package/lib/src/frp.js +15 -3
- package/lib/src/interceptor.d.ts +4 -0
- package/lib/src/interceptor.js +11 -1
- package/lib/src/path-proxy.d.ts +4 -0
- package/lib/src/path-proxy.js +37 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -8
- package/src/frp.ts +23 -2
- package/src/interceptor.ts +15 -0
- package/src/path-proxy.ts +43 -0
package/README.md
CHANGED
|
@@ -158,6 +158,8 @@ without touching code.
|
|
|
158
158
|
| `FRP_PROTOCOL` | `wss` |
|
|
159
159
|
| `FRP_TOKEN` | unset (no frps auth) |
|
|
160
160
|
| `FRP_PROXY_NAME` | public domain's first label |
|
|
161
|
+
| `FRP_PATH` | `DATABRICKS_APP_NAME` |
|
|
162
|
+
| `FRP_STRIP_PREFIX` | `true` for non-root paths |
|
|
161
163
|
| `TUNNEL_FORWARD_HEADERS` | the built-in `x-` allow-list |
|
|
162
164
|
| `TUNNEL_AUTH_JWT_SECRET` | an ephemeral per-process key |
|
|
163
165
|
|
package/index.ts
CHANGED
|
@@ -10,6 +10,7 @@ export * as gate from "./src/gate.ts";
|
|
|
10
10
|
export * as headers from "./src/headers.ts";
|
|
11
11
|
export * as interceptor from "./src/interceptor.ts";
|
|
12
12
|
export * as loginPage from "./src/login-page.ts";
|
|
13
|
+
export * as pathProxy from "./src/path-proxy.ts";
|
|
13
14
|
export * as plugin from "./src/plugin.ts";
|
|
14
15
|
export * as portr from "./src/portr.ts";
|
|
15
16
|
export * as sendCode from "./src/send-code.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export * as gate from "./src/gate.ts";
|
|
|
6
6
|
export * as headers from "./src/headers.ts";
|
|
7
7
|
export * as interceptor from "./src/interceptor.ts";
|
|
8
8
|
export * as loginPage from "./src/login-page.ts";
|
|
9
|
+
export * as pathProxy from "./src/path-proxy.ts";
|
|
9
10
|
export * as plugin from "./src/plugin.ts";
|
|
10
11
|
export * as portr from "./src/portr.ts";
|
|
11
12
|
export * as sendCode from "./src/send-code.ts";
|
package/lib/index.js
CHANGED
|
@@ -9,6 +9,7 @@ export * as gate from "./src/gate.js";
|
|
|
9
9
|
export * as headers from "./src/headers.js";
|
|
10
10
|
export * as interceptor from "./src/interceptor.js";
|
|
11
11
|
export * as loginPage from "./src/login-page.js";
|
|
12
|
+
export * as pathProxy from "./src/path-proxy.js";
|
|
12
13
|
export * as plugin from "./src/plugin.js";
|
|
13
14
|
export * as portr from "./src/portr.js";
|
|
14
15
|
export * as sendCode from "./src/send-code.js";
|
|
@@ -17,4 +18,4 @@ export { AUTH_PREFIX, UNAUTHORIZED_BODY } from "./src/gate.js";
|
|
|
17
18
|
export { PROTECTED_HEADERS, DEFAULT_FORWARD_HEADERS } from "./src/headers.js";
|
|
18
19
|
export { AuthGatePlugin, authGate } from "./src/plugin.js";
|
|
19
20
|
export { KEY_TTL_SECONDS } from "./src/signing-key.js";
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBR25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJOUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUczRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL3R1bm5lbFwiO1xuZXhwb3J0ICogYXMgYWxsb3dsaXN0IGZyb20gXCIuL3NyYy9hbGxvd2xpc3QudHNcIjtcbmV4cG9ydCAqIGFzIGNvZGVFbWFpbCBmcm9tIFwiLi9zcmMvY29kZS1lbWFpbC50c1wiO1xuZXhwb3J0ICogYXMgZnJwIGZyb20gXCIuL3NyYy9mcnAudHNcIjtcbmV4cG9ydCAqIGFzIGdhdGUgZnJvbSBcIi4vc3JjL2dhdGUudHNcIjtcbmV4cG9ydCAqIGFzIGhlYWRlcnMgZnJvbSBcIi4vc3JjL2hlYWRlcnMudHNcIjtcbmV4cG9ydCAqIGFzIGludGVyY2VwdG9yIGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0ICogYXMgbG9naW5QYWdlIGZyb20gXCIuL3NyYy9sb2dpbi1wYWdlLnRzXCI7XG5leHBvcnQgKiBhcyBwYXRoUHJveHkgZnJvbSBcIi4vc3JjL3BhdGgtcHJveHkudHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBwb3J0ciBmcm9tIFwiLi9zcmMvcG9ydHIudHNcIjtcbmV4cG9ydCAqIGFzIHNlbmRDb2RlIGZyb20gXCIuL3NyYy9zZW5kLWNvZGUudHNcIjtcbmV4cG9ydCAqIGFzIHNpZ25pbmdLZXkgZnJvbSBcIi4vc3JjL3NpZ25pbmcta2V5LnRzXCI7XG5leHBvcnQgdHlwZSB7IENvZGVDb3B5IH0gZnJvbSBcIi4vc3JjL2NvZGUtZW1haWwudHNcIjtcbmV4cG9ydCB0eXBlIHsgRnJwSW5zdGFsbE9wdGlvbnMsIEZycENvbmZpZyB9IGZyb20gXCIuL3NyYy9mcnAudHNcIjtcbmV4cG9ydCB7IEFVVEhfUFJFRklYLCBVTkFVVEhPUklaRURfQk9EWSB9IGZyb20gXCIuL3NyYy9nYXRlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEdhdGVPcHRpb25zLCBHYXRlQWN0aW9uIH0gZnJvbSBcIi4vc3JjL2dhdGUudHNcIjtcbmV4cG9ydCB7IFBST1RFQ1RFRF9IRUFERVJTLCBERUZBVUxUX0ZPUldBUkRfSEVBREVSUyB9IGZyb20gXCIuL3NyYy9oZWFkZXJzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEhlYWRlclBvbGljeSB9IGZyb20gXCIuL3NyYy9oZWFkZXJzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFR1bm5lbEludGVyY2VwdG9yT3B0aW9ucywgVHVubmVsVHJhbnNwb3J0IH0gZnJvbSBcIi4vc3JjL2ludGVyY2VwdG9yLnRzXCI7XG5leHBvcnQgdHlwZSB7IExvZ2luUGFnZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvbG9naW4tcGFnZS50c1wiO1xuZXhwb3J0IHsgQXV0aEdhdGVQbHVnaW4sIGF1dGhHYXRlIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRoR2F0ZUNvbmZpZywgU2VuZENvZGVPcHRpb25zLCBSZXNvbHZlZEF1dGhHYXRlQ29uZmlnLCBBdXRoR2F0ZUFwaSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgUG9ydHJJbnN0YWxsT3B0aW9ucywgUG9ydHJDb25maWcgfSBmcm9tIFwiLi9zcmMvcG9ydHIudHNcIjtcbmV4cG9ydCB7IEtFWV9UVExfU0VDT05EUyB9IGZyb20gXCIuL3NyYy9zaWduaW5nLWtleS50c1wiO1xuZXhwb3J0IHR5cGUgeyBTaWduaW5nS2V5IH0gZnJvbSBcIi4vc3JjL3NpZ25pbmcta2V5LnRzXCI7XG4iXX0=
|
package/lib/src/frp.d.ts
CHANGED
|
@@ -22,7 +22,10 @@ export interface FrpConfig {
|
|
|
22
22
|
protocol: string;
|
|
23
23
|
token?: string;
|
|
24
24
|
proxyName: string;
|
|
25
|
+
path: string;
|
|
26
|
+
stripPrefix: boolean;
|
|
25
27
|
port: number;
|
|
28
|
+
targetPort: number;
|
|
26
29
|
}
|
|
27
30
|
/** Resolve frpc config from the public domain and FRP-specific environment. */
|
|
28
31
|
export declare function resolveFrpConfig(opts: {
|
|
@@ -32,7 +35,10 @@ export declare function resolveFrpConfig(opts: {
|
|
|
32
35
|
protocol?: string;
|
|
33
36
|
token?: string;
|
|
34
37
|
proxyName?: string;
|
|
38
|
+
path?: string;
|
|
39
|
+
stripPrefix?: boolean;
|
|
35
40
|
port: number;
|
|
41
|
+
targetPort?: number;
|
|
36
42
|
}): FrpConfig | undefined;
|
|
37
43
|
/** GitHub release asset name for the current or supplied OS/architecture. */
|
|
38
44
|
export declare function frpAssetName(version: string, platform?: NodeJS.Platform, arch?: string): string;
|
package/lib/src/frp.js
CHANGED
|
@@ -24,6 +24,12 @@ function bareHost(value) {
|
|
|
24
24
|
const normalized = value.replace(/^https?:\/\//, "").split("/")[0]?.trim();
|
|
25
25
|
return normalized || undefined;
|
|
26
26
|
}
|
|
27
|
+
function normalizePath(value) {
|
|
28
|
+
const trimmed = value?.trim();
|
|
29
|
+
if (!trimmed || trimmed === "/")
|
|
30
|
+
return "/";
|
|
31
|
+
return `/${trimmed.replace(/^\/+|\/+$/g, "")}`;
|
|
32
|
+
}
|
|
27
33
|
/** Resolve frpc config from the public domain and FRP-specific environment. */
|
|
28
34
|
export function resolveFrpConfig(opts) {
|
|
29
35
|
const publicDomain = bareHost(config.string(opts.publicDomain, ["FRP_PUBLIC_DOMAIN", "PUBLIC_DOMAIN"], TUNNEL_CONFIG));
|
|
@@ -34,6 +40,9 @@ export function resolveFrpConfig(opts) {
|
|
|
34
40
|
const protocol = config.string(opts.protocol, "FRP_PROTOCOL") ?? "wss";
|
|
35
41
|
const token = config.string(opts.token, ["FRP_TOKEN", "TUNNEL_TOKEN"]);
|
|
36
42
|
const proxyName = config.string(opts.proxyName, "FRP_PROXY_NAME") ?? publicDomain.split(".")[0] ?? "app";
|
|
43
|
+
const appName = config.string(undefined, "DATABRICKS_APP_NAME") ?? proxyName;
|
|
44
|
+
const path = normalizePath(config.string(opts.path, "FRP_PATH") ?? appName);
|
|
45
|
+
const stripPrefix = config.boolean(opts.stripPrefix, "FRP_STRIP_PREFIX") ?? path !== "/";
|
|
37
46
|
return {
|
|
38
47
|
publicDomain,
|
|
39
48
|
server,
|
|
@@ -41,7 +50,10 @@ export function resolveFrpConfig(opts) {
|
|
|
41
50
|
protocol,
|
|
42
51
|
...(token ? { token } : {}),
|
|
43
52
|
proxyName,
|
|
53
|
+
path,
|
|
54
|
+
stripPrefix,
|
|
44
55
|
port: opts.port,
|
|
56
|
+
targetPort: opts.targetPort ?? opts.port,
|
|
45
57
|
};
|
|
46
58
|
}
|
|
47
59
|
/** GitHub release asset name for the current or supplied OS/architecture. */
|
|
@@ -106,13 +118,13 @@ export async function writeFrpConfig(resolved, childEnv) {
|
|
|
106
118
|
];
|
|
107
119
|
if (resolved.token)
|
|
108
120
|
lines.push(`auth.token = ${tomlString(resolved.token)}`);
|
|
109
|
-
lines.push("", "[[proxies]]", `name = ${tomlString(resolved.proxyName)}`, 'type = "http"', `localPort = ${resolved.
|
|
121
|
+
lines.push("", "[[proxies]]", `name = ${tomlString(resolved.proxyName)}`, 'type = "http"', `localPort = ${resolved.targetPort}`, `customDomains = [${tomlString(resolved.publicDomain)}]`, ...(resolved.path === "/" ? [] : [`locations = [${tomlString(resolved.path)}]`]), "");
|
|
110
122
|
await writeFile(path, lines.join("\n"));
|
|
111
123
|
return path;
|
|
112
124
|
}
|
|
113
125
|
/** Launch frpc as a child process (caller supervises and terminates it). */
|
|
114
126
|
export function startFrp(resolved, childEnv, configPath) {
|
|
115
|
-
logger.info(`frpc tunneling https://${resolved.publicDomain} -> :${resolved.port}`);
|
|
127
|
+
logger.info(`frpc tunneling https://${resolved.publicDomain}${resolved.path === "/" ? "" : resolved.path} -> :${resolved.port}`);
|
|
116
128
|
return spawn("frpc", ["-c", configPath], { env: childEnv, stdio: "inherit" });
|
|
117
129
|
}
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUM3QixNQUFNLGVBQWUsR0FBRyxzREFBc0QsV0FBVyxFQUFFLENBQUM7QUFtQjVGLFNBQVMsUUFBUSxDQUFDLEtBQXlCO0lBQ3pDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNFLE9BQU8sVUFBVSxJQUFJLFNBQVMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxJQVFoQztJQUNDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FDM0IsTUFBTSxDQUFDLE1BQU0sQ0FDWCxJQUFJLENBQUMsWUFBWSxFQUNqQixDQUFDLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxFQUN0QyxhQUFhLENBQ2QsQ0FDRixDQUFDO0lBQ0YsSUFBSSxDQUFDLFlBQVk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNwQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDO0lBQ2xGLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN4RSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ3ZFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sU0FBUyxHQUNiLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ3pGLE9BQU87UUFDTCxZQUFZO1FBQ1osTUFBTTtRQUNOLFVBQVU7UUFDVixRQUFRO1FBQ1IsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNCLFNBQVM7UUFDVCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7S0FDaEIsQ0FBQztBQUNKLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsTUFBTSxVQUFVLFlBQVksQ0FDMUIsT0FBZSxFQUNmLFdBQTRCLE9BQU8sQ0FBQyxRQUFRLEVBQzVDLE9BQWUsT0FBTyxDQUFDLElBQUk7SUFFM0IsTUFBTSxNQUFNLEdBQUcsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM3RixNQUFNLFFBQVEsR0FBRyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ25GLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxRQUFRLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBQ0QsT0FBTyxPQUFPLE9BQU8sSUFBSSxNQUFNLElBQUksUUFBUSxTQUFTLENBQUM7QUFDdkQsQ0FBQztBQUVELFNBQVMsY0FBYztJQUNyQixNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDM0UsT0FBTyxHQUFHLGVBQWUsSUFBSSxTQUFTLEVBQUUsQ0FBQztBQUMzQyxDQUFDO0FBRUQsS0FBSyxVQUFVLFVBQVUsQ0FBQyxNQUFjO0lBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMxQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN4RixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQzNCLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsNkJBQTZCLElBQUksRUFBRSxDQUFDLENBQUMsQ0FDaEYsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxNQUFNLENBQUMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxVQUE2QixFQUFFO0lBQzlELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2hELE1BQU0sT0FBTyxHQUFHLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFO1FBQ3ZELGFBQWEsRUFBRSxJQUFJO1FBQ25CLE9BQU87UUFDUCxVQUFVLEVBQUUsV0FBVztRQUN2QixRQUFRLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzVDLGFBQWEsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7WUFDcEMsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdkQsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUNILE9BQU87UUFDTCxHQUFHLE9BQU8sQ0FBQyxHQUFHO1FBQ2QsSUFBSSxFQUFFLE9BQU87UUFDYixJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7S0FDL0QsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUMxQixXQUE0QixPQUFPLENBQUMsUUFBUSxFQUM1QyxPQUFlLE9BQU8sQ0FBQyxJQUFJO0lBRTNCLE9BQU8sWUFBWSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELDBEQUEwRDtBQUMxRCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsUUFBbUIsRUFDbkIsUUFBMkI7SUFFM0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDMUMsTUFBTSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUMsTUFBTSxLQUFLLEdBQUc7UUFDWixnQkFBZ0IsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUM3QyxnQkFBZ0IsUUFBUSxDQUFDLFVBQVUsRUFBRTtRQUNyQyx3QkFBd0IsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtLQUN4RCxDQUFDO0lBQ0YsSUFBSSxRQUFRLENBQUMsS0FBSztRQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLEtBQUssQ0FBQyxJQUFJLENBQ1IsRUFBRSxFQUNGLGFBQWEsRUFDYixVQUFVLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFDMUMsZUFBZSxFQUNmLGVBQWUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUM5QixvQkFBb0IsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUN4RCxFQUFFLENBQ0gsQ0FBQztJQUNGLE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLE1BQU0sVUFBVSxRQUFRLENBQ3RCLFFBQW1CLEVBQ25CLFFBQTJCLEVBQzNCLFVBQWtCO0lBRWxCLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLFFBQVEsQ0FBQyxZQUFZLFFBQVEsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEYsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUNoRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbnN0YWxsIGFuZCBydW4gYW4gZnJwIGNsaWVudCAoYGZycGNgKSBmb3IgYSBwdWJsaWMgSFRUUCB0dW5uZWwuXG4gKlxuICogVGhlIGRlZmF1bHRzIG1hdGNoIHRoZSBkZXBsb3ltZW50IHNoYXBlIHVzZWQgYnkgaW5zcGlyZS1tZWRpYW1peDogYSBzaW5nbGVcbiAqIFRMUy10ZXJtaW5hdGluZyBob3N0IGlzIGJvdGggdGhlIFdTUyBjb250cm9sIGVuZHBvaW50IGFuZCB0aGUgSFRUUCBjdXN0b21cbiAqIGRvbWFpbi4gQ2FsbGVycyBtYXkgcG9pbnQgYHNlcnZlcmAgc29tZXdoZXJlIGVsc2Ugd2hlbiBmcnBzIGlzIGV4cG9zZWQgb24gYVxuICogc2VwYXJhdGUgY29udHJvbCBob3N0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IG1rZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkZWxpbWl0ZXIsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IGJpbiwgY29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFRVTk5FTF9DT05GSUcgfSBmcm9tIFwiLi9fY29uZmlnLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWw6ZnJwXCIpO1xuY29uc3QgRlJQX1ZFUlNJT04gPSBcIjAuNjguMVwiO1xuY29uc3QgRlJQX1JFTEVBU0VfVVJMID0gYGh0dHBzOi8vZ2l0aHViLmNvbS9mYXRlZGllci9mcnAvcmVsZWFzZXMvZG93bmxvYWQvdiR7RlJQX1ZFUlNJT059YDtcblxuLyoqIE9wdGlvbnMgZm9yIGluc3RhbGxpbmcgdGhlIGZycGMgZXhlY3V0YWJsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJwSW5zdGFsbE9wdGlvbnMge1xuICAvKiogSG9tZSBkaXJlY3RvcnkgY29udGFpbmluZyBgLmZycGNgOyBkZWZhdWx0cyB0byB0aGUgT1MgaG9tZSBkaXJlY3RvcnkuICovXG4gIGhvbWVEaXI/OiBzdHJpbmc7XG59XG5cbi8qKiBSZXNvbHZlZCBmcnBjIHdpcmluZywgb3IgYHVuZGVmaW5lZGAgd2hlbiBubyBGUlAgdHVubmVsIGlzIGNvbmZpZ3VyZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEZycENvbmZpZyB7XG4gIHB1YmxpY0RvbWFpbjogc3RyaW5nO1xuICBzZXJ2ZXI6IHN0cmluZztcbiAgc2VydmVyUG9ydDogbnVtYmVyO1xuICBwcm90b2NvbDogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgcHJveHlOYW1lOiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gYmFyZUhvc3QodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS5yZXBsYWNlKC9eaHR0cHM/OlxcL1xcLy8sIFwiXCIpLnNwbGl0KFwiL1wiKVswXT8udHJpbSgpO1xuICByZXR1cm4gbm9ybWFsaXplZCB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKiBSZXNvbHZlIGZycGMgY29uZmlnIGZyb20gdGhlIHB1YmxpYyBkb21haW4gYW5kIEZSUC1zcGVjaWZpYyBlbnZpcm9ubWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRnJwQ29uZmlnKG9wdHM6IHtcbiAgcHVibGljRG9tYWluPzogc3RyaW5nO1xuICBzZXJ2ZXI/OiBzdHJpbmc7XG4gIHNlcnZlclBvcnQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gIHByb3RvY29sPzogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgcHJveHlOYW1lPzogc3RyaW5nO1xuICBwb3J0OiBudW1iZXI7XG59KTogRnJwQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHVibGljRG9tYWluID0gYmFyZUhvc3QoXG4gICAgY29uZmlnLnN0cmluZyhcbiAgICAgIG9wdHMucHVibGljRG9tYWluLFxuICAgICAgW1wiRlJQX1BVQkxJQ19ET01BSU5cIiwgXCJQVUJMSUNfRE9NQUlOXCJdLFxuICAgICAgVFVOTkVMX0NPTkZJRyxcbiAgICApLFxuICApO1xuICBpZiAoIXB1YmxpY0RvbWFpbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgc2VydmVyID0gYmFyZUhvc3QoY29uZmlnLnN0cmluZyhvcHRzLnNlcnZlciwgXCJGUlBfU0VSVkVSXCIpKSA/PyBwdWJsaWNEb21haW47XG4gIGNvbnN0IHNlcnZlclBvcnQgPSBjb25maWcucG9ydChvcHRzLnNlcnZlclBvcnQsIFwiRlJQX1NFUlZFUl9QT1JUXCIsIDQ0Myk7XG4gIGNvbnN0IHByb3RvY29sID0gY29uZmlnLnN0cmluZyhvcHRzLnByb3RvY29sLCBcIkZSUF9QUk9UT0NPTFwiKSA/PyBcIndzc1wiO1xuICBjb25zdCB0b2tlbiA9IGNvbmZpZy5zdHJpbmcob3B0cy50b2tlbiwgW1wiRlJQX1RPS0VOXCIsIFwiVFVOTkVMX1RPS0VOXCJdKTtcbiAgY29uc3QgcHJveHlOYW1lID1cbiAgICBjb25maWcuc3RyaW5nKG9wdHMucHJveHlOYW1lLCBcIkZSUF9QUk9YWV9OQU1FXCIpID8/IHB1YmxpY0RvbWFpbi5zcGxpdChcIi5cIilbMF0gPz8gXCJhcHBcIjtcbiAgcmV0dXJuIHtcbiAgICBwdWJsaWNEb21haW4sXG4gICAgc2VydmVyLFxuICAgIHNlcnZlclBvcnQsXG4gICAgcHJvdG9jb2wsXG4gICAgLi4uKHRva2VuID8geyB0b2tlbiB9IDoge30pLFxuICAgIHByb3h5TmFtZSxcbiAgICBwb3J0OiBvcHRzLnBvcnQsXG4gIH07XG59XG5cbi8qKiBHaXRIdWIgcmVsZWFzZSBhc3NldCBuYW1lIGZvciB0aGUgY3VycmVudCBvciBzdXBwbGllZCBPUy9hcmNoaXRlY3R1cmUuICovXG5leHBvcnQgZnVuY3Rpb24gZnJwQXNzZXROYW1lKFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4gIHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtLFxuICBhcmNoOiBzdHJpbmcgPSBwcm9jZXNzLmFyY2gsXG4pOiBzdHJpbmcge1xuICBjb25zdCBvc05hbWUgPSBwbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIiA/IFwiZGFyd2luXCIgOiBwbGF0Zm9ybSA9PT0gXCJsaW51eFwiID8gXCJsaW51eFwiIDogdW5kZWZpbmVkO1xuICBjb25zdCBhcmNoTmFtZSA9IGFyY2ggPT09IFwiYXJtNjRcIiA/IFwiYXJtNjRcIiA6IGFyY2ggPT09IFwieDY0XCIgPyBcImFtZDY0XCIgOiB1bmRlZmluZWQ7XG4gIGlmICghb3NOYW1lIHx8ICFhcmNoTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZnJwIGhhcyBubyBzdXBwb3J0ZWQgcmVsZWFzZSBhc3NldCBmb3IgJHtwbGF0Zm9ybX0vJHthcmNofWApO1xuICB9XG4gIHJldHVybiBgZnJwXyR7dmVyc2lvbn1fJHtvc05hbWV9XyR7YXJjaE5hbWV9LnRhci5nemA7XG59XG5cbmZ1bmN0aW9uIGZycERvd25sb2FkVXJsKCk6IHN0cmluZyB7XG4gIGNvbnN0IGFzc2V0TmFtZSA9IGZycEFzc2V0TmFtZShGUlBfVkVSU0lPTik7XG4gIGxvZ2dlci5pbmZvKFwiaW5zdGFsbGluZyBmcnBjXCIsIHsgdmVyc2lvbjogRlJQX1ZFUlNJT04sIGFzc2V0OiBhc3NldE5hbWUgfSk7XG4gIHJldHVybiBgJHtGUlBfUkVMRUFTRV9VUkx9LyR7YXNzZXROYW1lfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbGVjdEZycGMoc291cmNlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwYXRoID0gam9pbihzb3VyY2UsIGZycEFyY2hpdmVEaXJlY3RvcnkoKSwgXCJmcnBjXCIpO1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIikge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25lciA9IHNwYXduKFwiY29kZXNpZ25cIiwgW1wiLS1mb3JjZVwiLCBcIi0tc2lnblwiLCBcIi1cIiwgcGF0aF0sIHsgc3RkaW86IFwiaWdub3JlXCIgfSk7XG4gICAgICBzaWduZXIub25jZShcImVycm9yXCIsIHJlamVjdCk7XG4gICAgICBzaWduZXIub25jZShcImV4aXRcIiwgKGNvZGUpID0+XG4gICAgICAgIGNvZGUgPT09IDAgPyByZXNvbHZlKCkgOiByZWplY3QobmV3IEVycm9yKGBjb2Rlc2lnbiBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKSksXG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuXG4vKiogSW5zdGFsbCBmcnBjIHdoZW4gYWJzZW50IGFuZCByZXR1cm4gdGhlIGVudmlyb25tZW50IHVzZWQgYnkgaXRzIHByb2Nlc3MuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEZycChvcHRpb25zOiBGcnBJbnN0YWxsT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxOb2RlSlMuUHJvY2Vzc0Vudj4ge1xuICBjb25zdCBob21lRGlyID0gb3B0aW9ucy5ob21lRGlyID8/IG9zLmhvbWVkaXIoKTtcbiAgY29uc3QgY29udGV4dCA9IGF3YWl0IGJpbi5lbnN1cmUoXCJmcnBjXCIsIGZycERvd25sb2FkVXJsLCB7XG4gICAgYXV0b1VucGFja2FnZTogdHJ1ZSxcbiAgICBob21lRGlyLFxuICAgIG1pblZlcnNpb246IEZSUF9WRVJTSU9OLFxuICAgIHNlbGVjdG9yOiAoeyBzb3VyY2UgfSkgPT4gc2VsZWN0RnJwYyhzb3VyY2UpLFxuICAgIHZlcnNpb25QYXJzZXI6ICh7IHN0ZG91dCwgc3RkZXJyIH0pID0+IHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBiaW4ucGFyc2VWZXJzaW9uKHsgc3Rkb3V0LCBzdGRlcnIgfSk7XG4gICAgICByZXR1cm4gdmVyc2lvbiA9PT0gRlJQX1ZFUlNJT04gPyB2ZXJzaW9uIDogdW5kZWZpbmVkO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIC4uLnByb2Nlc3MuZW52LFxuICAgIEhPTUU6IGhvbWVEaXIsXG4gICAgUEFUSDogW2NvbnRleHQuYmluRGlyLCBwcm9jZXNzLmVudi5QQVRIID8/IFwiXCJdLmpvaW4oZGVsaW1pdGVyKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZnJwQXJjaGl2ZURpcmVjdG9yeShcbiAgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm0sXG4gIGFyY2g6IHN0cmluZyA9IHByb2Nlc3MuYXJjaCxcbik6IHN0cmluZyB7XG4gIHJldHVybiBmcnBBc3NldE5hbWUoRlJQX1ZFUlNJT04sIHBsYXRmb3JtLCBhcmNoKS5yZXBsYWNlKC9cXC50YXJcXC5neiQvLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gdG9tbFN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn1cblxuLyoqIFJlbmRlciBgfi8uZnJwYy9mcnBjLnRvbWxgIGZvciB0aGUgcmVzb2x2ZWQgdHVubmVsLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlRnJwQ29uZmlnKFxuICByZXNvbHZlZDogRnJwQ29uZmlnLFxuICBjaGlsZEVudjogTm9kZUpTLlByb2Nlc3NFbnYsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkaXJlY3RvcnkgPSBqb2luKGNoaWxkRW52LkhPTUUgPz8gb3MuaG9tZWRpcigpLCBcIi5mcnBjXCIpO1xuICBjb25zdCBwYXRoID0gam9pbihkaXJlY3RvcnksIFwiZnJwYy50b21sXCIpO1xuICBhd2FpdCBta2RpcihkaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBsaW5lcyA9IFtcbiAgICBgc2VydmVyQWRkciA9ICR7dG9tbFN0cmluZyhyZXNvbHZlZC5zZXJ2ZXIpfWAsXG4gICAgYHNlcnZlclBvcnQgPSAke3Jlc29sdmVkLnNlcnZlclBvcnR9YCxcbiAgICBgdHJhbnNwb3J0LnByb3RvY29sID0gJHt0b21sU3RyaW5nKHJlc29sdmVkLnByb3RvY29sKX1gLFxuICBdO1xuICBpZiAocmVzb2x2ZWQudG9rZW4pIGxpbmVzLnB1c2goYGF1dGgudG9rZW4gPSAke3RvbWxTdHJpbmcocmVzb2x2ZWQudG9rZW4pfWApO1xuICBsaW5lcy5wdXNoKFxuICAgIFwiXCIsXG4gICAgXCJbW3Byb3hpZXNdXVwiLFxuICAgIGBuYW1lID0gJHt0b21sU3RyaW5nKHJlc29sdmVkLnByb3h5TmFtZSl9YCxcbiAgICAndHlwZSA9IFwiaHR0cFwiJyxcbiAgICBgbG9jYWxQb3J0ID0gJHtyZXNvbHZlZC5wb3J0fWAsXG4gICAgYGN1c3RvbURvbWFpbnMgPSBbJHt0b21sU3RyaW5nKHJlc29sdmVkLnB1YmxpY0RvbWFpbil9XWAsXG4gICAgXCJcIixcbiAgKTtcbiAgYXdhaXQgd3JpdGVGaWxlKHBhdGgsIGxpbmVzLmpvaW4oXCJcXG5cIikpO1xuICByZXR1cm4gcGF0aDtcbn1cblxuLyoqIExhdW5jaCBmcnBjIGFzIGEgY2hpbGQgcHJvY2VzcyAoY2FsbGVyIHN1cGVydmlzZXMgYW5kIHRlcm1pbmF0ZXMgaXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0RnJwKFxuICByZXNvbHZlZDogRnJwQ29uZmlnLFxuICBjaGlsZEVudjogTm9kZUpTLlByb2Nlc3NFbnYsXG4gIGNvbmZpZ1BhdGg6IHN0cmluZyxcbik6IFJldHVyblR5cGU8dHlwZW9mIHNwYXduPiB7XG4gIGxvZ2dlci5pbmZvKGBmcnBjIHR1bm5lbGluZyBodHRwczovLyR7cmVzb2x2ZWQucHVibGljRG9tYWlufSAtPiA6JHtyZXNvbHZlZC5wb3J0fWApO1xuICByZXR1cm4gc3Bhd24oXCJmcnBjXCIsIFtcIi1jXCIsIGNvbmZpZ1BhdGhdLCB7IGVudjogY2hpbGRFbnYsIHN0ZGlvOiBcImluaGVyaXRcIiB9KTtcbn1cbiJdfQ==
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUM3QixNQUFNLGVBQWUsR0FBRyxzREFBc0QsV0FBVyxFQUFFLENBQUM7QUFzQjVGLFNBQVMsUUFBUSxDQUFDLEtBQXlCO0lBQ3pDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNFLE9BQU8sVUFBVSxJQUFJLFNBQVMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBeUI7SUFDOUMsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzlCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFL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LGdCQUFnQixVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUNoRixFQUFFLENBQ0gsQ0FBQztJQUNGLE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLE1BQU0sVUFBVSxRQUFRLENBQ3RCLFFBQW1CLEVBQ25CLFFBQTJCLEVBQzNCLFVBQWtCO0lBRWxCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsMEJBQTBCLFFBQVEsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQ3BILENBQUM7SUFDRixPQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQ2hGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEluc3RhbGwgYW5kIHJ1biBhbiBmcnAgY2xpZW50IChgZnJwY2ApIGZvciBhIHB1YmxpYyBIVFRQIHR1bm5lbC5cbiAqXG4gKiBUaGUgZGVmYXVsdHMgbWF0Y2ggdGhlIGRlcGxveW1lbnQgc2hhcGUgdXNlZCBieSBpbnNwaXJlLW1lZGlhbWl4OiBhIHNpbmdsZVxuICogVExTLXRlcm1pbmF0aW5nIGhvc3QgaXMgYm90aCB0aGUgV1NTIGNvbnRyb2wgZW5kcG9pbnQgYW5kIHRoZSBIVFRQIGN1c3RvbVxuICogZG9tYWluLiBDYWxsZXJzIG1heSBwb2ludCBgc2VydmVyYCBzb21ld2hlcmUgZWxzZSB3aGVuIGZycHMgaXMgZXhwb3NlZCBvbiBhXG4gKiBzZXBhcmF0ZSBjb250cm9sIGhvc3QuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGRlbGltaXRlciwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IHsgYmluLCBjb25maWcgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgVFVOTkVMX0NPTkZJRyB9IGZyb20gXCIuL19jb25maWcudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDpmcnBcIik7XG5jb25zdCBGUlBfVkVSU0lPTiA9IFwiMC42OC4xXCI7XG5jb25zdCBGUlBfUkVMRUFTRV9VUkwgPSBgaHR0cHM6Ly9naXRodWIuY29tL2ZhdGVkaWVyL2ZycC9yZWxlYXNlcy9kb3dubG9hZC92JHtGUlBfVkVSU0lPTn1gO1xuXG4vKiogT3B0aW9ucyBmb3IgaW5zdGFsbGluZyB0aGUgZnJwYyBleGVjdXRhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcnBJbnN0YWxsT3B0aW9ucyB7XG4gIC8qKiBIb21lIGRpcmVjdG9yeSBjb250YWluaW5nIGAuZnJwY2A7IGRlZmF1bHRzIHRvIHRoZSBPUyBob21lIGRpcmVjdG9yeS4gKi9cbiAgaG9tZURpcj86IHN0cmluZztcbn1cblxuLyoqIFJlc29sdmVkIGZycGMgd2lyaW5nLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIEZSUCB0dW5uZWwgaXMgY29uZmlndXJlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJwQ29uZmlnIHtcbiAgcHVibGljRG9tYWluOiBzdHJpbmc7XG4gIHNlcnZlcjogc3RyaW5nO1xuICBzZXJ2ZXJQb3J0OiBudW1iZXI7XG4gIHByb3RvY29sOiBzdHJpbmc7XG4gIHRva2VuPzogc3RyaW5nO1xuICBwcm94eU5hbWU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzdHJpcFByZWZpeDogYm9vbGVhbjtcbiAgcG9ydDogbnVtYmVyO1xuICB0YXJnZXRQb3J0OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGJhcmVIb3N0KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBub3JtYWxpemVkID0gdmFsdWUucmVwbGFjZSgvXmh0dHBzPzpcXC9cXC8vLCBcIlwiKS5zcGxpdChcIi9cIilbMF0/LnRyaW0oKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgfHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gdmFsdWU/LnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkIHx8IHRyaW1tZWQgPT09IFwiL1wiKSByZXR1cm4gXCIvXCI7XG4gIHJldHVybiBgLyR7dHJpbW1lZC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKX1gO1xufVxuXG4vKiogUmVzb2x2ZSBmcnBjIGNvbmZpZyBmcm9tIHRoZSBwdWJsaWMgZG9tYWluIGFuZCBGUlAtc3BlY2lmaWMgZW52aXJvbm1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZycENvbmZpZyhvcHRzOiB7XG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgc2VydmVyPzogc3RyaW5nO1xuICBzZXJ2ZXJQb3J0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICBwcm90b2NvbD86IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHByb3h5TmFtZT86IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgc3RyaXBQcmVmaXg/OiBib29sZWFuO1xuICBwb3J0OiBudW1iZXI7XG4gIHRhcmdldFBvcnQ/OiBudW1iZXI7XG59KTogRnJwQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHVibGljRG9tYWluID0gYmFyZUhvc3QoXG4gICAgY29uZmlnLnN0cmluZyhcbiAgICAgIG9wdHMucHVibGljRG9tYWluLFxuICAgICAgW1wiRlJQX1BVQkxJQ19ET01BSU5cIiwgXCJQVUJMSUNfRE9NQUlOXCJdLFxuICAgICAgVFVOTkVMX0NPTkZJRyxcbiAgICApLFxuICApO1xuICBpZiAoIXB1YmxpY0RvbWFpbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgc2VydmVyID0gYmFyZUhvc3QoY29uZmlnLnN0cmluZyhvcHRzLnNlcnZlciwgXCJGUlBfU0VSVkVSXCIpKSA/PyBwdWJsaWNEb21haW47XG4gIGNvbnN0IHNlcnZlclBvcnQgPSBjb25maWcucG9ydChvcHRzLnNlcnZlclBvcnQsIFwiRlJQX1NFUlZFUl9QT1JUXCIsIDQ0Myk7XG4gIGNvbnN0IHByb3RvY29sID0gY29uZmlnLnN0cmluZyhvcHRzLnByb3RvY29sLCBcIkZSUF9QUk9UT0NPTFwiKSA/PyBcIndzc1wiO1xuICBjb25zdCB0b2tlbiA9IGNvbmZpZy5zdHJpbmcob3B0cy50b2tlbiwgW1wiRlJQX1RPS0VOXCIsIFwiVFVOTkVMX1RPS0VOXCJdKTtcbiAgY29uc3QgcHJveHlOYW1lID1cbiAgICBjb25maWcuc3RyaW5nKG9wdHMucHJveHlOYW1lLCBcIkZSUF9QUk9YWV9OQU1FXCIpID8/IHB1YmxpY0RvbWFpbi5zcGxpdChcIi5cIilbMF0gPz8gXCJhcHBcIjtcbiAgY29uc3QgYXBwTmFtZSA9IGNvbmZpZy5zdHJpbmcodW5kZWZpbmVkLCBcIkRBVEFCUklDS1NfQVBQX05BTUVcIikgPz8gcHJveHlOYW1lO1xuICBjb25zdCBwYXRoID0gbm9ybWFsaXplUGF0aChjb25maWcuc3RyaW5nKG9wdHMucGF0aCwgXCJGUlBfUEFUSFwiKSA/PyBhcHBOYW1lKTtcbiAgY29uc3Qgc3RyaXBQcmVmaXggPSBjb25maWcuYm9vbGVhbihvcHRzLnN0cmlwUHJlZml4LCBcIkZSUF9TVFJJUF9QUkVGSVhcIikgPz8gcGF0aCAhPT0gXCIvXCI7XG4gIHJldHVybiB7XG4gICAgcHVibGljRG9tYWluLFxuICAgIHNlcnZlcixcbiAgICBzZXJ2ZXJQb3J0LFxuICAgIHByb3RvY29sLFxuICAgIC4uLih0b2tlbiA/IHsgdG9rZW4gfSA6IHt9KSxcbiAgICBwcm94eU5hbWUsXG4gICAgcGF0aCxcbiAgICBzdHJpcFByZWZpeCxcbiAgICBwb3J0OiBvcHRzLnBvcnQsXG4gICAgdGFyZ2V0UG9ydDogb3B0cy50YXJnZXRQb3J0ID8/IG9wdHMucG9ydCxcbiAgfTtcbn1cblxuLyoqIEdpdEh1YiByZWxlYXNlIGFzc2V0IG5hbWUgZm9yIHRoZSBjdXJyZW50IG9yIHN1cHBsaWVkIE9TL2FyY2hpdGVjdHVyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcnBBc3NldE5hbWUoXG4gIHZlcnNpb246IHN0cmluZyxcbiAgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm0sXG4gIGFyY2g6IHN0cmluZyA9IHByb2Nlc3MuYXJjaCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG9zTmFtZSA9IHBsYXRmb3JtID09PSBcImRhcndpblwiID8gXCJkYXJ3aW5cIiA6IHBsYXRmb3JtID09PSBcImxpbnV4XCIgPyBcImxpbnV4XCIgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFyY2hOYW1lID0gYXJjaCA9PT0gXCJhcm02NFwiID8gXCJhcm02NFwiIDogYXJjaCA9PT0gXCJ4NjRcIiA/IFwiYW1kNjRcIiA6IHVuZGVmaW5lZDtcbiAgaWYgKCFvc05hbWUgfHwgIWFyY2hOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmcnAgaGFzIG5vIHN1cHBvcnRlZCByZWxlYXNlIGFzc2V0IGZvciAke3BsYXRmb3JtfS8ke2FyY2h9YCk7XG4gIH1cbiAgcmV0dXJuIGBmcnBfJHt2ZXJzaW9ufV8ke29zTmFtZX1fJHthcmNoTmFtZX0udGFyLmd6YDtcbn1cblxuZnVuY3Rpb24gZnJwRG93bmxvYWRVcmwoKTogc3RyaW5nIHtcbiAgY29uc3QgYXNzZXROYW1lID0gZnJwQXNzZXROYW1lKEZSUF9WRVJTSU9OKTtcbiAgbG9nZ2VyLmluZm8oXCJpbnN0YWxsaW5nIGZycGNcIiwgeyB2ZXJzaW9uOiBGUlBfVkVSU0lPTiwgYXNzZXQ6IGFzc2V0TmFtZSB9KTtcbiAgcmV0dXJuIGAke0ZSUF9SRUxFQVNFX1VSTH0vJHthc3NldE5hbWV9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VsZWN0RnJwYyhzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBhdGggPSBqb2luKHNvdXJjZSwgZnJwQXJjaGl2ZURpcmVjdG9yeSgpLCBcImZycGNcIik7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmVyID0gc3Bhd24oXCJjb2Rlc2lnblwiLCBbXCItLWZvcmNlXCIsIFwiLS1zaWduXCIsIFwiLVwiLCBwYXRoXSwgeyBzdGRpbzogXCJpZ25vcmVcIiB9KTtcbiAgICAgIHNpZ25lci5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICAgIHNpZ25lci5vbmNlKFwiZXhpdFwiLCAoY29kZSkgPT5cbiAgICAgICAgY29kZSA9PT0gMCA/IHJlc29sdmUoKSA6IHJlamVjdChuZXcgRXJyb3IoYGNvZGVzaWduIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKiBJbnN0YWxsIGZycGMgd2hlbiBhYnNlbnQgYW5kIHJldHVybiB0aGUgZW52aXJvbm1lbnQgdXNlZCBieSBpdHMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsRnJwKG9wdGlvbnM6IEZycEluc3RhbGxPcHRpb25zID0ge30pOiBQcm9taXNlPE5vZGVKUy5Qcm9jZXNzRW52PiB7XG4gIGNvbnN0IGhvbWVEaXIgPSBvcHRpb25zLmhvbWVEaXIgPz8gb3MuaG9tZWRpcigpO1xuICBjb25zdCBjb250ZXh0ID0gYXdhaXQgYmluLmVuc3VyZShcImZycGNcIiwgZnJwRG93bmxvYWRVcmwsIHtcbiAgICBhdXRvVW5wYWNrYWdlOiB0cnVlLFxuICAgIGhvbWVEaXIsXG4gICAgbWluVmVyc2lvbjogRlJQX1ZFUlNJT04sXG4gICAgc2VsZWN0b3I6ICh7IHNvdXJjZSB9KSA9PiBzZWxlY3RGcnBjKHNvdXJjZSksXG4gICAgdmVyc2lvblBhcnNlcjogKHsgc3Rkb3V0LCBzdGRlcnIgfSkgPT4ge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IGJpbi5wYXJzZVZlcnNpb24oeyBzdGRvdXQsIHN0ZGVyciB9KTtcbiAgICAgIHJldHVybiB2ZXJzaW9uID09PSBGUlBfVkVSU0lPTiA/IHZlcnNpb24gOiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgSE9NRTogaG9tZURpcixcbiAgICBQQVRIOiBbY29udGV4dC5iaW5EaXIsIHByb2Nlc3MuZW52LlBBVEggPz8gXCJcIl0uam9pbihkZWxpbWl0ZXIpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcnBBcmNoaXZlRGlyZWN0b3J5KFxuICBwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgYXJjaDogc3RyaW5nID0gcHJvY2Vzcy5hcmNoLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZycEFzc2V0TmFtZShGUlBfVkVSU0lPTiwgcGxhdGZvcm0sIGFyY2gpLnJlcGxhY2UoL1xcLnRhclxcLmd6JC8sIFwiXCIpO1xufVxuXG5mdW5jdGlvbiB0b21sU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG4vKiogUmVuZGVyIGB+Ly5mcnBjL2ZycGMudG9tbGAgZm9yIHRoZSByZXNvbHZlZCB0dW5uZWwuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGcnBDb25maWcoXG4gIHJlc29sdmVkOiBGcnBDb25maWcsXG4gIGNoaWxkRW52OiBOb2RlSlMuUHJvY2Vzc0Vudixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRpcmVjdG9yeSA9IGpvaW4oY2hpbGRFbnYuSE9NRSA/PyBvcy5ob21lZGlyKCksIFwiLmZycGNcIik7XG4gIGNvbnN0IHBhdGggPSBqb2luKGRpcmVjdG9yeSwgXCJmcnBjLnRvbWxcIik7XG4gIGF3YWl0IG1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIGBzZXJ2ZXJBZGRyID0gJHt0b21sU3RyaW5nKHJlc29sdmVkLnNlcnZlcil9YCxcbiAgICBgc2VydmVyUG9ydCA9ICR7cmVzb2x2ZWQuc2VydmVyUG9ydH1gLFxuICAgIGB0cmFuc3BvcnQucHJvdG9jb2wgPSAke3RvbWxTdHJpbmcocmVzb2x2ZWQucHJvdG9jb2wpfWAsXG4gIF07XG4gIGlmIChyZXNvbHZlZC50b2tlbikgbGluZXMucHVzaChgYXV0aC50b2tlbiA9ICR7dG9tbFN0cmluZyhyZXNvbHZlZC50b2tlbil9YCk7XG4gIGxpbmVzLnB1c2goXG4gICAgXCJcIixcbiAgICBcIltbcHJveGllc11dXCIsXG4gICAgYG5hbWUgPSAke3RvbWxTdHJpbmcocmVzb2x2ZWQucHJveHlOYW1lKX1gLFxuICAgICd0eXBlID0gXCJodHRwXCInLFxuICAgIGBsb2NhbFBvcnQgPSAke3Jlc29sdmVkLnRhcmdldFBvcnR9YCxcbiAgICBgY3VzdG9tRG9tYWlucyA9IFske3RvbWxTdHJpbmcocmVzb2x2ZWQucHVibGljRG9tYWluKX1dYCxcbiAgICAuLi4ocmVzb2x2ZWQucGF0aCA9PT0gXCIvXCIgPyBbXSA6IFtgbG9jYXRpb25zID0gWyR7dG9tbFN0cmluZyhyZXNvbHZlZC5wYXRoKX1dYF0pLFxuICAgIFwiXCIsXG4gICk7XG4gIGF3YWl0IHdyaXRlRmlsZShwYXRoLCBsaW5lcy5qb2luKFwiXFxuXCIpKTtcbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKiBMYXVuY2ggZnJwYyBhcyBhIGNoaWxkIHByb2Nlc3MgKGNhbGxlciBzdXBlcnZpc2VzIGFuZCB0ZXJtaW5hdGVzIGl0KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydEZycChcbiAgcmVzb2x2ZWQ6IEZycENvbmZpZyxcbiAgY2hpbGRFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LFxuICBjb25maWdQYXRoOiBzdHJpbmcsXG4pOiBSZXR1cm5UeXBlPHR5cGVvZiBzcGF3bj4ge1xuICBsb2dnZXIuaW5mbyhcbiAgICBgZnJwYyB0dW5uZWxpbmcgaHR0cHM6Ly8ke3Jlc29sdmVkLnB1YmxpY0RvbWFpbn0ke3Jlc29sdmVkLnBhdGggPT09IFwiL1wiID8gXCJcIiA6IHJlc29sdmVkLnBhdGh9IC0+IDoke3Jlc29sdmVkLnBvcnR9YCxcbiAgKTtcbiAgcmV0dXJuIHNwYXduKFwiZnJwY1wiLCBbXCItY1wiLCBjb25maWdQYXRoXSwgeyBlbnY6IGNoaWxkRW52LCBzdGRpbzogXCJpbmhlcml0XCIgfSk7XG59XG4iXX0=
|
package/lib/src/interceptor.d.ts
CHANGED
|
@@ -43,6 +43,10 @@ export interface TunnelInterceptorOptions {
|
|
|
43
43
|
frpToken?: string;
|
|
44
44
|
/** frp proxy registration name. Env `FRP_PROXY_NAME`. */
|
|
45
45
|
frpProxyName?: string;
|
|
46
|
+
/** FRP path location. Env `FRP_PATH`; defaults to `DATABRICKS_APP_NAME`. */
|
|
47
|
+
frpPath?: string;
|
|
48
|
+
/** Strip the FRP path before forwarding. Env `FRP_STRIP_PREFIX`; defaults true for non-root paths. */
|
|
49
|
+
frpStripPrefix?: boolean;
|
|
46
50
|
}
|
|
47
51
|
/** Public tunnel clients supported by the interceptor and CLI. */
|
|
48
52
|
export type TunnelTransport = "portr" | "frp" | "both";
|
package/lib/src/interceptor.js
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
import { log, object } from "@dbx-tools/shared-core";
|
|
20
20
|
import { installFrp, resolveFrpConfig, startFrp, writeFrpConfig } from "./frp.js";
|
|
21
21
|
import { installPortr, resolvePortrConfig, startPortr, writePortrConfig } from "./portr.js";
|
|
22
|
+
import { startPathProxy } from "./path-proxy.js";
|
|
22
23
|
const logger = log.logger("tunnel:interceptor");
|
|
23
24
|
/** Resolve and validate the tunnel transport selector. */
|
|
24
25
|
export function resolveTunnelTransport(transport) {
|
|
@@ -80,9 +81,18 @@ export function tunnelInterceptor(options = {}) {
|
|
|
80
81
|
protocol: options.frpProtocol,
|
|
81
82
|
token: options.frpToken,
|
|
82
83
|
proxyName: options.frpProxyName,
|
|
84
|
+
path: options.frpPath,
|
|
85
|
+
stripPrefix: options.frpStripPrefix,
|
|
83
86
|
port,
|
|
84
87
|
});
|
|
85
88
|
if (frpConfig) {
|
|
89
|
+
const pathProxy = frpConfig.stripPrefix && frpConfig.path !== "/"
|
|
90
|
+
? await startPathProxy(port, frpConfig.path)
|
|
91
|
+
: undefined;
|
|
92
|
+
if (pathProxy) {
|
|
93
|
+
frpConfig.targetPort = pathProxy.port;
|
|
94
|
+
ctx.onLifecycle("shutdown", () => void pathProxy.close());
|
|
95
|
+
}
|
|
86
96
|
const frpEnv = await installFrp();
|
|
87
97
|
const configPath = await writeFrpConfig(frpConfig, frpEnv);
|
|
88
98
|
children.push(startFrp(frpConfig, frpEnv, configPath));
|
|
@@ -103,4 +113,4 @@ export function tunnelInterceptor(options = {}) {
|
|
|
103
113
|
logger.info(`tunnel bound: ${transport} -> :${port}`);
|
|
104
114
|
};
|
|
105
115
|
}
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBSUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUYsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBaUNoRCwwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLHNCQUFzQixDQUFDLFNBQWtCO0lBQ3ZELE1BQU0sUUFBUSxHQUNaLFNBQVM7UUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQjtRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQjtRQUM1QixPQUFPLENBQUM7SUFDVixJQUFJLFFBQVEsS0FBSyxPQUFPLElBQUksUUFBUSxLQUFLLEtBQUssSUFBSSxRQUFRLEtBQUssTUFBTTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQ3ZGLE1BQU0sSUFBSSxTQUFTLENBQUMsNkJBQTZCLFFBQVEsaUNBQWlDLENBQUMsQ0FBQztBQUM5RixDQUFDO0FBRUQscUZBQXFGO0FBQ3JGLFNBQVMsaUJBQWlCLENBQUMsSUFBYTtJQUN0QyxPQUFPLElBQUksSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDMUUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFVBQW9DLEVBQUU7SUFDdEUsT0FBTyxLQUFLLEVBQUUsR0FBdUIsRUFBaUIsRUFBRTtRQUN0RCxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7UUFDekQsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQW1CLEVBQUUsQ0FBQztRQUNwQyxJQUFJLFNBQVMsS0FBSyxPQUFPLElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ2xELE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDO2dCQUNyQyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7Z0JBQ2xDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztnQkFDNUIsSUFBSTthQUNMLENBQUMsQ0FBQztZQUNILElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sUUFBUSxHQUFHLE1BQU0sWUFBWSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sVUFBVSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3pELENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLHNFQUFzRSxDQUFDLENBQUM7WUFDdEYsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLFNBQVMsS0FBSyxLQUFLLElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ2hELE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDO2dCQUNqQyxZQUFZLEVBQUUsT0FBTyxDQUFDLGVBQWU7Z0JBQ3JDLE1BQU0sRUFBRSxPQUFPLENBQUMsU0FBUztnQkFDekIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxhQUFhO2dCQUNqQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFdBQVc7Z0JBQzdCLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUTtnQkFDdkIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxZQUFZO2dCQUMvQixJQUFJO2FBQ0wsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLFVBQVUsR0FBRyxNQUFNLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzNELFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUM3QixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVE7WUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JELEdBQUcsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtZQUMvQixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO29CQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixTQUFTLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgdHVubmVsSW50ZXJjZXB0b3IoKWAgLSB0aGUge0BsaW5rIEludGVyY2VwdG9yfSB0aGF0IGZyb250cyBhbiBhcHAgd2l0aCBhIHB1YmxpY1xuICogcG9ydHIgYW5kL29yIGZycCB0dW5uZWwsIGNvbnN1bWluZyB0aGUge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0gYEBkYngtdG9vbHMvYXBwa2l0YCdzXG4gKiBgY3JlYXRlQXBwYCBoYW5kcyBpdC5cbiAqXG4gKiBUaGUgdHVubmVsIHJ1bnMgSU4tUFJPQ0VTUzogdGhlIEFQUCBpcyB0aGUgbWFpbiBwcm9jZXNzIGFuZCBoYW5kcyB0aGlzIGludGVyY2VwdG9yXG4gKiBpdHMgY29udGV4dCwgcmF0aGVyIHRoYW4gYSB3cmFwcGVyIHByb2Nlc3Mgc3Bhd25pbmcgdGhlIGFwcCBhcyBhIGNoaWxkLiBUaGVcbiAqIGludGVyY2VwdG9yIGFwcGxpZXMgdGhlIGNvbXB1dGVkIHdvcmtzcGFjZSBob3N0LCBpbnN0YWxscyBhbmQgbGF1bmNoZXMgcG9ydHIgb24gdGhlXG4gKiBhcHAncyBwdWJsaWMgcG9ydCwgYmluZHMgdGhlIGNoaWxkIHByb2Nlc3MgdG8gdGhlIGFwcCwgYW5kIHN0b3BzIHBvcnRyIGR1cmluZyBhblxuICogb3JkZXJseSBBcHBLaXQgc2h1dGRvd24uXG4gKlxuICogVGhlIHBhc3N3b3JkbGVzcyBHQVRFIGlzIGEgc2VwYXJhdGUgY29uY2VybjogaXQgaXMgdGhlIGBhdXRoR2F0ZWAgQXBwS2l0IHBsdWdpbixcbiAqIHdoaWNoIHJlZ2lzdGVycyB0aGUgbG9naW4gcm91dGVzICsgYSBnYXRpbmcgbWlkZGxld2FyZSBvbiB0aGUgYXBwJ3Mgb3duIHNlcnZlci5cbiAqIFJlZ2lzdGVyIGl0IGluIHRoZSBhcHAncyBgcGx1Z2luc2AgZm9yIGdhdGVkIHRyYWZmaWMuIFRoaXMgaW50ZXJjZXB0b3IgaXMgb25seVxuICogdGhlIHBvcnRyIGhhbGYgLSBcInVwZGF0ZSB0aGUgaG9zdCwgYmluZCBwb3J0clwiIC0gdGhlIHNtYWxsZXN0IHVzZWZ1bCB1bml0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJjZXB0b3IsIEludGVyY2VwdG9yQ29udGV4dCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgaW5zdGFsbEZycCwgcmVzb2x2ZUZycENvbmZpZywgc3RhcnRGcnAsIHdyaXRlRnJwQ29uZmlnIH0gZnJvbSBcIi4vZnJwLnRzXCI7XG5pbXBvcnQgeyBpbnN0YWxsUG9ydHIsIHJlc29sdmVQb3J0ckNvbmZpZywgc3RhcnRQb3J0ciwgd3JpdGVQb3J0ckNvbmZpZyB9IGZyb20gXCIuL3BvcnRyLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWw6aW50ZXJjZXB0b3JcIik7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgdHVubmVsSW50ZXJjZXB0b3J9IChlYWNoIGFsc28gcmVzb2x2YWJsZSBmcm9tIGVudikuICovXG5leHBvcnQgaW50ZXJmYWNlIFR1bm5lbEludGVyY2VwdG9yT3B0aW9ucyB7XG4gIC8qKiBUdW5uZWwgY2xpZW50cyB0byBydW4uIEVudiBgREJYX1RPT0xTX1RVTk5FTF9UUkFOU1BPUlRgOyBkZWZhdWx0cyB0byBgcG9ydHJgLiAqL1xuICB0cmFuc3BvcnQ/OiBUdW5uZWxUcmFuc3BvcnQ7XG4gIC8qKiBQdWJsaWMgaG9zdCB0byBzZXJ2ZSBvbi4gRW52IGBUVU5ORUxfUFVCTElDX0RPTUFJTmAuICovXG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgLyoqIHBvcnRyIHN1YmRvbWFpbiAoZWxzZSBkZXJpdmVkIGZyb20ge0BsaW5rIHB1YmxpY0RvbWFpbn0pLiAqL1xuICBzdWJkb21haW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgUFVCTElDIHBvcnQgcG9ydHIgZm9yd2FyZHMgdG8gLSB0aGUgcG9ydCB0aGUgYXBwIGl0c2VsZiBsaXN0ZW5zIG9uLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgRGF0YWJyaWNrcyBBcHBzIHJ1bnRpbWUgY29udHJhY3QgYERBVEFCUklDS1NfQVBQX1BPUlRgXG4gICAqICh0aGVuIGA4MDAwYCksIHdoaWNoIGlzIHRoZSBwb3J0IHRoZSBwbGF0Zm9ybSByb3V0ZXMgdG8uXG4gICAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogZnJwcyBjb250cm9sIGhvc3Q7IGRlZmF1bHRzIHRvIHRoZSBGUlAgcHVibGljIGRvbWFpbi4gRW52IGBGUlBfU0VSVkVSYC4gKi9cbiAgZnJwU2VydmVyPzogc3RyaW5nO1xuICAvKiogRlJQIHB1YmxpYyBIVFRQIGhvc3QuIEVudiBgVFVOTkVMX0ZSUF9QVUJMSUNfRE9NQUlOYC4gKi9cbiAgZnJwUHVibGljRG9tYWluPzogc3RyaW5nO1xuICAvKiogZnJwcyBjb250cm9sIHBvcnQuIEVudiBgRlJQX1NFUlZFUl9QT1JUYDsgZGVmYXVsdHMgdG8gYDQ0M2AuICovXG4gIGZycFNlcnZlclBvcnQ/OiBudW1iZXI7XG4gIC8qKiBmcnBjIHRyYW5zcG9ydCBwcm90b2NvbC4gRW52IGBGUlBfUFJPVE9DT0xgOyBkZWZhdWx0cyB0byBgd3NzYC4gKi9cbiAgZnJwUHJvdG9jb2w/OiBzdHJpbmc7XG4gIC8qKiBmcnBzIGF1dGggdG9rZW4uIEVudiBgRlJQX1RPS0VOYCAob3IgYFRVTk5FTF9UT0tFTmApLiAqL1xuICBmcnBUb2tlbj86IHN0cmluZztcbiAgLyoqIGZycCBwcm94eSByZWdpc3RyYXRpb24gbmFtZS4gRW52IGBGUlBfUFJPWFlfTkFNRWAuICovXG4gIGZycFByb3h5TmFtZT86IHN0cmluZztcbn1cblxuLyoqIFB1YmxpYyB0dW5uZWwgY2xpZW50cyBzdXBwb3J0ZWQgYnkgdGhlIGludGVyY2VwdG9yIGFuZCBDTEkuICovXG5leHBvcnQgdHlwZSBUdW5uZWxUcmFuc3BvcnQgPSBcInBvcnRyXCIgfCBcImZycFwiIHwgXCJib3RoXCI7XG5cbi8qKiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSB0aGUgdHVubmVsIHRyYW5zcG9ydCBzZWxlY3Rvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHVubmVsVHJhbnNwb3J0KHRyYW5zcG9ydD86IHN0cmluZyk6IFR1bm5lbFRyYW5zcG9ydCB7XG4gIGNvbnN0IHJlc29sdmVkID1cbiAgICB0cmFuc3BvcnQgPz9cbiAgICBwcm9jZXNzLmVudi5EQlhfVE9PTFNfVFVOTkVMX1RSQU5TUE9SVCA/P1xuICAgIHByb2Nlc3MuZW52LlRVTk5FTF9UUkFOU1BPUlQgPz9cbiAgICBcInBvcnRyXCI7XG4gIGlmIChyZXNvbHZlZCA9PT0gXCJwb3J0clwiIHx8IHJlc29sdmVkID09PSBcImZycFwiIHx8IHJlc29sdmVkID09PSBcImJvdGhcIikgcmV0dXJuIHJlc29sdmVkO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnZhbGlkIHR1bm5lbCB0cmFuc3BvcnQ6ICR7cmVzb2x2ZWR9IChleHBlY3RlZCBwb3J0ciwgZnJwLCBvciBib3RoKWApO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgcHVibGljIHBvcnQgcG9ydHIgc2hvdWxkIHRhcmdldDogZXhwbGljaXQsIGVsc2UgdGhlIEFwcHMgY29udHJhY3QuICovXG5mdW5jdGlvbiByZXNvbHZlUHVibGljUG9ydChwb3J0PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBvcnQgPz8gb2JqZWN0LnRvTnVtYmVyKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX1BPUlQpID8/IDgwMDA7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHR1bm5lbCB7QGxpbmsgSW50ZXJjZXB0b3J9LiBQYXNzIGl0IHRvIGBjcmVhdGVBcHAoeyBpbnRlcmNlcHRvciB9KWAuXG4gKlxuICogQSBuby1vcCAobG9ncyBhbmQgcmV0dXJucykgd2hlbiBub25lIG9mIHRoZSBzZWxlY3RlZCB0dW5uZWwgY2xpZW50cyByZXNvbHZlXG4gKiB1c2FibGUgY29uZmlndXJhdGlvbiwgc28gYW4gYXBwIGNhbiByZWdpc3RlciBpdCB1bmNvbmRpdGlvbmFsbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgdHVubmVsSW50ZXJjZXB0b3IgfSBmcm9tIFwiQGRieC10b29scy90dW5uZWxcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW3NlcnZlcih7IGhvc3QsIHN0YXRpY1BhdGggfSldLFxuICogICBpbnRlcmNlcHRvcjogdHVubmVsSW50ZXJjZXB0b3IoKSxcbiAqIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHVubmVsSW50ZXJjZXB0b3Iob3B0aW9uczogVHVubmVsSW50ZXJjZXB0b3JPcHRpb25zID0ge30pOiBJbnRlcmNlcHRvciB7XG4gIHJldHVybiBhc3luYyAoY3R4OiBJbnRlcmNlcHRvckNvbnRleHQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoY3R4LmVudi5kYXRhYnJpY2tzSG9zdCkge1xuICAgICAgcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUID8/PSBjdHguZW52LmRhdGFicmlja3NIb3N0O1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSByZXNvbHZlUHVibGljUG9ydChvcHRpb25zLnBvcnQpO1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHJlc29sdmVUdW5uZWxUcmFuc3BvcnQob3B0aW9ucy50cmFuc3BvcnQpO1xuICAgIGNvbnN0IGNoaWxkcmVuOiBDaGlsZFByb2Nlc3NbXSA9IFtdO1xuICAgIGlmICh0cmFuc3BvcnQgPT09IFwicG9ydHJcIiB8fCB0cmFuc3BvcnQgPT09IFwiYm90aFwiKSB7XG4gICAgICBjb25zdCBwb3J0ckNvbmZpZyA9IHJlc29sdmVQb3J0ckNvbmZpZyh7XG4gICAgICAgIHB1YmxpY0RvbWFpbjogb3B0aW9ucy5wdWJsaWNEb21haW4sXG4gICAgICAgIHN1YmRvbWFpbjogb3B0aW9ucy5zdWJkb21haW4sXG4gICAgICAgIHBvcnQsXG4gICAgICB9KTtcbiAgICAgIGlmIChwb3J0ckNvbmZpZykge1xuICAgICAgICBjb25zdCBwb3J0ckVudiA9IGF3YWl0IGluc3RhbGxQb3J0cigpO1xuICAgICAgICBhd2FpdCB3cml0ZVBvcnRyQ29uZmlnKHBvcnRyQ29uZmlnLCBwb3J0ckVudik7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goYXdhaXQgc3RhcnRQb3J0cihwb3J0ckNvbmZpZywgcG9ydHJFbnYpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwicG9ydHIgbm90IGNvbmZpZ3VyZWQgKHJlcXVpcmVzIFBPUlRSX1RPS0VOIGFuZCBUVU5ORUxfUFVCTElDX0RPTUFJTilcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0cmFuc3BvcnQgPT09IFwiZnJwXCIgfHwgdHJhbnNwb3J0ID09PSBcImJvdGhcIikge1xuICAgICAgY29uc3QgZnJwQ29uZmlnID0gcmVzb2x2ZUZycENvbmZpZyh7XG4gICAgICAgIHB1YmxpY0RvbWFpbjogb3B0aW9ucy5mcnBQdWJsaWNEb21haW4sXG4gICAgICAgIHNlcnZlcjogb3B0aW9ucy5mcnBTZXJ2ZXIsXG4gICAgICAgIHNlcnZlclBvcnQ6IG9wdGlvbnMuZnJwU2VydmVyUG9ydCxcbiAgICAgICAgcHJvdG9jb2w6IG9wdGlvbnMuZnJwUHJvdG9jb2wsXG4gICAgICAgIHRva2VuOiBvcHRpb25zLmZycFRva2VuLFxuICAgICAgICBwcm94eU5hbWU6IG9wdGlvbnMuZnJwUHJveHlOYW1lLFxuICAgICAgICBwb3J0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZnJwQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IGZycEVudiA9IGF3YWl0IGluc3RhbGxGcnAoKTtcbiAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGF3YWl0IHdyaXRlRnJwQ29uZmlnKGZycENvbmZpZywgZnJwRW52KTtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChzdGFydEZycChmcnBDb25maWcsIGZycEVudiwgY29uZmlnUGF0aCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJmcnAgbm90IGNvbmZpZ3VyZWQgKHJlcXVpcmVzIFRVTk5FTF9QVUJMSUNfRE9NQUlOKVwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjaGlsZHJlbi5sZW5ndGgpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSBjdHguYmluZFByb2Nlc3MoY2hpbGQpO1xuICAgIGN0eC5vbkxpZmVjeWNsZShcInNodXRkb3duXCIsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIGlmICghY2hpbGQua2lsbGVkKSBjaGlsZC5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhgdHVubmVsIGJvdW5kOiAke3RyYW5zcG9ydH0gLT4gOiR7cG9ydH1gKTtcbiAgfTtcbn1cbiJdfQ==
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBSUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQXFDaEQsMERBQTBEO0FBQzFELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxTQUFrQjtJQUN2RCxNQUFNLFFBQVEsR0FDWixTQUFTO1FBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEI7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0I7UUFDNUIsT0FBTyxDQUFDO0lBQ1YsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLFFBQVEsS0FBSyxLQUFLLElBQUksUUFBUSxLQUFLLE1BQU07UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUN2RixNQUFNLElBQUksU0FBUyxDQUFDLDZCQUE2QixRQUFRLGlDQUFpQyxDQUFDLENBQUM7QUFDOUYsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixTQUFTLGlCQUFpQixDQUFDLElBQWE7SUFDdEMsT0FBTyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLElBQUksSUFBSSxDQUFDO0FBQzFFLENBQUM7QUFFRDs7Ozs7Ozs7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UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQzdCLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUTtZQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1lBQy9CLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUTtnQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07b0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLFNBQVMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGB0dW5uZWxJbnRlcmNlcHRvcigpYCAtIHRoZSB7QGxpbmsgSW50ZXJjZXB0b3J9IHRoYXQgZnJvbnRzIGFuIGFwcCB3aXRoIGEgcHVibGljXG4gKiBwb3J0ciBhbmQvb3IgZnJwIHR1bm5lbCwgY29uc3VtaW5nIHRoZSB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSBgQGRieC10b29scy9hcHBraXRgJ3NcbiAqIGBjcmVhdGVBcHBgIGhhbmRzIGl0LlxuICpcbiAqIFRoZSB0dW5uZWwgcnVucyBJTi1QUk9DRVNTOiB0aGUgQVBQIGlzIHRoZSBtYWluIHByb2Nlc3MgYW5kIGhhbmRzIHRoaXMgaW50ZXJjZXB0b3JcbiAqIGl0cyBjb250ZXh0LCByYXRoZXIgdGhhbiBhIHdyYXBwZXIgcHJvY2VzcyBzcGF3bmluZyB0aGUgYXBwIGFzIGEgY2hpbGQuIFRoZVxuICogaW50ZXJjZXB0b3IgYXBwbGllcyB0aGUgY29tcHV0ZWQgd29ya3NwYWNlIGhvc3QsIGluc3RhbGxzIGFuZCBsYXVuY2hlcyBwb3J0ciBvbiB0aGVcbiAqIGFwcCdzIHB1YmxpYyBwb3J0LCBiaW5kcyB0aGUgY2hpbGQgcHJvY2VzcyB0byB0aGUgYXBwLCBhbmQgc3RvcHMgcG9ydHIgZHVyaW5nIGFuXG4gKiBvcmRlcmx5IEFwcEtpdCBzaHV0ZG93bi5cbiAqXG4gKiBUaGUgcGFzc3dvcmRsZXNzIEdBVEUgaXMgYSBzZXBhcmF0ZSBjb25jZXJuOiBpdCBpcyB0aGUgYGF1dGhHYXRlYCBBcHBLaXQgcGx1Z2luLFxuICogd2hpY2ggcmVnaXN0ZXJzIHRoZSBsb2dpbiByb3V0ZXMgKyBhIGdhdGluZyBtaWRkbGV3YXJlIG9uIHRoZSBhcHAncyBvd24gc2VydmVyLlxuICogUmVnaXN0ZXIgaXQgaW4gdGhlIGFwcCdzIGBwbHVnaW5zYCBmb3IgZ2F0ZWQgdHJhZmZpYy4gVGhpcyBpbnRlcmNlcHRvciBpcyBvbmx5XG4gKiB0aGUgcG9ydHIgaGFsZiAtIFwidXBkYXRlIHRoZSBob3N0LCBiaW5kIHBvcnRyXCIgLSB0aGUgc21hbGxlc3QgdXNlZnVsIHVuaXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmNlcHRvciwgSW50ZXJjZXB0b3JDb250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBsb2csIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBpbnN0YWxsRnJwLCByZXNvbHZlRnJwQ29uZmlnLCBzdGFydEZycCwgd3JpdGVGcnBDb25maWcgfSBmcm9tIFwiLi9mcnAudHNcIjtcbmltcG9ydCB7IGluc3RhbGxQb3J0ciwgcmVzb2x2ZVBvcnRyQ29uZmlnLCBzdGFydFBvcnRyLCB3cml0ZVBvcnRyQ29uZmlnIH0gZnJvbSBcIi4vcG9ydHIudHNcIjtcbmltcG9ydCB7IHN0YXJ0UGF0aFByb3h5IH0gZnJvbSBcIi4vcGF0aC1wcm94eS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwidHVubmVsOmludGVyY2VwdG9yXCIpO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHR1bm5lbEludGVyY2VwdG9yfSAoZWFjaCBhbHNvIHJlc29sdmFibGUgZnJvbSBlbnYpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUdW5uZWxJbnRlcmNlcHRvck9wdGlvbnMge1xuICAvKiogVHVubmVsIGNsaWVudHMgdG8gcnVuLiBFbnYgYERCWF9UT09MU19UVU5ORUxfVFJBTlNQT1JUYDsgZGVmYXVsdHMgdG8gYHBvcnRyYC4gKi9cbiAgdHJhbnNwb3J0PzogVHVubmVsVHJhbnNwb3J0O1xuICAvKiogUHVibGljIGhvc3QgdG8gc2VydmUgb24uIEVudiBgVFVOTkVMX1BVQkxJQ19ET01BSU5gLiAqL1xuICBwdWJsaWNEb21haW4/OiBzdHJpbmc7XG4gIC8qKiBwb3J0ciBzdWJkb21haW4gKGVsc2UgZGVyaXZlZCBmcm9tIHtAbGluayBwdWJsaWNEb21haW59KS4gKi9cbiAgc3ViZG9tYWluPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFBVQkxJQyBwb3J0IHBvcnRyIGZvcndhcmRzIHRvIC0gdGhlIHBvcnQgdGhlIGFwcCBpdHNlbGYgbGlzdGVucyBvbi5cbiAgICogRGVmYXVsdHMgdG8gdGhlIERhdGFicmlja3MgQXBwcyBydW50aW1lIGNvbnRyYWN0IGBEQVRBQlJJQ0tTX0FQUF9QT1JUYFxuICAgKiAodGhlbiBgODAwMGApLCB3aGljaCBpcyB0aGUgcG9ydCB0aGUgcGxhdGZvcm0gcm91dGVzIHRvLlxuICAgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIGZycHMgY29udHJvbCBob3N0OyBkZWZhdWx0cyB0byB0aGUgRlJQIHB1YmxpYyBkb21haW4uIEVudiBgRlJQX1NFUlZFUmAuICovXG4gIGZycFNlcnZlcj86IHN0cmluZztcbiAgLyoqIEZSUCBwdWJsaWMgSFRUUCBob3N0LiBFbnYgYFRVTk5FTF9GUlBfUFVCTElDX0RPTUFJTmAuICovXG4gIGZycFB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgLyoqIGZycHMgY29udHJvbCBwb3J0LiBFbnYgYEZSUF9TRVJWRVJfUE9SVGA7IGRlZmF1bHRzIHRvIGA0NDNgLiAqL1xuICBmcnBTZXJ2ZXJQb3J0PzogbnVtYmVyO1xuICAvKiogZnJwYyB0cmFuc3BvcnQgcHJvdG9jb2wuIEVudiBgRlJQX1BST1RPQ09MYDsgZGVmYXVsdHMgdG8gYHdzc2AuICovXG4gIGZycFByb3RvY29sPzogc3RyaW5nO1xuICAvKiogZnJwcyBhdXRoIHRva2VuLiBFbnYgYEZSUF9UT0tFTmAgKG9yIGBUVU5ORUxfVE9LRU5gKS4gKi9cbiAgZnJwVG9rZW4/OiBzdHJpbmc7XG4gIC8qKiBmcnAgcHJveHkgcmVnaXN0cmF0aW9uIG5hbWUuIEVudiBgRlJQX1BST1hZX05BTUVgLiAqL1xuICBmcnBQcm94eU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBGUlAgcGF0aCBsb2NhdGlvbi4gRW52IGBGUlBfUEFUSGA7IGRlZmF1bHRzIHRvIGBEQVRBQlJJQ0tTX0FQUF9OQU1FYC4gKi9cbiAgZnJwUGF0aD86IHN0cmluZztcbiAgLyoqIFN0cmlwIHRoZSBGUlAgcGF0aCBiZWZvcmUgZm9yd2FyZGluZy4gRW52IGBGUlBfU1RSSVBfUFJFRklYYDsgZGVmYXVsdHMgdHJ1ZSBmb3Igbm9uLXJvb3QgcGF0aHMuICovXG4gIGZycFN0cmlwUHJlZml4PzogYm9vbGVhbjtcbn1cblxuLyoqIFB1YmxpYyB0dW5uZWwgY2xpZW50cyBzdXBwb3J0ZWQgYnkgdGhlIGludGVyY2VwdG9yIGFuZCBDTEkuICovXG5leHBvcnQgdHlwZSBUdW5uZWxUcmFuc3BvcnQgPSBcInBvcnRyXCIgfCBcImZycFwiIHwgXCJib3RoXCI7XG5cbi8qKiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSB0aGUgdHVubmVsIHRyYW5zcG9ydCBzZWxlY3Rvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHVubmVsVHJhbnNwb3J0KHRyYW5zcG9ydD86IHN0cmluZyk6IFR1bm5lbFRyYW5zcG9ydCB7XG4gIGNvbnN0IHJlc29sdmVkID1cbiAgICB0cmFuc3BvcnQgPz9cbiAgICBwcm9jZXNzLmVudi5EQlhfVE9PTFNfVFVOTkVMX1RSQU5TUE9SVCA/P1xuICAgIHByb2Nlc3MuZW52LlRVTk5FTF9UUkFOU1BPUlQgPz9cbiAgICBcInBvcnRyXCI7XG4gIGlmIChyZXNvbHZlZCA9PT0gXCJwb3J0clwiIHx8IHJlc29sdmVkID09PSBcImZycFwiIHx8IHJlc29sdmVkID09PSBcImJvdGhcIikgcmV0dXJuIHJlc29sdmVkO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnZhbGlkIHR1bm5lbCB0cmFuc3BvcnQ6ICR7cmVzb2x2ZWR9IChleHBlY3RlZCBwb3J0ciwgZnJwLCBvciBib3RoKWApO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgcHVibGljIHBvcnQgcG9ydHIgc2hvdWxkIHRhcmdldDogZXhwbGljaXQsIGVsc2UgdGhlIEFwcHMgY29udHJhY3QuICovXG5mdW5jdGlvbiByZXNvbHZlUHVibGljUG9ydChwb3J0PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBvcnQgPz8gb2JqZWN0LnRvTnVtYmVyKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX1BPUlQpID8/IDgwMDA7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHR1bm5lbCB7QGxpbmsgSW50ZXJjZXB0b3J9LiBQYXNzIGl0IHRvIGBjcmVhdGVBcHAoeyBpbnRlcmNlcHRvciB9KWAuXG4gKlxuICogQSBuby1vcCAobG9ncyBhbmQgcmV0dXJucykgd2hlbiBub25lIG9mIHRoZSBzZWxlY3RlZCB0dW5uZWwgY2xpZW50cyByZXNvbHZlXG4gKiB1c2FibGUgY29uZmlndXJhdGlvbiwgc28gYW4gYXBwIGNhbiByZWdpc3RlciBpdCB1bmNvbmRpdGlvbmFsbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgdHVubmVsSW50ZXJjZXB0b3IgfSBmcm9tIFwiQGRieC10b29scy90dW5uZWxcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW3NlcnZlcih7IGhvc3QsIHN0YXRpY1BhdGggfSldLFxuICogICBpbnRlcmNlcHRvcjogdHVubmVsSW50ZXJjZXB0b3IoKSxcbiAqIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHVubmVsSW50ZXJjZXB0b3Iob3B0aW9uczogVHVubmVsSW50ZXJjZXB0b3JPcHRpb25zID0ge30pOiBJbnRlcmNlcHRvciB7XG4gIHJldHVybiBhc3luYyAoY3R4OiBJbnRlcmNlcHRvckNvbnRleHQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoY3R4LmVudi5kYXRhYnJpY2tzSG9zdCkge1xuICAgICAgcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUID8/PSBjdHguZW52LmRhdGFicmlja3NIb3N0O1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSByZXNvbHZlUHVibGljUG9ydChvcHRpb25zLnBvcnQpO1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHJlc29sdmVUdW5uZWxUcmFuc3BvcnQob3B0aW9ucy50cmFuc3BvcnQpO1xuICAgIGNvbnN0IGNoaWxkcmVuOiBDaGlsZFByb2Nlc3NbXSA9IFtdO1xuICAgIGlmICh0cmFuc3BvcnQgPT09IFwicG9ydHJcIiB8fCB0cmFuc3BvcnQgPT09IFwiYm90aFwiKSB7XG4gICAgICBjb25zdCBwb3J0ckNvbmZpZyA9IHJlc29sdmVQb3J0ckNvbmZpZyh7XG4gICAgICAgIHB1YmxpY0RvbWFpbjogb3B0aW9ucy5wdWJsaWNEb21haW4sXG4gICAgICAgIHN1YmRvbWFpbjogb3B0aW9ucy5zdWJkb21haW4sXG4gICAgICAgIHBvcnQsXG4gICAgICB9KTtcbiAgICAgIGlmIChwb3J0ckNvbmZpZykge1xuICAgICAgICBjb25zdCBwb3J0ckVudiA9IGF3YWl0IGluc3RhbGxQb3J0cigpO1xuICAgICAgICBhd2FpdCB3cml0ZVBvcnRyQ29uZmlnKHBvcnRyQ29uZmlnLCBwb3J0ckVudik7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goYXdhaXQgc3RhcnRQb3J0cihwb3J0ckNvbmZpZywgcG9ydHJFbnYpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwicG9ydHIgbm90IGNvbmZpZ3VyZWQgKHJlcXVpcmVzIFBPUlRSX1RPS0VOIGFuZCBUVU5ORUxfUFVCTElDX0RPTUFJTilcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0cmFuc3BvcnQgPT09IFwiZnJwXCIgfHwgdHJhbnNwb3J0ID09PSBcImJvdGhcIikge1xuICAgICAgY29uc3QgZnJwQ29uZmlnID0gcmVzb2x2ZUZycENvbmZpZyh7XG4gICAgICAgIHB1YmxpY0RvbWFpbjogb3B0aW9ucy5mcnBQdWJsaWNEb21haW4sXG4gICAgICAgIHNlcnZlcjogb3B0aW9ucy5mcnBTZXJ2ZXIsXG4gICAgICAgIHNlcnZlclBvcnQ6IG9wdGlvbnMuZnJwU2VydmVyUG9ydCxcbiAgICAgICAgcHJvdG9jb2w6IG9wdGlvbnMuZnJwUHJvdG9jb2wsXG4gICAgICAgIHRva2VuOiBvcHRpb25zLmZycFRva2VuLFxuICAgICAgICBwcm94eU5hbWU6IG9wdGlvbnMuZnJwUHJveHlOYW1lLFxuICAgICAgICBwYXRoOiBvcHRpb25zLmZycFBhdGgsXG4gICAgICAgIHN0cmlwUHJlZml4OiBvcHRpb25zLmZycFN0cmlwUHJlZml4LFxuICAgICAgICBwb3J0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZnJwQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHBhdGhQcm94eSA9XG4gICAgICAgICAgZnJwQ29uZmlnLnN0cmlwUHJlZml4ICYmIGZycENvbmZpZy5wYXRoICE9PSBcIi9cIlxuICAgICAgICAgICAgPyBhd2FpdCBzdGFydFBhdGhQcm94eShwb3J0LCBmcnBDb25maWcucGF0aClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAocGF0aFByb3h5KSB7XG4gICAgICAgICAgZnJwQ29uZmlnLnRhcmdldFBvcnQgPSBwYXRoUHJveHkucG9ydDtcbiAgICAgICAgICBjdHgub25MaWZlY3ljbGUoXCJzaHV0ZG93blwiLCAoKSA9PiB2b2lkIHBhdGhQcm94eS5jbG9zZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcnBFbnYgPSBhd2FpdCBpbnN0YWxsRnJwKCk7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBhd2FpdCB3cml0ZUZycENvbmZpZyhmcnBDb25maWcsIGZycEVudik7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goc3RhcnRGcnAoZnJwQ29uZmlnLCBmcnBFbnYsIGNvbmZpZ1BhdGgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiZnJwIG5vdCBjb25maWd1cmVkIChyZXF1aXJlcyBUVU5ORUxfUFVCTElDX0RPTUFJTilcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikgY3R4LmJpbmRQcm9jZXNzKGNoaWxkKTtcbiAgICBjdHgub25MaWZlY3ljbGUoXCJzaHV0ZG93blwiLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSBpZiAoIWNoaWxkLmtpbGxlZCkgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG4gICAgfSk7XG4gICAgbG9nZ2VyLmluZm8oYHR1bm5lbCBib3VuZDogJHt0cmFuc3BvcnR9IC0+IDoke3BvcnR9YCk7XG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import ProxyModule from "http-proxy-3";
|
|
3
|
+
function stripPathPrefix(request, prefix) {
|
|
4
|
+
if (prefix === "/")
|
|
5
|
+
return;
|
|
6
|
+
const url = request.url ?? "/";
|
|
7
|
+
if (url === prefix)
|
|
8
|
+
request.url = "/";
|
|
9
|
+
else if (url.startsWith(`${prefix}/`) || url.startsWith(`${prefix}?`)) {
|
|
10
|
+
request.url = url.slice(prefix.length) || "/";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function startPathProxy(appPort, path) {
|
|
14
|
+
const proxy = ProxyModule.createProxyServer({
|
|
15
|
+
target: `http://127.0.0.1:${appPort}`,
|
|
16
|
+
ws: true,
|
|
17
|
+
xfwd: true,
|
|
18
|
+
});
|
|
19
|
+
const server = createServer((request, response) => {
|
|
20
|
+
stripPathPrefix(request, path);
|
|
21
|
+
proxy.web(request, response);
|
|
22
|
+
});
|
|
23
|
+
server.on("upgrade", (request, socket, head) => {
|
|
24
|
+
stripPathPrefix(request, path);
|
|
25
|
+
proxy.ws(request, socket, head);
|
|
26
|
+
});
|
|
27
|
+
await new Promise((resolve, reject) => {
|
|
28
|
+
server.once("error", reject);
|
|
29
|
+
server.listen(0, "127.0.0.1", resolve);
|
|
30
|
+
});
|
|
31
|
+
const address = server.address();
|
|
32
|
+
return {
|
|
33
|
+
port: address.port,
|
|
34
|
+
close: () => new Promise((resolve, reject) => server.close((error) => (error ? reject(error) : resolve()))),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC1wcm94eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRoLXByb3h5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQXdCLE1BQU0sV0FBVyxDQUFDO0FBRS9ELE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUV2QyxTQUFTLGVBQWUsQ0FBQyxPQUF3QixFQUFFLE1BQWM7SUFDL0QsSUFBSSxNQUFNLEtBQUssR0FBRztRQUFFLE9BQU87SUFDM0IsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDL0IsSUFBSSxHQUFHLEtBQUssTUFBTTtRQUFFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1NBQ2pDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUNoRCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUNsQyxPQUFlLEVBQ2YsSUFBWTtJQUVaLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQztRQUMxQyxNQUFNLEVBQUUsb0JBQW9CLE9BQU8sRUFBRTtRQUNyQyxFQUFFLEVBQUUsSUFBSTtRQUNSLElBQUksRUFBRSxJQUFJO0tBQ1gsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQ2hELGVBQWUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDN0MsZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvQixLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQWlCLENBQUM7SUFDaEQsT0FBTztRQUNMLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixLQUFLLEVBQUUsR0FBRyxFQUFFLENBQ1YsSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FDcEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUM3RDtLQUNKLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlU2VydmVyLCB0eXBlIEluY29taW5nTWVzc2FnZSB9IGZyb20gXCJub2RlOmh0dHBcIjtcbmltcG9ydCB0eXBlIHsgQWRkcmVzc0luZm8gfSBmcm9tIFwibm9kZTpuZXRcIjtcbmltcG9ydCBQcm94eU1vZHVsZSBmcm9tIFwiaHR0cC1wcm94eS0zXCI7XG5cbmZ1bmN0aW9uIHN0cmlwUGF0aFByZWZpeChyZXF1ZXN0OiBJbmNvbWluZ01lc3NhZ2UsIHByZWZpeDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChwcmVmaXggPT09IFwiL1wiKSByZXR1cm47XG4gIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsID8/IFwiL1wiO1xuICBpZiAodXJsID09PSBwcmVmaXgpIHJlcXVlc3QudXJsID0gXCIvXCI7XG4gIGVsc2UgaWYgKHVybC5zdGFydHNXaXRoKGAke3ByZWZpeH0vYCkgfHwgdXJsLnN0YXJ0c1dpdGgoYCR7cHJlZml4fT9gKSkge1xuICAgIHJlcXVlc3QudXJsID0gdXJsLnNsaWNlKHByZWZpeC5sZW5ndGgpIHx8IFwiL1wiO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFBhdGhQcm94eShcbiAgYXBwUG9ydDogbnVtYmVyLFxuICBwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPHsgcG9ydDogbnVtYmVyOyBjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPiB9PiB7XG4gIGNvbnN0IHByb3h5ID0gUHJveHlNb2R1bGUuY3JlYXRlUHJveHlTZXJ2ZXIoe1xuICAgIHRhcmdldDogYGh0dHA6Ly8xMjcuMC4wLjE6JHthcHBQb3J0fWAsXG4gICAgd3M6IHRydWUsXG4gICAgeGZ3ZDogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigocmVxdWVzdCwgcmVzcG9uc2UpID0+IHtcbiAgICBzdHJpcFBhdGhQcmVmaXgocmVxdWVzdCwgcGF0aCk7XG4gICAgcHJveHkud2ViKHJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgfSk7XG4gIHNlcnZlci5vbihcInVwZ3JhZGVcIiwgKHJlcXVlc3QsIHNvY2tldCwgaGVhZCkgPT4ge1xuICAgIHN0cmlwUGF0aFByZWZpeChyZXF1ZXN0LCBwYXRoKTtcbiAgICBwcm94eS53cyhyZXF1ZXN0LCBzb2NrZXQsIGhlYWQpO1xuICB9KTtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNlcnZlci5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICBzZXJ2ZXIubGlzdGVuKDAsIFwiMTI3LjAuMC4xXCIsIHJlc29sdmUpO1xuICB9KTtcbiAgY29uc3QgYWRkcmVzcyA9IHNlcnZlci5hZGRyZXNzKCkgYXMgQWRkcmVzc0luZm87XG4gIHJldHVybiB7XG4gICAgcG9ydDogYWRkcmVzcy5wb3J0LFxuICAgIGNsb3NlOiAoKSA9PlxuICAgICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgICAgc2VydmVyLmNsb3NlKChlcnJvcikgPT4gKGVycm9yID8gcmVqZWN0KGVycm9yKSA6IHJlc29sdmUoKSkpLFxuICAgICAgKSxcbiAgfTtcbn1cbiJdfQ==
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/_config.ts","../src/allowlist.ts","../src/code-email.ts","../src/frp.ts","../src/gate.ts","../src/headers.ts","../src/interceptor.ts","../src/login-page.ts","../src/plugin.ts","../src/portr.ts","../src/send-code.ts","../src/signing-key.ts","../index.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/_config.ts","../src/allowlist.ts","../src/code-email.ts","../src/frp.ts","../src/gate.ts","../src/headers.ts","../src/interceptor.ts","../src/login-page.ts","../src/path-proxy.ts","../src/plugin.ts","../src/portr.ts","../src/send-code.ts","../src/signing-key.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -18,21 +18,22 @@
|
|
|
18
18
|
"projen": "projen"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@dbx-tools/email": "0.6.
|
|
21
|
+
"@dbx-tools/email": "0.6.113",
|
|
22
22
|
"@types/bun": "^1.3.14",
|
|
23
23
|
"@types/node": "^24.6.0",
|
|
24
24
|
"typescript": "^5.9.3"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
|
-
"@dbx-tools/email": "0.6.
|
|
27
|
+
"@dbx-tools/email": "0.6.113"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@databricks/appkit": "^0.60.0",
|
|
31
|
-
"@dbx-tools/appkit": "0.6.
|
|
32
|
-
"@dbx-tools/auth": "0.6.
|
|
33
|
-
"@dbx-tools/core": "0.6.
|
|
34
|
-
"@dbx-tools/shared-auth": "0.6.
|
|
35
|
-
"@dbx-tools/shared-core": "0.6.
|
|
31
|
+
"@dbx-tools/appkit": "0.6.113",
|
|
32
|
+
"@dbx-tools/auth": "0.6.113",
|
|
33
|
+
"@dbx-tools/core": "0.6.113",
|
|
34
|
+
"@dbx-tools/shared-auth": "0.6.113",
|
|
35
|
+
"@dbx-tools/shared-core": "0.6.113",
|
|
36
|
+
"http-proxy-3": "^1.23.1"
|
|
36
37
|
},
|
|
37
38
|
"main": "./lib/index.js",
|
|
38
39
|
"license": "UNLICENSED",
|
|
@@ -48,7 +49,7 @@
|
|
|
48
49
|
"./package.json": "./package.json"
|
|
49
50
|
}
|
|
50
51
|
},
|
|
51
|
-
"version": "0.6.
|
|
52
|
+
"version": "0.6.113",
|
|
52
53
|
"types": "./lib/index.d.ts",
|
|
53
54
|
"type": "module",
|
|
54
55
|
"exports": {
|
package/src/frp.ts
CHANGED
|
@@ -36,7 +36,10 @@ export interface FrpConfig {
|
|
|
36
36
|
protocol: string;
|
|
37
37
|
token?: string;
|
|
38
38
|
proxyName: string;
|
|
39
|
+
path: string;
|
|
40
|
+
stripPrefix: boolean;
|
|
39
41
|
port: number;
|
|
42
|
+
targetPort: number;
|
|
40
43
|
}
|
|
41
44
|
|
|
42
45
|
function bareHost(value: string | undefined): string | undefined {
|
|
@@ -45,6 +48,12 @@ function bareHost(value: string | undefined): string | undefined {
|
|
|
45
48
|
return normalized || undefined;
|
|
46
49
|
}
|
|
47
50
|
|
|
51
|
+
function normalizePath(value: string | undefined): string {
|
|
52
|
+
const trimmed = value?.trim();
|
|
53
|
+
if (!trimmed || trimmed === "/") return "/";
|
|
54
|
+
return `/${trimmed.replace(/^\/+|\/+$/g, "")}`;
|
|
55
|
+
}
|
|
56
|
+
|
|
48
57
|
/** Resolve frpc config from the public domain and FRP-specific environment. */
|
|
49
58
|
export function resolveFrpConfig(opts: {
|
|
50
59
|
publicDomain?: string;
|
|
@@ -53,7 +62,10 @@ export function resolveFrpConfig(opts: {
|
|
|
53
62
|
protocol?: string;
|
|
54
63
|
token?: string;
|
|
55
64
|
proxyName?: string;
|
|
65
|
+
path?: string;
|
|
66
|
+
stripPrefix?: boolean;
|
|
56
67
|
port: number;
|
|
68
|
+
targetPort?: number;
|
|
57
69
|
}): FrpConfig | undefined {
|
|
58
70
|
const publicDomain = bareHost(
|
|
59
71
|
config.string(
|
|
@@ -69,6 +81,9 @@ export function resolveFrpConfig(opts: {
|
|
|
69
81
|
const token = config.string(opts.token, ["FRP_TOKEN", "TUNNEL_TOKEN"]);
|
|
70
82
|
const proxyName =
|
|
71
83
|
config.string(opts.proxyName, "FRP_PROXY_NAME") ?? publicDomain.split(".")[0] ?? "app";
|
|
84
|
+
const appName = config.string(undefined, "DATABRICKS_APP_NAME") ?? proxyName;
|
|
85
|
+
const path = normalizePath(config.string(opts.path, "FRP_PATH") ?? appName);
|
|
86
|
+
const stripPrefix = config.boolean(opts.stripPrefix, "FRP_STRIP_PREFIX") ?? path !== "/";
|
|
72
87
|
return {
|
|
73
88
|
publicDomain,
|
|
74
89
|
server,
|
|
@@ -76,7 +91,10 @@ export function resolveFrpConfig(opts: {
|
|
|
76
91
|
protocol,
|
|
77
92
|
...(token ? { token } : {}),
|
|
78
93
|
proxyName,
|
|
94
|
+
path,
|
|
95
|
+
stripPrefix,
|
|
79
96
|
port: opts.port,
|
|
97
|
+
targetPort: opts.targetPort ?? opts.port,
|
|
80
98
|
};
|
|
81
99
|
}
|
|
82
100
|
|
|
@@ -164,8 +182,9 @@ export async function writeFrpConfig(
|
|
|
164
182
|
"[[proxies]]",
|
|
165
183
|
`name = ${tomlString(resolved.proxyName)}`,
|
|
166
184
|
'type = "http"',
|
|
167
|
-
`localPort = ${resolved.
|
|
185
|
+
`localPort = ${resolved.targetPort}`,
|
|
168
186
|
`customDomains = [${tomlString(resolved.publicDomain)}]`,
|
|
187
|
+
...(resolved.path === "/" ? [] : [`locations = [${tomlString(resolved.path)}]`]),
|
|
169
188
|
"",
|
|
170
189
|
);
|
|
171
190
|
await writeFile(path, lines.join("\n"));
|
|
@@ -178,6 +197,8 @@ export function startFrp(
|
|
|
178
197
|
childEnv: NodeJS.ProcessEnv,
|
|
179
198
|
configPath: string,
|
|
180
199
|
): ReturnType<typeof spawn> {
|
|
181
|
-
logger.info(
|
|
200
|
+
logger.info(
|
|
201
|
+
`frpc tunneling https://${resolved.publicDomain}${resolved.path === "/" ? "" : resolved.path} -> :${resolved.port}`,
|
|
202
|
+
);
|
|
182
203
|
return spawn("frpc", ["-c", configPath], { env: childEnv, stdio: "inherit" });
|
|
183
204
|
}
|
package/src/interceptor.ts
CHANGED
|
@@ -22,6 +22,7 @@ import type { Interceptor, InterceptorContext } from "@dbx-tools/appkit";
|
|
|
22
22
|
import { log, object } from "@dbx-tools/shared-core";
|
|
23
23
|
import { installFrp, resolveFrpConfig, startFrp, writeFrpConfig } from "./frp.ts";
|
|
24
24
|
import { installPortr, resolvePortrConfig, startPortr, writePortrConfig } from "./portr.ts";
|
|
25
|
+
import { startPathProxy } from "./path-proxy.ts";
|
|
25
26
|
|
|
26
27
|
const logger = log.logger("tunnel:interceptor");
|
|
27
28
|
|
|
@@ -51,6 +52,10 @@ export interface TunnelInterceptorOptions {
|
|
|
51
52
|
frpToken?: string;
|
|
52
53
|
/** frp proxy registration name. Env `FRP_PROXY_NAME`. */
|
|
53
54
|
frpProxyName?: string;
|
|
55
|
+
/** FRP path location. Env `FRP_PATH`; defaults to `DATABRICKS_APP_NAME`. */
|
|
56
|
+
frpPath?: string;
|
|
57
|
+
/** Strip the FRP path before forwarding. Env `FRP_STRIP_PREFIX`; defaults true for non-root paths. */
|
|
58
|
+
frpStripPrefix?: boolean;
|
|
54
59
|
}
|
|
55
60
|
|
|
56
61
|
/** Public tunnel clients supported by the interceptor and CLI. */
|
|
@@ -118,9 +123,19 @@ export function tunnelInterceptor(options: TunnelInterceptorOptions = {}): Inter
|
|
|
118
123
|
protocol: options.frpProtocol,
|
|
119
124
|
token: options.frpToken,
|
|
120
125
|
proxyName: options.frpProxyName,
|
|
126
|
+
path: options.frpPath,
|
|
127
|
+
stripPrefix: options.frpStripPrefix,
|
|
121
128
|
port,
|
|
122
129
|
});
|
|
123
130
|
if (frpConfig) {
|
|
131
|
+
const pathProxy =
|
|
132
|
+
frpConfig.stripPrefix && frpConfig.path !== "/"
|
|
133
|
+
? await startPathProxy(port, frpConfig.path)
|
|
134
|
+
: undefined;
|
|
135
|
+
if (pathProxy) {
|
|
136
|
+
frpConfig.targetPort = pathProxy.port;
|
|
137
|
+
ctx.onLifecycle("shutdown", () => void pathProxy.close());
|
|
138
|
+
}
|
|
124
139
|
const frpEnv = await installFrp();
|
|
125
140
|
const configPath = await writeFrpConfig(frpConfig, frpEnv);
|
|
126
141
|
children.push(startFrp(frpConfig, frpEnv, configPath));
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createServer, type IncomingMessage } from "node:http";
|
|
2
|
+
import type { AddressInfo } from "node:net";
|
|
3
|
+
import ProxyModule from "http-proxy-3";
|
|
4
|
+
|
|
5
|
+
function stripPathPrefix(request: IncomingMessage, prefix: string): void {
|
|
6
|
+
if (prefix === "/") return;
|
|
7
|
+
const url = request.url ?? "/";
|
|
8
|
+
if (url === prefix) request.url = "/";
|
|
9
|
+
else if (url.startsWith(`${prefix}/`) || url.startsWith(`${prefix}?`)) {
|
|
10
|
+
request.url = url.slice(prefix.length) || "/";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export async function startPathProxy(
|
|
15
|
+
appPort: number,
|
|
16
|
+
path: string,
|
|
17
|
+
): Promise<{ port: number; close: () => Promise<void> }> {
|
|
18
|
+
const proxy = ProxyModule.createProxyServer({
|
|
19
|
+
target: `http://127.0.0.1:${appPort}`,
|
|
20
|
+
ws: true,
|
|
21
|
+
xfwd: true,
|
|
22
|
+
});
|
|
23
|
+
const server = createServer((request, response) => {
|
|
24
|
+
stripPathPrefix(request, path);
|
|
25
|
+
proxy.web(request, response);
|
|
26
|
+
});
|
|
27
|
+
server.on("upgrade", (request, socket, head) => {
|
|
28
|
+
stripPathPrefix(request, path);
|
|
29
|
+
proxy.ws(request, socket, head);
|
|
30
|
+
});
|
|
31
|
+
await new Promise<void>((resolve, reject) => {
|
|
32
|
+
server.once("error", reject);
|
|
33
|
+
server.listen(0, "127.0.0.1", resolve);
|
|
34
|
+
});
|
|
35
|
+
const address = server.address() as AddressInfo;
|
|
36
|
+
return {
|
|
37
|
+
port: address.port,
|
|
38
|
+
close: () =>
|
|
39
|
+
new Promise<void>((resolve, reject) =>
|
|
40
|
+
server.close((error) => (error ? reject(error) : resolve())),
|
|
41
|
+
),
|
|
42
|
+
};
|
|
43
|
+
}
|