@dbx-tools/tunnel 0.6.120 → 0.6.123
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 +2 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +2 -1
- package/lib/src/frp.d.ts +2 -0
- package/lib/src/frp.js +10 -1
- package/lib/src/interceptor.js +13 -12
- package/lib/src/plugin.d.ts +1 -1
- package/lib/src/plugin.js +39 -26
- package/lib/src/portr.d.ts +2 -0
- package/lib/src/portr.js +9 -1
- package/lib/src/supervisor.d.ts +11 -0
- package/lib/src/supervisor.js +77 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/src/frp.ts +14 -0
- package/src/interceptor.ts +10 -9
- package/src/plugin.ts +41 -28
- package/src/portr.ts +9 -0
- package/src/supervisor.ts +89 -0
package/index.ts
CHANGED
|
@@ -15,6 +15,7 @@ export * as plugin from "./src/plugin.ts";
|
|
|
15
15
|
export * as portr from "./src/portr.ts";
|
|
16
16
|
export * as sendCode from "./src/send-code.ts";
|
|
17
17
|
export * as signingKey from "./src/signing-key.ts";
|
|
18
|
+
export * as supervisor from "./src/supervisor.ts";
|
|
18
19
|
export type { CodeCopy } from "./src/code-email.ts";
|
|
19
20
|
export type { FrpInstallOptions, FrpConfig } from "./src/frp.ts";
|
|
20
21
|
export { AUTH_PREFIX, UNAUTHORIZED_BODY } from "./src/gate.ts";
|
|
@@ -28,3 +29,4 @@ export type { AuthGateConfig, SendCodeOptions, ResolvedAuthGateConfig, AuthGateA
|
|
|
28
29
|
export type { PortrInstallOptions, PortrConfig } from "./src/portr.ts";
|
|
29
30
|
export { KEY_TTL_SECONDS } from "./src/signing-key.ts";
|
|
30
31
|
export type { SigningKey } from "./src/signing-key.ts";
|
|
32
|
+
export type { ProcessSupervisor } from "./src/supervisor.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export * as plugin from "./src/plugin.ts";
|
|
|
11
11
|
export * as portr from "./src/portr.ts";
|
|
12
12
|
export * as sendCode from "./src/send-code.ts";
|
|
13
13
|
export * as signingKey from "./src/signing-key.ts";
|
|
14
|
+
export * as supervisor from "./src/supervisor.ts";
|
|
14
15
|
export type { CodeCopy } from "./src/code-email.ts";
|
|
15
16
|
export type { FrpInstallOptions, FrpConfig } from "./src/frp.ts";
|
|
16
17
|
export { AUTH_PREFIX, UNAUTHORIZED_BODY } from "./src/gate.ts";
|
|
@@ -24,3 +25,4 @@ export type { AuthGateConfig, SendCodeOptions, ResolvedAuthGateConfig, AuthGateA
|
|
|
24
25
|
export type { PortrInstallOptions, PortrConfig } from "./src/portr.ts";
|
|
25
26
|
export { KEY_TTL_SECONDS } from "./src/signing-key.ts";
|
|
26
27
|
export type { SigningKey } from "./src/signing-key.ts";
|
|
28
|
+
export type { ProcessSupervisor } from "./src/supervisor.ts";
|
package/lib/index.js
CHANGED
|
@@ -14,8 +14,9 @@ export * as plugin from "./src/plugin.js";
|
|
|
14
14
|
export * as portr from "./src/portr.js";
|
|
15
15
|
export * as sendCode from "./src/send-code.js";
|
|
16
16
|
export * as signingKey from "./src/signing-key.js";
|
|
17
|
+
export * as supervisor from "./src/supervisor.js";
|
|
17
18
|
export { AUTH_PREFIX, UNAUTHORIZED_BODY } from "./src/gate.js";
|
|
18
19
|
export { PROTECTED_HEADERS, DEFAULT_FORWARD_HEADERS } from "./src/headers.js";
|
|
19
20
|
export { AuthGatePlugin, authGate } from "./src/plugin.js";
|
|
20
21
|
export { KEY_TTL_SECONDS } from "./src/signing-key.js";
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFHbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUk5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvdHVubmVsXCI7XG5leHBvcnQgKiBhcyBhbGxvd2xpc3QgZnJvbSBcIi4vc3JjL2FsbG93bGlzdC50c1wiO1xuZXhwb3J0ICogYXMgY29kZUVtYWlsIGZyb20gXCIuL3NyYy9jb2RlLWVtYWlsLnRzXCI7XG5leHBvcnQgKiBhcyBmcnAgZnJvbSBcIi4vc3JjL2ZycC50c1wiO1xuZXhwb3J0ICogYXMgZ2F0ZSBmcm9tIFwiLi9zcmMvZ2F0ZS50c1wiO1xuZXhwb3J0ICogYXMgaGVhZGVycyBmcm9tIFwiLi9zcmMvaGVhZGVycy50c1wiO1xuZXhwb3J0ICogYXMgaW50ZXJjZXB0b3IgZnJvbSBcIi4vc3JjL2ludGVyY2VwdG9yLnRzXCI7XG5leHBvcnQgKiBhcyBsb2dpblBhZ2UgZnJvbSBcIi4vc3JjL2xvZ2luLXBhZ2UudHNcIjtcbmV4cG9ydCAqIGFzIHBhdGhQcm94eSBmcm9tIFwiLi9zcmMvcGF0aC1wcm94eS50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHBvcnRyIGZyb20gXCIuL3NyYy9wb3J0ci50c1wiO1xuZXhwb3J0ICogYXMgc2VuZENvZGUgZnJvbSBcIi4vc3JjL3NlbmQtY29kZS50c1wiO1xuZXhwb3J0ICogYXMgc2lnbmluZ0tleSBmcm9tIFwiLi9zcmMvc2lnbmluZy1rZXkudHNcIjtcbmV4cG9ydCAqIGFzIHN1cGVydmlzb3IgZnJvbSBcIi4vc3JjL3N1cGVydmlzb3IudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29kZUNvcHkgfSBmcm9tIFwiLi9zcmMvY29kZS1lbWFpbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBGcnBJbnN0YWxsT3B0aW9ucywgRnJwQ29uZmlnIH0gZnJvbSBcIi4vc3JjL2ZycC50c1wiO1xuZXhwb3J0IHsgQVVUSF9QUkVGSVgsIFVOQVVUSE9SSVpFRF9CT0RZIH0gZnJvbSBcIi4vc3JjL2dhdGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2F0ZU9wdGlvbnMsIEdhdGVBY3Rpb24gfSBmcm9tIFwiLi9zcmMvZ2F0ZS50c1wiO1xuZXhwb3J0IHsgUFJPVEVDVEVEX0hFQURFUlMsIERFRkFVTFRfRk9SV0FSRF9IRUFERVJTIH0gZnJvbSBcIi4vc3JjL2hlYWRlcnMudHNcIjtcbmV4cG9ydCB0eXBlIHsgSGVhZGVyUG9saWN5IH0gZnJvbSBcIi4vc3JjL2hlYWRlcnMudHNcIjtcbmV4cG9ydCB0eXBlIHsgVHVubmVsSW50ZXJjZXB0b3JPcHRpb25zLCBUdW5uZWxUcmFuc3BvcnQgfSBmcm9tIFwiLi9zcmMvaW50ZXJjZXB0b3IudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9naW5QYWdlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9sb2dpbi1wYWdlLnRzXCI7XG5leHBvcnQgeyBBdXRoR2F0ZVBsdWdpbiwgYXV0aEdhdGUgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhHYXRlQ29uZmlnLCBTZW5kQ29kZU9wdGlvbnMsIFJlc29sdmVkQXV0aEdhdGVDb25maWcsIEF1dGhHYXRlQXBpIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBQb3J0ckluc3RhbGxPcHRpb25zLCBQb3J0ckNvbmZpZyB9IGZyb20gXCIuL3NyYy9wb3J0ci50c1wiO1xuZXhwb3J0IHsgS0VZX1RUTF9TRUNPTkRTIH0gZnJvbSBcIi4vc3JjL3NpZ25pbmcta2V5LnRzXCI7XG5leHBvcnQgdHlwZSB7IFNpZ25pbmdLZXkgfSBmcm9tIFwiLi9zcmMvc2lnbmluZy1rZXkudHNcIjtcbmV4cG9ydCB0eXBlIHsgUHJvY2Vzc1N1cGVydmlzb3IgfSBmcm9tIFwiLi9zcmMvc3VwZXJ2aXNvci50c1wiO1xuIl19
|
package/lib/src/frp.d.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* @module
|
|
10
10
|
*/
|
|
11
11
|
import { spawn } from "node:child_process";
|
|
12
|
+
import { type ProcessSupervisor } from "./supervisor.ts";
|
|
12
13
|
/** Options for installing the frpc executable. */
|
|
13
14
|
export interface FrpInstallOptions {
|
|
14
15
|
/** Home directory containing `.frpc`; defaults to the OS home directory. */
|
|
@@ -48,3 +49,4 @@ export declare function installFrp(options?: FrpInstallOptions): Promise<NodeJS.
|
|
|
48
49
|
export declare function writeFrpConfig(resolved: FrpConfig, childEnv: NodeJS.ProcessEnv): Promise<string>;
|
|
49
50
|
/** Launch frpc as a child process (caller supervises and terminates it). */
|
|
50
51
|
export declare function startFrp(resolved: FrpConfig, childEnv: NodeJS.ProcessEnv, configPath: string): ReturnType<typeof spawn>;
|
|
52
|
+
export declare function superviseFrp(resolved: FrpConfig, childEnv: NodeJS.ProcessEnv, configPath: string): ProcessSupervisor;
|
package/lib/src/frp.js
CHANGED
|
@@ -15,6 +15,7 @@ import { delimiter, join } from "node:path";
|
|
|
15
15
|
import { bin, config } from "@dbx-tools/core";
|
|
16
16
|
import { log } from "@dbx-tools/shared-core";
|
|
17
17
|
import { TUNNEL_CONFIG } from "./_config.js";
|
|
18
|
+
import { superviseProcessForever } from "./supervisor.js";
|
|
18
19
|
const logger = log.logger("tunnel:frp");
|
|
19
20
|
const FRP_VERSION = "0.68.1";
|
|
20
21
|
const FRP_RELEASE_URL = `https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}`;
|
|
@@ -115,6 +116,7 @@ export async function writeFrpConfig(resolved, childEnv) {
|
|
|
115
116
|
`serverAddr = ${tomlString(resolved.server)}`,
|
|
116
117
|
`serverPort = ${resolved.serverPort}`,
|
|
117
118
|
`transport.protocol = ${tomlString(resolved.protocol)}`,
|
|
119
|
+
"loginFailExit = false",
|
|
118
120
|
];
|
|
119
121
|
if (resolved.token)
|
|
120
122
|
lines.push(`auth.token = ${tomlString(resolved.token)}`);
|
|
@@ -127,4 +129,11 @@ export function startFrp(resolved, childEnv, configPath) {
|
|
|
127
129
|
logger.info(`frpc tunneling https://${resolved.publicDomain}${resolved.path === "/" ? "" : resolved.path} -> :${resolved.port}`);
|
|
128
130
|
return spawn("frpc", ["-c", configPath], { env: childEnv, stdio: "inherit" });
|
|
129
131
|
}
|
|
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=
|
|
132
|
+
export function superviseFrp(resolved, childEnv, configPath) {
|
|
133
|
+
return superviseProcessForever({
|
|
134
|
+
name: "frpc",
|
|
135
|
+
logger,
|
|
136
|
+
start: () => startFrp(resolved, childEnv, configPath),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQTBCLE1BQU0saUJBQWlCLENBQUM7QUFFbEYsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN4QyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUM7QUFDN0IsTUFBTSxlQUFlLEdBQUcsc0RBQXNELFdBQVcsRUFBRSxDQUFDO0FBc0I1RixTQUFTLFFBQVEsQ0FBQyxLQUF5QjtJQUN6QyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzdCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMzRSxPQUFPLFVBQVUsSUFBSSxTQUFTLENBQUM7QUFDakMsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEtBQXlCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxJQUFJ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Q0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ2hGLEVBQUUsQ0FDSCxDQUFDO0lBQ0YsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4QyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsUUFBbUIsRUFDbkIsUUFBMkIsRUFDM0IsVUFBa0I7SUFFbEIsTUFBTSxDQUFDLElBQUksQ0FDVCwwQkFBMEIsUUFBUSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FDcEgsQ0FBQztJQUNGLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQzFCLFFBQW1CLEVBQ25CLFFBQTJCLEVBQzNCLFVBQWtCO0lBRWxCLE9BQU8sdUJBQXVCLENBQUM7UUFDN0IsSUFBSSxFQUFFLE1BQU07UUFDWixNQUFNO1FBQ04sS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQztLQUN0RCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbnN0YWxsIGFuZCBydW4gYW4gZnJwIGNsaWVudCAoYGZycGNgKSBmb3IgYSBwdWJsaWMgSFRUUCB0dW5uZWwuXG4gKlxuICogVGhlIGRlZmF1bHRzIG1hdGNoIHRoZSBkZXBsb3ltZW50IHNoYXBlIHVzZWQgYnkgaW5zcGlyZS1tZWRpYW1peDogYSBzaW5nbGVcbiAqIFRMUy10ZXJtaW5hdGluZyBob3N0IGlzIGJvdGggdGhlIFdTUyBjb250cm9sIGVuZHBvaW50IGFuZCB0aGUgSFRUUCBjdXN0b21cbiAqIGRvbWFpbi4gQ2FsbGVycyBtYXkgcG9pbnQgYHNlcnZlcmAgc29tZXdoZXJlIGVsc2Ugd2hlbiBmcnBzIGlzIGV4cG9zZWQgb24gYVxuICogc2VwYXJhdGUgY29udHJvbCBob3N0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IG1rZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkZWxpbWl0ZXIsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IGJpbiwgY29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFRVTk5FTF9DT05GSUcgfSBmcm9tIFwiLi9fY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBzdXBlcnZpc2VQcm9jZXNzRm9yZXZlciwgdHlwZSBQcm9jZXNzU3VwZXJ2aXNvciB9IGZyb20gXCIuL3N1cGVydmlzb3IudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDpmcnBcIik7XG5jb25zdCBGUlBfVkVSU0lPTiA9IFwiMC42OC4xXCI7XG5jb25zdCBGUlBfUkVMRUFTRV9VUkwgPSBgaHR0cHM6Ly9naXRodWIuY29tL2ZhdGVkaWVyL2ZycC9yZWxlYXNlcy9kb3dubG9hZC92JHtGUlBfVkVSU0lPTn1gO1xuXG4vKiogT3B0aW9ucyBmb3IgaW5zdGFsbGluZyB0aGUgZnJwYyBleGVjdXRhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcnBJbnN0YWxsT3B0aW9ucyB7XG4gIC8qKiBIb21lIGRpcmVjdG9yeSBjb250YWluaW5nIGAuZnJwY2A7IGRlZmF1bHRzIHRvIHRoZSBPUyBob21lIGRpcmVjdG9yeS4gKi9cbiAgaG9tZURpcj86IHN0cmluZztcbn1cblxuLyoqIFJlc29sdmVkIGZycGMgd2lyaW5nLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIEZSUCB0dW5uZWwgaXMgY29uZmlndXJlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJwQ29uZmlnIHtcbiAgcHVibGljRG9tYWluOiBzdHJpbmc7XG4gIHNlcnZlcjogc3RyaW5nO1xuICBzZXJ2ZXJQb3J0OiBudW1iZXI7XG4gIHByb3RvY29sOiBzdHJpbmc7XG4gIHRva2VuPzogc3RyaW5nO1xuICBwcm94eU5hbWU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzdHJpcFByZWZpeDogYm9vbGVhbjtcbiAgcG9ydDogbnVtYmVyO1xuICB0YXJnZXRQb3J0OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGJhcmVIb3N0KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBub3JtYWxpemVkID0gdmFsdWUucmVwbGFjZSgvXmh0dHBzPzpcXC9cXC8vLCBcIlwiKS5zcGxpdChcIi9cIilbMF0/LnRyaW0oKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgfHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gdmFsdWU/LnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkIHx8IHRyaW1tZWQgPT09IFwiL1wiKSByZXR1cm4gXCIvXCI7XG4gIHJldHVybiBgLyR7dHJpbW1lZC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKX1gO1xufVxuXG4vKiogUmVzb2x2ZSBmcnBjIGNvbmZpZyBmcm9tIHRoZSBwdWJsaWMgZG9tYWluIGFuZCBGUlAtc3BlY2lmaWMgZW52aXJvbm1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZycENvbmZpZyhvcHRzOiB7XG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgc2VydmVyPzogc3RyaW5nO1xuICBzZXJ2ZXJQb3J0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICBwcm90b2NvbD86IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHByb3h5TmFtZT86IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgc3RyaXBQcmVmaXg/OiBib29sZWFuO1xuICBwb3J0OiBudW1iZXI7XG4gIHRhcmdldFBvcnQ/OiBudW1iZXI7XG59KTogRnJwQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHVibGljRG9tYWluID0gYmFyZUhvc3QoXG4gICAgY29uZmlnLnN0cmluZyhcbiAgICAgIG9wdHMucHVibGljRG9tYWluLFxuICAgICAgW1wiRlJQX1BVQkxJQ19ET01BSU5cIiwgXCJQVUJMSUNfRE9NQUlOXCJdLFxuICAgICAgVFVOTkVMX0NPTkZJRyxcbiAgICApLFxuICApO1xuICBpZiAoIXB1YmxpY0RvbWFpbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgc2VydmVyID0gYmFyZUhvc3QoY29uZmlnLnN0cmluZyhvcHRzLnNlcnZlciwgXCJGUlBfU0VSVkVSXCIpKSA/PyBwdWJsaWNEb21haW47XG4gIGNvbnN0IHNlcnZlclBvcnQgPSBjb25maWcucG9ydChvcHRzLnNlcnZlclBvcnQsIFwiRlJQX1NFUlZFUl9QT1JUXCIsIDQ0Myk7XG4gIGNvbnN0IHByb3RvY29sID0gY29uZmlnLnN0cmluZyhvcHRzLnByb3RvY29sLCBcIkZSUF9QUk9UT0NPTFwiKSA/PyBcIndzc1wiO1xuICBjb25zdCB0b2tlbiA9IGNvbmZpZy5zdHJpbmcob3B0cy50b2tlbiwgW1wiRlJQX1RPS0VOXCIsIFwiVFVOTkVMX1RPS0VOXCJdKTtcbiAgY29uc3QgcHJveHlOYW1lID1cbiAgICBjb25maWcuc3RyaW5nKG9wdHMucHJveHlOYW1lLCBcIkZSUF9QUk9YWV9OQU1FXCIpID8/IHB1YmxpY0RvbWFpbi5zcGxpdChcIi5cIilbMF0gPz8gXCJhcHBcIjtcbiAgY29uc3QgYXBwTmFtZSA9IGNvbmZpZy5zdHJpbmcodW5kZWZpbmVkLCBcIkRBVEFCUklDS1NfQVBQX05BTUVcIikgPz8gcHJveHlOYW1lO1xuICBjb25zdCBwYXRoID0gbm9ybWFsaXplUGF0aChjb25maWcuc3RyaW5nKG9wdHMucGF0aCwgXCJGUlBfUEFUSFwiKSA/PyBhcHBOYW1lKTtcbiAgY29uc3Qgc3RyaXBQcmVmaXggPSBjb25maWcuYm9vbGVhbihvcHRzLnN0cmlwUHJlZml4LCBcIkZSUF9TVFJJUF9QUkVGSVhcIikgPz8gcGF0aCAhPT0gXCIvXCI7XG4gIHJldHVybiB7XG4gICAgcHVibGljRG9tYWluLFxuICAgIHNlcnZlcixcbiAgICBzZXJ2ZXJQb3J0LFxuICAgIHByb3RvY29sLFxuICAgIC4uLih0b2tlbiA/IHsgdG9rZW4gfSA6IHt9KSxcbiAgICBwcm94eU5hbWUsXG4gICAgcGF0aCxcbiAgICBzdHJpcFByZWZpeCxcbiAgICBwb3J0OiBvcHRzLnBvcnQsXG4gICAgdGFyZ2V0UG9ydDogb3B0cy50YXJnZXRQb3J0ID8/IG9wdHMucG9ydCxcbiAgfTtcbn1cblxuLyoqIEdpdEh1YiByZWxlYXNlIGFzc2V0IG5hbWUgZm9yIHRoZSBjdXJyZW50IG9yIHN1cHBsaWVkIE9TL2FyY2hpdGVjdHVyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcnBBc3NldE5hbWUoXG4gIHZlcnNpb246IHN0cmluZyxcbiAgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm0sXG4gIGFyY2g6IHN0cmluZyA9IHByb2Nlc3MuYXJjaCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG9zTmFtZSA9IHBsYXRmb3JtID09PSBcImRhcndpblwiID8gXCJkYXJ3aW5cIiA6IHBsYXRmb3JtID09PSBcImxpbnV4XCIgPyBcImxpbnV4XCIgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFyY2hOYW1lID0gYXJjaCA9PT0gXCJhcm02NFwiID8gXCJhcm02NFwiIDogYXJjaCA9PT0gXCJ4NjRcIiA/IFwiYW1kNjRcIiA6IHVuZGVmaW5lZDtcbiAgaWYgKCFvc05hbWUgfHwgIWFyY2hOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmcnAgaGFzIG5vIHN1cHBvcnRlZCByZWxlYXNlIGFzc2V0IGZvciAke3BsYXRmb3JtfS8ke2FyY2h9YCk7XG4gIH1cbiAgcmV0dXJuIGBmcnBfJHt2ZXJzaW9ufV8ke29zTmFtZX1fJHthcmNoTmFtZX0udGFyLmd6YDtcbn1cblxuZnVuY3Rpb24gZnJwRG93bmxvYWRVcmwoKTogc3RyaW5nIHtcbiAgY29uc3QgYXNzZXROYW1lID0gZnJwQXNzZXROYW1lKEZSUF9WRVJTSU9OKTtcbiAgbG9nZ2VyLmluZm8oXCJpbnN0YWxsaW5nIGZycGNcIiwgeyB2ZXJzaW9uOiBGUlBfVkVSU0lPTiwgYXNzZXQ6IGFzc2V0TmFtZSB9KTtcbiAgcmV0dXJuIGAke0ZSUF9SRUxFQVNFX1VSTH0vJHthc3NldE5hbWV9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VsZWN0RnJwYyhzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBhdGggPSBqb2luKHNvdXJjZSwgZnJwQXJjaGl2ZURpcmVjdG9yeSgpLCBcImZycGNcIik7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmVyID0gc3Bhd24oXCJjb2Rlc2lnblwiLCBbXCItLWZvcmNlXCIsIFwiLS1zaWduXCIsIFwiLVwiLCBwYXRoXSwgeyBzdGRpbzogXCJpZ25vcmVcIiB9KTtcbiAgICAgIHNpZ25lci5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICAgIHNpZ25lci5vbmNlKFwiZXhpdFwiLCAoY29kZSkgPT5cbiAgICAgICAgY29kZSA9PT0gMCA/IHJlc29sdmUoKSA6IHJlamVjdChuZXcgRXJyb3IoYGNvZGVzaWduIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKiBJbnN0YWxsIGZycGMgd2hlbiBhYnNlbnQgYW5kIHJldHVybiB0aGUgZW52aXJvbm1lbnQgdXNlZCBieSBpdHMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsRnJwKG9wdGlvbnM6IEZycEluc3RhbGxPcHRpb25zID0ge30pOiBQcm9taXNlPE5vZGVKUy5Qcm9jZXNzRW52PiB7XG4gIGNvbnN0IGhvbWVEaXIgPSBvcHRpb25zLmhvbWVEaXIgPz8gb3MuaG9tZWRpcigpO1xuICBjb25zdCBjb250ZXh0ID0gYXdhaXQgYmluLmVuc3VyZShcImZycGNcIiwgZnJwRG93bmxvYWRVcmwsIHtcbiAgICBhdXRvVW5wYWNrYWdlOiB0cnVlLFxuICAgIGhvbWVEaXIsXG4gICAgbWluVmVyc2lvbjogRlJQX1ZFUlNJT04sXG4gICAgc2VsZWN0b3I6ICh7IHNvdXJjZSB9KSA9PiBzZWxlY3RGcnBjKHNvdXJjZSksXG4gICAgdmVyc2lvblBhcnNlcjogKHsgc3Rkb3V0LCBzdGRlcnIgfSkgPT4ge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IGJpbi5wYXJzZVZlcnNpb24oeyBzdGRvdXQsIHN0ZGVyciB9KTtcbiAgICAgIHJldHVybiB2ZXJzaW9uID09PSBGUlBfVkVSU0lPTiA/IHZlcnNpb24gOiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgSE9NRTogaG9tZURpcixcbiAgICBQQVRIOiBbY29udGV4dC5iaW5EaXIsIHByb2Nlc3MuZW52LlBBVEggPz8gXCJcIl0uam9pbihkZWxpbWl0ZXIpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcnBBcmNoaXZlRGlyZWN0b3J5KFxuICBwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgYXJjaDogc3RyaW5nID0gcHJvY2Vzcy5hcmNoLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZycEFzc2V0TmFtZShGUlBfVkVSU0lPTiwgcGxhdGZvcm0sIGFyY2gpLnJlcGxhY2UoL1xcLnRhclxcLmd6JC8sIFwiXCIpO1xufVxuXG5mdW5jdGlvbiB0b21sU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG4vKiogUmVuZGVyIGB+Ly5mcnBjL2ZycGMudG9tbGAgZm9yIHRoZSByZXNvbHZlZCB0dW5uZWwuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVGcnBDb25maWcoXG4gIHJlc29sdmVkOiBGcnBDb25maWcsXG4gIGNoaWxkRW52OiBOb2RlSlMuUHJvY2Vzc0Vudixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRpcmVjdG9yeSA9IGpvaW4oY2hpbGRFbnYuSE9NRSA/PyBvcy5ob21lZGlyKCksIFwiLmZycGNcIik7XG4gIGNvbnN0IHBhdGggPSBqb2luKGRpcmVjdG9yeSwgXCJmcnBjLnRvbWxcIik7XG4gIGF3YWl0IG1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIGBzZXJ2ZXJBZGRyID0gJHt0b21sU3RyaW5nKHJlc29sdmVkLnNlcnZlcil9YCxcbiAgICBgc2VydmVyUG9ydCA9ICR7cmVzb2x2ZWQuc2VydmVyUG9ydH1gLFxuICAgIGB0cmFuc3BvcnQucHJvdG9jb2wgPSAke3RvbWxTdHJpbmcocmVzb2x2ZWQucHJvdG9jb2wpfWAsXG4gICAgXCJsb2dpbkZhaWxFeGl0ID0gZmFsc2VcIixcbiAgXTtcbiAgaWYgKHJlc29sdmVkLnRva2VuKSBsaW5lcy5wdXNoKGBhdXRoLnRva2VuID0gJHt0b21sU3RyaW5nKHJlc29sdmVkLnRva2VuKX1gKTtcbiAgbGluZXMucHVzaChcbiAgICBcIlwiLFxuICAgIFwiW1twcm94aWVzXV1cIixcbiAgICBgbmFtZSA9ICR7dG9tbFN0cmluZyhyZXNvbHZlZC5wcm94eU5hbWUpfWAsXG4gICAgJ3R5cGUgPSBcImh0dHBcIicsXG4gICAgYGxvY2FsUG9ydCA9ICR7cmVzb2x2ZWQudGFyZ2V0UG9ydH1gLFxuICAgIGBjdXN0b21Eb21haW5zID0gWyR7dG9tbFN0cmluZyhyZXNvbHZlZC5wdWJsaWNEb21haW4pfV1gLFxuICAgIC4uLihyZXNvbHZlZC5wYXRoID09PSBcIi9cIiA/IFtdIDogW2Bsb2NhdGlvbnMgPSBbJHt0b21sU3RyaW5nKHJlc29sdmVkLnBhdGgpfV1gXSksXG4gICAgXCJcIixcbiAgKTtcbiAgYXdhaXQgd3JpdGVGaWxlKHBhdGgsIGxpbmVzLmpvaW4oXCJcXG5cIikpO1xuICByZXR1cm4gcGF0aDtcbn1cblxuLyoqIExhdW5jaCBmcnBjIGFzIGEgY2hpbGQgcHJvY2VzcyAoY2FsbGVyIHN1cGVydmlzZXMgYW5kIHRlcm1pbmF0ZXMgaXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0RnJwKFxuICByZXNvbHZlZDogRnJwQ29uZmlnLFxuICBjaGlsZEVudjogTm9kZUpTLlByb2Nlc3NFbnYsXG4gIGNvbmZpZ1BhdGg6IHN0cmluZyxcbik6IFJldHVyblR5cGU8dHlwZW9mIHNwYXduPiB7XG4gIGxvZ2dlci5pbmZvKFxuICAgIGBmcnBjIHR1bm5lbGluZyBodHRwczovLyR7cmVzb2x2ZWQucHVibGljRG9tYWlufSR7cmVzb2x2ZWQucGF0aCA9PT0gXCIvXCIgPyBcIlwiIDogcmVzb2x2ZWQucGF0aH0gLT4gOiR7cmVzb2x2ZWQucG9ydH1gLFxuICApO1xuICByZXR1cm4gc3Bhd24oXCJmcnBjXCIsIFtcIi1jXCIsIGNvbmZpZ1BhdGhdLCB7IGVudjogY2hpbGRFbnYsIHN0ZGlvOiBcImluaGVyaXRcIiB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cGVydmlzZUZycChcbiAgcmVzb2x2ZWQ6IEZycENvbmZpZyxcbiAgY2hpbGRFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LFxuICBjb25maWdQYXRoOiBzdHJpbmcsXG4pOiBQcm9jZXNzU3VwZXJ2aXNvciB7XG4gIHJldHVybiBzdXBlcnZpc2VQcm9jZXNzRm9yZXZlcih7XG4gICAgbmFtZTogXCJmcnBjXCIsXG4gICAgbG9nZ2VyLFxuICAgIHN0YXJ0OiAoKSA9PiBzdGFydEZycChyZXNvbHZlZCwgY2hpbGRFbnYsIGNvbmZpZ1BhdGgpLFxuICB9KTtcbn1cbiJdfQ==
|
package/lib/src/interceptor.js
CHANGED
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
* @module
|
|
18
18
|
*/
|
|
19
19
|
import { log, object } from "@dbx-tools/shared-core";
|
|
20
|
-
import { installFrp, resolveFrpConfig,
|
|
21
|
-
import { installPortr, resolvePortrConfig,
|
|
20
|
+
import { installFrp, resolveFrpConfig, superviseFrp, writeFrpConfig } from "./frp.js";
|
|
21
|
+
import { installPortr, resolvePortrConfig, supervisePortr, writePortrConfig } from "./portr.js";
|
|
22
22
|
import { startPathProxy } from "./path-proxy.js";
|
|
23
23
|
const logger = log.logger("tunnel:interceptor");
|
|
24
24
|
/** Resolve and validate the tunnel transport selector. */
|
|
@@ -57,7 +57,7 @@ export function tunnelInterceptor(options = {}) {
|
|
|
57
57
|
}
|
|
58
58
|
const port = resolvePublicPort(options.port);
|
|
59
59
|
const transport = resolveTunnelTransport(options.transport);
|
|
60
|
-
const
|
|
60
|
+
const auxiliaries = [];
|
|
61
61
|
if (transport === "portr" || transport === "both") {
|
|
62
62
|
const portrConfig = resolvePortrConfig({
|
|
63
63
|
publicDomain: options.publicDomain,
|
|
@@ -67,7 +67,7 @@ export function tunnelInterceptor(options = {}) {
|
|
|
67
67
|
if (portrConfig) {
|
|
68
68
|
const portrEnv = await installPortr();
|
|
69
69
|
await writePortrConfig(portrConfig, portrEnv);
|
|
70
|
-
|
|
70
|
+
auxiliaries.push(supervisePortr(portrConfig, portrEnv));
|
|
71
71
|
}
|
|
72
72
|
else {
|
|
73
73
|
logger.info("portr not configured (requires PORTR_TOKEN and TUNNEL_PUBLIC_DOMAIN)");
|
|
@@ -95,22 +95,23 @@ export function tunnelInterceptor(options = {}) {
|
|
|
95
95
|
}
|
|
96
96
|
const frpEnv = await installFrp();
|
|
97
97
|
const configPath = await writeFrpConfig(frpConfig, frpEnv);
|
|
98
|
-
|
|
98
|
+
auxiliaries.push(superviseFrp(frpConfig, frpEnv, configPath));
|
|
99
99
|
}
|
|
100
100
|
else {
|
|
101
101
|
logger.info("frp not configured (requires TUNNEL_PUBLIC_DOMAIN)");
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
|
-
if (!
|
|
104
|
+
if (!auxiliaries.length)
|
|
105
105
|
return;
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
ctx.onTeardown(() => {
|
|
107
|
+
for (const auxiliary of auxiliaries)
|
|
108
|
+
auxiliary.stop();
|
|
109
|
+
});
|
|
108
110
|
ctx.onLifecycle("shutdown", () => {
|
|
109
|
-
for (const
|
|
110
|
-
|
|
111
|
-
child.kill("SIGTERM");
|
|
111
|
+
for (const auxiliary of auxiliaries)
|
|
112
|
+
auxiliary.stop();
|
|
112
113
|
});
|
|
113
114
|
logger.info(`tunnel bound: ${transport} -> :${port}`);
|
|
114
115
|
};
|
|
115
116
|
}
|
|
116
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBSUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQXFDaEQsMERBQTBEO0FBQzFELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxTQUFrQjtJQUN2RCxNQUFNLFFBQVEsR0FDWixTQUFTO1FBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEI7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0I7UUFDNUIsT0FBTyxDQUFDO0lBQ1YsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLFFBQVEsS0FBSyxLQUFLLElBQUksUUFBUSxLQUFLLE1BQU07UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUN2RixNQUFNLElBQUksU0FBUyxDQUFDLDZCQUE2QixRQUFRLGlDQUFpQyxDQUFDLENBQUM7QUFDOUYsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixTQUFTLGlCQUFpQixDQUFDLElBQWE7SUFDdEMsT0FBTyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLElBQUksSUFBSSxDQUFDO0FBQzFFLENBQUM7QUFFRDs7Ozs7Ozs7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UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQzdCLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUTtZQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1lBQy9CLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUTtnQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07b0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLFNBQVMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGB0dW5uZWxJbnRlcmNlcHRvcigpYCAtIHRoZSB7QGxpbmsgSW50ZXJjZXB0b3J9IHRoYXQgZnJvbnRzIGFuIGFwcCB3aXRoIGEgcHVibGljXG4gKiBwb3J0ciBhbmQvb3IgZnJwIHR1bm5lbCwgY29uc3VtaW5nIHRoZSB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSBgQGRieC10b29scy9hcHBraXRgJ3NcbiAqIGBjcmVhdGVBcHBgIGhhbmRzIGl0LlxuICpcbiAqIFRoZSB0dW5uZWwgcnVucyBJTi1QUk9DRVNTOiB0aGUgQVBQIGlzIHRoZSBtYWluIHByb2Nlc3MgYW5kIGhhbmRzIHRoaXMgaW50ZXJjZXB0b3JcbiAqIGl0cyBjb250ZXh0LCByYXRoZXIgdGhhbiBhIHdyYXBwZXIgcHJvY2VzcyBzcGF3bmluZyB0aGUgYXBwIGFzIGEgY2hpbGQuIFRoZVxuICogaW50ZXJjZXB0b3IgYXBwbGllcyB0aGUgY29tcHV0ZWQgd29ya3NwYWNlIGhvc3QsIGluc3RhbGxzIGFuZCBsYXVuY2hlcyBwb3J0ciBvbiB0aGVcbiAqIGFwcCdzIHB1YmxpYyBwb3J0LCBiaW5kcyB0aGUgY2hpbGQgcHJvY2VzcyB0byB0aGUgYXBwLCBhbmQgc3RvcHMgcG9ydHIgZHVyaW5nIGFuXG4gKiBvcmRlcmx5IEFwcEtpdCBzaHV0ZG93bi5cbiAqXG4gKiBUaGUgcGFzc3dvcmRsZXNzIEdBVEUgaXMgYSBzZXBhcmF0ZSBjb25jZXJuOiBpdCBpcyB0aGUgYGF1dGhHYXRlYCBBcHBLaXQgcGx1Z2luLFxuICogd2hpY2ggcmVnaXN0ZXJzIHRoZSBsb2dpbiByb3V0ZXMgKyBhIGdhdGluZyBtaWRkbGV3YXJlIG9uIHRoZSBhcHAncyBvd24gc2VydmVyLlxuICogUmVnaXN0ZXIgaXQgaW4gdGhlIGFwcCdzIGBwbHVnaW5zYCBmb3IgZ2F0ZWQgdHJhZmZpYy4gVGhpcyBpbnRlcmNlcHRvciBpcyBvbmx5XG4gKiB0aGUgcG9ydHIgaGFsZiAtIFwidXBkYXRlIHRoZSBob3N0LCBiaW5kIHBvcnRyXCIgLSB0aGUgc21hbGxlc3QgdXNlZnVsIHVuaXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmNlcHRvciwgSW50ZXJjZXB0b3JDb250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBsb2csIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBpbnN0YWxsRnJwLCByZXNvbHZlRnJwQ29uZmlnLCBzdGFydEZycCwgd3JpdGVGcnBDb25maWcgfSBmcm9tIFwiLi9mcnAudHNcIjtcbmltcG9ydCB7IGluc3RhbGxQb3J0ciwgcmVzb2x2ZVBvcnRyQ29uZmlnLCBzdGFydFBvcnRyLCB3cml0ZVBvcnRyQ29uZmlnIH0gZnJvbSBcIi4vcG9ydHIudHNcIjtcbmltcG9ydCB7IHN0YXJ0UGF0aFByb3h5IH0gZnJvbSBcIi4vcGF0aC1wcm94eS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwidHVubmVsOmludGVyY2VwdG9yXCIpO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHR1bm5lbEludGVyY2VwdG9yfSAoZWFjaCBhbHNvIHJlc29sdmFibGUgZnJvbSBlbnYpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUdW5uZWxJbnRlcmNlcHRvck9wdGlvbnMge1xuICAvKiogVHVubmVsIGNsaWVudHMgdG8gcnVuLiBFbnYgYERCWF9UT09MU19UVU5ORUxfVFJBTlNQT1JUYDsgZGVmYXVsdHMgdG8gYHBvcnRyYC4gKi9cbiAgdHJhbnNwb3J0PzogVHVubmVsVHJhbnNwb3J0O1xuICAvKiogUHVibGljIGhvc3QgdG8gc2VydmUgb24uIEVudiBgVFVOTkVMX1BVQkxJQ19ET01BSU5gLiAqL1xuICBwdWJsaWNEb21haW4/OiBzdHJpbmc7XG4gIC8qKiBwb3J0ciBzdWJkb21haW4gKGVsc2UgZGVyaXZlZCBmcm9tIHtAbGluayBwdWJsaWNEb21haW59KS4gKi9cbiAgc3ViZG9tYWluPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFBVQkxJQyBwb3J0IHBvcnRyIGZvcndhcmRzIHRvIC0gdGhlIHBvcnQgdGhlIGFwcCBpdHNlbGYgbGlzdGVucyBvbi5cbiAgICogRGVmYXVsdHMgdG8gdGhlIERhdGFicmlja3MgQXBwcyBydW50aW1lIGNvbnRyYWN0IGBEQVRBQlJJQ0tTX0FQUF9QT1JUYFxuICAgKiAodGhlbiBgODAwMGApLCB3aGljaCBpcyB0aGUgcG9ydCB0aGUgcGxhdGZvcm0gcm91dGVzIHRvLlxuICAgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIGZycHMgY29udHJvbCBob3N0OyBkZWZhdWx0cyB0byB0aGUgRlJQIHB1YmxpYyBkb21haW4uIEVudiBgRlJQX1NFUlZFUmAuICovXG4gIGZycFNlcnZlcj86IHN0cmluZztcbiAgLyoqIEZSUCBwdWJsaWMgSFRUUCBob3N0LiBFbnYgYFRVTk5FTF9GUlBfUFVCTElDX0RPTUFJTmAuICovXG4gIGZycFB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgLyoqIGZycHMgY29udHJvbCBwb3J0LiBFbnYgYEZSUF9TRVJWRVJfUE9SVGA7IGRlZmF1bHRzIHRvIGA0NDNgLiAqL1xuICBmcnBTZXJ2ZXJQb3J0PzogbnVtYmVyO1xuICAvKiogZnJwYyB0cmFuc3BvcnQgcHJvdG9jb2wuIEVudiBgRlJQX1BST1RPQ09MYDsgZGVmYXVsdHMgdG8gYHdzc2AuICovXG4gIGZycFByb3RvY29sPzogc3RyaW5nO1xuICAvKiogZnJwcyBhdXRoIHRva2VuLiBFbnYgYEZSUF9UT0tFTmAgKG9yIGBUVU5ORUxfVE9LRU5gKS4gKi9cbiAgZnJwVG9rZW4/OiBzdHJpbmc7XG4gIC8qKiBmcnAgcHJveHkgcmVnaXN0cmF0aW9uIG5hbWUuIEVudiBgRlJQX1BST1hZX05BTUVgLiAqL1xuICBmcnBQcm94eU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBGUlAgcGF0aCBsb2NhdGlvbi4gRW52IGBGUlBfUEFUSGA7IGRlZmF1bHRzIHRvIGBEQVRBQlJJQ0tTX0FQUF9OQU1FYC4gKi9cbiAgZnJwUGF0aD86IHN0cmluZztcbiAgLyoqIFN0cmlwIHRoZSBGUlAgcGF0aCBiZWZvcmUgZm9yd2FyZGluZy4gRW52IGBGUlBfU1RSSVBfUFJFRklYYDsgZGVmYXVsdHMgdHJ1ZSBmb3Igbm9uLXJvb3QgcGF0aHMuICovXG4gIGZycFN0cmlwUHJlZml4PzogYm9vbGVhbjtcbn1cblxuLyoqIFB1YmxpYyB0dW5uZWwgY2xpZW50cyBzdXBwb3J0ZWQgYnkgdGhlIGludGVyY2VwdG9yIGFuZCBDTEkuICovXG5leHBvcnQgdHlwZSBUdW5uZWxUcmFuc3BvcnQgPSBcInBvcnRyXCIgfCBcImZycFwiIHwgXCJib3RoXCI7XG5cbi8qKiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSB0aGUgdHVubmVsIHRyYW5zcG9ydCBzZWxlY3Rvci4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHVubmVsVHJhbnNwb3J0KHRyYW5zcG9ydD86IHN0cmluZyk6IFR1bm5lbFRyYW5zcG9ydCB7XG4gIGNvbnN0IHJlc29sdmVkID1cbiAgICB0cmFuc3BvcnQgPz9cbiAgICBwcm9jZXNzLmVudi5EQlhfVE9PTFNfVFVOTkVMX1RSQU5TUE9SVCA/P1xuICAgIHByb2Nlc3MuZW52LlRVTk5FTF9UUkFOU1BPUlQgPz9cbiAgICBcInBvcnRyXCI7XG4gIGlmIChyZXNvbHZlZCA9PT0gXCJwb3J0clwiIHx8IHJlc29sdmVkID09PSBcImZycFwiIHx8IHJlc29sdmVkID09PSBcImJvdGhcIikgcmV0dXJuIHJlc29sdmVkO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnZhbGlkIHR1bm5lbCB0cmFuc3BvcnQ6ICR7cmVzb2x2ZWR9IChleHBlY3RlZCBwb3J0ciwgZnJwLCBvciBib3RoKWApO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgcHVibGljIHBvcnQgcG9ydHIgc2hvdWxkIHRhcmdldDogZXhwbGljaXQsIGVsc2UgdGhlIEFwcHMgY29udHJhY3QuICovXG5mdW5jdGlvbiByZXNvbHZlUHVibGljUG9ydChwb3J0PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBvcnQgPz8gb2JqZWN0LnRvTnVtYmVyKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX1BPUlQpID8/IDgwMDA7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHR1bm5lbCB7QGxpbmsgSW50ZXJjZXB0b3J9LiBQYXNzIGl0IHRvIGBjcmVhdGVBcHAoeyBpbnRlcmNlcHRvciB9KWAuXG4gKlxuICogQSBuby1vcCAobG9ncyBhbmQgcmV0dXJucykgd2hlbiBub25lIG9mIHRoZSBzZWxlY3RlZCB0dW5uZWwgY2xpZW50cyByZXNvbHZlXG4gKiB1c2FibGUgY29uZmlndXJhdGlvbiwgc28gYW4gYXBwIGNhbiByZWdpc3RlciBpdCB1bmNvbmRpdGlvbmFsbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgdHVubmVsSW50ZXJjZXB0b3IgfSBmcm9tIFwiQGRieC10b29scy90dW5uZWxcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW3NlcnZlcih7IGhvc3QsIHN0YXRpY1BhdGggfSldLFxuICogICBpbnRlcmNlcHRvcjogdHVubmVsSW50ZXJjZXB0b3IoKSxcbiAqIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHVubmVsSW50ZXJjZXB0b3Iob3B0aW9uczogVHVubmVsSW50ZXJjZXB0b3JPcHRpb25zID0ge30pOiBJbnRlcmNlcHRvciB7XG4gIHJldHVybiBhc3luYyAoY3R4OiBJbnRlcmNlcHRvckNvbnRleHQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoY3R4LmVudi5kYXRhYnJpY2tzSG9zdCkge1xuICAgICAgcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUID8/PSBjdHguZW52LmRhdGFicmlja3NIb3N0O1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSByZXNvbHZlUHVibGljUG9ydChvcHRpb25zLnBvcnQpO1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHJlc29sdmVUdW5uZWxUcmFuc3BvcnQob3B0aW9ucy50cmFuc3BvcnQpO1xuICAgIGNvbnN0IGNoaWxkcmVuOiBDaGlsZFByb2Nlc3NbXSA9IFtdO1xuICAgIGlmICh0cmFuc3BvcnQgPT09IFwicG9ydHJcIiB8fCB0cmFuc3BvcnQgPT09IFwiYm90aFwiKSB7XG4gICAgICBjb25zdCBwb3J0ckNvbmZpZyA9IHJlc29sdmVQb3J0ckNvbmZpZyh7XG4gICAgICAgIHB1YmxpY0RvbWFpbjogb3B0aW9ucy5wdWJsaWNEb21haW4sXG4gICAgICAgIHN1YmRvbWFpbjogb3B0aW9ucy5zdWJkb21haW4sXG4gICAgICAgIHBvcnQsXG4gICAgICB9KTtcbiAgICAgIGlmIChwb3J0ckNvbmZpZykge1xuICAgICAgICBjb25zdCBwb3J0ckVudiA9IGF3YWl0IGluc3RhbGxQb3J0cigpO1xuICAgICAgICBhd2FpdCB3cml0ZVBvcnRyQ29uZmlnKHBvcnRyQ29uZmlnLCBwb3J0ckVudik7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goYXdhaXQgc3RhcnRQb3J0cihwb3J0ckNvbmZpZywgcG9ydHJFbnYpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwicG9ydHIgbm90IGNvbmZpZ3VyZWQgKHJlcXVpcmVzIFBPUlRSX1RPS0VOIGFuZCBUVU5ORUxfUFVCTElDX0RPTUFJTilcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0cmFuc3BvcnQgPT09IFwiZnJwXCIgfHwgdHJhbnNwb3J0ID09PSBcImJvdGhcIikge1xuICAgICAgY29uc3QgZnJwQ29uZmlnID0gcmVzb2x2ZUZycENvbmZpZyh7XG4gICAgICAgIHB1YmxpY0RvbWFpbjogb3B0aW9ucy5mcnBQdWJsaWNEb21haW4sXG4gICAgICAgIHNlcnZlcjogb3B0aW9ucy5mcnBTZXJ2ZXIsXG4gICAgICAgIHNlcnZlclBvcnQ6IG9wdGlvbnMuZnJwU2VydmVyUG9ydCxcbiAgICAgICAgcHJvdG9jb2w6IG9wdGlvbnMuZnJwUHJvdG9jb2wsXG4gICAgICAgIHRva2VuOiBvcHRpb25zLmZycFRva2VuLFxuICAgICAgICBwcm94eU5hbWU6IG9wdGlvbnMuZnJwUHJveHlOYW1lLFxuICAgICAgICBwYXRoOiBvcHRpb25zLmZycFBhdGgsXG4gICAgICAgIHN0cmlwUHJlZml4OiBvcHRpb25zLmZycFN0cmlwUHJlZml4LFxuICAgICAgICBwb3J0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZnJwQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHBhdGhQcm94eSA9XG4gICAgICAgICAgZnJwQ29uZmlnLnN0cmlwUHJlZml4ICYmIGZycENvbmZpZy5wYXRoICE9PSBcIi9cIlxuICAgICAgICAgICAgPyBhd2FpdCBzdGFydFBhdGhQcm94eShwb3J0LCBmcnBDb25maWcucGF0aClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAocGF0aFByb3h5KSB7XG4gICAgICAgICAgZnJwQ29uZmlnLnRhcmdldFBvcnQgPSBwYXRoUHJveHkucG9ydDtcbiAgICAgICAgICBjdHgub25MaWZlY3ljbGUoXCJzaHV0ZG93blwiLCAoKSA9PiB2b2lkIHBhdGhQcm94eS5jbG9zZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcnBFbnYgPSBhd2FpdCBpbnN0YWxsRnJwKCk7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBhd2FpdCB3cml0ZUZycENvbmZpZyhmcnBDb25maWcsIGZycEVudik7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goc3RhcnRGcnAoZnJwQ29uZmlnLCBmcnBFbnYsIGNvbmZpZ1BhdGgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiZnJwIG5vdCBjb25maWd1cmVkIChyZXF1aXJlcyBUVU5ORUxfUFVCTElDX0RPTUFJTilcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikgY3R4LmJpbmRQcm9jZXNzKGNoaWxkKTtcbiAgICBjdHgub25MaWZlY3ljbGUoXCJzaHV0ZG93blwiLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSBpZiAoIWNoaWxkLmtpbGxlZCkgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG4gICAgfSk7XG4gICAgbG9nZ2VyLmluZm8oYHR1bm5lbCBib3VuZDogJHt0cmFuc3BvcnR9IC0+IDoke3BvcnR9YCk7XG4gIH07XG59XG4iXX0=
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBR0gsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEYsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQXFDaEQsMERBQTBEO0FBQzFELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxTQUFrQjtJQUN2RCxNQUFNLFFBQVEsR0FDWixTQUFTO1FBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEI7UUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0I7UUFDNUIsT0FBTyxDQUFDO0lBQ1YsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLFFBQVEsS0FBSyxLQUFLLElBQUksUUFBUSxLQUFLLE1BQU07UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUN2RixNQUFNLElBQUksU0FBUyxDQUFDLDZCQUE2QixRQUFRLGlDQUFpQyxDQUFDLENBQUM7QUFDOUYsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixTQUFTLGlCQUFpQixDQUFDLElBQWE7SUFDdEMsT0FBTyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLElBQUksSUFBSSxDQUFDO0FBQzFFLENBQUM7QUFFRDs7Ozs7Ozs7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SUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUNoQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNsQixLQUFLLE1BQU0sU0FBUyxJQUFJLFdBQVc7Z0JBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1lBQy9CLEtBQUssTUFBTSxTQUFTLElBQUksV0FBVztnQkFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixTQUFTLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgdHVubmVsSW50ZXJjZXB0b3IoKWAgLSB0aGUge0BsaW5rIEludGVyY2VwdG9yfSB0aGF0IGZyb250cyBhbiBhcHAgd2l0aCBhIHB1YmxpY1xuICogcG9ydHIgYW5kL29yIGZycCB0dW5uZWwsIGNvbnN1bWluZyB0aGUge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0gYEBkYngtdG9vbHMvYXBwa2l0YCdzXG4gKiBgY3JlYXRlQXBwYCBoYW5kcyBpdC5cbiAqXG4gKiBUaGUgdHVubmVsIHJ1bnMgSU4tUFJPQ0VTUzogdGhlIEFQUCBpcyB0aGUgbWFpbiBwcm9jZXNzIGFuZCBoYW5kcyB0aGlzIGludGVyY2VwdG9yXG4gKiBpdHMgY29udGV4dCwgcmF0aGVyIHRoYW4gYSB3cmFwcGVyIHByb2Nlc3Mgc3Bhd25pbmcgdGhlIGFwcCBhcyBhIGNoaWxkLiBUaGVcbiAqIGludGVyY2VwdG9yIGFwcGxpZXMgdGhlIGNvbXB1dGVkIHdvcmtzcGFjZSBob3N0LCBpbnN0YWxscyBhbmQgbGF1bmNoZXMgcG9ydHIgb24gdGhlXG4gKiBhcHAncyBwdWJsaWMgcG9ydCwgYmluZHMgdGhlIGNoaWxkIHByb2Nlc3MgdG8gdGhlIGFwcCwgYW5kIHN0b3BzIHBvcnRyIGR1cmluZyBhblxuICogb3JkZXJseSBBcHBLaXQgc2h1dGRvd24uXG4gKlxuICogVGhlIHBhc3N3b3JkbGVzcyBHQVRFIGlzIGEgc2VwYXJhdGUgY29uY2VybjogaXQgaXMgdGhlIGBhdXRoR2F0ZWAgQXBwS2l0IHBsdWdpbixcbiAqIHdoaWNoIHJlZ2lzdGVycyB0aGUgbG9naW4gcm91dGVzICsgYSBnYXRpbmcgbWlkZGxld2FyZSBvbiB0aGUgYXBwJ3Mgb3duIHNlcnZlci5cbiAqIFJlZ2lzdGVyIGl0IGluIHRoZSBhcHAncyBgcGx1Z2luc2AgZm9yIGdhdGVkIHRyYWZmaWMuIFRoaXMgaW50ZXJjZXB0b3IgaXMgb25seVxuICogdGhlIHBvcnRyIGhhbGYgLSBcInVwZGF0ZSB0aGUgaG9zdCwgYmluZCBwb3J0clwiIC0gdGhlIHNtYWxsZXN0IHVzZWZ1bCB1bml0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEludGVyY2VwdG9yLCBJbnRlcmNlcHRvckNvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZywgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGluc3RhbGxGcnAsIHJlc29sdmVGcnBDb25maWcsIHN1cGVydmlzZUZycCwgd3JpdGVGcnBDb25maWcgfSBmcm9tIFwiLi9mcnAudHNcIjtcbmltcG9ydCB7IGluc3RhbGxQb3J0ciwgcmVzb2x2ZVBvcnRyQ29uZmlnLCBzdXBlcnZpc2VQb3J0ciwgd3JpdGVQb3J0ckNvbmZpZyB9IGZyb20gXCIuL3BvcnRyLnRzXCI7XG5pbXBvcnQgeyBzdGFydFBhdGhQcm94eSB9IGZyb20gXCIuL3BhdGgtcHJveHkudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDppbnRlcmNlcHRvclwiKTtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayB0dW5uZWxJbnRlcmNlcHRvcn0gKGVhY2ggYWxzbyByZXNvbHZhYmxlIGZyb20gZW52KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHVubmVsSW50ZXJjZXB0b3JPcHRpb25zIHtcbiAgLyoqIFR1bm5lbCBjbGllbnRzIHRvIHJ1bi4gRW52IGBEQlhfVE9PTFNfVFVOTkVMX1RSQU5TUE9SVGA7IGRlZmF1bHRzIHRvIGBwb3J0cmAuICovXG4gIHRyYW5zcG9ydD86IFR1bm5lbFRyYW5zcG9ydDtcbiAgLyoqIFB1YmxpYyBob3N0IHRvIHNlcnZlIG9uLiBFbnYgYFRVTk5FTF9QVUJMSUNfRE9NQUlOYC4gKi9cbiAgcHVibGljRG9tYWluPzogc3RyaW5nO1xuICAvKiogcG9ydHIgc3ViZG9tYWluIChlbHNlIGRlcml2ZWQgZnJvbSB7QGxpbmsgcHVibGljRG9tYWlufSkuICovXG4gIHN1YmRvbWFpbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBQVUJMSUMgcG9ydCBwb3J0ciBmb3J3YXJkcyB0byAtIHRoZSBwb3J0IHRoZSBhcHAgaXRzZWxmIGxpc3RlbnMgb24uXG4gICAqIERlZmF1bHRzIHRvIHRoZSBEYXRhYnJpY2tzIEFwcHMgcnVudGltZSBjb250cmFjdCBgREFUQUJSSUNLU19BUFBfUE9SVGBcbiAgICogKHRoZW4gYDgwMDBgKSwgd2hpY2ggaXMgdGhlIHBvcnQgdGhlIHBsYXRmb3JtIHJvdXRlcyB0by5cbiAgICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBmcnBzIGNvbnRyb2wgaG9zdDsgZGVmYXVsdHMgdG8gdGhlIEZSUCBwdWJsaWMgZG9tYWluLiBFbnYgYEZSUF9TRVJWRVJgLiAqL1xuICBmcnBTZXJ2ZXI/OiBzdHJpbmc7XG4gIC8qKiBGUlAgcHVibGljIEhUVFAgaG9zdC4gRW52IGBUVU5ORUxfRlJQX1BVQkxJQ19ET01BSU5gLiAqL1xuICBmcnBQdWJsaWNEb21haW4/OiBzdHJpbmc7XG4gIC8qKiBmcnBzIGNvbnRyb2wgcG9ydC4gRW52IGBGUlBfU0VSVkVSX1BPUlRgOyBkZWZhdWx0cyB0byBgNDQzYC4gKi9cbiAgZnJwU2VydmVyUG9ydD86IG51bWJlcjtcbiAgLyoqIGZycGMgdHJhbnNwb3J0IHByb3RvY29sLiBFbnYgYEZSUF9QUk9UT0NPTGA7IGRlZmF1bHRzIHRvIGB3c3NgLiAqL1xuICBmcnBQcm90b2NvbD86IHN0cmluZztcbiAgLyoqIGZycHMgYXV0aCB0b2tlbi4gRW52IGBGUlBfVE9LRU5gIChvciBgVFVOTkVMX1RPS0VOYCkuICovXG4gIGZycFRva2VuPzogc3RyaW5nO1xuICAvKiogZnJwIHByb3h5IHJlZ2lzdHJhdGlvbiBuYW1lLiBFbnYgYEZSUF9QUk9YWV9OQU1FYC4gKi9cbiAgZnJwUHJveHlOYW1lPzogc3RyaW5nO1xuICAvKiogRlJQIHBhdGggbG9jYXRpb24uIEVudiBgRlJQX1BBVEhgOyBkZWZhdWx0cyB0byBgREFUQUJSSUNLU19BUFBfTkFNRWAuICovXG4gIGZycFBhdGg/OiBzdHJpbmc7XG4gIC8qKiBTdHJpcCB0aGUgRlJQIHBhdGggYmVmb3JlIGZvcndhcmRpbmcuIEVudiBgRlJQX1NUUklQX1BSRUZJWGA7IGRlZmF1bHRzIHRydWUgZm9yIG5vbi1yb290IHBhdGhzLiAqL1xuICBmcnBTdHJpcFByZWZpeD86IGJvb2xlYW47XG59XG5cbi8qKiBQdWJsaWMgdHVubmVsIGNsaWVudHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnRlcmNlcHRvciBhbmQgQ0xJLiAqL1xuZXhwb3J0IHR5cGUgVHVubmVsVHJhbnNwb3J0ID0gXCJwb3J0clwiIHwgXCJmcnBcIiB8IFwiYm90aFwiO1xuXG4vKiogUmVzb2x2ZSBhbmQgdmFsaWRhdGUgdGhlIHR1bm5lbCB0cmFuc3BvcnQgc2VsZWN0b3IuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVR1bm5lbFRyYW5zcG9ydCh0cmFuc3BvcnQ/OiBzdHJpbmcpOiBUdW5uZWxUcmFuc3BvcnQge1xuICBjb25zdCByZXNvbHZlZCA9XG4gICAgdHJhbnNwb3J0ID8/XG4gICAgcHJvY2Vzcy5lbnYuREJYX1RPT0xTX1RVTk5FTF9UUkFOU1BPUlQgPz9cbiAgICBwcm9jZXNzLmVudi5UVU5ORUxfVFJBTlNQT1JUID8/XG4gICAgXCJwb3J0clwiO1xuICBpZiAocmVzb2x2ZWQgPT09IFwicG9ydHJcIiB8fCByZXNvbHZlZCA9PT0gXCJmcnBcIiB8fCByZXNvbHZlZCA9PT0gXCJib3RoXCIpIHJldHVybiByZXNvbHZlZDtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihgaW52YWxpZCB0dW5uZWwgdHJhbnNwb3J0OiAke3Jlc29sdmVkfSAoZXhwZWN0ZWQgcG9ydHIsIGZycCwgb3IgYm90aClgKTtcbn1cblxuLyoqIFJlc29sdmUgdGhlIHB1YmxpYyBwb3J0IHBvcnRyIHNob3VsZCB0YXJnZXQ6IGV4cGxpY2l0LCBlbHNlIHRoZSBBcHBzIGNvbnRyYWN0LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVB1YmxpY1BvcnQocG9ydD86IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBwb3J0ID8/IG9iamVjdC50b051bWJlcihwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0FQUF9QT1JUKSA/PyA4MDAwO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSB0dW5uZWwge0BsaW5rIEludGVyY2VwdG9yfS4gUGFzcyBpdCB0byBgY3JlYXRlQXBwKHsgaW50ZXJjZXB0b3IgfSlgLlxuICpcbiAqIEEgbm8tb3AgKGxvZ3MgYW5kIHJldHVybnMpIHdoZW4gbm9uZSBvZiB0aGUgc2VsZWN0ZWQgdHVubmVsIGNsaWVudHMgcmVzb2x2ZVxuICogdXNhYmxlIGNvbmZpZ3VyYXRpb24sIHNvIGFuIGFwcCBjYW4gcmVnaXN0ZXIgaXQgdW5jb25kaXRpb25hbGx5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHR1bm5lbEludGVyY2VwdG9yIH0gZnJvbSBcIkBkYngtdG9vbHMvdHVubmVsXCI7XG4gKlxuICogYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtzZXJ2ZXIoeyBob3N0LCBzdGF0aWNQYXRoIH0pXSxcbiAqICAgaW50ZXJjZXB0b3I6IHR1bm5lbEludGVyY2VwdG9yKCksXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR1bm5lbEludGVyY2VwdG9yKG9wdGlvbnM6IFR1bm5lbEludGVyY2VwdG9yT3B0aW9ucyA9IHt9KTogSW50ZXJjZXB0b3Ige1xuICByZXR1cm4gYXN5bmMgKGN0eDogSW50ZXJjZXB0b3JDb250ZXh0KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGN0eC5lbnYuZGF0YWJyaWNrc0hvc3QpIHtcbiAgICAgIHByb2Nlc3MuZW52LkRBVEFCUklDS1NfSE9TVCA/Pz0gY3R4LmVudi5kYXRhYnJpY2tzSG9zdDtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gcmVzb2x2ZVB1YmxpY1BvcnQob3B0aW9ucy5wb3J0KTtcbiAgICBjb25zdCB0cmFuc3BvcnQgPSByZXNvbHZlVHVubmVsVHJhbnNwb3J0KG9wdGlvbnMudHJhbnNwb3J0KTtcbiAgICBjb25zdCBhdXhpbGlhcmllczogQXJyYXk8eyBzdG9wKCk6IHZvaWQgfT4gPSBbXTtcbiAgICBpZiAodHJhbnNwb3J0ID09PSBcInBvcnRyXCIgfHwgdHJhbnNwb3J0ID09PSBcImJvdGhcIikge1xuICAgICAgY29uc3QgcG9ydHJDb25maWcgPSByZXNvbHZlUG9ydHJDb25maWcoe1xuICAgICAgICBwdWJsaWNEb21haW46IG9wdGlvbnMucHVibGljRG9tYWluLFxuICAgICAgICBzdWJkb21haW46IG9wdGlvbnMuc3ViZG9tYWluLFxuICAgICAgICBwb3J0LFxuICAgICAgfSk7XG4gICAgICBpZiAocG9ydHJDb25maWcpIHtcbiAgICAgICAgY29uc3QgcG9ydHJFbnYgPSBhd2FpdCBpbnN0YWxsUG9ydHIoKTtcbiAgICAgICAgYXdhaXQgd3JpdGVQb3J0ckNvbmZpZyhwb3J0ckNvbmZpZywgcG9ydHJFbnYpO1xuICAgICAgICBhdXhpbGlhcmllcy5wdXNoKHN1cGVydmlzZVBvcnRyKHBvcnRyQ29uZmlnLCBwb3J0ckVudikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJwb3J0ciBub3QgY29uZmlndXJlZCAocmVxdWlyZXMgUE9SVFJfVE9LRU4gYW5kIFRVTk5FTF9QVUJMSUNfRE9NQUlOKVwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRyYW5zcG9ydCA9PT0gXCJmcnBcIiB8fCB0cmFuc3BvcnQgPT09IFwiYm90aFwiKSB7XG4gICAgICBjb25zdCBmcnBDb25maWcgPSByZXNvbHZlRnJwQ29uZmlnKHtcbiAgICAgICAgcHVibGljRG9tYWluOiBvcHRpb25zLmZycFB1YmxpY0RvbWFpbixcbiAgICAgICAgc2VydmVyOiBvcHRpb25zLmZycFNlcnZlcixcbiAgICAgICAgc2VydmVyUG9ydDogb3B0aW9ucy5mcnBTZXJ2ZXJQb3J0LFxuICAgICAgICBwcm90b2NvbDogb3B0aW9ucy5mcnBQcm90b2NvbCxcbiAgICAgICAgdG9rZW46IG9wdGlvbnMuZnJwVG9rZW4sXG4gICAgICAgIHByb3h5TmFtZTogb3B0aW9ucy5mcnBQcm94eU5hbWUsXG4gICAgICAgIHBhdGg6IG9wdGlvbnMuZnJwUGF0aCxcbiAgICAgICAgc3RyaXBQcmVmaXg6IG9wdGlvbnMuZnJwU3RyaXBQcmVmaXgsXG4gICAgICAgIHBvcnQsXG4gICAgICB9KTtcbiAgICAgIGlmIChmcnBDb25maWcpIHtcbiAgICAgICAgY29uc3QgcGF0aFByb3h5ID1cbiAgICAgICAgICBmcnBDb25maWcuc3RyaXBQcmVmaXggJiYgZnJwQ29uZmlnLnBhdGggIT09IFwiL1wiXG4gICAgICAgICAgICA/IGF3YWl0IHN0YXJ0UGF0aFByb3h5KHBvcnQsIGZycENvbmZpZy5wYXRoKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChwYXRoUHJveHkpIHtcbiAgICAgICAgICBmcnBDb25maWcudGFyZ2V0UG9ydCA9IHBhdGhQcm94eS5wb3J0O1xuICAgICAgICAgIGN0eC5vbkxpZmVjeWNsZShcInNodXRkb3duXCIsICgpID0+IHZvaWQgcGF0aFByb3h5LmNsb3NlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZycEVudiA9IGF3YWl0IGluc3RhbGxGcnAoKTtcbiAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGF3YWl0IHdyaXRlRnJwQ29uZmlnKGZycENvbmZpZywgZnJwRW52KTtcbiAgICAgICAgYXV4aWxpYXJpZXMucHVzaChzdXBlcnZpc2VGcnAoZnJwQ29uZmlnLCBmcnBFbnYsIGNvbmZpZ1BhdGgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiZnJwIG5vdCBjb25maWd1cmVkIChyZXF1aXJlcyBUVU5ORUxfUFVCTElDX0RPTUFJTilcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYXV4aWxpYXJpZXMubGVuZ3RoKSByZXR1cm47XG4gICAgY3R4Lm9uVGVhcmRvd24oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBhdXhpbGlhcnkgb2YgYXV4aWxpYXJpZXMpIGF1eGlsaWFyeS5zdG9wKCk7XG4gICAgfSk7XG4gICAgY3R4Lm9uTGlmZWN5Y2xlKFwic2h1dGRvd25cIiwgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBhdXhpbGlhcnkgb2YgYXV4aWxpYXJpZXMpIGF1eGlsaWFyeS5zdG9wKCk7XG4gICAgfSk7XG4gICAgbG9nZ2VyLmluZm8oYHR1bm5lbCBib3VuZDogJHt0cmFuc3BvcnR9IC0+IDoke3BvcnR9YCk7XG4gIH07XG59XG4iXX0=
|
package/lib/src/plugin.d.ts
CHANGED
|
@@ -213,7 +213,7 @@ export declare class AuthGatePlugin extends Plugin<AuthGateConfig> {
|
|
|
213
213
|
};
|
|
214
214
|
};
|
|
215
215
|
private resolved;
|
|
216
|
-
private
|
|
216
|
+
private readonly runtimes;
|
|
217
217
|
static getResourceRequirements(config: AuthGateConfig): ResourceRequirement[];
|
|
218
218
|
setup(): Promise<void>;
|
|
219
219
|
shutdown(): Promise<void>;
|
package/lib/src/plugin.js
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { lakebase, Plugin, toPlugin, ResourceType, } from "@databricks/appkit";
|
|
18
18
|
import { plugin as appkitPlugin } from "@dbx-tools/appkit";
|
|
19
|
+
import { brand as appkitBrand } from "@dbx-tools/appkit";
|
|
19
20
|
import { auth as passwordlessAuth, storage as authStorage, } from "@dbx-tools/auth";
|
|
20
21
|
import { config as coreConfig } from "@dbx-tools/core";
|
|
21
22
|
import { brand, log, string } from "@dbx-tools/shared-core";
|
|
@@ -137,7 +138,7 @@ export class AuthGatePlugin extends Plugin {
|
|
|
137
138
|
},
|
|
138
139
|
};
|
|
139
140
|
resolved;
|
|
140
|
-
|
|
141
|
+
runtimes = new Map();
|
|
141
142
|
static getResourceRequirements(config) {
|
|
142
143
|
if (authStorage.resolveAuthStorageConfig(config).mode !== "lakebase")
|
|
143
144
|
return [];
|
|
@@ -158,29 +159,37 @@ export class AuthGatePlugin extends Plugin {
|
|
|
158
159
|
}
|
|
159
160
|
async setup() {
|
|
160
161
|
this.resolved = resolveAuthGateConfig(this.config);
|
|
162
|
+
if (!this.config.brandName && !coreConfig.text("AUTH_BRAND_NAME", TUNNEL_CONFIG)) {
|
|
163
|
+
this.resolved.brandName = appkitBrand.getBrandContext().name;
|
|
164
|
+
}
|
|
161
165
|
if (this.resolved.insecure) {
|
|
162
166
|
logger.warn("insecure mode - the tunnel runs OPEN with no auth gate");
|
|
163
167
|
}
|
|
164
168
|
else {
|
|
165
169
|
const lakebasePlugin = appkitPlugin.instance(this.context, lakebase);
|
|
166
|
-
const storage = await authStorage.createAuthStorage(this.resolved, lakebasePlugin?.exports().pool);
|
|
167
170
|
const { key } = await signingKey(this.resolved.sessionCutoffMs);
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
171
|
+
const origins = this.resolved.publicDomains.length
|
|
172
|
+
? this.resolved.publicDomains.map(authOrigin)
|
|
173
|
+
: [authOrigin(this.resolved.publicDomain)];
|
|
174
|
+
for (const origin of new Set(origins)) {
|
|
175
|
+
const storage = await authStorage.createAuthStorage(this.resolved, lakebasePlugin?.exports().pool);
|
|
176
|
+
this.runtimes.set(new URL(origin).host.toLowerCase(), await passwordlessAuth.createPasswordlessAuth({
|
|
177
|
+
storage,
|
|
178
|
+
baseURL: origin,
|
|
179
|
+
basePath: "/api/email/auth",
|
|
180
|
+
appName: this.resolved.brandName,
|
|
181
|
+
secret: Buffer.from(key).toString("base64url"),
|
|
182
|
+
sessionTtlSeconds: this.resolved.sessionTtlSeconds,
|
|
183
|
+
sessionCutoffMs: this.resolved.sessionCutoffMs,
|
|
184
|
+
logoutRedirectPath: this.resolved.logoutRedirectPath,
|
|
185
|
+
codeTtlSeconds: this.resolved.codeTtlSeconds,
|
|
186
|
+
maxAttempts: this.resolved.maxAttempts,
|
|
187
|
+
authorizeIdentity: (email) => this.authorizeIdentity(email),
|
|
188
|
+
sendCode: (email, code, options) => this.sendCode(email, code, options),
|
|
189
|
+
subject: this.resolved.subject,
|
|
190
|
+
message: this.resolved.message,
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
184
193
|
// `server()` is deferred, so it does not exist during this plugin's setup.
|
|
185
194
|
// At `setup:complete` the Express app exists but has not injected plugin
|
|
186
195
|
// routes or static handling yet, which is the one point the gate can mount
|
|
@@ -206,7 +215,8 @@ export class AuthGatePlugin extends Plugin {
|
|
|
206
215
|
});
|
|
207
216
|
}
|
|
208
217
|
async shutdown() {
|
|
209
|
-
await this.runtime
|
|
218
|
+
await Promise.all([...this.runtimes.values()].map((runtime) => runtime.close()));
|
|
219
|
+
this.runtimes.clear();
|
|
210
220
|
}
|
|
211
221
|
/**
|
|
212
222
|
* Register the login routes (`/api/email/auth/*`) and the gating middleware on
|
|
@@ -239,14 +249,17 @@ export class AuthGatePlugin extends Plugin {
|
|
|
239
249
|
return looksLikeEmail(email) && matchesAllowlist(email, this.resolved.allow);
|
|
240
250
|
}
|
|
241
251
|
exports() {
|
|
242
|
-
const runtime =
|
|
252
|
+
const runtime = (headers, request) => {
|
|
253
|
+
const host = (headers?.get("host") ?? (request ? new URL(request.url).host : "")).toLowerCase();
|
|
254
|
+
return this.runtimes.get(host) ?? this.runtimes.values().next().value;
|
|
255
|
+
};
|
|
243
256
|
return {
|
|
244
|
-
passkeysEnabled:
|
|
245
|
-
handler: (request) => runtime?.handler(request) ?? Promise.resolve(new Response("Not Found", { status: 404 })),
|
|
246
|
-
session: (headers) => runtime?.session(headers) ?? Promise.resolve(undefined),
|
|
247
|
-
status: (headers) => runtime?.status(headers) ??
|
|
257
|
+
passkeysEnabled: [...this.runtimes.values()].some((entry) => entry.passkeysEnabled),
|
|
258
|
+
handler: (request) => runtime(request.headers, request)?.handler(request) ?? Promise.resolve(new Response("Not Found", { status: 404 })),
|
|
259
|
+
session: (headers) => runtime(headers)?.session(headers) ?? Promise.resolve(undefined),
|
|
260
|
+
status: (headers) => runtime(headers)?.status(headers) ??
|
|
248
261
|
Promise.resolve({ authenticated: false, enabled: false, passkeysEnabled: false }),
|
|
249
|
-
close: () =>
|
|
262
|
+
close: () => this.shutdown(),
|
|
250
263
|
};
|
|
251
264
|
}
|
|
252
265
|
}
|
|
@@ -262,4 +275,4 @@ function authOrigin(publicDomain) {
|
|
|
262
275
|
}
|
|
263
276
|
/** Factory: `authGate({ allow, subject, ... })` for an AppKit `plugins` array. */
|
|
264
277
|
export const authGate = toPlugin(AuthGatePlugin);
|
|
265
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEVBSVIsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsSUFBSSxJQUFJLGdCQUFnQixFQUN4QixPQUFPLElBQUksV0FBVyxHQUt2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxXQUFXLENBQUM7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsSUFBSSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFjekMsU0FBUyxpQkFBaUIsQ0FBQyxPQUF5QjtJQUNsRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FDb0IsQ0FBQztJQUNyRSxNQUFNLFdBQVcsR0FBRyxNQUFNLEVB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QU0sQ0FBQyxPQUFPLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ25GLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtTQUNuRCxDQUFDO0lBQ0osQ0FBQzs7QUFHSCxTQUFTLFVBQVUsQ0FBQyxZQUFxQjtJQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxrQkFBa0IsQ0FBQztJQUN0QyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEUsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDakQsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgYXV0aEdhdGUoKWAgLSB0aGUgQXBwS2l0IGFkYXB0ZXIgYXJvdW5kIGBAZGJ4LXRvb2xzL2F1dGhgLlxuICpcbiAqIEl0IGhhcyBOTyByb3V0ZXMgb2YgaXRzIG93bjogdGhlIHR1bm5lbCBQUk9YWSAobm90IGFuIEhUVFAgc2VydmVyKSBjYWxscyB0aGVcbiAqIGhhbmRsZXJzIHRoaXMgcGx1Z2luIGV4cG9zZXMgdmlhIHtAbGluayBBdXRoR2F0ZVBsdWdpbi5leHBvcnRzfS4gVGhlIHBsdWdpblxuICogb3ducyB0dW5uZWwgYXV0aG9yaXphdGlvbiwgQXBwS2l0IExha2ViYXNlIGRpc2NvdmVyeSwgZW1haWwgZGVsaXZlcnksIGFuZFxuICogdHJhbnNwb3J0IG1vdW50aW5nLiBCZXR0ZXIgQXV0aCBvd25zIHVzZXJzLCBPVFBzLCBzZXNzaW9ucywgcmF0ZSBsaW1pdHMsIGFuZFxuICogcGFzc2tleXMuIGBjcmVhdGVBcHBgIGNhbiBydW4gdGhpcyBwbHVnaW4gd2l0aCBvciB3aXRob3V0IGBzZXJ2ZXIoKWAuXG4gKlxuICogT3B0aW9ucyBjb21lIGZyb20gQ0xJIGZsYWdzIE9SIGVudiwgd2l0aCBzZW5zaWJsZSBkZWZhdWx0cyAtIHNlZVxuICoge0BsaW5rIHJlc29sdmVBdXRoR2F0ZUNvbmZpZ30uIFRoZSBvbmUgcnVudGltZSBkZXBlbmRlbmN5IHRoZSBwbHVnaW4gY2FuJ3RcbiAqIHJlc29sdmUgaXRzZWxmIGlzIEhPVyB0byBlbWFpbCB0aGUgY29kZSwgc28gaXQgdGFrZXMgYSBgc2VuZENvZGVgIGNhbGxiYWNrIHRoZVxuICogYXBwIHdpcmVzIHRvIHRoZSBlbWFpbCBwbHVnaW4uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGxha2ViYXNlLFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICB0eXBlIEJhc2VQbHVnaW5Db25maWcsXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG4gIHR5cGUgUmVzb3VyY2VSZXF1aXJlbWVudCxcbiAgUmVzb3VyY2VUeXBlLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW4gYXMgYXBwa2l0UGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQge1xuICBhdXRoIGFzIHBhc3N3b3JkbGVzc0F1dGgsXG4gIHN0b3JhZ2UgYXMgYXV0aFN0b3JhZ2UsXG4gIHR5cGUgQXV0aG9yaXplSWRlbnRpdHksXG4gIHR5cGUgQXV0aFN0b3JhZ2VDb25maWcsXG4gIHR5cGUgQXV0aFN0b3JhZ2VNb2RlLFxuICB0eXBlIFBhc3N3b3JkbGVzc0F1dGhSdW50aW1lLFxufSBmcm9tIFwiQGRieC10b29scy9hdXRoXCI7XG5pbXBvcnQgeyBjb25maWcgYXMgY29yZUNvbmZpZyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgQXV0aFN0YXR1cyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoXCI7XG5pbXBvcnQgeyBicmFuZCwgbG9nLCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SGFuZGxlciB9IGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgeyBUVU5ORUxfQ09ORklHIH0gZnJvbSBcIi4vX2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgbG9va3NMaWtlRW1haWwsIG1hdGNoZXNBbGxvd2xpc3QgfSBmcm9tIFwiLi9hbGxvd2xpc3QudHNcIjtcbmltcG9ydCB7IG1vdW50R2F0ZSwgdHlwZSBHYXRlT3B0aW9ucyB9IGZyb20gXCIuL2dhdGUudHNcIjtcbmltcG9ydCB7IGVuc3VyZUVtYWlsQXZhaWxhYmxlLCBzZW5kQ29kZSBhcyBkZWZhdWx0U2VuZENvZGUgfSBmcm9tIFwiLi9zZW5kLWNvZGUudHNcIjtcbmltcG9ydCB7IEtFWV9UVExfU0VDT05EUywgcmVzb2x2ZVNlc3Npb25DdXRvZmYsIHNpZ25pbmdLZXkgfSBmcm9tIFwiLi9zaWduaW5nLWtleS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwidHVubmVsOmF1dGhcIik7XG5cbmludGVyZmFjZSBHYXRlU2VydmVyQXBwbGljYXRpb24ge1xuICBnZXQocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHVua25vd247XG4gIHBvc3QocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHVua25vd247XG4gIHVzZShwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIEdhdGVNb3VudENvbnRleHQge1xuICBhZGRSb3V0ZShtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHZvaWQ7XG4gIGFkZE1pZGRsZXdhcmUocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlcik6IHZvaWQ7XG4gIGdldFBsdWdpbnMoKTogUmVhZG9ubHlNYXA8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZnVuY3Rpb24gc2VydmVyQXBwbGljYXRpb24oY29udGV4dDogR2F0ZU1vdW50Q29udGV4dCk6IEdhdGVTZXJ2ZXJBcHBsaWNhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlcnZlciA9IGNvbnRleHQuZ2V0UGx1Z2lucygpLmdldChcInNlcnZlclwiKSBhc1xuICAgIHsgc2VydmVyQXBwbGljYXRpb24/OiBQYXJ0aWFsPEdhdGVTZXJ2ZXJBcHBsaWNhdGlvbj4gfSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYXBwbGljYXRpb24gPSBzZXJ2ZXI/LnNlcnZlckFwcGxpY2F0aW9uO1xuICByZXR1cm4gYXBwbGljYXRpb24gJiZcbiAgICB0eXBlb2YgYXBwbGljYXRpb24uZ2V0ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgYXBwbGljYXRpb24ucG9zdCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIGFwcGxpY2F0aW9uLnVzZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyAoYXBwbGljYXRpb24gYXMgR2F0ZVNlcnZlckFwcGxpY2F0aW9uKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW91bnRHYXRlT25Db250ZXh0KGNvbnRleHQ6IEdhdGVNb3VudENvbnRleHQsIG9wdGlvbnM6IEdhdGVPcHRpb25zKTogdm9pZCB7XG4gIGNvbnN0IGFwcGxpY2F0aW9uID0gc2VydmVyQXBwbGljYXRpb24oY29udGV4dCk7XG4gIGlmIChhcHBsaWNhdGlvbikge1xuICAgIG1vdW50R2F0ZShcbiAgICAgIG9wdGlvbnMsXG4gICAgICAobWV0aG9kLCBwYXRoLCBoYW5kbGVyKSA9PiBhcHBsaWNhdGlvblttZXRob2RdKHBhdGgsIGhhbmRsZXIpLFxuICAgICAgKHBhdGgsIGhhbmRsZXIpID0+IGFwcGxpY2F0aW9uLnVzZShwYXRoLCBoYW5kbGVyKSxcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBtb3VudEdhdGUoXG4gICAgb3B0aW9ucyxcbiAgICAobWV0aG9kLCBwYXRoLCBoYW5kbGVyKSA9PiBjb250ZXh0LmFkZFJvdXRlKG1ldGhvZCwgcGF0aCwgaGFuZGxlciksXG4gICAgKHBhdGgsIGhhbmRsZXIpID0+IGNvbnRleHQuYWRkTWlkZGxld2FyZShwYXRoLCBoYW5kbGVyKSxcbiAgKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgYXV0aEdhdGV9IHBsdWdpbiAoYWxsIHJlc29sdmFibGUgZnJvbSBlbnYgLSBzZWUgYmVsb3cpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2F0ZUNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcsIEF1dGhTdG9yYWdlQ29uZmlnIHtcbiAgLyoqIEFsbG93LWxpc3QgcGF0dGVybnMgKGRvbWFpbiAvIGdsb2IgLyBgL3JlZ2V4L2ApLiBFbXB0eSA9IGFsbG93IG5vYm9keS4gRW52IFRVTk5FTF9BVVRIX0FMTE9XLiAqL1xuICBhbGxvdz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogU3ViamVjdCBsaW5lIGZvciB0aGUgY29kZSBlbWFpbC4gRW52IFRVTk5FTF9BVVRIX1NVQkpFQ1QuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFwiWW91ciB2ZXJpZmljYXRpb24gY29kZVwiLiBUaGUgd29yZGluZyBvZiB0aGUgc3ViamVjdCBhbmRcbiAgICoge0BsaW5rIG1lc3NhZ2V9IGlzIGRlbGliZXJhdGVseSB0aGUgY29udmVudGlvbmFsIHBocmFzaW5nIHJhdGhlciB0aGFuXG4gICAqIGFueXRoaW5nIGJyYW5kZWQ6IGlPUywgR21haWwsIE91dGxvb2ssIGFuZCBBbmRyb2lkIGFsbCBkZXRlY3QgYSBvbmUtdGltZVxuICAgKiBjb2RlIGZyb20gdGhpcyBzaGFwZSBhbmQgb2ZmZXIgdG8gYXV0b2ZpbGwgaXQsIGFuZCBhIG5vdmVsIHBocmFzaW5nIGlzIHdoYXRcbiAgICogYnJlYWtzIHRoYXQgZGV0ZWN0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBzdWJqZWN0IFRFTVBMQVRFLCBub3QgdGhlIGxpdGVyYWwgbGluZSBzZW50OiB0aGUgY29kZSBpcyBzcGxpY2VkXG4gICAqIGludG8gaXQgKGBcIjEyMzQ1NiBpcyB5b3VyIHZlcmlmaWNhdGlvbiBjb2RlXCJgKSBiZWNhdXNlIGEgcHVzaCBub3RpZmljYXRpb25cbiAgICogc2hvd3Mgb25seSB0aGUgc3ViamVjdCBhbmQgcHJlaGVhZGVyLCBhbmQgdGhhdCBub3RpZmljYXRpb24gaXMgd2hhdCBtb2JpbGVcbiAgICogYXV0b2ZpbGwgcmVhZHMuIFNlZSBgY29kZUVtYWlsU3ViamVjdGAgaW4gYC4vY29kZS1lbWFpbC50c2AuXG4gICAqL1xuICBzdWJqZWN0Pzogc3RyaW5nO1xuICAvKipcbiAgICogRGlzcGxheSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgZW1haWwgY29weS4gRW52IFRVTk5FTF9BVVRIX0JSQU5EX05BTUUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBicmFuZCBjb250ZXh0J3MgYG5hbWVgIC0gdGhlIGFwcCdzIG93biBgYnJhbmRpbmcvYnJhbmQueWFtbGBcbiAgICogd2hlbiBpdCBoYXMgb25lLCBlbHNlIHRoZSBkYngtdG9vbHMgZGVmYXVsdC4gU2V0IHRoaXMgb25seSB0byBvdmVycmlkZSB0aGVcbiAgICogYnJhbmQgZm9yIHRoaXMgZ2F0ZS5cbiAgICovXG4gIGJyYW5kTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIExpbmUgc2hvd24gaW1tZWRpYXRlbHkgYWJvdmUgdGhlIGNvZGUgaW4gdGhlIGVtYWlsLiBFbnYgVFVOTkVMX0FVVEhfTUVTU0FHRS5cbiAgICpcbiAgICogS2VlcCB0aGUgY29kZSBvbiBpdHMgT1dOIGxpbmUgZGlyZWN0bHkgYWZ0ZXIgdGhpcyB0ZXh0IC0gdGhhdCBhZGphY2VuY3kgaXNcbiAgICogd2hhdCB0aGUgcGxhdGZvcm0gY29kZS1kZXRlY3Rpb24gaGV1cmlzdGljcyBrZXkgb24uXG4gICAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICAvKipcbiAgICogU2Vzc2lvbiBsaWZldGltZSAoc2Vjb25kcykuIEVudiBUVU5ORUxfQVVUSF9TRVNTSU9OX1RUTC4gRGVmYXVsdCAyNTkyMDAwICgzMGQpLlxuICAgKlxuICAgKiBNYXRjaGVkIHRvIHRoZSBjYWNoZS1iYWNrZWQgc2lnbmluZyBrZXkncyBvd24gMzAtZGF5IFRUTCAoc2VlXG4gICAqIGAuL3NpZ25pbmcta2V5LnRzYCk6IHRoZSBjb29raWUgYW5kIHRoZSBrZXkgdGhhdCB2YWxpZGF0ZXMgaXQgc2hvdWxkIGV4cGlyZVxuICAgKiB0b2dldGhlciwgb3Igb25lIHNpbGVudGx5IG91dGxpdmVzIHRoZSBvdGhlci5cbiAgICovXG4gIHNlc3Npb25UdGxTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogT25lLXRpbWUtY29kZSBsaWZldGltZSAoc2Vjb25kcykuIEVudiBUVU5ORUxfQVVUSF9DT0RFX1RUTC4gRGVmYXVsdCA2MDAgKDEwbSkuICovXG4gIGNvZGVUdGxTZWNvbmRzPzogbnVtYmVyO1xuICAvKiogTWF4IHZlcmlmeSBhdHRlbXB0cyBwZXIgaXNzdWVkIGNvZGUuIERlZmF1bHQgNS4gKi9cbiAgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGb3JjZS1jbGVhciBjdXRvZmY6IGV2ZXJ5IHNlc3Npb24gaXNzdWVkIEJFRk9SRSBpdCBzdG9wcyB2ZXJpZnlpbmcsIHNvIG1vdmluZ1xuICAgKiBpdCBmb3J3YXJkIHNpZ25zIGV2ZXJ5b25lIG91dC4gRW52IFRVTk5FTF9BVVRIX1NFU1NJT05fQ1VUT0ZGLlxuICAgKlxuICAgKiBBbnl0aGluZyBgb2JqZWN0LnRvRGF0ZWAgYWNjZXB0czogYSBgRGF0ZWAsIGAyMDI2LTA4LTAyYCwgYW4gSVNPIGluc3RhbnQsXG4gICAqIGVwb2NoIHNlY29uZHMvbWlsbGlzLCBvciBhIHJlbGF0aXZlIGR1cmF0aW9uIChgLTMwZGAsIGA3IGRheXMgYWdvYCkuIFVuc2V0XG4gICAqIG1lYW5zIG5vIGN1dG9mZi5cbiAgICovXG4gIHNlc3Npb25DdXRvZmY/OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xuICAvKipcbiAgICogU2FtZS1vcmlnaW4gcGF0aCByZXR1cm5lZCBhZnRlciBhIHN1Y2Nlc3NmdWwgbG9nb3V0LiBFbnZcbiAgICogYFRVTk5FTF9BVVRIX0xPR09VVF9SRURJUkVDVGAuIERlZmF1bHRzIHRvIGAvYCwgd2hlcmUgdGhlIEF1dGhHYXRlIHByZXNlbnRzXG4gICAqIGxvZ2luIGFnYWluLlxuICAgKi9cbiAgbG9nb3V0UmVkaXJlY3RQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogRGVsaXZlciBhIGNvZGUgdG8gYW4gYWRkcmVzcy4gRGVmYXVsdHMgdG8gc2VuZGluZyB0aHJvdWdoIHRoZSBob3N0IGFwcCdzXG4gICAqIHNoYXJlZCBgQGRieC10b29scy9lbWFpbGAgdHJhbnNwb3J0IChzZWUgYC4vc2VuZC1jb2RlYCk7IG92ZXJyaWRlIHRvIHdpcmUgYVxuICAgKiBkaWZmZXJlbnQgZGVsaXZlcnkgcGF0aC5cbiAgICovXG4gIHNlbmRDb2RlPzogKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgb3B0czogU2VuZENvZGVPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogSWRlbnRpdHkgYXV0aG9yaXphdGlvbiBpbmRlcGVuZGVudCBvZiBhdXRoZW50aWNhdGlvbi4gRGVmYXVsdHMgdG8gdGhlXG4gICAqIGNvbmZpZ3VyZWQgYWxsb3ctbGlzdCBhbmQgaXMgcmUtZXZhbHVhdGVkIGZvciBldmVyeSBhY2NlcHRlZCBzZXNzaW9uLlxuICAgKi9cbiAgYXV0aG9yaXplSWRlbnRpdHk/OiBBdXRob3JpemVJZGVudGl0eTtcbiAgLyoqXG4gICAqIFRoZSBwdWJsaWMgYDxzdWJkb21haW4+LjxzZXJ2ZXI+YCB0aGF0IGlkZW50aWZpZXMgcG9ydHIgdHJhZmZpYyBieSBpdHMgYEhvc3RgXG4gICAqIGhlYWRlci4gT25seSByZXF1ZXN0cyB3aG9zZSBgSG9zdGAgbWF0Y2hlcyB0aGlzIGFyZSBnYXRlZDsgZXZlcnl0aGluZyBlbHNlXG4gICAqICh0aGUgcGxhdGZvcm0gZnJvbnQgZG9vciwgb3RoZXIgbG9jYWwgY2FsbGVycykgcGFzc2VzIHRocm91Z2guIEVudlxuICAgKiBgVFVOTkVMX1BVQkxJQ19ET01BSU5gLiBXaGVuIGFic2VudCwgdGhlIGdhdGUgaXMgaW5lcnQgKG5vdGhpbmcgaXMgdHVubmVsXG4gICAqIHRyYWZmaWMpLlxuICAgKi9cbiAgcHVibGljRG9tYWluPzogc3RyaW5nO1xuICAvKiogQWRkaXRpb25hbCBwdWJsaWMgdHVubmVsIGRvbWFpbnMgYWNjZXB0ZWQgYnkgdGhlIGdhdGUuICovXG4gIHB1YmxpY0RvbWFpbnM/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEV4dHJhIGB4LWAgcmVxdWVzdCBoZWFkZXJzIHR1bm5lbCB0cmFmZmljIG1heSBmb3J3YXJkIChsaXRlcmFsIC8gZ2xvYiAvXG4gICAqIGAvcmVnZXgvYCksIHVuaW9uZWQgd2l0aCB0aGUgYnVpbHQtaW4gYWxsb3ctbGlzdC4gRW52IGBUVU5ORUxfRk9SV0FSRF9IRUFERVJTYC5cbiAgICovXG4gIGZvcndhcmRIZWFkZXJzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBQYXRoIHByZWZpeGVzIHRvIGdhdGUgYmV5b25kIHRoZSBidWlsdC1pbiBgL2FwaS9gIChsaXRlcmFsIHByZWZpeGVzLCBjb21tYS1cbiAgICogb3Igc3BhY2Utc2VwYXJhdGVkIGFzIGEgc3RyaW5nKS4gRm9yIGFuIGFwcCB3aG9zZSBwcml2aWxlZ2VkIHN1cmZhY2UgaXMgbm90XG4gICAqIHVuZGVyIGAvYXBpL2Ag4oCUIGUuZy4gYSBXZWJTb2NrZXQgYXQgYC93c2Ag4oCUIGxpc3QgdGhvc2UgcHJlZml4ZXMgc28gdGhleVxuICAgKiByZXF1aXJlIGEgc2Vzc2lvbiB0b28uIEVudiBgVFVOTkVMX0dBVEVfUEFUSFNgLlxuICAgKi9cbiAgZ2F0ZVBhdGhzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBSdW4gT1BFTiB3aXRoIG5vIGdhdGUgKGVudiBgVFVOTkVMX0lOU0VDVVJFPXRydWVgKS4gVGhlIGxvZ2luIHJvdXRlcyBhbmQgZ2F0ZVxuICAgKiBtaWRkbGV3YXJlIGFyZSBub3QgbW91bnRlZCwgYW5kIHRoZSBTTVRQIGZhaWwtZmFzdCBpcyBza2lwcGVkLiBVc2Ugb25seSB3aGVuXG4gICAqIHRoZSB0dW5uZWwgaXMgZGVsaWJlcmF0ZWx5IHB1YmxpYy5cbiAgICovXG4gIGluc2VjdXJlPzogYm9vbGVhbjtcbn1cblxuLyoqIEJyYW5kaW5nL21lc3NhZ2luZyBwYXNzZWQgdG8ge0BsaW5rIEF1dGhHYXRlQ29uZmlnLnNlbmRDb2RlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VuZENvZGVPcHRpb25zIHtcbiAgc3ViamVjdDogc3RyaW5nO1xuICBicmFuZE5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKipcbiAgICogTGlmZXRpbWUgb2YgdGhlIGNvZGUgYmVpbmcgc2VudCwgaW4gc2Vjb25kcyAtIHRoZSBSRVNPTFZFRFxuICAgKiB7QGxpbmsgQXV0aEdhdGVDb25maWcuY29kZVR0bFNlY29uZHN9LCBzbyB0aGUgZW1haWwgY2FuIHN0YXRlIHRoZSByZWFsXG4gICAqIGV4cGlyeSAoXCJUaGlzIGNvZGUgZXhwaXJlcyBpbiAxMCBtaW51dGVzXCIpIGluc3RlYWQgb2YgYSB2YWd1ZSBcInNob3J0bHlcIlxuICAgKiB0aGF0IGRyaWZ0cyBmcm9tIHRoZSBjb25maWd1cmVkIFRUTC5cbiAgICovXG4gIGNvZGVUdGxTZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKiBSZXNvbHZlZCBnYXRlIGNvbmZpZyB3aXRoIGVudiBmYWxsYmFja3MgKyBkZWZhdWx0cyBhcHBsaWVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEF1dGhHYXRlQ29uZmlnIHtcbiAgYWxsb3c6IHN0cmluZ1tdO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJyYW5kTmFtZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHNlc3Npb25UdGxTZWNvbmRzOiBudW1iZXI7XG4gIGNvZGVUdGxTZWNvbmRzOiBudW1iZXI7XG4gIG1heEF0dGVtcHRzOiBudW1iZXI7XG4gIC8qKiBGb3JjZS1jbGVhciBjdXRvZmYgaW4gZXBvY2ggbXM7IGAwYCB3aGVuIHVuc2V0LiAqL1xuICBzZXNzaW9uQ3V0b2ZmTXM6IG51bWJlcjtcbiAgLyoqIFNhbWUtb3JpZ2luIHBhdGggcmV0dXJuZWQgYWZ0ZXIgbG9nb3V0LiAqL1xuICBsb2dvdXRSZWRpcmVjdFBhdGg6IHN0cmluZztcbiAgLyoqIFByaW1hcnkgcHVibGljIGRvbWFpbjsgYHVuZGVmaW5lZGAgd2hlbiBQb3J0ciBpcyBub3QgY29uZmlndXJlZC4gKi9cbiAgcHVibGljRG9tYWluPzogc3RyaW5nO1xuICAvKiogQWxsIHB1YmxpYyB0dW5uZWwgZG9tYWlucyBhY2NlcHRlZCBieSB0aGUgZ2F0ZS4gKi9cbiAgcHVibGljRG9tYWluczogc3RyaW5nW107XG4gIC8qKiBFeHRyYSBgeC1gIGhlYWRlcnMgdHVubmVsIHRyYWZmaWMgbWF5IGZvcndhcmQgKHVuaW9uZWQgd2l0aCB0aGUgZGVmYXVsdHMpLiAqL1xuICBmb3J3YXJkSGVhZGVyczogc3RyaW5nW107XG4gIC8qKiBQYXRoIHByZWZpeGVzIHRvIGdhdGUgYmV5b25kIGAvYXBpL2AgKGUuZy4gYC93c2ApLiAqL1xuICBnYXRlUGF0aHM6IHN0cmluZ1tdO1xuICAvKiogUnVuIE9QRU4gd2l0aCBubyBnYXRlLiAqL1xuICBpbnNlY3VyZTogYm9vbGVhbjtcbiAgc3RvcmFnZTogQXV0aFN0b3JhZ2VNb2RlO1xuICBzcWxpdGVQYXRoPzogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUUyA9IHtcbiAgc3ViamVjdDogXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlXCIsXG4gIC8vIFRoZSByZXBvLXdpZGUgYnJhbmQgY29udGV4dCdzIGRpc3BsYXkgbmFtZSwgTk9UIGEgaGFyZGNvZGVkIHByb2R1Y3Qgc3RyaW5nOlxuICAvLyB0aGlzIG5hbWUgaXMgd2hhdCB0aGUgcmVjaXBpZW50IHJlYWRzIGluIHRoZSBjb2RlIGVtYWlsLCBzbyBpdCBoYXMgdG8gYmUgdGhlXG4gIC8vIHNhbWUgaWRlbnRpdHkgdGhlIHJlc3Qgb2YgdGhlIGFwcCBwcmVzZW50cy4gQSBob3N0IHdpdGggaXRzIG93blxuICAvLyBgYnJhbmRpbmcvYnJhbmQueWFtbGAgb3ZlcnJpZGVzIGl0IGJ5IHBhc3NpbmcgYGJyYW5kTmFtZWA7IHRoZSBzaGFyZWQgZGVmYXVsdFxuICAvLyBpcyB0aGUgZmFsbGJhY2sgd2hlbiBub3RoaW5nIGlzIGNvbmZpZ3VyZWQuXG4gIGJyYW5kTmFtZTogYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dC5uYW1lLFxuICBtZXNzYWdlOiBcIllvdXIgdmVyaWZpY2F0aW9uIGNvZGUgaXM6XCIsXG4gIC8vIDMwIGRheXMsIHRoZSBzYW1lIHdpbmRvdyB0aGUgY2FjaGUtYmFja2VkIHNpZ25pbmcga2V5IGlzIHN0b3JlZCBmb3IuXG4gIHNlc3Npb25UdGxTZWNvbmRzOiBLRVlfVFRMX1NFQ09ORFMsXG4gIGNvZGVUdGxTZWNvbmRzOiA2MDAsXG4gIG1heEF0dGVtcHRzOiA1LFxuICBsb2dvdXRSZWRpcmVjdFBhdGg6IFwiL1wiLFxufTtcblxuLyoqIE1lcmdlIHtAbGluayBBdXRoR2F0ZUNvbmZpZ30gb3ZlciBlbnYgb3ZlciBkZWZhdWx0cyBpbnRvIGEgcmVzb2x2ZWQgY29uZmlnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBdXRoR2F0ZUNvbmZpZyhjb25maWc6IEF1dGhHYXRlQ29uZmlnKTogUmVzb2x2ZWRBdXRoR2F0ZUNvbmZpZyB7XG4gIGNvbnN0IHN0b3JhZ2UgPSBhdXRoU3RvcmFnZS5yZXNvbHZlQXV0aFN0b3JhZ2VDb25maWcoe1xuICAgIHN0b3JhZ2U6XG4gICAgICBjb25maWcuc3RvcmFnZSA/P1xuICAgICAgKGNvcmVDb25maWcudGV4dChcIkFVVEhfU1RPUkFHRVwiLCBUVU5ORUxfQ09ORklHKSBhcyBBdXRoU3RvcmFnZU1vZGUgfCB1bmRlZmluZWQpLFxuICAgIHNxbGl0ZVBhdGg6IGNvbmZpZy5zcWxpdGVQYXRoID8/IGNvcmVDb25maWcudGV4dChcIkFVVEhfU1FMSVRFX1BBVEhcIiwgVFVOTkVMX0NPTkZJRyksXG4gIH0pO1xuICBjb25zdCBwdWJsaWNEb21haW4gPSBjb3JlQ29uZmlnLnN0cmluZyhjb25maWcucHVibGljRG9tYWluLCBcIlBVQkxJQ19ET01BSU5cIiwgVFVOTkVMX0NPTkZJRyk7XG4gIGNvbnN0IGZycFB1YmxpY0RvbWFpbiA9IGNvcmVDb25maWcudGV4dChcIkZSUF9QVUJMSUNfRE9NQUlOXCIsIFRVTk5FTF9DT05GSUcpO1xuICByZXR1cm4ge1xuICAgIC8vIEJvdGggc291cmNlcyBhcmUgdW5pb25lZCByYXRoZXIgdGhhbiBvbmUgb3ZlcnJpZGluZzogYSBkZXBsb3ltZW50LXdpZGVcbiAgICAvLyBUVU5ORUxfQVVUSF9BTExPVyBhbmQgYSBwZXItaW52b2NhdGlvbiBgLS1hbGxvd2Agc2hvdWxkIGJvdGggZ3JhbnQgYWNjZXNzLlxuICAgIC8vIEhlbmNlIGBwYXJzZUxpc3RgIG9uIGVhY2ggcmF0aGVyIHRoYW4gYGNvbmZpZy5saXN0YCwgd2hpY2ggc3RvcHMgYXQgdGhlXG4gICAgLy8gZmlyc3Qgc291cmNlIHRoYXQgeWllbGRzIGFueXRoaW5nLlxuICAgIGFsbG93OiBbXG4gICAgICAuLi5zdHJpbmcucGFyc2VMaXN0KGNvbmZpZy5hbGxvdyksXG4gICAgICAuLi5zdHJpbmcucGFyc2VMaXN0KGNvcmVDb25maWcudGV4dChbXCJBVVRIX0FMTE9XXCIsIFwiRU1BSUxfQVVUSF9BTExPV1wiXSwgVFVOTkVMX0NPTkZJRykpLFxuICAgIF0sXG4gICAgc3ViamVjdDogY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLnN1YmplY3QsIFwiQVVUSF9TVUJKRUNUXCIsIFRVTk5FTF9DT05GSUcpID8/IERFRkFVTFRTLnN1YmplY3QsXG4gICAgYnJhbmROYW1lOlxuICAgICAgY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLmJyYW5kTmFtZSwgXCJBVVRIX0JSQU5EX05BTUVcIiwgVFVOTkVMX0NPTkZJRykgPz8gREVGQVVMVFMuYnJhbmROYW1lLFxuICAgIG1lc3NhZ2U6IGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5tZXNzYWdlLCBcIkFVVEhfTUVTU0FHRVwiLCBUVU5ORUxfQ09ORklHKSA/PyBERUZBVUxUUy5tZXNzYWdlLFxuICAgIHNlc3Npb25UdGxTZWNvbmRzOiBjb3JlQ29uZmlnLnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgXCJBVVRIX1NFU1NJT05fVFRMXCIsXG4gICAgICBERUZBVUxUUy5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIFRVTk5FTF9DT05GSUcsXG4gICAgKSxcbiAgICBjb2RlVHRsU2Vjb25kczogY29yZUNvbmZpZy5wb3NpdGl2ZUludChcbiAgICAgIGNvbmZpZy5jb2RlVHRsU2Vjb25kcyxcbiAgICAgIFwiQVVUSF9DT0RFX1RUTFwiLFxuICAgICAgREVGQVVMVFMuY29kZVR0bFNlY29uZHMsXG4gICAgICBUVU5ORUxfQ09ORklHLFxuICAgICksXG4gICAgbWF4QXR0ZW1wdHM6IGNvbmZpZy5tYXhBdHRlbXB0cyA/PyBERUZBVUxUUy5tYXhBdHRlbXB0cyxcbiAgICBzZXNzaW9uQ3V0b2ZmTXM6IHJlc29sdmVTZXNzaW9uQ3V0b2ZmKGNvbmZpZy5zZXNzaW9uQ3V0b2ZmKSxcbiAgICBsb2dvdXRSZWRpcmVjdFBhdGg6IHBhc3N3b3JkbGVzc0F1dGgubm9ybWFsaXplTG9nb3V0UmVkaXJlY3RQYXRoKFxuICAgICAgY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLmxvZ291dFJlZGlyZWN0UGF0aCwgXCJBVVRIX0xPR09VVF9SRURJUkVDVFwiLCBUVU5ORUxfQ09ORklHKSA/P1xuICAgICAgICBERUZBVUxUUy5sb2dvdXRSZWRpcmVjdFBhdGgsXG4gICAgKSxcbiAgICBwdWJsaWNEb21haW4sXG4gICAgcHVibGljRG9tYWluczogW1xuICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgW1xuICAgICAgICAgIHB1YmxpY0RvbWFpbixcbiAgICAgICAgICBmcnBQdWJsaWNEb21haW4sXG4gICAgICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcucHVibGljRG9tYWlucyksXG4gICAgICAgIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiAhIXZhbHVlKSxcbiAgICAgICksXG4gICAgXSxcbiAgICBmb3J3YXJkSGVhZGVyczogW1xuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb25maWcuZm9yd2FyZEhlYWRlcnMpLFxuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb3JlQ29uZmlnLnRleHQoXCJGT1JXQVJEX0hFQURFUlNcIiwgVFVOTkVMX0NPTkZJRykpLFxuICAgIF0sXG4gICAgZ2F0ZVBhdGhzOiBbXG4gICAgICAuLi5zdHJpbmcucGFyc2VMaXN0KGNvbmZpZy5nYXRlUGF0aHMpLFxuICAgICAgLi4uc3RyaW5nLnBhcnNlTGlzdChjb3JlQ29uZmlnLnRleHQoXCJHQVRFX1BBVEhTXCIsIFRVTk5FTF9DT05GSUcpKSxcbiAgICBdLFxuICAgIGluc2VjdXJlOiBjb3JlQ29uZmlnLmJvb2xlYW4oY29uZmlnLmluc2VjdXJlLCBcIklOU0VDVVJFXCIsIFRVTk5FTF9DT05GSUcpID8/IGZhbHNlLFxuICAgIHN0b3JhZ2U6IHN0b3JhZ2UubW9kZSxcbiAgICBzcWxpdGVQYXRoOiBzdG9yYWdlLnNxbGl0ZVBhdGgsXG4gIH07XG59XG5cbi8qKiBUaGUgaGFuZGxlcnMgdGhlIGdhdGUgbWlkZGxld2FyZSBjYWxscyBpbi1wcm9jZXNzIChyZXR1cm5lZCBieSB7QGxpbmsgQXV0aEdhdGVQbHVnaW4uZXhwb3J0c30pLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2F0ZUFwaSB7XG4gIC8qKiBCZXR0ZXIgQXV0aCBhbmQgY29tcGF0aWJpbGl0eSByb3V0ZXMgdW5kZXIgYC9hcGkvZW1haWwvYXV0aC8qYC4gKi9cbiAgaGFuZGxlcihyZXF1ZXN0OiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT47XG4gIC8qKiBSZXNvbHZlIHRoZSBhdXRob3JpemVkIGVtYWlsIGZvciByZXF1ZXN0IGhlYWRlcnMsIG9yIHVuZGVmaW5lZC4gKi9cbiAgc2Vzc2lvbihoZWFkZXJzOiBIZWFkZXJzKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICAvKiogVGhlIGdhdGUgc3RhdHVzIHBheWxvYWQuICovXG4gIHN0YXR1cyhoZWFkZXJzOiBIZWFkZXJzKTogUHJvbWlzZTxBdXRoU3RhdHVzPjtcbiAgLyoqIFdoZXRoZXIgdGhlIHJ1bnRpbWUgZXhwb3NlcyBwYXNza2V5IGVucm9sbG1lbnQgYW5kIGF1dGhlbnRpY2F0aW9uLiAqL1xuICByZWFkb25seSBwYXNza2V5c0VuYWJsZWQ6IGJvb2xlYW47XG4gIC8qKiBDbG9zZSBhdXRoIHN0b3JhZ2Ugb3duZWQgYnkgdGhpcyBydW50aW1lLiAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEFwcEtpdCBwbHVnaW4gYWRhcHRpbmcgYEBkYngtdG9vbHMvYXV0aGAgdG8gdHVubmVsIHRyYWZmaWMuIE9uIGBzZXR1cCgpYCBpdCByZWdpc3RlcnMgdGhlIGxvZ2luXG4gKiByb3V0ZXMgKGAvYXBpL2VtYWlsL2F1dGgvKmApIGFuZCBhIGdhdGluZyBtaWRkbGV3YXJlIG9uIHRoZSBhcHAncyBPV04gRXhwcmVzc1xuICogc2VydmVyIHZpYSBgdGhpcy5jb250ZXh0YCwgc28gYSBwdWJsaWMgcG9ydHIgY2FsbGVyIG11c3QgcHJvdmUgYW4gZW1haWwgYmVmb3JlXG4gKiByZWFjaGluZyB0aGUgYXBwJ3MgYC9hcGkvKmAgLSBzZWUgYC4vZ2F0ZWAuIEZyb250LWRvb3IgKHBsYXRmb3JtKSB0cmFmZmljIGFuZFxuICogb3RoZXIgbG9jYWwgY2FsbGVycyBwYXNzIHRocm91Z2ggdW50b3VjaGVkICh0aGUgZ2F0ZSBrZXlzIG9uIHRoZSBgSG9zdGAgaGVhZGVyKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGhHYXRlUGx1Z2luIGV4dGVuZHMgUGx1Z2luPEF1dGhHYXRlQ29uZmlnPiB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImF1dGhHYXRlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQXV0aCBHYXRlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQmV0dGVyIEF1dGggZW1haWwgT1RQIGFuZCBwYXNza2V5IGFjY2VzcyBnYXRlIGZvciBhIHB1YmxpYyB0dW5uZWwuXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHJlcXVpcmVkOiBbXSxcbiAgICAgIG9wdGlvbmFsOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBSZXNvdXJjZVR5cGUuUE9TVEdSRVMsXG4gICAgICAgICAgYWxpYXM6IFwiYXV0aFwiLFxuICAgICAgICAgIHJlc291cmNlS2V5OiBcImF1dGgtZGF0YWJhc2VcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJEdXJhYmxlIHVzZXJzLCBzZXNzaW9ucywgT1RQIHJlY29yZHMsIGFuZCBwYXNza2V5cy5cIixcbiAgICAgICAgICBwZXJtaXNzaW9uOiBcIkNBTl9DT05ORUNUX0FORF9DUkVBVEVcIixcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIGluc3RhbmNlX25hbWU6IHsgZW52OiBcIkxBS0VCQVNFX0lOU1RBTkNFX05BTUVcIiB9LFxuICAgICAgICAgICAgZGF0YWJhc2VfbmFtZTogeyBlbnY6IFwiUEdEQVRBQkFTRVwiIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSBzYXRpc2ZpZXMgUGx1Z2luTWFuaWZlc3Q8XCJhdXRoR2F0ZVwiPjtcblxuICBwcml2YXRlIHJlc29sdmVkITogUmVzb2x2ZWRBdXRoR2F0ZUNvbmZpZztcbiAgcHJpdmF0ZSBydW50aW1lPzogUGFzc3dvcmRsZXNzQXV0aFJ1bnRpbWU7XG5cbiAgc3RhdGljIGdldFJlc291cmNlUmVxdWlyZW1lbnRzKGNvbmZpZzogQXV0aEdhdGVDb25maWcpOiBSZXNvdXJjZVJlcXVpcmVtZW50W10ge1xuICAgIGlmIChhdXRoU3RvcmFnZS5yZXNvbHZlQXV0aFN0b3JhZ2VDb25maWcoY29uZmlnKS5tb2RlICE9PSBcImxha2ViYXNlXCIpIHJldHVybiBbXTtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0eXBlOiBSZXNvdXJjZVR5cGUuUE9TVEdSRVMsXG4gICAgICAgIGFsaWFzOiBcImF1dGhcIixcbiAgICAgICAgcmVzb3VyY2VLZXk6IFwiYXV0aC1kYXRhYmFzZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJEdXJhYmxlIHVzZXJzLCBzZXNzaW9ucywgT1RQIHJlY29yZHMsIGFuZCBwYXNza2V5cy5cIixcbiAgICAgICAgcGVybWlzc2lvbjogXCJDQU5fQ09OTkVDVF9BTkRfQ1JFQVRFXCIsXG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIGluc3RhbmNlX25hbWU6IHsgZW52OiBcIkxBS0VCQVNFX0lOU1RBTkNFX05BTUVcIiB9LFxuICAgICAgICAgIGRhdGFiYXNlX25hbWU6IHsgZW52OiBcIlBHREFUQUJBU0VcIiB9LFxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVzb2x2ZWQgPSByZXNvbHZlQXV0aEdhdGVDb25maWcodGhpcy5jb25maWcpO1xuXG4gICAgaWYgKHRoaXMucmVzb2x2ZWQuaW5zZWN1cmUpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiaW5zZWN1cmUgbW9kZSAtIHRoZSB0dW5uZWwgcnVucyBPUEVOIHdpdGggbm8gYXV0aCBnYXRlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsYWtlYmFzZVBsdWdpbiA9IGFwcGtpdFBsdWdpbi5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKTtcbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCBhdXRoU3RvcmFnZS5jcmVhdGVBdXRoU3RvcmFnZShcbiAgICAgICAgdGhpcy5yZXNvbHZlZCxcbiAgICAgICAgbGFrZWJhc2VQbHVnaW4/LmV4cG9ydHMoKS5wb29sLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsga2V5IH0gPSBhd2FpdCBzaWduaW5nS2V5KHRoaXMucmVzb2x2ZWQuc2Vzc2lvbkN1dG9mZk1zKTtcbiAgICAgIHRoaXMucnVudGltZSA9IGF3YWl0IHBhc3N3b3JkbGVzc0F1dGguY3JlYXRlUGFzc3dvcmRsZXNzQXV0aCh7XG4gICAgICAgIHN0b3JhZ2UsXG4gICAgICAgIGJhc2VVUkw6IGF1dGhPcmlnaW4odGhpcy5yZXNvbHZlZC5wdWJsaWNEb21haW4pLFxuICAgICAgICBiYXNlUGF0aDogXCIvYXBpL2VtYWlsL2F1dGhcIixcbiAgICAgICAgYXBwTmFtZTogdGhpcy5yZXNvbHZlZC5icmFuZE5hbWUsXG4gICAgICAgIHNlY3JldDogQnVmZmVyLmZyb20oa2V5KS50b1N0cmluZyhcImJhc2U2NHVybFwiKSxcbiAgICAgICAgc2Vzc2lvblR0bFNlY29uZHM6IHRoaXMucmVzb2x2ZWQuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICAgIHNlc3Npb25DdXRvZmZNczogdGhpcy5yZXNvbHZlZC5zZXNzaW9uQ3V0b2ZmTXMsXG4gICAgICAgIGxvZ291dFJlZGlyZWN0UGF0aDogdGhpcy5yZXNvbHZlZC5sb2dvdXRSZWRpcmVjdFBhdGgsXG4gICAgICAgIGNvZGVUdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgICBtYXhBdHRlbXB0czogdGhpcy5yZXNvbHZlZC5tYXhBdHRlbXB0cyxcbiAgICAgICAgYXV0aG9yaXplSWRlbnRpdHk6IChlbWFpbCkgPT4gdGhpcy5hdXRob3JpemVJZGVudGl0eShlbWFpbCksXG4gICAgICAgIHNlbmRDb2RlOiAoZW1haWwsIGNvZGUsIG9wdGlvbnMpID0+IHRoaXMuc2VuZENvZGUoZW1haWwsIGNvZGUsIG9wdGlvbnMpLFxuICAgICAgICBzdWJqZWN0OiB0aGlzLnJlc29sdmVkLnN1YmplY3QsXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMucmVzb2x2ZWQubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgLy8gYHNlcnZlcigpYCBpcyBkZWZlcnJlZCwgc28gaXQgZG9lcyBub3QgZXhpc3QgZHVyaW5nIHRoaXMgcGx1Z2luJ3Mgc2V0dXAuXG4gICAgICAvLyBBdCBgc2V0dXA6Y29tcGxldGVgIHRoZSBFeHByZXNzIGFwcCBleGlzdHMgYnV0IGhhcyBub3QgaW5qZWN0ZWQgcGx1Z2luXG4gICAgICAvLyByb3V0ZXMgb3Igc3RhdGljIGhhbmRsaW5nIHlldCwgd2hpY2ggaXMgdGhlIG9uZSBwb2ludCB0aGUgZ2F0ZSBjYW4gbW91bnRcbiAgICAgIC8vIGFoZWFkIG9mIGV2ZXJ5IHByb3RlY3RlZCByb3V0ZS5cbiAgICAgIHRoaXMuY29udGV4dD8ub25MaWZlY3ljbGUoXCJzZXR1cDpjb21wbGV0ZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMubW91bnRHYXRlUm91dGVzKCk7XG4gICAgICAgIC8vIEZhaWwgZmFzdCBvbmNlIHRoZSBzaWJsaW5nIGVtYWlsIHBsdWdpbiBoYXMgcHJpbWVkIGl0cyB0cmFuc3BvcnQ6IGFcbiAgICAgICAgLy8gZ2F0ZSB0aGF0IGNhbm5vdCBlbWFpbCBhIGNvZGUgbGV0cyBub2JvZHkgaW4uXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuc2VuZENvZGUpIGF3YWl0IGVuc3VyZUVtYWlsQXZhaWxhYmxlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIHBhdHRlcm5zOiB0aGlzLnJlc29sdmVkLmFsbG93Lmxlbmd0aCxcbiAgICAgIHNlc3Npb25UdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgcHVibGljRG9tYWluczogdGhpcy5yZXNvbHZlZC5wdWJsaWNEb21haW5zLFxuICAgICAgaW5zZWN1cmU6IHRoaXMucmVzb2x2ZWQuaW5zZWN1cmUsXG4gICAgICBzdG9yYWdlOiB0aGlzLnJlc29sdmVkLnN0b3JhZ2UsXG4gICAgICBsb2dvdXRSZWRpcmVjdFBhdGg6IHRoaXMucmVzb2x2ZWQubG9nb3V0UmVkaXJlY3RQYXRoLFxuICAgICAgc2Vzc2lvbkN1dG9mZjpcbiAgICAgICAgdGhpcy5yZXNvbHZlZC5zZXNzaW9uQ3V0b2ZmTXMgPiAwXG4gICAgICAgICAgPyBuZXcgRGF0ZSh0aGlzLnJlc29sdmVkLnNlc3Npb25DdXRvZmZNcykudG9JU09TdHJpbmcoKVxuICAgICAgICAgIDogbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVudGltZT8uY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGUgbG9naW4gcm91dGVzIChgL2FwaS9lbWFpbC9hdXRoLypgKSBhbmQgdGhlIGdhdGluZyBtaWRkbGV3YXJlIG9uXG4gICAqIHRoZSBhcHAncyBPV04gRXhwcmVzcyBzZXJ2ZXIuIEF0IGBzZXR1cDpjb21wbGV0ZWAsIHRoZSBkZWZlcnJlZCBzZXJ2ZXIgcGx1Z2luXG4gICAqIGhhcyBjb25zdHJ1Y3RlZCBpdHMgRXhwcmVzcyBhcHAgYnV0IGhhcyBub3QgaW5qZWN0ZWQgcGx1Z2luIHJvdXRlcyBvciBzdGF0aWNcbiAgICogaGFuZGxpbmcsIHNvIGRpcmVjdCByZWdpc3RyYXRpb24gcHV0cyB0aGUgZ2F0ZSBmaXJzdC4gVGhlIGNvbnRleHQncyBidWZmZXJlZFxuICAgKiByb3V0ZSBBUEkgcmVtYWlucyBhIGZhbGxiYWNrIGZvciBjb21wYXRpYmxlIG5vbi1zdGFuZGFyZCBzZXJ2ZXIgcGx1Z2lucy5cbiAgICovXG4gIHByaXZhdGUgbW91bnRHYXRlUm91dGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICBsb2dnZXIud2FybihcIm5vIHBsdWdpbiBjb250ZXh0IC0gdGhlIGF1dGggZ2F0ZSBjYW5ub3QgbW91bnQgaXRzIHJvdXRlc1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbW91bnRHYXRlT25Db250ZXh0KGNvbnRleHQsIHtcbiAgICAgIGdhdGU6IHRoaXMuZXhwb3J0cygpLFxuICAgICAgcHVibGljRG9tYWluOiB0aGlzLnJlc29sdmVkLnB1YmxpY0RvbWFpbnMsXG4gICAgICBmb3J3YXJkSGVhZGVyczogdGhpcy5yZXNvbHZlZC5mb3J3YXJkSGVhZGVycyxcbiAgICAgIGdhdGVQYXRoczogdGhpcy5yZXNvbHZlZC5nYXRlUGF0aHMsXG4gICAgICBicmFuZE5hbWU6IHRoaXMucmVzb2x2ZWQuYnJhbmROYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBjb2RlIHNlbmRlcjogdGhlIGNvbmZpZ3VyZWQgYHNlbmRDb2RlYCwgZWxzZSB0aGUgc2hhcmVkLXRyYW5zcG9ydCBkZWZhdWx0LiAqL1xuICBwcml2YXRlIGdldCBzZW5kQ29kZSgpOiBOb25OdWxsYWJsZTxBdXRoR2F0ZUNvbmZpZ1tcInNlbmRDb2RlXCJdPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnNlbmRDb2RlID8/IGRlZmF1bHRTZW5kQ29kZTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0aG9yaXplSWRlbnRpdHkoZW1haWw6IHN0cmluZyk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5jb25maWcuYXV0aG9yaXplSWRlbnRpdHkpIHJldHVybiB0aGlzLmNvbmZpZy5hdXRob3JpemVJZGVudGl0eShlbWFpbCk7XG4gICAgcmV0dXJuIGxvb2tzTGlrZUVtYWlsKGVtYWlsKSAmJiBtYXRjaGVzQWxsb3dsaXN0KGVtYWlsLCB0aGlzLnJlc29sdmVkLmFsbG93KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKTogQXV0aEdhdGVBcGkge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhc3NrZXlzRW5hYmxlZDogcnVudGltZT8ucGFzc2tleXNFbmFibGVkID8/IGZhbHNlLFxuICAgICAgaGFuZGxlcjogKHJlcXVlc3QpID0+XG4gICAgICAgIHJ1bnRpbWU/LmhhbmRsZXIocmVxdWVzdCkgPz8gUHJvbWlzZS5yZXNvbHZlKG5ldyBSZXNwb25zZShcIk5vdCBGb3VuZFwiLCB7IHN0YXR1czogNDA0IH0pKSxcbiAgICAgIHNlc3Npb246IChoZWFkZXJzKSA9PiBydW50aW1lPy5zZXNzaW9uKGhlYWRlcnMpID8/IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpLFxuICAgICAgc3RhdHVzOiAoaGVhZGVycykgPT5cbiAgICAgICAgcnVudGltZT8uc3RhdHVzKGhlYWRlcnMpID8/XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh7IGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBlbmFibGVkOiBmYWxzZSwgcGFzc2tleXNFbmFibGVkOiBmYWxzZSB9KSxcbiAgICAgIGNsb3NlOiAoKSA9PiBydW50aW1lPy5jbG9zZSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gYXV0aE9yaWdpbihwdWJsaWNEb21haW4/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9IHN0cmluZy50cmltVG9OdWxsKHB1YmxpY0RvbWFpbik7XG4gIGlmICghdmFsdWUpIHJldHVybiBcImh0dHA6Ly9sb2NhbGhvc3RcIjtcbiAgaWYgKC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QodmFsdWUpKSByZXR1cm4gbmV3IFVSTCh2YWx1ZSkub3JpZ2luO1xuICBjb25zdCBob3N0ID0gdmFsdWUuc3BsaXQoXCIvXCIpWzBdITtcbiAgY29uc3QgbG9jYWwgPSBob3N0ID09PSBcImxvY2FsaG9zdFwiIHx8IGhvc3Quc3RhcnRzV2l0aChcImxvY2FsaG9zdDpcIik7XG4gIHJldHVybiBgJHtsb2NhbCA/IFwiaHR0cFwiIDogXCJodHRwc1wifTovLyR7aG9zdH1gO1xufVxuXG4vKiogRmFjdG9yeTogYGF1dGhHYXRlKHsgYWxsb3csIHN1YmplY3QsIC4uLiB9KWAgZm9yIGFuIEFwcEtpdCBgcGx1Z2luc2AgYXJyYXkuICovXG5leHBvcnQgY29uc3QgYXV0aEdhdGUgPSB0b1BsdWdpbihBdXRoR2F0ZVBsdWdpbik7XG4iXX0=
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEVBSVIsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sSUFBSSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSyxJQUFJLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxJQUFJLElBQUksZ0JBQWdCLEVBQ3hCLE9BQU8sSUFBSSxXQUFXLEdBS3ZCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLE1BQU0sSUFBSSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFvQixNQUFNLFdBQVcsQ0FBQztBQUN4RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxJQUFJLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckYsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQWN6QyxTQUFTLGlCQUFpQixDQUFDLE9BQXlCO0lBQ2xELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxH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RSxDQUFDO0FBQ2pELENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYGF1dGhHYXRlKClgIC0gdGhlIEFwcEtpdCBhZGFwdGVyIGFyb3VuZCBgQGRieC10b29scy9hdXRoYC5cbiAqXG4gKiBJdCBoYXMgTk8gcm91dGVzIG9mIGl0cyBvd246IHRoZSB0dW5uZWwgUFJPWFkgKG5vdCBhbiBIVFRQIHNlcnZlcikgY2FsbHMgdGhlXG4gKiBoYW5kbGVycyB0aGlzIHBsdWdpbiBleHBvc2VzIHZpYSB7QGxpbmsgQXV0aEdhdGVQbHVnaW4uZXhwb3J0c30uIFRoZSBwbHVnaW5cbiAqIG93bnMgdHVubmVsIGF1dGhvcml6YXRpb24sIEFwcEtpdCBMYWtlYmFzZSBkaXNjb3ZlcnksIGVtYWlsIGRlbGl2ZXJ5LCBhbmRcbiAqIHRyYW5zcG9ydCBtb3VudGluZy4gQmV0dGVyIEF1dGggb3ducyB1c2VycywgT1RQcywgc2Vzc2lvbnMsIHJhdGUgbGltaXRzLCBhbmRcbiAqIHBhc3NrZXlzLiBgY3JlYXRlQXBwYCBjYW4gcnVuIHRoaXMgcGx1Z2luIHdpdGggb3Igd2l0aG91dCBgc2VydmVyKClgLlxuICpcbiAqIE9wdGlvbnMgY29tZSBmcm9tIENMSSBmbGFncyBPUiBlbnYsIHdpdGggc2Vuc2libGUgZGVmYXVsdHMgLSBzZWVcbiAqIHtAbGluayByZXNvbHZlQXV0aEdhdGVDb25maWd9LiBUaGUgb25lIHJ1bnRpbWUgZGVwZW5kZW5jeSB0aGUgcGx1Z2luIGNhbid0XG4gKiByZXNvbHZlIGl0c2VsZiBpcyBIT1cgdG8gZW1haWwgdGhlIGNvZGUsIHNvIGl0IHRha2VzIGEgYHNlbmRDb2RlYCBjYWxsYmFjayB0aGVcbiAqIGFwcCB3aXJlcyB0byB0aGUgZW1haWwgcGx1Z2luLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBsYWtlYmFzZSxcbiAgUGx1Z2luLFxuICB0b1BsdWdpbixcbiAgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG4gIFJlc291cmNlVHlwZSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcGx1Z2luIGFzIGFwcGtpdFBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYnJhbmQgYXMgYXBwa2l0QnJhbmQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGF1dGggYXMgcGFzc3dvcmRsZXNzQXV0aCxcbiAgc3RvcmFnZSBhcyBhdXRoU3RvcmFnZSxcbiAgdHlwZSBBdXRob3JpemVJZGVudGl0eSxcbiAgdHlwZSBBdXRoU3RvcmFnZUNvbmZpZyxcbiAgdHlwZSBBdXRoU3RvcmFnZU1vZGUsXG4gIHR5cGUgUGFzc3dvcmRsZXNzQXV0aFJ1bnRpbWUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL2F1dGhcIjtcbmltcG9ydCB7IGNvbmZpZyBhcyBjb3JlQ29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBdXRoU3RhdHVzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWF1dGhcIjtcbmltcG9ydCB7IGJyYW5kLCBsb2csIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RIYW5kbGVyIH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB7IFRVTk5FTF9DT05GSUcgfSBmcm9tIFwiLi9fY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBsb29rc0xpa2VFbWFpbCwgbWF0Y2hlc0FsbG93bGlzdCB9IGZyb20gXCIuL2FsbG93bGlzdC50c1wiO1xuaW1wb3J0IHsgbW91bnRHYXRlLCB0eXBlIEdhdGVPcHRpb25zIH0gZnJvbSBcIi4vZ2F0ZS50c1wiO1xuaW1wb3J0IHsgZW5zdXJlRW1haWxBdmFpbGFibGUsIHNlbmRDb2RlIGFzIGRlZmF1bHRTZW5kQ29kZSB9IGZyb20gXCIuL3NlbmQtY29kZS50c1wiO1xuaW1wb3J0IHsgS0VZX1RUTF9TRUNPTkRTLCByZXNvbHZlU2Vzc2lvbkN1dG9mZiwgc2lnbmluZ0tleSB9IGZyb20gXCIuL3NpZ25pbmcta2V5LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWw6YXV0aFwiKTtcblxuaW50ZXJmYWNlIEdhdGVTZXJ2ZXJBcHBsaWNhdGlvbiB7XG4gIGdldChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKTogdW5rbm93bjtcbiAgcG9zdChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKTogdW5rbm93bjtcbiAgdXNlKHBhdGg6IHN0cmluZywgaGFuZGxlcjogUmVxdWVzdEhhbmRsZXIpOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgR2F0ZU1vdW50Q29udGV4dCB7XG4gIGFkZFJvdXRlKG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKTogdm9pZDtcbiAgYWRkTWlkZGxld2FyZShwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKTogdm9pZDtcbiAgZ2V0UGx1Z2lucygpOiBSZWFkb25seU1hcDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5mdW5jdGlvbiBzZXJ2ZXJBcHBsaWNhdGlvbihjb250ZXh0OiBHYXRlTW91bnRDb250ZXh0KTogR2F0ZVNlcnZlckFwcGxpY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VydmVyID0gY29udGV4dC5nZXRQbHVnaW5zKCkuZ2V0KFwic2VydmVyXCIpIGFzXG4gICAgeyBzZXJ2ZXJBcHBsaWNhdGlvbj86IFBhcnRpYWw8R2F0ZVNlcnZlckFwcGxpY2F0aW9uPiB9IHwgdW5kZWZpbmVkO1xuICBjb25zdCBhcHBsaWNhdGlvbiA9IHNlcnZlcj8uc2VydmVyQXBwbGljYXRpb247XG4gIHJldHVybiBhcHBsaWNhdGlvbiAmJlxuICAgIHR5cGVvZiBhcHBsaWNhdGlvbi5nZXQgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiBhcHBsaWNhdGlvbi5wb3N0ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgYXBwbGljYXRpb24udXNlID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IChhcHBsaWNhdGlvbiBhcyBHYXRlU2VydmVyQXBwbGljYXRpb24pXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb3VudEdhdGVPbkNvbnRleHQoY29udGV4dDogR2F0ZU1vdW50Q29udGV4dCwgb3B0aW9uczogR2F0ZU9wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3QgYXBwbGljYXRpb24gPSBzZXJ2ZXJBcHBsaWNhdGlvbihjb250ZXh0KTtcbiAgaWYgKGFwcGxpY2F0aW9uKSB7XG4gICAgbW91bnRHYXRlKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIChtZXRob2QsIHBhdGgsIGhhbmRsZXIpID0+IGFwcGxpY2F0aW9uW21ldGhvZF0ocGF0aCwgaGFuZGxlciksXG4gICAgICAocGF0aCwgaGFuZGxlcikgPT4gYXBwbGljYXRpb24udXNlKHBhdGgsIGhhbmRsZXIpLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIG1vdW50R2F0ZShcbiAgICBvcHRpb25zLFxuICAgIChtZXRob2QsIHBhdGgsIGhhbmRsZXIpID0+IGNvbnRleHQuYWRkUm91dGUobWV0aG9kLCBwYXRoLCBoYW5kbGVyKSxcbiAgICAocGF0aCwgaGFuZGxlcikgPT4gY29udGV4dC5hZGRNaWRkbGV3YXJlKHBhdGgsIGhhbmRsZXIpLFxuICApO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgdGhlIHtAbGluayBhdXRoR2F0ZX0gcGx1Z2luIChhbGwgcmVzb2x2YWJsZSBmcm9tIGVudiAtIHNlZSBiZWxvdykuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHYXRlQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZywgQXV0aFN0b3JhZ2VDb25maWcge1xuICAvKiogQWxsb3ctbGlzdCBwYXR0ZXJucyAoZG9tYWluIC8gZ2xvYiAvIGAvcmVnZXgvYCkuIEVtcHR5ID0gYWxsb3cgbm9ib2R5LiBFbnYgVFVOTkVMX0FVVEhfQUxMT1cuICovXG4gIGFsbG93Pzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBTdWJqZWN0IGxpbmUgZm9yIHRoZSBjb2RlIGVtYWlsLiBFbnYgVFVOTkVMX0FVVEhfU1VCSkVDVC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlXCIuIFRoZSB3b3JkaW5nIG9mIHRoZSBzdWJqZWN0IGFuZFxuICAgKiB7QGxpbmsgbWVzc2FnZX0gaXMgZGVsaWJlcmF0ZWx5IHRoZSBjb252ZW50aW9uYWwgcGhyYXNpbmcgcmF0aGVyIHRoYW5cbiAgICogYW55dGhpbmcgYnJhbmRlZDogaU9TLCBHbWFpbCwgT3V0bG9vaywgYW5kIEFuZHJvaWQgYWxsIGRldGVjdCBhIG9uZS10aW1lXG4gICAqIGNvZGUgZnJvbSB0aGlzIHNoYXBlIGFuZCBvZmZlciB0byBhdXRvZmlsbCBpdCwgYW5kIGEgbm92ZWwgcGhyYXNpbmcgaXMgd2hhdFxuICAgKiBicmVha3MgdGhhdCBkZXRlY3Rpb24uXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHN1YmplY3QgVEVNUExBVEUsIG5vdCB0aGUgbGl0ZXJhbCBsaW5lIHNlbnQ6IHRoZSBjb2RlIGlzIHNwbGljZWRcbiAgICogaW50byBpdCAoYFwiMTIzNDU2IGlzIHlvdXIgdmVyaWZpY2F0aW9uIGNvZGVcImApIGJlY2F1c2UgYSBwdXNoIG5vdGlmaWNhdGlvblxuICAgKiBzaG93cyBvbmx5IHRoZSBzdWJqZWN0IGFuZCBwcmVoZWFkZXIsIGFuZCB0aGF0IG5vdGlmaWNhdGlvbiBpcyB3aGF0IG1vYmlsZVxuICAgKiBhdXRvZmlsbCByZWFkcy4gU2VlIGBjb2RlRW1haWxTdWJqZWN0YCBpbiBgLi9jb2RlLWVtYWlsLnRzYC5cbiAgICovXG4gIHN1YmplY3Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEaXNwbGF5IG5hbWUgdXNlZCBpbiB0aGUgY29kZSBlbWFpbCBjb3B5LiBFbnYgVFVOTkVMX0FVVEhfQlJBTkRfTkFNRS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGJyYW5kIGNvbnRleHQncyBgbmFtZWAgLSB0aGUgYXBwJ3Mgb3duIGBicmFuZGluZy9icmFuZC55YW1sYFxuICAgKiB3aGVuIGl0IGhhcyBvbmUsIGVsc2UgdGhlIGRieC10b29scyBkZWZhdWx0LiBTZXQgdGhpcyBvbmx5IHRvIG92ZXJyaWRlIHRoZVxuICAgKiBicmFuZCBmb3IgdGhpcyBnYXRlLlxuICAgKi9cbiAgYnJhbmROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogTGluZSBzaG93biBpbW1lZGlhdGVseSBhYm92ZSB0aGUgY29kZSBpbiB0aGUgZW1haWwuIEVudiBUVU5ORUxfQVVUSF9NRVNTQUdFLlxuICAgKlxuICAgKiBLZWVwIHRoZSBjb2RlIG9uIGl0cyBPV04gbGluZSBkaXJlY3RseSBhZnRlciB0aGlzIHRleHQgLSB0aGF0IGFkamFjZW5jeSBpc1xuICAgKiB3aGF0IHRoZSBwbGF0Zm9ybSBjb2RlLWRldGVjdGlvbiBoZXVyaXN0aWNzIGtleSBvbi5cbiAgICovXG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXNzaW9uIGxpZmV0aW1lIChzZWNvbmRzKS4gRW52IFRVTk5FTF9BVVRIX1NFU1NJT05fVFRMLiBEZWZhdWx0IDI1OTIwMDAgKDMwZCkuXG4gICAqXG4gICAqIE1hdGNoZWQgdG8gdGhlIGNhY2hlLWJhY2tlZCBzaWduaW5nIGtleSdzIG93biAzMC1kYXkgVFRMIChzZWVcbiAgICogYC4vc2lnbmluZy1rZXkudHNgKTogdGhlIGNvb2tpZSBhbmQgdGhlIGtleSB0aGF0IHZhbGlkYXRlcyBpdCBzaG91bGQgZXhwaXJlXG4gICAqIHRvZ2V0aGVyLCBvciBvbmUgc2lsZW50bHkgb3V0bGl2ZXMgdGhlIG90aGVyLlxuICAgKi9cbiAgc2Vzc2lvblR0bFNlY29uZHM/OiBudW1iZXI7XG4gIC8qKiBPbmUtdGltZS1jb2RlIGxpZmV0aW1lIChzZWNvbmRzKS4gRW52IFRVTk5FTF9BVVRIX0NPREVfVFRMLiBEZWZhdWx0IDYwMCAoMTBtKS4gKi9cbiAgY29kZVR0bFNlY29uZHM/OiBudW1iZXI7XG4gIC8qKiBNYXggdmVyaWZ5IGF0dGVtcHRzIHBlciBpc3N1ZWQgY29kZS4gRGVmYXVsdCA1LiAqL1xuICBtYXhBdHRlbXB0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEZvcmNlLWNsZWFyIGN1dG9mZjogZXZlcnkgc2Vzc2lvbiBpc3N1ZWQgQkVGT1JFIGl0IHN0b3BzIHZlcmlmeWluZywgc28gbW92aW5nXG4gICAqIGl0IGZvcndhcmQgc2lnbnMgZXZlcnlvbmUgb3V0LiBFbnYgVFVOTkVMX0FVVEhfU0VTU0lPTl9DVVRPRkYuXG4gICAqXG4gICAqIEFueXRoaW5nIGBvYmplY3QudG9EYXRlYCBhY2NlcHRzOiBhIGBEYXRlYCwgYDIwMjYtMDgtMDJgLCBhbiBJU08gaW5zdGFudCxcbiAgICogZXBvY2ggc2Vjb25kcy9taWxsaXMsIG9yIGEgcmVsYXRpdmUgZHVyYXRpb24gKGAtMzBkYCwgYDcgZGF5cyBhZ29gKS4gVW5zZXRcbiAgICogbWVhbnMgbm8gY3V0b2ZmLlxuICAgKi9cbiAgc2Vzc2lvbkN1dG9mZj86IHN0cmluZyB8IG51bWJlciB8IERhdGU7XG4gIC8qKlxuICAgKiBTYW1lLW9yaWdpbiBwYXRoIHJldHVybmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBsb2dvdXQuIEVudlxuICAgKiBgVFVOTkVMX0FVVEhfTE9HT1VUX1JFRElSRUNUYC4gRGVmYXVsdHMgdG8gYC9gLCB3aGVyZSB0aGUgQXV0aEdhdGUgcHJlc2VudHNcbiAgICogbG9naW4gYWdhaW4uXG4gICAqL1xuICBsb2dvdXRSZWRpcmVjdFBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZWxpdmVyIGEgY29kZSB0byBhbiBhZGRyZXNzLiBEZWZhdWx0cyB0byBzZW5kaW5nIHRocm91Z2ggdGhlIGhvc3QgYXBwJ3NcbiAgICogc2hhcmVkIGBAZGJ4LXRvb2xzL2VtYWlsYCB0cmFuc3BvcnQgKHNlZSBgLi9zZW5kLWNvZGVgKTsgb3ZlcnJpZGUgdG8gd2lyZSBhXG4gICAqIGRpZmZlcmVudCBkZWxpdmVyeSBwYXRoLlxuICAgKi9cbiAgc2VuZENvZGU/OiAoZW1haWw6IHN0cmluZywgY29kZTogc3RyaW5nLCBvcHRzOiBTZW5kQ29kZU9wdGlvbnMpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBJZGVudGl0eSBhdXRob3JpemF0aW9uIGluZGVwZW5kZW50IG9mIGF1dGhlbnRpY2F0aW9uLiBEZWZhdWx0cyB0byB0aGVcbiAgICogY29uZmlndXJlZCBhbGxvdy1saXN0IGFuZCBpcyByZS1ldmFsdWF0ZWQgZm9yIGV2ZXJ5IGFjY2VwdGVkIHNlc3Npb24uXG4gICAqL1xuICBhdXRob3JpemVJZGVudGl0eT86IEF1dGhvcml6ZUlkZW50aXR5O1xuICAvKipcbiAgICogVGhlIHB1YmxpYyBgPHN1YmRvbWFpbj4uPHNlcnZlcj5gIHRoYXQgaWRlbnRpZmllcyBwb3J0ciB0cmFmZmljIGJ5IGl0cyBgSG9zdGBcbiAgICogaGVhZGVyLiBPbmx5IHJlcXVlc3RzIHdob3NlIGBIb3N0YCBtYXRjaGVzIHRoaXMgYXJlIGdhdGVkOyBldmVyeXRoaW5nIGVsc2VcbiAgICogKHRoZSBwbGF0Zm9ybSBmcm9udCBkb29yLCBvdGhlciBsb2NhbCBjYWxsZXJzKSBwYXNzZXMgdGhyb3VnaC4gRW52XG4gICAqIGBUVU5ORUxfUFVCTElDX0RPTUFJTmAuIFdoZW4gYWJzZW50LCB0aGUgZ2F0ZSBpcyBpbmVydCAobm90aGluZyBpcyB0dW5uZWxcbiAgICogdHJhZmZpYykuXG4gICAqL1xuICBwdWJsaWNEb21haW4/OiBzdHJpbmc7XG4gIC8qKiBBZGRpdGlvbmFsIHB1YmxpYyB0dW5uZWwgZG9tYWlucyBhY2NlcHRlZCBieSB0aGUgZ2F0ZS4gKi9cbiAgcHVibGljRG9tYWlucz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipcbiAgICogRXh0cmEgYHgtYCByZXF1ZXN0IGhlYWRlcnMgdHVubmVsIHRyYWZmaWMgbWF5IGZvcndhcmQgKGxpdGVyYWwgLyBnbG9iIC9cbiAgICogYC9yZWdleC9gKSwgdW5pb25lZCB3aXRoIHRoZSBidWlsdC1pbiBhbGxvdy1saXN0LiBFbnYgYFRVTk5FTF9GT1JXQVJEX0hFQURFUlNgLlxuICAgKi9cbiAgZm9yd2FyZEhlYWRlcnM/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFBhdGggcHJlZml4ZXMgdG8gZ2F0ZSBiZXlvbmQgdGhlIGJ1aWx0LWluIGAvYXBpL2AgKGxpdGVyYWwgcHJlZml4ZXMsIGNvbW1hLVxuICAgKiBvciBzcGFjZS1zZXBhcmF0ZWQgYXMgYSBzdHJpbmcpLiBGb3IgYW4gYXBwIHdob3NlIHByaXZpbGVnZWQgc3VyZmFjZSBpcyBub3RcbiAgICogdW5kZXIgYC9hcGkvYCDigJQgZS5nLiBhIFdlYlNvY2tldCBhdCBgL3dzYCDigJQgbGlzdCB0aG9zZSBwcmVmaXhlcyBzbyB0aGV5XG4gICAqIHJlcXVpcmUgYSBzZXNzaW9uIHRvby4gRW52IGBUVU5ORUxfR0FURV9QQVRIU2AuXG4gICAqL1xuICBnYXRlUGF0aHM/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFJ1biBPUEVOIHdpdGggbm8gZ2F0ZSAoZW52IGBUVU5ORUxfSU5TRUNVUkU9dHJ1ZWApLiBUaGUgbG9naW4gcm91dGVzIGFuZCBnYXRlXG4gICAqIG1pZGRsZXdhcmUgYXJlIG5vdCBtb3VudGVkLCBhbmQgdGhlIFNNVFAgZmFpbC1mYXN0IGlzIHNraXBwZWQuIFVzZSBvbmx5IHdoZW5cbiAgICogdGhlIHR1bm5lbCBpcyBkZWxpYmVyYXRlbHkgcHVibGljLlxuICAgKi9cbiAgaW5zZWN1cmU/OiBib29sZWFuO1xufVxuXG4vKiogQnJhbmRpbmcvbWVzc2FnaW5nIHBhc3NlZCB0byB7QGxpbmsgQXV0aEdhdGVDb25maWcuc2VuZENvZGV9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZW5kQ29kZU9wdGlvbnMge1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJyYW5kTmFtZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMaWZldGltZSBvZiB0aGUgY29kZSBiZWluZyBzZW50LCBpbiBzZWNvbmRzIC0gdGhlIFJFU09MVkVEXG4gICAqIHtAbGluayBBdXRoR2F0ZUNvbmZpZy5jb2RlVHRsU2Vjb25kc30sIHNvIHRoZSBlbWFpbCBjYW4gc3RhdGUgdGhlIHJlYWxcbiAgICogZXhwaXJ5IChcIlRoaXMgY29kZSBleHBpcmVzIGluIDEwIG1pbnV0ZXNcIikgaW5zdGVhZCBvZiBhIHZhZ3VlIFwic2hvcnRseVwiXG4gICAqIHRoYXQgZHJpZnRzIGZyb20gdGhlIGNvbmZpZ3VyZWQgVFRMLlxuICAgKi9cbiAgY29kZVR0bFNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqIFJlc29sdmVkIGdhdGUgY29uZmlnIHdpdGggZW52IGZhbGxiYWNrcyArIGRlZmF1bHRzIGFwcGxpZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQXV0aEdhdGVDb25maWcge1xuICBhbGxvdzogc3RyaW5nW107XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYnJhbmROYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc2Vzc2lvblR0bFNlY29uZHM6IG51bWJlcjtcbiAgY29kZVR0bFNlY29uZHM6IG51bWJlcjtcbiAgbWF4QXR0ZW1wdHM6IG51bWJlcjtcbiAgLyoqIEZvcmNlLWNsZWFyIGN1dG9mZiBpbiBlcG9jaCBtczsgYDBgIHdoZW4gdW5zZXQuICovXG4gIHNlc3Npb25DdXRvZmZNczogbnVtYmVyO1xuICAvKiogU2FtZS1vcmlnaW4gcGF0aCByZXR1cm5lZCBhZnRlciBsb2dvdXQuICovXG4gIGxvZ291dFJlZGlyZWN0UGF0aDogc3RyaW5nO1xuICAvKiogUHJpbWFyeSBwdWJsaWMgZG9tYWluOyBgdW5kZWZpbmVkYCB3aGVuIFBvcnRyIGlzIG5vdCBjb25maWd1cmVkLiAqL1xuICBwdWJsaWNEb21haW4/OiBzdHJpbmc7XG4gIC8qKiBBbGwgcHVibGljIHR1bm5lbCBkb21haW5zIGFjY2VwdGVkIGJ5IHRoZSBnYXRlLiAqL1xuICBwdWJsaWNEb21haW5zOiBzdHJpbmdbXTtcbiAgLyoqIEV4dHJhIGB4LWAgaGVhZGVycyB0dW5uZWwgdHJhZmZpYyBtYXkgZm9yd2FyZCAodW5pb25lZCB3aXRoIHRoZSBkZWZhdWx0cykuICovXG4gIGZvcndhcmRIZWFkZXJzOiBzdHJpbmdbXTtcbiAgLyoqIFBhdGggcHJlZml4ZXMgdG8gZ2F0ZSBiZXlvbmQgYC9hcGkvYCAoZS5nLiBgL3dzYCkuICovXG4gIGdhdGVQYXRoczogc3RyaW5nW107XG4gIC8qKiBSdW4gT1BFTiB3aXRoIG5vIGdhdGUuICovXG4gIGluc2VjdXJlOiBib29sZWFuO1xuICBzdG9yYWdlOiBBdXRoU3RvcmFnZU1vZGU7XG4gIHNxbGl0ZVBhdGg/OiBzdHJpbmc7XG59XG5cbmNvbnN0IERFRkFVTFRTID0ge1xuICBzdWJqZWN0OiBcIllvdXIgdmVyaWZpY2F0aW9uIGNvZGVcIixcbiAgLy8gVGhlIHJlcG8td2lkZSBicmFuZCBjb250ZXh0J3MgZGlzcGxheSBuYW1lLCBOT1QgYSBoYXJkY29kZWQgcHJvZHVjdCBzdHJpbmc6XG4gIC8vIHRoaXMgbmFtZSBpcyB3aGF0IHRoZSByZWNpcGllbnQgcmVhZHMgaW4gdGhlIGNvZGUgZW1haWwsIHNvIGl0IGhhcyB0byBiZSB0aGVcbiAgLy8gc2FtZSBpZGVudGl0eSB0aGUgcmVzdCBvZiB0aGUgYXBwIHByZXNlbnRzLiBBIGhvc3Qgd2l0aCBpdHMgb3duXG4gIC8vIGBicmFuZGluZy9icmFuZC55YW1sYCBvdmVycmlkZXMgaXQgYnkgcGFzc2luZyBgYnJhbmROYW1lYDsgdGhlIHNoYXJlZCBkZWZhdWx0XG4gIC8vIGlzIHRoZSBmYWxsYmFjayB3aGVuIG5vdGhpbmcgaXMgY29uZmlndXJlZC5cbiAgYnJhbmROYW1lOiBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0Lm5hbWUsXG4gIG1lc3NhZ2U6IFwiWW91ciB2ZXJpZmljYXRpb24gY29kZSBpczpcIixcbiAgLy8gMzAgZGF5cywgdGhlIHNhbWUgd2luZG93IHRoZSBjYWNoZS1iYWNrZWQgc2lnbmluZyBrZXkgaXMgc3RvcmVkIGZvci5cbiAgc2Vzc2lvblR0bFNlY29uZHM6IEtFWV9UVExfU0VDT05EUyxcbiAgY29kZVR0bFNlY29uZHM6IDYwMCxcbiAgbWF4QXR0ZW1wdHM6IDUsXG4gIGxvZ291dFJlZGlyZWN0UGF0aDogXCIvXCIsXG59O1xuXG4vKiogTWVyZ2Uge0BsaW5rIEF1dGhHYXRlQ29uZmlnfSBvdmVyIGVudiBvdmVyIGRlZmF1bHRzIGludG8gYSByZXNvbHZlZCBjb25maWcuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF1dGhHYXRlQ29uZmlnKGNvbmZpZzogQXV0aEdhdGVDb25maWcpOiBSZXNvbHZlZEF1dGhHYXRlQ29uZmlnIHtcbiAgY29uc3Qgc3RvcmFnZSA9IGF1dGhTdG9yYWdlLnJlc29sdmVBdXRoU3RvcmFnZUNvbmZpZyh7XG4gICAgc3RvcmFnZTpcbiAgICAgIGNvbmZpZy5zdG9yYWdlID8/XG4gICAgICAoY29yZUNvbmZpZy50ZXh0KFwiQVVUSF9TVE9SQUdFXCIsIFRVTk5FTF9DT05GSUcpIGFzIEF1dGhTdG9yYWdlTW9kZSB8IHVuZGVmaW5lZCksXG4gICAgc3FsaXRlUGF0aDogY29uZmlnLnNxbGl0ZVBhdGggPz8gY29yZUNvbmZpZy50ZXh0KFwiQVVUSF9TUUxJVEVfUEFUSFwiLCBUVU5ORUxfQ09ORklHKSxcbiAgfSk7XG4gIGNvbnN0IHB1YmxpY0RvbWFpbiA9IGNvcmVDb25maWcuc3RyaW5nKGNvbmZpZy5wdWJsaWNEb21haW4sIFwiUFVCTElDX0RPTUFJTlwiLCBUVU5ORUxfQ09ORklHKTtcbiAgY29uc3QgZnJwUHVibGljRG9tYWluID0gY29yZUNvbmZpZy50ZXh0KFwiRlJQX1BVQkxJQ19ET01BSU5cIiwgVFVOTkVMX0NPTkZJRyk7XG4gIHJldHVybiB7XG4gICAgLy8gQm90aCBzb3VyY2VzIGFyZSB1bmlvbmVkIHJhdGhlciB0aGFuIG9uZSBvdmVycmlkaW5nOiBhIGRlcGxveW1lbnQtd2lkZVxuICAgIC8vIFRVTk5FTF9BVVRIX0FMTE9XIGFuZCBhIHBlci1pbnZvY2F0aW9uIGAtLWFsbG93YCBzaG91bGQgYm90aCBncmFudCBhY2Nlc3MuXG4gICAgLy8gSGVuY2UgYHBhcnNlTGlzdGAgb24gZWFjaCByYXRoZXIgdGhhbiBgY29uZmlnLmxpc3RgLCB3aGljaCBzdG9wcyBhdCB0aGVcbiAgICAvLyBmaXJzdCBzb3VyY2UgdGhhdCB5aWVsZHMgYW55dGhpbmcuXG4gICAgYWxsb3c6IFtcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29uZmlnLmFsbG93KSxcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29yZUNvbmZpZy50ZXh0KFtcIkFVVEhfQUxMT1dcIiwgXCJFTUFJTF9BVVRIX0FMTE9XXCJdLCBUVU5ORUxfQ09ORklHKSksXG4gICAgXSxcbiAgICBzdWJqZWN0OiBjb3JlQ29uZmlnLnN0cmluZyhjb25maWcuc3ViamVjdCwgXCJBVVRIX1NVQkpFQ1RcIiwgVFVOTkVMX0NPTkZJRykgPz8gREVGQVVMVFMuc3ViamVjdCxcbiAgICBicmFuZE5hbWU6XG4gICAgICBjb3JlQ29uZmlnLnN0cmluZyhjb25maWcuYnJhbmROYW1lLCBcIkFVVEhfQlJBTkRfTkFNRVwiLCBUVU5ORUxfQ09ORklHKSA/PyBERUZBVUxUUy5icmFuZE5hbWUsXG4gICAgbWVzc2FnZTogY29yZUNvbmZpZy5zdHJpbmcoY29uZmlnLm1lc3NhZ2UsIFwiQVVUSF9NRVNTQUdFXCIsIFRVTk5FTF9DT05GSUcpID8/IERFRkFVTFRTLm1lc3NhZ2UsXG4gICAgc2Vzc2lvblR0bFNlY29uZHM6IGNvcmVDb25maWcucG9zaXRpdmVJbnQoXG4gICAgICBjb25maWcuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICBcIkFVVEhfU0VTU0lPTl9UVExcIixcbiAgICAgIERFRkFVTFRTLnNlc3Npb25UdGxTZWNvbmRzLFxuICAgICAgVFVOTkVMX0NPTkZJRyxcbiAgICApLFxuICAgIGNvZGVUdGxTZWNvbmRzOiBjb3JlQ29uZmlnLnBvc2l0aXZlSW50KFxuICAgICAgY29uZmlnLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgXCJBVVRIX0NPREVfVFRMXCIsXG4gICAgICBERUZBVUxUUy5jb2RlVHRsU2Vjb25kcyxcbiAgICAgIFRVTk5FTF9DT05GSUcsXG4gICAgKSxcbiAgICBtYXhBdHRlbXB0czogY29uZmlnLm1heEF0dGVtcHRzID8/IERFRkFVTFRTLm1heEF0dGVtcHRzLFxuICAgIHNlc3Npb25DdXRvZmZNczogcmVzb2x2ZVNlc3Npb25DdXRvZmYoY29uZmlnLnNlc3Npb25DdXRvZmYpLFxuICAgIGxvZ291dFJlZGlyZWN0UGF0aDogcGFzc3dvcmRsZXNzQXV0aC5ub3JtYWxpemVMb2dvdXRSZWRpcmVjdFBhdGgoXG4gICAgICBjb3JlQ29uZmlnLnN0cmluZyhjb25maWcubG9nb3V0UmVkaXJlY3RQYXRoLCBcIkFVVEhfTE9HT1VUX1JFRElSRUNUXCIsIFRVTk5FTF9DT05GSUcpID8/XG4gICAgICAgIERFRkFVTFRTLmxvZ291dFJlZGlyZWN0UGF0aCxcbiAgICApLFxuICAgIHB1YmxpY0RvbWFpbixcbiAgICBwdWJsaWNEb21haW5zOiBbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICBbXG4gICAgICAgICAgcHVibGljRG9tYWluLFxuICAgICAgICAgIGZycFB1YmxpY0RvbWFpbixcbiAgICAgICAgICAuLi5zdHJpbmcucGFyc2VMaXN0KGNvbmZpZy5wdWJsaWNEb21haW5zKSxcbiAgICAgICAgXS5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+ICEhdmFsdWUpLFxuICAgICAgKSxcbiAgICBdLFxuICAgIGZvcndhcmRIZWFkZXJzOiBbXG4gICAgICAuLi5zdHJpbmcucGFyc2VMaXN0KGNvbmZpZy5mb3J3YXJkSGVhZGVycyksXG4gICAgICAuLi5zdHJpbmcucGFyc2VMaXN0KGNvcmVDb25maWcudGV4dChcIkZPUldBUkRfSEVBREVSU1wiLCBUVU5ORUxfQ09ORklHKSksXG4gICAgXSxcbiAgICBnYXRlUGF0aHM6IFtcbiAgICAgIC4uLnN0cmluZy5wYXJzZUxpc3QoY29uZmlnLmdhdGVQYXRocyksXG4gICAgICAuLi5zdHJpbmcucGFyc2VMaXN0KGNvcmVDb25maWcudGV4dChcIkdBVEVfUEFUSFNcIiwgVFVOTkVMX0NPTkZJRykpLFxuICAgIF0sXG4gICAgaW5zZWN1cmU6IGNvcmVDb25maWcuYm9vbGVhbihjb25maWcuaW5zZWN1cmUsIFwiSU5TRUNVUkVcIiwgVFVOTkVMX0NPTkZJRykgPz8gZmFsc2UsXG4gICAgc3RvcmFnZTogc3RvcmFnZS5tb2RlLFxuICAgIHNxbGl0ZVBhdGg6IHN0b3JhZ2Uuc3FsaXRlUGF0aCxcbiAgfTtcbn1cblxuLyoqIFRoZSBoYW5kbGVycyB0aGUgZ2F0ZSBtaWRkbGV3YXJlIGNhbGxzIGluLXByb2Nlc3MgKHJldHVybmVkIGJ5IHtAbGluayBBdXRoR2F0ZVBsdWdpbi5leHBvcnRzfSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHYXRlQXBpIHtcbiAgLyoqIEJldHRlciBBdXRoIGFuZCBjb21wYXRpYmlsaXR5IHJvdXRlcyB1bmRlciBgL2FwaS9lbWFpbC9hdXRoLypgLiAqL1xuICBoYW5kbGVyKHJlcXVlc3Q6IFJlcXVlc3QpOiBQcm9taXNlPFJlc3BvbnNlPjtcbiAgLyoqIFJlc29sdmUgdGhlIGF1dGhvcml6ZWQgZW1haWwgZm9yIHJlcXVlc3QgaGVhZGVycywgb3IgdW5kZWZpbmVkLiAqL1xuICBzZXNzaW9uKGhlYWRlcnM6IEhlYWRlcnMpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIC8qKiBUaGUgZ2F0ZSBzdGF0dXMgcGF5bG9hZC4gKi9cbiAgc3RhdHVzKGhlYWRlcnM6IEhlYWRlcnMpOiBQcm9taXNlPEF1dGhTdGF0dXM+O1xuICAvKiogV2hldGhlciB0aGUgcnVudGltZSBleHBvc2VzIHBhc3NrZXkgZW5yb2xsbWVudCBhbmQgYXV0aGVudGljYXRpb24uICovXG4gIHJlYWRvbmx5IHBhc3NrZXlzRW5hYmxlZDogYm9vbGVhbjtcbiAgLyoqIENsb3NlIGF1dGggc3RvcmFnZSBvd25lZCBieSB0aGlzIHJ1bnRpbWUuICovXG4gIGNsb3NlKCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQXBwS2l0IHBsdWdpbiBhZGFwdGluZyBgQGRieC10b29scy9hdXRoYCB0byB0dW5uZWwgdHJhZmZpYy4gT24gYHNldHVwKClgIGl0IHJlZ2lzdGVycyB0aGUgbG9naW5cbiAqIHJvdXRlcyAoYC9hcGkvZW1haWwvYXV0aC8qYCkgYW5kIGEgZ2F0aW5nIG1pZGRsZXdhcmUgb24gdGhlIGFwcCdzIE9XTiBFeHByZXNzXG4gKiBzZXJ2ZXIgdmlhIGB0aGlzLmNvbnRleHRgLCBzbyBhIHB1YmxpYyBwb3J0ciBjYWxsZXIgbXVzdCBwcm92ZSBhbiBlbWFpbCBiZWZvcmVcbiAqIHJlYWNoaW5nIHRoZSBhcHAncyBgL2FwaS8qYCAtIHNlZSBgLi9nYXRlYC4gRnJvbnQtZG9vciAocGxhdGZvcm0pIHRyYWZmaWMgYW5kXG4gKiBvdGhlciBsb2NhbCBjYWxsZXJzIHBhc3MgdGhyb3VnaCB1bnRvdWNoZWQgKHRoZSBnYXRlIGtleXMgb24gdGhlIGBIb3N0YCBoZWFkZXIpLlxuICovXG5leHBvcnQgY2xhc3MgQXV0aEdhdGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW48QXV0aEdhdGVDb25maWc+IHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwiYXV0aEdhdGVcIixcbiAgICBkaXNwbGF5TmFtZTogXCJBdXRoIEdhdGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCZXR0ZXIgQXV0aCBlbWFpbCBPVFAgYW5kIHBhc3NrZXkgYWNjZXNzIGdhdGUgZm9yIGEgcHVibGljIHR1bm5lbC5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczoge1xuICAgICAgcmVxdWlyZWQ6IFtdLFxuICAgICAgb3B0aW9uYWw6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFJlc291cmNlVHlwZS5QT1NUR1JFUyxcbiAgICAgICAgICBhbGlhczogXCJhdXRoXCIsXG4gICAgICAgICAgcmVzb3VyY2VLZXk6IFwiYXV0aC1kYXRhYmFzZVwiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkR1cmFibGUgdXNlcnMsIHNlc3Npb25zLCBPVFAgcmVjb3JkcywgYW5kIHBhc3NrZXlzLlwiLFxuICAgICAgICAgIHBlcm1pc3Npb246IFwiQ0FOX0NPTk5FQ1RfQU5EX0NSRUFURVwiLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgaW5zdGFuY2VfbmFtZTogeyBlbnY6IFwiTEFLRUJBU0VfSU5TVEFOQ0VfTkFNRVwiIH0sXG4gICAgICAgICAgICBkYXRhYmFzZV9uYW1lOiB7IGVudjogXCJQR0RBVEFCQVNFXCIgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcImF1dGhHYXRlXCI+O1xuXG4gIHByaXZhdGUgcmVzb2x2ZWQhOiBSZXNvbHZlZEF1dGhHYXRlQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWVzID0gbmV3IE1hcDxzdHJpbmcsIFBhc3N3b3JkbGVzc0F1dGhSdW50aW1lPigpO1xuXG4gIHN0YXRpYyBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cyhjb25maWc6IEF1dGhHYXRlQ29uZmlnKTogUmVzb3VyY2VSZXF1aXJlbWVudFtdIHtcbiAgICBpZiAoYXV0aFN0b3JhZ2UucmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKGNvbmZpZykubW9kZSAhPT0gXCJsYWtlYmFzZVwiKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogUmVzb3VyY2VUeXBlLlBPU1RHUkVTLFxuICAgICAgICBhbGlhczogXCJhdXRoXCIsXG4gICAgICAgIHJlc291cmNlS2V5OiBcImF1dGgtZGF0YWJhc2VcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiRHVyYWJsZSB1c2Vycywgc2Vzc2lvbnMsIE9UUCByZWNvcmRzLCBhbmQgcGFzc2tleXMuXCIsXG4gICAgICAgIHBlcm1pc3Npb246IFwiQ0FOX0NPTk5FQ1RfQU5EX0NSRUFURVwiLFxuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBpbnN0YW5jZV9uYW1lOiB7IGVudjogXCJMQUtFQkFTRV9JTlNUQU5DRV9OQU1FXCIgfSxcbiAgICAgICAgICBkYXRhYmFzZV9uYW1lOiB7IGVudjogXCJQR0RBVEFCQVNFXCIgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlc29sdmVkID0gcmVzb2x2ZUF1dGhHYXRlQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmJyYW5kTmFtZSAmJiAhY29yZUNvbmZpZy50ZXh0KFwiQVVUSF9CUkFORF9OQU1FXCIsIFRVTk5FTF9DT05GSUcpKSB7XG4gICAgICB0aGlzLnJlc29sdmVkLmJyYW5kTmFtZSA9IGFwcGtpdEJyYW5kLmdldEJyYW5kQ29udGV4dCgpLm5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzb2x2ZWQuaW5zZWN1cmUpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiaW5zZWN1cmUgbW9kZSAtIHRoZSB0dW5uZWwgcnVucyBPUEVOIHdpdGggbm8gYXV0aCBnYXRlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsYWtlYmFzZVBsdWdpbiA9IGFwcGtpdFBsdWdpbi5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKTtcbiAgICAgIGNvbnN0IHsga2V5IH0gPSBhd2FpdCBzaWduaW5nS2V5KHRoaXMucmVzb2x2ZWQuc2Vzc2lvbkN1dG9mZk1zKTtcbiAgICAgIGNvbnN0IG9yaWdpbnMgPSB0aGlzLnJlc29sdmVkLnB1YmxpY0RvbWFpbnMubGVuZ3RoXG4gICAgICAgID8gdGhpcy5yZXNvbHZlZC5wdWJsaWNEb21haW5zLm1hcChhdXRoT3JpZ2luKVxuICAgICAgICA6IFthdXRoT3JpZ2luKHRoaXMucmVzb2x2ZWQucHVibGljRG9tYWluKV07XG4gICAgICBmb3IgKGNvbnN0IG9yaWdpbiBvZiBuZXcgU2V0KG9yaWdpbnMpKSB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCBhdXRoU3RvcmFnZS5jcmVhdGVBdXRoU3RvcmFnZShcbiAgICAgICAgICB0aGlzLnJlc29sdmVkLFxuICAgICAgICAgIGxha2ViYXNlUGx1Z2luPy5leHBvcnRzKCkucG9vbCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5ydW50aW1lcy5zZXQobmV3IFVSTChvcmlnaW4pLmhvc3QudG9Mb3dlckNhc2UoKSwgYXdhaXQgcGFzc3dvcmRsZXNzQXV0aC5jcmVhdGVQYXNzd29yZGxlc3NBdXRoKHtcbiAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgIGJhc2VVUkw6IG9yaWdpbixcbiAgICAgICAgICBiYXNlUGF0aDogXCIvYXBpL2VtYWlsL2F1dGhcIixcbiAgICAgICAgICBhcHBOYW1lOiB0aGlzLnJlc29sdmVkLmJyYW5kTmFtZSxcbiAgICAgICAgICBzZWNyZXQ6IEJ1ZmZlci5mcm9tKGtleSkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIiksXG4gICAgICAgICAgc2Vzc2lvblR0bFNlY29uZHM6IHRoaXMucmVzb2x2ZWQuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICAgICAgc2Vzc2lvbkN1dG9mZk1zOiB0aGlzLnJlc29sdmVkLnNlc3Npb25DdXRvZmZNcyxcbiAgICAgICAgICBsb2dvdXRSZWRpcmVjdFBhdGg6IHRoaXMucmVzb2x2ZWQubG9nb3V0UmVkaXJlY3RQYXRoLFxuICAgICAgICAgIGNvZGVUdGxTZWNvbmRzOiB0aGlzLnJlc29sdmVkLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgICAgIG1heEF0dGVtcHRzOiB0aGlzLnJlc29sdmVkLm1heEF0dGVtcHRzLFxuICAgICAgICAgIGF1dGhvcml6ZUlkZW50aXR5OiAoZW1haWwpID0+IHRoaXMuYXV0aG9yaXplSWRlbnRpdHkoZW1haWwpLFxuICAgICAgICAgIHNlbmRDb2RlOiAoZW1haWwsIGNvZGUsIG9wdGlvbnMpID0+IHRoaXMuc2VuZENvZGUoZW1haWwsIGNvZGUsIG9wdGlvbnMpLFxuICAgICAgICAgIHN1YmplY3Q6IHRoaXMucmVzb2x2ZWQuc3ViamVjdCxcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLnJlc29sdmVkLm1lc3NhZ2UsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIC8vIGBzZXJ2ZXIoKWAgaXMgZGVmZXJyZWQsIHNvIGl0IGRvZXMgbm90IGV4aXN0IGR1cmluZyB0aGlzIHBsdWdpbidzIHNldHVwLlxuICAgICAgLy8gQXQgYHNldHVwOmNvbXBsZXRlYCB0aGUgRXhwcmVzcyBhcHAgZXhpc3RzIGJ1dCBoYXMgbm90IGluamVjdGVkIHBsdWdpblxuICAgICAgLy8gcm91dGVzIG9yIHN0YXRpYyBoYW5kbGluZyB5ZXQsIHdoaWNoIGlzIHRoZSBvbmUgcG9pbnQgdGhlIGdhdGUgY2FuIG1vdW50XG4gICAgICAvLyBhaGVhZCBvZiBldmVyeSBwcm90ZWN0ZWQgcm91dGUuXG4gICAgICB0aGlzLmNvbnRleHQ/Lm9uTGlmZWN5Y2xlKFwic2V0dXA6Y29tcGxldGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLm1vdW50R2F0ZVJvdXRlcygpO1xuICAgICAgICAvLyBGYWlsIGZhc3Qgb25jZSB0aGUgc2libGluZyBlbWFpbCBwbHVnaW4gaGFzIHByaW1lZCBpdHMgdHJhbnNwb3J0OiBhXG4gICAgICAgIC8vIGdhdGUgdGhhdCBjYW5ub3QgZW1haWwgYSBjb2RlIGxldHMgbm9ib2R5IGluLlxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnNlbmRDb2RlKSBhd2FpdCBlbnN1cmVFbWFpbEF2YWlsYWJsZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBwYXR0ZXJuczogdGhpcy5yZXNvbHZlZC5hbGxvdy5sZW5ndGgsXG4gICAgICBzZXNzaW9uVHRsU2Vjb25kczogdGhpcy5yZXNvbHZlZC5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIHB1YmxpY0RvbWFpbnM6IHRoaXMucmVzb2x2ZWQucHVibGljRG9tYWlucyxcbiAgICAgIGluc2VjdXJlOiB0aGlzLnJlc29sdmVkLmluc2VjdXJlLFxuICAgICAgc3RvcmFnZTogdGhpcy5yZXNvbHZlZC5zdG9yYWdlLFxuICAgICAgbG9nb3V0UmVkaXJlY3RQYXRoOiB0aGlzLnJlc29sdmVkLmxvZ291dFJlZGlyZWN0UGF0aCxcbiAgICAgIHNlc3Npb25DdXRvZmY6XG4gICAgICAgIHRoaXMucmVzb2x2ZWQuc2Vzc2lvbkN1dG9mZk1zID4gMFxuICAgICAgICAgID8gbmV3IERhdGUodGhpcy5yZXNvbHZlZC5zZXNzaW9uQ3V0b2ZmTXMpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICA6IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4udGhpcy5ydW50aW1lcy52YWx1ZXMoKV0ubWFwKChydW50aW1lKSA9PiBydW50aW1lLmNsb3NlKCkpKTtcbiAgICB0aGlzLnJ1bnRpbWVzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdGhlIGxvZ2luIHJvdXRlcyAoYC9hcGkvZW1haWwvYXV0aC8qYCkgYW5kIHRoZSBnYXRpbmcgbWlkZGxld2FyZSBvblxuICAgKiB0aGUgYXBwJ3MgT1dOIEV4cHJlc3Mgc2VydmVyLiBBdCBgc2V0dXA6Y29tcGxldGVgLCB0aGUgZGVmZXJyZWQgc2VydmVyIHBsdWdpblxuICAgKiBoYXMgY29uc3RydWN0ZWQgaXRzIEV4cHJlc3MgYXBwIGJ1dCBoYXMgbm90IGluamVjdGVkIHBsdWdpbiByb3V0ZXMgb3Igc3RhdGljXG4gICAqIGhhbmRsaW5nLCBzbyBkaXJlY3QgcmVnaXN0cmF0aW9uIHB1dHMgdGhlIGdhdGUgZmlyc3QuIFRoZSBjb250ZXh0J3MgYnVmZmVyZWRcbiAgICogcm91dGUgQVBJIHJlbWFpbnMgYSBmYWxsYmFjayBmb3IgY29tcGF0aWJsZSBub24tc3RhbmRhcmQgc2VydmVyIHBsdWdpbnMuXG4gICAqL1xuICBwcml2YXRlIG1vdW50R2F0ZVJvdXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJubyBwbHVnaW4gY29udGV4dCAtIHRoZSBhdXRoIGdhdGUgY2Fubm90IG1vdW50IGl0cyByb3V0ZXNcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1vdW50R2F0ZU9uQ29udGV4dChjb250ZXh0LCB7XG4gICAgICBnYXRlOiB0aGlzLmV4cG9ydHMoKSxcbiAgICAgIHB1YmxpY0RvbWFpbjogdGhpcy5yZXNvbHZlZC5wdWJsaWNEb21haW5zLFxuICAgICAgZm9yd2FyZEhlYWRlcnM6IHRoaXMucmVzb2x2ZWQuZm9yd2FyZEhlYWRlcnMsXG4gICAgICBnYXRlUGF0aHM6IHRoaXMucmVzb2x2ZWQuZ2F0ZVBhdGhzLFxuICAgICAgYnJhbmROYW1lOiB0aGlzLnJlc29sdmVkLmJyYW5kTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgY29kZSBzZW5kZXI6IHRoZSBjb25maWd1cmVkIGBzZW5kQ29kZWAsIGVsc2UgdGhlIHNoYXJlZC10cmFuc3BvcnQgZGVmYXVsdC4gKi9cbiAgcHJpdmF0ZSBnZXQgc2VuZENvZGUoKTogTm9uTnVsbGFibGU8QXV0aEdhdGVDb25maWdbXCJzZW5kQ29kZVwiXT4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5zZW5kQ29kZSA/PyBkZWZhdWx0U2VuZENvZGU7XG4gIH1cblxuICBwcml2YXRlIGF1dGhvcml6ZUlkZW50aXR5KGVtYWlsOiBzdHJpbmcpOiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmF1dGhvcml6ZUlkZW50aXR5KSByZXR1cm4gdGhpcy5jb25maWcuYXV0aG9yaXplSWRlbnRpdHkoZW1haWwpO1xuICAgIHJldHVybiBsb29rc0xpa2VFbWFpbChlbWFpbCkgJiYgbWF0Y2hlc0FsbG93bGlzdChlbWFpbCwgdGhpcy5yZXNvbHZlZC5hbGxvdyk7XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCk6IEF1dGhHYXRlQXBpIHtcbiAgICBjb25zdCBydW50aW1lID0gKGhlYWRlcnM/OiBIZWFkZXJzLCByZXF1ZXN0PzogUmVxdWVzdCkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IChoZWFkZXJzPy5nZXQoXCJob3N0XCIpID8/IChyZXF1ZXN0ID8gbmV3IFVSTChyZXF1ZXN0LnVybCkuaG9zdCA6IFwiXCIpKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIHRoaXMucnVudGltZXMuZ2V0KGhvc3QpID8/IHRoaXMucnVudGltZXMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhc3NrZXlzRW5hYmxlZDogWy4uLnRoaXMucnVudGltZXMudmFsdWVzKCldLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5wYXNza2V5c0VuYWJsZWQpLFxuICAgICAgaGFuZGxlcjogKHJlcXVlc3QpID0+XG4gICAgICAgIHJ1bnRpbWUocmVxdWVzdC5oZWFkZXJzLCByZXF1ZXN0KT8uaGFuZGxlcihyZXF1ZXN0KSA/PyBQcm9taXNlLnJlc29sdmUobmV3IFJlc3BvbnNlKFwiTm90IEZvdW5kXCIsIHsgc3RhdHVzOiA0MDQgfSkpLFxuICAgICAgc2Vzc2lvbjogKGhlYWRlcnMpID0+IHJ1bnRpbWUoaGVhZGVycyk/LnNlc3Npb24oaGVhZGVycykgPz8gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCksXG4gICAgICBzdGF0dXM6IChoZWFkZXJzKSA9PlxuICAgICAgICBydW50aW1lKGhlYWRlcnMpPy5zdGF0dXMoaGVhZGVycykgPz9cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHsgYXV0aGVudGljYXRlZDogZmFsc2UsIGVuYWJsZWQ6IGZhbHNlLCBwYXNza2V5c0VuYWJsZWQ6IGZhbHNlIH0pLFxuICAgICAgY2xvc2U6ICgpID0+IHRoaXMuc2h1dGRvd24oKSxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGF1dGhPcmlnaW4ocHVibGljRG9tYWluPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdmFsdWUgPSBzdHJpbmcudHJpbVRvTnVsbChwdWJsaWNEb21haW4pO1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCJodHRwOi8vbG9jYWxob3N0XCI7XG4gIGlmICgvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHZhbHVlKSkgcmV0dXJuIG5ldyBVUkwodmFsdWUpLm9yaWdpbjtcbiAgY29uc3QgaG9zdCA9IHZhbHVlLnNwbGl0KFwiL1wiKVswXSE7XG4gIGNvbnN0IGxvY2FsID0gaG9zdCA9PT0gXCJsb2NhbGhvc3RcIiB8fCBob3N0LnN0YXJ0c1dpdGgoXCJsb2NhbGhvc3Q6XCIpO1xuICByZXR1cm4gYCR7bG9jYWwgPyBcImh0dHBcIiA6IFwiaHR0cHNcIn06Ly8ke2hvc3R9YDtcbn1cblxuLyoqIEZhY3Rvcnk6IGBhdXRoR2F0ZSh7IGFsbG93LCBzdWJqZWN0LCAuLi4gfSlgIGZvciBhbiBBcHBLaXQgYHBsdWdpbnNgIGFycmF5LiAqL1xuZXhwb3J0IGNvbnN0IGF1dGhHYXRlID0gdG9QbHVnaW4oQXV0aEdhdGVQbHVnaW4pO1xuIl19
|
package/lib/src/portr.d.ts
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* @module
|
|
11
11
|
*/
|
|
12
12
|
import { spawn } from "node:child_process";
|
|
13
|
+
import { type ProcessSupervisor } from "./supervisor.ts";
|
|
13
14
|
/** Options for installing the portr executable. */
|
|
14
15
|
export interface PortrInstallOptions {
|
|
15
16
|
/** Home directory containing `.portr`; defaults to the OS home directory. */
|
|
@@ -42,3 +43,4 @@ export declare function installPortr(options?: PortrInstallOptions): Promise<Nod
|
|
|
42
43
|
export declare function writePortrConfig(config: PortrConfig, childEnv: NodeJS.ProcessEnv): Promise<void>;
|
|
43
44
|
/** Launch `portr start` as a child process (caller supervises + kills it). */
|
|
44
45
|
export declare function startPortr(config: PortrConfig, childEnv: NodeJS.ProcessEnv): Promise<ReturnType<typeof spawn>>;
|
|
46
|
+
export declare function supervisePortr(config: PortrConfig, childEnv: NodeJS.ProcessEnv): ProcessSupervisor;
|
package/lib/src/portr.js
CHANGED
|
@@ -17,6 +17,7 @@ import { promisify } from "node:util";
|
|
|
17
17
|
import { bin, config } from "@dbx-tools/core";
|
|
18
18
|
import { log } from "@dbx-tools/shared-core";
|
|
19
19
|
import { TUNNEL_CONFIG } from "./_config.js";
|
|
20
|
+
import { superviseProcessForever } from "./supervisor.js";
|
|
20
21
|
const logger = log.logger("tunnel:portr");
|
|
21
22
|
const PORTR_VERSION = "1.0.15-sse.2";
|
|
22
23
|
const PORTR_RELEASE_URL = `https://github.com/reggie-db/portr/releases/download/v${PORTR_VERSION}`;
|
|
@@ -102,4 +103,11 @@ export async function startPortr(config, childEnv) {
|
|
|
102
103
|
logger.info(`portr tunneling https://${config.subdomain}.${config.server} -> :${config.port}`);
|
|
103
104
|
return spawn("portr", ["start"], { env: childEnv, stdio: "inherit" });
|
|
104
105
|
}
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydHIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydHIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXRDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUMxQyxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDckMsTUFBTSxpQkFBaUIsR0FBRyx5REFBeUQsYUFBYSxFQUFFLENBQUM7QUFDbkcsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUM7QUFDcEMsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBZ0IxQzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUtsQztJQUNDLG1FQUFtRTtJQUNuRSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxhQUFh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Q0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMvRixPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDeEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcG9ydHIgaW5zdGFsbCwgY29uZmlnLCBhbmQgbGF1bmNoIHN1cHBvcnQgZm9yIHRoZSB0dW5uZWwgcnVudGltZS5cbiAqXG4gKiBUaGUgYmluYXJ5IGFuZCBjb25maWcgdXNlIHBvcnRyJ3MgY29udmVudGlvbmFsIGAkSE9NRS8ucG9ydHJgIHRyZWUuIFRoZVxuICogaW5zdGFsbCBpcyBpZGVtcG90ZW50ICh0aGUgaW5zdGFsbGVyIHNraXBzIGFuIGV4aXN0aW5nIGV4ZWN1dGFibGUpLiBUaGVcbiAqIGNvbmZpZyBpcyByZW5kZXJlZCBmcm9tIGBUVU5ORUxfUFVCTElDX0RPTUFJTmBcbiAqIChgPHN1YmRvbWFpbj4uPHNlcnZlcj5gKSArIGBQT1JUUl9UT0tFTmAgYW5kIHBvaW50cyBwb3J0ciBhdCB0aGUgUFVCTElDIHBvcnRcbiAqICh0aGUgcHJveHkgbGlzdGVucyB0aGVyZSkuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBleGVjRmlsZSwgc3Bhd24gfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkZWxpbWl0ZXIsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tIFwibm9kZTp1dGlsXCI7XG5cbmltcG9ydCB7IGJpbiwgY29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFRVTk5FTF9DT05GSUcgfSBmcm9tIFwiLi9fY29uZmlnLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWw6cG9ydHJcIik7XG5jb25zdCBQT1JUUl9WRVJTSU9OID0gXCIxLjAuMTUtc3NlLjJcIjtcbmNvbnN0IFBPUlRSX1JFTEVBU0VfVVJMID0gYGh0dHBzOi8vZ2l0aHViLmNvbS9yZWdnaWUtZGIvcG9ydHIvcmVsZWFzZXMvZG93bmxvYWQvdiR7UE9SVFJfVkVSU0lPTn1gO1xuY29uc3QgUE9SVFJfTUlOX1ZFUlNJT04gPSBcInYxLjAuMTVcIjtcbmNvbnN0IGV4ZWNGaWxlQXN5bmMgPSBwcm9taXNpZnkoZXhlY0ZpbGUpO1xuXG4vKiogT3B0aW9ucyBmb3IgaW5zdGFsbGluZyB0aGUgcG9ydHIgZXhlY3V0YWJsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9ydHJJbnN0YWxsT3B0aW9ucyB7XG4gIC8qKiBIb21lIGRpcmVjdG9yeSBjb250YWluaW5nIGAucG9ydHJgOyBkZWZhdWx0cyB0byB0aGUgT1MgaG9tZSBkaXJlY3RvcnkuICovXG4gIGhvbWVEaXI/OiBzdHJpbmc7XG59XG5cbi8qKiBSZXNvbHZlZCBwb3J0ciB3aXJpbmcsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gdHVubmVsIGlzIGNvbmZpZ3VyZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRyQ29uZmlnIHtcbiAgc3ViZG9tYWluOiBzdHJpbmc7XG4gIHNlcnZlcjogc3RyaW5nO1xuICB0b2tlbjogc3RyaW5nO1xuICBwb3J0OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBwb3J0ciBjb25maWcgZnJvbSBgVFVOTkVMX1BVQkxJQ19ET01BSU5gICsgYFBPUlRSX1RPS0VOYCwgb3IgYW5cbiAqIGV4cGxpY2l0IGBzdWJkb21haW5gLiBUaGUgZG9tYWluIGlzIGA8c3ViZG9tYWluPi48c2VydmVyPmAgKGUuZy5cbiAqIGBkZW1vLmFwcHMuZGJ4LnRvb2xzYCkuIFJldHVybnMgYHVuZGVmaW5lZGAgKG5vIHR1bm5lbCkgd2hlbiB0aGUgdG9rZW4gb3IgYVxuICogdXNhYmxlIGRvbWFpbiBpcyBhYnNlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUG9ydHJDb25maWcob3B0czoge1xuICBwdWJsaWNEb21haW4/OiBzdHJpbmc7XG4gIHN1YmRvbWFpbj86IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbn0pOiBQb3J0ckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIC8vIFBPUlRSXyogaXMgdXBzdHJlYW0gcG9ydHIncyBvd24gbmFtZXNwYWNlLCBzbyBpdCBrZWVwcyBpdHMgbmFtZS5cbiAgY29uc3QgdG9rZW4gPSBjb25maWcuc3RyaW5nKG9wdHMudG9rZW4sIFwiUE9SVFJfVE9LRU5cIik7XG4gIGNvbnN0IGRvbWFpbiA9IGNvbmZpZy5zdHJpbmcob3B0cy5wdWJsaWNEb21haW4sIFwiUFVCTElDX0RPTUFJTlwiLCBUVU5ORUxfQ09ORklHKTtcbiAgaWYgKCF0b2tlbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbGV0IHN1YmRvbWFpbiA9IG9wdHMuc3ViZG9tYWluO1xuICBsZXQgc2VydmVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChkb21haW4pIHtcbiAgICBzdWJkb21haW4gPz89IGRvbWFpbi5zcGxpdChcIi5cIilbMF07XG4gICAgc2VydmVyID0gZG9tYWluLnNsaWNlKGRvbWFpbi5pbmRleE9mKFwiLlwiKSArIDEpO1xuICB9XG4gIHNlcnZlciA/Pz0gY29uZmlnLnRleHQoXCJQT1JUUl9TRVJWRVJcIik7XG4gIGlmICghc3ViZG9tYWluIHx8ICFzZXJ2ZXIgfHwgc2VydmVyID09PSBkb21haW4pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7IHN1YmRvbWFpbiwgc2VydmVyLCB0b2tlbiwgcG9ydDogb3B0cy5wb3J0IH07XG59XG5cbi8qKiBHaXRIdWIgcmVsZWFzZSBhc3NldCBuYW1lIGZvciB0aGUgY3VycmVudCBvciBzdXBwbGllZCBPUy9hcmNoaXRlY3R1cmUuICovXG5leHBvcnQgZnVuY3Rpb24gcG9ydHJBc3NldE5hbWUoXG4gIHZlcnNpb246IHN0cmluZyxcbiAgcGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSA9IHByb2Nlc3MucGxhdGZvcm0sXG4gIGFyY2g6IHN0cmluZyA9IHByb2Nlc3MuYXJjaCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG9zTmFtZSA9IHBsYXRmb3JtID09PSBcImRhcndpblwiID8gXCJEYXJ3aW5cIiA6IHBsYXRmb3JtID09PSBcImxpbnV4XCIgPyBcIkxpbnV4XCIgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFyY2hOYW1lID0gYXJjaCA9PT0gXCJhcm02NFwiID8gXCJhcm02NFwiIDogYXJjaCA9PT0gXCJ4NjRcIiA/IFwieDg2XzY0XCIgOiB1bmRlZmluZWQ7XG4gIGlmICghb3NOYW1lIHx8ICFhcmNoTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcG9ydHIgaGFzIG5vIHN1cHBvcnRlZCByZWxlYXNlIGFzc2V0IGZvciAke3BsYXRmb3JtfS8ke2FyY2h9YCk7XG4gIH1cbiAgcmV0dXJuIGBwb3J0cl8ke3ZlcnNpb259XyR7b3NOYW1lfV8ke2FyY2hOYW1lfS56aXBgO1xufVxuXG5mdW5jdGlvbiBwb3J0ckRvd25sb2FkVXJsKCk6IHN0cmluZyB7XG4gIGNvbnN0IGFzc2V0TmFtZSA9IHBvcnRyQXNzZXROYW1lKFBPUlRSX1ZFUlNJT04pO1xuICBsb2dnZXIuaW5mbyhcImluc3RhbGxpbmcgcG9ydHJcIiwgeyB2ZXJzaW9uOiBQT1JUUl9WRVJTSU9OLCBhc3NldDogYXNzZXROYW1lIH0pO1xuICByZXR1cm4gYCR7UE9SVFJfUkVMRUFTRV9VUkx9LyR7YXNzZXROYW1lfWA7XG59XG5cbi8qKiBJbnN0YWxsIHBvcnRyIHdoZW4gYWJzZW50IGFuZCByZXR1cm4gdGhlIGVudmlyb25tZW50IHVzZWQgYnkgaXRzIHByb2Nlc3MuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFBvcnRyKG9wdGlvbnM6IFBvcnRySW5zdGFsbE9wdGlvbnMgPSB7fSk6IFByb21pc2U8Tm9kZUpTLlByb2Nlc3NFbnY+IHtcbiAgY29uc3QgaG9tZURpciA9IG9wdGlvbnMuaG9tZURpciA/PyBvcy5ob21lZGlyKCk7XG4gIGNvbnN0IGNvbnRleHQgPSBhd2FpdCBiaW4uZW5zdXJlKFwicG9ydHJcIiwgcG9ydHJEb3dubG9hZFVybCwge1xuICAgIGF1dG9VbnBhY2thZ2U6IHRydWUsXG4gICAgaG9tZURpcixcbiAgICBtaW5WZXJzaW9uOiBQT1JUUl9NSU5fVkVSU0lPTixcbiAgICBzZWxlY3RvcjogKHsgc291cmNlIH0pID0+IGpvaW4oc291cmNlLCBcInBvcnRyXCIpLFxuICAgIHZlcnNpb25QYXJzZXI6IChvdXRwdXQpID0+IHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBiaW4ucGFyc2VWZXJzaW9uKG91dHB1dCk7XG4gICAgICByZXR1cm4gdmVyc2lvbiA9PT0gUE9SVFJfVkVSU0lPTiA/IHZlcnNpb24gOiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgSE9NRTogaG9tZURpcixcbiAgICBQT1JUUl9BVVRPX0FERF9QQVRIOiBcIm5vXCIsXG4gICAgUEFUSDogW2NvbnRleHQuYmluRGlyLCBwcm9jZXNzLmVudi5QQVRIID8/IFwiXCJdLmpvaW4oZGVsaW1pdGVyKSxcbiAgfTtcbn1cblxuLyoqIFJlbmRlciBgfi8ucG9ydHIvY29uZmlnLnlhbWxgIGZvciB0aGUgcmVzb2x2ZWQgdHVubmVsLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlUG9ydHJDb25maWcoXG4gIGNvbmZpZzogUG9ydHJDb25maWcsXG4gIGNoaWxkRW52OiBOb2RlSlMuUHJvY2Vzc0Vudixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYXRoID0gam9pbihjaGlsZEVudi5IT01FID8/IG9zLmhvbWVkaXIoKSwgXCIucG9ydHJcIiwgXCJjb25maWcueWFtbFwiKTtcbiAgYXdhaXQgd3JpdGVGaWxlKFxuICAgIHBhdGgsXG4gICAgW1xuICAgICAgYHNlcnZlcl91cmw6ICR7Y29uZmlnLnNlcnZlcn1gLFxuICAgICAgYHNzaF91cmw6ICR7Y29uZmlnLnNlcnZlcn06NDQ0NGAsXG4gICAgICBgc2VjcmV0X2tleTogJHtjb25maWcudG9rZW59YCxcbiAgICAgIFwiZGlzYWJsZV9kYXNoYm9hcmQ6IHRydWVcIixcbiAgICAgIFwiZGlzYWJsZV90dWk6IHRydWVcIixcbiAgICAgIFwidHVubmVsczpcIixcbiAgICAgIGAgIC0gbmFtZTogJHtjb25maWcuc3ViZG9tYWlufWAsXG4gICAgICBgICAgIHN1YmRvbWFpbjogJHtjb25maWcuc3ViZG9tYWlufWAsXG4gICAgICBgICAgIHBvcnQ6ICR7Y29uZmlnLnBvcnR9YCxcbiAgICAgIFwiXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpLFxuICApO1xufVxuXG4vKiogTGF1bmNoIGBwb3J0ciBzdGFydGAgYXMgYSBjaGlsZCBwcm9jZXNzIChjYWxsZXIgc3VwZXJ2aXNlcyArIGtpbGxzIGl0KS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFBvcnRyKFxuICBjb25maWc6IFBvcnRyQ29uZmlnLFxuICBjaGlsZEVudjogTm9kZUpTLlByb2Nlc3NFbnYsXG4pOiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIHNwYXduPj4ge1xuICAvLyBSZWNsYWltIHRoZSBzdWJkb21haW4gZnJvbSBhbnkgcG9ydHIgbGVmdCBieSBhIHByZXZpb3VzIGJvb3QgaW4gdGhpcyBjb250YWluZXIuXG4gIGF3YWl0IGV4ZWNGaWxlQXN5bmMoXCJwa2lsbFwiLCBbXCIteFwiLCBcInBvcnRyXCJdKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuXG4gIGxvZ2dlci5pbmZvKGBwb3J0ciB0dW5uZWxpbmcgaHR0cHM6Ly8ke2NvbmZpZy5zdWJkb21haW59LiR7Y29uZmlnLnNlcnZlcn0gLT4gOiR7Y29uZmlnLnBvcnR9YCk7XG4gIHJldHVybiBzcGF3bihcInBvcnRyXCIsIFtcInN0YXJ0XCJdLCB7IGVudjogY2hpbGRFbnYsIHN0ZGlvOiBcImluaGVyaXRcIiB9KTtcbn1cbiJdfQ==
|
|
106
|
+
export function supervisePortr(config, childEnv) {
|
|
107
|
+
return superviseProcessForever({
|
|
108
|
+
name: "portr",
|
|
109
|
+
logger,
|
|
110
|
+
start: () => startPortr(config, childEnv),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydHIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydHIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXRDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUEwQixNQUFNLGlCQUFpQixDQUFDO0FBRWxGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDMUMsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDO0FBQ3JDLE1BQU0saUJBQWlCLEdBQUcseURBQXlELGFBQWEsRUFBRSxDQUFDO0FBQ25HLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDO0FBQ3BDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQWdCMUM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsSUFLbEM7SUFDQyxtRUFBbUU7SUFDbkUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FB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QUMsQ0FBQztJQUVyRSxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxNQUFNLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0YsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQW1CLEVBQUUsUUFBMkI7SUFDN0UsT0FBTyx1QkFBdUIsQ0FBQztRQUM3QixJQUFJLEVBQUUsT0FBTztRQUNiLE1BQU07UUFDTixLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7S0FDMUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcG9ydHIgaW5zdGFsbCwgY29uZmlnLCBhbmQgbGF1bmNoIHN1cHBvcnQgZm9yIHRoZSB0dW5uZWwgcnVudGltZS5cbiAqXG4gKiBUaGUgYmluYXJ5IGFuZCBjb25maWcgdXNlIHBvcnRyJ3MgY29udmVudGlvbmFsIGAkSE9NRS8ucG9ydHJgIHRyZWUuIFRoZVxuICogaW5zdGFsbCBpcyBpZGVtcG90ZW50ICh0aGUgaW5zdGFsbGVyIHNraXBzIGFuIGV4aXN0aW5nIGV4ZWN1dGFibGUpLiBUaGVcbiAqIGNvbmZpZyBpcyByZW5kZXJlZCBmcm9tIGBUVU5ORUxfUFVCTElDX0RPTUFJTmBcbiAqIChgPHN1YmRvbWFpbj4uPHNlcnZlcj5gKSArIGBQT1JUUl9UT0tFTmAgYW5kIHBvaW50cyBwb3J0ciBhdCB0aGUgUFVCTElDIHBvcnRcbiAqICh0aGUgcHJveHkgbGlzdGVucyB0aGVyZSkuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBleGVjRmlsZSwgc3Bhd24gfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkZWxpbWl0ZXIsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tIFwibm9kZTp1dGlsXCI7XG5cbmltcG9ydCB7IGJpbiwgY29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFRVTk5FTF9DT05GSUcgfSBmcm9tIFwiLi9fY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBzdXBlcnZpc2VQcm9jZXNzRm9yZXZlciwgdHlwZSBQcm9jZXNzU3VwZXJ2aXNvciB9IGZyb20gXCIuL3N1cGVydmlzb3IudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDpwb3J0clwiKTtcbmNvbnN0IFBPUlRSX1ZFUlNJT04gPSBcIjEuMC4xNS1zc2UuMlwiO1xuY29uc3QgUE9SVFJfUkVMRUFTRV9VUkwgPSBgaHR0cHM6Ly9naXRodWIuY29tL3JlZ2dpZS1kYi9wb3J0ci9yZWxlYXNlcy9kb3dubG9hZC92JHtQT1JUUl9WRVJTSU9OfWA7XG5jb25zdCBQT1JUUl9NSU5fVkVSU0lPTiA9IFwidjEuMC4xNVwiO1xuY29uc3QgZXhlY0ZpbGVBc3luYyA9IHByb21pc2lmeShleGVjRmlsZSk7XG5cbi8qKiBPcHRpb25zIGZvciBpbnN0YWxsaW5nIHRoZSBwb3J0ciBleGVjdXRhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb3J0ckluc3RhbGxPcHRpb25zIHtcbiAgLyoqIEhvbWUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYC5wb3J0cmA7IGRlZmF1bHRzIHRvIHRoZSBPUyBob21lIGRpcmVjdG9yeS4gKi9cbiAgaG9tZURpcj86IHN0cmluZztcbn1cblxuLyoqIFJlc29sdmVkIHBvcnRyIHdpcmluZywgb3IgYHVuZGVmaW5lZGAgd2hlbiBubyB0dW5uZWwgaXMgY29uZmlndXJlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9ydHJDb25maWcge1xuICBzdWJkb21haW46IHN0cmluZztcbiAgc2VydmVyOiBzdHJpbmc7XG4gIHRva2VuOiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHBvcnRyIGNvbmZpZyBmcm9tIGBUVU5ORUxfUFVCTElDX0RPTUFJTmAgKyBgUE9SVFJfVE9LRU5gLCBvciBhblxuICogZXhwbGljaXQgYHN1YmRvbWFpbmAuIFRoZSBkb21haW4gaXMgYDxzdWJkb21haW4+LjxzZXJ2ZXI+YCAoZS5nLlxuICogYGRlbW8uYXBwcy5kYngudG9vbHNgKS4gUmV0dXJucyBgdW5kZWZpbmVkYCAobm8gdHVubmVsKSB3aGVuIHRoZSB0b2tlbiBvciBhXG4gKiB1c2FibGUgZG9tYWluIGlzIGFic2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQb3J0ckNvbmZpZyhvcHRzOiB7XG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgc3ViZG9tYWluPzogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xufSk6IFBvcnRyQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgLy8gUE9SVFJfKiBpcyB1cHN0cmVhbSBwb3J0cidzIG93biBuYW1lc3BhY2UsIHNvIGl0IGtlZXBzIGl0cyBuYW1lLlxuICBjb25zdCB0b2tlbiA9IGNvbmZpZy5zdHJpbmcob3B0cy50b2tlbiwgXCJQT1JUUl9UT0tFTlwiKTtcbiAgY29uc3QgZG9tYWluID0gY29uZmlnLnN0cmluZyhvcHRzLnB1YmxpY0RvbWFpbiwgXCJQVUJMSUNfRE9NQUlOXCIsIFRVTk5FTF9DT05GSUcpO1xuICBpZiAoIXRva2VuKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgc3ViZG9tYWluID0gb3B0cy5zdWJkb21haW47XG4gIGxldCBzZXJ2ZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKGRvbWFpbikge1xuICAgIHN1YmRvbWFpbiA/Pz0gZG9tYWluLnNwbGl0KFwiLlwiKVswXTtcbiAgICBzZXJ2ZXIgPSBkb21haW4uc2xpY2UoZG9tYWluLmluZGV4T2YoXCIuXCIpICsgMSk7XG4gIH1cbiAgc2VydmVyID8/PSBjb25maWcudGV4dChcIlBPUlRSX1NFUlZFUlwiKTtcbiAgaWYgKCFzdWJkb21haW4gfHwgIXNlcnZlciB8fCBzZXJ2ZXIgPT09IGRvbWFpbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgc3ViZG9tYWluLCBzZXJ2ZXIsIHRva2VuLCBwb3J0OiBvcHRzLnBvcnQgfTtcbn1cblxuLyoqIEdpdEh1YiByZWxlYXNlIGFzc2V0IG5hbWUgZm9yIHRoZSBjdXJyZW50IG9yIHN1cHBsaWVkIE9TL2FyY2hpdGVjdHVyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3J0ckFzc2V0TmFtZShcbiAgdmVyc2lvbjogc3RyaW5nLFxuICBwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgYXJjaDogc3RyaW5nID0gcHJvY2Vzcy5hcmNoLFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgb3NOYW1lID0gcGxhdGZvcm0gPT09IFwiZGFyd2luXCIgPyBcIkRhcndpblwiIDogcGxhdGZvcm0gPT09IFwibGludXhcIiA/IFwiTGludXhcIiA6IHVuZGVmaW5lZDtcbiAgY29uc3QgYXJjaE5hbWUgPSBhcmNoID09PSBcImFybTY0XCIgPyBcImFybTY0XCIgOiBhcmNoID09PSBcIng2NFwiID8gXCJ4ODZfNjRcIiA6IHVuZGVmaW5lZDtcbiAgaWYgKCFvc05hbWUgfHwgIWFyY2hOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBwb3J0ciBoYXMgbm8gc3VwcG9ydGVkIHJlbGVhc2UgYXNzZXQgZm9yICR7cGxhdGZvcm19LyR7YXJjaH1gKTtcbiAgfVxuICByZXR1cm4gYHBvcnRyXyR7dmVyc2lvbn1fJHtvc05hbWV9XyR7YXJjaE5hbWV9LnppcGA7XG59XG5cbmZ1bmN0aW9uIHBvcnRyRG93bmxvYWRVcmwoKTogc3RyaW5nIHtcbiAgY29uc3QgYXNzZXROYW1lID0gcG9ydHJBc3NldE5hbWUoUE9SVFJfVkVSU0lPTik7XG4gIGxvZ2dlci5pbmZvKFwiaW5zdGFsbGluZyBwb3J0clwiLCB7IHZlcnNpb246IFBPUlRSX1ZFUlNJT04sIGFzc2V0OiBhc3NldE5hbWUgfSk7XG4gIHJldHVybiBgJHtQT1JUUl9SRUxFQVNFX1VSTH0vJHthc3NldE5hbWV9YDtcbn1cblxuLyoqIEluc3RhbGwgcG9ydHIgd2hlbiBhYnNlbnQgYW5kIHJldHVybiB0aGUgZW52aXJvbm1lbnQgdXNlZCBieSBpdHMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsUG9ydHIob3B0aW9uczogUG9ydHJJbnN0YWxsT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxOb2RlSlMuUHJvY2Vzc0Vudj4ge1xuICBjb25zdCBob21lRGlyID0gb3B0aW9ucy5ob21lRGlyID8/IG9zLmhvbWVkaXIoKTtcbiAgY29uc3QgY29udGV4dCA9IGF3YWl0IGJpbi5lbnN1cmUoXCJwb3J0clwiLCBwb3J0ckRvd25sb2FkVXJsLCB7XG4gICAgYXV0b1VucGFja2FnZTogdHJ1ZSxcbiAgICBob21lRGlyLFxuICAgIG1pblZlcnNpb246IFBPUlRSX01JTl9WRVJTSU9OLFxuICAgIHNlbGVjdG9yOiAoeyBzb3VyY2UgfSkgPT4gam9pbihzb3VyY2UsIFwicG9ydHJcIiksXG4gICAgdmVyc2lvblBhcnNlcjogKG91dHB1dCkgPT4ge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IGJpbi5wYXJzZVZlcnNpb24ob3V0cHV0KTtcbiAgICAgIHJldHVybiB2ZXJzaW9uID09PSBQT1JUUl9WRVJTSU9OID8gdmVyc2lvbiA6IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICAuLi5wcm9jZXNzLmVudixcbiAgICBIT01FOiBob21lRGlyLFxuICAgIFBPUlRSX0FVVE9fQUREX1BBVEg6IFwibm9cIixcbiAgICBQQVRIOiBbY29udGV4dC5iaW5EaXIsIHByb2Nlc3MuZW52LlBBVEggPz8gXCJcIl0uam9pbihkZWxpbWl0ZXIpLFxuICB9O1xufVxuXG4vKiogUmVuZGVyIGB+Ly5wb3J0ci9jb25maWcueWFtbGAgZm9yIHRoZSByZXNvbHZlZCB0dW5uZWwuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVQb3J0ckNvbmZpZyhcbiAgY29uZmlnOiBQb3J0ckNvbmZpZyxcbiAgY2hpbGRFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhdGggPSBqb2luKGNoaWxkRW52LkhPTUUgPz8gb3MuaG9tZWRpcigpLCBcIi5wb3J0clwiLCBcImNvbmZpZy55YW1sXCIpO1xuICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgcGF0aCxcbiAgICBbXG4gICAgICBgc2VydmVyX3VybDogJHtjb25maWcuc2VydmVyfWAsXG4gICAgICBgc3NoX3VybDogJHtjb25maWcuc2VydmVyfTo0NDQ0YCxcbiAgICAgIGBzZWNyZXRfa2V5OiAke2NvbmZpZy50b2tlbn1gLFxuICAgICAgXCJkaXNhYmxlX2Rhc2hib2FyZDogdHJ1ZVwiLFxuICAgICAgXCJkaXNhYmxlX3R1aTogdHJ1ZVwiLFxuICAgICAgXCJ0dW5uZWxzOlwiLFxuICAgICAgYCAgLSBuYW1lOiAke2NvbmZpZy5zdWJkb21haW59YCxcbiAgICAgIGAgICAgc3ViZG9tYWluOiAke2NvbmZpZy5zdWJkb21haW59YCxcbiAgICAgIGAgICAgcG9ydDogJHtjb25maWcucG9ydH1gLFxuICAgICAgXCJcIixcbiAgICBdLmpvaW4oXCJcXG5cIiksXG4gICk7XG59XG5cbi8qKiBMYXVuY2ggYHBvcnRyIHN0YXJ0YCBhcyBhIGNoaWxkIHByb2Nlc3MgKGNhbGxlciBzdXBlcnZpc2VzICsga2lsbHMgaXQpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0UG9ydHIoXG4gIGNvbmZpZzogUG9ydHJDb25maWcsXG4gIGNoaWxkRW52OiBOb2RlSlMuUHJvY2Vzc0Vudixcbik6IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2Ygc3Bhd24+PiB7XG4gIC8vIFJlY2xhaW0gdGhlIHN1YmRvbWFpbiBmcm9tIGFueSBwb3J0ciBsZWZ0IGJ5IGEgcHJldmlvdXMgYm9vdCBpbiB0aGlzIGNvbnRhaW5lci5cbiAgYXdhaXQgZXhlY0ZpbGVBc3luYyhcInBraWxsXCIsIFtcIi14XCIsIFwicG9ydHJcIl0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG5cbiAgbG9nZ2VyLmluZm8oYHBvcnRyIHR1bm5lbGluZyBodHRwczovLyR7Y29uZmlnLnN1YmRvbWFpbn0uJHtjb25maWcuc2VydmVyfSAtPiA6JHtjb25maWcucG9ydH1gKTtcbiAgcmV0dXJuIHNwYXduKFwicG9ydHJcIiwgW1wic3RhcnRcIl0sIHsgZW52OiBjaGlsZEVudiwgc3RkaW86IFwiaW5oZXJpdFwiIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3VwZXJ2aXNlUG9ydHIoY29uZmlnOiBQb3J0ckNvbmZpZywgY2hpbGRFbnY6IE5vZGVKUy5Qcm9jZXNzRW52KTogUHJvY2Vzc1N1cGVydmlzb3Ige1xuICByZXR1cm4gc3VwZXJ2aXNlUHJvY2Vzc0ZvcmV2ZXIoe1xuICAgIG5hbWU6IFwicG9ydHJcIixcbiAgICBsb2dnZXIsXG4gICAgc3RhcnQ6ICgpID0+IHN0YXJ0UG9ydHIoY29uZmlnLCBjaGlsZEVudiksXG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ChildProcess } from "node:child_process";
|
|
2
|
+
import { type Logger } from "@dbx-tools/shared-core";
|
|
3
|
+
export interface ProcessSupervisor {
|
|
4
|
+
stop(): void;
|
|
5
|
+
}
|
|
6
|
+
export declare function superviseProcessForever(options: {
|
|
7
|
+
name: string;
|
|
8
|
+
logger: Logger;
|
|
9
|
+
start: () => ChildProcess | Promise<ChildProcess>;
|
|
10
|
+
retryDelaysMs?: readonly number[];
|
|
11
|
+
}): ProcessSupervisor;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { async as asyncTools } from "@dbx-tools/shared-core";
|
|
2
|
+
const STABLE_CONNECTION_MS = 60_000;
|
|
3
|
+
export function superviseProcessForever(options) {
|
|
4
|
+
const controller = new AbortController();
|
|
5
|
+
let child;
|
|
6
|
+
const stop = () => {
|
|
7
|
+
if (controller.signal.aborted)
|
|
8
|
+
return;
|
|
9
|
+
controller.abort();
|
|
10
|
+
if (child && !child.killed)
|
|
11
|
+
child.kill("SIGTERM");
|
|
12
|
+
process.off("exit", onProcessExit);
|
|
13
|
+
};
|
|
14
|
+
const onProcessExit = () => {
|
|
15
|
+
if (child && !child.killed)
|
|
16
|
+
child.kill("SIGTERM");
|
|
17
|
+
};
|
|
18
|
+
process.once("exit", onProcessExit);
|
|
19
|
+
const run = async () => {
|
|
20
|
+
let failures = 0;
|
|
21
|
+
while (!controller.signal.aborted) {
|
|
22
|
+
const startedAt = Date.now();
|
|
23
|
+
let outcome;
|
|
24
|
+
try {
|
|
25
|
+
child = await options.start();
|
|
26
|
+
outcome = await processOutcome(child, controller.signal);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
outcome = { error };
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
child = undefined;
|
|
33
|
+
}
|
|
34
|
+
if (controller.signal.aborted)
|
|
35
|
+
return;
|
|
36
|
+
if (Date.now() - startedAt >= STABLE_CONNECTION_MS)
|
|
37
|
+
failures = 0;
|
|
38
|
+
const delayMs = asyncTools.boundedRetryDelay(failures++, options.retryDelaysMs);
|
|
39
|
+
options.logger.warn(`${options.name} stopped; retrying`, { ...outcome, delayMs });
|
|
40
|
+
try {
|
|
41
|
+
await asyncTools.sleep(delayMs, controller.signal);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
void run().catch((error) => options.logger.error(`${options.name} supervisor failed`, { error }));
|
|
49
|
+
return {
|
|
50
|
+
stop,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function processOutcome(child, signal) {
|
|
54
|
+
return new Promise((resolve) => {
|
|
55
|
+
const finish = (outcome) => {
|
|
56
|
+
child.off("exit", onExit);
|
|
57
|
+
child.off("error", onError);
|
|
58
|
+
signal.removeEventListener("abort", onAbort);
|
|
59
|
+
resolve(outcome);
|
|
60
|
+
};
|
|
61
|
+
const onExit = (code, exitSignal) => finish({ code, signal: exitSignal });
|
|
62
|
+
const onError = (error) => {
|
|
63
|
+
if (!child.killed)
|
|
64
|
+
child.kill("SIGTERM");
|
|
65
|
+
finish({ error });
|
|
66
|
+
};
|
|
67
|
+
const onAbort = () => {
|
|
68
|
+
if (!child.killed)
|
|
69
|
+
child.kill("SIGTERM");
|
|
70
|
+
finish({ signal: "SIGTERM" });
|
|
71
|
+
};
|
|
72
|
+
child.once("exit", onExit);
|
|
73
|
+
child.once("error", onError);
|
|
74
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwZXJ2aXNvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdXBlcnZpc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxLQUFLLElBQUksVUFBVSxFQUFlLE1BQU0sd0JBQXdCLENBQUM7QUFFMUUsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFZcEMsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BS3ZDO0lBQ0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUN6QyxJQUFJLEtBQStCLENBQUM7SUFFcEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1FBQ2hCLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUN0QyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkIsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFO1FBQ3pCLElBQUksS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07WUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQztJQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRXBDLE1BQU0sR0FBRyxHQUFHLEtBQUssSUFBSSxFQUFFO1FBQ3JCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDN0IsSUFB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LE9BQU8sQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBhc3luYyBhcyBhc3luY1Rvb2xzLCB0eXBlIExvZ2dlciB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmNvbnN0IFNUQUJMRV9DT05ORUNUSU9OX01TID0gNjBfMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NTdXBlcnZpc29yIHtcbiAgc3RvcCgpOiB2b2lkO1xufVxuXG50eXBlIFByb2Nlc3NPdXRjb21lID0ge1xuICBjb2RlPzogbnVtYmVyIHwgbnVsbDtcbiAgc2lnbmFsPzogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xuICBlcnJvcj86IHVua25vd247XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc3VwZXJ2aXNlUHJvY2Vzc0ZvcmV2ZXIob3B0aW9uczoge1xuICBuYW1lOiBzdHJpbmc7XG4gIGxvZ2dlcjogTG9nZ2VyO1xuICBzdGFydDogKCkgPT4gQ2hpbGRQcm9jZXNzIHwgUHJvbWlzZTxDaGlsZFByb2Nlc3M+O1xuICByZXRyeURlbGF5c01zPzogcmVhZG9ubHkgbnVtYmVyW107XG59KTogUHJvY2Vzc1N1cGVydmlzb3Ige1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBsZXQgY2hpbGQ6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICBjb25zdCBzdG9wID0gKCkgPT4ge1xuICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgIGlmIChjaGlsZCAmJiAhY2hpbGQua2lsbGVkKSBjaGlsZC5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICBwcm9jZXNzLm9mZihcImV4aXRcIiwgb25Qcm9jZXNzRXhpdCk7XG4gIH07XG4gIGNvbnN0IG9uUHJvY2Vzc0V4aXQgPSAoKSA9PiB7XG4gICAgaWYgKGNoaWxkICYmICFjaGlsZC5raWxsZWQpIGNoaWxkLmtpbGwoXCJTSUdURVJNXCIpO1xuICB9O1xuICBwcm9jZXNzLm9uY2UoXCJleGl0XCIsIG9uUHJvY2Vzc0V4aXQpO1xuXG4gIGNvbnN0IHJ1biA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgZmFpbHVyZXMgPSAwO1xuICAgIHdoaWxlICghY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGxldCBvdXRjb21lOiBQcm9jZXNzT3V0Y29tZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNoaWxkID0gYXdhaXQgb3B0aW9ucy5zdGFydCgpO1xuICAgICAgICBvdXRjb21lID0gYXdhaXQgcHJvY2Vzc091dGNvbWUoY2hpbGQsIGNvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG91dGNvbWUgPSB7IGVycm9yIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjaGlsZCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCA+PSBTVEFCTEVfQ09OTkVDVElPTl9NUykgZmFpbHVyZXMgPSAwO1xuICAgICAgY29uc3QgZGVsYXlNcyA9IGFzeW5jVG9vbHMuYm91bmRlZFJldHJ5RGVsYXkoZmFpbHVyZXMrKywgb3B0aW9ucy5yZXRyeURlbGF5c01zKTtcbiAgICAgIG9wdGlvbnMubG9nZ2VyLndhcm4oYCR7b3B0aW9ucy5uYW1lfSBzdG9wcGVkOyByZXRyeWluZ2AsIHsgLi4ub3V0Y29tZSwgZGVsYXlNcyB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFzeW5jVG9vbHMuc2xlZXAoZGVsYXlNcywgY29udHJvbGxlci5zaWduYWwpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdm9pZCBydW4oKS5jYXRjaCgoZXJyb3IpID0+IG9wdGlvbnMubG9nZ2VyLmVycm9yKGAke29wdGlvbnMubmFtZX0gc3VwZXJ2aXNvciBmYWlsZWRgLCB7IGVycm9yIH0pKTtcbiAgcmV0dXJuIHtcbiAgICBzdG9wLFxuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzT3V0Y29tZShjaGlsZDogQ2hpbGRQcm9jZXNzLCBzaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxQcm9jZXNzT3V0Y29tZT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBmaW5pc2ggPSAob3V0Y29tZTogUHJvY2Vzc091dGNvbWUpID0+IHtcbiAgICAgIGNoaWxkLm9mZihcImV4aXRcIiwgb25FeGl0KTtcbiAgICAgIGNoaWxkLm9mZihcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIHJlc29sdmUob3V0Y29tZSk7XG4gICAgfTtcbiAgICBjb25zdCBvbkV4aXQgPSAoY29kZTogbnVtYmVyIHwgbnVsbCwgZXhpdFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PlxuICAgICAgZmluaXNoKHsgY29kZSwgc2lnbmFsOiBleGl0U2lnbmFsIH0pO1xuICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBpZiAoIWNoaWxkLmtpbGxlZCkgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG4gICAgICBmaW5pc2goeyBlcnJvciB9KTtcbiAgICB9O1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICBpZiAoIWNoaWxkLmtpbGxlZCkgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG4gICAgICBmaW5pc2goeyBzaWduYWw6IFwiU0lHVEVSTVwiIH0pO1xuICAgIH07XG4gICAgY2hpbGQub25jZShcImV4aXRcIiwgb25FeGl0KTtcbiAgICBjaGlsZC5vbmNlKFwiZXJyb3JcIiwgb25FcnJvcik7XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuIl19
|
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/path-proxy.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","../src/supervisor.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -18,21 +18,21 @@
|
|
|
18
18
|
"projen": "projen"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@dbx-tools/email": "0.6.120",
|
|
22
21
|
"@types/bun": "^1.3.14",
|
|
23
22
|
"@types/node": "^24.6.0",
|
|
24
23
|
"typescript": "^5.9.3"
|
|
25
24
|
},
|
|
26
25
|
"peerDependencies": {
|
|
27
|
-
"@dbx-tools/email": "0.6.
|
|
26
|
+
"@dbx-tools/email": "0.6.123"
|
|
28
27
|
},
|
|
29
28
|
"dependencies": {
|
|
30
29
|
"@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/
|
|
35
|
-
"@dbx-tools/shared-
|
|
30
|
+
"@dbx-tools/appkit": "0.6.123",
|
|
31
|
+
"@dbx-tools/auth": "0.6.123",
|
|
32
|
+
"@dbx-tools/core": "0.6.123",
|
|
33
|
+
"@dbx-tools/email": "0.6.123",
|
|
34
|
+
"@dbx-tools/shared-auth": "0.6.123",
|
|
35
|
+
"@dbx-tools/shared-core": "0.6.123",
|
|
36
36
|
"http-proxy-3": "^1.23.1"
|
|
37
37
|
},
|
|
38
38
|
"main": "./lib/index.js",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"./package.json": "./package.json"
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
|
-
"version": "0.6.
|
|
52
|
+
"version": "0.6.123",
|
|
53
53
|
"types": "./lib/index.d.ts",
|
|
54
54
|
"type": "module",
|
|
55
55
|
"exports": {
|
package/src/frp.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { delimiter, join } from "node:path";
|
|
|
17
17
|
import { bin, config } from "@dbx-tools/core";
|
|
18
18
|
import { log } from "@dbx-tools/shared-core";
|
|
19
19
|
import { TUNNEL_CONFIG } from "./_config.ts";
|
|
20
|
+
import { superviseProcessForever, type ProcessSupervisor } from "./supervisor.ts";
|
|
20
21
|
|
|
21
22
|
const logger = log.logger("tunnel:frp");
|
|
22
23
|
const FRP_VERSION = "0.68.1";
|
|
@@ -175,6 +176,7 @@ export async function writeFrpConfig(
|
|
|
175
176
|
`serverAddr = ${tomlString(resolved.server)}`,
|
|
176
177
|
`serverPort = ${resolved.serverPort}`,
|
|
177
178
|
`transport.protocol = ${tomlString(resolved.protocol)}`,
|
|
179
|
+
"loginFailExit = false",
|
|
178
180
|
];
|
|
179
181
|
if (resolved.token) lines.push(`auth.token = ${tomlString(resolved.token)}`);
|
|
180
182
|
lines.push(
|
|
@@ -202,3 +204,15 @@ export function startFrp(
|
|
|
202
204
|
);
|
|
203
205
|
return spawn("frpc", ["-c", configPath], { env: childEnv, stdio: "inherit" });
|
|
204
206
|
}
|
|
207
|
+
|
|
208
|
+
export function superviseFrp(
|
|
209
|
+
resolved: FrpConfig,
|
|
210
|
+
childEnv: NodeJS.ProcessEnv,
|
|
211
|
+
configPath: string,
|
|
212
|
+
): ProcessSupervisor {
|
|
213
|
+
return superviseProcessForever({
|
|
214
|
+
name: "frpc",
|
|
215
|
+
logger,
|
|
216
|
+
start: () => startFrp(resolved, childEnv, configPath),
|
|
217
|
+
});
|
|
218
|
+
}
|
package/src/interceptor.ts
CHANGED
|
@@ -17,11 +17,10 @@
|
|
|
17
17
|
* @module
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import type { ChildProcess } from "node:child_process";
|
|
21
20
|
import type { Interceptor, InterceptorContext } from "@dbx-tools/appkit";
|
|
22
21
|
import { log, object } from "@dbx-tools/shared-core";
|
|
23
|
-
import { installFrp, resolveFrpConfig,
|
|
24
|
-
import { installPortr, resolvePortrConfig,
|
|
22
|
+
import { installFrp, resolveFrpConfig, superviseFrp, writeFrpConfig } from "./frp.ts";
|
|
23
|
+
import { installPortr, resolvePortrConfig, supervisePortr, writePortrConfig } from "./portr.ts";
|
|
25
24
|
import { startPathProxy } from "./path-proxy.ts";
|
|
26
25
|
|
|
27
26
|
const logger = log.logger("tunnel:interceptor");
|
|
@@ -100,7 +99,7 @@ export function tunnelInterceptor(options: TunnelInterceptorOptions = {}): Inter
|
|
|
100
99
|
|
|
101
100
|
const port = resolvePublicPort(options.port);
|
|
102
101
|
const transport = resolveTunnelTransport(options.transport);
|
|
103
|
-
const
|
|
102
|
+
const auxiliaries: Array<{ stop(): void }> = [];
|
|
104
103
|
if (transport === "portr" || transport === "both") {
|
|
105
104
|
const portrConfig = resolvePortrConfig({
|
|
106
105
|
publicDomain: options.publicDomain,
|
|
@@ -110,7 +109,7 @@ export function tunnelInterceptor(options: TunnelInterceptorOptions = {}): Inter
|
|
|
110
109
|
if (portrConfig) {
|
|
111
110
|
const portrEnv = await installPortr();
|
|
112
111
|
await writePortrConfig(portrConfig, portrEnv);
|
|
113
|
-
|
|
112
|
+
auxiliaries.push(supervisePortr(portrConfig, portrEnv));
|
|
114
113
|
} else {
|
|
115
114
|
logger.info("portr not configured (requires PORTR_TOKEN and TUNNEL_PUBLIC_DOMAIN)");
|
|
116
115
|
}
|
|
@@ -138,15 +137,17 @@ export function tunnelInterceptor(options: TunnelInterceptorOptions = {}): Inter
|
|
|
138
137
|
}
|
|
139
138
|
const frpEnv = await installFrp();
|
|
140
139
|
const configPath = await writeFrpConfig(frpConfig, frpEnv);
|
|
141
|
-
|
|
140
|
+
auxiliaries.push(superviseFrp(frpConfig, frpEnv, configPath));
|
|
142
141
|
} else {
|
|
143
142
|
logger.info("frp not configured (requires TUNNEL_PUBLIC_DOMAIN)");
|
|
144
143
|
}
|
|
145
144
|
}
|
|
146
|
-
if (!
|
|
147
|
-
|
|
145
|
+
if (!auxiliaries.length) return;
|
|
146
|
+
ctx.onTeardown(() => {
|
|
147
|
+
for (const auxiliary of auxiliaries) auxiliary.stop();
|
|
148
|
+
});
|
|
148
149
|
ctx.onLifecycle("shutdown", () => {
|
|
149
|
-
for (const
|
|
150
|
+
for (const auxiliary of auxiliaries) auxiliary.stop();
|
|
150
151
|
});
|
|
151
152
|
logger.info(`tunnel bound: ${transport} -> :${port}`);
|
|
152
153
|
};
|
package/src/plugin.ts
CHANGED
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
ResourceType,
|
|
26
26
|
} from "@databricks/appkit";
|
|
27
27
|
import { plugin as appkitPlugin } from "@dbx-tools/appkit";
|
|
28
|
+
import { brand as appkitBrand } from "@dbx-tools/appkit";
|
|
28
29
|
import {
|
|
29
30
|
auth as passwordlessAuth,
|
|
30
31
|
storage as authStorage,
|
|
@@ -356,7 +357,7 @@ export class AuthGatePlugin extends Plugin<AuthGateConfig> {
|
|
|
356
357
|
} satisfies PluginManifest<"authGate">;
|
|
357
358
|
|
|
358
359
|
private resolved!: ResolvedAuthGateConfig;
|
|
359
|
-
private
|
|
360
|
+
private readonly runtimes = new Map<string, PasswordlessAuthRuntime>();
|
|
360
361
|
|
|
361
362
|
static getResourceRequirements(config: AuthGateConfig): ResourceRequirement[] {
|
|
362
363
|
if (authStorage.resolveAuthStorageConfig(config).mode !== "lakebase") return [];
|
|
@@ -378,32 +379,40 @@ export class AuthGatePlugin extends Plugin<AuthGateConfig> {
|
|
|
378
379
|
|
|
379
380
|
override async setup(): Promise<void> {
|
|
380
381
|
this.resolved = resolveAuthGateConfig(this.config);
|
|
382
|
+
if (!this.config.brandName && !coreConfig.text("AUTH_BRAND_NAME", TUNNEL_CONFIG)) {
|
|
383
|
+
this.resolved.brandName = appkitBrand.getBrandContext().name;
|
|
384
|
+
}
|
|
381
385
|
|
|
382
386
|
if (this.resolved.insecure) {
|
|
383
387
|
logger.warn("insecure mode - the tunnel runs OPEN with no auth gate");
|
|
384
388
|
} else {
|
|
385
389
|
const lakebasePlugin = appkitPlugin.instance(this.context, lakebase);
|
|
386
|
-
const storage = await authStorage.createAuthStorage(
|
|
387
|
-
this.resolved,
|
|
388
|
-
lakebasePlugin?.exports().pool,
|
|
389
|
-
);
|
|
390
390
|
const { key } = await signingKey(this.resolved.sessionCutoffMs);
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
391
|
+
const origins = this.resolved.publicDomains.length
|
|
392
|
+
? this.resolved.publicDomains.map(authOrigin)
|
|
393
|
+
: [authOrigin(this.resolved.publicDomain)];
|
|
394
|
+
for (const origin of new Set(origins)) {
|
|
395
|
+
const storage = await authStorage.createAuthStorage(
|
|
396
|
+
this.resolved,
|
|
397
|
+
lakebasePlugin?.exports().pool,
|
|
398
|
+
);
|
|
399
|
+
this.runtimes.set(new URL(origin).host.toLowerCase(), await passwordlessAuth.createPasswordlessAuth({
|
|
400
|
+
storage,
|
|
401
|
+
baseURL: origin,
|
|
402
|
+
basePath: "/api/email/auth",
|
|
403
|
+
appName: this.resolved.brandName,
|
|
404
|
+
secret: Buffer.from(key).toString("base64url"),
|
|
405
|
+
sessionTtlSeconds: this.resolved.sessionTtlSeconds,
|
|
406
|
+
sessionCutoffMs: this.resolved.sessionCutoffMs,
|
|
407
|
+
logoutRedirectPath: this.resolved.logoutRedirectPath,
|
|
408
|
+
codeTtlSeconds: this.resolved.codeTtlSeconds,
|
|
409
|
+
maxAttempts: this.resolved.maxAttempts,
|
|
410
|
+
authorizeIdentity: (email) => this.authorizeIdentity(email),
|
|
411
|
+
sendCode: (email, code, options) => this.sendCode(email, code, options),
|
|
412
|
+
subject: this.resolved.subject,
|
|
413
|
+
message: this.resolved.message,
|
|
414
|
+
}));
|
|
415
|
+
}
|
|
407
416
|
// `server()` is deferred, so it does not exist during this plugin's setup.
|
|
408
417
|
// At `setup:complete` the Express app exists but has not injected plugin
|
|
409
418
|
// routes or static handling yet, which is the one point the gate can mount
|
|
@@ -431,7 +440,8 @@ export class AuthGatePlugin extends Plugin<AuthGateConfig> {
|
|
|
431
440
|
}
|
|
432
441
|
|
|
433
442
|
async shutdown(): Promise<void> {
|
|
434
|
-
await this.runtime
|
|
443
|
+
await Promise.all([...this.runtimes.values()].map((runtime) => runtime.close()));
|
|
444
|
+
this.runtimes.clear();
|
|
435
445
|
}
|
|
436
446
|
|
|
437
447
|
/**
|
|
@@ -467,16 +477,19 @@ export class AuthGatePlugin extends Plugin<AuthGateConfig> {
|
|
|
467
477
|
}
|
|
468
478
|
|
|
469
479
|
override exports(): AuthGateApi {
|
|
470
|
-
const runtime =
|
|
480
|
+
const runtime = (headers?: Headers, request?: Request) => {
|
|
481
|
+
const host = (headers?.get("host") ?? (request ? new URL(request.url).host : "")).toLowerCase();
|
|
482
|
+
return this.runtimes.get(host) ?? this.runtimes.values().next().value;
|
|
483
|
+
};
|
|
471
484
|
return {
|
|
472
|
-
passkeysEnabled:
|
|
485
|
+
passkeysEnabled: [...this.runtimes.values()].some((entry) => entry.passkeysEnabled),
|
|
473
486
|
handler: (request) =>
|
|
474
|
-
runtime?.handler(request) ?? Promise.resolve(new Response("Not Found", { status: 404 })),
|
|
475
|
-
session: (headers) => runtime?.session(headers) ?? Promise.resolve(undefined),
|
|
487
|
+
runtime(request.headers, request)?.handler(request) ?? Promise.resolve(new Response("Not Found", { status: 404 })),
|
|
488
|
+
session: (headers) => runtime(headers)?.session(headers) ?? Promise.resolve(undefined),
|
|
476
489
|
status: (headers) =>
|
|
477
|
-
runtime?.status(headers) ??
|
|
490
|
+
runtime(headers)?.status(headers) ??
|
|
478
491
|
Promise.resolve({ authenticated: false, enabled: false, passkeysEnabled: false }),
|
|
479
|
-
close: () =>
|
|
492
|
+
close: () => this.shutdown(),
|
|
480
493
|
};
|
|
481
494
|
}
|
|
482
495
|
}
|
package/src/portr.ts
CHANGED
|
@@ -18,6 +18,7 @@ import { promisify } from "node:util";
|
|
|
18
18
|
import { bin, config } from "@dbx-tools/core";
|
|
19
19
|
import { log } from "@dbx-tools/shared-core";
|
|
20
20
|
import { TUNNEL_CONFIG } from "./_config.ts";
|
|
21
|
+
import { superviseProcessForever, type ProcessSupervisor } from "./supervisor.ts";
|
|
21
22
|
|
|
22
23
|
const logger = log.logger("tunnel:portr");
|
|
23
24
|
const PORTR_VERSION = "1.0.15-sse.2";
|
|
@@ -141,3 +142,11 @@ export async function startPortr(
|
|
|
141
142
|
logger.info(`portr tunneling https://${config.subdomain}.${config.server} -> :${config.port}`);
|
|
142
143
|
return spawn("portr", ["start"], { env: childEnv, stdio: "inherit" });
|
|
143
144
|
}
|
|
145
|
+
|
|
146
|
+
export function supervisePortr(config: PortrConfig, childEnv: NodeJS.ProcessEnv): ProcessSupervisor {
|
|
147
|
+
return superviseProcessForever({
|
|
148
|
+
name: "portr",
|
|
149
|
+
logger,
|
|
150
|
+
start: () => startPortr(config, childEnv),
|
|
151
|
+
});
|
|
152
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { ChildProcess } from "node:child_process";
|
|
2
|
+
import { async as asyncTools, type Logger } from "@dbx-tools/shared-core";
|
|
3
|
+
|
|
4
|
+
const STABLE_CONNECTION_MS = 60_000;
|
|
5
|
+
|
|
6
|
+
export interface ProcessSupervisor {
|
|
7
|
+
stop(): void;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
type ProcessOutcome = {
|
|
11
|
+
code?: number | null;
|
|
12
|
+
signal?: NodeJS.Signals | null;
|
|
13
|
+
error?: unknown;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export function superviseProcessForever(options: {
|
|
17
|
+
name: string;
|
|
18
|
+
logger: Logger;
|
|
19
|
+
start: () => ChildProcess | Promise<ChildProcess>;
|
|
20
|
+
retryDelaysMs?: readonly number[];
|
|
21
|
+
}): ProcessSupervisor {
|
|
22
|
+
const controller = new AbortController();
|
|
23
|
+
let child: ChildProcess | undefined;
|
|
24
|
+
|
|
25
|
+
const stop = () => {
|
|
26
|
+
if (controller.signal.aborted) return;
|
|
27
|
+
controller.abort();
|
|
28
|
+
if (child && !child.killed) child.kill("SIGTERM");
|
|
29
|
+
process.off("exit", onProcessExit);
|
|
30
|
+
};
|
|
31
|
+
const onProcessExit = () => {
|
|
32
|
+
if (child && !child.killed) child.kill("SIGTERM");
|
|
33
|
+
};
|
|
34
|
+
process.once("exit", onProcessExit);
|
|
35
|
+
|
|
36
|
+
const run = async () => {
|
|
37
|
+
let failures = 0;
|
|
38
|
+
while (!controller.signal.aborted) {
|
|
39
|
+
const startedAt = Date.now();
|
|
40
|
+
let outcome: ProcessOutcome;
|
|
41
|
+
try {
|
|
42
|
+
child = await options.start();
|
|
43
|
+
outcome = await processOutcome(child, controller.signal);
|
|
44
|
+
} catch (error) {
|
|
45
|
+
outcome = { error };
|
|
46
|
+
} finally {
|
|
47
|
+
child = undefined;
|
|
48
|
+
}
|
|
49
|
+
if (controller.signal.aborted) return;
|
|
50
|
+
if (Date.now() - startedAt >= STABLE_CONNECTION_MS) failures = 0;
|
|
51
|
+
const delayMs = asyncTools.boundedRetryDelay(failures++, options.retryDelaysMs);
|
|
52
|
+
options.logger.warn(`${options.name} stopped; retrying`, { ...outcome, delayMs });
|
|
53
|
+
try {
|
|
54
|
+
await asyncTools.sleep(delayMs, controller.signal);
|
|
55
|
+
} catch {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
void run().catch((error) => options.logger.error(`${options.name} supervisor failed`, { error }));
|
|
62
|
+
return {
|
|
63
|
+
stop,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function processOutcome(child: ChildProcess, signal: AbortSignal): Promise<ProcessOutcome> {
|
|
68
|
+
return new Promise((resolve) => {
|
|
69
|
+
const finish = (outcome: ProcessOutcome) => {
|
|
70
|
+
child.off("exit", onExit);
|
|
71
|
+
child.off("error", onError);
|
|
72
|
+
signal.removeEventListener("abort", onAbort);
|
|
73
|
+
resolve(outcome);
|
|
74
|
+
};
|
|
75
|
+
const onExit = (code: number | null, exitSignal: NodeJS.Signals | null) =>
|
|
76
|
+
finish({ code, signal: exitSignal });
|
|
77
|
+
const onError = (error: Error) => {
|
|
78
|
+
if (!child.killed) child.kill("SIGTERM");
|
|
79
|
+
finish({ error });
|
|
80
|
+
};
|
|
81
|
+
const onAbort = () => {
|
|
82
|
+
if (!child.killed) child.kill("SIGTERM");
|
|
83
|
+
finish({ signal: "SIGTERM" });
|
|
84
|
+
};
|
|
85
|
+
child.once("exit", onExit);
|
|
86
|
+
child.once("error", onError);
|
|
87
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
88
|
+
});
|
|
89
|
+
}
|