@dbx-tools/cli-tunnel 0.6.90 → 0.6.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @dbx-tools/cli-tunnel
2
2
 
3
3
  Wrap any command in a public [portr](https://github.com/amalshaji/portr) tunnel
4
- fronted by an email one-time-code gate.
4
+ fronted by [`@dbx-tools/auth`](../../node/auth) email OTP and passkeys.
5
5
 
6
6
  Run `dbx tunnel -- <command>` when a local or self-hosted process needs a public
7
7
  URL that only approved email addresses can reach. The wrapper claims the public
@@ -11,13 +11,16 @@ about.
11
11
 
12
12
  Key features:
13
13
 
14
- - Public portr tunnel + email-OTP gate around a command the wrapper does not
15
- have to modify, import, or even be written in the same language as.
14
+ - Public portr tunnel + Better Auth passwordless gate around a command the
15
+ wrapper does not have to modify, import, or even be written in the same
16
+ language as.
16
17
  - A reverse proxy that answers the login routes itself and forwards only
17
18
  verified traffic to the wrapped process.
18
19
  - Flag → environment → `databricks.yml` resolution for every gate and portr
19
20
  setting, delegated to [`@dbx-tools/tunnel`](../../node/tunnel) so the CLI
20
21
  cannot drift from the in-process plugin.
22
+ - The same server-less `appkit.createApp` lifecycle as plugin mode. It can
23
+ register native `lakebase()` without `server()`, or use local SQLite.
21
24
  - `status` to print exactly what would happen without starting anything.
22
25
  - Two-way process supervision: a crashed child takes the tunnel down instead of
23
26
  leaving portr serving a dead port.
@@ -109,6 +112,8 @@ Omitted values fall back to the environment, a `.env` file, then
109
112
  | `--session-ttl <seconds>` | session lifetime |
110
113
  | `--code-ttl <seconds>` | one-time-code lifetime |
111
114
  | `--session-cutoff <when>` | invalidate every session issued before this |
115
+ | `--auth-storage <mode>` | Better Auth database: `auto`, `lakebase`, or `sqlite` |
116
+ | `--auth-sqlite-path <path>` | local Better Auth SQLite file |
112
117
  | `--forward-headers <pats...>` | extra `x-` headers tunnel traffic may forward |
113
118
  | `--insecure` | run open, with no gate |
114
119
 
package/index.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
+ export const PACKAGE_IDENTIFIER = "@dbx-tools/cli-tunnel";
5
6
  export * as app from "./src/app.ts";
6
7
  export * as cli from "./src/cli.ts";
7
8
  export * as options from "./src/options.ts";
package/lib/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cli-tunnel";
1
2
  export * as app from "./src/app.ts";
2
3
  export * as cli from "./src/cli.ts";
3
4
  export * as options from "./src/options.ts";
package/lib/index.js CHANGED
@@ -1,9 +1,10 @@
1
1
  // GENERATED by projen watch - DO NOT EDIT.
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
+ export const PACKAGE_IDENTIFIER = "@dbx-tools/cli-tunnel";
4
5
  export * as app from "./src/app.js";
5
6
  export * as cli from "./src/cli.js";
6
7
  export * as options from "./src/options.js";
7
8
  export * as proxy from "./src/proxy.js";
8
9
  export { CommanderError } from "./src/cli.js";
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCAqIGFzIGFwcCBmcm9tIFwiLi9zcmMvYXBwLnRzXCI7XG5leHBvcnQgKiBhcyBjbGkgZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgb3B0aW9ucyBmcm9tIFwiLi9zcmMvb3B0aW9ucy50c1wiO1xuZXhwb3J0ICogYXMgcHJveHkgZnJvbSBcIi4vc3JjL3Byb3h5LnRzXCI7XG5leHBvcnQgeyBDb21tYW5kZXJFcnJvciB9IGZyb20gXCIuL3NyYy9jbGkudHNcIjtcbmV4cG9ydCB0eXBlIHsgVHVubmVsT3B0aW9ucywgUmVzb2x2ZWRUdW5uZWxPcHRpb25zIH0gZnJvbSBcIi4vc3JjL29wdGlvbnMudHNcIjtcbmV4cG9ydCB0eXBlIHsgUHJveHlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3Byb3h5LnRzXCI7XG4iXX0=
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvY2xpLXR1bm5lbFwiO1xuZXhwb3J0ICogYXMgYXBwIGZyb20gXCIuL3NyYy9hcHAudHNcIjtcbmV4cG9ydCAqIGFzIGNsaSBmcm9tIFwiLi9zcmMvY2xpLnRzXCI7XG5leHBvcnQgKiBhcyBvcHRpb25zIGZyb20gXCIuL3NyYy9vcHRpb25zLnRzXCI7XG5leHBvcnQgKiBhcyBwcm94eSBmcm9tIFwiLi9zcmMvcHJveHkudHNcIjtcbmV4cG9ydCB7IENvbW1hbmRlckVycm9yIH0gZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0IHR5cGUgeyBUdW5uZWxPcHRpb25zLCBSZXNvbHZlZFR1bm5lbE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb3B0aW9ucy50c1wiO1xuZXhwb3J0IHR5cGUgeyBQcm94eU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcHJveHkudHNcIjtcbiJdfQ==
package/lib/src/app.js CHANGED
@@ -14,17 +14,33 @@
14
14
  *
15
15
  * @module
16
16
  */
17
+ import { lakebase } from "@databricks/appkit";
17
18
  import { appkit } from "@dbx-tools/appkit";
19
+ import { storage as authStorage } from "@dbx-tools/auth";
18
20
  import { email } from "@dbx-tools/email";
21
+ import { object } from "@dbx-tools/shared-core";
19
22
  import { authGate } from "@dbx-tools/tunnel";
20
23
  /** Boot the gate app and return the handlers the proxy authenticates against. */
21
24
  export async function startGateApp(config) {
22
25
  // No `server()` plugin: nothing here listens. `plugins` order matters - `email`
23
26
  // registers its transport before `authGate` looks for a sibling to send with.
24
- const plugins = await appkit.createApp({ plugins: [email(), authGate(config)] });
25
- const api = plugins.authGate;
26
- if (!api)
27
+ const plugins = await appkit.createApp({
28
+ plugins: [
29
+ ...(authStorage.shouldUseLakebase(config) ? [lakebase()] : []),
30
+ ...(config.sendCode ? [] : [email()]),
31
+ authGate(config),
32
+ ],
33
+ });
34
+ const api = Reflect.get(plugins, "authGate");
35
+ if (!isAuthGateApi(api))
27
36
  throw new Error("the authGate plugin exposed no api");
28
37
  return api;
29
38
  }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQXlDLE1BQU0sbUJBQW1CLENBQUM7QUFFcEYsaUZBQWlGO0FBQ2pGLE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUFDLE1BQXNCO0lBQ3ZELGdGQUFnRjtJQUNoRiw4RUFBOEU7SUFDOUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFtQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxHQUFHO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ2hFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIEdBVEUgaGFsZiBvZiB0aGUgd3JhcHBlcjogYSBzZXJ2ZXItbGVzcyBBcHBLaXQgYXBwIHdob3NlIG9ubHkgam9iIGlzIHRvXG4gKiBleHBvc2UgdGhlIGBhdXRoR2F0ZWAgaGFuZGxlcnMgdGhlIHByb3h5IGNhbGxzLlxuICpcbiAqIFRoZSBpbi1wcm9jZXNzIHBsdWdpbiBwYXRoIChgYXV0aEdhdGVgIGluIHRoZSBhcHAncyBvd24gYHBsdWdpbnNgKSBoYXMgYSByZWFsXG4gKiBIVFRQIHNlcnZlciB0byBtb3VudCByb3V0ZXMgb24uIEEgd3JhcHBlciBkb2VzIG5vdCAtIHRoZSBhcHAgaXQgZnJvbnRzIGlzIGFcbiAqIHNlcGFyYXRlIHByb2Nlc3MgaXQgbXVzdCBub3QgcmVhY2ggaW50byAtIHNvIHRoZSBnYXRlJ3MgbG9naW4gcm91dGVzIGxpdmUgb25cbiAqIHRoZSBwcm94eSBpbnN0ZWFkLCBhbmQgdGhpcyBhcHAgZXhpc3RzIHB1cmVseSB0byBnaXZlIHRoZSBwbHVnaW4gdGhlIHJ1bnRpbWUgaXRcbiAqIG5lZWRzOiBhIGBDYWNoZU1hbmFnZXJgIGZvciB0aGUgb25lLXRpbWUtY29kZSBzdG9yZSBhbmQgc2lnbmluZyBrZXksIGFuZCB0aGVcbiAqIHNpYmxpbmcgYGVtYWlsYCBwbHVnaW4ncyB0cmFuc3BvcnQgZm9yIGRlbGl2ZXJpbmcgYSBjb2RlLlxuICpcbiAqIExhemlseSBpbXBvcnRlZCBieSBgY2xpLnRzYCwgc28gYGRieCB0dW5uZWwgLS1pbnNlY3VyZWAgKGFuZCBgaW5zdGFsbGAgL1xuICogYHN0YXR1c2ApIG5ldmVyIGxvYWQgQXBwS2l0LCB0aGUgRGF0YWJyaWNrcyBTREssIG9yIHRoZSBTTVRQIHN0YWNrLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGVtYWlsIH0gZnJvbSBcIkBkYngtdG9vbHMvZW1haWxcIjtcbmltcG9ydCB7IGF1dGhHYXRlLCB0eXBlIEF1dGhHYXRlQXBpLCB0eXBlIEF1dGhHYXRlQ29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvdHVubmVsXCI7XG5cbi8qKiBCb290IHRoZSBnYXRlIGFwcCBhbmQgcmV0dXJuIHRoZSBoYW5kbGVycyB0aGUgcHJveHkgYXV0aGVudGljYXRlcyBhZ2FpbnN0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0R2F0ZUFwcChjb25maWc6IEF1dGhHYXRlQ29uZmlnKTogUHJvbWlzZTxBdXRoR2F0ZUFwaT4ge1xuICAvLyBObyBgc2VydmVyKClgIHBsdWdpbjogbm90aGluZyBoZXJlIGxpc3RlbnMuIGBwbHVnaW5zYCBvcmRlciBtYXR0ZXJzIC0gYGVtYWlsYFxuICAvLyByZWdpc3RlcnMgaXRzIHRyYW5zcG9ydCBiZWZvcmUgYGF1dGhHYXRlYCBsb29rcyBmb3IgYSBzaWJsaW5nIHRvIHNlbmQgd2l0aC5cbiAgY29uc3QgcGx1Z2lucyA9IGF3YWl0IGFwcGtpdC5jcmVhdGVBcHAoeyBwbHVnaW5zOiBbZW1haWwoKSwgYXV0aEdhdGUoY29uZmlnKV0gfSk7XG4gIGNvbnN0IGFwaSA9IHBsdWdpbnMuYXV0aEdhdGUgYXMgQXV0aEdhdGVBcGkgfCB1bmRlZmluZWQ7XG4gIGlmICghYXBpKSB0aHJvdyBuZXcgRXJyb3IoXCJ0aGUgYXV0aEdhdGUgcGx1Z2luIGV4cG9zZWQgbm8gYXBpXCIpO1xuICByZXR1cm4gYXBpO1xufVxuIl19
39
+ function isAuthGateApi(value) {
40
+ return (object.isRecord(value) &&
41
+ typeof value.handler === "function" &&
42
+ typeof value.session === "function" &&
43
+ typeof value.status === "function" &&
44
+ typeof value.close === "function");
45
+ }
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLElBQUksV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUF5QyxNQUFNLG1CQUFtQixDQUFDO0FBRXBGLGlGQUFpRjtBQUNqRixNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FBQyxNQUFzQjtJQUN2RCxnRkFBZ0Y7SUFDaEYsOEVBQThFO0lBQzlFLE1BQU0sT0FBTyxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNyQyxPQUFPLEVBQUU7WUFDUCxHQUFHLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5RCxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDckMsUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUNqQjtLQUNGLENBQUMsQ0FBQztJQUNILE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQy9FLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDbkMsT0FBTyxDQUNMLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3RCLE9BQU8sS0FBSyxDQUFDLE9BQU8sS0FBSyxVQUFVO1FBQ25DLE9BQU8sS0FBSyxDQUFDLE9BQU8sS0FBSyxVQUFVO1FBQ25DLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxVQUFVO1FBQ2xDLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxVQUFVLENBQ2xDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgR0FURSBoYWxmIG9mIHRoZSB3cmFwcGVyOiBhIHNlcnZlci1sZXNzIEFwcEtpdCBhcHAgd2hvc2Ugb25seSBqb2IgaXMgdG9cbiAqIGV4cG9zZSB0aGUgYGF1dGhHYXRlYCBoYW5kbGVycyB0aGUgcHJveHkgY2FsbHMuXG4gKlxuICogVGhlIGluLXByb2Nlc3MgcGx1Z2luIHBhdGggKGBhdXRoR2F0ZWAgaW4gdGhlIGFwcCdzIG93biBgcGx1Z2luc2ApIGhhcyBhIHJlYWxcbiAqIEhUVFAgc2VydmVyIHRvIG1vdW50IHJvdXRlcyBvbi4gQSB3cmFwcGVyIGRvZXMgbm90IC0gdGhlIGFwcCBpdCBmcm9udHMgaXMgYVxuICogc2VwYXJhdGUgcHJvY2VzcyBpdCBtdXN0IG5vdCByZWFjaCBpbnRvIC0gc28gdGhlIGdhdGUncyBsb2dpbiByb3V0ZXMgbGl2ZSBvblxuICogdGhlIHByb3h5IGluc3RlYWQsIGFuZCB0aGlzIGFwcCBleGlzdHMgcHVyZWx5IHRvIGdpdmUgdGhlIHBsdWdpbiB0aGUgcnVudGltZSBpdFxuICogbmVlZHM6IGEgYENhY2hlTWFuYWdlcmAgZm9yIHRoZSBvbmUtdGltZS1jb2RlIHN0b3JlIGFuZCBzaWduaW5nIGtleSwgYW5kIHRoZVxuICogc2libGluZyBgZW1haWxgIHBsdWdpbidzIHRyYW5zcG9ydCBmb3IgZGVsaXZlcmluZyBhIGNvZGUuXG4gKlxuICogTGF6aWx5IGltcG9ydGVkIGJ5IGBjbGkudHNgLCBzbyBgZGJ4IHR1bm5lbCAtLWluc2VjdXJlYCAoYW5kIGBpbnN0YWxsYCAvXG4gKiBgc3RhdHVzYCkgbmV2ZXIgbG9hZCBBcHBLaXQsIHRoZSBEYXRhYnJpY2tzIFNESywgb3IgdGhlIFNNVFAgc3RhY2suXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGxha2ViYXNlIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBzdG9yYWdlIGFzIGF1dGhTdG9yYWdlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXV0aFwiO1xuaW1wb3J0IHsgZW1haWwgfSBmcm9tIFwiQGRieC10b29scy9lbWFpbFwiO1xuaW1wb3J0IHsgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGF1dGhHYXRlLCB0eXBlIEF1dGhHYXRlQXBpLCB0eXBlIEF1dGhHYXRlQ29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvdHVubmVsXCI7XG5cbi8qKiBCb290IHRoZSBnYXRlIGFwcCBhbmQgcmV0dXJuIHRoZSBoYW5kbGVycyB0aGUgcHJveHkgYXV0aGVudGljYXRlcyBhZ2FpbnN0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0R2F0ZUFwcChjb25maWc6IEF1dGhHYXRlQ29uZmlnKTogUHJvbWlzZTxBdXRoR2F0ZUFwaT4ge1xuICAvLyBObyBgc2VydmVyKClgIHBsdWdpbjogbm90aGluZyBoZXJlIGxpc3RlbnMuIGBwbHVnaW5zYCBvcmRlciBtYXR0ZXJzIC0gYGVtYWlsYFxuICAvLyByZWdpc3RlcnMgaXRzIHRyYW5zcG9ydCBiZWZvcmUgYGF1dGhHYXRlYCBsb29rcyBmb3IgYSBzaWJsaW5nIHRvIHNlbmQgd2l0aC5cbiAgY29uc3QgcGx1Z2lucyA9IGF3YWl0IGFwcGtpdC5jcmVhdGVBcHAoe1xuICAgIHBsdWdpbnM6IFtcbiAgICAgIC4uLihhdXRoU3RvcmFnZS5zaG91bGRVc2VMYWtlYmFzZShjb25maWcpID8gW2xha2ViYXNlKCldIDogW10pLFxuICAgICAgLi4uKGNvbmZpZy5zZW5kQ29kZSA/IFtdIDogW2VtYWlsKCldKSxcbiAgICAgIGF1dGhHYXRlKGNvbmZpZyksXG4gICAgXSxcbiAgfSk7XG4gIGNvbnN0IGFwaSA9IFJlZmxlY3QuZ2V0KHBsdWdpbnMsIFwiYXV0aEdhdGVcIik7XG4gIGlmICghaXNBdXRoR2F0ZUFwaShhcGkpKSB0aHJvdyBuZXcgRXJyb3IoXCJ0aGUgYXV0aEdhdGUgcGx1Z2luIGV4cG9zZWQgbm8gYXBpXCIpO1xuICByZXR1cm4gYXBpO1xufVxuXG5mdW5jdGlvbiBpc0F1dGhHYXRlQXBpKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQXV0aEdhdGVBcGkge1xuICByZXR1cm4gKFxuICAgIG9iamVjdC5pc1JlY29yZCh2YWx1ZSkgJiZcbiAgICB0eXBlb2YgdmFsdWUuaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIHZhbHVlLnNlc3Npb24gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiB2YWx1ZS5zdGF0dXMgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiB2YWx1ZS5jbG9zZSA9PT0gXCJmdW5jdGlvblwiXG4gICk7XG59XG4iXX0=
package/lib/src/cli.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `dbx tunnel` - front a command with a public portr tunnel and an email-OTP gate.
2
+ * `dbx tunnel` - front a command with a public portr tunnel and passwordless gate.
3
3
  *
4
4
  * This is the WRAPPER path, and it exists for one case: a project that does not
5
5
  * use `@dbx-tools/appkit`'s `createApp`, and therefore cannot register
package/lib/src/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `dbx tunnel` - front a command with a public portr tunnel and an email-OTP gate.
2
+ * `dbx tunnel` - front a command with a public portr tunnel and passwordless gate.
3
3
  *
4
4
  * This is the WRAPPER path, and it exists for one case: a project that does not
5
5
  * use `@dbx-tools/appkit`'s `createApp`, and therefore cannot register
@@ -66,6 +66,8 @@ function addOptions(command) {
66
66
  .option("--session-ttl <seconds>", "session lifetime")
67
67
  .option("--code-ttl <seconds>", "one-time-code lifetime")
68
68
  .option("--session-cutoff <when>", "invalidate every session issued before this")
69
+ .option("--auth-storage <mode>", "auth database: auto, lakebase, or sqlite")
70
+ .option("--auth-sqlite-path <path>", "local Better Auth SQLite file")
69
71
  .option("--forward-headers <patterns...>", "extra x- headers tunnel traffic may forward")
70
72
  .option("--insecure", "run open, with no gate");
71
73
  }
@@ -117,7 +119,10 @@ async function run(raw, command) {
117
119
  // an `--insecure` run never loads either.
118
120
  const gate = resolved.gate.insecure
119
121
  ? undefined
120
- : await (await import("./app.js")).startGateApp(resolved.gateConfig);
122
+ : await (await import("./app.js")).startGateApp({
123
+ ...resolved.gateConfig,
124
+ publicDomain: resolved.gate.publicDomain ?? `localhost:${resolved.publicPort}`,
125
+ });
121
126
  if (!gate)
122
127
  logger.warn("running OPEN - no gate is in front of this tunnel");
123
128
  await startProxy({
@@ -142,7 +147,7 @@ async function run(raw, command) {
142
147
  export function buildProgram(name = "dbx tunnel") {
143
148
  const program = addOptions(new Command()
144
149
  .name(name)
145
- .description("Front a command with a portr tunnel and an email-OTP gate"));
150
+ .description("Front a command with a portr tunnel and passwordless auth"));
146
151
  // `run` is the DEFAULT action as well as a named subcommand, preserving the old
147
152
  // wrapper's ergonomics (`dbx tunnel --allow x -- bun src/server.ts`) while
148
153
  // leaving somewhere for `status` and `install` to live.
@@ -171,4 +176,4 @@ export function buildProgram(name = "dbx tunnel") {
171
176
  });
172
177
  return program;
173
178
  }
174
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFBcUIsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxvQkFBb0IsRUFBc0IsTUFBTSxjQUFjLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4QyxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUM7QUFFMUIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVwQyxpRkFBaUY7QUFDakYsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFFaEM7Ozs7R0FJRztBQUNILFNBQVMsUUFBUTtJQUNmLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsTUFBTSxLQUFLLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDN0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRTtZQUNoQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxD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Q0FBQyxDQUFDLENBQUM7SUFFTCwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLCtDQUErQztJQUMvQyxVQUFVLENBQ1IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLENBQUMsd0NBQXdDLENBQUMsQ0FDaEYsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUF1QixFQUFFLEdBQVksRUFBRSxFQUFFO1FBQ2pELE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQWlCLENBQUMsQ0FBQztRQUNqRSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakUsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPO1NBQ0osT0FBTyxDQUFDLFNBQVMsQ0FBQztTQUNsQixXQUFXLENBQUMsbUNBQW1DLENBQUM7U0FDaEQsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLE1BQU0sS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdCLENBQUMsQ0FBQyxDQUFDO0lBRUwsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYGRieCB0dW5uZWxgIC0gZnJvbnQgYSBjb21tYW5kIHdpdGggYSBwdWJsaWMgcG9ydHIgdHVubmVsIGFuZCBhbiBlbWFpbC1PVFAgZ2F0ZS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBXUkFQUEVSIHBhdGgsIGFuZCBpdCBleGlzdHMgZm9yIG9uZSBjYXNlOiBhIHByb2plY3QgdGhhdCBkb2VzIG5vdFxuICogdXNlIGBAZGJ4LXRvb2xzL2FwcGtpdGAncyBgY3JlYXRlQXBwYCwgYW5kIHRoZXJlZm9yZSBjYW5ub3QgcmVnaXN0ZXJcbiAqIGB0dW5uZWxJbnRlcmNlcHRvcigpYCArIHRoZSBgYXV0aEdhdGVgIHBsdWdpbiBpbi1wcm9jZXNzLiBBbiBBcHBLaXQgYXBwIHNob3VsZFxuICogc3RpbGwgdGFrZSB0aGUgcGx1Z2luIHBhdGggLSBvbmUgcHJvY2Vzcywgbm8gcHJveHkgaG9wLCBubyBkdXBsaWNhdGVkIGhlYWRlclxuICogaGFuZGxpbmcuXG4gKlxuICogVGhlIHdyYXBwZXIgY2xhaW1zIHRoZSBQVUJMSUMgcG9ydCAoYERBVEFCUklDS1NfQVBQX1BPUlRgLCB0aGUgcG9ydCB0aGVcbiAqIHBsYXRmb3JtIGFuZCBwb3J0ciByb3V0ZSB0byksIG1vdmVzIHRoZSB3cmFwcGVkIGFwcCB0byBhIHByaXZhdGUgb25lLCBhbmRcbiAqIHJldmVyc2UtcHJveGllcyBiZXR3ZWVuIHRoZW0gc28gdGhlIGdhdGUgc2l0cyBpbiBmcm9udCBvZiB0cmFmZmljIGl0IHdvdWxkXG4gKiBvdGhlcndpc2UgaGF2ZSBubyB3YXkgdG8gaW50ZXJjZXB0LiBFdmVyeXRoaW5nIGVsc2UgaXMgZGVsZWdhdGVkOiB0aGUgZ2F0ZVxuICogY29uZmlnIGNvbWVzIGZyb20gYHBsdWdpbi5yZXNvbHZlQXV0aEdhdGVDb25maWdgLCB0aGUgcG9ydHIgbGlmZWN5Y2xlIGZyb21cbiAqIGBwb3J0ci4qYCAtIGJvdGggdGhlIHNhbWUgZnVuY3Rpb25zIHRoZSBpbi1wcm9jZXNzIHBhdGggdXNlcy5cbiAqXG4gKiBTaGlwcyBubyBiaW4uIGBAZGJ4LXRvb2xzL2NsaWAgbW91bnRzIGBidWlsZFByb2dyYW0oKWAgYXMgYGRieCB0dW5uZWxgIGxhemlseSxcbiAqIHNvIGBkYnggZGV2YCBwYXlzIGZvciBub25lIG9mIHRoaXMsIGFuZCBgLS1pbnNlY3VyZWAgLyBgc3RhdHVzYCAvIGBpbnN0YWxsYFxuICogbmV2ZXIgbG9hZCBBcHBLaXQgb3IgdGhlIFNNVFAgc3RhY2sgZWl0aGVyICh0aGUgZ2F0ZSBhcHAgaXMgYmVoaW5kIGEgZHluYW1pY1xuICogaW1wb3J0KS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBDaGlsZFByb2Nlc3MsIHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSBcIm5vZGU6bmV0XCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgcG9ydHIgfSBmcm9tIFwiQGRieC10b29scy90dW5uZWxcIjtcbmltcG9ydCB7IENvbW1hbmQsIENvbW1hbmRlckVycm9yIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgcmVzb2x2ZVR1bm5lbE9wdGlvbnMsIHR5cGUgVHVubmVsT3B0aW9ucyB9IGZyb20gXCIuL29wdGlvbnMudHNcIjtcbmltcG9ydCB7IHN0YXJ0UHJveHkgfSBmcm9tIFwiLi9wcm94eS50c1wiO1xuXG5leHBvcnQgeyBDb21tYW5kZXJFcnJvciB9O1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwidHVubmVsXCIpO1xuXG4vKiogSG93IGxvbmcgYSBjaGlsZCBnZXRzIHRvIGV4aXQgb24gU0lHVEVSTSBiZWZvcmUgdGhlIHdyYXBwZXIgbGVhdmVzIGFueXdheS4gKi9cbmNvbnN0IFNIVVRET1dOX0dSQUNFX01TID0gM18wMDA7XG5cbi8qKlxuICogQSBmcmVlIGxvb3BiYWNrIHBvcnQsIGZyb20gdGhlIE9TIHJhdGhlciB0aGFuIGEgcmFuZG9tIGd1ZXNzOiBiaW5kaW5nIGAwYCBhbmRcbiAqIHJlYWRpbmcgYmFjayB3aGF0IHdhcyBhc3NpZ25lZCBpcyB0aGUgb25seSB3YXkgdG8ga25vdyB0aGUgcG9ydCBpcyBhY3R1YWxseVxuICogYXZhaWxhYmxlLCBzbyB0d28gdHVubmVscyBjYW4gcnVuIHNpZGUgYnkgc2lkZSB3aXRob3V0IGNvbGxpZGluZy5cbiAqL1xuZnVuY3Rpb24gZnJlZVBvcnQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBwcm9iZSA9IGNyZWF0ZVNlcnZlcigpO1xuICAgIHByb2JlLm9uKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICBwcm9iZS5saXN0ZW4oMCwgXCIxMjcuMC4wLjFcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHByb2JlLmFkZHJlc3MoKTtcbiAgICAgIGNvbnN0IHBvcnQgPSB0eXBlb2YgYWRkcmVzcyA9PT0gXCJvYmplY3RcIiAmJiBhZGRyZXNzID8gYWRkcmVzcy5wb3J0IDogMDtcbiAgICAgIHByb2JlLmNsb3NlKCgpID0+IChwb3J0ID4gMCA/IHJlc29sdmUocG9ydCkgOiByZWplY3QobmV3IEVycm9yKFwibm8gZnJlZSBwb3J0XCIpKSkpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFdmVyeSBnYXRlL3BvcnRyIGZsYWcuIERlY2xhcmVkIG9uIHRoZSByb290IGNvbW1hbmQgQU5EIG9uIGBydW5gL2BzdGF0dXNgIHNvXG4gKiBgZGJ4IHR1bm5lbCAtLWFsbG93IHggLS0gY21kYCBhbmQgYGRieCB0dW5uZWwgcnVuIC0tYWxsb3cgeCAtLSBjbWRgIGJlaGF2ZVxuICogaWRlbnRpY2FsbHkgLSBjb21tYW5kZXIgZG9lcyBub3QgaW5oZXJpdCBvcHRpb25zIGRvd253YXJkLlxuICovXG5mdW5jdGlvbiBhZGRPcHRpb25zKGNvbW1hbmQ6IENvbW1hbmQpOiBDb21tYW5kIHtcbiAgcmV0dXJuIGNvbW1hbmRcbiAgICAub3B0aW9uKFwiLS1wdWJsaWMtZG9tYWluIDxob3N0PlwiLCBcInBvcnRyIHB1YmxpYyBkb21haW4gKDxzdWJkb21haW4+LjxzZXJ2ZXI+KVwiKVxuICAgIC5vcHRpb24oXCItLXN1YmRvbWFpbiA8bmFtZT5cIiwgXCJwb3J0ciBzdWJkb21haW4gKGVsc2UgZGVyaXZlZCBmcm9tIHRoZSBwdWJsaWMgZG9tYWluKVwiKVxuICAgIC5vcHRpb24oXCItLXBvcnQgPHBvcnQ+XCIsIFwicHVibGljIHBvcnQgdGhlIHdyYXBwZXIgbGlzdGVucyBvblwiKVxuICAgIC5vcHRpb24oXCItLWFwcC1wb3J0IDxwb3J0PlwiLCBcInByaXZhdGUgcG9ydCB0aGUgd3JhcHBlZCBhcHAgaXMgdG9sZCB0byBiaW5kXCIpXG4gICAgLm9wdGlvbihcIi0tYWxsb3cgPHBhdHRlcm5zLi4uPlwiLCBcImVtYWlsIGFsbG93LWxpc3QgKGRvbWFpbiAvIGdsb2IgLyAvcmVnZXgvKVwiKVxuICAgIC5vcHRpb24oXCItLXN1YmplY3QgPHRleHQ+XCIsIFwidmVyaWZpY2F0aW9uIGVtYWlsIHN1YmplY3RcIilcbiAgICAub3B0aW9uKFwiLS1icmFuZC1uYW1lIDxuYW1lPlwiLCBcInZlcmlmaWNhdGlvbiBlbWFpbCBicmFuZCBuYW1lXCIpXG4gICAgLm9wdGlvbihcIi0tbWVzc2FnZSA8dGV4dD5cIiwgXCJ2ZXJpZmljYXRpb24gZW1haWwgbWVzc2FnZVwiKVxuICAgIC5vcHRpb24oXCItLXNlc3Npb24tdHRsIDxzZWNvbmRzPlwiLCBcInNlc3Npb24gbGlmZXRpbWVcIilcbiAgICAub3B0aW9uKFwiLS1jb2RlLXR0bCA8c2Vjb25kcz5cIiwgXCJvbmUtdGltZS1jb2RlIGxpZmV0aW1lXCIpXG4gICAgLm9wdGlvbihcIi0tc2Vzc2lvbi1jdXRvZmYgPHdoZW4+XCIsIFwiaW52YWxpZGF0ZSBldmVyeSBzZXNzaW9uIGlzc3VlZCBiZWZvcmUgdGhpc1wiKVxuICAgIC5vcHRpb24oXCItLWZvcndhcmQtaGVhZGVycyA8cGF0dGVybnMuLi4+XCIsIFwiZXh0cmEgeC0gaGVhZGVycyB0dW5uZWwgdHJhZmZpYyBtYXkgZm9yd2FyZFwiKVxuICAgIC5vcHRpb24oXCItLWluc2VjdXJlXCIsIFwicnVuIG9wZW4sIHdpdGggbm8gZ2F0ZVwiKTtcbn1cblxuLyoqXG4gKiBUaWUgdGhlIHdyYXBwZXIncyBsaWZldGltZSB0byBpdHMgY2hpbGRyZW4ncywgaW4gYm90aCBkaXJlY3Rpb25zOiBhIGNoaWxkIHRoYXRcbiAqIGV4aXRzIHRha2VzIHRoZSB3cmFwcGVyIGRvd24gd2l0aCBpdHMgY29kZSwgYW5kIGEgc2lnbmFsIHRvIHRoZSB3cmFwcGVyIGlzXG4gKiBmb3J3YXJkZWQgYmVmb3JlIGl0IGxlYXZlcy4gV2l0aG91dCB0aGlzIGEgY3Jhc2hlZCBhcHAgbGVhdmVzIGEgcG9ydHIgdHVubmVsXG4gKiBzZXJ2aW5nIGEgZGVhZCBwb3J0LCB3aGljaCBsb29rcyBsaWtlIGEgaGFuZyByYXRoZXIgdGhhbiBhIGZhaWx1cmUuXG4gKi9cbmZ1bmN0aW9uIHN1cGVydmlzZShjaGlsZHJlbjogcmVhZG9ubHkgQ2hpbGRQcm9jZXNzW10pOiB2b2lkIHtcbiAgbGV0IHN0b3BwaW5nID0gZmFsc2U7XG4gIGNvbnN0IHN0b3AgPSAoY29kZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgaWYgKHN0b3BwaW5nKSByZXR1cm47XG4gICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIGlmICghY2hpbGQua2lsbGVkKSBjaGlsZC5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHByb2Nlc3MuZXhpdChjb2RlKSwgU0hVVERPV05fR1JBQ0VfTVMpLnVucmVmKCk7XG4gIH07XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIGNoaWxkLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4gc3RvcChjb2RlID8/IDEpKTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgW1wiU0lHVEVSTVwiLCBcIlNJR0lOVFwiLCBcIlNJR0hVUFwiXSBhcyBjb25zdCkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiBzdG9wKDApKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBydW4ocmF3OiBUdW5uZWxPcHRpb25zLCBjb21tYW5kOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbZXhlY3V0YWJsZSwgLi4uYXJnc10gPSBjb21tYW5kO1xuICBpZiAoIWV4ZWN1dGFibGUpIHtcbiAgICB0aHJvdyBuZXcgQ29tbWFuZGVyRXJyb3IoMSwgXCJ0dW5uZWwubm8tY29tbWFuZFwiLCBcIm5vIGNvbW1hbmQgZ2l2ZW4gLSBwYXNzIGl0IGFmdGVyIGAtLWBcIik7XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlVHVubmVsT3B0aW9ucyhyYXcpO1xuXG4gIC8vIFRoZSB3cmFwcGVkIGFwcCBtdXN0IG5vdCBiZSByZWFjaGFibGUgZnJvbSBvdXRzaWRlOiBpdCBiaW5kcyBsb29wYmFjayBvbiBhXG4gIC8vIHByaXZhdGUgcG9ydCwgYW5kIHRoZSB3cmFwcGVyIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgdGFsa3MgdG8gaXQuIEFuXG4gIC8vIHVucmVzb2x2ZWQgYC0tYXBwLXBvcnRgIGJlY29tZXMgYSBmcmVlIGVwaGVtZXJhbCBwb3J0IHJhdGhlciB0aGFuIGEgZml4ZWRcbiAgLy8gZ3Vlc3MsIHNvIHR3byB0dW5uZWxzIGNhbiBydW4gc2lkZSBieSBzaWRlLlxuICBjb25zdCBhcHBQb3J0ID0gcmVzb2x2ZWQuYXBwUG9ydCA/PyAoYXdhaXQgZnJlZVBvcnQoKSk7XG4gIGNvbnN0IGFwcCA9IHNwYXduKGV4ZWN1dGFibGUsIGFyZ3MsIHtcbiAgICBlbnY6IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgREFUQUJSSUNLU19BUFBfUE9SVDogU3RyaW5nKGFwcFBvcnQpLFxuICAgICAgUE9SVDogU3RyaW5nKGFwcFBvcnQpLFxuICAgICAgSE9TVDogXCIxMjcuMC4wLjFcIixcbiAgICB9LFxuICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgfSk7XG4gIGNvbnN0IGNoaWxkcmVuOiBDaGlsZFByb2Nlc3NbXSA9IFthcHBdO1xuXG4gIC8vIER5bmFtaWMgaW1wb3J0OiB0aGUgZ2F0ZSBpcyB0aGUgb25seSB0aGluZyBoZXJlIHRoYXQgbmVlZHMgQXBwS2l0ICsgU01UUCwgc29cbiAgLy8gYW4gYC0taW5zZWN1cmVgIHJ1biBuZXZlciBsb2FkcyBlaXRoZXIuXG4gIGNvbnN0IGdhdGUgPSByZXNvbHZlZC5nYXRlLmluc2VjdXJlXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IGF3YWl0IChhd2FpdCBpbXBvcnQoXCIuL2FwcC50c1wiKSkuc3RhcnRHYXRlQXBwKHJlc29sdmVkLmdhdGVDb25maWcpO1xuICBpZiAoIWdhdGUpIGxvZ2dlci53YXJuKFwicnVubmluZyBPUEVOIC0gbm8gZ2F0ZSBpcyBpbiBmcm9udCBvZiB0aGlzIHR1bm5lbFwiKTtcblxuICBhd2FpdCBzdGFydFByb3h5KHtcbiAgICBwdWJsaWNQb3J0OiByZXNvbHZlZC5wdWJsaWNQb3J0LFxuICAgIGFwcFBvcnQsXG4gICAgZ2F0ZSxcbiAgICBmb3J3YXJkSGVhZGVyczogcmVzb2x2ZWQuZ2F0ZS5mb3J3YXJkSGVhZGVycyxcbiAgfSk7XG5cbiAgaWYgKHJlc29sdmVkLnBvcnRyKSB7XG4gICAgY29uc3QgcG9ydHJFbnYgPSBhd2FpdCBwb3J0ci5pbnN0YWxsUG9ydHIoKTtcbiAgICBhd2FpdCBwb3J0ci53cml0ZVBvcnRyQ29uZmlnKHJlc29sdmVkLnBvcnRyLCBwb3J0ckVudik7XG4gICAgY2hpbGRyZW4ucHVzaChhd2FpdCBwb3J0ci5zdGFydFBvcnRyKHJlc29sdmVkLnBvcnRyLCBwb3J0ckVudikpO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5pbmZvKFwibm8gUE9SVFJfVE9LRU4gLyBUVU5ORUxfUFVCTElDX0RPTUFJTiAtIHNlcnZpbmcgbG9jYWxseSBvbmx5XCIsIHtcbiAgICAgIHB1YmxpY1BvcnQ6IHJlc29sdmVkLnB1YmxpY1BvcnQsXG4gICAgfSk7XG4gIH1cbiAgc3VwZXJ2aXNlKGNoaWxkcmVuKTtcbn1cblxuLyoqIFRoZSBgZGJ4IHR1bm5lbGAgcHJvZ3JhbS4gTm8gc2lkZSBlZmZlY3RzIHVudGlsIHBhcnNlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByb2dyYW0obmFtZSA9IFwiZGJ4IHR1bm5lbFwiKTogQ29tbWFuZCB7XG4gIGNvbnN0IHByb2dyYW0gPSBhZGRPcHRpb25zKFxuICAgIG5ldyBDb21tYW5kKClcbiAgICAgIC5uYW1lKG5hbWUpXG4gICAgICAuZGVzY3JpcHRpb24oXCJGcm9udCBhIGNvbW1hbmQgd2l0aCBhIHBvcnRyIHR1bm5lbCBhbmQgYW4gZW1haWwtT1RQIGdhdGVcIiksXG4gICk7XG5cbiAgLy8gYHJ1bmAgaXMgdGhlIERFRkFVTFQgYWN0aW9uIGFzIHdlbGwgYXMgYSBuYW1lZCBzdWJjb21tYW5kLCBwcmVzZXJ2aW5nIHRoZSBvbGRcbiAgLy8gd3JhcHBlcidzIGVyZ29ub21pY3MgKGBkYnggdHVubmVsIC0tYWxsb3cgeCAtLSBidW4gc3JjL3NlcnZlci50c2ApIHdoaWxlXG4gIC8vIGxlYXZpbmcgc29tZXdoZXJlIGZvciBgc3RhdHVzYCBhbmQgYGluc3RhbGxgIHRvIGxpdmUuXG4gIHByb2dyYW1cbiAgICAuYXJndW1lbnQoXCJbY29tbWFuZC4uLl1cIiwgXCJ0aGUgY29tbWFuZCB0byB3cmFwLCBhZnRlciBgLS1gXCIpXG4gICAgLmFjdGlvbihhc3luYyAoY29tbWFuZDogc3RyaW5nW10sIF9vcHRpb25zOiBUdW5uZWxPcHRpb25zLCBjbWQ6IENvbW1hbmQpID0+IHtcbiAgICAgIGF3YWl0IHJ1bihjbWQub3B0czxUdW5uZWxPcHRpb25zPigpLCBjb21tYW5kKTtcbiAgICB9KTtcblxuICBhZGRPcHRpb25zKHByb2dyYW0uY29tbWFuZChcInJ1blwiKS5kZXNjcmlwdGlvbihcIldyYXAgYSBjb21tYW5kICh0aGUgZGVmYXVsdCBhY3Rpb24pXCIpKVxuICAgIC5hcmd1bWVudChcIjxjb21tYW5kLi4uPlwiLCBcInRoZSBjb21tYW5kIHRvIHdyYXAsIGFmdGVyIGAtLWBcIilcbiAgICAuYWN0aW9uKGFzeW5jIChjb21tYW5kOiBzdHJpbmdbXSwgX29wdGlvbnM6IFR1bm5lbE9wdGlvbnMsIGNtZDogQ29tbWFuZCkgPT4ge1xuICAgICAgYXdhaXQgcnVuKGNtZC5vcHRzPFR1bm5lbE9wdGlvbnM+KCksIGNvbW1hbmQpO1xuICAgIH0pO1xuXG4gIC8vIFdvcnRoIGl0cyBvd24gY29tbWFuZDogdGhlIG1vc3QgY29tbW9uIGZhaWx1cmUgaXMgYSB0dW5uZWwgdGhhdCBzaWxlbnRseVxuICAvLyBkb2VzIG5vdGhpbmcgYmVjYXVzZSBubyB0b2tlbiBvciBkb21haW4gcmVzb2x2ZWQsIGFuZCB0aGlzIHByaW50cyBleGFjdGx5XG4gIC8vIHdoYXQgd291bGQgaGFwcGVuIHdpdGhvdXQgc3RhcnRpbmcgYW55dGhpbmcuXG4gIGFkZE9wdGlvbnMoXG4gICAgcHJvZ3JhbS5jb21tYW5kKFwic3RhdHVzXCIpLmRlc2NyaXB0aW9uKFwiUmVzb2x2ZSB0aGUgY29uZmlndXJhdGlvbiBhbmQgcHJpbnQgaXRcIiksXG4gICkuYWN0aW9uKChfb3B0aW9uczogVHVubmVsT3B0aW9ucywgY21kOiBDb21tYW5kKSA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlVHVubmVsT3B0aW9ucyhjbWQub3B0czxUdW5uZWxPcHRpb25zPigpKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtKU09OLnN0cmluZ2lmeShyZXNvbHZlZCwgbnVsbCwgMil9XFxuYCk7XG4gIH0pO1xuXG4gIHByb2dyYW1cbiAgICAuY29tbWFuZChcImluc3RhbGxcIilcbiAgICAuZGVzY3JpcHRpb24oXCJJbnN0YWxsIHRoZSBwb3J0ciBiaW5hcnkgYW5kIGV4aXRcIilcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHBvcnRyLmluc3RhbGxQb3J0cigpO1xuICAgIH0pO1xuXG4gIHJldHVybiBwcm9ncmFtO1xufVxuIl19
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFBcUIsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxvQkFBb0IsRUFBc0IsTUFBTSxjQUFjLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4QyxPQUFPLEVBQUUsY0FBYyxFQUFFLENBQUM7QUFFMUIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVwQyxpRkFBaUY7QUFDakYsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFFaEM7Ozs7R0FJRztBQUNILFNBQVMsUUFBUTtJQUNmLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsTUFBTSxLQUFLLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDN0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRTtZQUNoQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxD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Q2xGLFFBQVEsQ0FBQyxjQUFjLEVBQUUsaUNBQWlDLENBQUM7U0FDM0QsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFpQixFQUFFLFFBQXVCLEVBQUUsR0FBWSxFQUFFLEVBQUU7UUFDekUsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUMsQ0FBQztJQUVMLDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsK0NBQStDO0lBQy9DLFVBQVUsQ0FDUixPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUNoRixDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQXVCLEVBQUUsR0FBWSxFQUFFLEVBQUU7UUFDakQsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxDQUFDLElBQUksRUFBaUIsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU87U0FDSixPQUFPLENBQUMsU0FBUyxDQUFDO1NBQ2xCLFdBQVcsQ0FBQyxtQ0FBbUMsQ0FBQztTQUNoRCxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakIsTUFBTSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFFTCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgZGJ4IHR1bm5lbGAgLSBmcm9udCBhIGNvbW1hbmQgd2l0aCBhIHB1YmxpYyBwb3J0ciB0dW5uZWwgYW5kIHBhc3N3b3JkbGVzcyBnYXRlLlxuICpcbiAqIFRoaXMgaXMgdGhlIFdSQVBQRVIgcGF0aCwgYW5kIGl0IGV4aXN0cyBmb3Igb25lIGNhc2U6IGEgcHJvamVjdCB0aGF0IGRvZXMgbm90XG4gKiB1c2UgYEBkYngtdG9vbHMvYXBwa2l0YCdzIGBjcmVhdGVBcHBgLCBhbmQgdGhlcmVmb3JlIGNhbm5vdCByZWdpc3RlclxuICogYHR1bm5lbEludGVyY2VwdG9yKClgICsgdGhlIGBhdXRoR2F0ZWAgcGx1Z2luIGluLXByb2Nlc3MuIEFuIEFwcEtpdCBhcHAgc2hvdWxkXG4gKiBzdGlsbCB0YWtlIHRoZSBwbHVnaW4gcGF0aCAtIG9uZSBwcm9jZXNzLCBubyBwcm94eSBob3AsIG5vIGR1cGxpY2F0ZWQgaGVhZGVyXG4gKiBoYW5kbGluZy5cbiAqXG4gKiBUaGUgd3JhcHBlciBjbGFpbXMgdGhlIFBVQkxJQyBwb3J0IChgREFUQUJSSUNLU19BUFBfUE9SVGAsIHRoZSBwb3J0IHRoZVxuICogcGxhdGZvcm0gYW5kIHBvcnRyIHJvdXRlIHRvKSwgbW92ZXMgdGhlIHdyYXBwZWQgYXBwIHRvIGEgcHJpdmF0ZSBvbmUsIGFuZFxuICogcmV2ZXJzZS1wcm94aWVzIGJldHdlZW4gdGhlbSBzbyB0aGUgZ2F0ZSBzaXRzIGluIGZyb250IG9mIHRyYWZmaWMgaXQgd291bGRcbiAqIG90aGVyd2lzZSBoYXZlIG5vIHdheSB0byBpbnRlcmNlcHQuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBkZWxlZ2F0ZWQ6IHRoZSBnYXRlXG4gKiBjb25maWcgY29tZXMgZnJvbSBgcGx1Z2luLnJlc29sdmVBdXRoR2F0ZUNvbmZpZ2AsIHRoZSBwb3J0ciBsaWZlY3ljbGUgZnJvbVxuICogYHBvcnRyLipgIC0gYm90aCB0aGUgc2FtZSBmdW5jdGlvbnMgdGhlIGluLXByb2Nlc3MgcGF0aCB1c2VzLlxuICpcbiAqIFNoaXBzIG5vIGJpbi4gYEBkYngtdG9vbHMvY2xpYCBtb3VudHMgYGJ1aWxkUHJvZ3JhbSgpYCBhcyBgZGJ4IHR1bm5lbGAgbGF6aWx5LFxuICogc28gYGRieCBkZXZgIHBheXMgZm9yIG5vbmUgb2YgdGhpcywgYW5kIGAtLWluc2VjdXJlYCAvIGBzdGF0dXNgIC8gYGluc3RhbGxgXG4gKiBuZXZlciBsb2FkIEFwcEtpdCBvciB0aGUgU01UUCBzdGFjayBlaXRoZXIgKHRoZSBnYXRlIGFwcCBpcyBiZWhpbmQgYSBkeW5hbWljXG4gKiBpbXBvcnQpLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyB0eXBlIENoaWxkUHJvY2Vzcywgc3Bhd24gfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tIFwibm9kZTpuZXRcIjtcbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBwb3J0ciB9IGZyb20gXCJAZGJ4LXRvb2xzL3R1bm5lbFwiO1xuaW1wb3J0IHsgQ29tbWFuZCwgQ29tbWFuZGVyRXJyb3IgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgeyByZXNvbHZlVHVubmVsT3B0aW9ucywgdHlwZSBUdW5uZWxPcHRpb25zIH0gZnJvbSBcIi4vb3B0aW9ucy50c1wiO1xuaW1wb3J0IHsgc3RhcnRQcm94eSB9IGZyb20gXCIuL3Byb3h5LnRzXCI7XG5cbmV4cG9ydCB7IENvbW1hbmRlckVycm9yIH07XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWxcIik7XG5cbi8qKiBIb3cgbG9uZyBhIGNoaWxkIGdldHMgdG8gZXhpdCBvbiBTSUdURVJNIGJlZm9yZSB0aGUgd3JhcHBlciBsZWF2ZXMgYW55d2F5LiAqL1xuY29uc3QgU0hVVERPV05fR1JBQ0VfTVMgPSAzXzAwMDtcblxuLyoqXG4gKiBBIGZyZWUgbG9vcGJhY2sgcG9ydCwgZnJvbSB0aGUgT1MgcmF0aGVyIHRoYW4gYSByYW5kb20gZ3Vlc3M6IGJpbmRpbmcgYDBgIGFuZFxuICogcmVhZGluZyBiYWNrIHdoYXQgd2FzIGFzc2lnbmVkIGlzIHRoZSBvbmx5IHdheSB0byBrbm93IHRoZSBwb3J0IGlzIGFjdHVhbGx5XG4gKiBhdmFpbGFibGUsIHNvIHR3byB0dW5uZWxzIGNhbiBydW4gc2lkZSBieSBzaWRlIHdpdGhvdXQgY29sbGlkaW5nLlxuICovXG5mdW5jdGlvbiBmcmVlUG9ydCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHByb2JlID0gY3JlYXRlU2VydmVyKCk7XG4gICAgcHJvYmUub24oXCJlcnJvclwiLCByZWplY3QpO1xuICAgIHByb2JlLmxpc3RlbigwLCBcIjEyNy4wLjAuMVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gcHJvYmUuYWRkcmVzcygpO1xuICAgICAgY29uc3QgcG9ydCA9IHR5cGVvZiBhZGRyZXNzID09PSBcIm9iamVjdFwiICYmIGFkZHJlc3MgPyBhZGRyZXNzLnBvcnQgOiAwO1xuICAgICAgcHJvYmUuY2xvc2UoKCkgPT4gKHBvcnQgPiAwID8gcmVzb2x2ZShwb3J0KSA6IHJlamVjdChuZXcgRXJyb3IoXCJubyBmcmVlIHBvcnRcIikpKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEV2ZXJ5IGdhdGUvcG9ydHIgZmxhZy4gRGVjbGFyZWQgb24gdGhlIHJvb3QgY29tbWFuZCBBTkQgb24gYHJ1bmAvYHN0YXR1c2Agc29cbiAqIGBkYnggdHVubmVsIC0tYWxsb3cgeCAtLSBjbWRgIGFuZCBgZGJ4IHR1bm5lbCBydW4gLS1hbGxvdyB4IC0tIGNtZGAgYmVoYXZlXG4gKiBpZGVudGljYWxseSAtIGNvbW1hbmRlciBkb2VzIG5vdCBpbmhlcml0IG9wdGlvbnMgZG93bndhcmQuXG4gKi9cbmZ1bmN0aW9uIGFkZE9wdGlvbnMoY29tbWFuZDogQ29tbWFuZCk6IENvbW1hbmQge1xuICByZXR1cm4gY29tbWFuZFxuICAgIC5vcHRpb24oXCItLXB1YmxpYy1kb21haW4gPGhvc3Q+XCIsIFwicG9ydHIgcHVibGljIGRvbWFpbiAoPHN1YmRvbWFpbj4uPHNlcnZlcj4pXCIpXG4gICAgLm9wdGlvbihcIi0tc3ViZG9tYWluIDxuYW1lPlwiLCBcInBvcnRyIHN1YmRvbWFpbiAoZWxzZSBkZXJpdmVkIGZyb20gdGhlIHB1YmxpYyBkb21haW4pXCIpXG4gICAgLm9wdGlvbihcIi0tcG9ydCA8cG9ydD5cIiwgXCJwdWJsaWMgcG9ydCB0aGUgd3JhcHBlciBsaXN0ZW5zIG9uXCIpXG4gICAgLm9wdGlvbihcIi0tYXBwLXBvcnQgPHBvcnQ+XCIsIFwicHJpdmF0ZSBwb3J0IHRoZSB3cmFwcGVkIGFwcCBpcyB0b2xkIHRvIGJpbmRcIilcbiAgICAub3B0aW9uKFwiLS1hbGxvdyA8cGF0dGVybnMuLi4+XCIsIFwiZW1haWwgYWxsb3ctbGlzdCAoZG9tYWluIC8gZ2xvYiAvIC9yZWdleC8pXCIpXG4gICAgLm9wdGlvbihcIi0tc3ViamVjdCA8dGV4dD5cIiwgXCJ2ZXJpZmljYXRpb24gZW1haWwgc3ViamVjdFwiKVxuICAgIC5vcHRpb24oXCItLWJyYW5kLW5hbWUgPG5hbWU+XCIsIFwidmVyaWZpY2F0aW9uIGVtYWlsIGJyYW5kIG5hbWVcIilcbiAgICAub3B0aW9uKFwiLS1tZXNzYWdlIDx0ZXh0PlwiLCBcInZlcmlmaWNhdGlvbiBlbWFpbCBtZXNzYWdlXCIpXG4gICAgLm9wdGlvbihcIi0tc2Vzc2lvbi10dGwgPHNlY29uZHM+XCIsIFwic2Vzc2lvbiBsaWZldGltZVwiKVxuICAgIC5vcHRpb24oXCItLWNvZGUtdHRsIDxzZWNvbmRzPlwiLCBcIm9uZS10aW1lLWNvZGUgbGlmZXRpbWVcIilcbiAgICAub3B0aW9uKFwiLS1zZXNzaW9uLWN1dG9mZiA8d2hlbj5cIiwgXCJpbnZhbGlkYXRlIGV2ZXJ5IHNlc3Npb24gaXNzdWVkIGJlZm9yZSB0aGlzXCIpXG4gICAgLm9wdGlvbihcIi0tYXV0aC1zdG9yYWdlIDxtb2RlPlwiLCBcImF1dGggZGF0YWJhc2U6IGF1dG8sIGxha2ViYXNlLCBvciBzcWxpdGVcIilcbiAgICAub3B0aW9uKFwiLS1hdXRoLXNxbGl0ZS1wYXRoIDxwYXRoPlwiLCBcImxvY2FsIEJldHRlciBBdXRoIFNRTGl0ZSBmaWxlXCIpXG4gICAgLm9wdGlvbihcIi0tZm9yd2FyZC1oZWFkZXJzIDxwYXR0ZXJucy4uLj5cIiwgXCJleHRyYSB4LSBoZWFkZXJzIHR1bm5lbCB0cmFmZmljIG1heSBmb3J3YXJkXCIpXG4gICAgLm9wdGlvbihcIi0taW5zZWN1cmVcIiwgXCJydW4gb3Blbiwgd2l0aCBubyBnYXRlXCIpO1xufVxuXG4vKipcbiAqIFRpZSB0aGUgd3JhcHBlcidzIGxpZmV0aW1lIHRvIGl0cyBjaGlsZHJlbidzLCBpbiBib3RoIGRpcmVjdGlvbnM6IGEgY2hpbGQgdGhhdFxuICogZXhpdHMgdGFrZXMgdGhlIHdyYXBwZXIgZG93biB3aXRoIGl0cyBjb2RlLCBhbmQgYSBzaWduYWwgdG8gdGhlIHdyYXBwZXIgaXNcbiAqIGZvcndhcmRlZCBiZWZvcmUgaXQgbGVhdmVzLiBXaXRob3V0IHRoaXMgYSBjcmFzaGVkIGFwcCBsZWF2ZXMgYSBwb3J0ciB0dW5uZWxcbiAqIHNlcnZpbmcgYSBkZWFkIHBvcnQsIHdoaWNoIGxvb2tzIGxpa2UgYSBoYW5nIHJhdGhlciB0aGFuIGEgZmFpbHVyZS5cbiAqL1xuZnVuY3Rpb24gc3VwZXJ2aXNlKGNoaWxkcmVuOiByZWFkb25seSBDaGlsZFByb2Nlc3NbXSk6IHZvaWQge1xuICBsZXQgc3RvcHBpbmcgPSBmYWxzZTtcbiAgY29uc3Qgc3RvcCA9IChjb2RlOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcbiAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikgaWYgKCFjaGlsZC5raWxsZWQpIGNoaWxkLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gcHJvY2Vzcy5leGl0KGNvZGUpLCBTSFVURE9XTl9HUkFDRV9NUykudW5yZWYoKTtcbiAgfTtcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikgY2hpbGQub24oXCJleGl0XCIsIChjb2RlKSA9PiBzdG9wKGNvZGUgPz8gMSkpO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbXCJTSUdURVJNXCIsIFwiU0lHSU5UXCIsIFwiU0lHSFVQXCJdIGFzIGNvbnN0KSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHN0b3AoMCkpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bihyYXc6IFR1bm5lbE9wdGlvbnMsIGNvbW1hbmQ6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IFtleGVjdXRhYmxlLCAuLi5hcmdzXSA9IGNvbW1hbmQ7XG4gIGlmICghZXhlY3V0YWJsZSkge1xuICAgIHRocm93IG5ldyBDb21tYW5kZXJFcnJvcigxLCBcInR1bm5lbC5uby1jb21tYW5kXCIsIFwibm8gY29tbWFuZCBnaXZlbiAtIHBhc3MgaXQgYWZ0ZXIgYC0tYFwiKTtcbiAgfVxuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVUdW5uZWxPcHRpb25zKHJhdyk7XG5cbiAgLy8gVGhlIHdyYXBwZWQgYXBwIG11c3Qgbm90IGJlIHJlYWNoYWJsZSBmcm9tIG91dHNpZGU6IGl0IGJpbmRzIGxvb3BiYWNrIG9uIGFcbiAgLy8gcHJpdmF0ZSBwb3J0LCBhbmQgdGhlIHdyYXBwZXIgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCB0YWxrcyB0byBpdC4gQW5cbiAgLy8gdW5yZXNvbHZlZCBgLS1hcHAtcG9ydGAgYmVjb21lcyBhIGZyZWUgZXBoZW1lcmFsIHBvcnQgcmF0aGVyIHRoYW4gYSBmaXhlZFxuICAvLyBndWVzcywgc28gdHdvIHR1bm5lbHMgY2FuIHJ1biBzaWRlIGJ5IHNpZGUuXG4gIGNvbnN0IGFwcFBvcnQgPSByZXNvbHZlZC5hcHBQb3J0ID8/IChhd2FpdCBmcmVlUG9ydCgpKTtcbiAgY29uc3QgYXBwID0gc3Bhd24oZXhlY3V0YWJsZSwgYXJncywge1xuICAgIGVudjoge1xuICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICBEQVRBQlJJQ0tTX0FQUF9QT1JUOiBTdHJpbmcoYXBwUG9ydCksXG4gICAgICBQT1JUOiBTdHJpbmcoYXBwUG9ydCksXG4gICAgICBIT1NUOiBcIjEyNy4wLjAuMVwiLFxuICAgIH0sXG4gICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICB9KTtcbiAgY29uc3QgY2hpbGRyZW46IENoaWxkUHJvY2Vzc1tdID0gW2FwcF07XG5cbiAgLy8gRHluYW1pYyBpbXBvcnQ6IHRoZSBnYXRlIGlzIHRoZSBvbmx5IHRoaW5nIGhlcmUgdGhhdCBuZWVkcyBBcHBLaXQgKyBTTVRQLCBzb1xuICAvLyBhbiBgLS1pbnNlY3VyZWAgcnVuIG5ldmVyIGxvYWRzIGVpdGhlci5cbiAgY29uc3QgZ2F0ZSA9IHJlc29sdmVkLmdhdGUuaW5zZWN1cmVcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoXCIuL2FwcC50c1wiKVxuICAgICAgKS5zdGFydEdhdGVBcHAoe1xuICAgICAgICAuLi5yZXNvbHZlZC5nYXRlQ29uZmlnLFxuICAgICAgICBwdWJsaWNEb21haW46IHJlc29sdmVkLmdhdGUucHVibGljRG9tYWluID8/IGBsb2NhbGhvc3Q6JHtyZXNvbHZlZC5wdWJsaWNQb3J0fWAsXG4gICAgICB9KTtcbiAgaWYgKCFnYXRlKSBsb2dnZXIud2FybihcInJ1bm5pbmcgT1BFTiAtIG5vIGdhdGUgaXMgaW4gZnJvbnQgb2YgdGhpcyB0dW5uZWxcIik7XG5cbiAgYXdhaXQgc3RhcnRQcm94eSh7XG4gICAgcHVibGljUG9ydDogcmVzb2x2ZWQucHVibGljUG9ydCxcbiAgICBhcHBQb3J0LFxuICAgIGdhdGUsXG4gICAgZm9yd2FyZEhlYWRlcnM6IHJlc29sdmVkLmdhdGUuZm9yd2FyZEhlYWRlcnMsXG4gIH0pO1xuXG4gIGlmIChyZXNvbHZlZC5wb3J0cikge1xuICAgIGNvbnN0IHBvcnRyRW52ID0gYXdhaXQgcG9ydHIuaW5zdGFsbFBvcnRyKCk7XG4gICAgYXdhaXQgcG9ydHIud3JpdGVQb3J0ckNvbmZpZyhyZXNvbHZlZC5wb3J0ciwgcG9ydHJFbnYpO1xuICAgIGNoaWxkcmVuLnB1c2goYXdhaXQgcG9ydHIuc3RhcnRQb3J0cihyZXNvbHZlZC5wb3J0ciwgcG9ydHJFbnYpKTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuaW5mbyhcIm5vIFBPUlRSX1RPS0VOIC8gVFVOTkVMX1BVQkxJQ19ET01BSU4gLSBzZXJ2aW5nIGxvY2FsbHkgb25seVwiLCB7XG4gICAgICBwdWJsaWNQb3J0OiByZXNvbHZlZC5wdWJsaWNQb3J0LFxuICAgIH0pO1xuICB9XG4gIHN1cGVydmlzZShjaGlsZHJlbik7XG59XG5cbi8qKiBUaGUgYGRieCB0dW5uZWxgIHByb2dyYW0uIE5vIHNpZGUgZWZmZWN0cyB1bnRpbCBwYXJzZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcm9ncmFtKG5hbWUgPSBcImRieCB0dW5uZWxcIik6IENvbW1hbmQge1xuICBjb25zdCBwcm9ncmFtID0gYWRkT3B0aW9ucyhcbiAgICBuZXcgQ29tbWFuZCgpXG4gICAgICAubmFtZShuYW1lKVxuICAgICAgLmRlc2NyaXB0aW9uKFwiRnJvbnQgYSBjb21tYW5kIHdpdGggYSBwb3J0ciB0dW5uZWwgYW5kIHBhc3N3b3JkbGVzcyBhdXRoXCIpLFxuICApO1xuXG4gIC8vIGBydW5gIGlzIHRoZSBERUZBVUxUIGFjdGlvbiBhcyB3ZWxsIGFzIGEgbmFtZWQgc3ViY29tbWFuZCwgcHJlc2VydmluZyB0aGUgb2xkXG4gIC8vIHdyYXBwZXIncyBlcmdvbm9taWNzIChgZGJ4IHR1bm5lbCAtLWFsbG93IHggLS0gYnVuIHNyYy9zZXJ2ZXIudHNgKSB3aGlsZVxuICAvLyBsZWF2aW5nIHNvbWV3aGVyZSBmb3IgYHN0YXR1c2AgYW5kIGBpbnN0YWxsYCB0byBsaXZlLlxuICBwcm9ncmFtXG4gICAgLmFyZ3VtZW50KFwiW2NvbW1hbmQuLi5dXCIsIFwidGhlIGNvbW1hbmQgdG8gd3JhcCwgYWZ0ZXIgYC0tYFwiKVxuICAgIC5hY3Rpb24oYXN5bmMgKGNvbW1hbmQ6IHN0cmluZ1tdLCBfb3B0aW9uczogVHVubmVsT3B0aW9ucywgY21kOiBDb21tYW5kKSA9PiB7XG4gICAgICBhd2FpdCBydW4oY21kLm9wdHM8VHVubmVsT3B0aW9ucz4oKSwgY29tbWFuZCk7XG4gICAgfSk7XG5cbiAgYWRkT3B0aW9ucyhwcm9ncmFtLmNvbW1hbmQoXCJydW5cIikuZGVzY3JpcHRpb24oXCJXcmFwIGEgY29tbWFuZCAodGhlIGRlZmF1bHQgYWN0aW9uKVwiKSlcbiAgICAuYXJndW1lbnQoXCI8Y29tbWFuZC4uLj5cIiwgXCJ0aGUgY29tbWFuZCB0byB3cmFwLCBhZnRlciBgLS1gXCIpXG4gICAgLmFjdGlvbihhc3luYyAoY29tbWFuZDogc3RyaW5nW10sIF9vcHRpb25zOiBUdW5uZWxPcHRpb25zLCBjbWQ6IENvbW1hbmQpID0+IHtcbiAgICAgIGF3YWl0IHJ1bihjbWQub3B0czxUdW5uZWxPcHRpb25zPigpLCBjb21tYW5kKTtcbiAgICB9KTtcblxuICAvLyBXb3J0aCBpdHMgb3duIGNvbW1hbmQ6IHRoZSBtb3N0IGNvbW1vbiBmYWlsdXJlIGlzIGEgdHVubmVsIHRoYXQgc2lsZW50bHlcbiAgLy8gZG9lcyBub3RoaW5nIGJlY2F1c2Ugbm8gdG9rZW4gb3IgZG9tYWluIHJlc29sdmVkLCBhbmQgdGhpcyBwcmludHMgZXhhY3RseVxuICAvLyB3aGF0IHdvdWxkIGhhcHBlbiB3aXRob3V0IHN0YXJ0aW5nIGFueXRoaW5nLlxuICBhZGRPcHRpb25zKFxuICAgIHByb2dyYW0uY29tbWFuZChcInN0YXR1c1wiKS5kZXNjcmlwdGlvbihcIlJlc29sdmUgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHByaW50IGl0XCIpLFxuICApLmFjdGlvbigoX29wdGlvbnM6IFR1bm5lbE9wdGlvbnMsIGNtZDogQ29tbWFuZCkgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVR1bm5lbE9wdGlvbnMoY21kLm9wdHM8VHVubmVsT3B0aW9ucz4oKSk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7SlNPTi5zdHJpbmdpZnkocmVzb2x2ZWQsIG51bGwsIDIpfVxcbmApO1xuICB9KTtcblxuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoXCJpbnN0YWxsXCIpXG4gICAgLmRlc2NyaXB0aW9uKFwiSW5zdGFsbCB0aGUgcG9ydHIgYmluYXJ5IGFuZCBleGl0XCIpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBwb3J0ci5pbnN0YWxsUG9ydHIoKTtcbiAgICB9KTtcblxuICByZXR1cm4gcHJvZ3JhbTtcbn1cbiJdfQ==
@@ -11,6 +11,7 @@
11
11
  *
12
12
  * @module
13
13
  */
14
+ import type { AuthStorageMode } from "@dbx-tools/auth";
14
15
  import { type AuthGateConfig, plugin, portr } from "@dbx-tools/tunnel";
15
16
  /** Raw commander flag values (every numeric flag arrives as a string). */
16
17
  export interface TunnelOptions {
@@ -25,6 +26,8 @@ export interface TunnelOptions {
25
26
  sessionTtl?: string | number;
26
27
  codeTtl?: string | number;
27
28
  sessionCutoff?: string;
29
+ authStorage?: AuthStorageMode;
30
+ authSqlitePath?: string;
28
31
  forwardHeaders?: string[];
29
32
  insecure?: boolean;
30
33
  }
@@ -31,6 +31,8 @@ export function resolveTunnelOptions(options) {
31
31
  sessionTtlSeconds: object.toNumber(options.sessionTtl),
32
32
  codeTtlSeconds: object.toNumber(options.codeTtl),
33
33
  sessionCutoff: options.sessionCutoff,
34
+ storage: options.authStorage,
35
+ sqlitePath: options.authSqlitePath,
34
36
  forwardHeaders: options.forwardHeaders,
35
37
  insecure: options.insecure,
36
38
  publicDomain: options.publicDomain,
@@ -48,4 +50,4 @@ export function resolveTunnelOptions(options) {
48
50
  }),
49
51
  };
50
52
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEQsT0FBTyxFQUF1QixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFtQ3ZFLE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxPQUFzQjtJQUN6RCwrREFBK0Q7SUFDL0QsNkVBQTZFO0lBQzdFLG9CQUFvQjtJQUNwQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsRixNQUFNLFVBQVUsR0FBbUI7UUFDakMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLDBFQUEwRTtRQUMxRSw0RUFBNEU7UUFDNUUsa0RBQWtEO1FBQ2xELGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUN0RCxjQUFjLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2hELGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtRQUNwQyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7UUFDdEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtLQUNuQyxDQUFDO0lBQ0YsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RELE9BQU87UUFDTCxVQUFVO1FBQ1YsR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxVQUFVO1FBQ1YsSUFBSTtRQUNKLEtBQUssRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUM7WUFDOUIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztZQUM1QixJQUFJLEVBQUUsVUFBVTtTQUNqQixDQUFDO0tBQ0gsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZsYWcgLT4gY29uZmlnIC0+IGRlZmF1bHQgcmVzb2x1dGlvbiBmb3IgYGRieCB0dW5uZWxgLlxuICpcbiAqIFRoZSBwb2ludCBvZiB0aGlzIG1vZHVsZSBpcyB0aGF0IGl0IGRvZXMgYWxtb3N0IE5PVEhJTkcgaXRzZWxmOiBldmVyeSBnYXRlXG4gKiBzZXR0aW5nIGlzIGhhbmRlZCBzdHJhaWdodCB0byBgQGRieC10b29scy90dW5uZWxgJ3Mgb3duXG4gKiBgcGx1Z2luLnJlc29sdmVBdXRoR2F0ZUNvbmZpZ2AsIHdoaWNoIGlzIHRoZSBzYW1lIGZ1bmN0aW9uIHRoZSBpbi1wcm9jZXNzXG4gKiBwbHVnaW4gcGF0aCBjYWxscy4gVGhlIENMSSB0aGVyZWZvcmUgY2Fubm90IGRyaWZ0IGZyb20gdGhlIHBsdWdpbiBvbiBhIGRlZmF1bHQsXG4gKiBhbiBlbnYgbmFtZSwgb3IgYSBjb2VyY2lvbiBydWxlIC0gYSBmbGFnIGlzIGp1c3QgYSB2YWx1ZSBwYXNzZWQgd2hlcmUgdGhlXG4gKiBwbHVnaW4ncyBgY29uZmlnYCBvYmplY3Qgd291bGQgZ28sIGFuZCBgY29uZmlnLipgIGZpbGxzIHRoZSByZXN0IGluIGZyb20gdGhlXG4gKiBlbnZpcm9ubWVudCwgYSBgLmVudmAgZmlsZSwgb3IgYGRhdGFicmlja3MueW1sYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHR5cGUgQXV0aEdhdGVDb25maWcsIHBsdWdpbiwgcG9ydHIgfSBmcm9tIFwiQGRieC10b29scy90dW5uZWxcIjtcblxuLyoqIFJhdyBjb21tYW5kZXIgZmxhZyB2YWx1ZXMgKGV2ZXJ5IG51bWVyaWMgZmxhZyBhcnJpdmVzIGFzIGEgc3RyaW5nKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHVubmVsT3B0aW9ucyB7XG4gIHB1YmxpY0RvbWFpbj86IHN0cmluZztcbiAgc3ViZG9tYWluPzogc3RyaW5nO1xuICBwb3J0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICBhcHBQb3J0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICBhbGxvdz86IHN0cmluZ1tdO1xuICBzdWJqZWN0Pzogc3RyaW5nO1xuICBicmFuZE5hbWU/OiBzdHJpbmc7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIHNlc3Npb25UdGw/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGNvZGVUdGw/OiBzdHJpbmcgfCBudW1iZXI7XG4gIHNlc3Npb25DdXRvZmY/OiBzdHJpbmc7XG4gIGZvcndhcmRIZWFkZXJzPzogc3RyaW5nW107XG4gIGluc2VjdXJlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFR1bm5lbE9wdGlvbnMge1xuICAvKiogVGhlIHBvcnQgdGhlIHdyYXBwZXIgaXRzZWxmIGxpc3RlbnMgb24gLSB3aGF0IHBvcnRyIGZvcndhcmRzIHRvLiAqL1xuICBwdWJsaWNQb3J0OiBudW1iZXI7XG4gIC8qKiBUaGUgcHJpdmF0ZSBwb3J0IHRoZSB3cmFwcGVkIGFwcCBpcyB0b2xkIHRvIGJpbmQuIFVuc2V0IG1lYW5zIFwicGljayBvbmVcIi4gKi9cbiAgYXBwUG9ydD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBnYXRlIGNvbmZpZyBhcyB0aGUgYGF1dGhHYXRlYCBQTFVHSU4gdGFrZXMgaXQgLSBmbGFncyBvbmx5LCBub3RoaW5nXG4gICAqIHJlc29sdmVkLiBQYXNzZWQgc3RyYWlnaHQgdG8gdGhlIHBsdWdpbiBzbyBpdCBhcHBsaWVzIGl0cyBvd24gZmFsbGJhY2tzXG4gICAqIGV4YWN0bHkgb25jZSwgaW4gdGhlIG9uZSBwbGFjZSB0aGF0IG93bnMgdGhlbS5cbiAgICovXG4gIGdhdGVDb25maWc6IEF1dGhHYXRlQ29uZmlnO1xuICAvKiogVGhlIHNhbWUgY29uZmlnIGFmdGVyIHRoZSBwbHVnaW4ncyByZXNvbHV0aW9uLCBmb3IgYHN0YXR1c2AgYW5kIGZvciByb3V0aW5nLiAqL1xuICBnYXRlOiBwbHVnaW4uUmVzb2x2ZWRBdXRoR2F0ZUNvbmZpZztcbiAgcG9ydHI6IFJldHVyblR5cGU8dHlwZW9mIHBvcnRyLnJlc29sdmVQb3J0ckNvbmZpZz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHVubmVsT3B0aW9ucyhvcHRpb25zOiBUdW5uZWxPcHRpb25zKTogUmVzb2x2ZWRUdW5uZWxPcHRpb25zIHtcbiAgLy8gVGhlIERhdGFicmlja3MgQXBwcyBydW50aW1lIGNvbnRyYWN0OiB0aGUgcGxhdGZvcm0gcm91dGVzIHRvXG4gIC8vIERBVEFCUklDS1NfQVBQX1BPUlQsIHNvIHRoZSBXUkFQUEVSIGNsYWltcyBpdCBhbmQgdGhlIHdyYXBwZWQgYXBwIGlzIG1vdmVkXG4gIC8vIHRvIGEgcHJpdmF0ZSBvbmUuXG4gIGNvbnN0IHB1YmxpY1BvcnQgPSBjb25maWcucG9ydChvcHRpb25zLnBvcnQsIFwiREFUQUJSSUNLU19BUFBfUE9SVFwiLCA4MDAwKTtcbiAgY29uc3QgYXBwUG9ydCA9IGNvbmZpZy5wb3J0KG9wdGlvbnMuYXBwUG9ydCwgXCJBUFBfUE9SVFwiLCAwLCB7IHByZWZpeDogXCJUVU5ORUxcIiB9KTtcbiAgY29uc3QgZ2F0ZUNvbmZpZzogQXV0aEdhdGVDb25maWcgPSB7XG4gICAgYWxsb3c6IG9wdGlvbnMuYWxsb3csXG4gICAgc3ViamVjdDogb3B0aW9ucy5zdWJqZWN0LFxuICAgIGJyYW5kTmFtZTogb3B0aW9ucy5icmFuZE5hbWUsXG4gICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlLFxuICAgIC8vIENvZXJjZWQsIG5vdCByZXNvbHZlZDogdGhlIHBsdWdpbiBvd25zIHRoZSBlbnYgbmFtZSBhbmQgdGhlIGRlZmF1bHQgZm9yXG4gICAgLy8gdGhlc2UsIHNvIHRoZSBmbGFnIGlzIHBhc3NlZCB0aHJvdWdoIGFzIHRoZSBgY29uZmlnYCB2YWx1ZSBpdCBleHBlY3RzIGFuZFxuICAgIC8vIG9ubHkgbmVlZHMgYSBzdHJpbmcgLT4gbnVtYmVyIG51ZGdlIG9uIHRoZSB3YXkuXG4gICAgc2Vzc2lvblR0bFNlY29uZHM6IG9iamVjdC50b051bWJlcihvcHRpb25zLnNlc3Npb25UdGwpLFxuICAgIGNvZGVUdGxTZWNvbmRzOiBvYmplY3QudG9OdW1iZXIob3B0aW9ucy5jb2RlVHRsKSxcbiAgICBzZXNzaW9uQ3V0b2ZmOiBvcHRpb25zLnNlc3Npb25DdXRvZmYsXG4gICAgZm9yd2FyZEhlYWRlcnM6IG9wdGlvbnMuZm9yd2FyZEhlYWRlcnMsXG4gICAgaW5zZWN1cmU6IG9wdGlvbnMuaW5zZWN1cmUsXG4gICAgcHVibGljRG9tYWluOiBvcHRpb25zLnB1YmxpY0RvbWFpbixcbiAgfTtcbiAgY29uc3QgZ2F0ZSA9IHBsdWdpbi5yZXNvbHZlQXV0aEdhdGVDb25maWcoZ2F0ZUNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgcHVibGljUG9ydCxcbiAgICAuLi4oYXBwUG9ydCA+IDAgPyB7IGFwcFBvcnQgfSA6IHt9KSxcbiAgICBnYXRlQ29uZmlnLFxuICAgIGdhdGUsXG4gICAgcG9ydHI6IHBvcnRyLnJlc29sdmVQb3J0ckNvbmZpZyh7XG4gICAgICBwdWJsaWNEb21haW46IGdhdGUucHVibGljRG9tYWluLFxuICAgICAgc3ViZG9tYWluOiBvcHRpb25zLnN1YmRvbWFpbixcbiAgICAgIHBvcnQ6IHB1YmxpY1BvcnQsXG4gICAgfSksXG4gIH07XG59XG4iXX0=
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUdILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEQsT0FBTyxFQUF1QixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFxQ3ZFLE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxPQUFzQjtJQUN6RCwrREFBK0Q7SUFDL0QsNkVBQTZFO0lBQzdFLG9CQUFvQjtJQUNwQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsRixNQUFNLFVBQVUsR0FBbUI7UUFDakMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7UUFDNUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLDBFQUEwRTtRQUMxRSw0RUFBNEU7UUFDNUUsa0RBQWtEO1FBQ2xELGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUN0RCxjQUFjLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2hELGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtRQUNwQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFdBQVc7UUFDNUIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxjQUFjO1FBQ2xDLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztRQUN0QyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO0tBQ25DLENBQUM7SUFDRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEQsT0FBTztRQUNMLFVBQVU7UUFDVixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25DLFVBQVU7UUFDVixJQUFJO1FBQ0osS0FBSyxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztZQUM5QixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxhZyAtPiBjb25maWcgLT4gZGVmYXVsdCByZXNvbHV0aW9uIGZvciBgZGJ4IHR1bm5lbGAuXG4gKlxuICogVGhlIHBvaW50IG9mIHRoaXMgbW9kdWxlIGlzIHRoYXQgaXQgZG9lcyBhbG1vc3QgTk9USElORyBpdHNlbGY6IGV2ZXJ5IGdhdGVcbiAqIHNldHRpbmcgaXMgaGFuZGVkIHN0cmFpZ2h0IHRvIGBAZGJ4LXRvb2xzL3R1bm5lbGAncyBvd25cbiAqIGBwbHVnaW4ucmVzb2x2ZUF1dGhHYXRlQ29uZmlnYCwgd2hpY2ggaXMgdGhlIHNhbWUgZnVuY3Rpb24gdGhlIGluLXByb2Nlc3NcbiAqIHBsdWdpbiBwYXRoIGNhbGxzLiBUaGUgQ0xJIHRoZXJlZm9yZSBjYW5ub3QgZHJpZnQgZnJvbSB0aGUgcGx1Z2luIG9uIGEgZGVmYXVsdCxcbiAqIGFuIGVudiBuYW1lLCBvciBhIGNvZXJjaW9uIHJ1bGUgLSBhIGZsYWcgaXMganVzdCBhIHZhbHVlIHBhc3NlZCB3aGVyZSB0aGVcbiAqIHBsdWdpbidzIGBjb25maWdgIG9iamVjdCB3b3VsZCBnbywgYW5kIGBjb25maWcuKmAgZmlsbHMgdGhlIHJlc3QgaW4gZnJvbSB0aGVcbiAqIGVudmlyb25tZW50LCBhIGAuZW52YCBmaWxlLCBvciBgZGF0YWJyaWNrcy55bWxgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEF1dGhTdG9yYWdlTW9kZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2F1dGhcIjtcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyB0eXBlIEF1dGhHYXRlQ29uZmlnLCBwbHVnaW4sIHBvcnRyIH0gZnJvbSBcIkBkYngtdG9vbHMvdHVubmVsXCI7XG5cbi8qKiBSYXcgY29tbWFuZGVyIGZsYWcgdmFsdWVzIChldmVyeSBudW1lcmljIGZsYWcgYXJyaXZlcyBhcyBhIHN0cmluZykuICovXG5leHBvcnQgaW50ZXJmYWNlIFR1bm5lbE9wdGlvbnMge1xuICBwdWJsaWNEb21haW4/OiBzdHJpbmc7XG4gIHN1YmRvbWFpbj86IHN0cmluZztcbiAgcG9ydD86IHN0cmluZyB8IG51bWJlcjtcbiAgYXBwUG9ydD86IHN0cmluZyB8IG51bWJlcjtcbiAgYWxsb3c/OiBzdHJpbmdbXTtcbiAgc3ViamVjdD86IHN0cmluZztcbiAgYnJhbmROYW1lPzogc3RyaW5nO1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICBzZXNzaW9uVHRsPzogc3RyaW5nIHwgbnVtYmVyO1xuICBjb2RlVHRsPzogc3RyaW5nIHwgbnVtYmVyO1xuICBzZXNzaW9uQ3V0b2ZmPzogc3RyaW5nO1xuICBhdXRoU3RvcmFnZT86IEF1dGhTdG9yYWdlTW9kZTtcbiAgYXV0aFNxbGl0ZVBhdGg/OiBzdHJpbmc7XG4gIGZvcndhcmRIZWFkZXJzPzogc3RyaW5nW107XG4gIGluc2VjdXJlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFR1bm5lbE9wdGlvbnMge1xuICAvKiogVGhlIHBvcnQgdGhlIHdyYXBwZXIgaXRzZWxmIGxpc3RlbnMgb24gLSB3aGF0IHBvcnRyIGZvcndhcmRzIHRvLiAqL1xuICBwdWJsaWNQb3J0OiBudW1iZXI7XG4gIC8qKiBUaGUgcHJpdmF0ZSBwb3J0IHRoZSB3cmFwcGVkIGFwcCBpcyB0b2xkIHRvIGJpbmQuIFVuc2V0IG1lYW5zIFwicGljayBvbmVcIi4gKi9cbiAgYXBwUG9ydD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBnYXRlIGNvbmZpZyBhcyB0aGUgYGF1dGhHYXRlYCBQTFVHSU4gdGFrZXMgaXQgLSBmbGFncyBvbmx5LCBub3RoaW5nXG4gICAqIHJlc29sdmVkLiBQYXNzZWQgc3RyYWlnaHQgdG8gdGhlIHBsdWdpbiBzbyBpdCBhcHBsaWVzIGl0cyBvd24gZmFsbGJhY2tzXG4gICAqIGV4YWN0bHkgb25jZSwgaW4gdGhlIG9uZSBwbGFjZSB0aGF0IG93bnMgdGhlbS5cbiAgICovXG4gIGdhdGVDb25maWc6IEF1dGhHYXRlQ29uZmlnO1xuICAvKiogVGhlIHNhbWUgY29uZmlnIGFmdGVyIHRoZSBwbHVnaW4ncyByZXNvbHV0aW9uLCBmb3IgYHN0YXR1c2AgYW5kIGZvciByb3V0aW5nLiAqL1xuICBnYXRlOiBwbHVnaW4uUmVzb2x2ZWRBdXRoR2F0ZUNvbmZpZztcbiAgcG9ydHI6IFJldHVyblR5cGU8dHlwZW9mIHBvcnRyLnJlc29sdmVQb3J0ckNvbmZpZz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVHVubmVsT3B0aW9ucyhvcHRpb25zOiBUdW5uZWxPcHRpb25zKTogUmVzb2x2ZWRUdW5uZWxPcHRpb25zIHtcbiAgLy8gVGhlIERhdGFicmlja3MgQXBwcyBydW50aW1lIGNvbnRyYWN0OiB0aGUgcGxhdGZvcm0gcm91dGVzIHRvXG4gIC8vIERBVEFCUklDS1NfQVBQX1BPUlQsIHNvIHRoZSBXUkFQUEVSIGNsYWltcyBpdCBhbmQgdGhlIHdyYXBwZWQgYXBwIGlzIG1vdmVkXG4gIC8vIHRvIGEgcHJpdmF0ZSBvbmUuXG4gIGNvbnN0IHB1YmxpY1BvcnQgPSBjb25maWcucG9ydChvcHRpb25zLnBvcnQsIFwiREFUQUJSSUNLU19BUFBfUE9SVFwiLCA4MDAwKTtcbiAgY29uc3QgYXBwUG9ydCA9IGNvbmZpZy5wb3J0KG9wdGlvbnMuYXBwUG9ydCwgXCJBUFBfUE9SVFwiLCAwLCB7IHByZWZpeDogXCJUVU5ORUxcIiB9KTtcbiAgY29uc3QgZ2F0ZUNvbmZpZzogQXV0aEdhdGVDb25maWcgPSB7XG4gICAgYWxsb3c6IG9wdGlvbnMuYWxsb3csXG4gICAgc3ViamVjdDogb3B0aW9ucy5zdWJqZWN0LFxuICAgIGJyYW5kTmFtZTogb3B0aW9ucy5icmFuZE5hbWUsXG4gICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlLFxuICAgIC8vIENvZXJjZWQsIG5vdCByZXNvbHZlZDogdGhlIHBsdWdpbiBvd25zIHRoZSBlbnYgbmFtZSBhbmQgdGhlIGRlZmF1bHQgZm9yXG4gICAgLy8gdGhlc2UsIHNvIHRoZSBmbGFnIGlzIHBhc3NlZCB0aHJvdWdoIGFzIHRoZSBgY29uZmlnYCB2YWx1ZSBpdCBleHBlY3RzIGFuZFxuICAgIC8vIG9ubHkgbmVlZHMgYSBzdHJpbmcgLT4gbnVtYmVyIG51ZGdlIG9uIHRoZSB3YXkuXG4gICAgc2Vzc2lvblR0bFNlY29uZHM6IG9iamVjdC50b051bWJlcihvcHRpb25zLnNlc3Npb25UdGwpLFxuICAgIGNvZGVUdGxTZWNvbmRzOiBvYmplY3QudG9OdW1iZXIob3B0aW9ucy5jb2RlVHRsKSxcbiAgICBzZXNzaW9uQ3V0b2ZmOiBvcHRpb25zLnNlc3Npb25DdXRvZmYsXG4gICAgc3RvcmFnZTogb3B0aW9ucy5hdXRoU3RvcmFnZSxcbiAgICBzcWxpdGVQYXRoOiBvcHRpb25zLmF1dGhTcWxpdGVQYXRoLFxuICAgIGZvcndhcmRIZWFkZXJzOiBvcHRpb25zLmZvcndhcmRIZWFkZXJzLFxuICAgIGluc2VjdXJlOiBvcHRpb25zLmluc2VjdXJlLFxuICAgIHB1YmxpY0RvbWFpbjogb3B0aW9ucy5wdWJsaWNEb21haW4sXG4gIH07XG4gIGNvbnN0IGdhdGUgPSBwbHVnaW4ucmVzb2x2ZUF1dGhHYXRlQ29uZmlnKGdhdGVDb25maWcpO1xuICByZXR1cm4ge1xuICAgIHB1YmxpY1BvcnQsXG4gICAgLi4uKGFwcFBvcnQgPiAwID8geyBhcHBQb3J0IH0gOiB7fSksXG4gICAgZ2F0ZUNvbmZpZyxcbiAgICBnYXRlLFxuICAgIHBvcnRyOiBwb3J0ci5yZXNvbHZlUG9ydHJDb25maWcoe1xuICAgICAgcHVibGljRG9tYWluOiBnYXRlLnB1YmxpY0RvbWFpbixcbiAgICAgIHN1YmRvbWFpbjogb3B0aW9ucy5zdWJkb21haW4sXG4gICAgICBwb3J0OiBwdWJsaWNQb3J0LFxuICAgIH0pLFxuICB9O1xufVxuIl19
package/lib/src/proxy.js CHANGED
@@ -17,20 +17,10 @@
17
17
  * @module
18
18
  */
19
19
  import { createServer } from "node:http";
20
- import { http, json, log } from "@dbx-tools/shared-core";
21
- import { authRequestSchema, authVerifySchema, SESSION_COOKIE_NAME } from "@dbx-tools/shared-email";
20
+ import { log } from "@dbx-tools/shared-core";
22
21
  import { gate as tunnelGate, headers as tunnelHeaders } from "@dbx-tools/tunnel";
23
22
  import ProxyModule from "http-proxy-3";
24
23
  const logger = log.logger("tunnel:proxy");
25
- /** Read a request body as text; a transport error yields whatever arrived. */
26
- function readBody(request) {
27
- return new Promise((resolve) => {
28
- let body = "";
29
- request.on("data", (chunk) => (body += chunk));
30
- request.on("end", () => resolve(body));
31
- request.on("error", () => resolve(body));
32
- });
33
- }
34
24
  function sendJson(response, status, body, setCookie) {
35
25
  response.writeHead(status, {
36
26
  "content-type": "application/json",
@@ -38,44 +28,25 @@ function sendJson(response, status, body, setCookie) {
38
28
  });
39
29
  response.end(JSON.stringify(body));
40
30
  }
41
- function sessionCookieValue(request) {
42
- return http.parseCookies(request.headers.cookie ?? null)[SESSION_COOKIE_NAME];
43
- }
44
31
  /**
45
- * Answer one of the four login routes, or return `false` when the request is not
46
- * one of them. Mirrors the plugin's route handlers: `request` always reports
47
- * success (anti-enumeration) and `verify` sets the session cookie on success.
32
+ * Hand every Better Auth and compatibility route to the shared gate runtime.
48
33
  */
49
34
  async function handleAuthRoute(request, response, path, gate) {
50
35
  const prefix = tunnelGate.AUTH_PREFIX;
51
- const ip = tunnelGate.clientIp(request);
52
- if (path === `${prefix}/status`) {
53
- sendJson(response, 200, await gate.status(sessionCookieValue(request)));
54
- return true;
55
- }
56
- if (path === `${prefix}/request` && request.method === "POST") {
57
- const parsed = authRequestSchema.safeParse(json.parseRecord(await readBody(request)));
58
- sendJson(response, 200, parsed.success ? await gate.request(parsed.data.email, ip) : { ok: true });
59
- return true;
60
- }
61
- if (path === `${prefix}/verify` && request.method === "POST") {
62
- const parsed = authVerifySchema.safeParse(json.parseRecord(await readBody(request)));
63
- if (!parsed.success) {
64
- sendJson(response, 200, { ok: false });
65
- return true;
66
- }
67
- const result = await gate.verify(parsed.data.email, parsed.data.code, ip);
68
- const cookie = result.ok && result.token
69
- ? tunnelGate.sessionSetCookie(result.token, gate.sessionTtlSeconds)
70
- : undefined;
71
- sendJson(response, 200, { ok: result.ok, ...(result.retryAfter ? { retryAfter: result.retryAfter } : {}) }, cookie);
72
- return true;
73
- }
74
- if (path === `${prefix}/logout` && request.method === "POST") {
75
- sendJson(response, 200, { ok: true }, tunnelGate.LOGOUT_SET_COOKIE);
76
- return true;
36
+ if (!path.startsWith(prefix))
37
+ return false;
38
+ const result = await gate.handler(await tunnelGate.webRequest(request));
39
+ const headers = {};
40
+ for (const [name, value] of result.headers.entries()) {
41
+ if (name.toLowerCase() !== "set-cookie")
42
+ headers[name] = value;
77
43
  }
78
- return false;
44
+ const cookies = result.headers.getSetCookie();
45
+ if (cookies.length)
46
+ headers["set-cookie"] = cookies;
47
+ response.writeHead(result.status, headers);
48
+ response.end(Buffer.from(await result.arrayBuffer()));
49
+ return true;
79
50
  }
80
51
  /**
81
52
  * Start the proxy and resolve once it is listening.
@@ -123,14 +94,16 @@ export function startProxy(options) {
123
94
  // destroyed - the client sees the handshake fail, which is what a browser's
124
95
  // WebSocket error handler expects.
125
96
  server.on("upgrade", (request, socket, head) => {
97
+ const upgradeSocket = socket;
98
+ upgradeSocket.destroySoon ??= () => upgradeSocket.end();
126
99
  void decide(request)
127
100
  .then((action) => {
128
101
  if (action === "deny")
129
- socket.destroy();
102
+ upgradeSocket.destroy();
130
103
  else
131
- proxy.ws(request, socket, head);
104
+ proxy.ws(request, upgradeSocket, head);
132
105
  })
133
- .catch(() => socket.destroy());
106
+ .catch(() => upgradeSocket.destroy());
134
107
  });
135
108
  return new Promise((resolve) => {
136
109
  server.listen(options.publicPort, "0.0.0.0", () => {
@@ -139,4 +112,4 @@ export function startProxy(options) {
139
112
  });
140
113
  });
141
114
  }
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFlBQVksRUFBNkMsTUFBTSxXQUFXLENBQUM7QUFFcEYsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkcsT0FBTyxFQUFFLElBQUksSUFBSSxVQUFVLEVBQUUsT0FBTyxJQUFJLGFBQWEsRUFBb0IsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRyxPQUFPLFdBQVcsTUFBTSxjQUFjLENBQUM7QUFFdkMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQWExQyw4RUFBOEU7QUFDOUUsU0FBUyxRQUFRLENBQUMsT0FBd0I7SUFDeEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUNmLFFBQXdCLEVBQ3hC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QUE0RTtJQUM1RSxtQ0FBbUM7SUFDbkMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUF3QixFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsRUFBRTtRQUM5RSxLQUFLLE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDakIsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDZixJQUFJLE1BQU0sS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Z0JBQ25DLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7WUFDaEQsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM3RixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgcmV2ZXJzZSBwcm94eSB0aGF0IG1ha2VzIHRoZSB3cmFwcGVyIHBhdGggcG9zc2libGUuXG4gKlxuICogVGhlIHdyYXBwZXIgY2xhaW1zIHRoZSBQVUJMSUMgcG9ydCBhbmQgdGhlIHdyYXBwZWQgYXBwIHJ1bnMgYXMgYSBjaGlsZCBwcm9jZXNzXG4gKiBvbiBhIHByaXZhdGUgbG9vcGJhY2sgcG9ydCwgc28gLSB1bmxpa2UgdGhlIGluLXByb2Nlc3MgcGx1Z2luIC0gdGhlcmUgaXMgbm9cbiAqIG1pZGRsZXdhcmUgY2hhaW4gdG8gaW5zZXJ0IHRoZSBnYXRlIGludG8uIFRoaXMgcHJveHkgaXMgdGhhdCBpbnNlcnRpb24gcG9pbnQ6IGl0XG4gKiBhbnN3ZXJzIHRoZSBsb2dpbiByb3V0ZXMgaXRzZWxmLCBhcHBsaWVzIHRoZSBnYXRlIHRvIGV2ZXJ5dGhpbmcgZWxzZSwgYW5kXG4gKiBmb3J3YXJkcyB3aGF0IHN1cnZpdmVzIHRvIHRoZSBjaGlsZC5cbiAqXG4gKiBUaGUgZ2F0aW5nIERFQ0lTSU9OIGlzIG5vdCByZWltcGxlbWVudGVkIGhlcmUuIGBAZGJ4LXRvb2xzL3R1bm5lbGAnc1xuICogYGdhdGUuZ2F0ZVJlcXVlc3RgIG1ha2VzIGl0IC0gdGhlIHNhbWUgZnVuY3Rpb24gdGhlIEV4cHJlc3MgbWlkZGxld2FyZSBjYWxscyAtXG4gKiBhbmQgdGhpcyBtb2R1bGUgb25seSBkaWZmZXJzIGluIGhvdyB0aGUgb3V0Y29tZSBpcyB3cml0dGVuOiBhIHByb3hpZWQgcmVxdWVzdFxuICogaW5zdGVhZCBvZiBgbmV4dCgpYCwgYSBgd3JpdGVIZWFkYCBpbnN0ZWFkIG9mIGByZXMuanNvbmAuIFRoYXQgaXMgZGVsaWJlcmF0ZTpcbiAqIHR3byBpbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbnMgb2YgXCJ3aGljaCByZXF1ZXN0cyBhcmUgZ2F0ZWQgYW5kIHdoaWNoIGhlYWRlcnNcbiAqIGFyZSBzdHJpcHBlZFwiIGlzIHRoZSBvbmUgd2F5IHRoaXMgcGFja2FnZSBjb3VsZCBiZWNvbWUgYSBzZWN1cml0eSBidWcuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZVNlcnZlciwgdHlwZSBJbmNvbWluZ01lc3NhZ2UsIHR5cGUgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgdHlwZSB7IFNvY2tldCB9IGZyb20gXCJub2RlOm5ldFwiO1xuaW1wb3J0IHsgaHR0cCwganNvbiwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGF1dGhSZXF1ZXN0U2NoZW1hLCBhdXRoVmVyaWZ5U2NoZW1hLCBTRVNTSU9OX0NPT0tJRV9OQU1FIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWVtYWlsXCI7XG5pbXBvcnQgeyBnYXRlIGFzIHR1bm5lbEdhdGUsIGhlYWRlcnMgYXMgdHVubmVsSGVhZGVycywgdHlwZSBBdXRoR2F0ZUFwaSB9IGZyb20gXCJAZGJ4LXRvb2xzL3R1bm5lbFwiO1xuaW1wb3J0IFByb3h5TW9kdWxlIGZyb20gXCJodHRwLXByb3h5LTNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcInR1bm5lbDpwcm94eVwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBQcm94eU9wdGlvbnMge1xuICAvKiogVGhlIHBvcnQgdGhpcyBwcm94eSBsaXN0ZW5zIG9uIC0gdGhlIHBvcnQgcG9ydHIgYW5kIHRoZSBwbGF0Zm9ybSByb3V0ZSB0by4gKi9cbiAgcHVibGljUG9ydDogbnVtYmVyO1xuICAvKiogVGhlIHByaXZhdGUgbG9vcGJhY2sgcG9ydCB0aGUgd3JhcHBlZCBhcHAgbGlzdGVucyBvbi4gKi9cbiAgYXBwUG9ydDogbnVtYmVyO1xuICAvKiogVGhlIGdhdGUgaGFuZGxlcnMuIE9taXR0ZWQgKGFuIGAtLWluc2VjdXJlYCBydW4pIGZvcndhcmRzIGV2ZXJ5dGhpbmcuICovXG4gIGdhdGU/OiBBdXRoR2F0ZUFwaTtcbiAgLyoqIEV4dHJhIGB4LWAgaGVhZGVycyB0dW5uZWwgdHJhZmZpYyBtYXkgZm9yd2FyZC4gKi9cbiAgZm9yd2FyZEhlYWRlcnM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIFJlYWQgYSByZXF1ZXN0IGJvZHkgYXMgdGV4dDsgYSB0cmFuc3BvcnQgZXJyb3IgeWllbGRzIHdoYXRldmVyIGFycml2ZWQuICovXG5mdW5jdGlvbiByZWFkQm9keShyZXF1ZXN0OiBJbmNvbWluZ01lc3NhZ2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBsZXQgYm9keSA9IFwiXCI7XG4gICAgcmVxdWVzdC5vbihcImRhdGFcIiwgKGNodW5rKSA9PiAoYm9keSArPSBjaHVuaykpO1xuICAgIHJlcXVlc3Qub24oXCJlbmRcIiwgKCkgPT4gcmVzb2x2ZShib2R5KSk7XG4gICAgcmVxdWVzdC5vbihcImVycm9yXCIsICgpID0+IHJlc29sdmUoYm9keSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc2VuZEpzb24oXG4gIHJlc3BvbnNlOiBTZXJ2ZXJSZXNwb25zZSxcbiAgc3RhdHVzOiBudW1iZXIsXG4gIGJvZHk6IHVua25vd24sXG4gIHNldENvb2tpZT86IHN0cmluZyxcbik6IHZvaWQge1xuICByZXNwb25zZS53cml0ZUhlYWQoc3RhdHVzLCB7XG4gICAgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgLi4uKHNldENvb2tpZSA/IHsgXCJzZXQtY29va2llXCI6IHNldENvb2tpZSB9IDoge30pLFxuICB9KTtcbiAgcmVzcG9uc2UuZW5kKEpTT04uc3RyaW5naWZ5KGJvZHkpKTtcbn1cblxuZnVuY3Rpb24gc2Vzc2lvbkNvb2tpZVZhbHVlKHJlcXVlc3Q6IEluY29taW5nTWVzc2FnZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBodHRwLnBhcnNlQ29va2llcyhyZXF1ZXN0LmhlYWRlcnMuY29va2llID8/IG51bGwpW1NFU1NJT05fQ09PS0lFX05BTUVdO1xufVxuXG4vKipcbiAqIEFuc3dlciBvbmUgb2YgdGhlIGZvdXIgbG9naW4gcm91dGVzLCBvciByZXR1cm4gYGZhbHNlYCB3aGVuIHRoZSByZXF1ZXN0IGlzIG5vdFxuICogb25lIG9mIHRoZW0uIE1pcnJvcnMgdGhlIHBsdWdpbidzIHJvdXRlIGhhbmRsZXJzOiBgcmVxdWVzdGAgYWx3YXlzIHJlcG9ydHNcbiAqIHN1Y2Nlc3MgKGFudGktZW51bWVyYXRpb24pIGFuZCBgdmVyaWZ5YCBzZXRzIHRoZSBzZXNzaW9uIGNvb2tpZSBvbiBzdWNjZXNzLlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVBdXRoUm91dGUoXG4gIHJlcXVlc3Q6IEluY29taW5nTWVzc2FnZSxcbiAgcmVzcG9uc2U6IFNlcnZlclJlc3BvbnNlLFxuICBwYXRoOiBzdHJpbmcsXG4gIGdhdGU6IEF1dGhHYXRlQXBpLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHByZWZpeCA9IHR1bm5lbEdhdGUuQVVUSF9QUkVGSVg7XG4gIGNvbnN0IGlwID0gdHVubmVsR2F0ZS5jbGllbnRJcChyZXF1ZXN0KTtcblxuICBpZiAocGF0aCA9PT0gYCR7cHJlZml4fS9zdGF0dXNgKSB7XG4gICAgc2VuZEpzb24ocmVzcG9uc2UsIDIwMCwgYXdhaXQgZ2F0ZS5zdGF0dXMoc2Vzc2lvbkNvb2tpZVZhbHVlKHJlcXVlc3QpKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHBhdGggPT09IGAke3ByZWZpeH0vcmVxdWVzdGAgJiYgcmVxdWVzdC5tZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgY29uc3QgcGFyc2VkID0gYXV0aFJlcXVlc3RTY2hlbWEuc2FmZVBhcnNlKGpzb24ucGFyc2VSZWNvcmQoYXdhaXQgcmVhZEJvZHkocmVxdWVzdCkpKTtcbiAgICBzZW5kSnNvbihcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgMjAwLFxuICAgICAgcGFyc2VkLnN1Y2Nlc3MgPyBhd2FpdCBnYXRlLnJlcXVlc3QocGFyc2VkLmRhdGEuZW1haWwsIGlwKSA6IHsgb2s6IHRydWUgfSxcbiAgICApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChwYXRoID09PSBgJHtwcmVmaXh9L3ZlcmlmeWAgJiYgcmVxdWVzdC5tZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgY29uc3QgcGFyc2VkID0gYXV0aFZlcmlmeVNjaGVtYS5zYWZlUGFyc2UoanNvbi5wYXJzZVJlY29yZChhd2FpdCByZWFkQm9keShyZXF1ZXN0KSkpO1xuICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgIHNlbmRKc29uKHJlc3BvbnNlLCAyMDAsIHsgb2s6IGZhbHNlIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdhdGUudmVyaWZ5KHBhcnNlZC5kYXRhLmVtYWlsLCBwYXJzZWQuZGF0YS5jb2RlLCBpcCk7XG4gICAgY29uc3QgY29va2llID1cbiAgICAgIHJlc3VsdC5vayAmJiByZXN1bHQudG9rZW5cbiAgICAgICAgPyB0dW5uZWxHYXRlLnNlc3Npb25TZXRDb29raWUocmVzdWx0LnRva2VuLCBnYXRlLnNlc3Npb25UdGxTZWNvbmRzKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBzZW5kSnNvbihcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgMjAwLFxuICAgICAgeyBvazogcmVzdWx0Lm9rLCAuLi4ocmVzdWx0LnJldHJ5QWZ0ZXIgPyB7IHJldHJ5QWZ0ZXI6IHJlc3VsdC5yZXRyeUFmdGVyIH0gOiB7fSkgfSxcbiAgICAgIGNvb2tpZSxcbiAgICApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChwYXRoID09PSBgJHtwcmVmaXh9L2xvZ291dGAgJiYgcmVxdWVzdC5tZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgc2VuZEpzb24ocmVzcG9uc2UsIDIwMCwgeyBvazogdHJ1ZSB9LCB0dW5uZWxHYXRlLkxPR09VVF9TRVRfQ09PS0lFKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3RhcnQgdGhlIHByb3h5IGFuZCByZXNvbHZlIG9uY2UgaXQgaXMgbGlzdGVuaW5nLlxuICpcbiAqIGBwdWJsaWNEb21haW5gIGlzIGludGVudGlvbmFsbHkgTk9UIHBhc3NlZCB0byBgZ2F0ZVJlcXVlc3RgOiBvbiB0aGlzIHBhdGggZXZlcnlcbiAqIHJlcXVlc3QgYXJyaXZlZCBvbiB0aGUgcHVibGljIHBvcnQsIHNvIGl0IElTIHR1bm5lbCB0cmFmZmljIGJ5IGNvbnN0cnVjdGlvbiAtXG4gKiB3aGVyZWFzIHRoZSBpbi1wcm9jZXNzIGdhdGUgc2hhcmVzIGEgcG9ydCB3aXRoIHRoZSBwbGF0Zm9ybSBmcm9udCBkb29yIGFuZCBoYXNcbiAqIHRvIHRlbGwgdGhlbSBhcGFydCBieSBgSG9zdGAuIFBhc3NpbmcgdGhlIHJlcXVlc3QncyBvd24gaG9zdCBrZWVwcyB0aGUgc2hhcmVkXG4gKiBkZWNpc2lvbiBmdW5jdGlvbidzIGNvbnRyYWN0IHNhdGlzZmllZCB3aXRob3V0IHdlYWtlbmluZyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0UHJveHkob3B0aW9uczogUHJveHlPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3h5ID0gUHJveHlNb2R1bGUuY3JlYXRlUHJveHlTZXJ2ZXIoe1xuICAgIHRhcmdldDogYGh0dHA6Ly8xMjcuMC4wLjE6JHtvcHRpb25zLmFwcFBvcnR9YCxcbiAgICB3czogdHJ1ZSxcbiAgICB4ZndkOiB0cnVlLFxuICB9KTtcbiAgY29uc3QgaGVhZGVyUG9saWN5ID0gdHVubmVsSGVhZGVycy50b0hlYWRlclBvbGljeShvcHRpb25zLmZvcndhcmRIZWFkZXJzKTtcbiAgY29uc3QgZ2F0ZSA9IG9wdGlvbnMuZ2F0ZTtcblxuICBjb25zdCBkZWNpZGUgPSAocmVxdWVzdDogSW5jb21pbmdNZXNzYWdlKTogUHJvbWlzZTx0dW5uZWxHYXRlLkdhdGVBY3Rpb24+ID0+XG4gICAgZ2F0ZVxuICAgICAgPyB0dW5uZWxHYXRlLmdhdGVSZXF1ZXN0KHJlcXVlc3QsIHtcbiAgICAgICAgICBnYXRlLFxuICAgICAgICAgIHB1YmxpY0RvbWFpbjogKHJlcXVlc3QuaGVhZGVycy5ob3N0ID8/IFwiXCIpLnNwbGl0KFwiOlwiKVswXSB8fCBcImxvY2FsaG9zdFwiLFxuICAgICAgICAgIGhlYWRlclBvbGljeSxcbiAgICAgICAgfSlcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlPHR1bm5lbEdhdGUuR2F0ZUFjdGlvbj4oXCJwYXNzXCIpO1xuXG4gIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigocmVxdWVzdCwgcmVzcG9uc2UpID0+IHtcbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gKHJlcXVlc3QudXJsID8/IFwiL1wiKS5zcGxpdChcIj9cIilbMF0gPz8gXCIvXCI7XG4gICAgICBpZiAoZ2F0ZSAmJiAoYXdhaXQgaGFuZGxlQXV0aFJvdXRlKHJlcXVlc3QsIHJlc3BvbnNlLCBwYXRoLCBnYXRlKSkpIHJldHVybjtcbiAgICAgIGlmICgoYXdhaXQgZGVjaWRlKHJlcXVlc3QpKSA9PT0gXCJkZW55XCIpIHtcbiAgICAgICAgc2VuZEpzb24ocmVzcG9uc2UsIDQwMSwgdHVubmVsR2F0ZS5VTkFVVEhPUklaRURfQk9EWSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHByb3h5LndlYihyZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgfSkoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihcInByb3h5IHJlcXVlc3QgZmFpbGVkXCIsIHsgZXJyb3IgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLmhlYWRlcnNTZW50KSBzZW5kSnNvbihyZXNwb25zZSwgNTAyLCB7IGVycm9yOiBcImJhZCBnYXRld2F5XCIgfSk7XG4gICAgICBlbHNlIHJlc3BvbnNlLmVuZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBIHdlYnNvY2tldCB1cGdyYWRlIGNhbm5vdCBiZSBhbnN3ZXJlZCB3aXRoIGEgNDAxIGJvZHksIHNvIGEgZGVuaWVkIG9uZSBpc1xuICAvLyBkZXN0cm95ZWQgLSB0aGUgY2xpZW50IHNlZXMgdGhlIGhhbmRzaGFrZSBmYWlsLCB3aGljaCBpcyB3aGF0IGEgYnJvd3NlcidzXG4gIC8vIFdlYlNvY2tldCBlcnJvciBoYW5kbGVyIGV4cGVjdHMuXG4gIHNlcnZlci5vbihcInVwZ3JhZGVcIiwgKHJlcXVlc3Q6IEluY29taW5nTWVzc2FnZSwgc29ja2V0OiBTb2NrZXQsIGhlYWQ6IEJ1ZmZlcikgPT4ge1xuICAgIHZvaWQgZGVjaWRlKHJlcXVlc3QpXG4gICAgICAudGhlbigoYWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChhY3Rpb24gPT09IFwiZGVueVwiKSBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICBlbHNlIHByb3h5LndzKHJlcXVlc3QsIHNvY2tldCwgaGVhZCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHNvY2tldC5kZXN0cm95KCkpO1xuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXJ2ZXIubGlzdGVuKG9wdGlvbnMucHVibGljUG9ydCwgXCIwLjAuMC4wXCIsICgpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKFwicHJveHkgbGlzdGVuaW5nXCIsIHsgcHVibGljUG9ydDogb3B0aW9ucy5wdWJsaWNQb3J0LCBhcHBQb3J0OiBvcHRpb25zLmFwcFBvcnQgfSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFlBQVksRUFBNkMsTUFBTSxXQUFXLENBQUM7QUFFcEYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxJQUFJLElBQUksVUFBVSxFQUFFLE9BQU8sSUFBSSxhQUFhLEVBQW9CLE1BQU0sbUJBQW1CLENBQUM7QUFDbkcsT0FBTyxXQUFXLE1BQU0sY0FBYyxDQUFDO0FBRXZDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7QUFlMUMsU0FBUyxRQUFRLENBQ2YsUUFBd0IsRUFDeEIsTUFBYyxFQUNkLElBQWEsRUFDYixTQUFrQjtJQUVsQixRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtRQUN6QixjQUFjLEVBQUUsa0JBQWtCO1FBQ2xDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDbEQsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLGVBQWUsQ0FDNUIsT0FBd0IsRUFDeEIsUUFBd0IsRUFDeEIsSUFBWSxFQUNaLElBQWlCO0lBRWpCLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7SUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFD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SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSByZXZlcnNlIHByb3h5IHRoYXQgbWFrZXMgdGhlIHdyYXBwZXIgcGF0aCBwb3NzaWJsZS5cbiAqXG4gKiBUaGUgd3JhcHBlciBjbGFpbXMgdGhlIFBVQkxJQyBwb3J0IGFuZCB0aGUgd3JhcHBlZCBhcHAgcnVucyBhcyBhIGNoaWxkIHByb2Nlc3NcbiAqIG9uIGEgcHJpdmF0ZSBsb29wYmFjayBwb3J0LCBzbyAtIHVubGlrZSB0aGUgaW4tcHJvY2VzcyBwbHVnaW4gLSB0aGVyZSBpcyBub1xuICogbWlkZGxld2FyZSBjaGFpbiB0byBpbnNlcnQgdGhlIGdhdGUgaW50by4gVGhpcyBwcm94eSBpcyB0aGF0IGluc2VydGlvbiBwb2ludDogaXRcbiAqIGFuc3dlcnMgdGhlIGxvZ2luIHJvdXRlcyBpdHNlbGYsIGFwcGxpZXMgdGhlIGdhdGUgdG8gZXZlcnl0aGluZyBlbHNlLCBhbmRcbiAqIGZvcndhcmRzIHdoYXQgc3Vydml2ZXMgdG8gdGhlIGNoaWxkLlxuICpcbiAqIFRoZSBnYXRpbmcgREVDSVNJT04gaXMgbm90IHJlaW1wbGVtZW50ZWQgaGVyZS4gYEBkYngtdG9vbHMvdHVubmVsYCdzXG4gKiBgZ2F0ZS5nYXRlUmVxdWVzdGAgbWFrZXMgaXQgLSB0aGUgc2FtZSBmdW5jdGlvbiB0aGUgRXhwcmVzcyBtaWRkbGV3YXJlIGNhbGxzIC1cbiAqIGFuZCB0aGlzIG1vZHVsZSBvbmx5IGRpZmZlcnMgaW4gaG93IHRoZSBvdXRjb21lIGlzIHdyaXR0ZW46IGEgcHJveGllZCByZXF1ZXN0XG4gKiBpbnN0ZWFkIG9mIGBuZXh0KClgLCBhIGB3cml0ZUhlYWRgIGluc3RlYWQgb2YgYHJlcy5qc29uYC4gVGhhdCBpcyBkZWxpYmVyYXRlOlxuICogdHdvIGluZGVwZW5kZW50IGltcGxlbWVudGF0aW9ucyBvZiBcIndoaWNoIHJlcXVlc3RzIGFyZSBnYXRlZCBhbmQgd2hpY2ggaGVhZGVyc1xuICogYXJlIHN0cmlwcGVkXCIgaXMgdGhlIG9uZSB3YXkgdGhpcyBwYWNrYWdlIGNvdWxkIGJlY29tZSBhIHNlY3VyaXR5IGJ1Zy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlU2VydmVyLCB0eXBlIEluY29taW5nTWVzc2FnZSwgdHlwZSBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJub2RlOmh0dHBcIjtcbmltcG9ydCB0eXBlIHsgU29ja2V0IH0gZnJvbSBcIm5vZGU6bmV0XCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZ2F0ZSBhcyB0dW5uZWxHYXRlLCBoZWFkZXJzIGFzIHR1bm5lbEhlYWRlcnMsIHR5cGUgQXV0aEdhdGVBcGkgfSBmcm9tIFwiQGRieC10b29scy90dW5uZWxcIjtcbmltcG9ydCBQcm94eU1vZHVsZSBmcm9tIFwiaHR0cC1wcm94eS0zXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ0dW5uZWw6cHJveHlcIik7XG5cbnR5cGUgVXBncmFkZVNvY2tldCA9IFNvY2tldCAmIHsgZGVzdHJveVNvb24/OiAoKSA9PiB2b2lkIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJveHlPcHRpb25zIHtcbiAgLyoqIFRoZSBwb3J0IHRoaXMgcHJveHkgbGlzdGVucyBvbiAtIHRoZSBwb3J0IHBvcnRyIGFuZCB0aGUgcGxhdGZvcm0gcm91dGUgdG8uICovXG4gIHB1YmxpY1BvcnQ6IG51bWJlcjtcbiAgLyoqIFRoZSBwcml2YXRlIGxvb3BiYWNrIHBvcnQgdGhlIHdyYXBwZWQgYXBwIGxpc3RlbnMgb24uICovXG4gIGFwcFBvcnQ6IG51bWJlcjtcbiAgLyoqIFRoZSBnYXRlIGhhbmRsZXJzLiBPbWl0dGVkIChhbiBgLS1pbnNlY3VyZWAgcnVuKSBmb3J3YXJkcyBldmVyeXRoaW5nLiAqL1xuICBnYXRlPzogQXV0aEdhdGVBcGk7XG4gIC8qKiBFeHRyYSBgeC1gIGhlYWRlcnMgdHVubmVsIHRyYWZmaWMgbWF5IGZvcndhcmQuICovXG4gIGZvcndhcmRIZWFkZXJzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmZ1bmN0aW9uIHNlbmRKc29uKFxuICByZXNwb25zZTogU2VydmVyUmVzcG9uc2UsXG4gIHN0YXR1czogbnVtYmVyLFxuICBib2R5OiB1bmtub3duLFxuICBzZXRDb29raWU/OiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgcmVzcG9uc2Uud3JpdGVIZWFkKHN0YXR1cywge1xuICAgIFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgIC4uLihzZXRDb29raWUgPyB7IFwic2V0LWNvb2tpZVwiOiBzZXRDb29raWUgfSA6IHt9KSxcbiAgfSk7XG4gIHJlc3BvbnNlLmVuZChKU09OLnN0cmluZ2lmeShib2R5KSk7XG59XG5cbi8qKlxuICogSGFuZCBldmVyeSBCZXR0ZXIgQXV0aCBhbmQgY29tcGF0aWJpbGl0eSByb3V0ZSB0byB0aGUgc2hhcmVkIGdhdGUgcnVudGltZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQXV0aFJvdXRlKFxuICByZXF1ZXN0OiBJbmNvbWluZ01lc3NhZ2UsXG4gIHJlc3BvbnNlOiBTZXJ2ZXJSZXNwb25zZSxcbiAgcGF0aDogc3RyaW5nLFxuICBnYXRlOiBBdXRoR2F0ZUFwaSxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBwcmVmaXggPSB0dW5uZWxHYXRlLkFVVEhfUFJFRklYO1xuICBpZiAoIXBhdGguc3RhcnRzV2l0aChwcmVmaXgpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdhdGUuaGFuZGxlcihhd2FpdCB0dW5uZWxHYXRlLndlYlJlcXVlc3QocmVxdWVzdCkpO1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4gPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHJlc3VsdC5oZWFkZXJzLmVudHJpZXMoKSkge1xuICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwic2V0LWNvb2tpZVwiKSBoZWFkZXJzW25hbWVdID0gdmFsdWU7XG4gIH1cbiAgY29uc3QgY29va2llcyA9IHJlc3VsdC5oZWFkZXJzLmdldFNldENvb2tpZSgpO1xuICBpZiAoY29va2llcy5sZW5ndGgpIGhlYWRlcnNbXCJzZXQtY29va2llXCJdID0gY29va2llcztcbiAgcmVzcG9uc2Uud3JpdGVIZWFkKHJlc3VsdC5zdGF0dXMsIGhlYWRlcnMpO1xuICByZXNwb25zZS5lbmQoQnVmZmVyLmZyb20oYXdhaXQgcmVzdWx0LmFycmF5QnVmZmVyKCkpKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogU3RhcnQgdGhlIHByb3h5IGFuZCByZXNvbHZlIG9uY2UgaXQgaXMgbGlzdGVuaW5nLlxuICpcbiAqIGBwdWJsaWNEb21haW5gIGlzIGludGVudGlvbmFsbHkgTk9UIHBhc3NlZCB0byBgZ2F0ZVJlcXVlc3RgOiBvbiB0aGlzIHBhdGggZXZlcnlcbiAqIHJlcXVlc3QgYXJyaXZlZCBvbiB0aGUgcHVibGljIHBvcnQsIHNvIGl0IElTIHR1bm5lbCB0cmFmZmljIGJ5IGNvbnN0cnVjdGlvbiAtXG4gKiB3aGVyZWFzIHRoZSBpbi1wcm9jZXNzIGdhdGUgc2hhcmVzIGEgcG9ydCB3aXRoIHRoZSBwbGF0Zm9ybSBmcm9udCBkb29yIGFuZCBoYXNcbiAqIHRvIHRlbGwgdGhlbSBhcGFydCBieSBgSG9zdGAuIFBhc3NpbmcgdGhlIHJlcXVlc3QncyBvd24gaG9zdCBrZWVwcyB0aGUgc2hhcmVkXG4gKiBkZWNpc2lvbiBmdW5jdGlvbidzIGNvbnRyYWN0IHNhdGlzZmllZCB3aXRob3V0IHdlYWtlbmluZyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0UHJveHkob3B0aW9uczogUHJveHlPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb3h5ID0gUHJveHlNb2R1bGUuY3JlYXRlUHJveHlTZXJ2ZXIoe1xuICAgIHRhcmdldDogYGh0dHA6Ly8xMjcuMC4wLjE6JHtvcHRpb25zLmFwcFBvcnR9YCxcbiAgICB3czogdHJ1ZSxcbiAgICB4ZndkOiB0cnVlLFxuICB9KTtcbiAgY29uc3QgaGVhZGVyUG9saWN5ID0gdHVubmVsSGVhZGVycy50b0hlYWRlclBvbGljeShvcHRpb25zLmZvcndhcmRIZWFkZXJzKTtcbiAgY29uc3QgZ2F0ZSA9IG9wdGlvbnMuZ2F0ZTtcblxuICBjb25zdCBkZWNpZGUgPSAocmVxdWVzdDogSW5jb21pbmdNZXNzYWdlKTogUHJvbWlzZTx0dW5uZWxHYXRlLkdhdGVBY3Rpb24+ID0+XG4gICAgZ2F0ZVxuICAgICAgPyB0dW5uZWxHYXRlLmdhdGVSZXF1ZXN0KHJlcXVlc3QsIHtcbiAgICAgICAgICBnYXRlLFxuICAgICAgICAgIHB1YmxpY0RvbWFpbjogKHJlcXVlc3QuaGVhZGVycy5ob3N0ID8/IFwiXCIpLnNwbGl0KFwiOlwiKVswXSB8fCBcImxvY2FsaG9zdFwiLFxuICAgICAgICAgIGhlYWRlclBvbGljeSxcbiAgICAgICAgfSlcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlPHR1bm5lbEdhdGUuR2F0ZUFjdGlvbj4oXCJwYXNzXCIpO1xuXG4gIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigocmVxdWVzdCwgcmVzcG9uc2UpID0+IHtcbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gKHJlcXVlc3QudXJsID8/IFwiL1wiKS5zcGxpdChcIj9cIilbMF0gPz8gXCIvXCI7XG4gICAgICBpZiAoZ2F0ZSAmJiAoYXdhaXQgaGFuZGxlQXV0aFJvdXRlKHJlcXVlc3QsIHJlc3BvbnNlLCBwYXRoLCBnYXRlKSkpIHJldHVybjtcbiAgICAgIGlmICgoYXdhaXQgZGVjaWRlKHJlcXVlc3QpKSA9PT0gXCJkZW55XCIpIHtcbiAgICAgICAgc2VuZEpzb24ocmVzcG9uc2UsIDQwMSwgdHVubmVsR2F0ZS5VTkFVVEhPUklaRURfQk9EWSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHByb3h5LndlYihyZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgfSkoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihcInByb3h5IHJlcXVlc3QgZmFpbGVkXCIsIHsgZXJyb3IgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLmhlYWRlcnNTZW50KSBzZW5kSnNvbihyZXNwb25zZSwgNTAyLCB7IGVycm9yOiBcImJhZCBnYXRld2F5XCIgfSk7XG4gICAgICBlbHNlIHJlc3BvbnNlLmVuZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBIHdlYnNvY2tldCB1cGdyYWRlIGNhbm5vdCBiZSBhbnN3ZXJlZCB3aXRoIGEgNDAxIGJvZHksIHNvIGEgZGVuaWVkIG9uZSBpc1xuICAvLyBkZXN0cm95ZWQgLSB0aGUgY2xpZW50IHNlZXMgdGhlIGhhbmRzaGFrZSBmYWlsLCB3aGljaCBpcyB3aGF0IGEgYnJvd3NlcidzXG4gIC8vIFdlYlNvY2tldCBlcnJvciBoYW5kbGVyIGV4cGVjdHMuXG4gIHNlcnZlci5vbihcInVwZ3JhZGVcIiwgKHJlcXVlc3Q6IEluY29taW5nTWVzc2FnZSwgc29ja2V0OiBTb2NrZXQsIGhlYWQ6IEJ1ZmZlcikgPT4ge1xuICAgIGNvbnN0IHVwZ3JhZGVTb2NrZXQgPSBzb2NrZXQgYXMgVXBncmFkZVNvY2tldDtcbiAgICB1cGdyYWRlU29ja2V0LmRlc3Ryb3lTb29uID8/PSAoKSA9PiB1cGdyYWRlU29ja2V0LmVuZCgpO1xuICAgIHZvaWQgZGVjaWRlKHJlcXVlc3QpXG4gICAgICAudGhlbigoYWN0aW9uKSA9PiB7XG4gICAgICAgIGlmIChhY3Rpb24gPT09IFwiZGVueVwiKSB1cGdyYWRlU29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgZWxzZSBwcm94eS53cyhyZXF1ZXN0LCB1cGdyYWRlU29ja2V0LCBoZWFkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4gdXBncmFkZVNvY2tldC5kZXN0cm95KCkpO1xuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXJ2ZXIubGlzdGVuKG9wdGlvbnMucHVibGljUG9ydCwgXCIwLjAuMC4wXCIsICgpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKFwicHJveHkgbGlzdGVuaW5nXCIsIHsgcHVibGljUG9ydDogb3B0aW9ucy5wdWJsaWNQb3J0LCBhcHBQb3J0OiBvcHRpb25zLmFwcFBvcnQgfSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
package/package.json CHANGED
@@ -23,12 +23,14 @@
23
23
  "typescript": "^5.9.3"
24
24
  },
25
25
  "dependencies": {
26
- "@dbx-tools/appkit": "0.6.90",
27
- "@dbx-tools/core": "0.6.90",
28
- "@dbx-tools/email": "0.6.90",
29
- "@dbx-tools/shared-core": "0.6.90",
30
- "@dbx-tools/shared-email": "0.6.90",
31
- "@dbx-tools/tunnel": "0.6.90",
26
+ "@databricks/appkit": "^0.43.0",
27
+ "@dbx-tools/appkit": "0.6.92",
28
+ "@dbx-tools/auth": "0.6.92",
29
+ "@dbx-tools/core": "0.6.92",
30
+ "@dbx-tools/email": "0.6.92",
31
+ "@dbx-tools/shared-core": "0.6.92",
32
+ "@dbx-tools/shared-email": "0.6.92",
33
+ "@dbx-tools/tunnel": "0.6.92",
32
34
  "commander": "^15.0.0",
33
35
  "http-proxy-3": "^1.23.1"
34
36
  },
@@ -62,7 +64,7 @@
62
64
  "./package.json": "./package.json"
63
65
  }
64
66
  },
65
- "version": "0.6.90",
67
+ "version": "0.6.92",
66
68
  "types": "./lib/index.d.ts",
67
69
  "type": "module",
68
70
  "exports": {
package/src/app.ts CHANGED
@@ -15,16 +15,35 @@
15
15
  * @module
16
16
  */
17
17
 
18
+ import { lakebase } from "@databricks/appkit";
18
19
  import { appkit } from "@dbx-tools/appkit";
20
+ import { storage as authStorage } from "@dbx-tools/auth";
19
21
  import { email } from "@dbx-tools/email";
22
+ import { object } from "@dbx-tools/shared-core";
20
23
  import { authGate, type AuthGateApi, type AuthGateConfig } from "@dbx-tools/tunnel";
21
24
 
22
25
  /** Boot the gate app and return the handlers the proxy authenticates against. */
23
26
  export async function startGateApp(config: AuthGateConfig): Promise<AuthGateApi> {
24
27
  // No `server()` plugin: nothing here listens. `plugins` order matters - `email`
25
28
  // registers its transport before `authGate` looks for a sibling to send with.
26
- const plugins = await appkit.createApp({ plugins: [email(), authGate(config)] });
27
- const api = plugins.authGate as AuthGateApi | undefined;
28
- if (!api) throw new Error("the authGate plugin exposed no api");
29
+ const plugins = await appkit.createApp({
30
+ plugins: [
31
+ ...(authStorage.shouldUseLakebase(config) ? [lakebase()] : []),
32
+ ...(config.sendCode ? [] : [email()]),
33
+ authGate(config),
34
+ ],
35
+ });
36
+ const api = Reflect.get(plugins, "authGate");
37
+ if (!isAuthGateApi(api)) throw new Error("the authGate plugin exposed no api");
29
38
  return api;
30
39
  }
40
+
41
+ function isAuthGateApi(value: unknown): value is AuthGateApi {
42
+ return (
43
+ object.isRecord(value) &&
44
+ typeof value.handler === "function" &&
45
+ typeof value.session === "function" &&
46
+ typeof value.status === "function" &&
47
+ typeof value.close === "function"
48
+ );
49
+ }
package/src/cli.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `dbx tunnel` - front a command with a public portr tunnel and an email-OTP gate.
2
+ * `dbx tunnel` - front a command with a public portr tunnel and passwordless gate.
3
3
  *
4
4
  * This is the WRAPPER path, and it exists for one case: a project that does not
5
5
  * use `@dbx-tools/appkit`'s `createApp`, and therefore cannot register
@@ -72,6 +72,8 @@ function addOptions(command: Command): Command {
72
72
  .option("--session-ttl <seconds>", "session lifetime")
73
73
  .option("--code-ttl <seconds>", "one-time-code lifetime")
74
74
  .option("--session-cutoff <when>", "invalidate every session issued before this")
75
+ .option("--auth-storage <mode>", "auth database: auto, lakebase, or sqlite")
76
+ .option("--auth-sqlite-path <path>", "local Better Auth SQLite file")
75
77
  .option("--forward-headers <patterns...>", "extra x- headers tunnel traffic may forward")
76
78
  .option("--insecure", "run open, with no gate");
77
79
  }
@@ -123,7 +125,12 @@ async function run(raw: TunnelOptions, command: readonly string[]): Promise<void
123
125
  // an `--insecure` run never loads either.
124
126
  const gate = resolved.gate.insecure
125
127
  ? undefined
126
- : await (await import("./app.ts")).startGateApp(resolved.gateConfig);
128
+ : await (
129
+ await import("./app.ts")
130
+ ).startGateApp({
131
+ ...resolved.gateConfig,
132
+ publicDomain: resolved.gate.publicDomain ?? `localhost:${resolved.publicPort}`,
133
+ });
127
134
  if (!gate) logger.warn("running OPEN - no gate is in front of this tunnel");
128
135
 
129
136
  await startProxy({
@@ -150,7 +157,7 @@ export function buildProgram(name = "dbx tunnel"): Command {
150
157
  const program = addOptions(
151
158
  new Command()
152
159
  .name(name)
153
- .description("Front a command with a portr tunnel and an email-OTP gate"),
160
+ .description("Front a command with a portr tunnel and passwordless auth"),
154
161
  );
155
162
 
156
163
  // `run` is the DEFAULT action as well as a named subcommand, preserving the old
package/src/options.ts CHANGED
@@ -12,6 +12,7 @@
12
12
  * @module
13
13
  */
14
14
 
15
+ import type { AuthStorageMode } from "@dbx-tools/auth";
15
16
  import { config } from "@dbx-tools/core";
16
17
  import { object } from "@dbx-tools/shared-core";
17
18
  import { type AuthGateConfig, plugin, portr } from "@dbx-tools/tunnel";
@@ -29,6 +30,8 @@ export interface TunnelOptions {
29
30
  sessionTtl?: string | number;
30
31
  codeTtl?: string | number;
31
32
  sessionCutoff?: string;
33
+ authStorage?: AuthStorageMode;
34
+ authSqlitePath?: string;
32
35
  forwardHeaders?: string[];
33
36
  insecure?: boolean;
34
37
  }
@@ -66,6 +69,8 @@ export function resolveTunnelOptions(options: TunnelOptions): ResolvedTunnelOpti
66
69
  sessionTtlSeconds: object.toNumber(options.sessionTtl),
67
70
  codeTtlSeconds: object.toNumber(options.codeTtl),
68
71
  sessionCutoff: options.sessionCutoff,
72
+ storage: options.authStorage,
73
+ sqlitePath: options.authSqlitePath,
69
74
  forwardHeaders: options.forwardHeaders,
70
75
  insecure: options.insecure,
71
76
  publicDomain: options.publicDomain,
package/src/proxy.ts CHANGED
@@ -19,13 +19,14 @@
19
19
 
20
20
  import { createServer, type IncomingMessage, type ServerResponse } from "node:http";
21
21
  import type { Socket } from "node:net";
22
- import { http, json, log } from "@dbx-tools/shared-core";
23
- import { authRequestSchema, authVerifySchema, SESSION_COOKIE_NAME } from "@dbx-tools/shared-email";
22
+ import { log } from "@dbx-tools/shared-core";
24
23
  import { gate as tunnelGate, headers as tunnelHeaders, type AuthGateApi } from "@dbx-tools/tunnel";
25
24
  import ProxyModule from "http-proxy-3";
26
25
 
27
26
  const logger = log.logger("tunnel:proxy");
28
27
 
28
+ type UpgradeSocket = Socket & { destroySoon?: () => void };
29
+
29
30
  export interface ProxyOptions {
30
31
  /** The port this proxy listens on - the port portr and the platform route to. */
31
32
  publicPort: number;
@@ -37,16 +38,6 @@ export interface ProxyOptions {
37
38
  forwardHeaders?: readonly string[];
38
39
  }
39
40
 
40
- /** Read a request body as text; a transport error yields whatever arrived. */
41
- function readBody(request: IncomingMessage): Promise<string> {
42
- return new Promise((resolve) => {
43
- let body = "";
44
- request.on("data", (chunk) => (body += chunk));
45
- request.on("end", () => resolve(body));
46
- request.on("error", () => resolve(body));
47
- });
48
- }
49
-
50
41
  function sendJson(
51
42
  response: ServerResponse,
52
43
  status: number,
@@ -60,14 +51,8 @@ function sendJson(
60
51
  response.end(JSON.stringify(body));
61
52
  }
62
53
 
63
- function sessionCookieValue(request: IncomingMessage): string | undefined {
64
- return http.parseCookies(request.headers.cookie ?? null)[SESSION_COOKIE_NAME];
65
- }
66
-
67
54
  /**
68
- * Answer one of the four login routes, or return `false` when the request is not
69
- * one of them. Mirrors the plugin's route handlers: `request` always reports
70
- * success (anti-enumeration) and `verify` sets the session cookie on success.
55
+ * Hand every Better Auth and compatibility route to the shared gate runtime.
71
56
  */
72
57
  async function handleAuthRoute(
73
58
  request: IncomingMessage,
@@ -76,45 +61,17 @@ async function handleAuthRoute(
76
61
  gate: AuthGateApi,
77
62
  ): Promise<boolean> {
78
63
  const prefix = tunnelGate.AUTH_PREFIX;
79
- const ip = tunnelGate.clientIp(request);
80
-
81
- if (path === `${prefix}/status`) {
82
- sendJson(response, 200, await gate.status(sessionCookieValue(request)));
83
- return true;
84
- }
85
- if (path === `${prefix}/request` && request.method === "POST") {
86
- const parsed = authRequestSchema.safeParse(json.parseRecord(await readBody(request)));
87
- sendJson(
88
- response,
89
- 200,
90
- parsed.success ? await gate.request(parsed.data.email, ip) : { ok: true },
91
- );
92
- return true;
93
- }
94
- if (path === `${prefix}/verify` && request.method === "POST") {
95
- const parsed = authVerifySchema.safeParse(json.parseRecord(await readBody(request)));
96
- if (!parsed.success) {
97
- sendJson(response, 200, { ok: false });
98
- return true;
99
- }
100
- const result = await gate.verify(parsed.data.email, parsed.data.code, ip);
101
- const cookie =
102
- result.ok && result.token
103
- ? tunnelGate.sessionSetCookie(result.token, gate.sessionTtlSeconds)
104
- : undefined;
105
- sendJson(
106
- response,
107
- 200,
108
- { ok: result.ok, ...(result.retryAfter ? { retryAfter: result.retryAfter } : {}) },
109
- cookie,
110
- );
111
- return true;
112
- }
113
- if (path === `${prefix}/logout` && request.method === "POST") {
114
- sendJson(response, 200, { ok: true }, tunnelGate.LOGOUT_SET_COOKIE);
115
- return true;
64
+ if (!path.startsWith(prefix)) return false;
65
+ const result = await gate.handler(await tunnelGate.webRequest(request));
66
+ const headers: Record<string, string | string[]> = {};
67
+ for (const [name, value] of result.headers.entries()) {
68
+ if (name.toLowerCase() !== "set-cookie") headers[name] = value;
116
69
  }
117
- return false;
70
+ const cookies = result.headers.getSetCookie();
71
+ if (cookies.length) headers["set-cookie"] = cookies;
72
+ response.writeHead(result.status, headers);
73
+ response.end(Buffer.from(await result.arrayBuffer()));
74
+ return true;
118
75
  }
119
76
 
120
77
  /**
@@ -164,12 +121,14 @@ export function startProxy(options: ProxyOptions): Promise<void> {
164
121
  // destroyed - the client sees the handshake fail, which is what a browser's
165
122
  // WebSocket error handler expects.
166
123
  server.on("upgrade", (request: IncomingMessage, socket: Socket, head: Buffer) => {
124
+ const upgradeSocket = socket as UpgradeSocket;
125
+ upgradeSocket.destroySoon ??= () => upgradeSocket.end();
167
126
  void decide(request)
168
127
  .then((action) => {
169
- if (action === "deny") socket.destroy();
170
- else proxy.ws(request, socket, head);
128
+ if (action === "deny") upgradeSocket.destroy();
129
+ else proxy.ws(request, upgradeSocket, head);
171
130
  })
172
- .catch(() => socket.destroy());
131
+ .catch(() => upgradeSocket.destroy());
173
132
  });
174
133
 
175
134
  return new Promise((resolve) => {