@openfeature/web-sdk 0.4.9 → 0.4.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/cjs/index.js +134 -186
- package/dist/cjs/index.js.map +3 -3
- package/dist/esm/index.js +134 -186
- package/dist/esm/index.js.map +3 -3
- package/dist/types.d.ts +13 -9
- package/package.json +5 -5
package/dist/esm/index.js
CHANGED
|
@@ -1,27 +1,9 @@
|
|
|
1
1
|
var __create = Object.create;
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
|
-
var __defProps = Object.defineProperties;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
6
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
8
5
|
var __getProtoOf = Object.getPrototypeOf;
|
|
9
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
10
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
11
|
-
var __reflectGet = Reflect.get;
|
|
12
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
13
|
-
var __spreadValues = (a, b) => {
|
|
14
|
-
for (var prop in b || (b = {}))
|
|
15
|
-
if (__hasOwnProp.call(b, prop))
|
|
16
|
-
__defNormalProp(a, prop, b[prop]);
|
|
17
|
-
if (__getOwnPropSymbols)
|
|
18
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
19
|
-
if (__propIsEnum.call(b, prop))
|
|
20
|
-
__defNormalProp(a, prop, b[prop]);
|
|
21
|
-
}
|
|
22
|
-
return a;
|
|
23
|
-
};
|
|
24
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
25
7
|
var __commonJS = (cb, mod) => function __require() {
|
|
26
8
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
27
9
|
};
|
|
@@ -41,27 +23,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
41
23
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
42
24
|
mod
|
|
43
25
|
));
|
|
44
|
-
var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
|
|
45
|
-
var __async = (__this, __arguments, generator) => {
|
|
46
|
-
return new Promise((resolve, reject) => {
|
|
47
|
-
var fulfilled = (value) => {
|
|
48
|
-
try {
|
|
49
|
-
step(generator.next(value));
|
|
50
|
-
} catch (e) {
|
|
51
|
-
reject(e);
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
var rejected = (value) => {
|
|
55
|
-
try {
|
|
56
|
-
step(generator.throw(value));
|
|
57
|
-
} catch (e) {
|
|
58
|
-
reject(e);
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
62
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
63
|
-
});
|
|
64
|
-
};
|
|
65
26
|
|
|
66
27
|
// ../../node_modules/events/events.js
|
|
67
28
|
var require_events = __commonJS({
|
|
@@ -455,12 +416,11 @@ import {
|
|
|
455
416
|
var import_events = __toESM(require_events());
|
|
456
417
|
import { GenericEventEmitter } from "@openfeature/core";
|
|
457
418
|
var OpenFeatureEventEmitter = class extends GenericEventEmitter {
|
|
419
|
+
eventEmitter = new import_events.default({ captureRejections: true });
|
|
458
420
|
constructor() {
|
|
459
421
|
super();
|
|
460
|
-
this.eventEmitter = new import_events.default({ captureRejections: true });
|
|
461
422
|
this.eventEmitter.on("error", (err) => {
|
|
462
|
-
|
|
463
|
-
(_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
|
|
423
|
+
this._logger?.error("Error running event handler:", err);
|
|
464
424
|
});
|
|
465
425
|
}
|
|
466
426
|
};
|
|
@@ -472,11 +432,9 @@ import { ClientProviderEvents } from "@openfeature/core";
|
|
|
472
432
|
import { ProviderStatus } from "@openfeature/core";
|
|
473
433
|
var REASON_NO_OP = "No-op";
|
|
474
434
|
var NoopFeatureProvider = class {
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
};
|
|
479
|
-
}
|
|
435
|
+
metadata = {
|
|
436
|
+
name: "No-op Provider"
|
|
437
|
+
};
|
|
480
438
|
get status() {
|
|
481
439
|
return ProviderStatus.NOT_READY;
|
|
482
440
|
}
|
|
@@ -514,6 +472,7 @@ import {
|
|
|
514
472
|
// src/provider/in-memory-provider/variant-not-found-error.ts
|
|
515
473
|
import { ErrorCode, OpenFeatureError } from "@openfeature/core";
|
|
516
474
|
var VariantNotFoundError = class extends OpenFeatureError {
|
|
475
|
+
code;
|
|
517
476
|
constructor(message) {
|
|
518
477
|
super(message);
|
|
519
478
|
Object.setPrototypeOf(this, VariantNotFoundError.prototype);
|
|
@@ -524,48 +483,46 @@ var VariantNotFoundError = class extends OpenFeatureError {
|
|
|
524
483
|
|
|
525
484
|
// src/provider/in-memory-provider/in-memory-provider.ts
|
|
526
485
|
var InMemoryProvider = class {
|
|
486
|
+
events = new OpenFeatureEventEmitter();
|
|
487
|
+
runsOn = "client";
|
|
488
|
+
status = ProviderStatus2.NOT_READY;
|
|
489
|
+
metadata = {
|
|
490
|
+
name: "in-memory"
|
|
491
|
+
};
|
|
492
|
+
_flagConfiguration;
|
|
493
|
+
_context;
|
|
527
494
|
constructor(flagConfiguration = {}) {
|
|
528
|
-
this.
|
|
529
|
-
this.runsOn = "client";
|
|
530
|
-
this.status = ProviderStatus2.NOT_READY;
|
|
531
|
-
this.metadata = {
|
|
532
|
-
name: "in-memory"
|
|
533
|
-
};
|
|
534
|
-
this._flagConfiguration = __spreadValues({}, flagConfiguration);
|
|
495
|
+
this._flagConfiguration = { ...flagConfiguration };
|
|
535
496
|
}
|
|
536
|
-
initialize(context) {
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
this.resolveFlagWithReason(key, context);
|
|
541
|
-
}
|
|
542
|
-
this._context = context;
|
|
543
|
-
this.status = ProviderStatus2.READY;
|
|
544
|
-
} catch (error) {
|
|
545
|
-
this.status = ProviderStatus2.ERROR;
|
|
546
|
-
throw error;
|
|
497
|
+
async initialize(context) {
|
|
498
|
+
try {
|
|
499
|
+
for (const key in this._flagConfiguration) {
|
|
500
|
+
this.resolveFlagWithReason(key, context);
|
|
547
501
|
}
|
|
548
|
-
|
|
502
|
+
this._context = context;
|
|
503
|
+
this.status = ProviderStatus2.READY;
|
|
504
|
+
} catch (error) {
|
|
505
|
+
this.status = ProviderStatus2.ERROR;
|
|
506
|
+
throw error;
|
|
507
|
+
}
|
|
549
508
|
}
|
|
550
509
|
/**
|
|
551
510
|
* Overwrites the configured flags.
|
|
552
511
|
* @param { FlagConfiguration } flagConfiguration new flag configuration
|
|
553
512
|
*/
|
|
554
|
-
putConfiguration(flagConfiguration) {
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
}
|
|
568
|
-
});
|
|
513
|
+
async putConfiguration(flagConfiguration) {
|
|
514
|
+
const flagsChanged = Object.entries(flagConfiguration).filter(([key, value]) => this._flagConfiguration[key] !== value).map(([key]) => key);
|
|
515
|
+
this.status = ProviderStatus2.STALE;
|
|
516
|
+
this.events.emit(ClientProviderEvents.Stale);
|
|
517
|
+
this._flagConfiguration = { ...flagConfiguration };
|
|
518
|
+
this.events.emit(ClientProviderEvents.ConfigurationChanged, { flagsChanged });
|
|
519
|
+
try {
|
|
520
|
+
await this.initialize(this._context);
|
|
521
|
+
this.events.emit(ClientProviderEvents.Ready);
|
|
522
|
+
} catch (err) {
|
|
523
|
+
this.events.emit(ClientProviderEvents.Error);
|
|
524
|
+
throw err;
|
|
525
|
+
}
|
|
569
526
|
}
|
|
570
527
|
resolveBooleanEvaluation(flagKey, defaultValue, context, logger) {
|
|
571
528
|
return this.resolveAndCheckFlag(flagKey, defaultValue, context || this._context, logger);
|
|
@@ -582,7 +539,7 @@ var InMemoryProvider = class {
|
|
|
582
539
|
resolveAndCheckFlag(flagKey, defaultValue, context, logger) {
|
|
583
540
|
if (!(flagKey in this._flagConfiguration)) {
|
|
584
541
|
const message = `no flag found with key ${flagKey}`;
|
|
585
|
-
logger
|
|
542
|
+
logger?.debug(message);
|
|
586
543
|
throw new FlagNotFoundError(message);
|
|
587
544
|
}
|
|
588
545
|
if (this._flagConfiguration[flagKey].disabled) {
|
|
@@ -591,7 +548,7 @@ var InMemoryProvider = class {
|
|
|
591
548
|
const resolvedFlag = this.resolveFlagWithReason(flagKey, context);
|
|
592
549
|
if (resolvedFlag.value === void 0) {
|
|
593
550
|
const message = `no value associated with variant provided for ${flagKey} found`;
|
|
594
|
-
logger
|
|
551
|
+
logger?.error(message);
|
|
595
552
|
throw new VariantNotFoundError(message);
|
|
596
553
|
}
|
|
597
554
|
if (typeof resolvedFlag.value != typeof defaultValue) {
|
|
@@ -605,24 +562,23 @@ var InMemoryProvider = class {
|
|
|
605
562
|
return resolutionResult;
|
|
606
563
|
} catch (error) {
|
|
607
564
|
if (!(error instanceof OpenFeatureError2)) {
|
|
608
|
-
throw new GeneralError(
|
|
565
|
+
throw new GeneralError(error?.message || "unknown error");
|
|
609
566
|
}
|
|
610
567
|
throw error;
|
|
611
568
|
}
|
|
612
569
|
}
|
|
613
570
|
lookupFlagValue(flagKey, ctx) {
|
|
614
|
-
var _a;
|
|
615
571
|
const flagSpec = this._flagConfiguration[flagKey];
|
|
616
|
-
const isContextEval = ctx &&
|
|
617
|
-
const variant = isContextEval ?
|
|
618
|
-
const value = variant &&
|
|
572
|
+
const isContextEval = ctx && flagSpec?.contextEvaluator;
|
|
573
|
+
const variant = isContextEval ? flagSpec.contextEvaluator?.(ctx) : flagSpec.defaultVariant;
|
|
574
|
+
const value = variant && flagSpec?.variants[variant];
|
|
619
575
|
const evalReason = isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC;
|
|
620
576
|
const reason = this.status === ProviderStatus2.STALE ? StandardResolutionReasons.CACHED : evalReason;
|
|
621
|
-
return
|
|
622
|
-
value
|
|
623
|
-
|
|
577
|
+
return {
|
|
578
|
+
value,
|
|
579
|
+
...variant && { variant },
|
|
624
580
|
reason
|
|
625
|
-
}
|
|
581
|
+
};
|
|
626
582
|
}
|
|
627
583
|
};
|
|
628
584
|
|
|
@@ -630,12 +586,12 @@ var InMemoryProvider = class {
|
|
|
630
586
|
var GLOBAL_OPENFEATURE_API_KEY = Symbol.for("@openfeature/web-sdk/api");
|
|
631
587
|
var _globalThis = globalThis;
|
|
632
588
|
var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
|
|
589
|
+
_events = new OpenFeatureEventEmitter();
|
|
590
|
+
_defaultProvider = NOOP_PROVIDER;
|
|
591
|
+
_createEventEmitter = () => new OpenFeatureEventEmitter();
|
|
592
|
+
_namedProviderContext = /* @__PURE__ */ new Map();
|
|
633
593
|
constructor() {
|
|
634
594
|
super("client");
|
|
635
|
-
this._events = new OpenFeatureEventEmitter();
|
|
636
|
-
this._defaultProvider = NOOP_PROVIDER;
|
|
637
|
-
this._createEventEmitter = () => new OpenFeatureEventEmitter();
|
|
638
|
-
this._namedProviderContext = /* @__PURE__ */ new Map();
|
|
639
595
|
}
|
|
640
596
|
/**
|
|
641
597
|
* Gets a singleton instance of the OpenFeature API.
|
|
@@ -651,33 +607,36 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
|
|
|
651
607
|
_globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;
|
|
652
608
|
return instance;
|
|
653
609
|
}
|
|
654
|
-
setContext(nameOrContext, contextOrUndefined) {
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
const
|
|
659
|
-
if (
|
|
660
|
-
const
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
this._namedProviderContext.set(clientName, context);
|
|
664
|
-
yield this.runProviderContextChangeHandler(clientName, provider, oldContext, context);
|
|
665
|
-
} else {
|
|
666
|
-
this._namedProviderContext.set(clientName, context);
|
|
667
|
-
}
|
|
610
|
+
async setContext(nameOrContext, contextOrUndefined) {
|
|
611
|
+
const clientName = stringOrUndefined(nameOrContext);
|
|
612
|
+
const context = objectOrUndefined(nameOrContext) ?? objectOrUndefined(contextOrUndefined) ?? {};
|
|
613
|
+
if (clientName) {
|
|
614
|
+
const provider = this._clientProviders.get(clientName);
|
|
615
|
+
if (provider) {
|
|
616
|
+
const oldContext = this.getContext(clientName);
|
|
617
|
+
this._namedProviderContext.set(clientName, context);
|
|
618
|
+
await this.runProviderContextChangeHandler(clientName, provider, oldContext, context);
|
|
668
619
|
} else {
|
|
669
|
-
|
|
670
|
-
this._context = context;
|
|
671
|
-
const providersWithoutContextOverride = Array.from(this._clientProviders.entries()).filter(([name]) => !this._namedProviderContext.has(name)).reduce((acc, [, provider]) => {
|
|
672
|
-
acc.push(provider);
|
|
673
|
-
return acc;
|
|
674
|
-
}, []);
|
|
675
|
-
const allProviders = [this._defaultProvider, ...providersWithoutContextOverride];
|
|
676
|
-
yield Promise.all(
|
|
677
|
-
allProviders.map((provider) => this.runProviderContextChangeHandler(void 0, provider, oldContext, context))
|
|
678
|
-
);
|
|
620
|
+
this._namedProviderContext.set(clientName, context);
|
|
679
621
|
}
|
|
680
|
-
}
|
|
622
|
+
} else {
|
|
623
|
+
const oldContext = this._context;
|
|
624
|
+
this._context = context;
|
|
625
|
+
const defaultContextNameProviders = Array.from(this._clientProviders.entries()).filter(([name]) => !this._namedProviderContext.has(name)).reduce((acc, [name, provider]) => {
|
|
626
|
+
acc.push({ name, provider });
|
|
627
|
+
return acc;
|
|
628
|
+
}, []);
|
|
629
|
+
const allProviders = [
|
|
630
|
+
// add in the default (no name)
|
|
631
|
+
{ name: void 0, provider: this._defaultProvider },
|
|
632
|
+
...defaultContextNameProviders
|
|
633
|
+
];
|
|
634
|
+
await Promise.all(
|
|
635
|
+
allProviders.map(
|
|
636
|
+
(tuple) => this.runProviderContextChangeHandler(tuple.name, tuple.provider, oldContext, context)
|
|
637
|
+
)
|
|
638
|
+
);
|
|
639
|
+
}
|
|
681
640
|
}
|
|
682
641
|
getContext(nameOrUndefined) {
|
|
683
642
|
const clientName = stringOrUndefined(nameOrUndefined);
|
|
@@ -691,33 +650,29 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
|
|
|
691
650
|
}
|
|
692
651
|
return this._context;
|
|
693
652
|
}
|
|
694
|
-
clearContext(nameOrUndefined) {
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
yield this.runProviderContextChangeHandler(clientName, provider, oldContext, newContext);
|
|
704
|
-
} else {
|
|
705
|
-
this._namedProviderContext.delete(clientName);
|
|
706
|
-
}
|
|
653
|
+
async clearContext(nameOrUndefined) {
|
|
654
|
+
const clientName = stringOrUndefined(nameOrUndefined);
|
|
655
|
+
if (clientName) {
|
|
656
|
+
const provider = this._clientProviders.get(clientName);
|
|
657
|
+
if (provider) {
|
|
658
|
+
const oldContext = this.getContext(clientName);
|
|
659
|
+
this._namedProviderContext.delete(clientName);
|
|
660
|
+
const newContext = this.getContext();
|
|
661
|
+
await this.runProviderContextChangeHandler(clientName, provider, oldContext, newContext);
|
|
707
662
|
} else {
|
|
708
|
-
|
|
663
|
+
this._namedProviderContext.delete(clientName);
|
|
709
664
|
}
|
|
710
|
-
}
|
|
665
|
+
} else {
|
|
666
|
+
return this.setContext({});
|
|
667
|
+
}
|
|
711
668
|
}
|
|
712
669
|
/**
|
|
713
670
|
* Resets the global evaluation context and removes the evaluation context for
|
|
714
671
|
* all named clients.
|
|
715
672
|
*/
|
|
716
|
-
clearContexts() {
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
yield Promise.allSettled(Array.from(this._clientProviders.keys()).map((name) => this.clearContext(name)));
|
|
720
|
-
});
|
|
673
|
+
async clearContexts() {
|
|
674
|
+
await this.clearContext();
|
|
675
|
+
await Promise.allSettled(Array.from(this._clientProviders.keys()).map((name) => this.clearContext(name)));
|
|
721
676
|
}
|
|
722
677
|
/**
|
|
723
678
|
* A factory function for creating new named OpenFeature clients. Clients can contain
|
|
@@ -744,31 +699,27 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
|
|
|
744
699
|
* Clears all registered providers and resets the default provider.
|
|
745
700
|
* @returns {Promise<void>}
|
|
746
701
|
*/
|
|
747
|
-
clearProviders() {
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
this._namedProviderContext.clear();
|
|
751
|
-
});
|
|
702
|
+
async clearProviders() {
|
|
703
|
+
await super.clearProvidersAndSetDefault(NOOP_PROVIDER);
|
|
704
|
+
this._namedProviderContext.clear();
|
|
752
705
|
}
|
|
753
|
-
runProviderContextChangeHandler(clientName, provider, oldContext, newContext) {
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
|
|
760
|
-
emitter == null ? void 0 : emitter.emit(ClientProviderEvents.ContextChanged, { clientName, providerName });
|
|
761
|
-
});
|
|
762
|
-
(_a2 = this._events) == null ? void 0 : _a2.emit(ClientProviderEvents.ContextChanged, { clientName, providerName });
|
|
763
|
-
}).catch((err) => {
|
|
764
|
-
var _a2, _b;
|
|
765
|
-
(_a2 = this._logger) == null ? void 0 : _a2.error(`Error running ${provider.metadata.name}'s context change handler:`, err);
|
|
766
|
-
this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
|
|
767
|
-
emitter == null ? void 0 : emitter.emit(ClientProviderEvents.Error, { clientName, providerName, message: err == null ? void 0 : err.message });
|
|
768
|
-
});
|
|
769
|
-
(_b = this._events) == null ? void 0 : _b.emit(ClientProviderEvents.Error, { clientName, providerName, message: err == null ? void 0 : err.message });
|
|
706
|
+
async runProviderContextChangeHandler(clientName, provider, oldContext, newContext) {
|
|
707
|
+
const providerName = provider.metadata.name;
|
|
708
|
+
try {
|
|
709
|
+
await provider.onContextChange?.(oldContext, newContext);
|
|
710
|
+
this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
|
|
711
|
+
emitter?.emit(ClientProviderEvents.ContextChanged, { clientName, providerName });
|
|
770
712
|
});
|
|
771
|
-
|
|
713
|
+
this._events?.emit(ClientProviderEvents.ContextChanged, { clientName, providerName });
|
|
714
|
+
} catch (err) {
|
|
715
|
+
const error = err;
|
|
716
|
+
const message = `Error running ${provider?.metadata?.name}'s context change handler: ${error?.message}`;
|
|
717
|
+
this._logger?.error(`${message}`, err);
|
|
718
|
+
this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
|
|
719
|
+
emitter?.emit(ClientProviderEvents.Error, { clientName, providerName, message });
|
|
720
|
+
});
|
|
721
|
+
this._events?.emit(ClientProviderEvents.Error, { clientName, providerName, message });
|
|
722
|
+
}
|
|
772
723
|
}
|
|
773
724
|
};
|
|
774
725
|
var OpenFeature = OpenFeatureAPI.getInstance();
|
|
@@ -780,8 +731,9 @@ var OpenFeatureClient = class {
|
|
|
780
731
|
this.emitterAccessor = emitterAccessor;
|
|
781
732
|
this.globalLogger = globalLogger;
|
|
782
733
|
this.options = options;
|
|
783
|
-
this._hooks = [];
|
|
784
734
|
}
|
|
735
|
+
_hooks = [];
|
|
736
|
+
_clientLogger;
|
|
785
737
|
get metadata() {
|
|
786
738
|
return {
|
|
787
739
|
name: this.options.name,
|
|
@@ -790,18 +742,16 @@ var OpenFeatureClient = class {
|
|
|
790
742
|
};
|
|
791
743
|
}
|
|
792
744
|
get providerStatus() {
|
|
793
|
-
|
|
794
|
-
return ((_a = this.providerAccessor()) == null ? void 0 : _a.status) || ProviderStatus3.READY;
|
|
745
|
+
return this.providerAccessor()?.status || ProviderStatus3.READY;
|
|
795
746
|
}
|
|
796
747
|
addHandler(eventType, handler) {
|
|
797
|
-
var _a;
|
|
798
748
|
this.emitterAccessor().addHandler(eventType, handler);
|
|
799
749
|
const shouldRunNow = statusMatchesEvent(eventType, this._provider.status);
|
|
800
750
|
if (shouldRunNow) {
|
|
801
751
|
try {
|
|
802
752
|
handler({ clientName: this.metadata.name, providerName: this._provider.metadata.name });
|
|
803
753
|
} catch (err) {
|
|
804
|
-
|
|
754
|
+
this._logger?.error("Error running event handler:", err);
|
|
805
755
|
}
|
|
806
756
|
}
|
|
807
757
|
}
|
|
@@ -865,7 +815,6 @@ var OpenFeatureClient = class {
|
|
|
865
815
|
return this.evaluate(flagKey, this._provider.resolveObjectEvaluation, defaultValue, "object", options);
|
|
866
816
|
}
|
|
867
817
|
evaluate(flagKey, resolver, defaultValue, flagType, options = {}) {
|
|
868
|
-
var _a;
|
|
869
818
|
const allHooks = [
|
|
870
819
|
...OpenFeature.getHooks(),
|
|
871
820
|
...this.getHooks(),
|
|
@@ -873,7 +822,9 @@ var OpenFeatureClient = class {
|
|
|
873
822
|
...this._provider.hooks || []
|
|
874
823
|
];
|
|
875
824
|
const allHooksReversed = [...allHooks].reverse();
|
|
876
|
-
const context =
|
|
825
|
+
const context = {
|
|
826
|
+
...OpenFeature.getContext(this?.options?.name)
|
|
827
|
+
};
|
|
877
828
|
const hookContext = {
|
|
878
829
|
flagKey,
|
|
879
830
|
defaultValue,
|
|
@@ -886,15 +837,16 @@ var OpenFeatureClient = class {
|
|
|
886
837
|
try {
|
|
887
838
|
this.beforeHooks(allHooks, hookContext, options);
|
|
888
839
|
const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);
|
|
889
|
-
const evaluationDetails =
|
|
890
|
-
|
|
840
|
+
const evaluationDetails = {
|
|
841
|
+
...resolution,
|
|
842
|
+
flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),
|
|
891
843
|
flagKey
|
|
892
|
-
}
|
|
844
|
+
};
|
|
893
845
|
this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);
|
|
894
846
|
return evaluationDetails;
|
|
895
847
|
} catch (err) {
|
|
896
|
-
const errorMessage = err
|
|
897
|
-
const errorCode =
|
|
848
|
+
const errorMessage = err?.message;
|
|
849
|
+
const errorCode = err?.code || ErrorCode2.GENERAL;
|
|
898
850
|
this.errorHooks(allHooksReversed, hookContext, err, options);
|
|
899
851
|
return {
|
|
900
852
|
errorCode,
|
|
@@ -909,44 +861,40 @@ var OpenFeatureClient = class {
|
|
|
909
861
|
}
|
|
910
862
|
}
|
|
911
863
|
beforeHooks(hooks, hookContext, options) {
|
|
912
|
-
var _a;
|
|
913
864
|
Object.freeze(hookContext);
|
|
914
865
|
Object.freeze(hookContext.context);
|
|
915
866
|
for (const hook of hooks) {
|
|
916
|
-
|
|
867
|
+
hook?.before?.(hookContext, Object.freeze(options.hookHints));
|
|
917
868
|
}
|
|
918
869
|
}
|
|
919
870
|
afterHooks(hooks, hookContext, evaluationDetails, options) {
|
|
920
|
-
var _a;
|
|
921
871
|
for (const hook of hooks) {
|
|
922
|
-
|
|
872
|
+
hook?.after?.(hookContext, evaluationDetails, options.hookHints);
|
|
923
873
|
}
|
|
924
874
|
}
|
|
925
875
|
errorHooks(hooks, hookContext, err, options) {
|
|
926
|
-
var _a;
|
|
927
876
|
for (const hook of hooks) {
|
|
928
877
|
try {
|
|
929
|
-
|
|
878
|
+
hook?.error?.(hookContext, err, options.hookHints);
|
|
930
879
|
} catch (err2) {
|
|
931
880
|
this._logger.error(`Unhandled error during 'error' hook: ${err2}`);
|
|
932
881
|
if (err2 instanceof Error) {
|
|
933
882
|
this._logger.error(err2.stack);
|
|
934
883
|
}
|
|
935
|
-
this._logger.error(err2
|
|
884
|
+
this._logger.error(err2?.stack);
|
|
936
885
|
}
|
|
937
886
|
}
|
|
938
887
|
}
|
|
939
888
|
finallyHooks(hooks, hookContext, options) {
|
|
940
|
-
var _a;
|
|
941
889
|
for (const hook of hooks) {
|
|
942
890
|
try {
|
|
943
|
-
|
|
891
|
+
hook?.finally?.(hookContext, options.hookHints);
|
|
944
892
|
} catch (err) {
|
|
945
893
|
this._logger.error(`Unhandled error during 'finally' hook: ${err}`);
|
|
946
894
|
if (err instanceof Error) {
|
|
947
895
|
this._logger.error(err.stack);
|
|
948
896
|
}
|
|
949
|
-
this._logger.error(err
|
|
897
|
+
this._logger.error(err?.stack);
|
|
950
898
|
}
|
|
951
899
|
}
|
|
952
900
|
}
|