@dbx-tools/appkit 0.6.68 → 0.6.70
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 +7 -8
- package/index.ts +1 -3
- package/lib/index.d.ts +1 -3
- package/lib/index.js +1 -2
- package/lib/src/appkit.d.ts +92 -3
- package/lib/src/appkit.js +229 -8
- package/lib/src/interceptor.d.ts +10 -10
- package/lib/src/interceptor.js +7 -7
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/appkit.ts +310 -7
- package/src/interceptor.ts +10 -10
- package/lib/src/create-app.d.ts +0 -96
- package/lib/src/create-app.js +0 -154
- package/src/create-app.ts +0 -230
package/README.md
CHANGED
|
@@ -50,16 +50,16 @@ Use this package when the friction is around bootstrapping and reuse:
|
|
|
50
50
|
|
|
51
51
|
## Create An Auto-Configured App
|
|
52
52
|
|
|
53
|
-
`
|
|
53
|
+
`appkit.createApp` is a drop-in wrapper around AppKit `createApp` with the
|
|
54
54
|
same config and the same typed plugin-export map. It runs
|
|
55
|
-
`
|
|
55
|
+
`appkit.autoConfigure()` first so enabled capabilities can populate
|
|
56
56
|
environment variables before plugin setup runs.
|
|
57
57
|
|
|
58
58
|
```ts
|
|
59
59
|
import { lakebase, server } from "@databricks/appkit";
|
|
60
|
-
import {
|
|
60
|
+
import { appkit } from "@dbx-tools/appkit";
|
|
61
61
|
|
|
62
|
-
await
|
|
62
|
+
await appkit.createApp({
|
|
63
63
|
plugins: [server(), lakebase()],
|
|
64
64
|
});
|
|
65
65
|
```
|
|
@@ -76,7 +76,7 @@ Databricks Asset Bundle validation, and deployed Apps.
|
|
|
76
76
|
|
|
77
77
|
Boot-time resolution runs as the service principal before any plugin exists, so
|
|
78
78
|
it sits outside AppKit's interceptor chain. It carries its own timeout, and
|
|
79
|
-
`
|
|
79
|
+
`appkit.autoConfigure()` accepts an `AbortSignal` when a caller wants to
|
|
80
80
|
cancel it earlier.
|
|
81
81
|
|
|
82
82
|
Use the lower-level functions when you need to inspect or customize the result:
|
|
@@ -110,7 +110,7 @@ reason.
|
|
|
110
110
|
|
|
111
111
|
## Configuration
|
|
112
112
|
|
|
113
|
-
`
|
|
113
|
+
`appkit.createApp()` accepts everything AppKit's `createApp` does, plus:
|
|
114
114
|
|
|
115
115
|
| Option | Type | Default | Description |
|
|
116
116
|
| --------------- | ------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -324,11 +324,10 @@ is shared. `@dbx-tools/appkit-mastra` exposes this as its `genieIdentity` option
|
|
|
324
324
|
|
|
325
325
|
| Module | Responsibility |
|
|
326
326
|
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
327
|
-
| `
|
|
327
|
+
| `appkit` | `createApp()` / `autoConfigure()`, plus execution context lookup and initialization. |
|
|
328
328
|
| `lakebaseResolver` | Lakebase connection discovery, default picking, optional auto-create, and env application (`applyLakebaseEnv()` for the full set a pool needs). |
|
|
329
329
|
| `pgaddress` | Permissive Lakebase/Postgres address parser. |
|
|
330
330
|
| `config` | Local/env/bundle/app-yaml config lookup. |
|
|
331
|
-
| `appkit` | Execution context lookup and initialization. |
|
|
332
331
|
| `databricks` | App env detection and SDK context cancellation adapters. |
|
|
333
332
|
| `plugin` | Typed AppKit plugin data, instance, and required-instance lookup. |
|
|
334
333
|
| `provision` | Cache schema provisioning helpers. |
|
package/index.ts
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
|
|
5
5
|
export * as appkit from "./src/appkit.ts";
|
|
6
6
|
export * as config from "./src/config.ts";
|
|
7
|
-
export * as createApp from "./src/create-app.ts";
|
|
8
7
|
export * as databricks from "./src/databricks.ts";
|
|
9
8
|
export * as identity from "./src/identity.ts";
|
|
10
9
|
export * as interceptor from "./src/interceptor.ts";
|
|
@@ -12,9 +11,8 @@ export * as lakebaseResolver from "./src/lakebase-resolver.ts";
|
|
|
12
11
|
export * as pgaddress from "./src/pgaddress.ts";
|
|
13
12
|
export * as plugin from "./src/plugin.ts";
|
|
14
13
|
export * as provision from "./src/provision.ts";
|
|
15
|
-
export type { ExecutionContextLike, WorkspaceClientLike } from "./src/appkit.ts";
|
|
14
|
+
export type { AutoConfigureMode, CreateAppConfig, ExecutionContextLike, WorkspaceClientLike } from "./src/appkit.ts";
|
|
16
15
|
export type { BundleValidateJson, ConfigFile, ConfigSource, ConfigMapValue, ResolveConfigValueOptions } from "./src/config.ts";
|
|
17
|
-
export type { AutoConfigureMode, CreateAppConfig } from "./src/create-app.ts";
|
|
18
16
|
export { MAX_TCP_PORT } from "./src/databricks.ts";
|
|
19
17
|
export type { ContextLike } from "./src/databricks.ts";
|
|
20
18
|
export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER, IDENTITY_MODES, DEFAULT_IDENTITY_MODE } from "./src/identity.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export * as appkit from "./src/appkit.ts";
|
|
2
2
|
export * as config from "./src/config.ts";
|
|
3
|
-
export * as createApp from "./src/create-app.ts";
|
|
4
3
|
export * as databricks from "./src/databricks.ts";
|
|
5
4
|
export * as identity from "./src/identity.ts";
|
|
6
5
|
export * as interceptor from "./src/interceptor.ts";
|
|
@@ -8,9 +7,8 @@ export * as lakebaseResolver from "./src/lakebase-resolver.ts";
|
|
|
8
7
|
export * as pgaddress from "./src/pgaddress.ts";
|
|
9
8
|
export * as plugin from "./src/plugin.ts";
|
|
10
9
|
export * as provision from "./src/provision.ts";
|
|
11
|
-
export type { ExecutionContextLike, WorkspaceClientLike } from "./src/appkit.ts";
|
|
10
|
+
export type { AutoConfigureMode, CreateAppConfig, ExecutionContextLike, WorkspaceClientLike } from "./src/appkit.ts";
|
|
12
11
|
export type { BundleValidateJson, ConfigFile, ConfigSource, ConfigMapValue, ResolveConfigValueOptions } from "./src/config.ts";
|
|
13
|
-
export type { AutoConfigureMode, CreateAppConfig } from "./src/create-app.ts";
|
|
14
12
|
export { MAX_TCP_PORT } from "./src/databricks.ts";
|
|
15
13
|
export type { ContextLike } from "./src/databricks.ts";
|
|
16
14
|
export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER, IDENTITY_MODES, DEFAULT_IDENTITY_MODE } from "./src/identity.ts";
|
package/lib/index.js
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export * as appkit from "./src/appkit.js";
|
|
5
5
|
export * as config from "./src/config.js";
|
|
6
|
-
export * as createApp from "./src/create-app.js";
|
|
7
6
|
export * as databricks from "./src/databricks.js";
|
|
8
7
|
export * as identity from "./src/identity.js";
|
|
9
8
|
export * as interceptor from "./src/interceptor.js";
|
|
@@ -15,4 +14,4 @@ export { MAX_TCP_PORT } from "./src/databricks.js";
|
|
|
15
14
|
export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER, IDENTITY_MODES, DEFAULT_IDENTITY_MODE } from "./src/identity.js";
|
|
16
15
|
export { LifecycleBridgePlugin, lifecycleBridge } from "./src/interceptor.js";
|
|
17
16
|
export { SSL_MODES } from "./src/pgaddress.js";
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLGdCQUFnQixNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBR2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxJLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUc5RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgKiBhcyBhcHBraXQgZnJvbSBcIi4vc3JjL2FwcGtpdC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3MgZnJvbSBcIi4vc3JjL2RhdGFicmlja3MudHNcIjtcbmV4cG9ydCAqIGFzIGlkZW50aXR5IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0ICogYXMgaW50ZXJjZXB0b3IgZnJvbSBcIi4vc3JjL2ludGVyY2VwdG9yLnRzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZVJlc29sdmVyIGZyb20gXCIuL3NyYy9sYWtlYmFzZS1yZXNvbHZlci50c1wiO1xuZXhwb3J0ICogYXMgcGdhZGRyZXNzIGZyb20gXCIuL3NyYy9wZ2FkZHJlc3MudHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBwcm92aXNpb24gZnJvbSBcIi4vc3JjL3Byb3Zpc2lvbi50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRvQ29uZmlndXJlTW9kZSwgQ3JlYXRlQXBwQ29uZmlnLCBFeGVjdXRpb25Db250ZXh0TGlrZSwgV29ya3NwYWNlQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9hcHBraXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQnVuZGxlVmFsaWRhdGVKc29uLCBDb25maWdGaWxlLCBDb25maWdTb3VyY2UsIENvbmZpZ01hcFZhbHVlLCBSZXNvbHZlQ29uZmlnVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHsgTUFYX1RDUF9QT1JUIH0gZnJvbSBcIi4vc3JjL2RhdGFicmlja3MudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29udGV4dExpa2UgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy50c1wiO1xuZXhwb3J0IHsgQUNDRVNTX1RPS0VOX0hFQURFUiwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCBJREVOVElUWV9NT0RFUywgREVGQVVMVF9JREVOVElUWV9NT0RFIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IElkZW50aXR5TW9kZSwgSGVhZGVyQmVhcmluZyB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHsgTGlmZWN5Y2xlQnJpZGdlUGx1Z2luLCBsaWZlY3ljbGVCcmlkZ2UgfSBmcm9tIFwiLi9zcmMvaW50ZXJjZXB0b3IudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGlmZWN5Y2xlRXZlbnQsIExpZmVjeWNsZUhhbmRsZXIsIFJlc29sdmVkQXBwRW52LCBCaW5kYWJsZVByb2Nlc3MsIEludGVyY2VwdG9yQ29udGV4dCwgSW50ZXJjZXB0b3IsIEludGVyY2VwdG9yUnVudGltZSB9IGZyb20gXCIuL3NyYy9pbnRlcmNlcHRvci50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYmFzZVJlc29sdmVySW5wdXRzLCBMYWtlYmFzZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCB7IFNTTF9NT0RFUyB9IGZyb20gXCIuL3NyYy9wZ2FkZHJlc3MudHNcIjtcbmV4cG9ydCB0eXBlIHsgU3NsTW9kZSwgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzLCBQYXJzZWRBZGRyZXNzIH0gZnJvbSBcIi4vc3JjL3BnYWRkcmVzcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBQbHVnaW5Db250ZXh0TGlrZSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbiJdfQ==
|
package/lib/src/appkit.d.ts
CHANGED
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* AppKit runtime glue: the auto-configuring `createApp` drop-in, plus the
|
|
3
|
+
* per-request execution context helpers and types derived from it.
|
|
4
|
+
*
|
|
5
|
+
* `createApp` runs dbx-tools auto-configuration, then delegates to AppKit's own
|
|
6
|
+
* `createApp` with the same arguments and the same typed plugin-export map.
|
|
7
|
+
* Drop it in as a one-for-one replacement:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { lakebase, server } from "@databricks/appkit";
|
|
11
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
12
|
+
*
|
|
13
|
+
* await appkit.createApp({ plugins: [server(), lakebase()] });
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* Auto-configuration runs BEFORE delegating so plugins see a fully populated
|
|
17
|
+
* `process.env` during their synchronous `setup()`. Lakebase Postgres runs when
|
|
18
|
+
* a `lakebase` plugin is present, or when {@link AutoConfigureMode} is set
|
|
19
|
+
* explicitly on the config object.
|
|
4
20
|
*
|
|
5
21
|
* `getExecutionContext()` is AppKit's own accessor for the OBO-scoped workspace
|
|
6
22
|
* client + request metadata; the wrappers here make it safe to call outside a
|
|
@@ -10,7 +26,79 @@
|
|
|
10
26
|
*
|
|
11
27
|
* @module
|
|
12
28
|
*/
|
|
13
|
-
import { getExecutionContext } from "@databricks/appkit";
|
|
29
|
+
import { createApp as appkitCreateApp, getExecutionContext } from "@databricks/appkit";
|
|
30
|
+
import type { PluginMap } from "@databricks/appkit/dist/shared/src/plugin";
|
|
31
|
+
import { type Interceptor } from "./interceptor.ts";
|
|
32
|
+
import { type LakebaseConnection } from "./lakebase-resolver.ts";
|
|
33
|
+
type AppKitCreateAppConfig = NonNullable<Parameters<typeof appkitCreateApp>[0]>;
|
|
34
|
+
type AppKitPlugins = NonNullable<AppKitCreateAppConfig["plugins"]>;
|
|
35
|
+
/**
|
|
36
|
+
* What auto-configuration does before AppKit boots.
|
|
37
|
+
*
|
|
38
|
+
* - `"provision"`: resolve the Lakebase connection into `process.env`, then
|
|
39
|
+
* grant the AppKit cache schema to the connecting role.
|
|
40
|
+
* - `"env"`: resolve the Lakebase connection into `process.env` only.
|
|
41
|
+
*
|
|
42
|
+
* Omit it to get `"provision"` gated on a `lakebase` plugin being registered;
|
|
43
|
+
* set it explicitly to run regardless of the plugin list, or pass `false` to
|
|
44
|
+
* skip auto-configuration entirely.
|
|
45
|
+
*
|
|
46
|
+
* Set it EXPLICITLY on an app that has no `lakebase()` plugin but still wants
|
|
47
|
+
* AppKit's PERSISTENT cache. AppKit picks Lakebase for `CacheManager` only when
|
|
48
|
+
* `createLakebasePool()` can build a pool, and that reads `LAKEBASE_ENDPOINT` /
|
|
49
|
+
* `PGHOST` / `PGDATABASE` straight from `process.env` - so without this step the
|
|
50
|
+
* cache silently falls back to in-memory, and anything it holds (a session
|
|
51
|
+
* signing key, a one-time code) is lost on restart. `"env"` is the right mode
|
|
52
|
+
* there: the app SP cannot grant on the cache schema anyway.
|
|
53
|
+
*/
|
|
54
|
+
export type AutoConfigureMode = "env" | "provision";
|
|
55
|
+
/** AppKit's `createApp` config plus the dbx-tools auto-configuration switch. */
|
|
56
|
+
export type CreateAppConfig<T extends AppKitPlugins = AppKitPlugins> = Omit<AppKitCreateAppConfig, "plugins" | "onPluginsReady"> & {
|
|
57
|
+
plugins?: T;
|
|
58
|
+
onPluginsReady?: (appkit: PluginMap<T>) => void | Promise<void>;
|
|
59
|
+
/** Auto-configuration to run before AppKit boots. Defaults to `"provision"`. */
|
|
60
|
+
autoConfigure?: AutoConfigureMode | false;
|
|
61
|
+
/**
|
|
62
|
+
* One or many {@link Interceptor}s handed an {@link InterceptorContext} once
|
|
63
|
+
* auto-configuration has computed the env. Each receives the resolved env, an
|
|
64
|
+
* AppKit-lifecycle hook, and `bindProcess` for concurrently-style supervision -
|
|
65
|
+
* see `./interceptor`. The tunnel is the primary consumer.
|
|
66
|
+
*/
|
|
67
|
+
interceptor?: Interceptor | Interceptor[];
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Run enabled auto-configuration steps without calling AppKit's `createApp`.
|
|
71
|
+
*
|
|
72
|
+
* Lakebase Postgres resolves when {@link CreateAppConfig.autoConfigure} is set
|
|
73
|
+
* explicitly or a `lakebase` plugin is listed in `config.plugins`. `signal`
|
|
74
|
+
* cancels the resolution; it is combined with an internal boot timeout either
|
|
75
|
+
* way.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
79
|
+
*
|
|
80
|
+
* // Populate PGHOST / PGDATABASE / LAKEBASE_ENDPOINT without booting AppKit.
|
|
81
|
+
* await appkit.autoConfigure({ autoConfigure: "env" });
|
|
82
|
+
*/
|
|
83
|
+
export declare function autoConfigure<T extends AppKitPlugins>(config?: CreateAppConfig<T>, signal?: AbortSignal): Promise<LakebaseConnection | undefined>;
|
|
84
|
+
/**
|
|
85
|
+
* Auto-configuring drop-in for AppKit's `createApp`: same config, same typed
|
|
86
|
+
* plugin-export map, with {@link autoConfigure} run first.
|
|
87
|
+
*
|
|
88
|
+
* When {@link CreateAppConfig.interceptor}s are given, each is invoked with an
|
|
89
|
+
* {@link InterceptorContext} AFTER auto-configuration computes the env and BEFORE
|
|
90
|
+
* AppKit boots - so an interceptor can read the resolved connection, register
|
|
91
|
+
* lifecycle handlers, and `bindProcess` a child. A hidden {@link lifecycleBridge}
|
|
92
|
+
* plugin is injected so those `onLifecycle` handlers fire on the genuine AppKit
|
|
93
|
+
* events; it has no exports, so the returned {@link PluginMap} is unchanged.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* import { lakebase, server } from "@databricks/appkit";
|
|
97
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
98
|
+
*
|
|
99
|
+
* const app = await appkit.createApp({ plugins: [server(), lakebase()] });
|
|
100
|
+
*/
|
|
101
|
+
export declare function createApp<T extends AppKitPlugins>(config?: CreateAppConfig<T>): Promise<PluginMap<T>>;
|
|
14
102
|
/**
|
|
15
103
|
* The AppKit per-request execution context returned by `getExecutionContext()`
|
|
16
104
|
* - the OBO-scoped workspace client plus the surrounding request metadata.
|
|
@@ -49,3 +137,4 @@ export declare function tryGetExecutionContext(): ExecutionContextLike | undefin
|
|
|
49
137
|
* const client = appkit.tryGetExecutionContext()?.client;
|
|
50
138
|
*/
|
|
51
139
|
export declare function ensureInitialized(): Promise<void>;
|
|
140
|
+
export {};
|
package/lib/src/appkit.js
CHANGED
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* AppKit runtime glue: the auto-configuring `createApp` drop-in, plus the
|
|
3
|
+
* per-request execution context helpers and types derived from it.
|
|
4
|
+
*
|
|
5
|
+
* `createApp` runs dbx-tools auto-configuration, then delegates to AppKit's own
|
|
6
|
+
* `createApp` with the same arguments and the same typed plugin-export map.
|
|
7
|
+
* Drop it in as a one-for-one replacement:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { lakebase, server } from "@databricks/appkit";
|
|
11
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
12
|
+
*
|
|
13
|
+
* await appkit.createApp({ plugins: [server(), lakebase()] });
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* Auto-configuration runs BEFORE delegating so plugins see a fully populated
|
|
17
|
+
* `process.env` during their synchronous `setup()`. Lakebase Postgres runs when
|
|
18
|
+
* a `lakebase` plugin is present, or when {@link AutoConfigureMode} is set
|
|
19
|
+
* explicitly on the config object.
|
|
4
20
|
*
|
|
5
21
|
* `getExecutionContext()` is AppKit's own accessor for the OBO-scoped workspace
|
|
6
22
|
* client + request metadata; the wrappers here make it safe to call outside a
|
|
@@ -10,9 +26,211 @@
|
|
|
10
26
|
*
|
|
11
27
|
* @module
|
|
12
28
|
*/
|
|
13
|
-
import { createApp, getExecutionContext, InitializationError } from "@databricks/appkit";
|
|
14
|
-
import { log } from "@dbx-tools/shared-core";
|
|
29
|
+
import { createApp as appkitCreateApp, getExecutionContext, InitializationError, } from "@databricks/appkit";
|
|
30
|
+
import { async, log } from "@dbx-tools/shared-core";
|
|
31
|
+
import { createInterceptorContext, lifecycleBridge, } from "./interceptor.js";
|
|
32
|
+
import { applyLakebaseEnv } from "./lakebase-resolver.js";
|
|
33
|
+
import { provisionCacheSchema } from "./provision.js";
|
|
15
34
|
const logger = log.logger("appkit");
|
|
35
|
+
const LAKEBASE_PLUGIN = "lakebase";
|
|
36
|
+
const DEFAULT_AUTO_CONFIGURE = "provision";
|
|
37
|
+
/**
|
|
38
|
+
* Upper bound on boot-time auto-configuration. It runs as the service principal
|
|
39
|
+
* before any plugin is constructed, so it sits outside AppKit's interceptor
|
|
40
|
+
* chain and inherits no timeout, retry, or telemetry from it. The budget covers
|
|
41
|
+
* the resolver's own worst case (create a project, then wait for its endpoint)
|
|
42
|
+
* plus the cache-schema grants.
|
|
43
|
+
*/
|
|
44
|
+
const AUTO_CONFIGURE_TIMEOUT_MS = 11 * 60_000;
|
|
45
|
+
function usesPlugin(config, name) {
|
|
46
|
+
return Boolean(config?.plugins?.some((entry) => entry.name === name));
|
|
47
|
+
}
|
|
48
|
+
/** Plugin names for boot logs (order preserved). */
|
|
49
|
+
function pluginNames(config) {
|
|
50
|
+
return (config?.plugins ?? []).map((entry) => entry.name);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Run enabled auto-configuration steps without calling AppKit's `createApp`.
|
|
54
|
+
*
|
|
55
|
+
* Lakebase Postgres resolves when {@link CreateAppConfig.autoConfigure} is set
|
|
56
|
+
* explicitly or a `lakebase` plugin is listed in `config.plugins`. `signal`
|
|
57
|
+
* cancels the resolution; it is combined with an internal boot timeout either
|
|
58
|
+
* way.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
62
|
+
*
|
|
63
|
+
* // Populate PGHOST / PGDATABASE / LAKEBASE_ENDPOINT without booting AppKit.
|
|
64
|
+
* await appkit.autoConfigure({ autoConfigure: "env" });
|
|
65
|
+
*/
|
|
66
|
+
export async function autoConfigure(config, signal) {
|
|
67
|
+
const mode = config?.autoConfigure ?? DEFAULT_AUTO_CONFIGURE;
|
|
68
|
+
const explicit = config?.autoConfigure !== undefined;
|
|
69
|
+
const lakebasePluginPresent = usesPlugin(config, LAKEBASE_PLUGIN);
|
|
70
|
+
const plugins = pluginNames(config);
|
|
71
|
+
logger.debug("autoConfigure: start", {
|
|
72
|
+
mode,
|
|
73
|
+
explicit,
|
|
74
|
+
lakebasePluginPresent,
|
|
75
|
+
plugins,
|
|
76
|
+
timeoutMs: AUTO_CONFIGURE_TIMEOUT_MS,
|
|
77
|
+
callerSignal: Boolean(signal),
|
|
78
|
+
});
|
|
79
|
+
if (mode === false || !(explicit || lakebasePluginPresent)) {
|
|
80
|
+
const skippedReason = mode === false ? "disabled" : "no lakebase plugin";
|
|
81
|
+
logger.debug("autoConfigure: skip", { skippedReason, mode, lakebasePluginPresent, plugins });
|
|
82
|
+
logger.info("ready", {
|
|
83
|
+
autoConfigure: mode,
|
|
84
|
+
lakebasePluginPresent,
|
|
85
|
+
provisioned: false,
|
|
86
|
+
skippedReason,
|
|
87
|
+
});
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
const controller = new AbortController();
|
|
91
|
+
async.tieAbortSignal(controller, signal);
|
|
92
|
+
async.tieAbortSignal(controller, AbortSignal.timeout(AUTO_CONFIGURE_TIMEOUT_MS));
|
|
93
|
+
const provision = mode === "provision";
|
|
94
|
+
logger.debug("autoConfigure: resolve lakebase", { provision, mode });
|
|
95
|
+
const resolved = await autoConfigureLakebase(provision, controller.signal);
|
|
96
|
+
logger.debug("autoConfigure: done", {
|
|
97
|
+
mode,
|
|
98
|
+
lakebasePluginPresent,
|
|
99
|
+
provisioned: provision,
|
|
100
|
+
...redactLakebaseConnection(resolved),
|
|
101
|
+
});
|
|
102
|
+
logger.info("ready", { autoConfigure: mode, lakebasePluginPresent, provisioned: provision });
|
|
103
|
+
return resolved;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Resolve Lakebase Postgres connection info, write the resolved values to
|
|
107
|
+
* `process.env`, and return the record. Used by {@link autoConfigure}; call
|
|
108
|
+
* {@link applyLakebaseEnv} directly when finer control is needed (a different
|
|
109
|
+
* `autoCreate` policy, or a caller that wants the env without booting AppKit).
|
|
110
|
+
*/
|
|
111
|
+
async function autoConfigureLakebase(provision, signal) {
|
|
112
|
+
logger.debug("autoConfigureLakebase: applyLakebaseEnv");
|
|
113
|
+
const { resolved, user } = await applyLakebaseEnv(undefined, signal);
|
|
114
|
+
logger.debug("autoConfigureLakebase: env applied", {
|
|
115
|
+
...redactLakebaseConnection(resolved),
|
|
116
|
+
user,
|
|
117
|
+
env: {
|
|
118
|
+
LAKEBASE_ENDPOINT: process.env.LAKEBASE_ENDPOINT,
|
|
119
|
+
PGHOST: process.env.PGHOST,
|
|
120
|
+
PGPORT: process.env.PGPORT,
|
|
121
|
+
PGDATABASE: process.env.PGDATABASE,
|
|
122
|
+
PGUSER: process.env.PGUSER,
|
|
123
|
+
PGSSLMODE: process.env.PGSSLMODE,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
logger.info("env updated", { ...redactLakebaseConnection(resolved), user });
|
|
127
|
+
if (provision) {
|
|
128
|
+
logger.debug("autoConfigureLakebase: provisionCacheSchema", { user });
|
|
129
|
+
await provisionCacheSchema(user, logger);
|
|
130
|
+
logger.debug("autoConfigureLakebase: provisionCacheSchema done");
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
logger.debug("autoConfigureLakebase: skip provision (mode=env)");
|
|
134
|
+
}
|
|
135
|
+
return resolved;
|
|
136
|
+
}
|
|
137
|
+
function redactLakebaseConnection(resolved) {
|
|
138
|
+
return {
|
|
139
|
+
project: resolved.project,
|
|
140
|
+
branch: resolved.branch,
|
|
141
|
+
endpoint: resolved.endpoint,
|
|
142
|
+
database: resolved.database,
|
|
143
|
+
host: resolved.host,
|
|
144
|
+
port: resolved.port,
|
|
145
|
+
sslMode: resolved.sslMode,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/** Build the {@link ResolvedAppEnv} interceptors read, from the auto-config result. */
|
|
149
|
+
function resolvedAppEnv(lakebase) {
|
|
150
|
+
return {
|
|
151
|
+
...(lakebase ? { lakebase } : {}),
|
|
152
|
+
...(process.env.DATABRICKS_HOST ? { databricksHost: process.env.DATABRICKS_HOST } : {}),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/** Normalize the `interceptor?: Interceptor | Interceptor[]` option to an array. */
|
|
156
|
+
function interceptorList(interceptor) {
|
|
157
|
+
if (!interceptor)
|
|
158
|
+
return [];
|
|
159
|
+
return Array.isArray(interceptor) ? interceptor : [interceptor];
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Auto-configuring drop-in for AppKit's `createApp`: same config, same typed
|
|
163
|
+
* plugin-export map, with {@link autoConfigure} run first.
|
|
164
|
+
*
|
|
165
|
+
* When {@link CreateAppConfig.interceptor}s are given, each is invoked with an
|
|
166
|
+
* {@link InterceptorContext} AFTER auto-configuration computes the env and BEFORE
|
|
167
|
+
* AppKit boots - so an interceptor can read the resolved connection, register
|
|
168
|
+
* lifecycle handlers, and `bindProcess` a child. A hidden {@link lifecycleBridge}
|
|
169
|
+
* plugin is injected so those `onLifecycle` handlers fire on the genuine AppKit
|
|
170
|
+
* events; it has no exports, so the returned {@link PluginMap} is unchanged.
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* import { lakebase, server } from "@databricks/appkit";
|
|
174
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
175
|
+
*
|
|
176
|
+
* const app = await appkit.createApp({ plugins: [server(), lakebase()] });
|
|
177
|
+
*/
|
|
178
|
+
export async function createApp(config) {
|
|
179
|
+
const plugins = pluginNames(config);
|
|
180
|
+
const interceptors = interceptorList(config?.interceptor);
|
|
181
|
+
logger.debug("createApp: start", {
|
|
182
|
+
plugins,
|
|
183
|
+
pluginCount: plugins.length,
|
|
184
|
+
interceptorCount: interceptors.length,
|
|
185
|
+
autoConfigure: config?.autoConfigure ?? "(default)",
|
|
186
|
+
hasOnPluginsReady: typeof config?.onPluginsReady === "function",
|
|
187
|
+
});
|
|
188
|
+
logger.debug("createApp: autoConfigure");
|
|
189
|
+
const lakebase = await autoConfigure(config);
|
|
190
|
+
logger.debug("createApp: autoConfigure returned", {
|
|
191
|
+
lakebase: lakebase ? redactLakebaseConnection(lakebase) : undefined,
|
|
192
|
+
});
|
|
193
|
+
const appConfig = { ...config };
|
|
194
|
+
delete appConfig.autoConfigure;
|
|
195
|
+
delete appConfig.interceptor;
|
|
196
|
+
if (interceptors.length === 0) {
|
|
197
|
+
logger.debug("createApp: no interceptors; delegating to AppKit createApp", {
|
|
198
|
+
plugins: pluginNames(appConfig),
|
|
199
|
+
});
|
|
200
|
+
const result = await appkitCreateApp(appConfig);
|
|
201
|
+
logger.debug("createApp: AppKit createApp returned", {
|
|
202
|
+
exportKeys: Object.keys(result ?? {}),
|
|
203
|
+
});
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
// Build the context from the computed env, run each interceptor (they register
|
|
207
|
+
// lifecycle handlers + bind processes), then inject the bridge that relays the
|
|
208
|
+
// REAL AppKit lifecycle into `runtime.emitLifecycle` during its `setup()`.
|
|
209
|
+
const env = resolvedAppEnv(lakebase);
|
|
210
|
+
logger.debug("createApp: interceptor context", {
|
|
211
|
+
hasLakebase: Boolean(env.lakebase),
|
|
212
|
+
databricksHost: env.databricksHost,
|
|
213
|
+
interceptorCount: interceptors.length,
|
|
214
|
+
});
|
|
215
|
+
const runtime = createInterceptorContext(env);
|
|
216
|
+
for (let i = 0; i < interceptors.length; i++) {
|
|
217
|
+
logger.debug("createApp: run interceptor", { index: i, of: interceptors.length });
|
|
218
|
+
await interceptors[i](runtime.context);
|
|
219
|
+
logger.debug("createApp: interceptor done", { index: i });
|
|
220
|
+
}
|
|
221
|
+
// Append the bridge to the plugins tuple. It is hidden and exports nothing, so
|
|
222
|
+
// the returned map still matches `PluginMap<T>`; the cast (through `unknown`) is
|
|
223
|
+
// only because appending widens the tuple type beyond `T`.
|
|
224
|
+
appConfig.plugins = [...(appConfig.plugins ?? []), lifecycleBridge({ runtime })];
|
|
225
|
+
logger.debug("createApp: lifecycle bridge injected; delegating to AppKit createApp", {
|
|
226
|
+
plugins: pluginNames(appConfig),
|
|
227
|
+
});
|
|
228
|
+
const result = await appkitCreateApp(appConfig);
|
|
229
|
+
logger.debug("createApp: AppKit createApp returned", {
|
|
230
|
+
exportKeys: Object.keys(result ?? {}),
|
|
231
|
+
});
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
16
234
|
/**
|
|
17
235
|
* The current AppKit execution context, or `undefined` when AppKit isn't
|
|
18
236
|
* initialized (outside a request scope). Swallows AppKit's
|
|
@@ -49,9 +267,12 @@ export function tryGetExecutionContext() {
|
|
|
49
267
|
* const client = appkit.tryGetExecutionContext()?.client;
|
|
50
268
|
*/
|
|
51
269
|
export async function ensureInitialized() {
|
|
52
|
-
if (
|
|
53
|
-
logger.debug("
|
|
54
|
-
|
|
270
|
+
if (tryGetExecutionContext()) {
|
|
271
|
+
logger.debug("ensureInitialized: already initialized");
|
|
272
|
+
return;
|
|
55
273
|
}
|
|
274
|
+
logger.debug("ensureInitialized: booting bare AppKit app");
|
|
275
|
+
await createApp({ plugins: [], autoConfigure: false });
|
|
276
|
+
logger.debug("ensureInitialized: done");
|
|
56
277
|
}
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwa2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGtpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQW1CcEM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCO0lBQ3BDLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLG1CQUFtQixFQUFFLENBQUM7UUFDbEMsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQjtJQUNyQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUMvQyxNQUFNLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmljIEFwcEtpdCBydW50aW1lIGdsdWU6IHRoZSBwZXItcmVxdWVzdCBleGVjdXRpb24gY29udGV4dCBhbmQgdGhlIHR5cGVzXG4gKiBkZXJpdmVkIGZyb20gaXQuIE5vdCBwbHVnaW4tc3BlY2lmaWMgLSB0aGF0IGxpdmVzIGluIGAuL3BsdWdpbmAuXG4gKlxuICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgaXMgQXBwS2l0J3Mgb3duIGFjY2Vzc29yIGZvciB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2VcbiAqIGNsaWVudCArIHJlcXVlc3QgbWV0YWRhdGE7IHRoZSB3cmFwcGVycyBoZXJlIG1ha2UgaXQgc2FmZSB0byBjYWxsIG91dHNpZGUgYVxuICogcmVxdWVzdCBzY29wZSAoe0BsaW5rIHRyeUdldEV4ZWN1dGlvbkNvbnRleHR9KSBhbmQgdG8gbGF6aWx5IGJvb3QgYSBiYXJlIGFwcFxuICogKHtAbGluayBlbnN1cmVJbml0aWFsaXplZH0pLCBhbmQgcmUtZXhwb3J0IHRoZSBkZXJpdmVkIHR5cGVzIHNvIGFkZC1vblxuICogcGFja2FnZXMgY2FuIHR5cGUgYSBjb250ZXh0IC8gY2xpZW50IHdpdGhvdXQgcmUtZGVyaXZpbmcgdGhlbSBpbmxpbmUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUFwcCwgZ2V0RXhlY3V0aW9uQ29udGV4dCwgSW5pdGlhbGl6YXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXRcIik7XG5cbi8qKlxuICogVGhlIEFwcEtpdCBwZXItcmVxdWVzdCBleGVjdXRpb24gY29udGV4dCByZXR1cm5lZCBieSBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYFxuICogLSB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2UgY2xpZW50IHBsdXMgdGhlIHN1cnJvdW5kaW5nIHJlcXVlc3QgbWV0YWRhdGEuXG4gKiBEZXJpdmVkIGZyb20gQXBwS2l0J3Mgb3duIHJldHVybiB0eXBlIHNvIGl0IHRyYWNrcyB0aGUgaW5zdGFsbGVkIHZlcnNpb24sIGFuZFxuICogcmUtZXhwb3J0ZWQgaGVyZSBzbyBhZGQtb24gcGFja2FnZXMgY2FuIHR5cGUgYSBjb250ZXh0IHBhcmFtZXRlciB3aXRob3V0IGVhY2hcbiAqIHJlLWRlcml2aW5nIHRoZSBzYW1lIGBSZXR1cm5UeXBlPHR5cGVvZiBnZXRFeGVjdXRpb25Db250ZXh0PmAgaW5saW5lLlxuICovXG5leHBvcnQgdHlwZSBFeGVjdXRpb25Db250ZXh0TGlrZSA9IFJldHVyblR5cGU8dHlwZW9mIGdldEV4ZWN1dGlvbkNvbnRleHQ+O1xuXG4vKipcbiAqIFRoZSBhdXRoLXNjb3BlZCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBjbGllbnQgY2FycmllZCBvbiBhblxuICogYEV4ZWN1dGlvbkNvbnRleHRMaWtlYCAoYGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnRgKS4gVHlwZWQgc3RydWN0dXJhbGx5XG4gKiBvZmYgQXBwS2l0IHNvIGNvbnN1bWVycyBkb24ndCB0YWtlIGEgZGlyZWN0IGBAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsYFxuICogZGVwZW5kZW5jeSAtIHRoZSBkZXAgZmxvd3MgaW4gdHJhbnNpdGl2ZWx5IHRocm91Z2ggYEBkYXRhYnJpY2tzL2FwcGtpdGAuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZUNsaWVudExpa2UgPSBFeGVjdXRpb25Db250ZXh0TGlrZVtcImNsaWVudFwiXTtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQsIG9yIGB1bmRlZmluZWRgIHdoZW4gQXBwS2l0IGlzbid0XG4gKiBpbml0aWFsaXplZCAob3V0c2lkZSBhIHJlcXVlc3Qgc2NvcGUpLiBTd2FsbG93cyBBcHBLaXQnc1xuICoge0BsaW5rIEluaXRpYWxpemF0aW9uRXJyb3J9OyBhbnkgb3RoZXIgZXJyb3IgcHJvcGFnYXRlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbFwiO1xuICpcbiAqIC8vIE9CTy1zY29wZWQgaW5zaWRlIGEgcmVxdWVzdCwgc2VydmljZSBwcmluY2lwYWwgZnJvbSBhIENMSSBvciBzY3JpcHQuXG4gKiBjb25zdCBjbGllbnQgPSBhcHBraXQudHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpPy5jbGllbnQgPz8gbmV3IFdvcmtzcGFjZUNsaWVudCh7fSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlHZXRFeGVjdXRpb25Db250ZXh0KCk6IEV4ZWN1dGlvbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgaWYgKGN0eD8uY2xpZW50KSB7XG4gICAgICByZXR1cm4gY3R4O1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEluaXRpYWxpemF0aW9uRXJyb3IpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgYmFyZSBBcHBLaXQgYXBwIChubyBwbHVnaW5zKSB3aGVuIG5vbmUgaXMgcnVubmluZyB5ZXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGF3YWl0IGFwcGtpdC5lbnN1cmVJbml0aWFsaXplZCgpO1xuICogY29uc3QgY2xpZW50ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50O1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlSW5pdGlhbGl6ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiaW5pdGlhbGl6aW5nIGEgYmFyZSBBcHBLaXQgYXBwXCIpO1xuICAgIGF3YWl0IGNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtdIH0pO1xuICB9XG59XG4iXX0=
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwa2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGtpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBRUgsT0FBTyxFQUNMLFNBQVMsSUFBSSxlQUFlLEVBQzVCLG1CQUFtQixFQUNuQixtQkFBbUIsR0FDcEIsTUFBTSxvQkFBb0IsQ0FBQztBQUk1QixPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE9BQU8sRUFDTCx3QkFBd0IsRUFHeEIsZUFBZSxHQUVoQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBMkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBNENwQyxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFDbkMsTUFBTSxzQkFBc0IsR0FBc0IsV0FBVyxDQUFDO0FBRTlEOzs7Ozs7R0FNRztBQUNILE1BQU0seUJBQXlCLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztBQUU5QyxTQUFTLFVBQVUsQ0FDakIsTUFBc0MsRUFDdEMsSUFBWTtJQUVaLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELG9EQUFvRDtBQUNwRCxTQUFTLFdBQVcsQ0FBQyxNQUFtQztJQUN0RCxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FB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LE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUI7SUFDckMsSUFBSSxzQkFBc0IsRUFBRSxFQUFFLENBQUM7UUFDN0IsTUFBTSxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3ZELE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQzNELE1BQU0sU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2RCxNQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHJ1bnRpbWUgZ2x1ZTogdGhlIGF1dG8tY29uZmlndXJpbmcgYGNyZWF0ZUFwcGAgZHJvcC1pbiwgcGx1cyB0aGVcbiAqIHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IGhlbHBlcnMgYW5kIHR5cGVzIGRlcml2ZWQgZnJvbSBpdC5cbiAqXG4gKiBgY3JlYXRlQXBwYCBydW5zIGRieC10b29scyBhdXRvLWNvbmZpZ3VyYXRpb24sIHRoZW4gZGVsZWdhdGVzIHRvIEFwcEtpdCdzIG93blxuICogYGNyZWF0ZUFwcGAgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgYW5kIHRoZSBzYW1lIHR5cGVkIHBsdWdpbi1leHBvcnQgbWFwLlxuICogRHJvcCBpdCBpbiBhcyBhIG9uZS1mb3Itb25lIHJlcGxhY2VtZW50OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBsYWtlYmFzZSwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtzZXJ2ZXIoKSwgbGFrZWJhc2UoKV0gfSk7XG4gKiBgYGBcbiAqXG4gKiBBdXRvLWNvbmZpZ3VyYXRpb24gcnVucyBCRUZPUkUgZGVsZWdhdGluZyBzbyBwbHVnaW5zIHNlZSBhIGZ1bGx5IHBvcHVsYXRlZFxuICogYHByb2Nlc3MuZW52YCBkdXJpbmcgdGhlaXIgc3luY2hyb25vdXMgYHNldHVwKClgLiBMYWtlYmFzZSBQb3N0Z3JlcyBydW5zIHdoZW5cbiAqIGEgYGxha2ViYXNlYCBwbHVnaW4gaXMgcHJlc2VudCwgb3Igd2hlbiB7QGxpbmsgQXV0b0NvbmZpZ3VyZU1vZGV9IGlzIHNldFxuICogZXhwbGljaXRseSBvbiB0aGUgY29uZmlnIG9iamVjdC5cbiAqXG4gKiBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCBpcyBBcHBLaXQncyBvd24gYWNjZXNzb3IgZm9yIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZVxuICogY2xpZW50ICsgcmVxdWVzdCBtZXRhZGF0YTsgdGhlIHdyYXBwZXJzIGhlcmUgbWFrZSBpdCBzYWZlIHRvIGNhbGwgb3V0c2lkZSBhXG4gKiByZXF1ZXN0IHNjb3BlICh7QGxpbmsgdHJ5R2V0RXhlY3V0aW9uQ29udGV4dH0pIGFuZCB0byBsYXppbHkgYm9vdCBhIGJhcmUgYXBwXG4gKiAoe0BsaW5rIGVuc3VyZUluaXRpYWxpemVkfSksIGFuZCByZS1leHBvcnQgdGhlIGRlcml2ZWQgdHlwZXMgc28gYWRkLW9uXG4gKiBwYWNrYWdlcyBjYW4gdHlwZSBhIGNvbnRleHQgLyBjbGllbnQgd2l0aG91dCByZS1kZXJpdmluZyB0aGVtIGlubGluZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgY3JlYXRlQXBwIGFzIGFwcGtpdENyZWF0ZUFwcCxcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbiAgSW5pdGlhbGl6YXRpb25FcnJvcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuLy8gQXBwS2l0J3Mgcm9vdCBiYXJyZWwgcmUtZXhwb3J0cyBgUGx1Z2luRGF0YWAgYnV0IG5vdCBgUGx1Z2luTWFwYDsgdGhlIHBhY2thZ2Vcbi8vIHB1Ymxpc2hlcyB0aGlzIHN1YnBhdGggZm9yIGV4YWN0bHkgdGhhdCB0eXBlLlxuaW1wb3J0IHR5cGUgeyBQbHVnaW5NYXAgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2Rpc3Qvc2hhcmVkL3NyYy9wbHVnaW5cIjtcbmltcG9ydCB7IGFzeW5jLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5pbXBvcnQge1xuICBjcmVhdGVJbnRlcmNlcHRvckNvbnRleHQsXG4gIHR5cGUgSW50ZXJjZXB0b3IsXG4gIHR5cGUgSW50ZXJjZXB0b3JSdW50aW1lLFxuICBsaWZlY3ljbGVCcmlkZ2UsXG4gIHR5cGUgUmVzb2x2ZWRBcHBFbnYsXG59IGZyb20gXCIuL2ludGVyY2VwdG9yLnRzXCI7XG5pbXBvcnQgeyBhcHBseUxha2ViYXNlRW52LCB0eXBlIExha2ViYXNlQ29ubmVjdGlvbiB9IGZyb20gXCIuL2xha2ViYXNlLXJlc29sdmVyLnRzXCI7XG5pbXBvcnQgeyBwcm92aXNpb25DYWNoZVNjaGVtYSB9IGZyb20gXCIuL3Byb3Zpc2lvbi50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0XCIpO1xuXG50eXBlIEFwcEtpdENyZWF0ZUFwcENvbmZpZyA9IE5vbk51bGxhYmxlPFBhcmFtZXRlcnM8dHlwZW9mIGFwcGtpdENyZWF0ZUFwcD5bMF0+O1xudHlwZSBBcHBLaXRQbHVnaW5zID0gTm9uTnVsbGFibGU8QXBwS2l0Q3JlYXRlQXBwQ29uZmlnW1wicGx1Z2luc1wiXT47XG5cbi8qKlxuICogV2hhdCBhdXRvLWNvbmZpZ3VyYXRpb24gZG9lcyBiZWZvcmUgQXBwS2l0IGJvb3RzLlxuICpcbiAqIC0gYFwicHJvdmlzaW9uXCJgOiByZXNvbHZlIHRoZSBMYWtlYmFzZSBjb25uZWN0aW9uIGludG8gYHByb2Nlc3MuZW52YCwgdGhlblxuICogICBncmFudCB0aGUgQXBwS2l0IGNhY2hlIHNjaGVtYSB0byB0aGUgY29ubmVjdGluZyByb2xlLlxuICogLSBgXCJlbnZcImA6IHJlc29sdmUgdGhlIExha2ViYXNlIGNvbm5lY3Rpb24gaW50byBgcHJvY2Vzcy5lbnZgIG9ubHkuXG4gKlxuICogT21pdCBpdCB0byBnZXQgYFwicHJvdmlzaW9uXCJgIGdhdGVkIG9uIGEgYGxha2ViYXNlYCBwbHVnaW4gYmVpbmcgcmVnaXN0ZXJlZDtcbiAqIHNldCBpdCBleHBsaWNpdGx5IHRvIHJ1biByZWdhcmRsZXNzIG9mIHRoZSBwbHVnaW4gbGlzdCwgb3IgcGFzcyBgZmFsc2VgIHRvXG4gKiBza2lwIGF1dG8tY29uZmlndXJhdGlvbiBlbnRpcmVseS5cbiAqXG4gKiBTZXQgaXQgRVhQTElDSVRMWSBvbiBhbiBhcHAgdGhhdCBoYXMgbm8gYGxha2ViYXNlKClgIHBsdWdpbiBidXQgc3RpbGwgd2FudHNcbiAqIEFwcEtpdCdzIFBFUlNJU1RFTlQgY2FjaGUuIEFwcEtpdCBwaWNrcyBMYWtlYmFzZSBmb3IgYENhY2hlTWFuYWdlcmAgb25seSB3aGVuXG4gKiBgY3JlYXRlTGFrZWJhc2VQb29sKClgIGNhbiBidWlsZCBhIHBvb2wsIGFuZCB0aGF0IHJlYWRzIGBMQUtFQkFTRV9FTkRQT0lOVGAgL1xuICogYFBHSE9TVGAgLyBgUEdEQVRBQkFTRWAgc3RyYWlnaHQgZnJvbSBgcHJvY2Vzcy5lbnZgIC0gc28gd2l0aG91dCB0aGlzIHN0ZXAgdGhlXG4gKiBjYWNoZSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIGluLW1lbW9yeSwgYW5kIGFueXRoaW5nIGl0IGhvbGRzIChhIHNlc3Npb25cbiAqIHNpZ25pbmcga2V5LCBhIG9uZS10aW1lIGNvZGUpIGlzIGxvc3Qgb24gcmVzdGFydC4gYFwiZW52XCJgIGlzIHRoZSByaWdodCBtb2RlXG4gKiB0aGVyZTogdGhlIGFwcCBTUCBjYW5ub3QgZ3JhbnQgb24gdGhlIGNhY2hlIHNjaGVtYSBhbnl3YXkuXG4gKi9cbmV4cG9ydCB0eXBlIEF1dG9Db25maWd1cmVNb2RlID0gXCJlbnZcIiB8IFwicHJvdmlzaW9uXCI7XG5cbi8qKiBBcHBLaXQncyBgY3JlYXRlQXBwYCBjb25maWcgcGx1cyB0aGUgZGJ4LXRvb2xzIGF1dG8tY29uZmlndXJhdGlvbiBzd2l0Y2guICovXG5leHBvcnQgdHlwZSBDcmVhdGVBcHBDb25maWc8VCBleHRlbmRzIEFwcEtpdFBsdWdpbnMgPSBBcHBLaXRQbHVnaW5zPiA9IE9taXQ8XG4gIEFwcEtpdENyZWF0ZUFwcENvbmZpZyxcbiAgXCJwbHVnaW5zXCIgfCBcIm9uUGx1Z2luc1JlYWR5XCJcbj4gJiB7XG4gIHBsdWdpbnM/OiBUO1xuICBvblBsdWdpbnNSZWFkeT86IChhcHBraXQ6IFBsdWdpbk1hcDxUPikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIC8qKiBBdXRvLWNvbmZpZ3VyYXRpb24gdG8gcnVuIGJlZm9yZSBBcHBLaXQgYm9vdHMuIERlZmF1bHRzIHRvIGBcInByb3Zpc2lvblwiYC4gKi9cbiAgYXV0b0NvbmZpZ3VyZT86IEF1dG9Db25maWd1cmVNb2RlIHwgZmFsc2U7XG4gIC8qKlxuICAgKiBPbmUgb3IgbWFueSB7QGxpbmsgSW50ZXJjZXB0b3J9cyBoYW5kZWQgYW4ge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0gb25jZVxuICAgKiBhdXRvLWNvbmZpZ3VyYXRpb24gaGFzIGNvbXB1dGVkIHRoZSBlbnYuIEVhY2ggcmVjZWl2ZXMgdGhlIHJlc29sdmVkIGVudiwgYW5cbiAgICogQXBwS2l0LWxpZmVjeWNsZSBob29rLCBhbmQgYGJpbmRQcm9jZXNzYCBmb3IgY29uY3VycmVudGx5LXN0eWxlIHN1cGVydmlzaW9uIC1cbiAgICogc2VlIGAuL2ludGVyY2VwdG9yYC4gVGhlIHR1bm5lbCBpcyB0aGUgcHJpbWFyeSBjb25zdW1lci5cbiAgICovXG4gIGludGVyY2VwdG9yPzogSW50ZXJjZXB0b3IgfCBJbnRlcmNlcHRvcltdO1xufTtcblxuY29uc3QgTEFLRUJBU0VfUExVR0lOID0gXCJsYWtlYmFzZVwiO1xuY29uc3QgREVGQVVMVF9BVVRPX0NPTkZJR1VSRTogQXV0b0NvbmZpZ3VyZU1vZGUgPSBcInByb3Zpc2lvblwiO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIG9uIGJvb3QtdGltZSBhdXRvLWNvbmZpZ3VyYXRpb24uIEl0IHJ1bnMgYXMgdGhlIHNlcnZpY2UgcHJpbmNpcGFsXG4gKiBiZWZvcmUgYW55IHBsdWdpbiBpcyBjb25zdHJ1Y3RlZCwgc28gaXQgc2l0cyBvdXRzaWRlIEFwcEtpdCdzIGludGVyY2VwdG9yXG4gKiBjaGFpbiBhbmQgaW5oZXJpdHMgbm8gdGltZW91dCwgcmV0cnksIG9yIHRlbGVtZXRyeSBmcm9tIGl0LiBUaGUgYnVkZ2V0IGNvdmVyc1xuICogdGhlIHJlc29sdmVyJ3Mgb3duIHdvcnN0IGNhc2UgKGNyZWF0ZSBhIHByb2plY3QsIHRoZW4gd2FpdCBmb3IgaXRzIGVuZHBvaW50KVxuICogcGx1cyB0aGUgY2FjaGUtc2NoZW1hIGdyYW50cy5cbiAqL1xuY29uc3QgQVVUT19DT05GSUdVUkVfVElNRU9VVF9NUyA9IDExICogNjBfMDAwO1xuXG5mdW5jdGlvbiB1c2VzUGx1Z2luPFQgZXh0ZW5kcyBBcHBLaXRQbHVnaW5zPihcbiAgY29uZmlnOiBDcmVhdGVBcHBDb25maWc8VD4gfCB1bmRlZmluZWQsXG4gIG5hbWU6IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihjb25maWc/LnBsdWdpbnM/LnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSBuYW1lKSk7XG59XG5cbi8qKiBQbHVnaW4gbmFtZXMgZm9yIGJvb3QgbG9ncyAob3JkZXIgcHJlc2VydmVkKS4gKi9cbmZ1bmN0aW9uIHBsdWdpbk5hbWVzKGNvbmZpZzogQ3JlYXRlQXBwQ29uZmlnIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICByZXR1cm4gKGNvbmZpZz8ucGx1Z2lucyA/PyBbXSkubWFwKChlbnRyeSkgPT4gZW50cnkubmFtZSk7XG59XG5cbi8qKlxuICogUnVuIGVuYWJsZWQgYXV0by1jb25maWd1cmF0aW9uIHN0ZXBzIHdpdGhvdXQgY2FsbGluZyBBcHBLaXQncyBgY3JlYXRlQXBwYC5cbiAqXG4gKiBMYWtlYmFzZSBQb3N0Z3JlcyByZXNvbHZlcyB3aGVuIHtAbGluayBDcmVhdGVBcHBDb25maWcuYXV0b0NvbmZpZ3VyZX0gaXMgc2V0XG4gKiBleHBsaWNpdGx5IG9yIGEgYGxha2ViYXNlYCBwbHVnaW4gaXMgbGlzdGVkIGluIGBjb25maWcucGx1Z2luc2AuIGBzaWduYWxgXG4gKiBjYW5jZWxzIHRoZSByZXNvbHV0aW9uOyBpdCBpcyBjb21iaW5lZCB3aXRoIGFuIGludGVybmFsIGJvb3QgdGltZW91dCBlaXRoZXJcbiAqIHdheS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogLy8gUG9wdWxhdGUgUEdIT1NUIC8gUEdEQVRBQkFTRSAvIExBS0VCQVNFX0VORFBPSU5UIHdpdGhvdXQgYm9vdGluZyBBcHBLaXQuXG4gKiBhd2FpdCBhcHBraXQuYXV0b0NvbmZpZ3VyZSh7IGF1dG9Db25maWd1cmU6IFwiZW52XCIgfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdXRvQ29uZmlndXJlPFQgZXh0ZW5kcyBBcHBLaXRQbHVnaW5zPihcbiAgY29uZmlnPzogQ3JlYXRlQXBwQ29uZmlnPFQ+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8TGFrZWJhc2VDb25uZWN0aW9uIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG1vZGUgPSBjb25maWc/LmF1dG9Db25maWd1cmUgPz8gREVGQVVMVF9BVVRPX0NPTkZJR1VSRTtcbiAgY29uc3QgZXhwbGljaXQgPSBjb25maWc/LmF1dG9Db25maWd1cmUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgbGFrZWJhc2VQbHVnaW5QcmVzZW50ID0gdXNlc1BsdWdpbihjb25maWcsIExBS0VCQVNFX1BMVUdJTik7XG4gIGNvbnN0IHBsdWdpbnMgPSBwbHVnaW5OYW1lcyhjb25maWcpO1xuICBsb2dnZXIuZGVidWcoXCJhdXRvQ29uZmlndXJlOiBzdGFydFwiLCB7XG4gICAgbW9kZSxcbiAgICBleHBsaWNpdCxcbiAgICBsYWtlYmFzZVBsdWdpblByZXNlbnQsXG4gICAgcGx1Z2lucyxcbiAgICB0aW1lb3V0TXM6IEFVVE9fQ09ORklHVVJFX1RJTUVPVVRfTVMsXG4gICAgY2FsbGVyU2lnbmFsOiBCb29sZWFuKHNpZ25hbCksXG4gIH0pO1xuXG4gIGlmIChtb2RlID09PSBmYWxzZSB8fCAhKGV4cGxpY2l0IHx8IGxha2ViYXNlUGx1Z2luUHJlc2VudCkpIHtcbiAgICBjb25zdCBza2lwcGVkUmVhc29uID0gbW9kZSA9PT0gZmFsc2UgPyBcImRpc2FibGVkXCIgOiBcIm5vIGxha2ViYXNlIHBsdWdpblwiO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmU6IHNraXBcIiwgeyBza2lwcGVkUmVhc29uLCBtb2RlLCBsYWtlYmFzZVBsdWdpblByZXNlbnQsIHBsdWdpbnMgfSk7XG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBhdXRvQ29uZmlndXJlOiBtb2RlLFxuICAgICAgbGFrZWJhc2VQbHVnaW5QcmVzZW50LFxuICAgICAgcHJvdmlzaW9uZWQ6IGZhbHNlLFxuICAgICAgc2tpcHBlZFJlYXNvbixcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgYXN5bmMudGllQWJvcnRTaWduYWwoY29udHJvbGxlciwgc2lnbmFsKTtcbiAgYXN5bmMudGllQWJvcnRTaWduYWwoY29udHJvbGxlciwgQWJvcnRTaWduYWwudGltZW91dChBVVRPX0NPTkZJR1VSRV9USU1FT1VUX01TKSk7XG5cbiAgY29uc3QgcHJvdmlzaW9uID0gbW9kZSA9PT0gXCJwcm92aXNpb25cIjtcbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZTogcmVzb2x2ZSBsYWtlYmFzZVwiLCB7IHByb3Zpc2lvbiwgbW9kZSB9KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBhdXRvQ29uZmlndXJlTGFrZWJhc2UocHJvdmlzaW9uLCBjb250cm9sbGVyLnNpZ25hbCk7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmU6IGRvbmVcIiwge1xuICAgIG1vZGUsXG4gICAgbGFrZWJhc2VQbHVnaW5QcmVzZW50LFxuICAgIHByb3Zpc2lvbmVkOiBwcm92aXNpb24sXG4gICAgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSxcbiAgfSk7XG4gIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwgeyBhdXRvQ29uZmlndXJlOiBtb2RlLCBsYWtlYmFzZVBsdWdpblByZXNlbnQsIHByb3Zpc2lvbmVkOiBwcm92aXNpb24gfSk7XG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIExha2ViYXNlIFBvc3RncmVzIGNvbm5lY3Rpb24gaW5mbywgd3JpdGUgdGhlIHJlc29sdmVkIHZhbHVlcyB0b1xuICogYHByb2Nlc3MuZW52YCwgYW5kIHJldHVybiB0aGUgcmVjb3JkLiBVc2VkIGJ5IHtAbGluayBhdXRvQ29uZmlndXJlfTsgY2FsbFxuICoge0BsaW5rIGFwcGx5TGFrZWJhc2VFbnZ9IGRpcmVjdGx5IHdoZW4gZmluZXIgY29udHJvbCBpcyBuZWVkZWQgKGEgZGlmZmVyZW50XG4gKiBgYXV0b0NyZWF0ZWAgcG9saWN5LCBvciBhIGNhbGxlciB0aGF0IHdhbnRzIHRoZSBlbnYgd2l0aG91dCBib290aW5nIEFwcEtpdCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGF1dG9Db25maWd1cmVMYWtlYmFzZShcbiAgcHJvdmlzaW9uOiBib29sZWFuLFxuICBzaWduYWw6IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxMYWtlYmFzZUNvbm5lY3Rpb24+IHtcbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBhcHBseUxha2ViYXNlRW52XCIpO1xuICBjb25zdCB7IHJlc29sdmVkLCB1c2VyIH0gPSBhd2FpdCBhcHBseUxha2ViYXNlRW52KHVuZGVmaW5lZCwgc2lnbmFsKTtcbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBlbnYgYXBwbGllZFwiLCB7XG4gICAgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSxcbiAgICB1c2VyLFxuICAgIGVudjoge1xuICAgICAgTEFLRUJBU0VfRU5EUE9JTlQ6IHByb2Nlc3MuZW52LkxBS0VCQVNFX0VORFBPSU5ULFxuICAgICAgUEdIT1NUOiBwcm9jZXNzLmVudi5QR0hPU1QsXG4gICAgICBQR1BPUlQ6IHByb2Nlc3MuZW52LlBHUE9SVCxcbiAgICAgIFBHREFUQUJBU0U6IHByb2Nlc3MuZW52LlBHREFUQUJBU0UsXG4gICAgICBQR1VTRVI6IHByb2Nlc3MuZW52LlBHVVNFUixcbiAgICAgIFBHU1NMTU9ERTogcHJvY2Vzcy5lbnYuUEdTU0xNT0RFLFxuICAgIH0sXG4gIH0pO1xuICBsb2dnZXIuaW5mbyhcImVudiB1cGRhdGVkXCIsIHsgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSwgdXNlciB9KTtcbiAgaWYgKHByb3Zpc2lvbikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogcHJvdmlzaW9uQ2FjaGVTY2hlbWFcIiwgeyB1c2VyIH0pO1xuICAgIGF3YWl0IHByb3Zpc2lvbkNhY2hlU2NoZW1hKHVzZXIsIGxvZ2dlcik7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b0NvbmZpZ3VyZUxha2ViYXNlOiBwcm92aXNpb25DYWNoZVNjaGVtYSBkb25lXCIpO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9Db25maWd1cmVMYWtlYmFzZTogc2tpcCBwcm92aXNpb24gKG1vZGU9ZW52KVwiKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlZGFjdExha2ViYXNlQ29ubmVjdGlvbihyZXNvbHZlZDogTGFrZWJhc2VDb25uZWN0aW9uKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4ge1xuICAgIHByb2plY3Q6IHJlc29sdmVkLnByb2plY3QsXG4gICAgYnJhbmNoOiByZXNvbHZlZC5icmFuY2gsXG4gICAgZW5kcG9pbnQ6IHJlc29sdmVkLmVuZHBvaW50LFxuICAgIGRhdGFiYXNlOiByZXNvbHZlZC5kYXRhYmFzZSxcbiAgICBob3N0OiByZXNvbHZlZC5ob3N0LFxuICAgIHBvcnQ6IHJlc29sdmVkLnBvcnQsXG4gICAgc3NsTW9kZTogcmVzb2x2ZWQuc3NsTW9kZSxcbiAgfTtcbn1cblxuLyoqIEJ1aWxkIHRoZSB7QGxpbmsgUmVzb2x2ZWRBcHBFbnZ9IGludGVyY2VwdG9ycyByZWFkLCBmcm9tIHRoZSBhdXRvLWNvbmZpZyByZXN1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlZEFwcEVudihsYWtlYmFzZTogTGFrZWJhc2VDb25uZWN0aW9uIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRBcHBFbnYge1xuICByZXR1cm4ge1xuICAgIC4uLihsYWtlYmFzZSA/IHsgbGFrZWJhc2UgfSA6IHt9KSxcbiAgICAuLi4ocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUID8geyBkYXRhYnJpY2tzSG9zdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBOb3JtYWxpemUgdGhlIGBpbnRlcmNlcHRvcj86IEludGVyY2VwdG9yIHwgSW50ZXJjZXB0b3JbXWAgb3B0aW9uIHRvIGFuIGFycmF5LiAqL1xuZnVuY3Rpb24gaW50ZXJjZXB0b3JMaXN0KGludGVyY2VwdG9yOiBDcmVhdGVBcHBDb25maWdbXCJpbnRlcmNlcHRvclwiXSk6IEludGVyY2VwdG9yW10ge1xuICBpZiAoIWludGVyY2VwdG9yKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGludGVyY2VwdG9yKSA/IGludGVyY2VwdG9yIDogW2ludGVyY2VwdG9yXTtcbn1cblxuLyoqXG4gKiBBdXRvLWNvbmZpZ3VyaW5nIGRyb3AtaW4gZm9yIEFwcEtpdCdzIGBjcmVhdGVBcHBgOiBzYW1lIGNvbmZpZywgc2FtZSB0eXBlZFxuICogcGx1Z2luLWV4cG9ydCBtYXAsIHdpdGgge0BsaW5rIGF1dG9Db25maWd1cmV9IHJ1biBmaXJzdC5cbiAqXG4gKiBXaGVuIHtAbGluayBDcmVhdGVBcHBDb25maWcuaW50ZXJjZXB0b3J9cyBhcmUgZ2l2ZW4sIGVhY2ggaXMgaW52b2tlZCB3aXRoIGFuXG4gKiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSBBRlRFUiBhdXRvLWNvbmZpZ3VyYXRpb24gY29tcHV0ZXMgdGhlIGVudiBhbmQgQkVGT1JFXG4gKiBBcHBLaXQgYm9vdHMgLSBzbyBhbiBpbnRlcmNlcHRvciBjYW4gcmVhZCB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvbiwgcmVnaXN0ZXJcbiAqIGxpZmVjeWNsZSBoYW5kbGVycywgYW5kIGBiaW5kUHJvY2Vzc2AgYSBjaGlsZC4gQSBoaWRkZW4ge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX1cbiAqIHBsdWdpbiBpcyBpbmplY3RlZCBzbyB0aG9zZSBgb25MaWZlY3ljbGVgIGhhbmRsZXJzIGZpcmUgb24gdGhlIGdlbnVpbmUgQXBwS2l0XG4gKiBldmVudHM7IGl0IGhhcyBubyBleHBvcnRzLCBzbyB0aGUgcmV0dXJuZWQge0BsaW5rIFBsdWdpbk1hcH0gaXMgdW5jaGFuZ2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZSwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogY29uc3QgYXBwID0gYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtzZXJ2ZXIoKSwgbGFrZWJhc2UoKV0gfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBcHA8VCBleHRlbmRzIEFwcEtpdFBsdWdpbnM+KFxuICBjb25maWc/OiBDcmVhdGVBcHBDb25maWc8VD4sXG4pOiBQcm9taXNlPFBsdWdpbk1hcDxUPj4ge1xuICBjb25zdCBwbHVnaW5zID0gcGx1Z2luTmFtZXMoY29uZmlnKTtcbiAgY29uc3QgaW50ZXJjZXB0b3JzID0gaW50ZXJjZXB0b3JMaXN0KGNvbmZpZz8uaW50ZXJjZXB0b3IpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IHN0YXJ0XCIsIHtcbiAgICBwbHVnaW5zLFxuICAgIHBsdWdpbkNvdW50OiBwbHVnaW5zLmxlbmd0aCxcbiAgICBpbnRlcmNlcHRvckNvdW50OiBpbnRlcmNlcHRvcnMubGVuZ3RoLFxuICAgIGF1dG9Db25maWd1cmU6IGNvbmZpZz8uYXV0b0NvbmZpZ3VyZSA/PyBcIihkZWZhdWx0KVwiLFxuICAgIGhhc09uUGx1Z2luc1JlYWR5OiB0eXBlb2YgY29uZmlnPy5vblBsdWdpbnNSZWFkeSA9PT0gXCJmdW5jdGlvblwiLFxuICB9KTtcblxuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGF1dG9Db25maWd1cmVcIik7XG4gIGNvbnN0IGxha2ViYXNlID0gYXdhaXQgYXV0b0NvbmZpZ3VyZShjb25maWcpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGF1dG9Db25maWd1cmUgcmV0dXJuZWRcIiwge1xuICAgIGxha2ViYXNlOiBsYWtlYmFzZSA/IHJlZGFjdExha2ViYXNlQ29ubmVjdGlvbihsYWtlYmFzZSkgOiB1bmRlZmluZWQsXG4gIH0pO1xuXG4gIGNvbnN0IGFwcENvbmZpZyA9IHsgLi4uY29uZmlnIH07XG4gIGRlbGV0ZSBhcHBDb25maWcuYXV0b0NvbmZpZ3VyZTtcbiAgZGVsZXRlIGFwcENvbmZpZy5pbnRlcmNlcHRvcjtcblxuICBpZiAoaW50ZXJjZXB0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogbm8gaW50ZXJjZXB0b3JzOyBkZWxlZ2F0aW5nIHRvIEFwcEtpdCBjcmVhdGVBcHBcIiwge1xuICAgICAgcGx1Z2luczogcGx1Z2luTmFtZXMoYXBwQ29uZmlnKSxcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBraXRDcmVhdGVBcHA8VD4oYXBwQ29uZmlnKTtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IEFwcEtpdCBjcmVhdGVBcHAgcmV0dXJuZWRcIiwge1xuICAgICAgZXhwb3J0S2V5czogT2JqZWN0LmtleXMocmVzdWx0ID8/IHt9KSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQnVpbGQgdGhlIGNvbnRleHQgZnJvbSB0aGUgY29tcHV0ZWQgZW52LCBydW4gZWFjaCBpbnRlcmNlcHRvciAodGhleSByZWdpc3RlclxuICAvLyBsaWZlY3ljbGUgaGFuZGxlcnMgKyBiaW5kIHByb2Nlc3NlcyksIHRoZW4gaW5qZWN0IHRoZSBicmlkZ2UgdGhhdCByZWxheXMgdGhlXG4gIC8vIFJFQUwgQXBwS2l0IGxpZmVjeWNsZSBpbnRvIGBydW50aW1lLmVtaXRMaWZlY3ljbGVgIGR1cmluZyBpdHMgYHNldHVwKClgLlxuICBjb25zdCBlbnYgPSByZXNvbHZlZEFwcEVudihsYWtlYmFzZSk7XG4gIGxvZ2dlci5kZWJ1ZyhcImNyZWF0ZUFwcDogaW50ZXJjZXB0b3IgY29udGV4dFwiLCB7XG4gICAgaGFzTGFrZWJhc2U6IEJvb2xlYW4oZW52Lmxha2ViYXNlKSxcbiAgICBkYXRhYnJpY2tzSG9zdDogZW52LmRhdGFicmlja3NIb3N0LFxuICAgIGludGVyY2VwdG9yQ291bnQ6IGludGVyY2VwdG9ycy5sZW5ndGgsXG4gIH0pO1xuICBjb25zdCBydW50aW1lOiBJbnRlcmNlcHRvclJ1bnRpbWUgPSBjcmVhdGVJbnRlcmNlcHRvckNvbnRleHQoZW52KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcmNlcHRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IHJ1biBpbnRlcmNlcHRvclwiLCB7IGluZGV4OiBpLCBvZjogaW50ZXJjZXB0b3JzLmxlbmd0aCB9KTtcbiAgICBhd2FpdCBpbnRlcmNlcHRvcnNbaV0hKHJ1bnRpbWUuY29udGV4dCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY3JlYXRlQXBwOiBpbnRlcmNlcHRvciBkb25lXCIsIHsgaW5kZXg6IGkgfSk7XG4gIH1cbiAgLy8gQXBwZW5kIHRoZSBicmlkZ2UgdG8gdGhlIHBsdWdpbnMgdHVwbGUuIEl0IGlzIGhpZGRlbiBhbmQgZXhwb3J0cyBub3RoaW5nLCBzb1xuICAvLyB0aGUgcmV0dXJuZWQgbWFwIHN0aWxsIG1hdGNoZXMgYFBsdWdpbk1hcDxUPmA7IHRoZSBjYXN0ICh0aHJvdWdoIGB1bmtub3duYCkgaXNcbiAgLy8gb25seSBiZWNhdXNlIGFwcGVuZGluZyB3aWRlbnMgdGhlIHR1cGxlIHR5cGUgYmV5b25kIGBUYC5cbiAgYXBwQ29uZmlnLnBsdWdpbnMgPSBbLi4uKGFwcENvbmZpZy5wbHVnaW5zID8/IFtdKSwgbGlmZWN5Y2xlQnJpZGdlKHsgcnVudGltZSB9KV0gYXMgdW5rbm93biBhcyBUO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IGxpZmVjeWNsZSBicmlkZ2UgaW5qZWN0ZWQ7IGRlbGVnYXRpbmcgdG8gQXBwS2l0IGNyZWF0ZUFwcFwiLCB7XG4gICAgcGx1Z2luczogcGx1Z2luTmFtZXMoYXBwQ29uZmlnKSxcbiAgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcGtpdENyZWF0ZUFwcDxUPihhcHBDb25maWcpO1xuICBsb2dnZXIuZGVidWcoXCJjcmVhdGVBcHA6IEFwcEtpdCBjcmVhdGVBcHAgcmV0dXJuZWRcIiwge1xuICAgIGV4cG9ydEtleXM6IE9iamVjdC5rZXlzKHJlc3VsdCA/PyB7fSksXG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBBcHBLaXQgcGVyLXJlcXVlc3QgZXhlY3V0aW9uIGNvbnRleHQgcmV0dXJuZWQgYnkgYGdldEV4ZWN1dGlvbkNvbnRleHQoKWBcbiAqIC0gdGhlIE9CTy1zY29wZWQgd29ya3NwYWNlIGNsaWVudCBwbHVzIHRoZSBzdXJyb3VuZGluZyByZXF1ZXN0IG1ldGFkYXRhLlxuICogRGVyaXZlZCBmcm9tIEFwcEtpdCdzIG93biByZXR1cm4gdHlwZSBzbyBpdCB0cmFja3MgdGhlIGluc3RhbGxlZCB2ZXJzaW9uLCBhbmRcbiAqIHJlLWV4cG9ydGVkIGhlcmUgc28gYWRkLW9uIHBhY2thZ2VzIGNhbiB0eXBlIGEgY29udGV4dCBwYXJhbWV0ZXIgd2l0aG91dCBlYWNoXG4gKiByZS1kZXJpdmluZyB0aGUgc2FtZSBgUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RXhlY3V0aW9uQ29udGV4dD5gIGlubGluZS5cbiAqL1xuZXhwb3J0IHR5cGUgRXhlY3V0aW9uQ29udGV4dExpa2UgPSBSZXR1cm5UeXBlPHR5cGVvZiBnZXRFeGVjdXRpb25Db250ZXh0PjtcblxuLyoqXG4gKiBUaGUgYXV0aC1zY29wZWQgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgY2xpZW50IGNhcnJpZWQgb24gYW5cbiAqIGBFeGVjdXRpb25Db250ZXh0TGlrZWAgKGBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50YCkuIFR5cGVkIHN0cnVjdHVyYWxseVxuICogb2ZmIEFwcEtpdCBzbyBjb25zdW1lcnMgZG9uJ3QgdGFrZSBhIGRpcmVjdCBgQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbGBcbiAqIGRlcGVuZGVuY3kgLSB0aGUgZGVwIGZsb3dzIGluIHRyYW5zaXRpdmVseSB0aHJvdWdoIGBAZGF0YWJyaWNrcy9hcHBraXRgLlxuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gRXhlY3V0aW9uQ29udGV4dExpa2VbXCJjbGllbnRcIl07XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LCBvciBgdW5kZWZpbmVkYCB3aGVuIEFwcEtpdCBpc24ndFxuICogaW5pdGlhbGl6ZWQgKG91dHNpZGUgYSByZXF1ZXN0IHNjb3BlKS4gU3dhbGxvd3MgQXBwS2l0J3NcbiAqIHtAbGluayBJbml0aWFsaXphdGlvbkVycm9yfTsgYW55IG90aGVyIGVycm9yIHByb3BhZ2F0ZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxcIjtcbiAqXG4gKiAvLyBPQk8tc2NvcGVkIGluc2lkZSBhIHJlcXVlc3QsIHNlcnZpY2UgcHJpbmNpcGFsIGZyb20gYSBDTEkgb3Igc2NyaXB0LlxuICogY29uc3QgY2xpZW50ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50ID8/IG5ldyBXb3Jrc3BhY2VDbGllbnQoe30pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpOiBFeGVjdXRpb25Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICAgIGlmIChjdHg/LmNsaWVudCkge1xuICAgICAgcmV0dXJuIGN0eDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBJbml0aWFsaXphdGlvbkVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIGJhcmUgQXBwS2l0IGFwcCAobm8gcGx1Z2lucykgd2hlbiBub25lIGlzIHJ1bm5pbmcgeWV0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiBhd2FpdCBhcHBraXQuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAqIGNvbnN0IGNsaWVudCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudDtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAodHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZW5zdXJlSW5pdGlhbGl6ZWQ6IGFscmVhZHkgaW5pdGlhbGl6ZWRcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImVuc3VyZUluaXRpYWxpemVkOiBib290aW5nIGJhcmUgQXBwS2l0IGFwcFwiKTtcbiAgYXdhaXQgY3JlYXRlQXBwKHsgcGx1Z2luczogW10sIGF1dG9Db25maWd1cmU6IGZhbHNlIH0pO1xuICBsb2dnZXIuZGVidWcoXCJlbnN1cmVJbml0aWFsaXplZDogZG9uZVwiKTtcbn1cbiJdfQ==
|
package/lib/src/interceptor.d.ts
CHANGED
|
@@ -5,17 +5,17 @@
|
|
|
5
5
|
* unit - concurrently-style, where any death takes the whole set down.
|
|
6
6
|
*
|
|
7
7
|
* An interceptor is a plain function `(ctx) => void | Promise<void>` passed to
|
|
8
|
-
*
|
|
9
|
-
* one AFTER auto-configuration has populated `process.env` but as part
|
|
10
|
-
* the app, so an interceptor sees the resolved connection and can bind
|
|
11
|
-
* before or during setup.
|
|
8
|
+
* `appkit.createApp`'s `interceptor` option ("one or many"). `appkit.createApp`
|
|
9
|
+
* runs each one AFTER auto-configuration has populated `process.env` but as part
|
|
10
|
+
* of booting the app, so an interceptor sees the resolved connection and can bind
|
|
11
|
+
* processes before or during setup.
|
|
12
12
|
*
|
|
13
13
|
* The names here mirror AppKit's own vocabulary rather than inventing parallel
|
|
14
14
|
* ones: {@link LifecycleEvent} and {@link InterceptorContext.onLifecycle} are the
|
|
15
15
|
* exact shape of `PluginContext.onLifecycle` (`setup:complete` / `server:ready` /
|
|
16
16
|
* `shutdown`). The bridge that makes that hook reachable from OUTSIDE a plugin -
|
|
17
17
|
* where interceptors run - is {@link lifecycleBridge}, a tiny internal plugin
|
|
18
|
-
*
|
|
18
|
+
* `appkit.createApp` injects to capture `this.context` and relay its events.
|
|
19
19
|
*
|
|
20
20
|
* @module
|
|
21
21
|
*/
|
|
@@ -42,7 +42,7 @@ export type LifecycleHandler = () => void | Promise<void>;
|
|
|
42
42
|
* they read COMPUTED values instead of re-reading `process.env` themselves.
|
|
43
43
|
*
|
|
44
44
|
* `lakebase` is the resolved Postgres connection when Lakebase auto-config ran
|
|
45
|
-
* (see `
|
|
45
|
+
* (see `appkit.autoConfigure`), else `undefined`. `databricksHost` is the
|
|
46
46
|
* workspace host as resolved into the environment (`DATABRICKS_HOST`), which the
|
|
47
47
|
* tunnel interceptor both reads and, when it must, sets.
|
|
48
48
|
*/
|
|
@@ -63,9 +63,9 @@ export type BindableProcess = Pick<ChildProcess, "pid" | "kill" | "killed" | "on
|
|
|
63
63
|
* The handle passed to each interceptor.
|
|
64
64
|
*
|
|
65
65
|
* @example
|
|
66
|
-
* import {
|
|
66
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
67
67
|
*
|
|
68
|
-
* await createApp({
|
|
68
|
+
* await appkit.createApp({
|
|
69
69
|
* plugins: [server()],
|
|
70
70
|
* interceptor: (ctx) => {
|
|
71
71
|
* const portr = spawnPortr(ctx.env.databricksHost);
|
|
@@ -103,7 +103,7 @@ export type Interceptor = (ctx: InterceptorContext) => void | Promise<void>;
|
|
|
103
103
|
/**
|
|
104
104
|
* The mutable machinery behind an {@link InterceptorContext}. Split out so
|
|
105
105
|
* {@link createInterceptorContext} can hand the public context to interceptors
|
|
106
|
-
* while `
|
|
106
|
+
* while `appkit.createApp` retains the `emitLifecycle` side-channel the bridge drives.
|
|
107
107
|
*/
|
|
108
108
|
export interface InterceptorRuntime {
|
|
109
109
|
/** The context handed to each interceptor. */
|
|
@@ -127,7 +127,7 @@ interface LifecycleBridgeConfig extends BasePluginConfig {
|
|
|
127
127
|
runtime?: InterceptorRuntime;
|
|
128
128
|
}
|
|
129
129
|
/**
|
|
130
|
-
* The internal plugin
|
|
130
|
+
* The internal plugin `appkit.createApp` injects to make AppKit's lifecycle
|
|
131
131
|
* reachable from interceptor code. On `setup()` it reads its own `this.context`
|
|
132
132
|
* (the real `PluginContext`) and forwards each {@link LifecycleEvent} to the
|
|
133
133
|
* interceptor runtime, so `ctx.onLifecycle(...)` handlers fire on the genuine
|