@openfeature/web-sdk 0.4.1 → 0.4.3

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/cjs/index.js CHANGED
@@ -37,6 +37,7 @@ var __copyProps = (to, from, except, desc) => {
37
37
  }
38
38
  return to;
39
39
  };
40
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
40
41
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
41
42
  // If the importer is in node compatibility mode or this is not an ESM
42
43
  // file that has been converted to a CommonJS file using a Babel-
@@ -94,22 +95,22 @@ var require_events = __commonJS({
94
95
  var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) {
95
96
  return value !== value;
96
97
  };
97
- function EventEmitter2() {
98
- EventEmitter2.init.call(this);
98
+ function EventEmitter() {
99
+ EventEmitter.init.call(this);
99
100
  }
100
- module2.exports = EventEmitter2;
101
+ module2.exports = EventEmitter;
101
102
  module2.exports.once = once;
102
- EventEmitter2.EventEmitter = EventEmitter2;
103
- EventEmitter2.prototype._events = void 0;
104
- EventEmitter2.prototype._eventsCount = 0;
105
- EventEmitter2.prototype._maxListeners = void 0;
103
+ EventEmitter.EventEmitter = EventEmitter;
104
+ EventEmitter.prototype._events = void 0;
105
+ EventEmitter.prototype._eventsCount = 0;
106
+ EventEmitter.prototype._maxListeners = void 0;
106
107
  var defaultMaxListeners = 10;
107
108
  function checkListener(listener) {
108
109
  if (typeof listener !== "function") {
109
110
  throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
110
111
  }
111
112
  }
112
- Object.defineProperty(EventEmitter2, "defaultMaxListeners", {
113
+ Object.defineProperty(EventEmitter, "defaultMaxListeners", {
113
114
  enumerable: true,
114
115
  get: function() {
115
116
  return defaultMaxListeners;
@@ -121,14 +122,14 @@ var require_events = __commonJS({
121
122
  defaultMaxListeners = arg;
122
123
  }
123
124
  });
124
- EventEmitter2.init = function() {
125
+ EventEmitter.init = function() {
125
126
  if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) {
126
127
  this._events = /* @__PURE__ */ Object.create(null);
127
128
  this._eventsCount = 0;
128
129
  }
129
130
  this._maxListeners = this._maxListeners || void 0;
130
131
  };
131
- EventEmitter2.prototype.setMaxListeners = function setMaxListeners(n) {
132
+ EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
132
133
  if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) {
133
134
  throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + ".");
134
135
  }
@@ -137,13 +138,13 @@ var require_events = __commonJS({
137
138
  };
138
139
  function _getMaxListeners(that) {
139
140
  if (that._maxListeners === void 0)
140
- return EventEmitter2.defaultMaxListeners;
141
+ return EventEmitter.defaultMaxListeners;
141
142
  return that._maxListeners;
142
143
  }
143
- EventEmitter2.prototype.getMaxListeners = function getMaxListeners() {
144
+ EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
144
145
  return _getMaxListeners(this);
145
146
  };
146
- EventEmitter2.prototype.emit = function emit(type) {
147
+ EventEmitter.prototype.emit = function emit(type) {
147
148
  var args = [];
148
149
  for (var i = 1; i < arguments.length; i++)
149
150
  args.push(arguments[i]);
@@ -221,11 +222,11 @@ var require_events = __commonJS({
221
222
  }
222
223
  return target;
223
224
  }
224
- EventEmitter2.prototype.addListener = function addListener(type, listener) {
225
+ EventEmitter.prototype.addListener = function addListener(type, listener) {
225
226
  return _addListener(this, type, listener, false);
226
227
  };
227
- EventEmitter2.prototype.on = EventEmitter2.prototype.addListener;
228
- EventEmitter2.prototype.prependListener = function prependListener(type, listener) {
228
+ EventEmitter.prototype.on = EventEmitter.prototype.addListener;
229
+ EventEmitter.prototype.prependListener = function prependListener(type, listener) {
229
230
  return _addListener(this, type, listener, true);
230
231
  };
231
232
  function onceWrapper() {
@@ -244,17 +245,17 @@ var require_events = __commonJS({
244
245
  state.wrapFn = wrapped;
245
246
  return wrapped;
246
247
  }
247
- EventEmitter2.prototype.once = function once2(type, listener) {
248
+ EventEmitter.prototype.once = function once2(type, listener) {
248
249
  checkListener(listener);
249
250
  this.on(type, _onceWrap(this, type, listener));
250
251
  return this;
251
252
  };
252
- EventEmitter2.prototype.prependOnceListener = function prependOnceListener(type, listener) {
253
+ EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) {
253
254
  checkListener(listener);
254
255
  this.prependListener(type, _onceWrap(this, type, listener));
255
256
  return this;
256
257
  };
257
- EventEmitter2.prototype.removeListener = function removeListener(type, listener) {
258
+ EventEmitter.prototype.removeListener = function removeListener(type, listener) {
258
259
  var list, events, position, i, originalListener;
259
260
  checkListener(listener);
260
261
  events = this._events;
@@ -294,8 +295,8 @@ var require_events = __commonJS({
294
295
  }
295
296
  return this;
296
297
  };
297
- EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;
298
- EventEmitter2.prototype.removeAllListeners = function removeAllListeners(type) {
298
+ EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
299
+ EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {
299
300
  var listeners, events, i;
300
301
  events = this._events;
301
302
  if (events === void 0)
@@ -347,20 +348,20 @@ var require_events = __commonJS({
347
348
  return unwrap ? [evlistener.listener || evlistener] : [evlistener];
348
349
  return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
349
350
  }
350
- EventEmitter2.prototype.listeners = function listeners(type) {
351
+ EventEmitter.prototype.listeners = function listeners(type) {
351
352
  return _listeners(this, type, true);
352
353
  };
353
- EventEmitter2.prototype.rawListeners = function rawListeners(type) {
354
+ EventEmitter.prototype.rawListeners = function rawListeners(type) {
354
355
  return _listeners(this, type, false);
355
356
  };
356
- EventEmitter2.listenerCount = function(emitter, type) {
357
+ EventEmitter.listenerCount = function(emitter, type) {
357
358
  if (typeof emitter.listenerCount === "function") {
358
359
  return emitter.listenerCount(type);
359
360
  } else {
360
361
  return listenerCount.call(emitter, type);
361
362
  }
362
363
  };
363
- EventEmitter2.prototype.listenerCount = listenerCount;
364
+ EventEmitter.prototype.listenerCount = listenerCount;
364
365
  function listenerCount(type) {
365
366
  var events = this._events;
366
367
  if (events !== void 0) {
@@ -373,7 +374,7 @@ var require_events = __commonJS({
373
374
  }
374
375
  return 0;
375
376
  }
376
- EventEmitter2.prototype.eventNames = function eventNames() {
377
+ EventEmitter.prototype.eventNames = function eventNames() {
377
378
  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
378
379
  };
379
380
  function arrayClone(arr, n) {
@@ -442,579 +443,22 @@ var require_events = __commonJS({
442
443
  // src/index.ts
443
444
  var src_exports = {};
444
445
  __export(src_exports, {
445
- DefaultLogger: () => DefaultLogger,
446
- ErrorCode: () => ErrorCode,
447
- FlagNotFoundError: () => FlagNotFoundError,
448
- GeneralError: () => GeneralError,
449
- InternalEventEmitter: () => InternalEventEmitter,
450
- InvalidContextError: () => InvalidContextError,
451
- LOG_LEVELS: () => LOG_LEVELS,
452
446
  NOOP_PROVIDER: () => NOOP_PROVIDER,
453
- NOOP_TRANSACTION_CONTEXT_PROPAGATOR: () => NOOP_TRANSACTION_CONTEXT_PROPAGATOR,
454
447
  OpenFeature: () => OpenFeature,
455
448
  OpenFeatureAPI: () => OpenFeatureAPI,
456
- OpenFeatureClient: () => OpenFeatureClient,
457
- OpenFeatureCommonAPI: () => OpenFeatureCommonAPI,
458
- OpenFeatureError: () => OpenFeatureError,
459
- OpenFeatureEventEmitter: () => OpenFeatureEventEmitter,
460
- ParseError: () => ParseError,
461
- ProviderEvents: () => ProviderEvents,
462
- ProviderStatus: () => ProviderStatus,
463
- SafeLogger: () => SafeLogger,
464
- StandardResolutionReasons: () => StandardResolutionReasons,
465
- TargetingKeyMissingError: () => TargetingKeyMissingError,
466
- TypeMismatchError: () => TypeMismatchError,
467
- isObject: () => isObject,
468
- isString: () => isString,
469
- objectOrUndefined: () => objectOrUndefined,
470
- statusMatchesEvent: () => statusMatchesEvent,
471
- stringOrUndefined: () => stringOrUndefined
449
+ OpenFeatureClient: () => OpenFeatureClient
472
450
  });
473
451
  module.exports = __toCommonJS(src_exports);
452
+ var import_events = __toESM(require_events());
474
453
 
475
- // ../shared/src/errors/open-feature-error-abstract.ts
476
- var OpenFeatureError = class extends Error {
477
- constructor(message) {
478
- super(message);
479
- Object.setPrototypeOf(this, OpenFeatureError.prototype);
480
- this.name = "OpenFeatureError";
481
- }
482
- };
483
-
484
- // ../shared/src/evaluation/evaluation.ts
485
- var StandardResolutionReasons = {
486
- /**
487
- * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.
488
- */
489
- TARGETING_MATCH: "TARGETING_MATCH",
490
- /**
491
- * The resolved value was the result of pseudorandom assignment.
492
- */
493
- SPLIT: "SPLIT",
494
- /**
495
- * The resolved value was the result of the flag being disabled in the management system.
496
- */
497
- DISABLED: "DISABLED",
498
- /**
499
- * The resolved value was configured statically, or otherwise fell back to a pre-configured value.
500
- */
501
- DEFAULT: "DEFAULT",
502
- /**
503
- * The reason for the resolved value could not be determined.
504
- */
505
- UNKNOWN: "UNKNOWN",
506
- /**
507
- * The resolved value is static (no dynamic evaluation).
508
- */
509
- STATIC: "STATIC",
510
- /**
511
- * The resolved value was retrieved from cache.
512
- */
513
- CACHED: "CACHED",
514
- /**
515
- * The resolved value was the result of an error.
516
- *
517
- * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.
518
- */
519
- ERROR: "ERROR"
520
- };
521
- var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
522
- ErrorCode2["PROVIDER_NOT_READY"] = "PROVIDER_NOT_READY";
523
- ErrorCode2["FLAG_NOT_FOUND"] = "FLAG_NOT_FOUND";
524
- ErrorCode2["PARSE_ERROR"] = "PARSE_ERROR";
525
- ErrorCode2["TYPE_MISMATCH"] = "TYPE_MISMATCH";
526
- ErrorCode2["TARGETING_KEY_MISSING"] = "TARGETING_KEY_MISSING";
527
- ErrorCode2["INVALID_CONTEXT"] = "INVALID_CONTEXT";
528
- ErrorCode2["GENERAL"] = "GENERAL";
529
- return ErrorCode2;
530
- })(ErrorCode || {});
531
-
532
- // ../shared/src/errors/general-error.ts
533
- var GeneralError = class extends OpenFeatureError {
534
- constructor(message) {
535
- super(message);
536
- Object.setPrototypeOf(this, GeneralError.prototype);
537
- this.name = "GeneralError";
538
- this.code = "GENERAL" /* GENERAL */;
539
- }
540
- };
541
-
542
- // ../shared/src/errors/flag-not-found-error.ts
543
- var FlagNotFoundError = class extends OpenFeatureError {
544
- constructor(message) {
545
- super(message);
546
- Object.setPrototypeOf(this, FlagNotFoundError.prototype);
547
- this.name = "FlagNotFoundError";
548
- this.code = "FLAG_NOT_FOUND" /* FLAG_NOT_FOUND */;
549
- }
550
- };
551
-
552
- // ../shared/src/errors/parse-error.ts
553
- var ParseError = class extends OpenFeatureError {
554
- constructor(message) {
555
- super(message);
556
- Object.setPrototypeOf(this, ParseError.prototype);
557
- this.name = "ParseError";
558
- this.code = "PARSE_ERROR" /* PARSE_ERROR */;
559
- }
560
- };
561
-
562
- // ../shared/src/errors/type-mismatch-error.ts
563
- var TypeMismatchError = class extends OpenFeatureError {
564
- constructor(message) {
565
- super(message);
566
- Object.setPrototypeOf(this, TypeMismatchError.prototype);
567
- this.name = "TypeMismatchError";
568
- this.code = "TYPE_MISMATCH" /* TYPE_MISMATCH */;
569
- }
570
- };
571
-
572
- // ../shared/src/errors/targeting-key-missing-error.ts
573
- var TargetingKeyMissingError = class extends OpenFeatureError {
574
- constructor(message) {
575
- super(message);
576
- Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);
577
- this.name = "TargetingKeyMissingError";
578
- this.code = "TARGETING_KEY_MISSING" /* TARGETING_KEY_MISSING */;
579
- }
580
- };
581
-
582
- // ../shared/src/errors/invalid-context-error.ts
583
- var InvalidContextError = class extends OpenFeatureError {
584
- constructor(message) {
585
- super(message);
586
- Object.setPrototypeOf(this, InvalidContextError.prototype);
587
- this.name = "InvalidContextError";
588
- this.code = "INVALID_CONTEXT" /* INVALID_CONTEXT */;
589
- }
590
- };
591
-
592
- // ../shared/src/provider/provider.ts
593
- var ProviderStatus = /* @__PURE__ */ ((ProviderStatus2) => {
594
- ProviderStatus2["NOT_READY"] = "NOT_READY";
595
- ProviderStatus2["READY"] = "READY";
596
- ProviderStatus2["ERROR"] = "ERROR";
597
- ProviderStatus2["STALE"] = "STALE";
598
- return ProviderStatus2;
599
- })(ProviderStatus || {});
600
-
601
- // ../shared/src/events/events.ts
602
- var ProviderEvents = /* @__PURE__ */ ((ProviderEvents2) => {
603
- ProviderEvents2["Ready"] = "PROVIDER_READY";
604
- ProviderEvents2["Error"] = "PROVIDER_ERROR";
605
- ProviderEvents2["ConfigurationChanged"] = "PROVIDER_CONFIGURATION_CHANGED";
606
- ProviderEvents2["Stale"] = "PROVIDER_STALE";
607
- return ProviderEvents2;
608
- })(ProviderEvents || {});
609
-
610
- // ../shared/src/events/event-utils.ts
611
- var eventStatusMap = {
612
- ["READY" /* READY */]: "PROVIDER_READY" /* Ready */,
613
- ["ERROR" /* ERROR */]: "PROVIDER_ERROR" /* Error */,
614
- ["STALE" /* STALE */]: "PROVIDER_STALE" /* Stale */,
615
- ["NOT_READY" /* NOT_READY */]: void 0
616
- };
617
- var statusMatchesEvent = (event, status) => {
618
- return !status && event === "PROVIDER_READY" /* Ready */ || eventStatusMap[status] === event;
619
- };
620
-
621
- // ../shared/src/events/open-feature-event-emitter.ts
622
- var import_events2 = __toESM(require_events());
623
-
624
- // ../shared/src/logger/default-logger.ts
625
- var DefaultLogger = class {
626
- error(...args) {
627
- console.error(...args);
628
- }
629
- warn(...args) {
630
- console.warn(...args);
631
- }
632
- info() {
633
- }
634
- debug() {
635
- }
636
- };
637
-
638
- // ../shared/src/logger/safe-logger.ts
639
- var LOG_LEVELS = ["error", "warn", "info", "debug"];
640
- var SafeLogger = class {
641
- constructor(logger) {
642
- this.fallbackLogger = new DefaultLogger();
643
- try {
644
- for (const level of LOG_LEVELS) {
645
- if (!logger[level] || typeof logger[level] !== "function") {
646
- throw new Error(`The provided logger is missing the ${level} method.`);
647
- }
648
- }
649
- this.logger = logger;
650
- } catch (err) {
651
- console.error(err);
652
- console.error("Falling back to the default logger.");
653
- this.logger = this.fallbackLogger;
654
- }
655
- }
656
- error(...args) {
657
- this.log("error", ...args);
658
- }
659
- warn(...args) {
660
- this.log("warn", ...args);
661
- }
662
- info(...args) {
663
- this.log("info", ...args);
664
- }
665
- debug(...args) {
666
- this.log("debug", ...args);
667
- }
668
- log(level, ...args) {
669
- try {
670
- this.logger[level](...args);
671
- } catch (error) {
672
- this.fallbackLogger[level](...args);
673
- }
674
- }
675
- };
676
-
677
- // ../shared/src/events/open-feature-event-emitter.ts
678
- var GenericEventEmitter = class {
679
- constructor(globalLogger) {
680
- this.globalLogger = globalLogger;
681
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
682
- this._handlers = /* @__PURE__ */ new WeakMap();
683
- this.eventEmitter = new import_events2.default({ captureRejections: true });
684
- this.eventEmitter.on("error", (err) => {
685
- var _a;
686
- (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
687
- });
688
- }
689
- emit(eventType, context) {
690
- this.eventEmitter.emit(eventType, context);
691
- }
692
- addHandler(eventType, handler) {
693
- const asyncHandler = (details) => __async(this, null, function* () {
694
- yield handler(details);
695
- });
696
- this._handlers.set(handler, asyncHandler);
697
- this.eventEmitter.on(eventType, asyncHandler);
698
- }
699
- removeHandler(eventType, handler) {
700
- const asyncHandler = this._handlers.get(handler);
701
- if (!asyncHandler) {
702
- return;
703
- }
704
- this.eventEmitter.removeListener(eventType, asyncHandler);
705
- }
706
- removeAllHandlers(eventType) {
707
- if (eventType) {
708
- this.eventEmitter.removeAllListeners(eventType);
709
- } else {
710
- this.eventEmitter.removeAllListeners();
711
- }
712
- }
713
- getHandlers(eventType) {
714
- return this.eventEmitter.listeners(eventType);
715
- }
716
- setLogger(logger) {
717
- this._eventLogger = new SafeLogger(logger);
718
- return this;
719
- }
720
- get _logger() {
721
- var _a, _b;
722
- return (_b = this._eventLogger) != null ? _b : (_a = this.globalLogger) == null ? void 0 : _a.call(this);
723
- }
724
- };
725
- var OpenFeatureEventEmitter = class extends GenericEventEmitter {
726
- };
727
- var InternalEventEmitter = class extends GenericEventEmitter {
728
- };
729
-
730
- // ../shared/src/transaction-context/no-op-transaction-context-propagator.ts
731
- var NoopTransactionContextPropagator = class {
732
- getTransactionContext() {
733
- return {};
734
- }
735
- setTransactionContext(_, callback) {
736
- callback();
737
- }
738
- };
739
- var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();
740
-
741
- // ../shared/src/type-guards.ts
742
- function isString(value) {
743
- return typeof value === "string";
744
- }
745
- function stringOrUndefined(value) {
746
- return isString(value) ? value : void 0;
747
- }
748
- function isObject(value) {
749
- return typeof value === "object";
750
- }
751
- function objectOrUndefined(value) {
752
- return isObject(value) ? value : void 0;
753
- }
754
-
755
- // ../shared/src/filter.ts
756
- function isDefined(input) {
757
- return typeof input !== "undefined" && input !== null;
758
- }
454
+ // src/client/open-feature-client.ts
455
+ var import_core3 = require("@openfeature/core");
759
456
 
760
- // ../shared/src/open-feature.ts
761
- var OpenFeatureCommonAPI = class {
762
- constructor(category) {
763
- this._hooks = [];
764
- this._transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
765
- this._context = {};
766
- this._logger = new DefaultLogger();
767
- this._events = new InternalEventEmitter(() => this._logger);
768
- this._clientEventHandlers = /* @__PURE__ */ new Map();
769
- this._clientProviders = /* @__PURE__ */ new Map();
770
- this._clientEvents = /* @__PURE__ */ new Map();
771
- this._runsOn = category;
772
- }
773
- addHooks(...hooks) {
774
- this._hooks = [...this._hooks, ...hooks];
775
- return this;
776
- }
777
- getHooks() {
778
- return this._hooks;
779
- }
780
- clearHooks() {
781
- this._hooks = [];
782
- return this;
783
- }
784
- setLogger(logger) {
785
- this._logger = new SafeLogger(logger);
786
- return this;
787
- }
788
- /**
789
- * Get metadata about registered provider.
790
- * @returns {ProviderMetadata} Provider Metadata
791
- */
792
- get providerMetadata() {
793
- return this._defaultProvider.metadata;
794
- }
795
- /**
796
- * Adds a handler for the given provider event type.
797
- * The handlers are called in the order they have been added.
798
- * API (global) events run for all providers.
799
- * @param {ProviderEvents} eventType The provider event type to listen to
800
- * @param {EventHandler} handler The handler to run on occurrence of the event type
801
- */
802
- addHandler(eventType, handler) {
803
- [.../* @__PURE__ */ new Map([[void 0, this._defaultProvider]]), ...this._clientProviders].forEach((keyProviderTuple) => {
804
- var _a;
805
- const clientName = keyProviderTuple[0];
806
- const provider = keyProviderTuple[1];
807
- const shouldRunNow = statusMatchesEvent(eventType, keyProviderTuple[1].status);
808
- if (shouldRunNow) {
809
- try {
810
- handler({ clientName, providerName: provider.metadata.name });
811
- } catch (err) {
812
- (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
813
- }
814
- }
815
- });
816
- this._events.addHandler(eventType, handler);
817
- }
818
- /**
819
- * Removes a handler for the given provider event type.
820
- * @param {ProviderEvents} eventType The provider event type to remove the listener for
821
- * @param {EventHandler} handler The handler to remove for the provider event type
822
- */
823
- removeHandler(eventType, handler) {
824
- this._events.removeHandler(eventType, handler);
825
- }
826
- /**
827
- * Gets the current handlers for the given provider event type.
828
- * @param {ProviderEvents} eventType The provider event type to get the current handlers for
829
- * @returns {EventHandler[]} The handlers currently attached to the given provider event type
830
- */
831
- getHandlers(eventType) {
832
- return this._events.getHandlers(eventType);
833
- }
834
- setProviderAndWait(clientOrProvider, providerOrUndefined) {
835
- return __async(this, null, function* () {
836
- yield this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
837
- });
838
- }
839
- setProvider(clientOrProvider, providerOrUndefined) {
840
- const maybePromise = this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
841
- if (maybePromise) {
842
- maybePromise.catch(() => {
843
- });
844
- }
845
- return this;
846
- }
847
- setAwaitableProvider(clientOrProvider, providerOrUndefined) {
848
- var _a, _b, _c, _d, _e, _f;
849
- const clientName = stringOrUndefined(clientOrProvider);
850
- const provider = (_a = objectOrUndefined(clientOrProvider)) != null ? _a : objectOrUndefined(providerOrUndefined);
851
- if (!provider) {
852
- this._logger.debug("No provider defined, ignoring setProvider call");
853
- return;
854
- }
855
- const oldProvider = this.getProviderForClient(clientName);
856
- const providerName = provider.metadata.name;
857
- if (oldProvider === provider) {
858
- this._logger.debug("Provider is already set, ignoring setProvider call");
859
- return;
860
- }
861
- if (!provider.runsOn) {
862
- this._logger.debug(`Provider '${provider.metadata.name}' has not defined its intended use.`);
863
- } else if (provider.runsOn !== this._runsOn) {
864
- throw new GeneralError(`Provider '${provider.metadata.name}' is intended for use on the ${provider.runsOn}.`);
865
- }
866
- const emitters = this.getAssociatedEventEmitters(clientName);
867
- if (typeof provider.initialize === "function" && provider.status === void 0) {
868
- const activeLogger = this._logger || console;
869
- activeLogger.warn(
870
- `Provider ${providerName} implements 'initialize' but not 'status'. Please implement 'status'.`
871
- );
872
- }
873
- let initializationPromise = void 0;
874
- if ((provider == null ? void 0 : provider.status) === "NOT_READY" /* NOT_READY */ && typeof provider.initialize === "function") {
875
- initializationPromise = (_d = (_c = (_b = provider.initialize) == null ? void 0 : _b.call(provider, this._context)) == null ? void 0 : _c.then(() => {
876
- var _a2;
877
- this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
878
- emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
879
- });
880
- (_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
881
- })) == null ? void 0 : _d.catch((error) => {
882
- var _a2;
883
- this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
884
- emitter == null ? void 0 : emitter.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
885
- });
886
- (_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
887
- throw error;
888
- });
889
- } else {
890
- emitters.forEach((emitter) => {
891
- emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
892
- });
893
- (_e = this._events) == null ? void 0 : _e.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
894
- }
895
- if (clientName) {
896
- this._clientProviders.set(clientName, provider);
897
- } else {
898
- this._defaultProvider = provider;
899
- }
900
- this.transferListeners(oldProvider, provider, clientName, emitters);
901
- if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {
902
- (_f = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _f.call(oldProvider);
903
- }
904
- return initializationPromise;
905
- }
906
- getProviderForClient(name) {
907
- var _a;
908
- if (!name) {
909
- return this._defaultProvider;
910
- }
911
- return (_a = this._clientProviders.get(name)) != null ? _a : this._defaultProvider;
912
- }
913
- buildAndCacheEventEmitterForClient(name) {
914
- const emitter = this._clientEvents.get(name);
915
- if (emitter) {
916
- return emitter;
917
- }
918
- const newEmitter = new InternalEventEmitter(() => this._logger);
919
- this._clientEvents.set(name, newEmitter);
920
- const clientProvider = this.getProviderForClient(name);
921
- Object.values(ProviderEvents).forEach(
922
- (eventType) => {
923
- var _a;
924
- return (_a = clientProvider.events) == null ? void 0 : _a.addHandler(eventType, (details) => __async(this, null, function* () {
925
- newEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName: name, providerName: clientProvider.metadata.name }));
926
- }));
927
- }
928
- );
929
- return newEmitter;
930
- }
931
- getUnboundEmitters() {
932
- const namedProviders = [...this._clientProviders.keys()];
933
- const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined);
934
- const unboundEmitterNames = eventEmitterNames.filter((name) => !namedProviders.includes(name));
935
- return [
936
- // all unbound, named emitters
937
- ...unboundEmitterNames.map((name) => this._clientEvents.get(name)),
938
- // the default emitter
939
- this._clientEvents.get(void 0)
940
- ].filter(isDefined);
941
- }
942
- getAssociatedEventEmitters(clientName) {
943
- return clientName ? [this.buildAndCacheEventEmitterForClient(clientName)] : this.getUnboundEmitters();
944
- }
945
- transferListeners(oldProvider, newProvider, clientName, emitters) {
946
- var _a;
947
- (_a = this._clientEventHandlers.get(clientName)) == null ? void 0 : _a.forEach((eventHandler) => {
948
- var _a2;
949
- return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler);
950
- });
951
- const newClientHandlers = Object.values(ProviderEvents).map((eventType) => {
952
- const handler = (details) => __async(this, null, function* () {
953
- emitters.forEach((emitter) => {
954
- emitter == null ? void 0 : emitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
955
- });
956
- this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
957
- });
958
- return [eventType, handler];
959
- });
960
- this._clientEventHandlers.set(clientName, newClientHandlers);
961
- newClientHandlers.forEach((eventHandler) => {
962
- var _a2;
963
- return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(...eventHandler);
964
- });
965
- }
966
- close() {
967
- return __async(this, null, function* () {
968
- var _a, _b;
969
- try {
970
- yield (_b = (_a = this == null ? void 0 : this._defaultProvider) == null ? void 0 : _a.onClose) == null ? void 0 : _b.call(_a);
971
- } catch (err) {
972
- this.handleShutdownError(this._defaultProvider, err);
973
- }
974
- const providers = Array.from(this._clientProviders);
975
- yield Promise.all(
976
- providers.map((_0) => __async(this, [_0], function* ([, provider]) {
977
- var _a2;
978
- try {
979
- yield (_a2 = provider.onClose) == null ? void 0 : _a2.call(provider);
980
- } catch (err) {
981
- this.handleShutdownError(this._defaultProvider, err);
982
- }
983
- }))
984
- );
985
- });
986
- }
987
- handleShutdownError(provider, err) {
988
- this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);
989
- this._logger.error(err == null ? void 0 : err.stack);
990
- }
991
- setTransactionContextPropagator(transactionContextPropagator) {
992
- const baseMessage = "Invalid TransactionContextPropagator, will not be set: ";
993
- if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.getTransactionContext) !== "function") {
994
- this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);
995
- } else if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.setTransactionContext) !== "function") {
996
- this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);
997
- } else {
998
- this._transactionContextPropagator = transactionContextPropagator;
999
- }
1000
- return this;
1001
- }
1002
- setTransactionContext(transactionContext, callback, ...args) {
1003
- this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);
1004
- }
1005
- getTransactionContext() {
1006
- try {
1007
- return this._transactionContextPropagator.getTransactionContext();
1008
- } catch (err) {
1009
- const error = err;
1010
- this._logger.error(`Error getting transaction context: ${error == null ? void 0 : error.message}, returning empty context.`);
1011
- this._logger.error(error == null ? void 0 : error.stack);
1012
- return {};
1013
- }
1014
- }
1015
- };
457
+ // src/open-feature.ts
458
+ var import_core2 = require("@openfeature/core");
1016
459
 
1017
460
  // src/provider/no-op-provider.ts
461
+ var import_core = require("@openfeature/core");
1018
462
  var REASON_NO_OP = "No-op";
1019
463
  var NoopFeatureProvider = class {
1020
464
  constructor() {
@@ -1023,7 +467,7 @@ var NoopFeatureProvider = class {
1023
467
  };
1024
468
  }
1025
469
  get status() {
1026
- return "NOT_READY" /* NOT_READY */;
470
+ return import_core.ProviderStatus.NOT_READY;
1027
471
  }
1028
472
  resolveBooleanEvaluation(_, defaultValue) {
1029
473
  return this.noOp(defaultValue);
@@ -1049,7 +493,7 @@ var NOOP_PROVIDER = new NoopFeatureProvider();
1049
493
  // src/open-feature.ts
1050
494
  var GLOBAL_OPENFEATURE_API_KEY = Symbol.for("@openfeature/web-sdk/api");
1051
495
  var _globalThis = globalThis;
1052
- var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
496
+ var OpenFeatureAPI = class extends import_core2.OpenFeatureCommonAPI {
1053
497
  // eslint-disable-next-line @typescript-eslint/no-empty-function
1054
498
  constructor() {
1055
499
  super("client");
@@ -1110,6 +554,13 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
1110
554
  { name, version }
1111
555
  );
1112
556
  }
557
+ /**
558
+ * Clears all registered providers and resets the default provider.
559
+ * @returns {Promise<void>}
560
+ */
561
+ clearProviders() {
562
+ return super.clearProvidersAndSetDefault(NOOP_PROVIDER);
563
+ }
1113
564
  };
1114
565
  var OpenFeature = OpenFeatureAPI.getInstance();
1115
566
 
@@ -1132,8 +583,8 @@ var OpenFeatureClient = class {
1132
583
  addHandler(eventType, handler) {
1133
584
  var _a;
1134
585
  this.emitterAccessor().addHandler(eventType, handler);
1135
- const providerReady = !this._provider.status || this._provider.status === "READY" /* READY */;
1136
- if (eventType === "PROVIDER_READY" /* Ready */ && providerReady) {
586
+ const providerReady = !this._provider.status || this._provider.status === import_core3.ProviderStatus.READY;
587
+ if (eventType === import_core3.ProviderEvents.Ready && providerReady) {
1137
588
  try {
1138
589
  handler({ clientName: this.metadata.name, providerName: this._provider.metadata.name });
1139
590
  } catch (err) {
@@ -1148,7 +599,7 @@ var OpenFeatureClient = class {
1148
599
  return this.emitterAccessor().getHandlers(eventType);
1149
600
  }
1150
601
  setLogger(logger) {
1151
- this._clientLogger = new SafeLogger(logger);
602
+ this._clientLogger = new import_core3.SafeLogger(logger);
1152
603
  return this;
1153
604
  }
1154
605
  addHooks(...hooks) {
@@ -1230,13 +681,13 @@ var OpenFeatureClient = class {
1230
681
  return evaluationDetails;
1231
682
  } catch (err) {
1232
683
  const errorMessage = err == null ? void 0 : err.message;
1233
- const errorCode = (err == null ? void 0 : err.code) || "GENERAL" /* GENERAL */;
684
+ const errorCode = (err == null ? void 0 : err.code) || import_core3.ErrorCode.GENERAL;
1234
685
  this.errorHooks(allHooksReversed, hookContext, err, options);
1235
686
  return {
1236
687
  errorCode,
1237
688
  errorMessage,
1238
689
  value: defaultValue,
1239
- reason: StandardResolutionReasons.ERROR,
690
+ reason: import_core3.StandardResolutionReasons.ERROR,
1240
691
  flagMetadata: Object.freeze({}),
1241
692
  flagKey
1242
693
  };
@@ -1293,4 +744,7 @@ var OpenFeatureClient = class {
1293
744
  return this._clientLogger || this.globalLogger();
1294
745
  }
1295
746
  };
747
+
748
+ // src/index.ts
749
+ __reExport(src_exports, require("@openfeature/core"), module.exports);
1296
750
  //# sourceMappingURL=index.js.map