@rudderstack/integrations-lib 0.2.42 → 0.2.44
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/build/cluster/manager.d.ts.map +1 -1
- package/build/cluster/manager.js +7 -4
- package/build/feature-flags/core/config.d.ts +14 -0
- package/build/feature-flags/core/config.d.ts.map +1 -0
- package/build/feature-flags/core/config.js +111 -0
- package/build/feature-flags/core/index.d.ts +4 -0
- package/build/feature-flags/core/index.d.ts.map +1 -0
- package/build/feature-flags/core/index.js +10 -0
- package/build/feature-flags/core/service.d.ts +19 -0
- package/build/feature-flags/core/service.d.ts.map +1 -0
- package/build/feature-flags/core/service.js +106 -0
- package/build/feature-flags/core/utils.d.ts +8 -0
- package/build/feature-flags/core/utils.d.ts.map +1 -0
- package/build/feature-flags/core/utils.js +40 -0
- package/build/feature-flags/flags/defaults.d.ts +3 -0
- package/build/feature-flags/flags/defaults.d.ts.map +1 -0
- package/build/feature-flags/flags/defaults.js +24 -0
- package/build/feature-flags/flags/index.d.ts +5 -0
- package/build/feature-flags/flags/index.d.ts.map +1 -0
- package/build/feature-flags/flags/index.js +10 -0
- package/build/feature-flags/flags/interfaces.d.ts +12 -0
- package/build/feature-flags/flags/interfaces.d.ts.map +1 -0
- package/build/feature-flags/flags/interfaces.js +3 -0
- package/build/feature-flags/flags/loader.d.ts +14 -0
- package/build/feature-flags/flags/loader.d.ts.map +1 -0
- package/build/feature-flags/flags/loader.js +37 -0
- package/build/feature-flags/flags/registry.d.ts +12 -0
- package/build/feature-flags/flags/registry.d.ts.map +1 -0
- package/build/feature-flags/flags/registry.js +38 -0
- package/build/feature-flags/index.d.ts +9 -0
- package/build/feature-flags/index.d.ts.map +1 -0
- package/build/feature-flags/index.js +19 -0
- package/build/feature-flags/providers/factory.d.ts +7 -0
- package/build/feature-flags/providers/factory.d.ts.map +1 -0
- package/build/feature-flags/providers/factory.js +25 -0
- package/build/feature-flags/providers/flagsmith/index.d.ts +2 -0
- package/build/feature-flags/providers/flagsmith/index.d.ts.map +1 -0
- package/build/feature-flags/providers/flagsmith/index.js +6 -0
- package/build/feature-flags/providers/flagsmith/provider.d.ts +13 -0
- package/build/feature-flags/providers/flagsmith/provider.d.ts.map +1 -0
- package/build/feature-flags/providers/flagsmith/provider.js +73 -0
- package/build/feature-flags/providers/flagsmith/types.d.ts +1 -0
- package/build/feature-flags/providers/flagsmith/types.d.ts.map +1 -0
- package/build/feature-flags/providers/flagsmith/types.js +4 -0
- package/build/feature-flags/providers/index.d.ts +5 -0
- package/build/feature-flags/providers/index.d.ts.map +1 -0
- package/build/feature-flags/providers/index.js +10 -0
- package/build/feature-flags/providers/interfaces.d.ts +11 -0
- package/build/feature-flags/providers/interfaces.d.ts.map +1 -0
- package/build/feature-flags/providers/interfaces.js +3 -0
- package/build/feature-flags/providers/local/config.d.ts +4 -0
- package/build/feature-flags/providers/local/config.d.ts.map +1 -0
- package/build/feature-flags/providers/local/config.js +11 -0
- package/build/feature-flags/providers/local/index.d.ts +3 -0
- package/build/feature-flags/providers/local/index.d.ts.map +1 -0
- package/build/feature-flags/providers/local/index.js +6 -0
- package/build/feature-flags/providers/local/provider.d.ts +17 -0
- package/build/feature-flags/providers/local/provider.d.ts.map +1 -0
- package/build/feature-flags/providers/local/provider.js +105 -0
- package/build/feature-flags/providers/local/types.d.ts +4 -0
- package/build/feature-flags/providers/local/types.d.ts.map +1 -0
- package/build/feature-flags/providers/local/types.js +3 -0
- package/build/feature-flags/types.d.ts +96 -0
- package/build/feature-flags/types.d.ts.map +1 -0
- package/build/feature-flags/types.js +11 -0
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/cluster/manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EAMrB,MAAM,SAAS,CAAC;AAGjB;;;;;;;;;GASG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAE1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAE1D,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,eAAe,CAA8B;IAErD,OAAO,CAAC,mBAAmB,CAA+B;IAE1D,OAAO,CAAC,cAAc,CAAyC;gBAEnD,OAAO,GAAE,qBAA0B;IAM/C;;;;OAIG;IACH,OAAO,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/cluster/manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EAMrB,MAAM,SAAS,CAAC;AAGjB;;;;;;;;;GASG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAE1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAE1D,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,eAAe,CAA8B;IAErD,OAAO,CAAC,mBAAmB,CAA+B;IAE1D,OAAO,CAAC,cAAc,CAAyC;gBAEnD,OAAO,GAAE,qBAA0B;IAM/C;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAUlB;;;;OAIG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IASnC;;OAEG;IACI,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB/C;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;OAEG;YACW,YAAY;IAqB1B;;OAEG;YACW,WAAW;IAUzB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAWjC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAkBlC;;OAEG;IACH,OAAO,CAAC,WAAW;IAuBnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAM7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAsBlC;;OAEG;YACW,eAAe;IA2B7B;;OAEG;YACW,kBAAkB;IAwChC;;OAEG;YACW,uBAAuB;IAOrC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;YACW,cAAc;IAwB5B;;OAEG;IACI,cAAc,IAAI,MAAM;IAI/B;;OAEG;IACI,aAAa,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAQhF;;OAEG;IACI,SAAS,IAAI,OAAO;IAI3B;;OAEG;IACI,UAAU,IAAI,OAAO;CAG7B;AAGD,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC5F,IAAI,CAAC,CAAC,SAAS,MAAM,oBAAoB,EACvC,KAAK,EAAE,CAAC,EACR,GAAG,IAAI,EAAE,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,GAC3C,OAAO,CAAC;CACZ"}
|
package/build/cluster/manager.js
CHANGED
|
@@ -65,9 +65,12 @@ class ClusterManager extends events_1.EventEmitter {
|
|
|
65
65
|
* @see {@link https://nodejs.org/docs/latest/api/cluster.html#clustersetupprimaryoptions Node.js cluster.setupPrimary()}
|
|
66
66
|
*/
|
|
67
67
|
initialize() {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
// Only call setupPrimary in the primary process
|
|
69
|
+
if (this.options.cluster.isPrimary) {
|
|
70
|
+
this.options.cluster.setupPrimary({
|
|
71
|
+
serialization: this.options.serialization,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
71
74
|
this.setupSignalHandlers();
|
|
72
75
|
}
|
|
73
76
|
/**
|
|
@@ -469,4 +472,4 @@ class ClusterManager extends events_1.EventEmitter {
|
|
|
469
472
|
}
|
|
470
473
|
}
|
|
471
474
|
exports.ClusterManager = ClusterManager;
|
|
472
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbHVzdGVyL21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsbUNBQXNDO0FBQ3RDLGtEQUFvQztBQVVwQyxtQ0FBaUY7QUFFakY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSxjQUFlLFNBQVEscUJBQVk7SUFlOUMsWUFBWSxVQUFpQyxFQUFFO1FBQzdDLEtBQUssRUFBRSxDQUFDO1FBYk8sWUFBTyxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBRWxELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFaEIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFdkIsb0JBQWUsR0FBeUIsSUFBSSxDQUFDO1FBRTdDLHdCQUFtQixHQUEwQixJQUFJLENBQUM7UUFFbEQsbUJBQWMsR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztRQUk3RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsaUNBQXlCLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssVUFBVTtRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7WUFDaEMsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYTtTQUMxQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDNUIsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksQ0FBQyxXQUFX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b250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5pbXBvcnQgeyBXb3JrZXIgfSBmcm9tICdjbHVzdGVyJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7XG4gIENsdXN0ZXJNYW5hZ2VyT3B0aW9ucyxcbiAgQ2x1c3Rlck1hbmFnZXJFdmVudHMsXG4gIFdvcmtlclN0YXRlLFxuICBJUENNZXNzYWdlLFxuICBQaW5nTWVzc2FnZSxcbiAgUG9uZ01lc3NhZ2UsXG4gIFNodXRkb3duTWVzc2FnZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBkZWxheSwgdGltZW91dCwgc2FmZUV4ZWN1dGUsIHZhbGlkYXRlQW5kRGVmYXVsdE9wdGlvbnMgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDbHVzdGVyTWFuYWdlciAtIEEgY2x1c3RlciBsaWZlY3ljbGUgbWFuYWdlbWVudCBzeXN0ZW1cbiAqXG4gKiBUaGUgbWFuYWdlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOlxuICogLSBHcmFjZWZ1bCBzaHV0ZG93biB3aXRoIGNvbmZpZ3VyYWJsZSB0aW1lb3V0XG4gKiAtIFdvcmtlciBoZWFsdGggbW9uaXRvcmluZyB3aXRoIHBpbmcvcG9uZyBtZWNoYW5pc21cbiAqIC0gQXV0b21hdGljIHdvcmtlciByZXN0YXJ0IHdpdGggY29uZmlndXJhYmxlIGxpbWl0c1xuICogLSBTaWduYWwgaGFuZGxpbmcgZm9yIHNodXRkb3duIHRyaWdnZXJzXG4gKiAtIEZsZXhpYmxlIHByaW1hcnkgYW5kIHdvcmtlciBmdW5jdGlvbiBoYW5kbGVyc1xuICovXG5leHBvcnQgY2xhc3MgQ2x1c3Rlck1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPENsdXN0ZXJNYW5hZ2VyT3B0aW9ucz47XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3b3JrZXJzID0gbmV3IE1hcDxudW1iZXIsIFdvcmtlclN0YXRlPigpO1xuXG4gIHByaXZhdGUgc3RhcnRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgaXNTaHV0dGluZ0Rvd24gPSBmYWxzZTtcblxuICBwcml2YXRlIHNodXRkb3duUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgaGVhbHRoQ2hlY2tJbnRlcnZhbDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDbHVzdGVyTWFuYWdlck9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5vcHRpb25zID0gdmFsaWRhdGVBbmREZWZhdWx0T3B0aW9ucyhvcHRpb25zKTtcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjbHVzdGVyIG1hbmFnZXIgd2l0aCBwcmltYXJ5IHByb2Nlc3MgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL25vZGVqcy5vcmcvZG9jcy9sYXRlc3QvYXBpL2NsdXN0ZXIuaHRtbCNjbHVzdGVyc2V0dXBwcmltYXJ5b3B0aW9ucyBOb2RlLmpzIGNsdXN0ZXIuc2V0dXBQcmltYXJ5KCl9XG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zLmNsdXN0ZXIuc2V0dXBQcmltYXJ5KHtcbiAgICAgIHNlcmlhbGl6YXRpb246IHRoaXMub3B0aW9ucy5zZXJpYWxpemF0aW9uLFxuICAgIH0pO1xuICAgIHRoaXMuc2V0dXBTaWduYWxIYW5kbGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgY2x1c3RlciBtYW5hZ2VyXG4gICAqIEluIHByaW1hcnkgcHJvY2Vzczogc3RhcnRzIHdvcmtlcnMgYW5kIGhlYWx0aCBtb25pdG9yaW5nXG4gICAqIEluIHdvcmtlciBwcm9jZXNzOiBleGVjdXRlcyB3b3JrZXIgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNsdXN0ZXIuaXNQcmltYXJ5KSB7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0UHJpbWFyeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V29ya2VyKCk7XG4gICAgfVxuICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIGdyYWNlZnVsIHNodXRkb3duIG9mIHRoZSBjbHVzdGVyXG4gICAqL1xuICBwdWJsaWMgc2h1dGRvd24oc2lnbmFsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaHV0ZG93blByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnNodXRkb3duUHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLmlzU2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICB0aGlzLmVtaXQoJ3NodXRkb3duOnN0YXJ0ZWQnLCBzaWduYWwpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jbHVzdGVyLmlzUHJpbWFyeSkge1xuICAgICAgdGhpcy5zaHV0ZG93blByb21pc2UgPSB0aGlzLnNodXRkb3duUHJpbWFyeShzaWduYWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNodXRkb3duUHJvbWlzZSA9IHRoaXMuc2h1dGRvd25Xb3JrZXIoc2lnbmFsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaHV0ZG93blByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBzaWduYWwgaGFuZGxlcnMgZm9yIGdyYWNlZnVsIHNodXRkb3duXG4gICAqL1xuICBwcml2YXRlIHNldHVwU2lnbmFsSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zLnNodXRkb3duU2lnbmFscy5mb3JFYWNoKChzaWduYWwpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2h1dGRvd24oc2lnbmFsKTtcbiAgICAgIH07XG4gICAgICB0aGlzLnNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZXIpO1xuICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgc2lnbmFsIGhhbmRsZXJzXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZVNpZ25hbEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIEFycmF5LmZyb20odGhpcy5zaWduYWxIYW5kbGVycy5lbnRyaWVzKCkpLmZvckVhY2goKFtzaWduYWwsIGhhbmRsZXJdKSA9PiB7XG4gICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKHNpZ25hbCwgaGFuZGxlcik7XG4gICAgfSk7XG4gICAgdGhpcy5zaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcHJpbWFyeSBwcm9jZXNzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN0YXJ0UHJpbWFyeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBQcmltYXJ5IHByb2Nlc3MgKHBpZDogJHtwcm9jZXNzLnBpZH0pIHN0YXJ0aW5nIHdpdGggJHt0aGlzLm9wdGlvbnMubnVtV29ya2Vyc30gd29ya2Vyc2AsXG4gICAgKTtcblxuICAgIC8vIEV4ZWN1dGUgcHJpbWFyeSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiwgYW55IGVycm9yIHdpbGwgc3RvcCB0aGUgY2x1c3RlciBmcm9tIHN0YXJ0aW5nXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLnByaW1hcnlGbigpO1xuXG4gICAgLy8gU2V0IHVwIGNsdXN0ZXIgZXZlbnQgaGFuZGxlcnNcbiAgICB0aGlzLnNldHVwQ2x1c3RlckV2ZW50SGFuZGxlcnMoKTtcblxuICAgIC8vIFNwYXduIGluaXRpYWwgd29ya2Vyc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLm51bVdvcmtlcnM7IGkgKz0gMSkge1xuICAgICAgY29uc3Qgd29ya2VySWQgPSBpICsgMTsgLy8gV29ya2VyIElEcyBzdGFydCBmcm9tIDFcbiAgICAgIHRoaXMuc3Bhd25Xb3JrZXIod29ya2VySWQpO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IGhlYWx0aCBtb25pdG9yaW5nXG4gICAgdGhpcy5zdGFydEhlYWx0aE1vbml0b3JpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSB3b3JrZXIgcHJvY2Vzc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFdvcmtlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuaW5mbyhgV29ya2VyICR7dGhpcy5nZXRDdXJyZW50V29ya2VySWQoKX0gKHBpZDogJHtwcm9jZXNzLnBpZH0pIHN0YXJ0aW5nYCk7XG5cbiAgICAvLyBTZXQgdXAgSVBDIG1lc3NhZ2UgaGFuZGxlcnNcbiAgICB0aGlzLnNldHVwV29ya2VyTWVzc2FnZUhhbmRsZXJzKCk7XG5cbiAgICAvLyBFeGVjdXRlIHdvcmtlciBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiwgYW55IGVycm9yIHdpbGwgYmUgcHJvcGFnYXRlZFxuICAgIGF3YWl0IHRoaXMub3B0aW9ucy53b3JrZXJGbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgY2x1c3RlciBldmVudCBoYW5kbGVycyBmb3IgdGhlIHByaW1hcnkgcHJvY2Vzc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cENsdXN0ZXJFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucy5jbHVzdGVyLm9uKCdleGl0JywgKHdvcmtlcjogV29ya2VyLCBjb2RlOiBudW1iZXIsIHNpZ25hbDogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZVdvcmtlckV4aXQod29ya2VyLCBjb2RlLCBzaWduYWwpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vcHRpb25zLmNsdXN0ZXIub24oJ29ubGluZScsICh3b3JrZXI6IFdvcmtlcikgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYFdvcmtlciAke3RoaXMuZ2V0V29ya2VySWQod29ya2VyKX0gKHBpZDogJHt3b3JrZXIucHJvY2Vzcy5waWR9KSBpcyBvbmxpbmVgKTtcbiAgICAgIHRoaXMuZW1pdCgnd29ya2VyOnN0YXJ0ZWQnLCB3b3JrZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgSVBDIG1lc3NhZ2UgaGFuZGxlcnMgZm9yIHdvcmtlciBwcm9jZXNzZXNcbiAgICovXG4gIHByaXZhdGUgc2V0dXBXb3JrZXJNZXNzYWdlSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgcHJvY2Vzcy5vbignbWVzc2FnZScsIChtZXNzYWdlOiBJUENNZXNzYWdlKSA9PiB7XG4gICAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgICBjYXNlICdwaW5nJzpcbiAgICAgICAgICB0aGlzLmhhbmRsZVdvcmtlclBpbmcobWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NodXRkb3duJzpcbiAgICAgICAgICB0aGlzLnNodXRkb3duKG1lc3NhZ2Uuc2lnbmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoIW1lc3NhZ2UudHlwZS5pbmNsdWRlcygnTWV0cmljcycpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgaWdub3JpbmcgdW5rbm93biBtZXNzYWdlIHR5cGUgaW4gd29ya2VyICR7cHJvY2Vzcy5waWR9OiAke21lc3NhZ2UudHlwZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHdvcmtlciBhbmQgc2V0cyB1cCBpdHMgc3RhdGVcbiAgICovXG4gIHByaXZhdGUgc3Bhd25Xb3JrZXIoaWQ6IG51bWJlcik6IFdvcmtlciB7XG4gICAgY29uc3Qgd29ya2VyID0gdGhpcy5vcHRpb25zLmNsdXN0ZXIuZm9yayh7XG4gICAgICBXT1JLRVJfSUQ6IGlkLFxuICAgIH0pO1xuICAgIGNvbnN0IHdvcmtlclN0YXRlOiBXb3JrZXJTdGF0ZSA9IHtcbiAgICAgIGlkLFxuICAgICAgd29ya2VyLFxuICAgICAgcmVzdGFydENvdW50OiAwLFxuICAgICAgbGFzdFBpbmc6IERhdGUubm93KCksXG4gICAgICBwZW5kaW5nUGluZzogZmFsc2UsXG4gICAgICBpc1NodXR0aW5nRG93bjogZmFsc2UsXG4gICAgfTtcblxuICAgIHRoaXMud29ya2Vycy5zZXQod29ya2VyLmlkLCB3b3JrZXJTdGF0ZSk7XG5cbiAgICAvLyBTZXQgdXAgd29ya2VyIG1lc3NhZ2UgaGFuZGxlclxuICAgIHdvcmtlci5vbignbWVzc2FnZScsIChtZXNzYWdlOiBJUENNZXNzYWdlKSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZVdvcmtlck1lc3NhZ2Uod29ya2VyLCBtZXNzYWdlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB3b3JrZXI7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBtZXNzYWdlcyBmcm9tIHdvcmtlcnNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlV29ya2VyTWVzc2FnZSh3b3JrZXI6IFdvcmtlciwgbWVzc2FnZTogSVBDTWVzc2FnZSk6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlclN0YXRlID0gdGhpcy53b3JrZXJzLmdldCh3b3JrZXIuaWQpO1xuICAgIGlmICghd29ya2VyU3RhdGUpIHJldHVybjtcblxuICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICBjYXNlICdwb25nJzpcbiAgICAgICAgd29ya2VyU3RhdGUubGFzdFBpbmcgPSBEYXRlLm5vdygpO1xuICAgICAgICB3b3JrZXJTdGF0ZS5wZW5kaW5nUGluZyA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICghbWVzc2FnZS50eXBlLmluY2x1ZGVzKCdNZXRyaWNzJykpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgIGBSZWNlaXZlZCB1bmtub3duIG1lc3NhZ2UgdHlwZSBmcm9tIHdvcmtlciAke3RoaXMuZ2V0V29ya2VySWQod29ya2VyKX0gKHBpZDogJHtcbiAgICAgICAgICAgICAgd29ya2VyLnByb2Nlc3MucGlkXG4gICAgICAgICAgICB9KTogJHttZXNzYWdlLnR5cGV9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHBpbmcgbWVzc2FnZXMgaW4gd29ya2VyIHByb2Nlc3Nlc1xuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVXb3JrZXJQaW5nKG1lc3NhZ2U6IFBpbmdNZXNzYWdlKTogdm9pZCB7XG4gICAgY29uc3QgcG9uZ01lc3NhZ2U6IFBvbmdNZXNzYWdlID0ge1xuICAgICAgdHlwZTogJ3BvbmcnLFxuICAgICAgdGltZXN0YW1wOiBtZXNzYWdlLnRpbWVzdGFtcCxcbiAgICB9O1xuXG4gICAgaWYgKHByb2Nlc3Muc2VuZCkge1xuICAgICAgcHJvY2Vzcy5zZW5kKHBvbmdNZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGhlYWx0aCBtb25pdG9yaW5nIGZvciBhbGwgd29ya2Vyc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGFydEhlYWx0aE1vbml0b3JpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5oZWFsdGhDaGVja0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5wZXJmb3JtSGVhbHRoQ2hlY2soKTtcbiAgICB9LCB0aGlzLm9wdGlvbnMucGluZ0ZyZXF1ZW5jeSk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgaGVhbHRoIG1vbml0b3JpbmdcbiAgICovXG4gIHByaXZhdGUgc3RvcEhlYWx0aE1vbml0b3JpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGVhbHRoQ2hlY2tJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmhlYWx0aENoZWNrSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5oZWFsdGhDaGVja0ludGVydmFsID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgaGVhbHRoIGNoZWNrIG9uIGFsbCB3b3JrZXJzXG4gICAqL1xuICBwcml2YXRlIHBlcmZvcm1IZWFsdGhDaGVjaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NodXR0aW5nRG93bikgcmV0dXJuO1xuXG4gICAgQXJyYXkuZnJvbSh0aGlzLndvcmtlcnMudmFsdWVzKCkpXG4gICAgICAuZmlsdGVyKCh3b3JrZXJTdGF0ZSkgPT4gIXdvcmtlclN0YXRlLmlzU2h1dHRpbmdEb3duKVxuICAgICAgLmZvckVhY2goKHdvcmtlclN0YXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVTaW5jZUxhc3RQaW5nID0gRGF0ZS5ub3coKSAtIHdvcmtlclN0YXRlLmxhc3RQaW5nO1xuXG4gICAgICAgIGlmICh3b3JrZXJTdGF0ZS5wZW5kaW5nUGluZyAmJiB0aW1lU2luY2VMYXN0UGluZyA+IHRoaXMub3B0aW9ucy5waW5nVGltZW91dCkge1xuICAgICAgICAgIC8vIFdvcmtlciBpcyBzdHVjaywgaGFuZGxlIGl0XG4gICAgICAgICAgdGhpcy5oYW5kbGVTdHVja1dvcmtlcih3b3JrZXJTdGF0ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXdvcmtlclN0YXRlLnBlbmRpbmdQaW5nKSB7XG4gICAgICAgICAgLy8gU2VuZCBwaW5nIHRvIHdvcmtlclxuICAgICAgICAgIHRoaXMuc2VuZFBpbmdUb1dvcmtlcih3b3JrZXJTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgcGluZyBtZXNzYWdlIHRvIGEgd29ya2VyXG4gICAqL1xuICBwcml2YXRlIHNlbmRQaW5nVG9Xb3JrZXIod29ya2VyU3RhdGU6IFdvcmtlclN0YXRlKTogdm9pZCB7XG4gICAgY29uc3QgcGluZ01lc3NhZ2U6IFBpbmdNZXNzYWdlID0ge1xuICAgICAgdHlwZTogJ3BpbmcnLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH07XG5cbiAgICB3b3JrZXJTdGF0ZS5wZW5kaW5nUGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtlclN0YXRlLndvcmtlci5zZW5kKHBpbmdNZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHNlbmQgcGluZyB0byB3b3JrZXIgJHt3b3JrZXJTdGF0ZS5pZH0gKHBpZDogJHtcbiAgICAgICAgICB3b3JrZXJTdGF0ZS53b3JrZXIucHJvY2Vzcy5waWRcbiAgICAgICAgfSk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgc3R1Y2sgd29ya2VyXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVN0dWNrV29ya2VyKHdvcmtlclN0YXRlOiBXb3JrZXJTdGF0ZSk6IHZvaWQge1xuICAgIGxvZ2dlci5lcnJvcihcbiAgICAgIGBXb3JrZXIgJHt3b3JrZXJTdGF0ZS5pZH0gKHBpZDogJHt3b3JrZXJTdGF0ZS53b3JrZXIucHJvY2Vzcy5waWR9KSBpcyBzdHVjaywga2lsbGluZyBpdGAsXG4gICAgKTtcbiAgICB0aGlzLmVtaXQoJ3dvcmtlcjpzdHVjaycsIHdvcmtlclN0YXRlLndvcmtlcik7XG5cbiAgICAvLyBSZW1vdmUgd29ya2VyIHN0YXRlXG4gICAgdGhpcy53b3JrZXJzLmRlbGV0ZSh3b3JrZXJTdGF0ZS53b3JrZXIuaWQpO1xuXG4gICAgLy8gS2lsbCB0aGUgd29ya2VyXG4gICAgd29ya2VyU3RhdGUud29ya2VyLmtpbGwoJ1NJR0tJTEwnKTtcblxuICAgIC8vIERldGVybWluZSBpZiB3ZSBzaG91bGQgc3Bhd24gYSByZXBsYWNlbWVudFxuICAgIGNvbnN0IHNob3VsZFNwYXduID0gdGhpcy5vcHRpb25zLnN0dWNrV29ya2VyUmVzcGF3bkZ1bmMod29ya2VyU3RhdGUud29ya2VyKTtcblxuICAgIGlmIChzaG91bGRTcGF3biAmJiAhdGhpcy5pc1NodXR0aW5nRG93bikge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBTcGF3bmluZyByZXBsYWNlbWVudCB3b3JrZXIgZm9yIHN0dWNrIHdvcmtlciAke3dvcmtlclN0YXRlLmlkfSAocGlkOiAke3dvcmtlclN0YXRlLndvcmtlci5wcm9jZXNzLnBpZH0pYCxcbiAgICAgICk7XG4gICAgICBjb25zdCB7IHJlc3RhcnRDb3VudCB9ID0gd29ya2VyU3RhdGU7IC8vIFByZXNlcnZlIHJlc3RhcnQgY291bnRcbiAgICAgIGNvbnN0IG5ld1dvcmtlciA9IHRoaXMuc3Bhd25Xb3JrZXIod29ya2VyU3RhdGUuaWQpO1xuICAgICAgY29uc3QgbmV3V29ya2VyU3RhdGUgPSB0aGlzLndvcmtlcnMuZ2V0KG5ld1dvcmtlci5pZCk7XG4gICAgICBpZiAobmV3V29ya2VyU3RhdGUpIHtcbiAgICAgICAgbmV3V29ya2VyU3RhdGUucmVzdGFydENvdW50ID0gcmVzdGFydENvdW50O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGBUcmlnZ2VyaW5nIGNsdXN0ZXIgc2h1dGRvd24gZHVlIHRvIHN0dWNrIHdvcmtlciAke3dvcmtlclN0YXRlLmlkfSAocGlkOiAke3dvcmtlclN0YXRlLndvcmtlci5wcm9jZXNzLnBpZH0pYCxcbiAgICAgICk7XG4gICAgICB0aGlzLnNodXRkb3duKCdTVFVDS19XT1JLRVInKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB3b3JrZXIgZXhpdCBldmVudHNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlV29ya2VyRXhpdCh3b3JrZXI6IFdvcmtlciwgY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgV29ya2VyICR7dGhpcy5nZXRXb3JrZXJJZCh3b3JrZXIpfSAocGlkOiAke1xuICAgICAgICB3b3JrZXIucHJvY2Vzcy5waWRcbiAgICAgIH0pIGRpZWQgd2l0aCBjb2RlICR7Y29kZX0gYW5kIHNpZ25hbCAke3NpZ25hbH1gLFxuICAgICk7XG4gICAgdGhpcy5lbWl0KCd3b3JrZXI6ZGllZCcsIHdvcmtlciwgY29kZSwgc2lnbmFsKTtcblxuICAgIGNvbnN0IHdvcmtlclN0YXRlID0gdGhpcy53b3JrZXJzLmdldCh3b3JrZXIuaWQpO1xuICAgIGlmICghd29ya2VyU3RhdGUpIHJldHVybjtcblxuICAgIHRoaXMud29ya2Vycy5kZWxldGUod29ya2VyLmlkKTtcblxuICAgIC8vIElmIHdlJ3JlIHNodXR0aW5nIGRvd24gb3Igd29ya2VyIHdhcyBraWxsZWQgaW50ZW50aW9uYWxseSwgZG9uJ3QgcmVzdGFydFxuICAgIGlmICh0aGlzLmlzU2h1dHRpbmdEb3duIHx8IHdvcmtlclN0YXRlLmlzU2h1dHRpbmdEb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHVuZXhwZWN0ZWQgZXhpdFxuICAgIHRoaXMuaGFuZGxlVW5leHBlY3RlZFdvcmtlckV4aXQod29ya2VyU3RhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXb3JrZXJJZCh3b3JrZXI6IFdvcmtlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMud29ya2Vycy5nZXQod29ya2VyLmlkKT8uaWQgPz8gd29ya2VyLmlkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDdXJyZW50V29ya2VySWQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBlbnZXb3JrZXJJZCA9XG4gICAgICBwcm9jZXNzLmVudi5XT1JLRVJfSUQgIT09IHVuZGVmaW5lZCA/IE51bWJlcihwcm9jZXNzLmVudi5XT1JLRVJfSUQpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBlbnZXb3JrZXJJZCA/PyB0aGlzLm9wdGlvbnMuY2x1c3Rlci53b3JrZXI/LmlkID8/IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdW5leHBlY3RlZCB3b3JrZXIgZXhpdHMgd2l0aCByZXN0YXJ0IGxvZ2ljXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVVuZXhwZWN0ZWRXb3JrZXJFeGl0KHdvcmtlclN0YXRlOiBXb3JrZXJTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHJlc3RhcnRDb3VudCA9IHdvcmtlclN0YXRlLnJlc3RhcnRDb3VudCArIDE7XG5cbiAgICBpZiAocmVzdGFydENvdW50IDw9IHRoaXMub3B0aW9ucy5yZXN0YXJ0TWF4VGltZXMpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgYFJlc3RhcnRpbmcgd29ya2VyICR7d29ya2VyU3RhdGUuaWR9IChwaWQ6ICR7d29ya2VyU3RhdGUud29ya2VyLnByb2Nlc3MucGlkfSkgKGF0dGVtcHQgJHtyZXN0YXJ0Q291bnR9LyR7dGhpcy5vcHRpb25zLnJlc3RhcnRNYXhUaW1lc30pYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdXb3JrZXIgPSB0aGlzLnNwYXduV29ya2VyKHdvcmtlclN0YXRlLmlkKTtcbiAgICAgIGNvbnN0IG5ld1dvcmtlclN0YXRlID0gdGhpcy53b3JrZXJzLmdldChuZXdXb3JrZXIuaWQpO1xuICAgICAgaWYgKG5ld1dvcmtlclN0YXRlKSB7XG4gICAgICAgIG5ld1dvcmtlclN0YXRlLnJlc3RhcnRDb3VudCA9IHJlc3RhcnRDb3VudDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW1pdCgnd29ya2VyOnJlc3RhcnRlZCcsIG5ld1dvcmtlciwgd29ya2VyU3RhdGUucmVzdGFydENvdW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICBgUmVzdGFydCBsaW1pdCAoJHt0aGlzLm9wdGlvbnMucmVzdGFydE1heFRpbWVzfSkgZXhjZWVkZWQgZm9yIHdvcmtlciAke3dvcmtlclN0YXRlLmlkfSAocGlkOiAke3dvcmtlclN0YXRlLndvcmtlci5wcm9jZXNzLnBpZH0pLCBzaHV0dGluZyBkb3duIGNsdXN0ZXJgLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZW1pdCgnd29ya2VyOnJlc3RhcnQtbGltaXQtZXhjZWVkZWQnLCB3b3JrZXJTdGF0ZS53b3JrZXIsIHdvcmtlclN0YXRlLnJlc3RhcnRDb3VudCk7XG4gICAgICB0aGlzLnNodXRkb3duKCdSRVNUQVJUX0xJTUlUX0VYQ0VFREVEJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNodXRzIGRvd24gdGhlIHByaW1hcnkgcHJvY2Vzc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaHV0ZG93blByaW1hcnkoc2lnbmFsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgUHJpbWFyeSBwcm9jZXNzIChwaWQ6ICR7cHJvY2Vzcy5waWR9KSBzaHV0dGluZyBkb3duIChzaWduYWw6ICR7c2lnbmFsID8/ICdtYW51YWwnfSlgLFxuICAgICk7XG5cbiAgICB0aGlzLnN0b3BIZWFsdGhNb25pdG9yaW5nKCk7XG4gICAgdGhpcy5yZW1vdmVTaWduYWxIYW5kbGVycygpO1xuXG4gICAgLy8gU2h1dGRvd24gYWxsIHdvcmtlcnNcbiAgICBhd2FpdCB0aGlzLnNodXRkb3duQWxsV29ya2VycyhzaWduYWwpO1xuXG4gICAgLy8gRXhlY3V0ZSBwcmltYXJ5IHNodXRkb3duIGZ1bmN0aW9uXG4gICAgYXdhaXQgc2FmZUV4ZWN1dGUoXG4gICAgICAoKSA9PlxuICAgICAgICB0aW1lb3V0KFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wcmltYXJ5U2h1dGRvd25GbihzaWduYWwpLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5zaHV0ZG93blRpbWVvdXQsXG4gICAgICAgICAgJ3ByaW1hcnkgc2h1dGRvd24gdGltZW91dCcsXG4gICAgICAgICksXG4gICAgICAnRXJyb3IgaW4gcHJpbWFyeSBzaHV0ZG93biBmdW5jdGlvbicsXG4gICAgKTtcblxuICAgIGxvZ2dlci5pbmZvKGBQcmltYXJ5IHByb2Nlc3MgKHBpZDogJHtwcm9jZXNzLnBpZH0pIHNodXRkb3duIGNvbXBsZXRlZGApO1xuICAgIHRoaXMuZW1pdCgnc2h1dGRvd246Y29tcGxldGVkJyk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNodXRzIGRvd24gYWxsIHdvcmtlcnMgZ3JhY2VmdWxseVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaHV0ZG93bkFsbFdvcmtlcnMoc2lnbmFsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMud29ya2Vycy5zaXplID09PSAwKSByZXR1cm47XG5cbiAgICBsb2dnZXIuaW5mbyhgU2h1dHRpbmcgZG93biAke3RoaXMud29ya2Vycy5zaXplfSB3b3JrZXJzLi4uYCk7XG5cbiAgICAvLyBNYXJrIGFsbCB3b3JrZXJzIGFzIHNodXR0aW5nIGRvd24gYW5kIHNlbmQgc2h1dGRvd24gbWVzc2FnZVxuICAgIEFycmF5LmZyb20odGhpcy53b3JrZXJzLnZhbHVlcygpKS5mb3JFYWNoKCh3b3JrZXJTdGF0ZSkgPT4ge1xuICAgICAgd29ya2VyU3RhdGUuaXNTaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgICAgLy8gT25seSBzZW5kIHNodXRkb3duIG1lc3NhZ2UgaWYgd29ya2VyIGlzIHN0aWxsIGNvbm5lY3RlZFxuICAgICAgaWYgKCF3b3JrZXJTdGF0ZS53b3JrZXIuaXNEZWFkKCkgJiYgd29ya2VyU3RhdGUud29ya2VyLnByb2Nlc3MuY29ubmVjdGVkKSB7XG4gICAgICAgIGNvbnN0IHNodXRkb3duTWVzc2FnZTogU2h1dGRvd25NZXNzYWdlID0ge1xuICAgICAgICAgIHR5cGU6ICdzaHV0ZG93bicsXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHdvcmtlclN0YXRlLndvcmtlci5zZW5kKHNodXRkb3duTWVzc2FnZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gV29ya2VyIElQQyBjaGFubmVsIGlzIGFscmVhZHkgY2xvc2VkLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHNlbmQgc2h1dGRvd24gbWVzc2FnZSB0byB3b3JrZXIgJHt3b3JrZXJTdGF0ZS5pZH0gKHBpZDogJHtcbiAgICAgICAgICAgICAgd29ya2VyU3RhdGUud29ya2VyLnByb2Nlc3MucGlkXG4gICAgICAgICAgICB9KTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBXYWl0IGZvciB3b3JrZXJzIHRvIGV4aXQgZ3JhY2VmdWxseSBvciB0aW1lb3V0XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICAgIHRoaXMud2FpdEZvckFsbFdvcmtlcnNUb0V4aXQoKSxcbiAgICAgICAgdGhpcy5vcHRpb25zLnNodXRkb3duVGltZW91dCxcbiAgICAgICAgJ1dvcmtlciBzaHV0ZG93biB0aW1lb3V0JyxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignR3JhY2VmdWwgc2h1dGRvd24gZm9yIHdvcmtlcnMgdGltZWQgb3V0LCBmb3JjaW5nIHNodXRkb3duJyk7XG4gICAgICB0aGlzLmZvcmNlS2lsbEFsbFdvcmtlcnMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIGFsbCB3b3JrZXJzIHRvIGV4aXRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckFsbFdvcmtlcnNUb0V4aXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHRoaXMud29ya2Vycy5zaXplID4gMCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgIGF3YWl0IGRlbGF5KDEwMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIGtpbGxzIGFsbCByZW1haW5pbmcgd29ya2Vyc1xuICAgKi9cbiAgcHJpdmF0ZSBmb3JjZUtpbGxBbGxXb3JrZXJzKCk6IHZvaWQge1xuICAgIEFycmF5LmZyb20odGhpcy53b3JrZXJzLnZhbHVlcygpKS5mb3JFYWNoKCh3b3JrZXJTdGF0ZSkgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICBgRm9yY2Uga2lsbGluZyB3b3JrZXIgJHt3b3JrZXJTdGF0ZS5pZH0gKHBpZDogJHt3b3JrZXJTdGF0ZS53b3JrZXIucHJvY2Vzcy5waWR9KWAsXG4gICAgICApO1xuICAgICAgd29ya2VyU3RhdGUud29ya2VyLmtpbGwoJ1NJR0tJTEwnKTtcbiAgICB9KTtcbiAgICB0aGlzLndvcmtlcnMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaHV0cyBkb3duIGEgd29ya2VyIHByb2Nlc3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2h1dGRvd25Xb3JrZXIoc2lnbmFsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgV29ya2VyICR7dGhpcy5nZXRDdXJyZW50V29ya2VySWQoKX0gKHBpZDogJHtwcm9jZXNzLnBpZH0pIHNodXR0aW5nIGRvd24gKHNpZ25hbDogJHtcbiAgICAgICAgc2lnbmFsID8/ICdtYW51YWwnXG4gICAgICB9KWAsXG4gICAgKTtcblxuICAgIHRoaXMucmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcblxuICAgIC8vIEV4ZWN1dGUgd29ya2VyIHNodXRkb3duIGZ1bmN0aW9uXG4gICAgYXdhaXQgc2FmZUV4ZWN1dGUoXG4gICAgICAoKSA9PlxuICAgICAgICB0aW1lb3V0KFxuICAgICAgICAgIHRoaXMub3B0aW9ucy53b3JrZXJTaHV0ZG93bkZuKHNpZ25hbCksXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnNodXRkb3duVGltZW91dCxcbiAgICAgICAgICAnd29ya2VyIHNodXRkb3duIHRpbWVvdXQnLFxuICAgICAgICApLFxuICAgICAgYEVycm9yIGluIHdvcmtlciAke3RoaXMuZ2V0Q3VycmVudFdvcmtlcklkKCl9IChwaWQ6ICR7cHJvY2Vzcy5waWR9KSBzaHV0ZG93biBmdW5jdGlvbmAsXG4gICAgKTtcblxuICAgIGxvZ2dlci5pbmZvKGBXb3JrZXIgJHt0aGlzLmdldEN1cnJlbnRXb3JrZXJJZCgpfSAocGlkOiAke3Byb2Nlc3MucGlkfSkgc2h1dGRvd24gY29tcGxldGVkYCk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGFjdGl2ZSB3b3JrZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0V29ya2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy53b3JrZXJzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgd29ya2Vyc1xuICAgKi9cbiAgcHVibGljIGdldFdvcmtlckluZm8oKTogQXJyYXk8eyBpZDogbnVtYmVyOyBwaWQ6IG51bWJlcjsgcmVzdGFydENvdW50OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMud29ya2Vycy52YWx1ZXMoKSkubWFwKChzdGF0ZSkgPT4gKHtcbiAgICAgIGlkOiBzdGF0ZS5pZCxcbiAgICAgIHBpZDogc3RhdGUud29ya2VyLnByb2Nlc3MucGlkID8/IC0xLFxuICAgICAgcmVzdGFydENvdW50OiBzdGF0ZS5yZXN0YXJ0Q291bnQsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY2x1c3RlciBpcyBjdXJyZW50bHkgc3RhcnRlZFxuICAgKi9cbiAgcHVibGljIGlzU3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY2x1c3RlciBpcyBjdXJyZW50bHkgc2h1dHRpbmcgZG93blxuICAgKi9cbiAgcHVibGljIGlzU2h1dGRvd24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNTaHV0dGluZ0Rvd247XG4gIH1cbn1cblxuLy8gVHlwZS1zYWZlIGV2ZW50IGVtaXR0ZXIgaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIENsdXN0ZXJNYW5hZ2VyRW1pdHRlciB7XG4gIG9uPEsgZXh0ZW5kcyBrZXlvZiBDbHVzdGVyTWFuYWdlckV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiBDbHVzdGVyTWFuYWdlckV2ZW50c1tLXSk6IHRoaXM7XG4gIGVtaXQ8SyBleHRlbmRzIGtleW9mIENsdXN0ZXJNYW5hZ2VyRXZlbnRzPihcbiAgICBldmVudDogSyxcbiAgICAuLi5hcmdzOiBQYXJhbWV0ZXJzPENsdXN0ZXJNYW5hZ2VyRXZlbnRzW0tdPlxuICApOiBib29sZWFuO1xufVxuIl19
|
|
475
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbHVzdGVyL21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsbUNBQXNDO0FBQ3RDLGtEQUFvQztBQVVwQyxtQ0FBaUY7QUFFakY7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSxjQUFlLFNBQVEscUJBQVk7SUFlOUMsWUFBWSxVQUFpQyxFQUFFO1FBQzdDLEtBQUssRUFBRSxDQUFDO1FBYk8sWUFBTyxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBRWxELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFaEIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFdkIsb0JBQWUsR0FBeUIsSUFBSSxDQUFDO1FBRTdDLHdCQUFtQixHQUEwQixJQUFJLENBQUM7UUFFbEQsbUJBQWMsR0FBRyxJQUFJLEdBQUcsRUFBOEIsQ0FBQztRQUk3RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsaUNBQXlCLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssVUFBVTtRQUNoQixnREFBZ0Q7UUFDaEQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7Z0JBQ2hDLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWE7YUFDMUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZ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QUNJLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztDQUNGO0FBaGlCRCx3Q0FnaUJDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCB7IFdvcmtlciB9IGZyb20gJ2NsdXN0ZXInO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHtcbiAgQ2x1c3Rlck1hbmFnZXJPcHRpb25zLFxuICBDbHVzdGVyTWFuYWdlckV2ZW50cyxcbiAgV29ya2VyU3RhdGUsXG4gIElQQ01lc3NhZ2UsXG4gIFBpbmdNZXNzYWdlLFxuICBQb25nTWVzc2FnZSxcbiAgU2h1dGRvd25NZXNzYWdlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGRlbGF5LCB0aW1lb3V0LCBzYWZlRXhlY3V0ZSwgdmFsaWRhdGVBbmREZWZhdWx0T3B0aW9ucyB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIENsdXN0ZXJNYW5hZ2VyIC0gQSBjbHVzdGVyIGxpZmVjeWNsZSBtYW5hZ2VtZW50IHN5c3RlbVxuICpcbiAqIFRoZSBtYW5hZ2VyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6XG4gKiAtIEdyYWNlZnVsIHNodXRkb3duIHdpdGggY29uZmlndXJhYmxlIHRpbWVvdXRcbiAqIC0gV29ya2VyIGhlYWx0aCBtb25pdG9yaW5nIHdpdGggcGluZy9wb25nIG1lY2hhbmlzbVxuICogLSBBdXRvbWF0aWMgd29ya2VyIHJlc3RhcnQgd2l0aCBjb25maWd1cmFibGUgbGltaXRzXG4gKiAtIFNpZ25hbCBoYW5kbGluZyBmb3Igc2h1dGRvd24gdHJpZ2dlcnNcbiAqIC0gRmxleGlibGUgcHJpbWFyeSBhbmQgd29ya2VyIGZ1bmN0aW9uIGhhbmRsZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBDbHVzdGVyTWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogUmVxdWlyZWQ8Q2x1c3Rlck1hbmFnZXJPcHRpb25zPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtlcnMgPSBuZXcgTWFwPG51bWJlciwgV29ya2VyU3RhdGU+KCk7XG5cbiAgcHJpdmF0ZSBzdGFydGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBpc1NodXR0aW5nRG93biA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc2h1dGRvd25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBoZWFsdGhDaGVja0ludGVydmFsOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENsdXN0ZXJNYW5hZ2VyT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm9wdGlvbnMgPSB2YWxpZGF0ZUFuZERlZmF1bHRPcHRpb25zKG9wdGlvbnMpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGNsdXN0ZXIgbWFuYWdlciB3aXRoIHByaW1hcnkgcHJvY2VzcyBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9kb2NzL2xhdGVzdC9hcGkvY2x1c3Rlci5odG1sI2NsdXN0ZXJzZXR1cHByaW1hcnlvcHRpb25zIE5vZGUuanMgY2x1c3Rlci5zZXR1cFByaW1hcnkoKX1cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBPbmx5IGNhbGwgc2V0dXBQcmltYXJ5IGluIHRoZSBwcmltYXJ5IHByb2Nlc3NcbiAgICBpZiAodGhpcy5vcHRpb25zLmNsdXN0ZXIuaXNQcmltYXJ5KSB7XG4gICAgICB0aGlzLm9wdGlvbnMuY2x1c3Rlci5zZXR1cFByaW1hcnkoe1xuICAgICAgICBzZXJpYWxpemF0aW9uOiB0aGlzLm9wdGlvbnMuc2VyaWFsaXphdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNldHVwU2lnbmFsSGFuZGxlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIGNsdXN0ZXIgbWFuYWdlclxuICAgKiBJbiBwcmltYXJ5IHByb2Nlc3M6IHN0YXJ0cyB3b3JrZXJzIGFuZCBoZWFsdGggbW9uaXRvcmluZ1xuICAgKiBJbiB3b3JrZXIgcHJvY2VzczogZXhlY3V0ZXMgd29ya2VyIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jbHVzdGVyLmlzUHJpbWFyeSkge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFByaW1hcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFdvcmtlcigpO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlcyBncmFjZWZ1bCBzaHV0ZG93biBvZiB0aGUgY2x1c3RlclxuICAgKi9cbiAgcHVibGljIHNodXRkb3duKHNpZ25hbD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2h1dGRvd25Qcm9taXNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaHV0ZG93blByb21pc2U7XG4gICAgfVxuXG4gICAgdGhpcy5pc1NodXR0aW5nRG93biA9IHRydWU7XG4gICAgdGhpcy5lbWl0KCdzaHV0ZG93bjpzdGFydGVkJywgc2lnbmFsKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2x1c3Rlci5pc1ByaW1hcnkpIHtcbiAgICAgIHRoaXMuc2h1dGRvd25Qcm9taXNlID0gdGhpcy5zaHV0ZG93blByaW1hcnkoc2lnbmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaHV0ZG93blByb21pc2UgPSB0aGlzLnNodXRkb3duV29ya2VyKHNpZ25hbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2h1dGRvd25Qcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgc2lnbmFsIGhhbmRsZXJzIGZvciBncmFjZWZ1bCBzaHV0ZG93blxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFNpZ25hbEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucy5zaHV0ZG93blNpZ25hbHMuZm9yRWFjaCgoc2lnbmFsKSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNodXRkb3duKHNpZ25hbCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5zaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCBoYW5kbGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHNpZ25hbCBoYW5kbGVyc1xuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVTaWduYWxIYW5kbGVycygpOiB2b2lkIHtcbiAgICBBcnJheS5mcm9tKHRoaXMuc2lnbmFsSGFuZGxlcnMuZW50cmllcygpKS5mb3JFYWNoKChbc2lnbmFsLCBoYW5kbGVyXSkgPT4ge1xuICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWduYWwsIGhhbmRsZXIpO1xuICAgIH0pO1xuICAgIHRoaXMuc2lnbmFsSGFuZGxlcnMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHByaW1hcnkgcHJvY2Vzc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFByaW1hcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgUHJpbWFyeSBwcm9jZXNzIChwaWQ6ICR7cHJvY2Vzcy5waWR9KSBzdGFydGluZyB3aXRoICR7dGhpcy5vcHRpb25zLm51bVdvcmtlcnN9IHdvcmtlcnNgLFxuICAgICk7XG5cbiAgICAvLyBFeGVjdXRlIHByaW1hcnkgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24sIGFueSBlcnJvciB3aWxsIHN0b3AgdGhlIGNsdXN0ZXIgZnJvbSBzdGFydGluZ1xuICAgIGF3YWl0IHRoaXMub3B0aW9ucy5wcmltYXJ5Rm4oKTtcblxuICAgIC8vIFNldCB1cCBjbHVzdGVyIGV2ZW50IGhhbmRsZXJzXG4gICAgdGhpcy5zZXR1cENsdXN0ZXJFdmVudEhhbmRsZXJzKCk7XG5cbiAgICAvLyBTcGF3biBpbml0aWFsIHdvcmtlcnNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5udW1Xb3JrZXJzOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHdvcmtlcklkID0gaSArIDE7IC8vIFdvcmtlciBJRHMgc3RhcnQgZnJvbSAxXG4gICAgICB0aGlzLnNwYXduV29ya2VyKHdvcmtlcklkKTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBoZWFsdGggbW9uaXRvcmluZ1xuICAgIHRoaXMuc3RhcnRIZWFsdGhNb25pdG9yaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGEgd29ya2VyIHByb2Nlc3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3RhcnRXb3JrZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oYFdvcmtlciAke3RoaXMuZ2V0Q3VycmVudFdvcmtlcklkKCl9IChwaWQ6ICR7cHJvY2Vzcy5waWR9KSBzdGFydGluZ2ApO1xuXG4gICAgLy8gU2V0IHVwIElQQyBtZXNzYWdlIGhhbmRsZXJzXG4gICAgdGhpcy5zZXR1cFdvcmtlck1lc3NhZ2VIYW5kbGVycygpO1xuXG4gICAgLy8gRXhlY3V0ZSB3b3JrZXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24sIGFueSBlcnJvciB3aWxsIGJlIHByb3BhZ2F0ZWRcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMud29ya2VyRm4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIGNsdXN0ZXIgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBwcmltYXJ5IHByb2Nlc3NcbiAgICovXG4gIHByaXZhdGUgc2V0dXBDbHVzdGVyRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMuY2x1c3Rlci5vbignZXhpdCcsICh3b3JrZXI6IFdvcmtlciwgY29kZTogbnVtYmVyLCBzaWduYWw6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVXb3JrZXJFeGl0KHdvcmtlciwgY29kZSwgc2lnbmFsKTtcbiAgICB9KTtcblxuICAgIHRoaXMub3B0aW9ucy5jbHVzdGVyLm9uKCdvbmxpbmUnLCAod29ya2VyOiBXb3JrZXIpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGBXb3JrZXIgJHt0aGlzLmdldFdvcmtlcklkKHdvcmtlcil9IChwaWQ6ICR7d29ya2VyLnByb2Nlc3MucGlkfSkgaXMgb25saW5lYCk7XG4gICAgICB0aGlzLmVtaXQoJ3dvcmtlcjpzdGFydGVkJywgd29ya2VyKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIElQQyBtZXNzYWdlIGhhbmRsZXJzIGZvciB3b3JrZXIgcHJvY2Vzc2VzXG4gICAqL1xuICBwcml2YXRlIHNldHVwV29ya2VyTWVzc2FnZUhhbmRsZXJzKCk6IHZvaWQge1xuICAgIHByb2Nlc3Mub24oJ21lc3NhZ2UnLCAobWVzc2FnZTogSVBDTWVzc2FnZSkgPT4ge1xuICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAncGluZyc6XG4gICAgICAgICAgdGhpcy5oYW5kbGVXb3JrZXJQaW5nKG1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzaHV0ZG93bic6XG4gICAgICAgICAgdGhpcy5zaHV0ZG93bihtZXNzYWdlLnNpZ25hbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFtZXNzYWdlLnR5cGUuaW5jbHVkZXMoJ01ldHJpY3MnKSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYGlnbm9yaW5nIHVua25vd24gbWVzc2FnZSB0eXBlIGluIHdvcmtlciAke3Byb2Nlc3MucGlkfTogJHttZXNzYWdlLnR5cGV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIG5ldyB3b3JrZXIgYW5kIHNldHMgdXAgaXRzIHN0YXRlXG4gICAqL1xuICBwcml2YXRlIHNwYXduV29ya2VyKGlkOiBudW1iZXIpOiBXb3JrZXIge1xuICAgIGNvbnN0IHdvcmtlciA9IHRoaXMub3B0aW9ucy5jbHVzdGVyLmZvcmsoe1xuICAgICAgV09SS0VSX0lEOiBpZCxcbiAgICB9KTtcbiAgICBjb25zdCB3b3JrZXJTdGF0ZTogV29ya2VyU3RhdGUgPSB7XG4gICAgICBpZCxcbiAgICAgIHdvcmtlcixcbiAgICAgIHJlc3RhcnRDb3VudDogMCxcbiAgICAgIGxhc3RQaW5nOiBEYXRlLm5vdygpLFxuICAgICAgcGVuZGluZ1Bpbmc6IGZhbHNlLFxuICAgICAgaXNTaHV0dGluZ0Rvd246IGZhbHNlLFxuICAgIH07XG5cbiAgICB0aGlzLndvcmtlcnMuc2V0KHdvcmtlci5pZCwgd29ya2VyU3RhdGUpO1xuXG4gICAgLy8gU2V0IHVwIHdvcmtlciBtZXNzYWdlIGhhbmRsZXJcbiAgICB3b3JrZXIub24oJ21lc3NhZ2UnLCAobWVzc2FnZTogSVBDTWVzc2FnZSkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVXb3JrZXJNZXNzYWdlKHdvcmtlciwgbWVzc2FnZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gd29ya2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgbWVzc2FnZXMgZnJvbSB3b3JrZXJzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVdvcmtlck1lc3NhZ2Uod29ya2VyOiBXb3JrZXIsIG1lc3NhZ2U6IElQQ01lc3NhZ2UpOiB2b2lkIHtcbiAgICBjb25zdCB3b3JrZXJTdGF0ZSA9IHRoaXMud29ya2Vycy5nZXQod29ya2VyLmlkKTtcbiAgICBpZiAoIXdvcmtlclN0YXRlKSByZXR1cm47XG5cbiAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgY2FzZSAncG9uZyc6XG4gICAgICAgIHdvcmtlclN0YXRlLmxhc3RQaW5nID0gRGF0ZS5ub3coKTtcbiAgICAgICAgd29ya2VyU3RhdGUucGVuZGluZ1BpbmcgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoIW1lc3NhZ2UudHlwZS5pbmNsdWRlcygnTWV0cmljcycpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgUmVjZWl2ZWQgdW5rbm93biBtZXNzYWdlIHR5cGUgZnJvbSB3b3JrZXIgJHt0aGlzLmdldFdvcmtlcklkKHdvcmtlcil9IChwaWQ6ICR7XG4gICAgICAgICAgICAgIHdvcmtlci5wcm9jZXNzLnBpZFxuICAgICAgICAgICAgfSk6ICR7bWVzc2FnZS50eXBlfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBwaW5nIG1lc3NhZ2VzIGluIHdvcmtlciBwcm9jZXNzZXNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlV29ya2VyUGluZyhtZXNzYWdlOiBQaW5nTWVzc2FnZSk6IHZvaWQge1xuICAgIGNvbnN0IHBvbmdNZXNzYWdlOiBQb25nTWVzc2FnZSA9IHtcbiAgICAgIHR5cGU6ICdwb25nJyxcbiAgICAgIHRpbWVzdGFtcDogbWVzc2FnZS50aW1lc3RhbXAsXG4gICAgfTtcblxuICAgIGlmIChwcm9jZXNzLnNlbmQpIHtcbiAgICAgIHByb2Nlc3Muc2VuZChwb25nTWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBoZWFsdGggbW9uaXRvcmluZyBmb3IgYWxsIHdvcmtlcnNcbiAgICovXG4gIHByaXZhdGUgc3RhcnRIZWFsdGhNb25pdG9yaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuaGVhbHRoQ2hlY2tJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMucGVyZm9ybUhlYWx0aENoZWNrKCk7XG4gICAgfSwgdGhpcy5vcHRpb25zLnBpbmdGcmVxdWVuY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIGhlYWx0aCBtb25pdG9yaW5nXG4gICAqL1xuICBwcml2YXRlIHN0b3BIZWFsdGhNb25pdG9yaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhlYWx0aENoZWNrSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFsdGhDaGVja0ludGVydmFsKTtcbiAgICAgIHRoaXMuaGVhbHRoQ2hlY2tJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGhlYWx0aCBjaGVjayBvbiBhbGwgd29ya2Vyc1xuICAgKi9cbiAgcHJpdmF0ZSBwZXJmb3JtSGVhbHRoQ2hlY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIEFycmF5LmZyb20odGhpcy53b3JrZXJzLnZhbHVlcygpKVxuICAgICAgLmZpbHRlcigod29ya2VyU3RhdGUpID0+ICF3b3JrZXJTdGF0ZS5pc1NodXR0aW5nRG93bilcbiAgICAgIC5mb3JFYWNoKCh3b3JrZXJTdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lU2luY2VMYXN0UGluZyA9IERhdGUubm93KCkgLSB3b3JrZXJTdGF0ZS5sYXN0UGluZztcblxuICAgICAgICBpZiAod29ya2VyU3RhdGUucGVuZGluZ1BpbmcgJiYgdGltZVNpbmNlTGFzdFBpbmcgPiB0aGlzLm9wdGlvbnMucGluZ1RpbWVvdXQpIHtcbiAgICAgICAgICAvLyBXb3JrZXIgaXMgc3R1Y2ssIGhhbmRsZSBpdFxuICAgICAgICAgIHRoaXMuaGFuZGxlU3R1Y2tXb3JrZXIod29ya2VyU3RhdGUpO1xuICAgICAgICB9IGVsc2UgaWYgKCF3b3JrZXJTdGF0ZS5wZW5kaW5nUGluZykge1xuICAgICAgICAgIC8vIFNlbmQgcGluZyB0byB3b3JrZXJcbiAgICAgICAgICB0aGlzLnNlbmRQaW5nVG9Xb3JrZXIod29ya2VyU3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIHBpbmcgbWVzc2FnZSB0byBhIHdvcmtlclxuICAgKi9cbiAgcHJpdmF0ZSBzZW5kUGluZ1RvV29ya2VyKHdvcmtlclN0YXRlOiBXb3JrZXJTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHBpbmdNZXNzYWdlOiBQaW5nTWVzc2FnZSA9IHtcbiAgICAgIHR5cGU6ICdwaW5nJyxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICB9O1xuXG4gICAgd29ya2VyU3RhdGUucGVuZGluZ1BpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB3b3JrZXJTdGF0ZS53b3JrZXIuc2VuZChwaW5nTWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBzZW5kIHBpbmcgdG8gd29ya2VyICR7d29ya2VyU3RhdGUuaWR9IChwaWQ6ICR7XG4gICAgICAgICAgd29ya2VyU3RhdGUud29ya2VyLnByb2Nlc3MucGlkXG4gICAgICAgIH0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIHN0dWNrIHdvcmtlclxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTdHVja1dvcmtlcih3b3JrZXJTdGF0ZTogV29ya2VyU3RhdGUpOiB2b2lkIHtcbiAgICBsb2dnZXIuZXJyb3IoXG4gICAgICBgV29ya2VyICR7d29ya2VyU3RhdGUuaWR9IChwaWQ6ICR7d29ya2VyU3RhdGUud29ya2VyLnByb2Nlc3MucGlkfSkgaXMgc3R1Y2ssIGtpbGxpbmcgaXRgLFxuICAgICk7XG4gICAgdGhpcy5lbWl0KCd3b3JrZXI6c3R1Y2snLCB3b3JrZXJTdGF0ZS53b3JrZXIpO1xuXG4gICAgLy8gUmVtb3ZlIHdvcmtlciBzdGF0ZVxuICAgIHRoaXMud29ya2Vycy5kZWxldGUod29ya2VyU3RhdGUud29ya2VyLmlkKTtcblxuICAgIC8vIEtpbGwgdGhlIHdvcmtlclxuICAgIHdvcmtlclN0YXRlLndvcmtlci5raWxsKCdTSUdLSUxMJyk7XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHNwYXduIGEgcmVwbGFjZW1lbnRcbiAgICBjb25zdCBzaG91bGRTcGF3biA9IHRoaXMub3B0aW9ucy5zdHVja1dvcmtlclJlc3Bhd25GdW5jKHdvcmtlclN0YXRlLndvcmtlcik7XG5cbiAgICBpZiAoc2hvdWxkU3Bhd24gJiYgIXRoaXMuaXNTaHV0dGluZ0Rvd24pIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgU3Bhd25pbmcgcmVwbGFjZW1lbnQgd29ya2VyIGZvciBzdHVjayB3b3JrZXIgJHt3b3JrZXJTdGF0ZS5pZH0gKHBpZDogJHt3b3JrZXJTdGF0ZS53b3JrZXIucHJvY2Vzcy5waWR9KWAsXG4gICAgICApO1xuICAgICAgY29uc3QgeyByZXN0YXJ0Q291bnQgfSA9IHdvcmtlclN0YXRlOyAvLyBQcmVzZXJ2ZSByZXN0YXJ0IGNvdW50XG4gICAgICBjb25zdCBuZXdXb3JrZXIgPSB0aGlzLnNwYXduV29ya2VyKHdvcmtlclN0YXRlLmlkKTtcbiAgICAgIGNvbnN0IG5ld1dvcmtlclN0YXRlID0gdGhpcy53b3JrZXJzLmdldChuZXdXb3JrZXIuaWQpO1xuICAgICAgaWYgKG5ld1dvcmtlclN0YXRlKSB7XG4gICAgICAgIG5ld1dvcmtlclN0YXRlLnJlc3RhcnRDb3VudCA9IHJlc3RhcnRDb3VudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICBgVHJpZ2dlcmluZyBjbHVzdGVyIHNodXRkb3duIGR1ZSB0byBzdHVjayB3b3JrZXIgJHt3b3JrZXJTdGF0ZS5pZH0gKHBpZDogJHt3b3JrZXJTdGF0ZS53b3JrZXIucHJvY2Vzcy5waWR9KWAsXG4gICAgICApO1xuICAgICAgdGhpcy5zaHV0ZG93bignU1RVQ0tfV09SS0VSJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgd29ya2VyIGV4aXQgZXZlbnRzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVdvcmtlckV4aXQod29ya2VyOiBXb3JrZXIsIGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYFdvcmtlciAke3RoaXMuZ2V0V29ya2VySWQod29ya2VyKX0gKHBpZDogJHtcbiAgICAgICAgd29ya2VyLnByb2Nlc3MucGlkXG4gICAgICB9KSBkaWVkIHdpdGggY29kZSAke2NvZGV9IGFuZCBzaWduYWwgJHtzaWduYWx9YCxcbiAgICApO1xuICAgIHRoaXMuZW1pdCgnd29ya2VyOmRpZWQnLCB3b3JrZXIsIGNvZGUsIHNpZ25hbCk7XG5cbiAgICBjb25zdCB3b3JrZXJTdGF0ZSA9IHRoaXMud29ya2Vycy5nZXQod29ya2VyLmlkKTtcbiAgICBpZiAoIXdvcmtlclN0YXRlKSByZXR1cm47XG5cbiAgICB0aGlzLndvcmtlcnMuZGVsZXRlKHdvcmtlci5pZCk7XG5cbiAgICAvLyBJZiB3ZSdyZSBzaHV0dGluZyBkb3duIG9yIHdvcmtlciB3YXMga2lsbGVkIGludGVudGlvbmFsbHksIGRvbid0IHJlc3RhcnRcbiAgICBpZiAodGhpcy5pc1NodXR0aW5nRG93biB8fCB3b3JrZXJTdGF0ZS5pc1NodXR0aW5nRG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSB1bmV4cGVjdGVkIGV4aXRcbiAgICB0aGlzLmhhbmRsZVVuZXhwZWN0ZWRXb3JrZXJFeGl0KHdvcmtlclN0YXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V29ya2VySWQod29ya2VyOiBXb3JrZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLndvcmtlcnMuZ2V0KHdvcmtlci5pZCk/LmlkID8/IHdvcmtlci5pZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudFdvcmtlcklkKCk6IG51bWJlciB7XG4gICAgY29uc3QgZW52V29ya2VySWQgPVxuICAgICAgcHJvY2Vzcy5lbnYuV09SS0VSX0lEICE9PSB1bmRlZmluZWQgPyBOdW1iZXIocHJvY2Vzcy5lbnYuV09SS0VSX0lEKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gZW52V29ya2VySWQgPz8gdGhpcy5vcHRpb25zLmNsdXN0ZXIud29ya2VyPy5pZCA/PyAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHVuZXhwZWN0ZWQgd29ya2VyIGV4aXRzIHdpdGggcmVzdGFydCBsb2dpY1xuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVVbmV4cGVjdGVkV29ya2VyRXhpdCh3b3JrZXJTdGF0ZTogV29ya2VyU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCByZXN0YXJ0Q291bnQgPSB3b3JrZXJTdGF0ZS5yZXN0YXJ0Q291bnQgKyAxO1xuXG4gICAgaWYgKHJlc3RhcnRDb3VudCA8PSB0aGlzLm9wdGlvbnMucmVzdGFydE1heFRpbWVzKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGBSZXN0YXJ0aW5nIHdvcmtlciAke3dvcmtlclN0YXRlLmlkfSAocGlkOiAke3dvcmtlclN0YXRlLndvcmtlci5wcm9jZXNzLnBpZH0pIChhdHRlbXB0ICR7cmVzdGFydENvdW50fS8ke3RoaXMub3B0aW9ucy5yZXN0YXJ0TWF4VGltZXN9KWAsXG4gICAgICApO1xuICAgICAgY29uc3QgbmV3V29ya2VyID0gdGhpcy5zcGF3bldvcmtlcih3b3JrZXJTdGF0ZS5pZCk7XG4gICAgICBjb25zdCBuZXdXb3JrZXJTdGF0ZSA9IHRoaXMud29ya2Vycy5nZXQobmV3V29ya2VyLmlkKTtcbiAgICAgIGlmIChuZXdXb3JrZXJTdGF0ZSkge1xuICAgICAgICBuZXdXb3JrZXJTdGF0ZS5yZXN0YXJ0Q291bnQgPSByZXN0YXJ0Q291bnQ7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXQoJ3dvcmtlcjpyZXN0YXJ0ZWQnLCBuZXdXb3JrZXIsIHdvcmtlclN0YXRlLnJlc3RhcnRDb3VudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgYFJlc3RhcnQgbGltaXQgKCR7dGhpcy5vcHRpb25zLnJlc3RhcnRNYXhUaW1lc30pIGV4Y2VlZGVkIGZvciB3b3JrZXIgJHt3b3JrZXJTdGF0ZS5pZH0gKHBpZDogJHt3b3JrZXJTdGF0ZS53b3JrZXIucHJvY2Vzcy5waWR9KSwgc2h1dHRpbmcgZG93biBjbHVzdGVyYCxcbiAgICAgICk7XG4gICAgICB0aGlzLmVtaXQoJ3dvcmtlcjpyZXN0YXJ0LWxpbWl0LWV4Y2VlZGVkJywgd29ya2VyU3RhdGUud29ya2VyLCB3b3JrZXJTdGF0ZS5yZXN0YXJ0Q291bnQpO1xuICAgICAgdGhpcy5zaHV0ZG93bignUkVTVEFSVF9MSU1JVF9FWENFRURFRCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaHV0cyBkb3duIHRoZSBwcmltYXJ5IHByb2Nlc3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2h1dGRvd25QcmltYXJ5KHNpZ25hbD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYFByaW1hcnkgcHJvY2VzcyAocGlkOiAke3Byb2Nlc3MucGlkfSkgc2h1dHRpbmcgZG93biAoc2lnbmFsOiAke3NpZ25hbCA/PyAnbWFudWFsJ30pYCxcbiAgICApO1xuXG4gICAgdGhpcy5zdG9wSGVhbHRoTW9uaXRvcmluZygpO1xuICAgIHRoaXMucmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcblxuICAgIC8vIFNodXRkb3duIGFsbCB3b3JrZXJzXG4gICAgYXdhaXQgdGhpcy5zaHV0ZG93bkFsbFdvcmtlcnMoc2lnbmFsKTtcblxuICAgIC8vIEV4ZWN1dGUgcHJpbWFyeSBzaHV0ZG93biBmdW5jdGlvblxuICAgIGF3YWl0IHNhZmVFeGVjdXRlKFxuICAgICAgKCkgPT5cbiAgICAgICAgdGltZW91dChcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucHJpbWFyeVNodXRkb3duRm4oc2lnbmFsKSxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2h1dGRvd25UaW1lb3V0LFxuICAgICAgICAgICdwcmltYXJ5IHNodXRkb3duIHRpbWVvdXQnLFxuICAgICAgICApLFxuICAgICAgJ0Vycm9yIGluIHByaW1hcnkgc2h1dGRvd24gZnVuY3Rpb24nLFxuICAgICk7XG5cbiAgICBsb2dnZXIuaW5mbyhgUHJpbWFyeSBwcm9jZXNzIChwaWQ6ICR7cHJvY2Vzcy5waWR9KSBzaHV0ZG93biBjb21wbGV0ZWRgKTtcbiAgICB0aGlzLmVtaXQoJ3NodXRkb3duOmNvbXBsZXRlZCcpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaHV0cyBkb3duIGFsbCB3b3JrZXJzIGdyYWNlZnVsbHlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2h1dGRvd25BbGxXb3JrZXJzKHNpZ25hbD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLndvcmtlcnMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgbG9nZ2VyLmluZm8oYFNodXR0aW5nIGRvd24gJHt0aGlzLndvcmtlcnMuc2l6ZX0gd29ya2Vycy4uLmApO1xuXG4gICAgLy8gTWFyayBhbGwgd29ya2VycyBhcyBzaHV0dGluZyBkb3duIGFuZCBzZW5kIHNodXRkb3duIG1lc3NhZ2VcbiAgICBBcnJheS5mcm9tKHRoaXMud29ya2Vycy52YWx1ZXMoKSkuZm9yRWFjaCgod29ya2VyU3RhdGUpID0+IHtcbiAgICAgIHdvcmtlclN0YXRlLmlzU2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICAgIC8vIE9ubHkgc2VuZCBzaHV0ZG93biBtZXNzYWdlIGlmIHdvcmtlciBpcyBzdGlsbCBjb25uZWN0ZWRcbiAgICAgIGlmICghd29ya2VyU3RhdGUud29ya2VyLmlzRGVhZCgpICYmIHdvcmtlclN0YXRlLndvcmtlci5wcm9jZXNzLmNvbm5lY3RlZCkge1xuICAgICAgICBjb25zdCBzaHV0ZG93bk1lc3NhZ2U6IFNodXRkb3duTWVzc2FnZSA9IHtcbiAgICAgICAgICB0eXBlOiAnc2h1dGRvd24nLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3b3JrZXJTdGF0ZS53b3JrZXIuc2VuZChzaHV0ZG93bk1lc3NhZ2UpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIFdvcmtlciBJUEMgY2hhbm5lbCBpcyBhbHJlYWR5IGNsb3NlZCwgd2hpY2ggaXMgZmluZVxuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzZW5kIHNodXRkb3duIG1lc3NhZ2UgdG8gd29ya2VyICR7d29ya2VyU3RhdGUuaWR9IChwaWQ6ICR7XG4gICAgICAgICAgICAgIHdvcmtlclN0YXRlLndvcmtlci5wcm9jZXNzLnBpZFxuICAgICAgICAgICAgfSk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2FpdCBmb3Igd29ya2VycyB0byBleGl0IGdyYWNlZnVsbHkgb3IgdGltZW91dFxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAgICB0aGlzLndhaXRGb3JBbGxXb3JrZXJzVG9FeGl0KCksXG4gICAgICAgIHRoaXMub3B0aW9ucy5zaHV0ZG93blRpbWVvdXQsXG4gICAgICAgICdXb3JrZXIgc2h1dGRvd24gdGltZW91dCcsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0dyYWNlZnVsIHNodXRkb3duIGZvciB3b3JrZXJzIHRpbWVkIG91dCwgZm9yY2luZyBzaHV0ZG93bicpO1xuICAgICAgdGhpcy5mb3JjZUtpbGxBbGxXb3JrZXJzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciBhbGwgd29ya2VycyB0byBleGl0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBbGxXb3JrZXJzVG9FeGl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdoaWxlICh0aGlzLndvcmtlcnMuc2l6ZSA+IDApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICBhd2FpdCBkZWxheSgxMDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSBraWxscyBhbGwgcmVtYWluaW5nIHdvcmtlcnNcbiAgICovXG4gIHByaXZhdGUgZm9yY2VLaWxsQWxsV29ya2VycygpOiB2b2lkIHtcbiAgICBBcnJheS5mcm9tKHRoaXMud29ya2Vycy52YWx1ZXMoKSkuZm9yRWFjaCgod29ya2VyU3RhdGUpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZvcmNlIGtpbGxpbmcgd29ya2VyICR7d29ya2VyU3RhdGUuaWR9IChwaWQ6ICR7d29ya2VyU3RhdGUud29ya2VyLnByb2Nlc3MucGlkfSlgLFxuICAgICAgKTtcbiAgICAgIHdvcmtlclN0YXRlLndvcmtlci5raWxsKCdTSUdLSUxMJyk7XG4gICAgfSk7XG4gICAgdGhpcy53b3JrZXJzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogU2h1dHMgZG93biBhIHdvcmtlciBwcm9jZXNzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNodXRkb3duV29ya2VyKHNpZ25hbD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYFdvcmtlciAke3RoaXMuZ2V0Q3VycmVudFdvcmtlcklkKCl9IChwaWQ6ICR7cHJvY2Vzcy5waWR9KSBzaHV0dGluZyBkb3duIChzaWduYWw6ICR7XG4gICAgICAgIHNpZ25hbCA/PyAnbWFudWFsJ1xuICAgICAgfSlgLFxuICAgICk7XG5cbiAgICB0aGlzLnJlbW92ZVNpZ25hbEhhbmRsZXJzKCk7XG5cbiAgICAvLyBFeGVjdXRlIHdvcmtlciBzaHV0ZG93biBmdW5jdGlvblxuICAgIGF3YWl0IHNhZmVFeGVjdXRlKFxuICAgICAgKCkgPT5cbiAgICAgICAgdGltZW91dChcbiAgICAgICAgICB0aGlzLm9wdGlvbnMud29ya2VyU2h1dGRvd25GbihzaWduYWwpLFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5zaHV0ZG93blRpbWVvdXQsXG4gICAgICAgICAgJ3dvcmtlciBzaHV0ZG93biB0aW1lb3V0JyxcbiAgICAgICAgKSxcbiAgICAgIGBFcnJvciBpbiB3b3JrZXIgJHt0aGlzLmdldEN1cnJlbnRXb3JrZXJJZCgpfSAocGlkOiAke3Byb2Nlc3MucGlkfSkgc2h1dGRvd24gZnVuY3Rpb25gLFxuICAgICk7XG5cbiAgICBsb2dnZXIuaW5mbyhgV29ya2VyICR7dGhpcy5nZXRDdXJyZW50V29ya2VySWQoKX0gKHBpZDogJHtwcm9jZXNzLnBpZH0pIHNodXRkb3duIGNvbXBsZXRlZGApO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IG51bWJlciBvZiBhY3RpdmUgd29ya2Vyc1xuICAgKi9cbiAgcHVibGljIGdldFdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMud29ya2Vycy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHdvcmtlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRXb3JrZXJJbmZvKCk6IEFycmF5PHsgaWQ6IG51bWJlcjsgcGlkOiBudW1iZXI7IHJlc3RhcnRDb3VudDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLndvcmtlcnMudmFsdWVzKCkpLm1hcCgoc3RhdGUpID0+ICh7XG4gICAgICBpZDogc3RhdGUuaWQsXG4gICAgICBwaWQ6IHN0YXRlLndvcmtlci5wcm9jZXNzLnBpZCA/PyAtMSxcbiAgICAgIHJlc3RhcnRDb3VudDogc3RhdGUucmVzdGFydENvdW50LFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGNsdXN0ZXIgaXMgY3VycmVudGx5IHN0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyBpc1N0YXJ0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGNsdXN0ZXIgaXMgY3VycmVudGx5IHNodXR0aW5nIGRvd25cbiAgICovXG4gIHB1YmxpYyBpc1NodXRkb3duKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzU2h1dHRpbmdEb3duO1xuICB9XG59XG5cbi8vIFR5cGUtc2FmZSBldmVudCBlbWl0dGVyIGludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBDbHVzdGVyTWFuYWdlckVtaXR0ZXIge1xuICBvbjxLIGV4dGVuZHMga2V5b2YgQ2x1c3Rlck1hbmFnZXJFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogQ2x1c3Rlck1hbmFnZXJFdmVudHNbS10pOiB0aGlzO1xuICBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBDbHVzdGVyTWFuYWdlckV2ZW50cz4oXG4gICAgZXZlbnQ6IEssXG4gICAgLi4uYXJnczogUGFyYW1ldGVyczxDbHVzdGVyTWFuYWdlckV2ZW50c1tLXT5cbiAgKTogYm9vbGVhbjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FeatureFlagConfig, ResolvedFeatureFlagConfig } from '../types';
|
|
2
|
+
export declare class ConfigResolver {
|
|
3
|
+
static resolveConfig(config: Partial<FeatureFlagConfig>): ResolvedFeatureFlagConfig;
|
|
4
|
+
static initializeFlagsmithSDK(config: ResolvedFeatureFlagConfig): void;
|
|
5
|
+
private static getConfigValue;
|
|
6
|
+
private static parseBoolean;
|
|
7
|
+
private static parseNumber;
|
|
8
|
+
static parseEnvKey(envKey: string): {
|
|
9
|
+
prefix: string;
|
|
10
|
+
workspace?: string;
|
|
11
|
+
flag?: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/core/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAE7E,qBAAa,cAAc;IACzB,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,yBAAyB;IA2CnF,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI;IAuBtE,OAAO,CAAC,MAAM,CAAC,cAAc;IAsB7B,OAAO,CAAC,MAAM,CAAC,YAAY;IAW3B,OAAO,CAAC,MAAM,CAAC,WAAW;IAY1B,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;CA4C1F"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConfigResolver = void 0;
|
|
4
|
+
const featureflag_sdk_node_1 = require("@rudderstack/featureflag-sdk-node");
|
|
5
|
+
class ConfigResolver {
|
|
6
|
+
static resolveConfig(config) {
|
|
7
|
+
return {
|
|
8
|
+
provider: this.getConfigValue(config.provider, 'FEATURE_FLAG_PROVIDER', 'local'),
|
|
9
|
+
apiKey: this.getConfigValue(config.apiKey, 'FEATURE_FLAG_API_KEY', undefined),
|
|
10
|
+
enableLocalEvaluation: this.getConfigValue(config.enableLocalEvaluation, 'FEATURE_FLAG_ENABLE_LOCAL_EVALUATION', false, this.parseBoolean),
|
|
11
|
+
enableCache: this.getConfigValue(config.enableCache, 'FEATURE_FLAG_ENABLE_CACHE', true, this.parseBoolean),
|
|
12
|
+
cacheTtlSeconds: this.getConfigValue(config.cacheTtlSeconds, 'FEATURE_FLAG_CACHE_TTL_SECONDS', 60, this.parseNumber),
|
|
13
|
+
timeoutSeconds: this.getConfigValue(config.timeoutSeconds, 'FEATURE_FLAG_TIMEOUT_SECONDS', 60, this.parseNumber),
|
|
14
|
+
retryAttempts: this.getConfigValue(config.retryAttempts, 'FEATURE_FLAG_RETRY_ATTEMPTS', 3, this.parseNumber),
|
|
15
|
+
enableAnalytics: this.getConfigValue(config.enableAnalytics, 'FEATURE_FLAG_ENABLE_ANALYTICS', true, this.parseBoolean),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
static initializeFlagsmithSDK(config) {
|
|
19
|
+
if (config.provider !== 'flagsmith' || !config.apiKey) {
|
|
20
|
+
throw new Error('API key is required for Flagsmith provider. Set it via config.apiKey or FEATURE_FLAG_API_KEY environment variable.');
|
|
21
|
+
}
|
|
22
|
+
(0, featureflag_sdk_node_1.initFeatureFlagClient)({
|
|
23
|
+
provider: {
|
|
24
|
+
type: 'flagsmith',
|
|
25
|
+
apiKey: config.apiKey,
|
|
26
|
+
timeoutInSeconds: config.timeoutSeconds,
|
|
27
|
+
retryAttempts: config.retryAttempts,
|
|
28
|
+
enableLocalEvaluation: config.enableLocalEvaluation,
|
|
29
|
+
enableAnalytics: config.enableAnalytics,
|
|
30
|
+
},
|
|
31
|
+
cache: {
|
|
32
|
+
enabled: config.enableCache,
|
|
33
|
+
ttlInSeconds: config.cacheTtlSeconds,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
static getConfigValue(configValue, envKey, defaultValue, parser) {
|
|
38
|
+
const envValue = process.env[envKey];
|
|
39
|
+
if (envValue !== undefined) {
|
|
40
|
+
if (parser) {
|
|
41
|
+
try {
|
|
42
|
+
return parser(envValue);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Fall back to config/default on parse error
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return envValue;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return configValue !== undefined ? configValue : defaultValue;
|
|
53
|
+
}
|
|
54
|
+
static parseBoolean(value) {
|
|
55
|
+
const lowerValue = value.toLowerCase().trim();
|
|
56
|
+
if (lowerValue === 'true' || lowerValue === '1' || lowerValue === 'yes') {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
if (lowerValue === 'false' || lowerValue === '0' || lowerValue === 'no') {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
throw new Error(`Invalid boolean value: "${value}"`);
|
|
63
|
+
}
|
|
64
|
+
static parseNumber(value) {
|
|
65
|
+
const numValue = Number(value.trim());
|
|
66
|
+
if (Number.isNaN(numValue)) {
|
|
67
|
+
throw new Error(`Invalid number value: "${value}"`);
|
|
68
|
+
}
|
|
69
|
+
return numValue;
|
|
70
|
+
}
|
|
71
|
+
// Utility for parsing environment variables
|
|
72
|
+
// Supports both patterns:
|
|
73
|
+
// - FEATURE_FLAG_LOCAL_ENABLE_FEATURE (global flag with single underscore)
|
|
74
|
+
// - FEATURE_FLAG_LOCAL__workspace123__API__TIMEOUT__MS (workspace flag with double underscore)
|
|
75
|
+
static parseEnvKey(envKey) {
|
|
76
|
+
// Check for workspace-specific pattern first (contains double underscore)
|
|
77
|
+
if (envKey.includes('__')) {
|
|
78
|
+
const parts = envKey.split('__');
|
|
79
|
+
if (parts.length < 3) {
|
|
80
|
+
throw new Error(`Invalid workspace environment key format: "${envKey}". Expected format: PREFIX__WORKSPACE__FLAG`);
|
|
81
|
+
}
|
|
82
|
+
const prefix = parts[0];
|
|
83
|
+
const workspace = parts[1];
|
|
84
|
+
const flag = parts.slice(2).join('__');
|
|
85
|
+
return {
|
|
86
|
+
prefix,
|
|
87
|
+
workspace,
|
|
88
|
+
flag,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Global pattern (single underscore)
|
|
92
|
+
const underscoreIndex = envKey.indexOf('_');
|
|
93
|
+
if (underscoreIndex === -1) {
|
|
94
|
+
throw new Error(`Invalid environment key format: "${envKey}". Expected format: PREFIX_FLAG or PREFIX__WORKSPACE__FLAG`);
|
|
95
|
+
}
|
|
96
|
+
// Find the last part after the prefix
|
|
97
|
+
const prefixParts = envKey.split('_');
|
|
98
|
+
if (prefixParts.length < 4) {
|
|
99
|
+
throw new Error(`Invalid global environment key format: "${envKey}". Expected format: FEATURE_FLAG_LOCAL_FLAG`);
|
|
100
|
+
}
|
|
101
|
+
// For FEATURE_FLAG_LOCAL_FLAG_NAME, prefix is "FEATURE_FLAG_LOCAL", flag is "FLAG_NAME"
|
|
102
|
+
const prefix = prefixParts.slice(0, 3).join('_'); // FEATURE_FLAG_LOCAL
|
|
103
|
+
const flag = prefixParts.slice(3).join('_'); // Everything after
|
|
104
|
+
return {
|
|
105
|
+
prefix,
|
|
106
|
+
flag,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.ConfigResolver = ConfigResolver;
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvY29yZS9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNEVBQTBFO0FBRzFFLE1BQWEsY0FBYztJQUN6QixNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWtDO1FBQ3JELE9BQU87WUFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLHVCQUF1QixFQUFFLE9BQU8sQ0FBQztZQUNoRixNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFNBQVMsQ0FBQztZQUM3RSxxQkFBcUIsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUN4QyxNQUFNLENBQUMscUJBQXFCLEVBQzVCLHNDQUFzQyxFQUN0QyxLQUFLLEVBQ0wsSUFBSSxDQUFDLFlBQVksQ0FDbEI7WUFDRCxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FDOUIsTUFBTSxDQUFDLFdBQVcsRUFDbEIsMkJBQTJCLEVBQzNCLElBQUksRUFDSixJQUFJLENBQUMsWUFBWSxDQUNsQjtZQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUNsQyxNQUFNLENBQUMsZUFBZSxFQUN0QixnQ0FBZ0MsRUFDaEMsRUFBRSxFQUNGLElBQUksQ0FBQyxXQUFXLENBQ2pCO1lBQ0QsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQ2pDLE1BQU0sQ0FBQyxjQUFjLEVBQ3JCLDhCQUE4QixFQUM5QixFQUFFLEVBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FDakI7WUFDRCxhQUFhLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FDaEMsTUFBTSxDQUFDLGFBQWEsRUFDcEIsNkJBQTZCLEVBQzdCLENBQUMsRUFDRCxJQUFJLENBQUMsV0FBVyxDQUNqQjtZQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUNs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SSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO1FBRWhFLE9BQU87WUFDTCxNQUFNO1lBQ04sSUFBSTtTQUNMLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE1SkQsd0NBNEpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5pdEZlYXR1cmVGbGFnQ2xpZW50IH0gZnJvbSAnQHJ1ZGRlcnN0YWNrL2ZlYXR1cmVmbGFnLXNkay1ub2RlJztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZUZsYWdDb25maWcsIFJlc29sdmVkRmVhdHVyZUZsYWdDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdSZXNvbHZlciB7XG4gIHN0YXRpYyByZXNvbHZlQ29uZmlnKGNvbmZpZzogUGFydGlhbDxGZWF0dXJlRmxhZ0NvbmZpZz4pOiBSZXNvbHZlZEZlYXR1cmVGbGFnQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdmlkZXI6IHRoaXMuZ2V0Q29uZmlnVmFsdWUoY29uZmlnLnByb3ZpZGVyLCAnRkVBVFVSRV9GTEFHX1BST1ZJREVSJywgJ2xvY2FsJyksXG4gICAgICBhcGlLZXk6IHRoaXMuZ2V0Q29uZmlnVmFsdWUoY29uZmlnLmFwaUtleSwgJ0ZFQVRVUkVfRkxBR19BUElfS0VZJywgdW5kZWZpbmVkKSxcbiAgICAgIGVuYWJsZUxvY2FsRXZhbHVhdGlvbjogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLmVuYWJsZUxvY2FsRXZhbHVhdGlvbixcbiAgICAgICAgJ0ZFQVRVUkVfRkxBR19FTkFCTEVfTE9DQUxfRVZBTFVBVElPTicsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0aGlzLnBhcnNlQm9vbGVhbixcbiAgICAgICksXG4gICAgICBlbmFibGVDYWNoZTogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLmVuYWJsZUNhY2hlLFxuICAgICAgICAnRkVBVFVSRV9GTEFHX0VOQUJMRV9DQUNIRScsXG4gICAgICAgIHRydWUsXG4gICAgICAgIHRoaXMucGFyc2VCb29sZWFuLFxuICAgICAgKSxcbiAgICAgIGNhY2hlVHRsU2Vjb25kczogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLmNhY2hlVHRsU2Vjb25kcyxcbiAgICAgICAgJ0ZFQVRVUkVfRkxBR19DQUNIRV9UVExfU0VDT05EUycsXG4gICAgICAgIDYwLFxuICAgICAgICB0aGlzLnBhcnNlTnVtYmVyLFxuICAgICAgKSxcbiAgICAgIHRpbWVvdXRTZWNvbmRzOiB0aGlzLmdldENvbmZpZ1ZhbHVlKFxuICAgICAgICBjb25maWcudGltZW91dFNlY29uZHMsXG4gICAgICAgICdGRUFUVVJFX0ZMQUdfVElNRU9VVF9TRUNPTkRTJyxcbiAgICAgICAgNjAsXG4gICAgICAgIHRoaXMucGFyc2VOdW1iZXIsXG4gICAgICApLFxuICAgICAgcmV0cnlBdHRlbXB0czogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLnJldHJ5QXR0ZW1wdHMsXG4gICAgICAgICdGRUFUVVJFX0ZMQUdfUkVUUllfQVRURU1QVFMnLFxuICAgICAgICAzLFxuICAgICAgICB0aGlzLnBhcnNlTnVtYmVyLFxuICAgICAgKSxcbiAgICAgIGVuYWJsZUFuYWx5dGljczogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLmVuYWJsZUFuYWx5dGljcyxcbiAgICAgICAgJ0ZFQVRVUkVfRkxBR19FTkFCTEVfQU5BTFlUSUNTJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5wYXJzZUJvb2xlYW4sXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgaW5pdGlhbGl6ZUZsYWdzbWl0aFNESyhjb25maWc6IFJlc29sdmVkRmVhdHVyZUZsYWdDb25maWcpOiB2b2lkIHtcbiAgICBpZiAoY29uZmlnLnByb3ZpZGVyICE9PSAnZmxhZ3NtaXRoJyB8fCAhY29uZmlnLmFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQVBJIGtleSBpcyByZXF1aXJlZCBmb3IgRmxhZ3NtaXRoIHByb3ZpZGVyLiBTZXQgaXQgdmlhIGNvbmZpZy5hcGlLZXkgb3IgRkVBVFVSRV9GTEFHX0FQSV9LRVkgZW52aXJvbm1lbnQgdmFyaWFibGUuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaW5pdEZlYXR1cmVGbGFnQ2xpZW50KHtcbiAgICAgIHByb3ZpZGVyOiB7XG4gICAgICAgIHR5cGU6ICdmbGFnc21pdGgnLFxuICAgICAgICBhcGlLZXk6IGNvbmZpZy5hcGlLZXksXG4gICAgICAgIHRpbWVvdXRJblNlY29uZHM6IGNvbmZpZy50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgcmV0cnlBdHRlbXB0czogY29uZmlnLnJldHJ5QXR0ZW1wdHMsXG4gICAgICAgIGVuYWJsZUxvY2FsRXZhbHVhdGlvbjogY29uZmlnLmVuYWJsZUxvY2FsRXZhbHVhdGlvbixcbiAgICAgICAgZW5hYmxlQW5hbHl0aWNzOiBjb25maWcuZW5hYmxlQW5hbHl0aWNzLFxuICAgICAgfSxcbiAgICAgIGNhY2hlOiB7XG4gICAgICAgIGVuYWJsZWQ6IGNvbmZpZy5lbmFibGVDYWNoZSxcbiAgICAgICAgdHRsSW5TZWNvbmRzOiBjb25maWcuY2FjaGVUdGxTZWNvbmRzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldENvbmZpZ1ZhbHVlPFQ+KFxuICAgIGNvbmZpZ1ZhbHVlOiBUIHwgdW5kZWZpbmVkLFxuICAgIGVudktleTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogVCxcbiAgICBwYXJzZXI/OiAodmFsdWU6IHN0cmluZykgPT4gVCxcbiAgKTogVCB7XG4gICAgY29uc3QgZW52VmFsdWUgPSBwcm9jZXNzLmVudltlbnZLZXldO1xuICAgIGlmIChlbnZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocGFyc2VyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlcihlbnZWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEZhbGwgYmFjayB0byBjb25maWcvZGVmYXVsdCBvbiBwYXJzZSBlcnJvclxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZW52VmFsdWUgYXMgVDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnVmFsdWUgIT09IHVuZGVmaW5lZCA/IGNvbmZpZ1ZhbHVlIDogZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VCb29sZWFuKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb3dlclZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgaWYgKGxvd2VyVmFsdWUgPT09ICd0cnVlJyB8fCBsb3dlclZhbHVlID09PSAnMScgfHwgbG93ZXJWYWx1ZSA9PT0gJ3llcycpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobG93ZXJWYWx1ZSA9PT0gJ2ZhbHNlJyB8fCBsb3dlclZhbHVlID09PSAnMCcgfHwgbG93ZXJWYWx1ZSA9PT0gJ25vJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYm9vbGVhbiB2YWx1ZTogXCIke3ZhbHVlfVwiYCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZU51bWJlcih2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBudW1WYWx1ZSA9IE51bWJlcih2YWx1ZS50cmltKCkpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4obnVtVmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbnVtYmVyIHZhbHVlOiBcIiR7dmFsdWV9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bVZhbHVlO1xuICB9XG5cbiAgLy8gVXRpbGl0eSBmb3IgcGFyc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgLy8gU3VwcG9ydHMgYm90aCBwYXR0ZXJuczpcbiAgLy8gLSBGRUFUVVJFX0ZMQUdfTE9DQUxfRU5BQkxFX0ZFQVRVUkUgKGdsb2JhbCBmbGFnIHdpdGggc2luZ2xlIHVuZGVyc2NvcmUpXG4gIC8vIC0gRkVBVFVSRV9GTEFHX0xPQ0FMX193b3Jrc3BhY2UxMjNfX0FQSV9fVElNRU9VVF9fTVMgKHdvcmtzcGFjZSBmbGFnIHdpdGggZG91YmxlIHVuZGVyc2NvcmUpXG4gIHN0YXRpYyBwYXJzZUVudktleShlbnZLZXk6IHN0cmluZyk6IHsgcHJlZml4OiBzdHJpbmc7IHdvcmtzcGFjZT86IHN0cmluZzsgZmxhZz86IHN0cmluZyB9IHtcbiAgICAvLyBDaGVjayBmb3Igd29ya3NwYWNlLXNwZWNpZmljIHBhdHRlcm4gZmlyc3QgKGNvbnRhaW5zIGRvdWJsZSB1bmRlcnNjb3JlKVxuICAgIGlmIChlbnZLZXkuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gZW52S2V5LnNwbGl0KCdfXycpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHdvcmtzcGFjZSBlbnZpcm9ubWVudCBrZXkgZm9ybWF0OiBcIiR7ZW52S2V5fVwiLiBFeHBlY3RlZCBmb3JtYXQ6IFBSRUZJWF9fV09SS1NQQUNFX19GTEFHYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByZWZpeCA9IHBhcnRzWzBdO1xuICAgICAgY29uc3Qgd29ya3NwYWNlID0gcGFydHNbMV07XG4gICAgICBjb25zdCBmbGFnID0gcGFydHMuc2xpY2UoMikuam9pbignX18nKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgd29ya3NwYWNlLFxuICAgICAgICBmbGFnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBHbG9iYWwgcGF0dGVybiAoc2luZ2xlIHVuZGVyc2NvcmUpXG4gICAgY29uc3QgdW5kZXJzY29yZUluZGV4ID0gZW52S2V5LmluZGV4T2YoJ18nKTtcbiAgICBpZiAodW5kZXJzY29yZUluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBlbnZpcm9ubWVudCBrZXkgZm9ybWF0OiBcIiR7ZW52S2V5fVwiLiBFeHBlY3RlZCBmb3JtYXQ6IFBSRUZJWF9GTEFHIG9yIFBSRUZJWF9fV09SS1NQQUNFX19GTEFHYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgbGFzdCBwYXJ0IGFmdGVyIHRoZSBwcmVmaXhcbiAgICBjb25zdCBwcmVmaXhQYXJ0cyA9IGVudktleS5zcGxpdCgnXycpO1xuICAgIGlmIChwcmVmaXhQYXJ0cy5sZW5ndGggPCA0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGdsb2JhbCBlbnZpcm9ubWVudCBrZXkgZm9ybWF0OiBcIiR7ZW52S2V5fVwiLiBFeHBlY3RlZCBmb3JtYXQ6IEZFQVRVUkVfRkxBR19MT0NBTF9GTEFHYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRm9yIEZFQVRVUkVfRkxBR19MT0NBTF9GTEFHX05BTUUsIHByZWZpeCBpcyBcIkZFQVRVUkVfRkxBR19MT0NBTFwiLCBmbGFnIGlzIFwiRkxBR19OQU1FXCJcbiAgICBjb25zdCBwcmVmaXggPSBwcmVmaXhQYXJ0cy5zbGljZSgwLCAzKS5qb2luKCdfJyk7IC8vIEZFQVRVUkVfRkxBR19MT0NBTFxuICAgIGNvbnN0IGZsYWcgPSBwcmVmaXhQYXJ0cy5zbGljZSgzKS5qb2luKCdfJyk7IC8vIEV2ZXJ5dGhpbmcgYWZ0ZXJcblxuICAgIHJldHVybiB7XG4gICAgICBwcmVmaXgsXG4gICAgICBmbGFnLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FeatureFlagUtils = exports.ConfigResolver = exports.FeatureFlagService = void 0;
|
|
4
|
+
var service_1 = require("./service");
|
|
5
|
+
Object.defineProperty(exports, "FeatureFlagService", { enumerable: true, get: function () { return service_1.FeatureFlagService; } });
|
|
6
|
+
var config_1 = require("./config");
|
|
7
|
+
Object.defineProperty(exports, "ConfigResolver", { enumerable: true, get: function () { return config_1.ConfigResolver; } });
|
|
8
|
+
var utils_1 = require("./utils");
|
|
9
|
+
Object.defineProperty(exports, "FeatureFlagUtils", { enumerable: true, get: function () { return utils_1.FeatureFlagUtils; } });
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmVhdHVyZS1mbGFncy9jb3JlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUErQztBQUF0Qyw2R0FBQSxrQkFBa0IsT0FBQTtBQUMzQixtQ0FBMEM7QUFBakMsd0dBQUEsY0FBYyxPQUFBO0FBQ3ZCLGlDQUEyQztBQUFsQyx5R0FBQSxnQkFBZ0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEZlYXR1cmVGbGFnU2VydmljZSB9IGZyb20gJy4vc2VydmljZSc7XG5leHBvcnQgeyBDb25maWdSZXNvbHZlciB9IGZyb20gJy4vY29uZmlnJztcbmV4cG9ydCB7IEZlYXR1cmVGbGFnVXRpbHMgfSBmcm9tICcuL3V0aWxzJztcbiJdfQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FeatureFlagConfig, FeatureFlagUser, FeatureFlagResponse, FeatureFlagDefinition, IFeatureFlagService, IFeatureFlagRegistry } from '../types';
|
|
2
|
+
import { ErrorBehaviour } from '../types';
|
|
3
|
+
export declare class FeatureFlagService implements IFeatureFlagService {
|
|
4
|
+
private provider;
|
|
5
|
+
private flagRegistry;
|
|
6
|
+
constructor(registry?: IFeatureFlagRegistry);
|
|
7
|
+
static create(config?: Partial<FeatureFlagConfig>, flags?: FeatureFlagDefinition[]): Promise<FeatureFlagService>;
|
|
8
|
+
static create(config?: Partial<FeatureFlagConfig>, registry?: IFeatureFlagRegistry): Promise<FeatureFlagService>;
|
|
9
|
+
initialize(config?: Partial<FeatureFlagConfig>): Promise<void>;
|
|
10
|
+
isFeatureEnabled(user: FeatureFlagUser, flagName: string, onErrorBehaviour?: ErrorBehaviour): Promise<FeatureFlagResponse>;
|
|
11
|
+
isFeatureEnabledLatest(user: FeatureFlagUser, flagName: string, onErrorBehaviour?: ErrorBehaviour): Promise<FeatureFlagResponse>;
|
|
12
|
+
getFeatureValue(user: FeatureFlagUser, flagName: string, onErrorBehaviour?: ErrorBehaviour): Promise<FeatureFlagResponse>;
|
|
13
|
+
getFeatureValueLatest(user: FeatureFlagUser, flagName: string, onErrorBehaviour?: ErrorBehaviour): Promise<FeatureFlagResponse>;
|
|
14
|
+
registerFlags(flags: FeatureFlagDefinition[]): void;
|
|
15
|
+
getRegisteredFlag(key: string): FeatureFlagDefinition | undefined;
|
|
16
|
+
private processProviderResult;
|
|
17
|
+
private createDefaultResponse;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/core/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EAEnB,oBAAoB,EAErB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAM1C,qBAAa,kBAAmB,YAAW,mBAAmB;IAC5D,OAAO,CAAC,QAAQ,CAAqC;IAErD,OAAO,CAAC,YAAY,CAAuB;gBAE/B,QAAQ,CAAC,EAAE,oBAAoB;WAOvB,MAAM,CACxB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,KAAK,CAAC,EAAE,qBAAqB,EAAE,GAC9B,OAAO,CAAC,kBAAkB,CAAC;WACV,MAAM,CACxB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,kBAAkB,CAAC;IAyBjB,UAAU,CAAC,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlE,gBAAgB,CAC3B,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,GAAE,cAAiD,GAClE,OAAO,CAAC,mBAAmB,CAAC;IAKlB,sBAAsB,CACjC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,GAAE,cAAiD,GAClE,OAAO,CAAC,mBAAmB,CAAC;IAKlB,eAAe,CAC1B,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,GAAE,cAAiD,GAClE,OAAO,CAAC,mBAAmB,CAAC;IAKlB,qBAAqB,CAChC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,GAAE,cAAiD,GAClE,OAAO,CAAC,mBAAmB,CAAC;IAMxB,aAAa,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,IAAI;IAInD,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAIxE,OAAO,CAAC,qBAAqB;IAqC7B,OAAO,CAAC,qBAAqB;CAU9B"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FeatureFlagService = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const registry_1 = require("../flags/registry");
|
|
6
|
+
const factory_1 = require("../providers/factory");
|
|
7
|
+
const config_1 = require("./config");
|
|
8
|
+
const defaults_1 = require("../flags/defaults");
|
|
9
|
+
class FeatureFlagService {
|
|
10
|
+
constructor(registry) {
|
|
11
|
+
this.provider = null;
|
|
12
|
+
this.flagRegistry = registry || new registry_1.FeatureFlagRegistry();
|
|
13
|
+
// Load default flags
|
|
14
|
+
this.flagRegistry.register(defaults_1.DEFAULT_FLAGS);
|
|
15
|
+
}
|
|
16
|
+
static async create(config = {}, flagsOrRegistry) {
|
|
17
|
+
let registry;
|
|
18
|
+
if (flagsOrRegistry) {
|
|
19
|
+
// Check if it's a registry (has register method) or flag definitions array
|
|
20
|
+
if (Array.isArray(flagsOrRegistry)) {
|
|
21
|
+
// It's an array of flag definitions
|
|
22
|
+
registry = new registry_1.FeatureFlagRegistry();
|
|
23
|
+
registry.register(flagsOrRegistry);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// It's a registry instance
|
|
27
|
+
registry = flagsOrRegistry;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const service = new FeatureFlagService(registry);
|
|
31
|
+
await service.initialize(config);
|
|
32
|
+
return service;
|
|
33
|
+
}
|
|
34
|
+
// Strategy Pattern: Initialize provider once, use polymorphism
|
|
35
|
+
async initialize(config = {}) {
|
|
36
|
+
const resolvedConfig = config_1.ConfigResolver.resolveConfig(config);
|
|
37
|
+
// Factory creates the appropriate provider - NO CONDITIONALS
|
|
38
|
+
const factory = new factory_1.FeatureFlagProviderFactory(this.flagRegistry);
|
|
39
|
+
this.provider = factory.create(resolvedConfig);
|
|
40
|
+
// Initialize the provider
|
|
41
|
+
await this.provider.initialize();
|
|
42
|
+
}
|
|
43
|
+
async isFeatureEnabled(user, flagName, onErrorBehaviour = types_1.ErrorBehaviour.RETURN_RICH_ERROR) {
|
|
44
|
+
const providerResult = await this.provider.isFeatureEnabled(user, flagName);
|
|
45
|
+
return this.processProviderResult(providerResult, flagName, onErrorBehaviour);
|
|
46
|
+
}
|
|
47
|
+
async isFeatureEnabledLatest(user, flagName, onErrorBehaviour = types_1.ErrorBehaviour.RETURN_RICH_ERROR) {
|
|
48
|
+
const providerResult = await this.provider.isFeatureEnabledLatest(user, flagName);
|
|
49
|
+
return this.processProviderResult(providerResult, flagName, onErrorBehaviour);
|
|
50
|
+
}
|
|
51
|
+
async getFeatureValue(user, flagName, onErrorBehaviour = types_1.ErrorBehaviour.RETURN_RICH_ERROR) {
|
|
52
|
+
const providerResult = await this.provider.getFeatureValue(user, flagName);
|
|
53
|
+
return this.processProviderResult(providerResult, flagName, onErrorBehaviour);
|
|
54
|
+
}
|
|
55
|
+
async getFeatureValueLatest(user, flagName, onErrorBehaviour = types_1.ErrorBehaviour.RETURN_RICH_ERROR) {
|
|
56
|
+
const providerResult = await this.provider.getFeatureValueLatest(user, flagName);
|
|
57
|
+
return this.processProviderResult(providerResult, flagName, onErrorBehaviour);
|
|
58
|
+
}
|
|
59
|
+
// Registry methods
|
|
60
|
+
registerFlags(flags) {
|
|
61
|
+
this.flagRegistry.register(flags);
|
|
62
|
+
}
|
|
63
|
+
getRegisteredFlag(key) {
|
|
64
|
+
return this.flagRegistry.get(key);
|
|
65
|
+
}
|
|
66
|
+
processProviderResult(providerResult, flagName, onErrorBehaviour) {
|
|
67
|
+
if (providerResult.error) {
|
|
68
|
+
switch (onErrorBehaviour) {
|
|
69
|
+
case types_1.ErrorBehaviour.THROW_ERROR:
|
|
70
|
+
throw providerResult.error;
|
|
71
|
+
case types_1.ErrorBehaviour.RETURN_RICH_ERROR:
|
|
72
|
+
// Return the rich error response as-is with isDefault = false
|
|
73
|
+
return {
|
|
74
|
+
...providerResult,
|
|
75
|
+
isDefault: false,
|
|
76
|
+
};
|
|
77
|
+
case types_1.ErrorBehaviour.RETURN_DEFAULT:
|
|
78
|
+
// Return default value from registry
|
|
79
|
+
return this.createDefaultResponse(flagName, providerResult);
|
|
80
|
+
default:
|
|
81
|
+
// Default to RETURN_RICH_ERROR behavior
|
|
82
|
+
return {
|
|
83
|
+
...providerResult,
|
|
84
|
+
isDefault: false,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Success case - pass through rich provider data
|
|
89
|
+
return {
|
|
90
|
+
...providerResult,
|
|
91
|
+
isDefault: false,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
createDefaultResponse(flagName, errorResult) {
|
|
95
|
+
const defaultValue = this.flagRegistry.getDefaultValue(flagName);
|
|
96
|
+
return {
|
|
97
|
+
name: flagName,
|
|
98
|
+
enabled: typeof defaultValue === 'boolean' ? defaultValue : Boolean(defaultValue),
|
|
99
|
+
value: defaultValue,
|
|
100
|
+
error: errorResult.error,
|
|
101
|
+
isDefault: true,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.FeatureFlagService = FeatureFlagService;
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mZWF0dXJlLWZsYWdzL2NvcmUvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFVQSxvQ0FBMEM7QUFDMUMsZ0RBQXdEO0FBQ3hELGtEQUFrRTtBQUNsRSxxQ0FBMEM7QUFDMUMsZ0RBQWtEO0FBRWxELE1BQWEsa0JBQWtCO0lBSzdCLFlBQVksUUFBK0I7UUFKbkMsYUFBUSxHQUFnQyxJQUFJLENBQUM7UUFLbkQsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLElBQUksSUFBSSw4QkFBbUIsRUFBRSxDQUFDO1FBQzFELHFCQUFxQjtRQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyx3QkFBYSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQVdNLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUN4QixTQUFxQyxFQUFFLEVBQ3ZDLGVBQWdFO1FBRWhFLElBQUksUUFBMEMsQ0FBQztRQUUvQyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLDJFQUEyRTtZQUMzRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsb0NBQW9DO2dCQUNwQyxRQUFRLEdBQUcsSUFBSSw4QkFBbUIsRUFBRSxDQUFDO2dCQUNyQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7aUJBQU0sQ0FBQztnQkFDTiwyQkFBMkI7Z0JBQzNCLFFBQVEsR0FBRyxlQUFlLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsK0RBQStEO0lBQ3hELEtBQUssQ0FBQyxV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QyxDQUFDO2dCQUU5RDtvQkFDRSx3Q0FBd0M7b0JBQ3hDLE9BQU87d0JBQ0wsR0FBRyxjQUFjO3dCQUNqQixTQUFTLEVBQUUsS0FBSztxQkFDakIsQ0FBQztZQUNOLENBQUM7UUFDSCxDQUFDO1FBRUQsaURBQWlEO1FBQ2pELE9BQU87WUFDTCxHQUFHLGNBQWM7WUFDakIsU0FBUyxFQUFFLEtBQUs7U0FDakIsQ0FBQztJQUNKLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxRQUFnQixFQUFFLFdBQXlCO1FBQ3ZFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLE9BQU87WUFDTCxJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxPQUFPLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUNqRixLQUFLLEVBQUUsWUFBWTtZQUNuQixLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUs7WUFDeEIsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQW5KRCxnREFtSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEZlYXR1cmVGbGFnQ29uZmlnLFxuICBGZWF0dXJlRmxhZ1VzZXIsXG4gIEZlYXR1cmVGbGFnUmVzcG9uc2UsXG4gIEZlYXR1cmVGbGFnRGVmaW5pdGlvbixcbiAgSUZlYXR1cmVGbGFnU2VydmljZSxcbiAgSUZlYXR1cmVGbGFnUHJvdmlkZXIsXG4gIElGZWF0dXJlRmxhZ1JlZ2lzdHJ5LFxuICBGZWF0dXJlVmFsdWUsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEVycm9yQmVoYXZpb3VyIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgRmVhdHVyZUZsYWdSZWdpc3RyeSB9IGZyb20gJy4uL2ZsYWdzL3JlZ2lzdHJ5JztcbmltcG9ydCB7IEZlYXR1cmVGbGFnUHJvdmlkZXJGYWN0b3J5IH0gZnJvbSAnLi4vcHJvdmlkZXJzL2ZhY3RvcnknO1xuaW1wb3J0IHsgQ29uZmlnUmVzb2x2ZXIgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBERUZBVUxUX0ZMQUdTIH0gZnJvbSAnLi4vZmxhZ3MvZGVmYXVsdHMnO1xuXG5leHBvcnQgY2xhc3MgRmVhdHVyZUZsYWdTZXJ2aWNlIGltcGxlbWVudHMgSUZlYXR1cmVGbGFnU2VydmljZSB7XG4gIHByaXZhdGUgcHJvdmlkZXI6IElGZWF0dXJlRmxhZ1Byb3ZpZGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBmbGFnUmVnaXN0cnk6IElGZWF0dXJlRmxhZ1JlZ2lzdHJ5O1xuXG4gIGNvbnN0cnVjdG9yKHJlZ2lzdHJ5PzogSUZlYXR1cmVGbGFnUmVnaXN0cnkpIHtcbiAgICB0aGlzLmZsYWdSZWdpc3RyeSA9IHJlZ2lzdHJ5IHx8IG5ldyBGZWF0dXJlRmxhZ1JlZ2lzdHJ5KCk7XG4gICAgLy8gTG9hZCBkZWZhdWx0IGZsYWdzXG4gICAgdGhpcy5mbGFnUmVnaXN0cnkucmVnaXN0ZXIoREVGQVVMVF9GTEFHUyk7XG4gIH1cblxuICAvLyBGYWN0b3J5IG1ldGhvZCBvdmVybG9hZHM6IENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBzZXJ2aWNlIGluIG9uZSBzdGVwXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlKFxuICAgIGNvbmZpZz86IFBhcnRpYWw8RmVhdHVyZUZsYWdDb25maWc+LFxuICAgIGZsYWdzPzogRmVhdHVyZUZsYWdEZWZpbml0aW9uW10sXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdTZXJ2aWNlPjtcbiAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGUoXG4gICAgY29uZmlnPzogUGFydGlhbDxGZWF0dXJlRmxhZ0NvbmZpZz4sXG4gICAgcmVnaXN0cnk/OiBJRmVhdHVyZUZsYWdSZWdpc3RyeSxcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1NlcnZpY2U+O1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZShcbiAgICBjb25maWc6IFBhcnRpYWw8RmVhdHVyZUZsYWdDb25maWc+ID0ge30sXG4gICAgZmxhZ3NPclJlZ2lzdHJ5PzogRmVhdHVyZUZsYWdEZWZpbml0aW9uW10gfCBJRmVhdHVyZUZsYWdSZWdpc3RyeSxcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1NlcnZpY2U+IHtcbiAgICBsZXQgcmVnaXN0cnk6IElGZWF0dXJlRmxhZ1JlZ2lzdHJ5IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGZsYWdzT3JSZWdpc3RyeSkge1xuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIHJlZ2lzdHJ5IChoYXMgcmVnaXN0ZXIgbWV0aG9kKSBvciBmbGFnIGRlZmluaXRpb25zIGFycmF5XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmbGFnc09yUmVnaXN0cnkpKSB7XG4gICAgICAgIC8vIEl0J3MgYW4gYXJyYXkgb2YgZmxhZyBkZWZpbml0aW9uc1xuICAgICAgICByZWdpc3RyeSA9IG5ldyBGZWF0dXJlRmxhZ1JlZ2lzdHJ5KCk7XG4gICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKGZsYWdzT3JSZWdpc3RyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJdCdzIGEgcmVnaXN0cnkgaW5zdGFuY2VcbiAgICAgICAgcmVnaXN0cnkgPSBmbGFnc09yUmVnaXN0cnk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IG5ldyBGZWF0dXJlRmxhZ1NlcnZpY2UocmVnaXN0cnkpO1xuICAgIGF3YWl0IHNlcnZpY2UuaW5pdGlhbGl6ZShjb25maWcpO1xuICAgIHJldHVybiBzZXJ2aWNlO1xuICB9XG5cbiAgLy8gU3RyYXRlZ3kgUGF0dGVybjogSW5pdGlhbGl6ZSBwcm92aWRlciBvbmNlLCB1c2UgcG9seW1vcnBoaXNtXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKGNvbmZpZzogUGFydGlhbDxGZWF0dXJlRmxhZ0NvbmZpZz4gPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnID0gQ29uZmlnUmVzb2x2ZXIucmVzb2x2ZUNvbmZpZyhjb25maWcpO1xuXG4gICAgLy8gRmFjdG9yeSBjcmVhdGVzIHRoZSBhcHByb3ByaWF0ZSBwcm92aWRlciAtIE5PIENPTkRJVElPTkFMU1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgRmVhdHVyZUZsYWdQcm92aWRlckZhY3RvcnkodGhpcy5mbGFnUmVnaXN0cnkpO1xuICAgIHRoaXMucHJvdmlkZXIgPSBmYWN0b3J5LmNyZWF0ZShyZXNvbHZlZENvbmZpZyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBwcm92aWRlclxuICAgIGF3YWl0IHRoaXMucHJvdmlkZXIuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGlzRmVhdHVyZUVuYWJsZWQoXG4gICAgdXNlcjogRmVhdHVyZUZsYWdVc2VyLFxuICAgIGZsYWdOYW1lOiBzdHJpbmcsXG4gICAgb25FcnJvckJlaGF2aW91cjogRXJyb3JCZWhhdmlvdXIgPSBFcnJvckJlaGF2aW91ci5SRVRVUk5fUklDSF9FUlJPUixcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvdmlkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLnByb3ZpZGVyIS5pc0ZlYXR1cmVFbmFibGVkKHVzZXIsIGZsYWdOYW1lKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzUHJvdmlkZXJSZXN1bHQocHJvdmlkZXJSZXN1bHQsIGZsYWdOYW1lLCBvbkVycm9yQmVoYXZpb3VyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpc0ZlYXR1cmVFbmFibGVkTGF0ZXN0KFxuICAgIHVzZXI6IEZlYXR1cmVGbGFnVXNlcixcbiAgICBmbGFnTmFtZTogc3RyaW5nLFxuICAgIG9uRXJyb3JCZWhhdmlvdXI6IEVycm9yQmVoYXZpb3VyID0gRXJyb3JCZWhhdmlvdXIuUkVUVVJOX1JJQ0hfRVJST1IsXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3ZpZGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm92aWRlciEuaXNGZWF0dXJlRW5hYmxlZExhdGVzdCh1c2VyLCBmbGFnTmFtZSk7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Byb3ZpZGVyUmVzdWx0KHByb3ZpZGVyUmVzdWx0LCBmbGFnTmFtZSwgb25FcnJvckJlaGF2aW91cik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RmVhdHVyZVZhbHVlKFxuICAgIHVzZXI6IEZlYXR1cmVGbGFnVXNlcixcbiAgICBmbGFnTmFtZTogc3RyaW5nLFxuICAgIG9uRXJyb3JCZWhhdmlvdXI6IEVycm9yQmVoYXZpb3VyID0gRXJyb3JCZWhhdmlvdXIuUkVUVVJOX1JJQ0hfRVJST1IsXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3ZpZGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm92aWRlciEuZ2V0RmVhdHVyZVZhbHVlKHVzZXIsIGZsYWdOYW1lKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzUHJvdmlkZXJSZXN1bHQocHJvdmlkZXJSZXN1bHQsIGZsYWdOYW1lLCBvbkVycm9yQmVoYXZpb3VyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRGZWF0dXJlVmFsdWVMYXRlc3QoXG4gICAgdXNlcjogRmVhdHVyZUZsYWdVc2VyLFxuICAgIGZsYWdOYW1lOiBzdHJpbmcsXG4gICAgb25FcnJvckJlaGF2aW91cjogRXJyb3JCZWhhdmlvdXIgPSBFcnJvckJlaGF2aW91ci5SRVRVUk5fUklDSF9FUlJPUixcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvdmlkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLnByb3ZpZGVyIS5nZXRGZWF0dXJlVmFsdWVMYXRlc3QodXNlciwgZmxhZ05hbWUpO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NQcm92aWRlclJlc3VsdChwcm92aWRlclJlc3VsdCwgZmxhZ05hbWUsIG9uRXJyb3JCZWhhdmlvdXIpO1xuICB9XG5cbiAgLy8gUmVnaXN0cnkgbWV0aG9kc1xuICBwdWJsaWMgcmVnaXN0ZXJGbGFncyhmbGFnczogRmVhdHVyZUZsYWdEZWZpbml0aW9uW10pOiB2b2lkIHtcbiAgICB0aGlzLmZsYWdSZWdpc3RyeS5yZWdpc3RlcihmbGFncyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVnaXN0ZXJlZEZsYWcoa2V5OiBzdHJpbmcpOiBGZWF0dXJlRmxhZ0RlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZsYWdSZWdpc3RyeS5nZXQoa2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1Byb3ZpZGVyUmVzdWx0KFxuICAgIHByb3ZpZGVyUmVzdWx0OiBGZWF0dXJlVmFsdWUsXG4gICAgZmxhZ05hbWU6IHN0cmluZyxcbiAgICBvbkVycm9yQmVoYXZpb3VyOiBFcnJvckJlaGF2aW91cixcbiAgKTogRmVhdHVyZUZsYWdSZXNwb25zZSB7XG4gICAgaWYgKHByb3ZpZGVyUmVzdWx0LmVycm9yKSB7XG4gICAgICBzd2l0Y2ggKG9uRXJyb3JCZWhhdmlvdXIpIHtcbiAgICAgICAgY2FzZSBFcnJvckJlaGF2aW91ci5USFJPV19FUlJPUjpcbiAgICAgICAgICB0aHJvdyBwcm92aWRlclJlc3VsdC5lcnJvcjtcblxuICAgICAgICBjYXNlIEVycm9yQmVoYXZpb3VyLlJFVFVSTl9SSUNIX0VSUk9SOlxuICAgICAgICAgIC8vIFJldHVybiB0aGUgcmljaCBlcnJvciByZXNwb25zZSBhcy1pcyB3aXRoIGlzRGVmYXVsdCA9IGZhbHNlXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnByb3ZpZGVyUmVzdWx0LFxuICAgICAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgRXJyb3JCZWhhdmlvdXIuUkVUVVJOX0RFRkFVTFQ6XG4gICAgICAgICAgLy8gUmV0dXJuIGRlZmF1bHQgdmFsdWUgZnJvbSByZWdpc3RyeVxuICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURlZmF1bHRSZXNwb25zZShmbGFnTmFtZSwgcHJvdmlkZXJSZXN1bHQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gRGVmYXVsdCB0byBSRVRVUk5fUklDSF9FUlJPUiBiZWhhdmlvclxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wcm92aWRlclJlc3VsdCxcbiAgICAgICAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdWNjZXNzIGNhc2UgLSBwYXNzIHRocm91Z2ggcmljaCBwcm92aWRlciBkYXRhXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnByb3ZpZGVyUmVzdWx0LFxuICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZWZhdWx0UmVzcG9uc2UoZmxhZ05hbWU6IHN0cmluZywgZXJyb3JSZXN1bHQ6IEZlYXR1cmVWYWx1ZSk6IEZlYXR1cmVGbGFnUmVzcG9uc2Uge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZmxhZ1JlZ2lzdHJ5LmdldERlZmF1bHRWYWx1ZShmbGFnTmFtZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGZsYWdOYW1lLFxuICAgICAgZW5hYmxlZDogdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Jvb2xlYW4nID8gZGVmYXVsdFZhbHVlIDogQm9vbGVhbihkZWZhdWx0VmFsdWUpLFxuICAgICAgdmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICAgIGVycm9yOiBlcnJvclJlc3VsdC5lcnJvcixcbiAgICAgIGlzRGVmYXVsdDogdHJ1ZSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FeatureFlagDefinition } from '../types';
|
|
2
|
+
export declare class FeatureFlagUtils {
|
|
3
|
+
static normalizeKey(key: string): string;
|
|
4
|
+
static validateDefinition(definition: FeatureFlagDefinition): void;
|
|
5
|
+
static createWorkspaceEnvKey(flagName: string, workspaceId: string): string;
|
|
6
|
+
static createGlobalEnvKey(flagName: string): string;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/core/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEtD,qBAAa,gBAAgB;IAC3B,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIxC,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI;IA0BlE,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAK3E,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAIpD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FeatureFlagUtils = void 0;
|
|
4
|
+
class FeatureFlagUtils {
|
|
5
|
+
static normalizeKey(key) {
|
|
6
|
+
return key.toLowerCase().replace(/[^a-z0-9-_]/g, '-');
|
|
7
|
+
}
|
|
8
|
+
static validateDefinition(definition) {
|
|
9
|
+
if (!definition.key || typeof definition.key !== 'string') {
|
|
10
|
+
throw new Error('Flag definition must have a valid key');
|
|
11
|
+
}
|
|
12
|
+
if (!definition.name || typeof definition.name !== 'string') {
|
|
13
|
+
throw new Error('Flag definition must have a valid name');
|
|
14
|
+
}
|
|
15
|
+
if (!definition.description || typeof definition.description !== 'string') {
|
|
16
|
+
throw new Error('Flag definition must have a valid description');
|
|
17
|
+
}
|
|
18
|
+
if (definition.defaultValue === undefined) {
|
|
19
|
+
throw new Error('Flag definition must have a defaultValue');
|
|
20
|
+
}
|
|
21
|
+
if (!['boolean', 'string', 'number'].includes(definition.type)) {
|
|
22
|
+
throw new Error('Flag definition type must be boolean, string, or number');
|
|
23
|
+
}
|
|
24
|
+
// Validate defaultValue matches type
|
|
25
|
+
const actualType = typeof definition.defaultValue;
|
|
26
|
+
if (actualType !== definition.type) {
|
|
27
|
+
throw new Error(`Flag defaultValue type (${actualType}) does not match declared type (${definition.type})`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
static createWorkspaceEnvKey(flagName, workspaceId) {
|
|
31
|
+
const normalizedFlag = flagName.toUpperCase().replace(/-/g, '_');
|
|
32
|
+
return `FEATURE_FLAG_LOCAL__${workspaceId}__${normalizedFlag}`;
|
|
33
|
+
}
|
|
34
|
+
static createGlobalEnvKey(flagName) {
|
|
35
|
+
const normalizedFlag = flagName.toUpperCase().replace(/-/g, '_');
|
|
36
|
+
return `FEATURE_FLAG_LOCAL_${normalizedFlag}`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.FeatureFlagUtils = FeatureFlagUtils;
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmVhdHVyZS1mbGFncy9jb3JlL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQWEsZ0JBQWdCO0lBQzNCLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBVztRQUM3QixPQUFPLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsVUFBaUM7UUFDekQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksT0FBTyxVQUFVLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFELE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVELE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLElBQUksT0FBTyxVQUFVLENBQUMsV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCxxQ0FBcUM7UUFDckMsTUFBTSxVQUFVLEdBQUcsT0FBTyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQ2xELElBQUksVUFBVSxLQUFLLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUNiLDJCQUEyQixVQUFVLG1DQUFtQyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQzNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxRQUFnQixFQUFFLFdBQW1CO1FBQ2hFLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sdUJBQXVCLFdBQVcsS0FBSyxjQUFjLEVBQUUsQ0FBQztJQUNqRSxDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQWdCO1FBQ3hDLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sc0JBQXNCLGNBQWMsRUFBRSxDQUFDO0lBQ2hELENBQUM7Q0FDRjtBQXhDRCw0Q0F3Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnRGVmaW5pdGlvbiB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEZlYXR1cmVGbGFnVXRpbHMge1xuICBzdGF0aWMgbm9ybWFsaXplS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktX10vZywgJy0nKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZURlZmluaXRpb24oZGVmaW5pdGlvbjogRmVhdHVyZUZsYWdEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgaWYgKCFkZWZpbml0aW9uLmtleSB8fCB0eXBlb2YgZGVmaW5pdGlvbi5rZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZsYWcgZGVmaW5pdGlvbiBtdXN0IGhhdmUgYSB2YWxpZCBrZXknKTtcbiAgICB9XG4gICAgaWYgKCFkZWZpbml0aW9uLm5hbWUgfHwgdHlwZW9mIGRlZmluaXRpb24ubmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmxhZyBkZWZpbml0aW9uIG11c3QgaGF2ZSBhIHZhbGlkIG5hbWUnKTtcbiAgICB9XG4gICAgaWYgKCFkZWZpbml0aW9uLmRlc2NyaXB0aW9uIHx8IHR5cGVvZiBkZWZpbml0aW9uLmRlc2NyaXB0aW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGFnIGRlZmluaXRpb24gbXVzdCBoYXZlIGEgdmFsaWQgZGVzY3JpcHRpb24nKTtcbiAgICB9XG4gICAgaWYgKGRlZmluaXRpb24uZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmxhZyBkZWZpbml0aW9uIG11c3QgaGF2ZSBhIGRlZmF1bHRWYWx1ZScpO1xuICAgIH1cbiAgICBpZiAoIVsnYm9vbGVhbicsICdzdHJpbmcnLCAnbnVtYmVyJ10uaW5jbHVkZXMoZGVmaW5pdGlvbi50eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbGFnIGRlZmluaXRpb24gdHlwZSBtdXN0IGJlIGJvb2xlYW4sIHN0cmluZywgb3IgbnVtYmVyJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZGVmYXVsdFZhbHVlIG1hdGNoZXMgdHlwZVxuICAgIGNvbnN0IGFjdHVhbFR5cGUgPSB0eXBlb2YgZGVmaW5pdGlvbi5kZWZhdWx0VmFsdWU7XG4gICAgaWYgKGFjdHVhbFR5cGUgIT09IGRlZmluaXRpb24udHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmxhZyBkZWZhdWx0VmFsdWUgdHlwZSAoJHthY3R1YWxUeXBlfSkgZG9lcyBub3QgbWF0Y2ggZGVjbGFyZWQgdHlwZSAoJHtkZWZpbml0aW9uLnR5cGV9KWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVXb3Jrc3BhY2VFbnZLZXkoZmxhZ05hbWU6IHN0cmluZywgd29ya3NwYWNlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZsYWcgPSBmbGFnTmFtZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoLy0vZywgJ18nKTtcbiAgICByZXR1cm4gYEZFQVRVUkVfRkxBR19MT0NBTF9fJHt3b3Jrc3BhY2VJZH1fXyR7bm9ybWFsaXplZEZsYWd9YDtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVHbG9iYWxFbnZLZXkoZmxhZ05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZsYWcgPSBmbGFnTmFtZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoLy0vZywgJ18nKTtcbiAgICByZXR1cm4gYEZFQVRVUkVfRkxBR19MT0NBTF8ke25vcm1hbGl6ZWRGbGFnfWA7XG4gIH1cbn1cbiJdfQ==
|