@openfeature/web-sdk 0.3.6-experimental → 0.3.8-experimental

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/dist/esm/index.js CHANGED
@@ -433,7 +433,16 @@ var require_events = __commonJS({
433
433
  }
434
434
  });
435
435
 
436
- // ../shared/src/types.ts
436
+ // ../shared/src/errors/open-feature-error-abstract.ts
437
+ var OpenFeatureError = class extends Error {
438
+ constructor(message) {
439
+ super(message);
440
+ Object.setPrototypeOf(this, OpenFeatureError.prototype);
441
+ this.name = "OpenFeatureError";
442
+ }
443
+ };
444
+
445
+ // ../shared/src/evaluation/evaluation.ts
437
446
  var StandardResolutionReasons = {
438
447
  /**
439
448
  * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.
@@ -480,21 +489,6 @@ var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
480
489
  ErrorCode2["GENERAL"] = "GENERAL";
481
490
  return ErrorCode2;
482
491
  })(ErrorCode || {});
483
- var ProviderStatus = /* @__PURE__ */ ((ProviderStatus2) => {
484
- ProviderStatus2["NOT_READY"] = "NOT_READY";
485
- ProviderStatus2["READY"] = "READY";
486
- ProviderStatus2["ERROR"] = "ERROR";
487
- return ProviderStatus2;
488
- })(ProviderStatus || {});
489
-
490
- // ../shared/src/errors/open-feature-error-abstract.ts
491
- var OpenFeatureError = class extends Error {
492
- constructor(message) {
493
- super(message);
494
- Object.setPrototypeOf(this, OpenFeatureError.prototype);
495
- this.name = "OpenFeatureError";
496
- }
497
- };
498
492
 
499
493
  // ../shared/src/errors/general-error.ts
500
494
  var GeneralError = class extends OpenFeatureError {
@@ -556,8 +550,16 @@ var InvalidContextError = class extends OpenFeatureError {
556
550
  }
557
551
  };
558
552
 
559
- // ../shared/src/logger.ts
560
- var LOG_LEVELS = ["error", "warn", "info", "debug"];
553
+ // ../shared/src/events/events.ts
554
+ var ProviderEvents = /* @__PURE__ */ ((ProviderEvents2) => {
555
+ ProviderEvents2["Ready"] = "PROVIDER_READY";
556
+ ProviderEvents2["Error"] = "PROVIDER_ERROR";
557
+ ProviderEvents2["ConfigurationChanged"] = "PROVIDER_CONFIGURATION_CHANGED";
558
+ ProviderEvents2["Stale"] = "PROVIDER_STALE";
559
+ return ProviderEvents2;
560
+ })(ProviderEvents || {});
561
+
562
+ // ../shared/src/logger/default-logger.ts
561
563
  var DefaultLogger = class {
562
564
  error(...args) {
563
565
  console.error(...args);
@@ -570,6 +572,9 @@ var DefaultLogger = class {
570
572
  debug() {
571
573
  }
572
574
  };
575
+
576
+ // ../shared/src/logger/safe-logger.ts
577
+ var LOG_LEVELS = ["error", "warn", "info", "debug"];
573
578
  var SafeLogger = class {
574
579
  constructor(logger) {
575
580
  this.fallbackLogger = new DefaultLogger();
@@ -607,29 +612,12 @@ var SafeLogger = class {
607
612
  }
608
613
  };
609
614
 
610
- // ../shared/src/no-op-transaction-context-propagator.ts
611
- var NoopTransactionContextPropagator = class {
612
- getTransactionContext() {
613
- return {};
614
- }
615
- setTransactionContext(_, callback) {
616
- callback();
617
- }
618
- };
619
- var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();
620
-
621
- // ../shared/src/events.ts
615
+ // ../shared/src/events/open-feature-event-emitter.ts
622
616
  var import_events = __toESM(require_events());
623
- var ProviderEvents = /* @__PURE__ */ ((ProviderEvents2) => {
624
- ProviderEvents2["Ready"] = "PROVIDER_READY";
625
- ProviderEvents2["Error"] = "PROVIDER_ERROR";
626
- ProviderEvents2["ConfigurationChanged"] = "PROVIDER_CONFIGURATION_CHANGED";
627
- ProviderEvents2["Stale"] = "PROVIDER_STALE";
628
- return ProviderEvents2;
629
- })(ProviderEvents || {});
630
- var OpenFeatureEventEmitter = class {
617
+ var GenericEventEmitter = class {
631
618
  constructor(globalLogger) {
632
619
  this.globalLogger = globalLogger;
620
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
633
621
  this._handlers = /* @__PURE__ */ new WeakMap();
634
622
  this.eventEmitter = new import_events.default({ captureRejections: true });
635
623
  this.eventEmitter.on("error", (err) => {
@@ -669,10 +657,33 @@ var OpenFeatureEventEmitter = class {
669
657
  return this;
670
658
  }
671
659
  get _logger() {
672
- var _a;
673
- return this._eventLogger || ((_a = this.globalLogger) == null ? void 0 : _a.call(this));
660
+ var _a, _b;
661
+ return (_b = this._eventLogger) != null ? _b : (_a = this.globalLogger) == null ? void 0 : _a.call(this);
662
+ }
663
+ };
664
+ var OpenFeatureEventEmitter = class extends GenericEventEmitter {
665
+ };
666
+ var InternalEventEmitter = class extends GenericEventEmitter {
667
+ };
668
+
669
+ // ../shared/src/provider/provider.ts
670
+ var ProviderStatus = /* @__PURE__ */ ((ProviderStatus2) => {
671
+ ProviderStatus2["NOT_READY"] = "NOT_READY";
672
+ ProviderStatus2["READY"] = "READY";
673
+ ProviderStatus2["ERROR"] = "ERROR";
674
+ return ProviderStatus2;
675
+ })(ProviderStatus || {});
676
+
677
+ // ../shared/src/transaction-context/no-op-transaction-context-propagator.ts
678
+ var NoopTransactionContextPropagator = class {
679
+ getTransactionContext() {
680
+ return {};
681
+ }
682
+ setTransactionContext(_, callback) {
683
+ callback();
674
684
  }
675
685
  };
686
+ var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();
676
687
 
677
688
  // ../shared/src/type-guards.ts
678
689
  function isString(value) {
@@ -696,14 +707,26 @@ function isDefined(input) {
696
707
  // ../shared/src/open-feature.ts
697
708
  var OpenFeatureCommonAPI = class {
698
709
  constructor() {
710
+ this._hooks = [];
699
711
  this._transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
700
712
  this._context = {};
701
713
  this._logger = new DefaultLogger();
702
- this._events = new OpenFeatureEventEmitter(() => this._logger);
714
+ this._events = new InternalEventEmitter(() => this._logger);
703
715
  this._clientEventHandlers = /* @__PURE__ */ new Map();
704
716
  this._clientProviders = /* @__PURE__ */ new Map();
705
717
  this._clientEvents = /* @__PURE__ */ new Map();
706
718
  }
719
+ addHooks(...hooks) {
720
+ this._hooks = [...this._hooks, ...hooks];
721
+ return this;
722
+ }
723
+ getHooks() {
724
+ return this._hooks;
725
+ }
726
+ clearHooks() {
727
+ this._hooks = [];
728
+ return this;
729
+ }
707
730
  setLogger(logger) {
708
731
  this._logger = new SafeLogger(logger);
709
732
  return this;
@@ -715,9 +738,6 @@ var OpenFeatureCommonAPI = class {
715
738
  get providerMetadata() {
716
739
  return this._defaultProvider.metadata;
717
740
  }
718
- getContext() {
719
- return this._context;
720
- }
721
741
  /**
722
742
  * Adds a handler for the given provider event type.
723
743
  * The handlers are called in the order they have been added.
@@ -755,17 +775,17 @@ var OpenFeatureCommonAPI = class {
755
775
  if (oldProvider === provider) {
756
776
  return this;
757
777
  }
758
- const emitters = clientName ? [this.getAndCacheEventEmitterForClient(clientName)] : this.getUnboundEmitters();
778
+ const emitters = this.getAssociatedEventEmitters(clientName);
759
779
  if (typeof provider.initialize === "function") {
760
780
  (_d = (_c = (_b = provider.initialize) == null ? void 0 : _b.call(provider, this._context)) == null ? void 0 : _c.then(() => {
761
781
  var _a2;
762
- emitters.forEach((emitter) => {
782
+ this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
763
783
  emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName });
764
784
  });
765
785
  (_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_READY" /* Ready */, { clientName });
766
786
  })) == null ? void 0 : _d.catch((error) => {
767
787
  var _a2;
768
- emitters.forEach((emitter) => {
788
+ this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
769
789
  emitter == null ? void 0 : emitter.emit("PROVIDER_ERROR" /* Error */, { clientName, message: error.message });
770
790
  });
771
791
  (_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_ERROR" /* Error */, { clientName, message: error.message });
@@ -794,12 +814,12 @@ var OpenFeatureCommonAPI = class {
794
814
  }
795
815
  return (_a = this._clientProviders.get(name)) != null ? _a : this._defaultProvider;
796
816
  }
797
- getAndCacheEventEmitterForClient(name) {
817
+ buildAndCacheEventEmitterForClient(name) {
798
818
  const emitter = this._clientEvents.get(name);
799
819
  if (emitter) {
800
820
  return emitter;
801
821
  }
802
- const newEmitter = new OpenFeatureEventEmitter(() => this._logger);
822
+ const newEmitter = new InternalEventEmitter(() => this._logger);
803
823
  this._clientEvents.set(name, newEmitter);
804
824
  const clientProvider = this.getProviderForClient(name);
805
825
  Object.values(ProviderEvents).forEach(
@@ -816,7 +836,15 @@ var OpenFeatureCommonAPI = class {
816
836
  const namedProviders = [...this._clientProviders.keys()];
817
837
  const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined);
818
838
  const unboundEmitterNames = eventEmitterNames.filter((name) => !namedProviders.includes(name));
819
- return unboundEmitterNames.map((name) => this._clientEvents.get(name)).filter(isDefined);
839
+ return [
840
+ // all unbound, named emitters
841
+ ...unboundEmitterNames.map((name) => this._clientEvents.get(name)),
842
+ // the default emitter
843
+ this._clientEvents.get(void 0)
844
+ ].filter(isDefined);
845
+ }
846
+ getAssociatedEventEmitters(clientName) {
847
+ return clientName ? [this.buildAndCacheEventEmitterForClient(clientName)] : this.getUnboundEmitters();
820
848
  }
821
849
  transferListeners(oldProvider, newProvider, clientName, emitters) {
822
850
  var _a;
@@ -824,17 +852,15 @@ var OpenFeatureCommonAPI = class {
824
852
  var _a2;
825
853
  return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler);
826
854
  });
827
- const newClientHandlers = Object.values(ProviderEvents).map(
828
- (eventType) => {
829
- const handler = (details) => __async(this, null, function* () {
830
- emitters.forEach((emitter) => {
831
- emitter == null ? void 0 : emitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName }));
832
- });
833
- this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName }));
855
+ const newClientHandlers = Object.values(ProviderEvents).map((eventType) => {
856
+ const handler = (details) => __async(this, null, function* () {
857
+ emitters.forEach((emitter) => {
858
+ emitter == null ? void 0 : emitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName }));
834
859
  });
835
- return [eventType, handler];
836
- }
837
- );
860
+ this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName }));
861
+ });
862
+ return [eventType, handler];
863
+ });
838
864
  this._clientEventHandlers.set(clientName, newClientHandlers);
839
865
  newClientHandlers.forEach((eventHandler) => {
840
866
  var _a2;
@@ -892,7 +918,7 @@ var OpenFeatureCommonAPI = class {
892
918
  }
893
919
  };
894
920
 
895
- // src/no-op-provider.ts
921
+ // src/provider/no-op-provider.ts
896
922
  var REASON_NO_OP = "No-op";
897
923
  var NoopFeatureProvider = class {
898
924
  constructor() {
@@ -931,7 +957,6 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
931
957
  // eslint-disable-next-line @typescript-eslint/no-empty-function
932
958
  constructor() {
933
959
  super();
934
- this._hooks = [];
935
960
  this._defaultProvider = NOOP_PROVIDER;
936
961
  }
937
962
  /**
@@ -948,29 +973,26 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
948
973
  _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;
949
974
  return instance;
950
975
  }
951
- setLogger(logger) {
952
- this._logger = new SafeLogger(logger);
953
- return this;
954
- }
955
- addHooks(...hooks) {
956
- this._hooks = [...this._hooks, ...hooks];
957
- return this;
958
- }
959
- getHooks() {
960
- return this._hooks;
961
- }
962
- clearHooks() {
963
- this._hooks = [];
964
- return this;
965
- }
966
976
  setContext(context) {
967
977
  return __async(this, null, function* () {
968
- var _a, _b;
969
978
  const oldContext = this._context;
970
979
  this._context = context;
971
- yield (_b = (_a = this._defaultProvider) == null ? void 0 : _a.onContextChange) == null ? void 0 : _b.call(_a, oldContext, context);
980
+ const allProviders = [this._defaultProvider, ...this._clientProviders.values()];
981
+ yield Promise.all(
982
+ allProviders.map((provider) => __async(this, null, function* () {
983
+ var _a, _b;
984
+ try {
985
+ return yield (_a = provider.onContextChange) == null ? void 0 : _a.call(provider, oldContext, context);
986
+ } catch (err) {
987
+ (_b = this._logger) == null ? void 0 : _b.error(`Error running context change handler of provider ${provider.metadata.name}:`, err);
988
+ }
989
+ }))
990
+ );
972
991
  });
973
992
  }
993
+ getContext() {
994
+ return this._context;
995
+ }
974
996
  /**
975
997
  * A factory function for creating new named OpenFeature clients. Clients can contain
976
998
  * their own state (e.g. logger, hook, context). Multiple clients can be used
@@ -987,7 +1009,7 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
987
1009
  // functions are passed here to make sure that these values are always up to date,
988
1010
  // and so we don't have to make these public properties on the API class.
989
1011
  () => this.getProviderForClient(name),
990
- () => this.getAndCacheEventEmitterForClient(name),
1012
+ () => this.buildAndCacheEventEmitterForClient(name),
991
1013
  () => this._logger,
992
1014
  { name, version }
993
1015
  );
@@ -995,7 +1017,7 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
995
1017
  };
996
1018
  var OpenFeature = OpenFeatureAPI.getInstance();
997
1019
 
998
- // src/client.ts
1020
+ // src/client/open-feature-client.ts
999
1021
  var OpenFeatureClient = class {
1000
1022
  constructor(providerAccessor, emitterAccessor, globalLogger, options) {
1001
1023
  this.providerAccessor = providerAccessor;
@@ -1180,7 +1202,9 @@ export {
1180
1202
  ErrorCode,
1181
1203
  FlagNotFoundError,
1182
1204
  GeneralError,
1205
+ InternalEventEmitter,
1183
1206
  InvalidContextError,
1207
+ LOG_LEVELS,
1184
1208
  NOOP_PROVIDER,
1185
1209
  NOOP_TRANSACTION_CONTEXT_PROPAGATOR,
1186
1210
  OpenFeature,
@@ -1195,6 +1219,10 @@ export {
1195
1219
  SafeLogger,
1196
1220
  StandardResolutionReasons,
1197
1221
  TargetingKeyMissingError,
1198
- TypeMismatchError
1222
+ TypeMismatchError,
1223
+ isObject,
1224
+ isString,
1225
+ objectOrUndefined,
1226
+ stringOrUndefined
1199
1227
  };
1200
1228
  //# sourceMappingURL=index.js.map