@dbx-tools/appkit 0.6.69 → 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/lib/src/interceptor.js
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
|
*/
|
|
@@ -107,7 +107,7 @@ function hasOnLifecycle(context) {
|
|
|
107
107
|
return typeof context?.onLifecycle === "function";
|
|
108
108
|
}
|
|
109
109
|
/**
|
|
110
|
-
* The internal plugin
|
|
110
|
+
* The internal plugin `appkit.createApp` injects to make AppKit's lifecycle
|
|
111
111
|
* reachable from interceptor code. On `setup()` it reads its own `this.context`
|
|
112
112
|
* (the real `PluginContext`) and forwards each {@link LifecycleEvent} to the
|
|
113
113
|
* interceptor runtime, so `ctx.onLifecycle(...)` handlers fire on the genuine
|
|
@@ -138,4 +138,4 @@ export class LifecycleBridgePlugin extends Plugin {
|
|
|
138
138
|
}
|
|
139
139
|
/** Factory for the injected {@link LifecycleBridgePlugin}. */
|
|
140
140
|
export const lifecycleBridge = toPlugin(LifecycleBridgePlugin);
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBR0gsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQThDLE1BQU0sb0JBQW9CLENBQUM7QUFDbEcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzdDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFzRnpDLG1GQUFtRjtBQUNuRixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUUvQiw2RUFBNkU7QUFDN0UsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFjbEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsR0FBbUI7SUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXNDLENBQUM7SUFDL0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDNUMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUV6QixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQVksRUFBUSxFQUFFO1FBQ3RDLElBQUksWUFBWTtZQUFFLE9BQU87UUFDekIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2xFLENBQUMsQ0FBQztJQUVGLE1BQU0sZUFBZSxHQUFHLENBQUMsTUFBc0IsRUFBUSxFQUFFO1FBQ3ZELEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGLE1BQU0sa0JBQWtCLEdBQUcsR0FBUyxFQUFFO1FBQ3BDLElBQUksWUFBWTtZQUFFLE9BQU87UUFDekIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDdEMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBc0IsRUFBUSxFQUFFO1FBQ25ELGtCQUFrQixFQUFFLENBQUM7UUFDckIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsNENBQTRDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLFFBQVEsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQXFCLEVBQUUsRUFBb0IsRUFBUSxFQUFFO1FBQ3hFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs7WUFDbkIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQztJQUVGLE1BQU0sYUFBYSxHQUFHLEtBQUssRUFBRSxLQUFxQixFQUFpQixFQUFFO1FBQ25FLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDYixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZix3RUFBd0U7Z0JBQ3hFLDZCQUE2QjtnQkFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQXVCO1FBQ2xDLEdBQUc7UUFDSCxXQUFXO1FBQ1gsZUFBZTtRQUNmLFdBQVc7S0FDWixDQUFDO0lBRUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUNwQyxDQUFDO0FBaUJELFNBQVMsY0FBYyxDQUFDLE9BQWdCO0lBQ3RDLE9BQU8sT0FBUSxPQUE0QyxFQUFFLFdBQVcsS0FBSyxVQUFVLENBQUM7QUFDMUYsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxNQUE2QjtJQUN0RSxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLElBQUksRUFBRSx5QkFBeUI7UUFDL0IsV0FBVyxFQUFFLGtCQUFrQjtRQUMvQixXQUFXLEVBQUUsc0VBQXNFO1FBQ25GLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLE1BQU0sRUFBRSxJQUFJO1FBQ1osU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO0tBQ1UsQ0FBQztJQUU3QyxLQUFLLENBQUMsS0FBSztRQUNsQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7WUFDM0YsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEYsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDOztBQUdILDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBgY3JlYXRlQXBwYCBJTlRFUkNFUFRPUiBjb250ZXh0OiBhbiBpbi1wcm9jZXNzIGhhbmRsZSBhbiBhcHAgaGFuZHMgdG9cbiAqIGFkZC1vbnMgKHRoZSB0dW5uZWwsIGNoaWVmbHkpIHNvIHRoZXkgY2FuIHJlYWQgdGhlIGVudiBhdXRvLWNvbmZpZ3VyYXRpb25cbiAqIGNvbXB1dGVkLCBob29rIEFwcEtpdCdzIGxpZmVjeWNsZSwgYW5kIHN1cGVydmlzZSBzaWJsaW5nIGNoaWxkIHByb2Nlc3NlcyBhcyBvbmVcbiAqIHVuaXQgLSBjb25jdXJyZW50bHktc3R5bGUsIHdoZXJlIGFueSBkZWF0aCB0YWtlcyB0aGUgd2hvbGUgc2V0IGRvd24uXG4gKlxuICogQW4gaW50ZXJjZXB0b3IgaXMgYSBwbGFpbiBmdW5jdGlvbiBgKGN0eCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5gIHBhc3NlZCB0b1xuICoge0BsaW5rIENyZWF0ZUFwcENvbmZpZy5pbnRlcmNlcHRvcn0gKFwib25lIG9yIG1hbnlcIikuIHtAbGluayBjcmVhdGVBcHB9IHJ1bnMgZWFjaFxuICogb25lIEFGVEVSIGF1dG8tY29uZmlndXJhdGlvbiBoYXMgcG9wdWxhdGVkIGBwcm9jZXNzLmVudmAgYnV0IGFzIHBhcnQgb2YgYm9vdGluZ1xuICogdGhlIGFwcCwgc28gYW4gaW50ZXJjZXB0b3Igc2VlcyB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvbiBhbmQgY2FuIGJpbmQgcHJvY2Vzc2VzXG4gKiBiZWZvcmUgb3IgZHVyaW5nIHNldHVwLlxuICpcbiAqIFRoZSBuYW1lcyBoZXJlIG1pcnJvciBBcHBLaXQncyBvd24gdm9jYWJ1bGFyeSByYXRoZXIgdGhhbiBpbnZlbnRpbmcgcGFyYWxsZWxcbiAqIG9uZXM6IHtAbGluayBMaWZlY3ljbGVFdmVudH0gYW5kIHtAbGluayBJbnRlcmNlcHRvckNvbnRleHQub25MaWZlY3ljbGV9IGFyZSB0aGVcbiAqIGV4YWN0IHNoYXBlIG9mIGBQbHVnaW5Db250ZXh0Lm9uTGlmZWN5Y2xlYCAoYHNldHVwOmNvbXBsZXRlYCAvIGBzZXJ2ZXI6cmVhZHlgIC9cbiAqIGBzaHV0ZG93bmApLiBUaGUgYnJpZGdlIHRoYXQgbWFrZXMgdGhhdCBob29rIHJlYWNoYWJsZSBmcm9tIE9VVFNJREUgYSBwbHVnaW4gLVxuICogd2hlcmUgaW50ZXJjZXB0b3JzIHJ1biAtIGlzIHtAbGluayBsaWZlY3ljbGVCcmlkZ2V9LCBhIHRpbnkgaW50ZXJuYWwgcGx1Z2luXG4gKiB7QGxpbmsgY3JlYXRlQXBwfSBpbmplY3RzIHRvIGNhcHR1cmUgYHRoaXMuY29udGV4dGAgYW5kIHJlbGF5IGl0cyBldmVudHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgUGx1Z2luLCB0b1BsdWdpbiwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLCB0eXBlIFBsdWdpbk1hbmlmZXN0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgTGFrZWJhc2VDb25uZWN0aW9uIH0gZnJvbSBcIi4vbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImludGVyY2VwdG9yXCIpO1xuXG4vKipcbiAqIEFwcEtpdCdzIHBsdWdpbi1saWZlY3ljbGUgZXZlbnRzLCB2ZXJiYXRpbSBmcm9tIGBQbHVnaW5Db250ZXh0YFxuICogKGBub2RlX21vZHVsZXMvQGRhdGFicmlja3MvYXBwa2l0Ly4uLi9jb3JlL3BsdWdpbi1jb250ZXh0LmQudHNgKS4gUmUtZGVjbGFyZWRcbiAqIHN0cnVjdHVyYWxseSByYXRoZXIgdGhhbiBpbXBvcnRlZCBiZWNhdXNlIGBQbHVnaW5Db250ZXh0YCBpcyBub3QgaW4gdGhlXG4gKiBwYWNrYWdlJ3MgYGV4cG9ydHNgIG1hcCAodGhlIHNhbWUgcmVhc29uIHtAbGluayBQbHVnaW5Db250ZXh0TGlrZX0gZXhpc3RzIGluXG4gKiBgLi9wbHVnaW5gKS5cbiAqXG4gKiAtIGBzZXR1cDpjb21wbGV0ZWAgLSBldmVyeSBwbHVnaW4ncyBgc2V0dXAoKWAgaGFzIHJlc29sdmVkLlxuICogLSBgc2VydmVyOnJlYWR5YCAtIHRoZSBgc2VydmVyKClgIHBsdWdpbiBpcyBsaXN0ZW5pbmcgKG5ldmVyIGZpcmVzIGZvciBhXG4gKiAgIHNlcnZlcmxlc3MgYXBwLCBlLmcuIHRoZSB0dW5uZWwgZ2F0ZSkuXG4gKiAtIGBzaHV0ZG93bmAgLSB0aGUgYXBwIGlzIHRlYXJpbmcgZG93bi5cbiAqL1xuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlRXZlbnQgPSBcInNldHVwOmNvbXBsZXRlXCIgfCBcInNlcnZlcjpyZWFkeVwiIHwgXCJzaHV0ZG93blwiO1xuXG4vKiogQSBsaWZlY3ljbGUgc3Vic2NyaWJlci4gRXJyb3JzIGFyZSBsb2dnZWQsIG5vdCBwcm9wYWdhdGVkIChtYXRjaGVzIEFwcEtpdCkuICovXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVIYW5kbGVyID0gKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbi8qKlxuICogVGhlIGVudiBhdXRvLWNvbmZpZ3VyYXRpb24gcmVzb2x2ZWQgYmVmb3JlIGJvb3QsIGV4cG9zZWQgdG8gaW50ZXJjZXB0b3JzIHNvXG4gKiB0aGV5IHJlYWQgQ09NUFVURUQgdmFsdWVzIGluc3RlYWQgb2YgcmUtcmVhZGluZyBgcHJvY2Vzcy5lbnZgIHRoZW1zZWx2ZXMuXG4gKlxuICogYGxha2ViYXNlYCBpcyB0aGUgcmVzb2x2ZWQgUG9zdGdyZXMgY29ubmVjdGlvbiB3aGVuIExha2ViYXNlIGF1dG8tY29uZmlnIHJhblxuICogKHNlZSBgY3JlYXRlLWFwcGAncyBgYXV0b0NvbmZpZ3VyZWApLCBlbHNlIGB1bmRlZmluZWRgLiBgZGF0YWJyaWNrc0hvc3RgIGlzIHRoZVxuICogd29ya3NwYWNlIGhvc3QgYXMgcmVzb2x2ZWQgaW50byB0aGUgZW52aXJvbm1lbnQgKGBEQVRBQlJJQ0tTX0hPU1RgKSwgd2hpY2ggdGhlXG4gKiB0dW5uZWwgaW50ZXJjZXB0b3IgYm90aCByZWFkcyBhbmQsIHdoZW4gaXQgbXVzdCwgc2V0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEFwcEVudiB7XG4gIC8qKiBSZXNvbHZlZCBMYWtlYmFzZSBjb25uZWN0aW9uLCB3aGVuIGF1dG8tY29uZmlnIHJlc29sdmVkIG9uZS4gKi9cbiAgcmVhZG9ubHkgbGFrZWJhc2U/OiBMYWtlYmFzZUNvbm5lY3Rpb247XG4gIC8qKiBSZXNvbHZlZCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBob3N0IChgREFUQUJSSUNLU19IT1NUYCksIHdoZW4ga25vd24uICovXG4gIHJlYWRvbmx5IGRhdGFicmlja3NIb3N0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcHJvY2VzcyB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0LmJpbmRQcm9jZXNzfSBjYW4gc3VwZXJ2aXNlLiBBIGJhcmVcbiAqIGBub2RlOmNoaWxkX3Byb2Nlc3NgIGBDaGlsZFByb2Nlc3NgIChlLmcuIHBvcnRyKSBzYXRpc2ZpZXMgdGhpcywgYW5kIHNvIGRvZXNcbiAqIGBAZGJ4LXRvb2xzL2NvcmVgJ3MgYHNwYXduKClgIHJlc3VsdCAoYSBgQ2hpbGRQcm9jZXNzUmVzdWx0YCBJUyBhXG4gKiBgQ2hpbGRQcm9jZXNzYCkgLSBvbmUgY29kZSBwYXRoIGhhbmRsZXMgYm90aC5cbiAqL1xuZXhwb3J0IHR5cGUgQmluZGFibGVQcm9jZXNzID0gUGljazxDaGlsZFByb2Nlc3MsIFwicGlkXCIgfCBcImtpbGxcIiB8IFwia2lsbGVkXCIgfCBcIm9uY2VcIj47XG5cbi8qKlxuICogVGhlIGhhbmRsZSBwYXNzZWQgdG8gZWFjaCBpbnRlcmNlcHRvci5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgY3JlYXRlQXBwIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW3NlcnZlcigpXSxcbiAqICAgaW50ZXJjZXB0b3I6IChjdHgpID0+IHtcbiAqICAgICBjb25zdCBwb3J0ciA9IHNwYXduUG9ydHIoY3R4LmVudi5kYXRhYnJpY2tzSG9zdCk7XG4gKiAgICAgY3R4LmJpbmRQcm9jZXNzKHBvcnRyKTsgICAgICAgICAgICAvLyBhcHAgPC0+IHBvcnRyIGxpdmUvZGllIHRvZ2V0aGVyXG4gKiAgICAgY3R4Lm9uTGlmZWN5Y2xlKFwic2h1dGRvd25cIiwgKCkgPT4gcG9ydHIua2lsbChcIlNJR1RFUk1cIikpO1xuICogICB9LFxuICogfSk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJjZXB0b3JDb250ZXh0IHtcbiAgLyoqIFRoZSBlbnYgYXV0by1jb25maWd1cmF0aW9uIGNvbXB1dGVkIGJlZm9yZSBib290LiAqL1xuICByZWFkb25seSBlbnY6IFJlc29sdmVkQXBwRW52O1xuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGFuIEFwcEtpdCBsaWZlY3ljbGUgZXZlbnQuIE1pcnJvcnMgYFBsdWdpbkNvbnRleHQub25MaWZlY3ljbGVgO1xuICAgKiB0aGUgaW5qZWN0ZWQge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX0gcmVsYXlzIHRoZSByZWFsIGV2ZW50cyBoZXJlIG9uY2UgdGhlIGFwcFxuICAgKiBib290cy4gQSBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIGFuIGV2ZW50IHRoYXQgYWxyZWFkeSBmaXJlZCBpcyBOT1QgY2FsbGVkXG4gICAqIHJldHJvYWN0aXZlbHkgKHNhbWUgc2VtYW50aWNzIGFzIEFwcEtpdCkuXG4gICAqL1xuICBvbkxpZmVjeWNsZShldmVudDogTGlmZWN5Y2xlRXZlbnQsIGZuOiBMaWZlY3ljbGVIYW5kbGVyKTogdm9pZDtcbiAgLyoqXG4gICAqIEJyb2FkY2FzdCBhIHRlcm1pbmF0aW9uIHNpZ25hbCBmcm9tIHRoZSBtYWluIGFwcCB0byBldmVyeSBib3VuZCBwcm9jZXNzLlxuICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoaXMgcHJvY2VzcyByZWNlaXZlcyBgU0lHSU5UYC9gU0lHVEVSTWAvYFNJR0hVUGA7XG4gICAqIGV4cG9zZWQgc28gYW4gaW50ZXJjZXB0b3IgY2FuIHRyaWdnZXIgdGVhcmRvd24gaXRzZWxmLlxuICAgKi9cbiAgYnJvYWRjYXN0U2lnbmFsKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkO1xuICAvKipcbiAgICogU3VwZXJ2aXNlIGEgY2hpbGQgcHJvY2VzcyBhbG9uZ3NpZGUgdGhlIGFwcCwgY29uY3VycmVudGx5LXN0eWxlOiBzaWduYWxzIHBhc3NcbiAgICogdGhyb3VnaCwgYW5kIGlmIEVJVEhFUiB0aGUgY2hpbGQgb3IgdGhlIGFwcCBkaWVzIHRoZSB3aG9sZSBzZXQgY29tZXMgZG93bi5cbiAgICogR2VuZXJhbGl6ZXMgdGhlIHR1bm5lbCdzIG9sZCBoYW5kLXJvbGxlZCBgc3VwZXJ2aXNlRXhpdGAuIFNhZmUgdG8gY2FsbCBmb3JcbiAgICogc2V2ZXJhbCBjaGlsZHJlbjsgdGVhcmRvd24gaXMgaWRlbXBvdGVudC5cbiAgICovXG4gIGJpbmRQcm9jZXNzKGNoaWxkOiBCaW5kYWJsZVByb2Nlc3MpOiB2b2lkO1xufVxuXG4vKiogQSBzaW5nbGUgaW50ZXJjZXB0b3IsIG9yIHNldmVyYWwuIFRoZSBgY3JlYXRlQXBwYCBgaW50ZXJjZXB0b3I/OmAgb3B0aW9uLiAqL1xuZXhwb3J0IHR5cGUgSW50ZXJjZXB0b3IgPSAoY3R4OiBJbnRlcmNlcHRvckNvbnRleHQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKiogSG93IGxvbmcgYm91bmQgY2hpbGRyZW4gZ2V0IHRvIGV4aXQgb24gYFNJR1RFUk1gIGJlZm9yZSB0aGUgYXBwIGZvcmNlLWV4aXRzLiAqL1xuY29uc3QgVEVBUkRPV05fR1JBQ0VfTVMgPSAzMDAwO1xuXG4vKiogVGhlIHNpZ25hbHMgdGhhdCB0cmlnZ2VyIHRlYXJkb3duIHdoZW4gdGhlIE1BSU4gcHJvY2VzcyByZWNlaXZlcyB0aGVtLiAqL1xuY29uc3QgVEVBUkRPV05fU0lHTkFMUyA9IFtcIlNJR0lOVFwiLCBcIlNJR1RFUk1cIiwgXCJTSUdIVVBcIl0gYXMgY29uc3Q7XG5cbi8qKlxuICogVGhlIG11dGFibGUgbWFjaGluZXJ5IGJlaGluZCBhbiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fS4gU3BsaXQgb3V0IHNvXG4gKiB7QGxpbmsgY3JlYXRlSW50ZXJjZXB0b3JDb250ZXh0fSBjYW4gaGFuZCB0aGUgcHVibGljIGNvbnRleHQgdG8gaW50ZXJjZXB0b3JzXG4gKiB3aGlsZSBgY3JlYXRlLWFwcGAgcmV0YWlucyB0aGUgYGVtaXRMaWZlY3ljbGVgIHNpZGUtY2hhbm5lbCB0aGUgYnJpZGdlIGRyaXZlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcmNlcHRvclJ1bnRpbWUge1xuICAvKiogVGhlIGNvbnRleHQgaGFuZGVkIHRvIGVhY2ggaW50ZXJjZXB0b3IuICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IEludGVyY2VwdG9yQ29udGV4dDtcbiAgLyoqIEZpcmUgYSBsaWZlY3ljbGUgZXZlbnQgdG8gZXZlcnkgc3Vic2NyaWJlciAoY2FsbGVkIGJ5IHtAbGluayBsaWZlY3ljbGVCcmlkZ2V9KS4gKi9cbiAgZW1pdExpZmVjeWNsZShldmVudDogTGlmZWN5Y2xlRXZlbnQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEJ1aWxkIGFuIHtAbGluayBJbnRlcmNlcHRvckNvbnRleHR9ICsgaXRzIHtAbGluayBJbnRlcmNlcHRvclJ1bnRpbWV9LlxuICpcbiAqIFRlYXJkb3duIGlzIHRoZSBnZW5lcmFsaXplZCBgc3VwZXJ2aXNlRXhpdGA6IHRoZSBmaXJzdCBjaGlsZCBleGl0IG9yIG1haW4tcHJvY2Vzc1xuICogdGVybWluYXRpb24gc2lnbmFsIGZsaXBzIGEgb25lLXNob3QgZ3VhcmQsIGBTSUdURVJNYHMgdGhlIG90aGVyIGJvdW5kIGNoaWxkcmVuLFxuICogdGhlbiBgcHJvY2Vzcy5leGl0YHMgYWZ0ZXIge0BsaW5rIFRFQVJET1dOX0dSQUNFX01TfSAoYW4gYHVucmVmYCdkIHRpbWVyLCBzbyBpdFxuICogbmV2ZXIgaXRzZWxmIGhvbGRzIHRoZSBsb29wIG9wZW4pLiBUaGUgcHJvY2Vzcy1zaWduYWwgbGlzdGVuZXJzIGFyZSBpbnN0YWxsZWRcbiAqIGxhemlseSBvbiB0aGUgZmlyc3QgYGJpbmRQcm9jZXNzYCBzbyBhbiBhcHAgdGhhdCBiaW5kcyBub3RoaW5nIGlzIHVudG91Y2hlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUludGVyY2VwdG9yQ29udGV4dChlbnY6IFJlc29sdmVkQXBwRW52KTogSW50ZXJjZXB0b3JSdW50aW1lIHtcbiAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPExpZmVjeWNsZUV2ZW50LCBMaWZlY3ljbGVIYW5kbGVyW10+KCk7XG4gIGNvbnN0IGNoaWxkcmVuID0gbmV3IFNldDxCaW5kYWJsZVByb2Nlc3M+KCk7XG4gIGxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbiAgbGV0IHNpZ25hbHNCb3VuZCA9IGZhbHNlO1xuXG4gIGNvbnN0IHRlYXJkb3duID0gKGNvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQua2lsbGVkKSBjaGlsZC5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiBwcm9jZXNzLmV4aXQoY29kZSksIFRFQVJET1dOX0dSQUNFX01TKS51bnJlZigpO1xuICB9O1xuXG4gIGNvbnN0IGJyb2FkY2FzdFNpZ25hbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFjaGlsZC5raWxsZWQpIGNoaWxkLmtpbGwoc2lnbmFsKTtcbiAgICB9XG4gICAgdGVhcmRvd24oMCk7XG4gIH07XG5cbiAgY29uc3QgYmluZFByb2Nlc3NTaWduYWxzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChzaWduYWxzQm91bmQpIHJldHVybjtcbiAgICBzaWduYWxzQm91bmQgPSB0cnVlO1xuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIFRFQVJET1dOX1NJR05BTFMpIHtcbiAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiBicm9hZGNhc3RTaWduYWwoc2lnbmFsKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGJpbmRQcm9jZXNzID0gKGNoaWxkOiBCaW5kYWJsZVByb2Nlc3MpOiB2b2lkID0+IHtcbiAgICBiaW5kUHJvY2Vzc1NpZ25hbHMoKTtcbiAgICBjaGlsZHJlbi5hZGQoY2hpbGQpO1xuICAgIGNoaWxkLm9uY2UoXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgICBsb2dnZXIud2FybihcImJvdW5kIHByb2Nlc3MgZXhpdGVkOyB0ZWFyaW5nIGRvd24gdGhlIGFwcFwiLCB7IGNvZGUgfSk7XG4gICAgICB0ZWFyZG93bih0eXBlb2YgY29kZSA9PT0gXCJudW1iZXJcIiA/IGNvZGUgOiAxKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBvbkxpZmVjeWNsZSA9IChldmVudDogTGlmZWN5Y2xlRXZlbnQsIGZuOiBMaWZlY3ljbGVIYW5kbGVyKTogdm9pZCA9PiB7XG4gICAgY29uc3QgbGlzdCA9IGhhbmRsZXJzLmdldChldmVudCk7XG4gICAgaWYgKGxpc3QpIGxpc3QucHVzaChmbik7XG4gICAgZWxzZSBoYW5kbGVycy5zZXQoZXZlbnQsIFtmbl0pO1xuICB9O1xuXG4gIGNvbnN0IGVtaXRMaWZlY3ljbGUgPSBhc3luYyAoZXZlbnQ6IExpZmVjeWNsZUV2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgbGlzdCA9IGhhbmRsZXJzLmdldChldmVudCk7XG4gICAgaWYgKCFsaXN0KSByZXR1cm47XG4gICAgZm9yIChjb25zdCBmbiBvZiBsaXN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTWF0Y2ggQXBwS2l0OiBhIGZhaWxpbmcgbGlmZWN5Y2xlIGhhbmRsZXIgaXMgbG9nZ2VkLCBuZXZlciBmYXRhbCwgYW5kXG4gICAgICAgIC8vIG5ldmVyIGJsb2NrcyBpdHMgc2libGluZ3MuXG4gICAgICAgIGxvZ2dlci53YXJuKFwibGlmZWN5Y2xlIGhhbmRsZXIgZmFpbGVkXCIsIHsgZXZlbnQsIGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBjb250ZXh0OiBJbnRlcmNlcHRvckNvbnRleHQgPSB7XG4gICAgZW52LFxuICAgIG9uTGlmZWN5Y2xlLFxuICAgIGJyb2FkY2FzdFNpZ25hbCxcbiAgICBiaW5kUHJvY2VzcyxcbiAgfTtcblxuICByZXR1cm4geyBjb250ZXh0LCBlbWl0TGlmZWN5Y2xlIH07XG59XG5cbi8qKiBDb25maWcgZm9yIHtAbGluayBMaWZlY3ljbGVCcmlkZ2VQbHVnaW59OiB0aGUgc2luayBpdHMgY2FwdHVyZWQgZXZlbnRzIGZsb3cgdG8uICovXG5pbnRlcmZhY2UgTGlmZWN5Y2xlQnJpZGdlQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKiBUaGUgcnVudGltZSB3aG9zZSBgZW1pdExpZmVjeWNsZWAgcmVjZWl2ZXMgdGhlIHJlYWwgQXBwS2l0IGV2ZW50cy4gKi9cbiAgcnVudGltZT86IEludGVyY2VwdG9yUnVudGltZTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIHNoYXBlIG9mIHRoZSBgUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZWAgd2UgYnJpZGdlLiBNaXJyb3JzIG9ubHkgdGhlXG4gKiBvbmUgbWV0aG9kIHdlIHRvdWNoIChsaWtlIHtAbGluayBQbHVnaW5Db250ZXh0TGlrZX0gaW4gYC4vcGx1Z2luYCksIHNpbmNlXG4gKiBBcHBLaXQncyBgUGx1Z2luQ29udGV4dGAgaXMgbm90IGltcG9ydGFibGUgZnJvbSB0aGUgcGFja2FnZSdzIGBleHBvcnRzYC5cbiAqL1xuaW50ZXJmYWNlIExpZmVjeWNsZUNvbnRleHRMaWtlIHtcbiAgb25MaWZlY3ljbGUoZXZlbnQ6IExpZmVjeWNsZUV2ZW50LCBmbjogTGlmZWN5Y2xlSGFuZGxlcik6IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIGhhc09uTGlmZWN5Y2xlKGNvbnRleHQ6IHVua25vd24pOiBjb250ZXh0IGlzIExpZmVjeWNsZUNvbnRleHRMaWtlIHtcbiAgcmV0dXJuIHR5cGVvZiAoY29udGV4dCBhcyBMaWZlY3ljbGVDb250ZXh0TGlrZSB8IHVuZGVmaW5lZCk/Lm9uTGlmZWN5Y2xlID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8qKlxuICogVGhlIGludGVybmFsIHBsdWdpbiB7QGxpbmsgY3JlYXRlQXBwfSBpbmplY3RzIHRvIG1ha2UgQXBwS2l0J3MgbGlmZWN5Y2xlXG4gKiByZWFjaGFibGUgZnJvbSBpbnRlcmNlcHRvciBjb2RlLiBPbiBgc2V0dXAoKWAgaXQgcmVhZHMgaXRzIG93biBgdGhpcy5jb250ZXh0YFxuICogKHRoZSByZWFsIGBQbHVnaW5Db250ZXh0YCkgYW5kIGZvcndhcmRzIGVhY2gge0BsaW5rIExpZmVjeWNsZUV2ZW50fSB0byB0aGVcbiAqIGludGVyY2VwdG9yIHJ1bnRpbWUsIHNvIGBjdHgub25MaWZlY3ljbGUoLi4uKWAgaGFuZGxlcnMgZmlyZSBvbiB0aGUgZ2VudWluZVxuICogZXZlbnRzLiBJdCBvd25zIG5vIHJvdXRlcywgY29uZmlnIHN1cmZhY2UsIG9yIGV4cG9ydHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMaWZlY3ljbGVCcmlkZ2VQbHVnaW4gZXh0ZW5kcyBQbHVnaW48TGlmZWN5Y2xlQnJpZGdlQ29uZmlnPiB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImRieFRvb2xzTGlmZWN5Y2xlQnJpZGdlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiTGlmZWN5Y2xlIEJyaWRnZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlJlbGF5cyBBcHBLaXQgbGlmZWN5Y2xlIGV2ZW50cyB0byB0aGUgY3JlYXRlQXBwIGludGVyY2VwdG9yIGNvbnRleHQuXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICBoaWRkZW46IHRydWUsXG4gICAgcmVzb3VyY2VzOiB7IHJlcXVpcmVkOiBbXSwgb3B0aW9uYWw6IFtdIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwiZGJ4VG9vbHNMaWZlY3ljbGVCcmlkZ2VcIj47XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc2V0dXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcnVudGltZSA9IHRoaXMuY29uZmlnLnJ1bnRpbWU7XG4gICAgaWYgKCFydW50aW1lKSByZXR1cm47XG4gICAgaWYgKCFoYXNPbkxpZmVjeWNsZSh0aGlzLmNvbnRleHQpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJubyBQbHVnaW5Db250ZXh0Lm9uTGlmZWN5Y2xlIHRvIGJyaWRnZTsgaW50ZXJjZXB0b3IgbGlmZWN5Y2xlIGV2ZW50cyBpbmVydFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRzOiBMaWZlY3ljbGVFdmVudFtdID0gW1wic2V0dXA6Y29tcGxldGVcIiwgXCJzZXJ2ZXI6cmVhZHlcIiwgXCJzaHV0ZG93blwiXTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgdGhpcy5jb250ZXh0Lm9uTGlmZWN5Y2xlKGV2ZW50LCAoKSA9PiBydW50aW1lLmVtaXRMaWZlY3ljbGUoZXZlbnQpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEZhY3RvcnkgZm9yIHRoZSBpbmplY3RlZCB7QGxpbmsgTGlmZWN5Y2xlQnJpZGdlUGx1Z2lufS4gKi9cbmV4cG9ydCBjb25zdCBsaWZlY3ljbGVCcmlkZ2UgPSB0b1BsdWdpbihMaWZlY3ljbGVCcmlkZ2VQbHVnaW4pO1xuIl19
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBR0gsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQThDLE1BQU0sb0JBQW9CLENBQUM7QUFDbEcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzdDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFzRnpDLG1GQUFtRjtBQUNuRixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUUvQiw2RUFBNkU7QUFDN0UsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFjbEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsR0FBbUI7SUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXNDLENBQUM7SUFDL0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDNUMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUV6QixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQVksRUFBUSxFQUFFO1FBQ3RDLElBQUksWUFBWTtZQUFFLE9BQU87UUFDekIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxp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QixXQUFXLEVBQUUsc0VBQXNFO1FBQ25GLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLE1BQU0sRUFBRSxJQUFJO1FBQ1osU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO0tBQ1UsQ0FBQztJQUU3QyxLQUFLLENBQUMsS0FBSztRQUNsQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7WUFDM0YsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEYsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDOztBQUdILDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBgY3JlYXRlQXBwYCBJTlRFUkNFUFRPUiBjb250ZXh0OiBhbiBpbi1wcm9jZXNzIGhhbmRsZSBhbiBhcHAgaGFuZHMgdG9cbiAqIGFkZC1vbnMgKHRoZSB0dW5uZWwsIGNoaWVmbHkpIHNvIHRoZXkgY2FuIHJlYWQgdGhlIGVudiBhdXRvLWNvbmZpZ3VyYXRpb25cbiAqIGNvbXB1dGVkLCBob29rIEFwcEtpdCdzIGxpZmVjeWNsZSwgYW5kIHN1cGVydmlzZSBzaWJsaW5nIGNoaWxkIHByb2Nlc3NlcyBhcyBvbmVcbiAqIHVuaXQgLSBjb25jdXJyZW50bHktc3R5bGUsIHdoZXJlIGFueSBkZWF0aCB0YWtlcyB0aGUgd2hvbGUgc2V0IGRvd24uXG4gKlxuICogQW4gaW50ZXJjZXB0b3IgaXMgYSBwbGFpbiBmdW5jdGlvbiBgKGN0eCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5gIHBhc3NlZCB0b1xuICogYGFwcGtpdC5jcmVhdGVBcHBgJ3MgYGludGVyY2VwdG9yYCBvcHRpb24gKFwib25lIG9yIG1hbnlcIikuIGBhcHBraXQuY3JlYXRlQXBwYFxuICogcnVucyBlYWNoIG9uZSBBRlRFUiBhdXRvLWNvbmZpZ3VyYXRpb24gaGFzIHBvcHVsYXRlZCBgcHJvY2Vzcy5lbnZgIGJ1dCBhcyBwYXJ0XG4gKiBvZiBib290aW5nIHRoZSBhcHAsIHNvIGFuIGludGVyY2VwdG9yIHNlZXMgdGhlIHJlc29sdmVkIGNvbm5lY3Rpb24gYW5kIGNhbiBiaW5kXG4gKiBwcm9jZXNzZXMgYmVmb3JlIG9yIGR1cmluZyBzZXR1cC5cbiAqXG4gKiBUaGUgbmFtZXMgaGVyZSBtaXJyb3IgQXBwS2l0J3Mgb3duIHZvY2FidWxhcnkgcmF0aGVyIHRoYW4gaW52ZW50aW5nIHBhcmFsbGVsXG4gKiBvbmVzOiB7QGxpbmsgTGlmZWN5Y2xlRXZlbnR9IGFuZCB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0Lm9uTGlmZWN5Y2xlfSBhcmUgdGhlXG4gKiBleGFjdCBzaGFwZSBvZiBgUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZWAgKGBzZXR1cDpjb21wbGV0ZWAgLyBgc2VydmVyOnJlYWR5YCAvXG4gKiBgc2h1dGRvd25gKS4gVGhlIGJyaWRnZSB0aGF0IG1ha2VzIHRoYXQgaG9vayByZWFjaGFibGUgZnJvbSBPVVRTSURFIGEgcGx1Z2luIC1cbiAqIHdoZXJlIGludGVyY2VwdG9ycyBydW4gLSBpcyB7QGxpbmsgbGlmZWN5Y2xlQnJpZGdlfSwgYSB0aW55IGludGVybmFsIHBsdWdpblxuICogYGFwcGtpdC5jcmVhdGVBcHBgIGluamVjdHMgdG8gY2FwdHVyZSBgdGhpcy5jb250ZXh0YCBhbmQgcmVsYXkgaXRzIGV2ZW50cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBQbHVnaW4sIHRvUGx1Z2luLCB0eXBlIEJhc2VQbHVnaW5Db25maWcsIHR5cGUgUGx1Z2luTWFuaWZlc3QgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBMYWtlYmFzZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9sYWtlYmFzZS1yZXNvbHZlci50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiaW50ZXJjZXB0b3JcIik7XG5cbi8qKlxuICogQXBwS2l0J3MgcGx1Z2luLWxpZmVjeWNsZSBldmVudHMsIHZlcmJhdGltIGZyb20gYFBsdWdpbkNvbnRleHRgXG4gKiAoYG5vZGVfbW9kdWxlcy9AZGF0YWJyaWNrcy9hcHBraXQvLi4uL2NvcmUvcGx1Z2luLWNvbnRleHQuZC50c2ApLiBSZS1kZWNsYXJlZFxuICogc3RydWN0dXJhbGx5IHJhdGhlciB0aGFuIGltcG9ydGVkIGJlY2F1c2UgYFBsdWdpbkNvbnRleHRgIGlzIG5vdCBpbiB0aGVcbiAqIHBhY2thZ2UncyBgZXhwb3J0c2AgbWFwICh0aGUgc2FtZSByZWFzb24ge0BsaW5rIFBsdWdpbkNvbnRleHRMaWtlfSBleGlzdHMgaW5cbiAqIGAuL3BsdWdpbmApLlxuICpcbiAqIC0gYHNldHVwOmNvbXBsZXRlYCAtIGV2ZXJ5IHBsdWdpbidzIGBzZXR1cCgpYCBoYXMgcmVzb2x2ZWQuXG4gKiAtIGBzZXJ2ZXI6cmVhZHlgIC0gdGhlIGBzZXJ2ZXIoKWAgcGx1Z2luIGlzIGxpc3RlbmluZyAobmV2ZXIgZmlyZXMgZm9yIGFcbiAqICAgc2VydmVybGVzcyBhcHAsIGUuZy4gdGhlIHR1bm5lbCBnYXRlKS5cbiAqIC0gYHNodXRkb3duYCAtIHRoZSBhcHAgaXMgdGVhcmluZyBkb3duLlxuICovXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVFdmVudCA9IFwic2V0dXA6Y29tcGxldGVcIiB8IFwic2VydmVyOnJlYWR5XCIgfCBcInNodXRkb3duXCI7XG5cbi8qKiBBIGxpZmVjeWNsZSBzdWJzY3JpYmVyLiBFcnJvcnMgYXJlIGxvZ2dlZCwgbm90IHByb3BhZ2F0ZWQgKG1hdGNoZXMgQXBwS2l0KS4gKi9cbmV4cG9ydCB0eXBlIExpZmVjeWNsZUhhbmRsZXIgPSAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBUaGUgZW52IGF1dG8tY29uZmlndXJhdGlvbiByZXNvbHZlZCBiZWZvcmUgYm9vdCwgZXhwb3NlZCB0byBpbnRlcmNlcHRvcnMgc29cbiAqIHRoZXkgcmVhZCBDT01QVVRFRCB2YWx1ZXMgaW5zdGVhZCBvZiByZS1yZWFkaW5nIGBwcm9jZXNzLmVudmAgdGhlbXNlbHZlcy5cbiAqXG4gKiBgbGFrZWJhc2VgIGlzIHRoZSByZXNvbHZlZCBQb3N0Z3JlcyBjb25uZWN0aW9uIHdoZW4gTGFrZWJhc2UgYXV0by1jb25maWcgcmFuXG4gKiAoc2VlIGBhcHBraXQuYXV0b0NvbmZpZ3VyZWApLCBlbHNlIGB1bmRlZmluZWRgLiBgZGF0YWJyaWNrc0hvc3RgIGlzIHRoZVxuICogd29ya3NwYWNlIGhvc3QgYXMgcmVzb2x2ZWQgaW50byB0aGUgZW52aXJvbm1lbnQgKGBEQVRBQlJJQ0tTX0hPU1RgKSwgd2hpY2ggdGhlXG4gKiB0dW5uZWwgaW50ZXJjZXB0b3IgYm90aCByZWFkcyBhbmQsIHdoZW4gaXQgbXVzdCwgc2V0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEFwcEVudiB7XG4gIC8qKiBSZXNvbHZlZCBMYWtlYmFzZSBjb25uZWN0aW9uLCB3aGVuIGF1dG8tY29uZmlnIHJlc29sdmVkIG9uZS4gKi9cbiAgcmVhZG9ubHkgbGFrZWJhc2U/OiBMYWtlYmFzZUNvbm5lY3Rpb247XG4gIC8qKiBSZXNvbHZlZCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBob3N0IChgREFUQUJSSUNLU19IT1NUYCksIHdoZW4ga25vd24uICovXG4gIHJlYWRvbmx5IGRhdGFicmlja3NIb3N0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcHJvY2VzcyB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0LmJpbmRQcm9jZXNzfSBjYW4gc3VwZXJ2aXNlLiBBIGJhcmVcbiAqIGBub2RlOmNoaWxkX3Byb2Nlc3NgIGBDaGlsZFByb2Nlc3NgIChlLmcuIHBvcnRyKSBzYXRpc2ZpZXMgdGhpcywgYW5kIHNvIGRvZXNcbiAqIGBAZGJ4LXRvb2xzL2NvcmVgJ3MgYHNwYXduKClgIHJlc3VsdCAoYSBgQ2hpbGRQcm9jZXNzUmVzdWx0YCBJUyBhXG4gKiBgQ2hpbGRQcm9jZXNzYCkgLSBvbmUgY29kZSBwYXRoIGhhbmRsZXMgYm90aC5cbiAqL1xuZXhwb3J0IHR5cGUgQmluZGFibGVQcm9jZXNzID0gUGljazxDaGlsZFByb2Nlc3MsIFwicGlkXCIgfCBcImtpbGxcIiB8IFwia2lsbGVkXCIgfCBcIm9uY2VcIj47XG5cbi8qKlxuICogVGhlIGhhbmRsZSBwYXNzZWQgdG8gZWFjaCBpbnRlcmNlcHRvci5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtzZXJ2ZXIoKV0sXG4gKiAgIGludGVyY2VwdG9yOiAoY3R4KSA9PiB7XG4gKiAgICAgY29uc3QgcG9ydHIgPSBzcGF3blBvcnRyKGN0eC5lbnYuZGF0YWJyaWNrc0hvc3QpO1xuICogICAgIGN0eC5iaW5kUHJvY2Vzcyhwb3J0cik7ICAgICAgICAgICAgLy8gYXBwIDwtPiBwb3J0ciBsaXZlL2RpZSB0b2dldGhlclxuICogICAgIGN0eC5vbkxpZmVjeWNsZShcInNodXRkb3duXCIsICgpID0+IHBvcnRyLmtpbGwoXCJTSUdURVJNXCIpKTtcbiAqICAgfSxcbiAqIH0pO1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyY2VwdG9yQ29udGV4dCB7XG4gIC8qKiBUaGUgZW52IGF1dG8tY29uZmlndXJhdGlvbiBjb21wdXRlZCBiZWZvcmUgYm9vdC4gKi9cbiAgcmVhZG9ubHkgZW52OiBSZXNvbHZlZEFwcEVudjtcbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBhbiBBcHBLaXQgbGlmZWN5Y2xlIGV2ZW50LiBNaXJyb3JzIGBQbHVnaW5Db250ZXh0Lm9uTGlmZWN5Y2xlYDtcbiAgICogdGhlIGluamVjdGVkIHtAbGluayBsaWZlY3ljbGVCcmlkZ2V9IHJlbGF5cyB0aGUgcmVhbCBldmVudHMgaGVyZSBvbmNlIHRoZSBhcHBcbiAgICogYm9vdHMuIEEgaGFuZGxlciByZWdpc3RlcmVkIGZvciBhbiBldmVudCB0aGF0IGFscmVhZHkgZmlyZWQgaXMgTk9UIGNhbGxlZFxuICAgKiByZXRyb2FjdGl2ZWx5IChzYW1lIHNlbWFudGljcyBhcyBBcHBLaXQpLlxuICAgKi9cbiAgb25MaWZlY3ljbGUoZXZlbnQ6IExpZmVjeWNsZUV2ZW50LCBmbjogTGlmZWN5Y2xlSGFuZGxlcik6IHZvaWQ7XG4gIC8qKlxuICAgKiBCcm9hZGNhc3QgYSB0ZXJtaW5hdGlvbiBzaWduYWwgZnJvbSB0aGUgbWFpbiBhcHAgdG8gZXZlcnkgYm91bmQgcHJvY2Vzcy5cbiAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGlzIHByb2Nlc3MgcmVjZWl2ZXMgYFNJR0lOVGAvYFNJR1RFUk1gL2BTSUdIVVBgO1xuICAgKiBleHBvc2VkIHNvIGFuIGludGVyY2VwdG9yIGNhbiB0cmlnZ2VyIHRlYXJkb3duIGl0c2VsZi5cbiAgICovXG4gIGJyb2FkY2FzdFNpZ25hbChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZDtcbiAgLyoqXG4gICAqIFN1cGVydmlzZSBhIGNoaWxkIHByb2Nlc3MgYWxvbmdzaWRlIHRoZSBhcHAsIGNvbmN1cnJlbnRseS1zdHlsZTogc2lnbmFscyBwYXNzXG4gICAqIHRocm91Z2gsIGFuZCBpZiBFSVRIRVIgdGhlIGNoaWxkIG9yIHRoZSBhcHAgZGllcyB0aGUgd2hvbGUgc2V0IGNvbWVzIGRvd24uXG4gICAqIEdlbmVyYWxpemVzIHRoZSB0dW5uZWwncyBvbGQgaGFuZC1yb2xsZWQgYHN1cGVydmlzZUV4aXRgLiBTYWZlIHRvIGNhbGwgZm9yXG4gICAqIHNldmVyYWwgY2hpbGRyZW47IHRlYXJkb3duIGlzIGlkZW1wb3RlbnQuXG4gICAqL1xuICBiaW5kUHJvY2VzcyhjaGlsZDogQmluZGFibGVQcm9jZXNzKTogdm9pZDtcbn1cblxuLyoqIEEgc2luZ2xlIGludGVyY2VwdG9yLCBvciBzZXZlcmFsLiBUaGUgYGNyZWF0ZUFwcGAgYGludGVyY2VwdG9yPzpgIG9wdGlvbi4gKi9cbmV4cG9ydCB0eXBlIEludGVyY2VwdG9yID0gKGN0eDogSW50ZXJjZXB0b3JDb250ZXh0KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLyoqIEhvdyBsb25nIGJvdW5kIGNoaWxkcmVuIGdldCB0byBleGl0IG9uIGBTSUdURVJNYCBiZWZvcmUgdGhlIGFwcCBmb3JjZS1leGl0cy4gKi9cbmNvbnN0IFRFQVJET1dOX0dSQUNFX01TID0gMzAwMDtcblxuLyoqIFRoZSBzaWduYWxzIHRoYXQgdHJpZ2dlciB0ZWFyZG93biB3aGVuIHRoZSBNQUlOIHByb2Nlc3MgcmVjZWl2ZXMgdGhlbS4gKi9cbmNvbnN0IFRFQVJET1dOX1NJR05BTFMgPSBbXCJTSUdJTlRcIiwgXCJTSUdURVJNXCIsIFwiU0lHSFVQXCJdIGFzIGNvbnN0O1xuXG4vKipcbiAqIFRoZSBtdXRhYmxlIG1hY2hpbmVyeSBiZWhpbmQgYW4ge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0uIFNwbGl0IG91dCBzb1xuICoge0BsaW5rIGNyZWF0ZUludGVyY2VwdG9yQ29udGV4dH0gY2FuIGhhbmQgdGhlIHB1YmxpYyBjb250ZXh0IHRvIGludGVyY2VwdG9yc1xuICogd2hpbGUgYGFwcGtpdC5jcmVhdGVBcHBgIHJldGFpbnMgdGhlIGBlbWl0TGlmZWN5Y2xlYCBzaWRlLWNoYW5uZWwgdGhlIGJyaWRnZSBkcml2ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJjZXB0b3JSdW50aW1lIHtcbiAgLyoqIFRoZSBjb250ZXh0IGhhbmRlZCB0byBlYWNoIGludGVyY2VwdG9yLiAqL1xuICByZWFkb25seSBjb250ZXh0OiBJbnRlcmNlcHRvckNvbnRleHQ7XG4gIC8qKiBGaXJlIGEgbGlmZWN5Y2xlIGV2ZW50IHRvIGV2ZXJ5IHN1YnNjcmliZXIgKGNhbGxlZCBieSB7QGxpbmsgbGlmZWN5Y2xlQnJpZGdlfSkuICovXG4gIGVtaXRMaWZlY3ljbGUoZXZlbnQ6IExpZmVjeWNsZUV2ZW50KTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSArIGl0cyB7QGxpbmsgSW50ZXJjZXB0b3JSdW50aW1lfS5cbiAqXG4gKiBUZWFyZG93biBpcyB0aGUgZ2VuZXJhbGl6ZWQgYHN1cGVydmlzZUV4aXRgOiB0aGUgZmlyc3QgY2hpbGQgZXhpdCBvciBtYWluLXByb2Nlc3NcbiAqIHRlcm1pbmF0aW9uIHNpZ25hbCBmbGlwcyBhIG9uZS1zaG90IGd1YXJkLCBgU0lHVEVSTWBzIHRoZSBvdGhlciBib3VuZCBjaGlsZHJlbixcbiAqIHRoZW4gYHByb2Nlc3MuZXhpdGBzIGFmdGVyIHtAbGluayBURUFSRE9XTl9HUkFDRV9NU30gKGFuIGB1bnJlZmAnZCB0aW1lciwgc28gaXRcbiAqIG5ldmVyIGl0c2VsZiBob2xkcyB0aGUgbG9vcCBvcGVuKS4gVGhlIHByb2Nlc3Mtc2lnbmFsIGxpc3RlbmVycyBhcmUgaW5zdGFsbGVkXG4gKiBsYXppbHkgb24gdGhlIGZpcnN0IGBiaW5kUHJvY2Vzc2Agc28gYW4gYXBwIHRoYXQgYmluZHMgbm90aGluZyBpcyB1bnRvdWNoZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnRlcmNlcHRvckNvbnRleHQoZW52OiBSZXNvbHZlZEFwcEVudik6IEludGVyY2VwdG9yUnVudGltZSB7XG4gIGNvbnN0IGhhbmRsZXJzID0gbmV3IE1hcDxMaWZlY3ljbGVFdmVudCwgTGlmZWN5Y2xlSGFuZGxlcltdPigpO1xuICBjb25zdCBjaGlsZHJlbiA9IG5ldyBTZXQ8QmluZGFibGVQcm9jZXNzPigpO1xuICBsZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG4gIGxldCBzaWduYWxzQm91bmQgPSBmYWxzZTtcblxuICBjb25zdCB0ZWFyZG93biA9IChjb2RlOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoIWNoaWxkLmtpbGxlZCkgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4gcHJvY2Vzcy5leGl0KGNvZGUpLCBURUFSRE9XTl9HUkFDRV9NUykudW5yZWYoKTtcbiAgfTtcblxuICBjb25zdCBicm9hZGNhc3RTaWduYWwgPSAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQua2lsbGVkKSBjaGlsZC5raWxsKHNpZ25hbCk7XG4gICAgfVxuICAgIHRlYXJkb3duKDApO1xuICB9O1xuXG4gIGNvbnN0IGJpbmRQcm9jZXNzU2lnbmFscyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoc2lnbmFsc0JvdW5kKSByZXR1cm47XG4gICAgc2lnbmFsc0JvdW5kID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBURUFSRE9XTl9TSUdOQUxTKSB7XG4gICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4gYnJvYWRjYXN0U2lnbmFsKHNpZ25hbCkpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBiaW5kUHJvY2VzcyA9IChjaGlsZDogQmluZGFibGVQcm9jZXNzKTogdm9pZCA9PiB7XG4gICAgYmluZFByb2Nlc3NTaWduYWxzKCk7XG4gICAgY2hpbGRyZW4uYWRkKGNoaWxkKTtcbiAgICBjaGlsZC5vbmNlKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oXCJib3VuZCBwcm9jZXNzIGV4aXRlZDsgdGVhcmluZyBkb3duIHRoZSBhcHBcIiwgeyBjb2RlIH0pO1xuICAgICAgdGVhcmRvd24odHlwZW9mIGNvZGUgPT09IFwibnVtYmVyXCIgPyBjb2RlIDogMSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3Qgb25MaWZlY3ljbGUgPSAoZXZlbnQ6IExpZmVjeWNsZUV2ZW50LCBmbjogTGlmZWN5Y2xlSGFuZGxlcik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGxpc3QgPSBoYW5kbGVycy5nZXQoZXZlbnQpO1xuICAgIGlmIChsaXN0KSBsaXN0LnB1c2goZm4pO1xuICAgIGVsc2UgaGFuZGxlcnMuc2V0KGV2ZW50LCBbZm5dKTtcbiAgfTtcblxuICBjb25zdCBlbWl0TGlmZWN5Y2xlID0gYXN5bmMgKGV2ZW50OiBMaWZlY3ljbGVFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGxpc3QgPSBoYW5kbGVycy5nZXQoZXZlbnQpO1xuICAgIGlmICghbGlzdCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgZm4gb2YgbGlzdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE1hdGNoIEFwcEtpdDogYSBmYWlsaW5nIGxpZmVjeWNsZSBoYW5kbGVyIGlzIGxvZ2dlZCwgbmV2ZXIgZmF0YWwsIGFuZFxuICAgICAgICAvLyBuZXZlciBibG9ja3MgaXRzIHNpYmxpbmdzLlxuICAgICAgICBsb2dnZXIud2FybihcImxpZmVjeWNsZSBoYW5kbGVyIGZhaWxlZFwiLCB7IGV2ZW50LCBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY29udGV4dDogSW50ZXJjZXB0b3JDb250ZXh0ID0ge1xuICAgIGVudixcbiAgICBvbkxpZmVjeWNsZSxcbiAgICBicm9hZGNhc3RTaWduYWwsXG4gICAgYmluZFByb2Nlc3MsXG4gIH07XG5cbiAgcmV0dXJuIHsgY29udGV4dCwgZW1pdExpZmVjeWNsZSB9O1xufVxuXG4vKiogQ29uZmlnIGZvciB7QGxpbmsgTGlmZWN5Y2xlQnJpZGdlUGx1Z2lufTogdGhlIHNpbmsgaXRzIGNhcHR1cmVkIGV2ZW50cyBmbG93IHRvLiAqL1xuaW50ZXJmYWNlIExpZmVjeWNsZUJyaWRnZUNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcge1xuICAvKiogVGhlIHJ1bnRpbWUgd2hvc2UgYGVtaXRMaWZlY3ljbGVgIHJlY2VpdmVzIHRoZSByZWFsIEFwcEtpdCBldmVudHMuICovXG4gIHJ1bnRpbWU/OiBJbnRlcmNlcHRvclJ1bnRpbWU7XG59XG5cbi8qKlxuICogU3RydWN0dXJhbCBzaGFwZSBvZiB0aGUgYFBsdWdpbkNvbnRleHQub25MaWZlY3ljbGVgIHdlIGJyaWRnZS4gTWlycm9ycyBvbmx5IHRoZVxuICogb25lIG1ldGhvZCB3ZSB0b3VjaCAobGlrZSB7QGxpbmsgUGx1Z2luQ29udGV4dExpa2V9IGluIGAuL3BsdWdpbmApLCBzaW5jZVxuICogQXBwS2l0J3MgYFBsdWdpbkNvbnRleHRgIGlzIG5vdCBpbXBvcnRhYmxlIGZyb20gdGhlIHBhY2thZ2UncyBgZXhwb3J0c2AuXG4gKi9cbmludGVyZmFjZSBMaWZlY3ljbGVDb250ZXh0TGlrZSB7XG4gIG9uTGlmZWN5Y2xlKGV2ZW50OiBMaWZlY3ljbGVFdmVudCwgZm46IExpZmVjeWNsZUhhbmRsZXIpOiB2b2lkO1xufVxuXG5mdW5jdGlvbiBoYXNPbkxpZmVjeWNsZShjb250ZXh0OiB1bmtub3duKTogY29udGV4dCBpcyBMaWZlY3ljbGVDb250ZXh0TGlrZSB7XG4gIHJldHVybiB0eXBlb2YgKGNvbnRleHQgYXMgTGlmZWN5Y2xlQ29udGV4dExpa2UgfCB1bmRlZmluZWQpPy5vbkxpZmVjeWNsZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG4vKipcbiAqIFRoZSBpbnRlcm5hbCBwbHVnaW4gYGFwcGtpdC5jcmVhdGVBcHBgIGluamVjdHMgdG8gbWFrZSBBcHBLaXQncyBsaWZlY3ljbGVcbiAqIHJlYWNoYWJsZSBmcm9tIGludGVyY2VwdG9yIGNvZGUuIE9uIGBzZXR1cCgpYCBpdCByZWFkcyBpdHMgb3duIGB0aGlzLmNvbnRleHRgXG4gKiAodGhlIHJlYWwgYFBsdWdpbkNvbnRleHRgKSBhbmQgZm9yd2FyZHMgZWFjaCB7QGxpbmsgTGlmZWN5Y2xlRXZlbnR9IHRvIHRoZVxuICogaW50ZXJjZXB0b3IgcnVudGltZSwgc28gYGN0eC5vbkxpZmVjeWNsZSguLi4pYCBoYW5kbGVycyBmaXJlIG9uIHRoZSBnZW51aW5lXG4gKiBldmVudHMuIEl0IG93bnMgbm8gcm91dGVzLCBjb25maWcgc3VyZmFjZSwgb3IgZXhwb3J0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIExpZmVjeWNsZUJyaWRnZVBsdWdpbiBleHRlbmRzIFBsdWdpbjxMaWZlY3ljbGVCcmlkZ2VDb25maWc+IHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwiZGJ4VG9vbHNMaWZlY3ljbGVCcmlkZ2VcIixcbiAgICBkaXNwbGF5TmFtZTogXCJMaWZlY3ljbGUgQnJpZGdlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiUmVsYXlzIEFwcEtpdCBsaWZlY3ljbGUgZXZlbnRzIHRvIHRoZSBjcmVhdGVBcHAgaW50ZXJjZXB0b3IgY29udGV4dC5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIGhpZGRlbjogdHJ1ZSxcbiAgICByZXNvdXJjZXM6IHsgcmVxdWlyZWQ6IFtdLCBvcHRpb25hbDogW10gfSxcbiAgfSBzYXRpc2ZpZXMgUGx1Z2luTWFuaWZlc3Q8XCJkYnhUb29sc0xpZmVjeWNsZUJyaWRnZVwiPjtcblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBydW50aW1lID0gdGhpcy5jb25maWcucnVudGltZTtcbiAgICBpZiAoIXJ1bnRpbWUpIHJldHVybjtcbiAgICBpZiAoIWhhc09uTGlmZWN5Y2xlKHRoaXMuY29udGV4dCkpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIm5vIFBsdWdpbkNvbnRleHQub25MaWZlY3ljbGUgdG8gYnJpZGdlOyBpbnRlcmNlcHRvciBsaWZlY3ljbGUgZXZlbnRzIGluZXJ0XCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBldmVudHM6IExpZmVjeWNsZUV2ZW50W10gPSBbXCJzZXR1cDpjb21wbGV0ZVwiLCBcInNlcnZlcjpyZWFkeVwiLCBcInNodXRkb3duXCJdO1xuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICB0aGlzLmNvbnRleHQub25MaWZlY3ljbGUoZXZlbnQsICgpID0+IHJ1bnRpbWUuZW1pdExpZmVjeWNsZShldmVudCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogRmFjdG9yeSBmb3IgdGhlIGluamVjdGVkIHtAbGluayBMaWZlY3ljbGVCcmlkZ2VQbHVnaW59LiAqL1xuZXhwb3J0IGNvbnN0IGxpZmVjeWNsZUJyaWRnZSA9IHRvUGx1Z2luKExpZmVjeWNsZUJyaWRnZVBsdWdpbik7XG4iXX0=
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/appkit.ts","../src/config.ts","../src/
|
|
1
|
+
{"root":["../src/appkit.ts","../src/config.ts","../src/databricks.ts","../src/identity.ts","../src/interceptor.ts","../src/lakebase-resolver.ts","../src/pgaddress.ts","../src/plugin.ts","../src/provision.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@databricks/sdk-experimental": "^0.17.0",
|
|
31
|
-
"@dbx-tools/core": "0.6.
|
|
32
|
-
"@dbx-tools/shared-core": "0.6.
|
|
31
|
+
"@dbx-tools/core": "0.6.70",
|
|
32
|
+
"@dbx-tools/shared-core": "0.6.70",
|
|
33
33
|
"yaml": "^2.9.0",
|
|
34
34
|
"zod": "4.3.6"
|
|
35
35
|
},
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"./package.json": "./package.json"
|
|
48
48
|
}
|
|
49
49
|
},
|
|
50
|
-
"version": "0.6.
|
|
50
|
+
"version": "0.6.70",
|
|
51
51
|
"types": "./lib/index.d.ts",
|
|
52
52
|
"type": "module",
|
|
53
53
|
"exports": {
|
package/src/appkit.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
|
|
@@ -11,11 +27,295 @@
|
|
|
11
27
|
* @module
|
|
12
28
|
*/
|
|
13
29
|
|
|
14
|
-
import {
|
|
15
|
-
|
|
30
|
+
import {
|
|
31
|
+
createApp as appkitCreateApp,
|
|
32
|
+
getExecutionContext,
|
|
33
|
+
InitializationError,
|
|
34
|
+
} from "@databricks/appkit";
|
|
35
|
+
// AppKit's root barrel re-exports `PluginData` but not `PluginMap`; the package
|
|
36
|
+
// publishes this subpath for exactly that type.
|
|
37
|
+
import type { PluginMap } from "@databricks/appkit/dist/shared/src/plugin";
|
|
38
|
+
import { async, log } from "@dbx-tools/shared-core";
|
|
39
|
+
|
|
40
|
+
import {
|
|
41
|
+
createInterceptorContext,
|
|
42
|
+
type Interceptor,
|
|
43
|
+
type InterceptorRuntime,
|
|
44
|
+
lifecycleBridge,
|
|
45
|
+
type ResolvedAppEnv,
|
|
46
|
+
} from "./interceptor.ts";
|
|
47
|
+
import { applyLakebaseEnv, type LakebaseConnection } from "./lakebase-resolver.ts";
|
|
48
|
+
import { provisionCacheSchema } from "./provision.ts";
|
|
16
49
|
|
|
17
50
|
const logger = log.logger("appkit");
|
|
18
51
|
|
|
52
|
+
type AppKitCreateAppConfig = NonNullable<Parameters<typeof appkitCreateApp>[0]>;
|
|
53
|
+
type AppKitPlugins = NonNullable<AppKitCreateAppConfig["plugins"]>;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* What auto-configuration does before AppKit boots.
|
|
57
|
+
*
|
|
58
|
+
* - `"provision"`: resolve the Lakebase connection into `process.env`, then
|
|
59
|
+
* grant the AppKit cache schema to the connecting role.
|
|
60
|
+
* - `"env"`: resolve the Lakebase connection into `process.env` only.
|
|
61
|
+
*
|
|
62
|
+
* Omit it to get `"provision"` gated on a `lakebase` plugin being registered;
|
|
63
|
+
* set it explicitly to run regardless of the plugin list, or pass `false` to
|
|
64
|
+
* skip auto-configuration entirely.
|
|
65
|
+
*
|
|
66
|
+
* Set it EXPLICITLY on an app that has no `lakebase()` plugin but still wants
|
|
67
|
+
* AppKit's PERSISTENT cache. AppKit picks Lakebase for `CacheManager` only when
|
|
68
|
+
* `createLakebasePool()` can build a pool, and that reads `LAKEBASE_ENDPOINT` /
|
|
69
|
+
* `PGHOST` / `PGDATABASE` straight from `process.env` - so without this step the
|
|
70
|
+
* cache silently falls back to in-memory, and anything it holds (a session
|
|
71
|
+
* signing key, a one-time code) is lost on restart. `"env"` is the right mode
|
|
72
|
+
* there: the app SP cannot grant on the cache schema anyway.
|
|
73
|
+
*/
|
|
74
|
+
export type AutoConfigureMode = "env" | "provision";
|
|
75
|
+
|
|
76
|
+
/** AppKit's `createApp` config plus the dbx-tools auto-configuration switch. */
|
|
77
|
+
export type CreateAppConfig<T extends AppKitPlugins = AppKitPlugins> = Omit<
|
|
78
|
+
AppKitCreateAppConfig,
|
|
79
|
+
"plugins" | "onPluginsReady"
|
|
80
|
+
> & {
|
|
81
|
+
plugins?: T;
|
|
82
|
+
onPluginsReady?: (appkit: PluginMap<T>) => void | Promise<void>;
|
|
83
|
+
/** Auto-configuration to run before AppKit boots. Defaults to `"provision"`. */
|
|
84
|
+
autoConfigure?: AutoConfigureMode | false;
|
|
85
|
+
/**
|
|
86
|
+
* One or many {@link Interceptor}s handed an {@link InterceptorContext} once
|
|
87
|
+
* auto-configuration has computed the env. Each receives the resolved env, an
|
|
88
|
+
* AppKit-lifecycle hook, and `bindProcess` for concurrently-style supervision -
|
|
89
|
+
* see `./interceptor`. The tunnel is the primary consumer.
|
|
90
|
+
*/
|
|
91
|
+
interceptor?: Interceptor | Interceptor[];
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const LAKEBASE_PLUGIN = "lakebase";
|
|
95
|
+
const DEFAULT_AUTO_CONFIGURE: AutoConfigureMode = "provision";
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Upper bound on boot-time auto-configuration. It runs as the service principal
|
|
99
|
+
* before any plugin is constructed, so it sits outside AppKit's interceptor
|
|
100
|
+
* chain and inherits no timeout, retry, or telemetry from it. The budget covers
|
|
101
|
+
* the resolver's own worst case (create a project, then wait for its endpoint)
|
|
102
|
+
* plus the cache-schema grants.
|
|
103
|
+
*/
|
|
104
|
+
const AUTO_CONFIGURE_TIMEOUT_MS = 11 * 60_000;
|
|
105
|
+
|
|
106
|
+
function usesPlugin<T extends AppKitPlugins>(
|
|
107
|
+
config: CreateAppConfig<T> | undefined,
|
|
108
|
+
name: string,
|
|
109
|
+
): boolean {
|
|
110
|
+
return Boolean(config?.plugins?.some((entry) => entry.name === name));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Plugin names for boot logs (order preserved). */
|
|
114
|
+
function pluginNames(config: CreateAppConfig | undefined): string[] {
|
|
115
|
+
return (config?.plugins ?? []).map((entry) => entry.name);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Run enabled auto-configuration steps without calling AppKit's `createApp`.
|
|
120
|
+
*
|
|
121
|
+
* Lakebase Postgres resolves when {@link CreateAppConfig.autoConfigure} is set
|
|
122
|
+
* explicitly or a `lakebase` plugin is listed in `config.plugins`. `signal`
|
|
123
|
+
* cancels the resolution; it is combined with an internal boot timeout either
|
|
124
|
+
* way.
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
128
|
+
*
|
|
129
|
+
* // Populate PGHOST / PGDATABASE / LAKEBASE_ENDPOINT without booting AppKit.
|
|
130
|
+
* await appkit.autoConfigure({ autoConfigure: "env" });
|
|
131
|
+
*/
|
|
132
|
+
export async function autoConfigure<T extends AppKitPlugins>(
|
|
133
|
+
config?: CreateAppConfig<T>,
|
|
134
|
+
signal?: AbortSignal,
|
|
135
|
+
): Promise<LakebaseConnection | undefined> {
|
|
136
|
+
const mode = config?.autoConfigure ?? DEFAULT_AUTO_CONFIGURE;
|
|
137
|
+
const explicit = config?.autoConfigure !== undefined;
|
|
138
|
+
const lakebasePluginPresent = usesPlugin(config, LAKEBASE_PLUGIN);
|
|
139
|
+
const plugins = pluginNames(config);
|
|
140
|
+
logger.debug("autoConfigure: start", {
|
|
141
|
+
mode,
|
|
142
|
+
explicit,
|
|
143
|
+
lakebasePluginPresent,
|
|
144
|
+
plugins,
|
|
145
|
+
timeoutMs: AUTO_CONFIGURE_TIMEOUT_MS,
|
|
146
|
+
callerSignal: Boolean(signal),
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
if (mode === false || !(explicit || lakebasePluginPresent)) {
|
|
150
|
+
const skippedReason = mode === false ? "disabled" : "no lakebase plugin";
|
|
151
|
+
logger.debug("autoConfigure: skip", { skippedReason, mode, lakebasePluginPresent, plugins });
|
|
152
|
+
logger.info("ready", {
|
|
153
|
+
autoConfigure: mode,
|
|
154
|
+
lakebasePluginPresent,
|
|
155
|
+
provisioned: false,
|
|
156
|
+
skippedReason,
|
|
157
|
+
});
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const controller = new AbortController();
|
|
162
|
+
async.tieAbortSignal(controller, signal);
|
|
163
|
+
async.tieAbortSignal(controller, AbortSignal.timeout(AUTO_CONFIGURE_TIMEOUT_MS));
|
|
164
|
+
|
|
165
|
+
const provision = mode === "provision";
|
|
166
|
+
logger.debug("autoConfigure: resolve lakebase", { provision, mode });
|
|
167
|
+
const resolved = await autoConfigureLakebase(provision, controller.signal);
|
|
168
|
+
logger.debug("autoConfigure: done", {
|
|
169
|
+
mode,
|
|
170
|
+
lakebasePluginPresent,
|
|
171
|
+
provisioned: provision,
|
|
172
|
+
...redactLakebaseConnection(resolved),
|
|
173
|
+
});
|
|
174
|
+
logger.info("ready", { autoConfigure: mode, lakebasePluginPresent, provisioned: provision });
|
|
175
|
+
return resolved;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Resolve Lakebase Postgres connection info, write the resolved values to
|
|
180
|
+
* `process.env`, and return the record. Used by {@link autoConfigure}; call
|
|
181
|
+
* {@link applyLakebaseEnv} directly when finer control is needed (a different
|
|
182
|
+
* `autoCreate` policy, or a caller that wants the env without booting AppKit).
|
|
183
|
+
*/
|
|
184
|
+
async function autoConfigureLakebase(
|
|
185
|
+
provision: boolean,
|
|
186
|
+
signal: AbortSignal,
|
|
187
|
+
): Promise<LakebaseConnection> {
|
|
188
|
+
logger.debug("autoConfigureLakebase: applyLakebaseEnv");
|
|
189
|
+
const { resolved, user } = await applyLakebaseEnv(undefined, signal);
|
|
190
|
+
logger.debug("autoConfigureLakebase: env applied", {
|
|
191
|
+
...redactLakebaseConnection(resolved),
|
|
192
|
+
user,
|
|
193
|
+
env: {
|
|
194
|
+
LAKEBASE_ENDPOINT: process.env.LAKEBASE_ENDPOINT,
|
|
195
|
+
PGHOST: process.env.PGHOST,
|
|
196
|
+
PGPORT: process.env.PGPORT,
|
|
197
|
+
PGDATABASE: process.env.PGDATABASE,
|
|
198
|
+
PGUSER: process.env.PGUSER,
|
|
199
|
+
PGSSLMODE: process.env.PGSSLMODE,
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
logger.info("env updated", { ...redactLakebaseConnection(resolved), user });
|
|
203
|
+
if (provision) {
|
|
204
|
+
logger.debug("autoConfigureLakebase: provisionCacheSchema", { user });
|
|
205
|
+
await provisionCacheSchema(user, logger);
|
|
206
|
+
logger.debug("autoConfigureLakebase: provisionCacheSchema done");
|
|
207
|
+
} else {
|
|
208
|
+
logger.debug("autoConfigureLakebase: skip provision (mode=env)");
|
|
209
|
+
}
|
|
210
|
+
return resolved;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function redactLakebaseConnection(resolved: LakebaseConnection): Record<string, unknown> {
|
|
214
|
+
return {
|
|
215
|
+
project: resolved.project,
|
|
216
|
+
branch: resolved.branch,
|
|
217
|
+
endpoint: resolved.endpoint,
|
|
218
|
+
database: resolved.database,
|
|
219
|
+
host: resolved.host,
|
|
220
|
+
port: resolved.port,
|
|
221
|
+
sslMode: resolved.sslMode,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** Build the {@link ResolvedAppEnv} interceptors read, from the auto-config result. */
|
|
226
|
+
function resolvedAppEnv(lakebase: LakebaseConnection | undefined): ResolvedAppEnv {
|
|
227
|
+
return {
|
|
228
|
+
...(lakebase ? { lakebase } : {}),
|
|
229
|
+
...(process.env.DATABRICKS_HOST ? { databricksHost: process.env.DATABRICKS_HOST } : {}),
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/** Normalize the `interceptor?: Interceptor | Interceptor[]` option to an array. */
|
|
234
|
+
function interceptorList(interceptor: CreateAppConfig["interceptor"]): Interceptor[] {
|
|
235
|
+
if (!interceptor) return [];
|
|
236
|
+
return Array.isArray(interceptor) ? interceptor : [interceptor];
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Auto-configuring drop-in for AppKit's `createApp`: same config, same typed
|
|
241
|
+
* plugin-export map, with {@link autoConfigure} run first.
|
|
242
|
+
*
|
|
243
|
+
* When {@link CreateAppConfig.interceptor}s are given, each is invoked with an
|
|
244
|
+
* {@link InterceptorContext} AFTER auto-configuration computes the env and BEFORE
|
|
245
|
+
* AppKit boots - so an interceptor can read the resolved connection, register
|
|
246
|
+
* lifecycle handlers, and `bindProcess` a child. A hidden {@link lifecycleBridge}
|
|
247
|
+
* plugin is injected so those `onLifecycle` handlers fire on the genuine AppKit
|
|
248
|
+
* events; it has no exports, so the returned {@link PluginMap} is unchanged.
|
|
249
|
+
*
|
|
250
|
+
* @example
|
|
251
|
+
* import { lakebase, server } from "@databricks/appkit";
|
|
252
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
253
|
+
*
|
|
254
|
+
* const app = await appkit.createApp({ plugins: [server(), lakebase()] });
|
|
255
|
+
*/
|
|
256
|
+
export async function createApp<T extends AppKitPlugins>(
|
|
257
|
+
config?: CreateAppConfig<T>,
|
|
258
|
+
): Promise<PluginMap<T>> {
|
|
259
|
+
const plugins = pluginNames(config);
|
|
260
|
+
const interceptors = interceptorList(config?.interceptor);
|
|
261
|
+
logger.debug("createApp: start", {
|
|
262
|
+
plugins,
|
|
263
|
+
pluginCount: plugins.length,
|
|
264
|
+
interceptorCount: interceptors.length,
|
|
265
|
+
autoConfigure: config?.autoConfigure ?? "(default)",
|
|
266
|
+
hasOnPluginsReady: typeof config?.onPluginsReady === "function",
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
logger.debug("createApp: autoConfigure");
|
|
270
|
+
const lakebase = await autoConfigure(config);
|
|
271
|
+
logger.debug("createApp: autoConfigure returned", {
|
|
272
|
+
lakebase: lakebase ? redactLakebaseConnection(lakebase) : undefined,
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
const appConfig = { ...config };
|
|
276
|
+
delete appConfig.autoConfigure;
|
|
277
|
+
delete appConfig.interceptor;
|
|
278
|
+
|
|
279
|
+
if (interceptors.length === 0) {
|
|
280
|
+
logger.debug("createApp: no interceptors; delegating to AppKit createApp", {
|
|
281
|
+
plugins: pluginNames(appConfig),
|
|
282
|
+
});
|
|
283
|
+
const result = await appkitCreateApp<T>(appConfig);
|
|
284
|
+
logger.debug("createApp: AppKit createApp returned", {
|
|
285
|
+
exportKeys: Object.keys(result ?? {}),
|
|
286
|
+
});
|
|
287
|
+
return result;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Build the context from the computed env, run each interceptor (they register
|
|
291
|
+
// lifecycle handlers + bind processes), then inject the bridge that relays the
|
|
292
|
+
// REAL AppKit lifecycle into `runtime.emitLifecycle` during its `setup()`.
|
|
293
|
+
const env = resolvedAppEnv(lakebase);
|
|
294
|
+
logger.debug("createApp: interceptor context", {
|
|
295
|
+
hasLakebase: Boolean(env.lakebase),
|
|
296
|
+
databricksHost: env.databricksHost,
|
|
297
|
+
interceptorCount: interceptors.length,
|
|
298
|
+
});
|
|
299
|
+
const runtime: InterceptorRuntime = createInterceptorContext(env);
|
|
300
|
+
for (let i = 0; i < interceptors.length; i++) {
|
|
301
|
+
logger.debug("createApp: run interceptor", { index: i, of: interceptors.length });
|
|
302
|
+
await interceptors[i]!(runtime.context);
|
|
303
|
+
logger.debug("createApp: interceptor done", { index: i });
|
|
304
|
+
}
|
|
305
|
+
// Append the bridge to the plugins tuple. It is hidden and exports nothing, so
|
|
306
|
+
// the returned map still matches `PluginMap<T>`; the cast (through `unknown`) is
|
|
307
|
+
// only because appending widens the tuple type beyond `T`.
|
|
308
|
+
appConfig.plugins = [...(appConfig.plugins ?? []), lifecycleBridge({ runtime })] as unknown as T;
|
|
309
|
+
logger.debug("createApp: lifecycle bridge injected; delegating to AppKit createApp", {
|
|
310
|
+
plugins: pluginNames(appConfig),
|
|
311
|
+
});
|
|
312
|
+
const result = await appkitCreateApp<T>(appConfig);
|
|
313
|
+
logger.debug("createApp: AppKit createApp returned", {
|
|
314
|
+
exportKeys: Object.keys(result ?? {}),
|
|
315
|
+
});
|
|
316
|
+
return result;
|
|
317
|
+
}
|
|
318
|
+
|
|
19
319
|
/**
|
|
20
320
|
* The AppKit per-request execution context returned by `getExecutionContext()`
|
|
21
321
|
* - the OBO-scoped workspace client plus the surrounding request metadata.
|
|
@@ -69,8 +369,11 @@ export function tryGetExecutionContext(): ExecutionContextLike | undefined {
|
|
|
69
369
|
* const client = appkit.tryGetExecutionContext()?.client;
|
|
70
370
|
*/
|
|
71
371
|
export async function ensureInitialized(): Promise<void> {
|
|
72
|
-
if (
|
|
73
|
-
logger.debug("
|
|
74
|
-
|
|
372
|
+
if (tryGetExecutionContext()) {
|
|
373
|
+
logger.debug("ensureInitialized: already initialized");
|
|
374
|
+
return;
|
|
75
375
|
}
|
|
376
|
+
logger.debug("ensureInitialized: booting bare AppKit app");
|
|
377
|
+
await createApp({ plugins: [], autoConfigure: false });
|
|
378
|
+
logger.debug("ensureInitialized: done");
|
|
76
379
|
}
|
package/src/interceptor.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
|
*/
|
|
@@ -49,7 +49,7 @@ export type LifecycleHandler = () => void | Promise<void>;
|
|
|
49
49
|
* they read COMPUTED values instead of re-reading `process.env` themselves.
|
|
50
50
|
*
|
|
51
51
|
* `lakebase` is the resolved Postgres connection when Lakebase auto-config ran
|
|
52
|
-
* (see `
|
|
52
|
+
* (see `appkit.autoConfigure`), else `undefined`. `databricksHost` is the
|
|
53
53
|
* workspace host as resolved into the environment (`DATABRICKS_HOST`), which the
|
|
54
54
|
* tunnel interceptor both reads and, when it must, sets.
|
|
55
55
|
*/
|
|
@@ -72,9 +72,9 @@ export type BindableProcess = Pick<ChildProcess, "pid" | "kill" | "killed" | "on
|
|
|
72
72
|
* The handle passed to each interceptor.
|
|
73
73
|
*
|
|
74
74
|
* @example
|
|
75
|
-
* import {
|
|
75
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
76
76
|
*
|
|
77
|
-
* await createApp({
|
|
77
|
+
* await appkit.createApp({
|
|
78
78
|
* plugins: [server()],
|
|
79
79
|
* interceptor: (ctx) => {
|
|
80
80
|
* const portr = spawnPortr(ctx.env.databricksHost);
|
|
@@ -120,7 +120,7 @@ const TEARDOWN_SIGNALS = ["SIGINT", "SIGTERM", "SIGHUP"] as const;
|
|
|
120
120
|
/**
|
|
121
121
|
* The mutable machinery behind an {@link InterceptorContext}. Split out so
|
|
122
122
|
* {@link createInterceptorContext} can hand the public context to interceptors
|
|
123
|
-
* while `
|
|
123
|
+
* while `appkit.createApp` retains the `emitLifecycle` side-channel the bridge drives.
|
|
124
124
|
*/
|
|
125
125
|
export interface InterceptorRuntime {
|
|
126
126
|
/** The context handed to each interceptor. */
|
|
@@ -227,7 +227,7 @@ function hasOnLifecycle(context: unknown): context is LifecycleContextLike {
|
|
|
227
227
|
}
|
|
228
228
|
|
|
229
229
|
/**
|
|
230
|
-
* The internal plugin
|
|
230
|
+
* The internal plugin `appkit.createApp` injects to make AppKit's lifecycle
|
|
231
231
|
* reachable from interceptor code. On `setup()` it reads its own `this.context`
|
|
232
232
|
* (the real `PluginContext`) and forwards each {@link LifecycleEvent} to the
|
|
233
233
|
* interceptor runtime, so `ctx.onLifecycle(...)` handlers fire on the genuine
|
package/lib/src/create-app.d.ts
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `createApp` wrapper: runs dbx-tools auto-configuration, then delegates to
|
|
3
|
-
* AppKit's own `createApp` with the exact same arguments.
|
|
4
|
-
*
|
|
5
|
-
* Drop it in as a one-for-one replacement for `@databricks/appkit`'s
|
|
6
|
-
* `createApp` - same parameters, same return type, full plugin-export inference
|
|
7
|
-
* preserved:
|
|
8
|
-
*
|
|
9
|
-
* ```ts
|
|
10
|
-
* import { createApp } from "@dbx-tools/appkit";
|
|
11
|
-
* import { lakebase, server } from "@databricks/appkit";
|
|
12
|
-
*
|
|
13
|
-
* await createApp.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.
|
|
20
|
-
*
|
|
21
|
-
* @module
|
|
22
|
-
*/
|
|
23
|
-
import { createApp as appkitCreateApp } from "@databricks/appkit";
|
|
24
|
-
import type { PluginMap } from "@databricks/appkit/dist/shared/src/plugin";
|
|
25
|
-
import { type Interceptor } from "./interceptor.ts";
|
|
26
|
-
import { type LakebaseConnection } from "./lakebase-resolver.ts";
|
|
27
|
-
type AppKitCreateAppConfig = NonNullable<Parameters<typeof appkitCreateApp>[0]>;
|
|
28
|
-
type AppKitPlugins = NonNullable<AppKitCreateAppConfig["plugins"]>;
|
|
29
|
-
/**
|
|
30
|
-
* What auto-configuration does before AppKit boots.
|
|
31
|
-
*
|
|
32
|
-
* - `"provision"`: resolve the Lakebase connection into `process.env`, then
|
|
33
|
-
* grant the AppKit cache schema to the connecting role.
|
|
34
|
-
* - `"env"`: resolve the Lakebase connection into `process.env` only.
|
|
35
|
-
*
|
|
36
|
-
* Omit it to get `"provision"` gated on a `lakebase` plugin being registered;
|
|
37
|
-
* set it explicitly to run regardless of the plugin list, or pass `false` to
|
|
38
|
-
* skip auto-configuration entirely.
|
|
39
|
-
*
|
|
40
|
-
* Set it EXPLICITLY on an app that has no `lakebase()` plugin but still wants
|
|
41
|
-
* AppKit's PERSISTENT cache. AppKit picks Lakebase for `CacheManager` only when
|
|
42
|
-
* `createLakebasePool()` can build a pool, and that reads `LAKEBASE_ENDPOINT` /
|
|
43
|
-
* `PGHOST` / `PGDATABASE` straight from `process.env` - so without this step the
|
|
44
|
-
* cache silently falls back to in-memory, and anything it holds (a session
|
|
45
|
-
* signing key, a one-time code) is lost on restart. `"env"` is the right mode
|
|
46
|
-
* there: the app SP cannot grant on the cache schema anyway.
|
|
47
|
-
*/
|
|
48
|
-
export type AutoConfigureMode = "env" | "provision";
|
|
49
|
-
/** AppKit's `createApp` config plus the dbx-tools auto-configuration switch. */
|
|
50
|
-
export type CreateAppConfig<T extends AppKitPlugins = AppKitPlugins> = Omit<AppKitCreateAppConfig, "plugins" | "onPluginsReady"> & {
|
|
51
|
-
plugins?: T;
|
|
52
|
-
onPluginsReady?: (appkit: PluginMap<T>) => void | Promise<void>;
|
|
53
|
-
/** Auto-configuration to run before AppKit boots. Defaults to `"provision"`. */
|
|
54
|
-
autoConfigure?: AutoConfigureMode | false;
|
|
55
|
-
/**
|
|
56
|
-
* One or many {@link Interceptor}s handed an {@link InterceptorContext} once
|
|
57
|
-
* auto-configuration has computed the env. Each receives the resolved env, an
|
|
58
|
-
* AppKit-lifecycle hook, and `bindProcess` for concurrently-style supervision -
|
|
59
|
-
* see `./interceptor`. The tunnel is the primary consumer.
|
|
60
|
-
*/
|
|
61
|
-
interceptor?: Interceptor | Interceptor[];
|
|
62
|
-
};
|
|
63
|
-
/**
|
|
64
|
-
* Run enabled auto-configuration steps without calling AppKit's `createApp`.
|
|
65
|
-
*
|
|
66
|
-
* Lakebase Postgres resolves when {@link CreateAppConfig.autoConfigure} is set
|
|
67
|
-
* explicitly or a `lakebase` plugin is listed in `config.plugins`. `signal`
|
|
68
|
-
* cancels the resolution; it is combined with an internal boot timeout either
|
|
69
|
-
* way.
|
|
70
|
-
*
|
|
71
|
-
* @example
|
|
72
|
-
* import { createApp } from "@dbx-tools/appkit";
|
|
73
|
-
*
|
|
74
|
-
* // Populate PGHOST / PGDATABASE / LAKEBASE_ENDPOINT without booting AppKit.
|
|
75
|
-
* await createApp.autoConfigure({ autoConfigure: "env" });
|
|
76
|
-
*/
|
|
77
|
-
export declare function autoConfigure<T extends AppKitPlugins>(config?: CreateAppConfig<T>, signal?: AbortSignal): Promise<LakebaseConnection | undefined>;
|
|
78
|
-
/**
|
|
79
|
-
* Auto-configuring drop-in for AppKit's `createApp`: same config, same typed
|
|
80
|
-
* plugin-export map, with {@link autoConfigure} run first.
|
|
81
|
-
*
|
|
82
|
-
* When {@link CreateAppConfig.interceptor}s are given, each is invoked with an
|
|
83
|
-
* {@link InterceptorContext} AFTER auto-configuration computes the env and BEFORE
|
|
84
|
-
* AppKit boots - so an interceptor can read the resolved connection, register
|
|
85
|
-
* lifecycle handlers, and `bindProcess` a child. A hidden {@link lifecycleBridge}
|
|
86
|
-
* plugin is injected so those `onLifecycle` handlers fire on the genuine AppKit
|
|
87
|
-
* events; it has no exports, so the returned {@link PluginMap} is unchanged.
|
|
88
|
-
*
|
|
89
|
-
* @example
|
|
90
|
-
* import { createApp } from "@dbx-tools/appkit";
|
|
91
|
-
* import { lakebase, server } from "@databricks/appkit";
|
|
92
|
-
*
|
|
93
|
-
* const app = await createApp.createApp({ plugins: [server(), lakebase()] });
|
|
94
|
-
*/
|
|
95
|
-
export declare function createApp<T extends AppKitPlugins>(config?: CreateAppConfig<T>): Promise<PluginMap<T>>;
|
|
96
|
-
export {};
|