@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/esm/index.js CHANGED
@@ -88,22 +88,22 @@ var require_events = __commonJS({
88
88
  var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) {
89
89
  return value !== value;
90
90
  };
91
- function EventEmitter2() {
92
- EventEmitter2.init.call(this);
91
+ function EventEmitter() {
92
+ EventEmitter.init.call(this);
93
93
  }
94
- module.exports = EventEmitter2;
94
+ module.exports = EventEmitter;
95
95
  module.exports.once = once;
96
- EventEmitter2.EventEmitter = EventEmitter2;
97
- EventEmitter2.prototype._events = void 0;
98
- EventEmitter2.prototype._eventsCount = 0;
99
- EventEmitter2.prototype._maxListeners = void 0;
96
+ EventEmitter.EventEmitter = EventEmitter;
97
+ EventEmitter.prototype._events = void 0;
98
+ EventEmitter.prototype._eventsCount = 0;
99
+ EventEmitter.prototype._maxListeners = void 0;
100
100
  var defaultMaxListeners = 10;
101
101
  function checkListener(listener) {
102
102
  if (typeof listener !== "function") {
103
103
  throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
104
104
  }
105
105
  }
106
- Object.defineProperty(EventEmitter2, "defaultMaxListeners", {
106
+ Object.defineProperty(EventEmitter, "defaultMaxListeners", {
107
107
  enumerable: true,
108
108
  get: function() {
109
109
  return defaultMaxListeners;
@@ -115,14 +115,14 @@ var require_events = __commonJS({
115
115
  defaultMaxListeners = arg;
116
116
  }
117
117
  });
118
- EventEmitter2.init = function() {
118
+ EventEmitter.init = function() {
119
119
  if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) {
120
120
  this._events = /* @__PURE__ */ Object.create(null);
121
121
  this._eventsCount = 0;
122
122
  }
123
123
  this._maxListeners = this._maxListeners || void 0;
124
124
  };
125
- EventEmitter2.prototype.setMaxListeners = function setMaxListeners(n) {
125
+ EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
126
126
  if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) {
127
127
  throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + ".");
128
128
  }
@@ -131,13 +131,13 @@ var require_events = __commonJS({
131
131
  };
132
132
  function _getMaxListeners(that) {
133
133
  if (that._maxListeners === void 0)
134
- return EventEmitter2.defaultMaxListeners;
134
+ return EventEmitter.defaultMaxListeners;
135
135
  return that._maxListeners;
136
136
  }
137
- EventEmitter2.prototype.getMaxListeners = function getMaxListeners() {
137
+ EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
138
138
  return _getMaxListeners(this);
139
139
  };
140
- EventEmitter2.prototype.emit = function emit(type) {
140
+ EventEmitter.prototype.emit = function emit(type) {
141
141
  var args = [];
142
142
  for (var i = 1; i < arguments.length; i++)
143
143
  args.push(arguments[i]);
@@ -215,11 +215,11 @@ var require_events = __commonJS({
215
215
  }
216
216
  return target;
217
217
  }
218
- EventEmitter2.prototype.addListener = function addListener(type, listener) {
218
+ EventEmitter.prototype.addListener = function addListener(type, listener) {
219
219
  return _addListener(this, type, listener, false);
220
220
  };
221
- EventEmitter2.prototype.on = EventEmitter2.prototype.addListener;
222
- EventEmitter2.prototype.prependListener = function prependListener(type, listener) {
221
+ EventEmitter.prototype.on = EventEmitter.prototype.addListener;
222
+ EventEmitter.prototype.prependListener = function prependListener(type, listener) {
223
223
  return _addListener(this, type, listener, true);
224
224
  };
225
225
  function onceWrapper() {
@@ -238,17 +238,17 @@ var require_events = __commonJS({
238
238
  state.wrapFn = wrapped;
239
239
  return wrapped;
240
240
  }
241
- EventEmitter2.prototype.once = function once2(type, listener) {
241
+ EventEmitter.prototype.once = function once2(type, listener) {
242
242
  checkListener(listener);
243
243
  this.on(type, _onceWrap(this, type, listener));
244
244
  return this;
245
245
  };
246
- EventEmitter2.prototype.prependOnceListener = function prependOnceListener(type, listener) {
246
+ EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) {
247
247
  checkListener(listener);
248
248
  this.prependListener(type, _onceWrap(this, type, listener));
249
249
  return this;
250
250
  };
251
- EventEmitter2.prototype.removeListener = function removeListener(type, listener) {
251
+ EventEmitter.prototype.removeListener = function removeListener(type, listener) {
252
252
  var list, events, position, i, originalListener;
253
253
  checkListener(listener);
254
254
  events = this._events;
@@ -288,8 +288,8 @@ var require_events = __commonJS({
288
288
  }
289
289
  return this;
290
290
  };
291
- EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;
292
- EventEmitter2.prototype.removeAllListeners = function removeAllListeners(type) {
291
+ EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
292
+ EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {
293
293
  var listeners, events, i;
294
294
  events = this._events;
295
295
  if (events === void 0)
@@ -341,20 +341,20 @@ var require_events = __commonJS({
341
341
  return unwrap ? [evlistener.listener || evlistener] : [evlistener];
342
342
  return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
343
343
  }
344
- EventEmitter2.prototype.listeners = function listeners(type) {
344
+ EventEmitter.prototype.listeners = function listeners(type) {
345
345
  return _listeners(this, type, true);
346
346
  };
347
- EventEmitter2.prototype.rawListeners = function rawListeners(type) {
347
+ EventEmitter.prototype.rawListeners = function rawListeners(type) {
348
348
  return _listeners(this, type, false);
349
349
  };
350
- EventEmitter2.listenerCount = function(emitter, type) {
350
+ EventEmitter.listenerCount = function(emitter, type) {
351
351
  if (typeof emitter.listenerCount === "function") {
352
352
  return emitter.listenerCount(type);
353
353
  } else {
354
354
  return listenerCount.call(emitter, type);
355
355
  }
356
356
  };
357
- EventEmitter2.prototype.listenerCount = listenerCount;
357
+ EventEmitter.prototype.listenerCount = listenerCount;
358
358
  function listenerCount(type) {
359
359
  var events = this._events;
360
360
  if (events !== void 0) {
@@ -367,7 +367,7 @@ var require_events = __commonJS({
367
367
  }
368
368
  return 0;
369
369
  }
370
- EventEmitter2.prototype.eventNames = function eventNames() {
370
+ EventEmitter.prototype.eventNames = function eventNames() {
371
371
  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
372
372
  };
373
373
  function arrayClone(arr, n) {
@@ -433,549 +433,23 @@ var require_events = __commonJS({
433
433
  }
434
434
  });
435
435
 
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
446
- var StandardResolutionReasons = {
447
- /**
448
- * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.
449
- */
450
- TARGETING_MATCH: "TARGETING_MATCH",
451
- /**
452
- * The resolved value was the result of pseudorandom assignment.
453
- */
454
- SPLIT: "SPLIT",
455
- /**
456
- * The resolved value was the result of the flag being disabled in the management system.
457
- */
458
- DISABLED: "DISABLED",
459
- /**
460
- * The resolved value was configured statically, or otherwise fell back to a pre-configured value.
461
- */
462
- DEFAULT: "DEFAULT",
463
- /**
464
- * The reason for the resolved value could not be determined.
465
- */
466
- UNKNOWN: "UNKNOWN",
467
- /**
468
- * The resolved value is static (no dynamic evaluation).
469
- */
470
- STATIC: "STATIC",
471
- /**
472
- * The resolved value was retrieved from cache.
473
- */
474
- CACHED: "CACHED",
475
- /**
476
- * The resolved value was the result of an error.
477
- *
478
- * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.
479
- */
480
- ERROR: "ERROR"
481
- };
482
- var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
483
- ErrorCode2["PROVIDER_NOT_READY"] = "PROVIDER_NOT_READY";
484
- ErrorCode2["FLAG_NOT_FOUND"] = "FLAG_NOT_FOUND";
485
- ErrorCode2["PARSE_ERROR"] = "PARSE_ERROR";
486
- ErrorCode2["TYPE_MISMATCH"] = "TYPE_MISMATCH";
487
- ErrorCode2["TARGETING_KEY_MISSING"] = "TARGETING_KEY_MISSING";
488
- ErrorCode2["INVALID_CONTEXT"] = "INVALID_CONTEXT";
489
- ErrorCode2["GENERAL"] = "GENERAL";
490
- return ErrorCode2;
491
- })(ErrorCode || {});
492
-
493
- // ../shared/src/errors/general-error.ts
494
- var GeneralError = class extends OpenFeatureError {
495
- constructor(message) {
496
- super(message);
497
- Object.setPrototypeOf(this, GeneralError.prototype);
498
- this.name = "GeneralError";
499
- this.code = "GENERAL" /* GENERAL */;
500
- }
501
- };
502
-
503
- // ../shared/src/errors/flag-not-found-error.ts
504
- var FlagNotFoundError = class extends OpenFeatureError {
505
- constructor(message) {
506
- super(message);
507
- Object.setPrototypeOf(this, FlagNotFoundError.prototype);
508
- this.name = "FlagNotFoundError";
509
- this.code = "FLAG_NOT_FOUND" /* FLAG_NOT_FOUND */;
510
- }
511
- };
512
-
513
- // ../shared/src/errors/parse-error.ts
514
- var ParseError = class extends OpenFeatureError {
515
- constructor(message) {
516
- super(message);
517
- Object.setPrototypeOf(this, ParseError.prototype);
518
- this.name = "ParseError";
519
- this.code = "PARSE_ERROR" /* PARSE_ERROR */;
520
- }
521
- };
522
-
523
- // ../shared/src/errors/type-mismatch-error.ts
524
- var TypeMismatchError = class extends OpenFeatureError {
525
- constructor(message) {
526
- super(message);
527
- Object.setPrototypeOf(this, TypeMismatchError.prototype);
528
- this.name = "TypeMismatchError";
529
- this.code = "TYPE_MISMATCH" /* TYPE_MISMATCH */;
530
- }
531
- };
532
-
533
- // ../shared/src/errors/targeting-key-missing-error.ts
534
- var TargetingKeyMissingError = class extends OpenFeatureError {
535
- constructor(message) {
536
- super(message);
537
- Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);
538
- this.name = "TargetingKeyMissingError";
539
- this.code = "TARGETING_KEY_MISSING" /* TARGETING_KEY_MISSING */;
540
- }
541
- };
542
-
543
- // ../shared/src/errors/invalid-context-error.ts
544
- var InvalidContextError = class extends OpenFeatureError {
545
- constructor(message) {
546
- super(message);
547
- Object.setPrototypeOf(this, InvalidContextError.prototype);
548
- this.name = "InvalidContextError";
549
- this.code = "INVALID_CONTEXT" /* INVALID_CONTEXT */;
550
- }
551
- };
552
-
553
- // ../shared/src/provider/provider.ts
554
- var ProviderStatus = /* @__PURE__ */ ((ProviderStatus2) => {
555
- ProviderStatus2["NOT_READY"] = "NOT_READY";
556
- ProviderStatus2["READY"] = "READY";
557
- ProviderStatus2["ERROR"] = "ERROR";
558
- ProviderStatus2["STALE"] = "STALE";
559
- return ProviderStatus2;
560
- })(ProviderStatus || {});
561
-
562
- // ../shared/src/events/events.ts
563
- var ProviderEvents = /* @__PURE__ */ ((ProviderEvents2) => {
564
- ProviderEvents2["Ready"] = "PROVIDER_READY";
565
- ProviderEvents2["Error"] = "PROVIDER_ERROR";
566
- ProviderEvents2["ConfigurationChanged"] = "PROVIDER_CONFIGURATION_CHANGED";
567
- ProviderEvents2["Stale"] = "PROVIDER_STALE";
568
- return ProviderEvents2;
569
- })(ProviderEvents || {});
570
-
571
- // ../shared/src/events/event-utils.ts
572
- var eventStatusMap = {
573
- ["READY" /* READY */]: "PROVIDER_READY" /* Ready */,
574
- ["ERROR" /* ERROR */]: "PROVIDER_ERROR" /* Error */,
575
- ["STALE" /* STALE */]: "PROVIDER_STALE" /* Stale */,
576
- ["NOT_READY" /* NOT_READY */]: void 0
577
- };
578
- var statusMatchesEvent = (event, status) => {
579
- return !status && event === "PROVIDER_READY" /* Ready */ || eventStatusMap[status] === event;
580
- };
581
-
582
- // ../shared/src/events/open-feature-event-emitter.ts
583
- var import_events2 = __toESM(require_events());
584
-
585
- // ../shared/src/logger/default-logger.ts
586
- var DefaultLogger = class {
587
- error(...args) {
588
- console.error(...args);
589
- }
590
- warn(...args) {
591
- console.warn(...args);
592
- }
593
- info() {
594
- }
595
- debug() {
596
- }
597
- };
598
-
599
- // ../shared/src/logger/safe-logger.ts
600
- var LOG_LEVELS = ["error", "warn", "info", "debug"];
601
- var SafeLogger = class {
602
- constructor(logger) {
603
- this.fallbackLogger = new DefaultLogger();
604
- try {
605
- for (const level of LOG_LEVELS) {
606
- if (!logger[level] || typeof logger[level] !== "function") {
607
- throw new Error(`The provided logger is missing the ${level} method.`);
608
- }
609
- }
610
- this.logger = logger;
611
- } catch (err) {
612
- console.error(err);
613
- console.error("Falling back to the default logger.");
614
- this.logger = this.fallbackLogger;
615
- }
616
- }
617
- error(...args) {
618
- this.log("error", ...args);
619
- }
620
- warn(...args) {
621
- this.log("warn", ...args);
622
- }
623
- info(...args) {
624
- this.log("info", ...args);
625
- }
626
- debug(...args) {
627
- this.log("debug", ...args);
628
- }
629
- log(level, ...args) {
630
- try {
631
- this.logger[level](...args);
632
- } catch (error) {
633
- this.fallbackLogger[level](...args);
634
- }
635
- }
636
- };
637
-
638
- // ../shared/src/events/open-feature-event-emitter.ts
639
- var GenericEventEmitter = class {
640
- constructor(globalLogger) {
641
- this.globalLogger = globalLogger;
642
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
643
- this._handlers = /* @__PURE__ */ new WeakMap();
644
- this.eventEmitter = new import_events2.default({ captureRejections: true });
645
- this.eventEmitter.on("error", (err) => {
646
- var _a;
647
- (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
648
- });
649
- }
650
- emit(eventType, context) {
651
- this.eventEmitter.emit(eventType, context);
652
- }
653
- addHandler(eventType, handler) {
654
- const asyncHandler = (details) => __async(this, null, function* () {
655
- yield handler(details);
656
- });
657
- this._handlers.set(handler, asyncHandler);
658
- this.eventEmitter.on(eventType, asyncHandler);
659
- }
660
- removeHandler(eventType, handler) {
661
- const asyncHandler = this._handlers.get(handler);
662
- if (!asyncHandler) {
663
- return;
664
- }
665
- this.eventEmitter.removeListener(eventType, asyncHandler);
666
- }
667
- removeAllHandlers(eventType) {
668
- if (eventType) {
669
- this.eventEmitter.removeAllListeners(eventType);
670
- } else {
671
- this.eventEmitter.removeAllListeners();
672
- }
673
- }
674
- getHandlers(eventType) {
675
- return this.eventEmitter.listeners(eventType);
676
- }
677
- setLogger(logger) {
678
- this._eventLogger = new SafeLogger(logger);
679
- return this;
680
- }
681
- get _logger() {
682
- var _a, _b;
683
- return (_b = this._eventLogger) != null ? _b : (_a = this.globalLogger) == null ? void 0 : _a.call(this);
684
- }
685
- };
686
- var OpenFeatureEventEmitter = class extends GenericEventEmitter {
687
- };
688
- var InternalEventEmitter = class extends GenericEventEmitter {
689
- };
690
-
691
- // ../shared/src/transaction-context/no-op-transaction-context-propagator.ts
692
- var NoopTransactionContextPropagator = class {
693
- getTransactionContext() {
694
- return {};
695
- }
696
- setTransactionContext(_, callback) {
697
- callback();
698
- }
699
- };
700
- var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();
701
-
702
- // ../shared/src/type-guards.ts
703
- function isString(value) {
704
- return typeof value === "string";
705
- }
706
- function stringOrUndefined(value) {
707
- return isString(value) ? value : void 0;
708
- }
709
- function isObject(value) {
710
- return typeof value === "object";
711
- }
712
- function objectOrUndefined(value) {
713
- return isObject(value) ? value : void 0;
714
- }
436
+ // src/index.ts
437
+ var import_events = __toESM(require_events());
715
438
 
716
- // ../shared/src/filter.ts
717
- function isDefined(input) {
718
- return typeof input !== "undefined" && input !== null;
719
- }
439
+ // src/client/open-feature-client.ts
440
+ import {
441
+ ErrorCode,
442
+ ProviderEvents,
443
+ ProviderStatus as ProviderStatus2,
444
+ SafeLogger,
445
+ StandardResolutionReasons
446
+ } from "@openfeature/core";
720
447
 
721
- // ../shared/src/open-feature.ts
722
- var OpenFeatureCommonAPI = class {
723
- constructor(category) {
724
- this._hooks = [];
725
- this._transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
726
- this._context = {};
727
- this._logger = new DefaultLogger();
728
- this._events = new InternalEventEmitter(() => this._logger);
729
- this._clientEventHandlers = /* @__PURE__ */ new Map();
730
- this._clientProviders = /* @__PURE__ */ new Map();
731
- this._clientEvents = /* @__PURE__ */ new Map();
732
- this._runsOn = category;
733
- }
734
- addHooks(...hooks) {
735
- this._hooks = [...this._hooks, ...hooks];
736
- return this;
737
- }
738
- getHooks() {
739
- return this._hooks;
740
- }
741
- clearHooks() {
742
- this._hooks = [];
743
- return this;
744
- }
745
- setLogger(logger) {
746
- this._logger = new SafeLogger(logger);
747
- return this;
748
- }
749
- /**
750
- * Get metadata about registered provider.
751
- * @returns {ProviderMetadata} Provider Metadata
752
- */
753
- get providerMetadata() {
754
- return this._defaultProvider.metadata;
755
- }
756
- /**
757
- * Adds a handler for the given provider event type.
758
- * The handlers are called in the order they have been added.
759
- * API (global) events run for all providers.
760
- * @param {ProviderEvents} eventType The provider event type to listen to
761
- * @param {EventHandler} handler The handler to run on occurrence of the event type
762
- */
763
- addHandler(eventType, handler) {
764
- [.../* @__PURE__ */ new Map([[void 0, this._defaultProvider]]), ...this._clientProviders].forEach((keyProviderTuple) => {
765
- var _a;
766
- const clientName = keyProviderTuple[0];
767
- const provider = keyProviderTuple[1];
768
- const shouldRunNow = statusMatchesEvent(eventType, keyProviderTuple[1].status);
769
- if (shouldRunNow) {
770
- try {
771
- handler({ clientName, providerName: provider.metadata.name });
772
- } catch (err) {
773
- (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
774
- }
775
- }
776
- });
777
- this._events.addHandler(eventType, handler);
778
- }
779
- /**
780
- * Removes a handler for the given provider event type.
781
- * @param {ProviderEvents} eventType The provider event type to remove the listener for
782
- * @param {EventHandler} handler The handler to remove for the provider event type
783
- */
784
- removeHandler(eventType, handler) {
785
- this._events.removeHandler(eventType, handler);
786
- }
787
- /**
788
- * Gets the current handlers for the given provider event type.
789
- * @param {ProviderEvents} eventType The provider event type to get the current handlers for
790
- * @returns {EventHandler[]} The handlers currently attached to the given provider event type
791
- */
792
- getHandlers(eventType) {
793
- return this._events.getHandlers(eventType);
794
- }
795
- setProviderAndWait(clientOrProvider, providerOrUndefined) {
796
- return __async(this, null, function* () {
797
- yield this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
798
- });
799
- }
800
- setProvider(clientOrProvider, providerOrUndefined) {
801
- const maybePromise = this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
802
- if (maybePromise) {
803
- maybePromise.catch(() => {
804
- });
805
- }
806
- return this;
807
- }
808
- setAwaitableProvider(clientOrProvider, providerOrUndefined) {
809
- var _a, _b, _c, _d, _e, _f;
810
- const clientName = stringOrUndefined(clientOrProvider);
811
- const provider = (_a = objectOrUndefined(clientOrProvider)) != null ? _a : objectOrUndefined(providerOrUndefined);
812
- if (!provider) {
813
- this._logger.debug("No provider defined, ignoring setProvider call");
814
- return;
815
- }
816
- const oldProvider = this.getProviderForClient(clientName);
817
- const providerName = provider.metadata.name;
818
- if (oldProvider === provider) {
819
- this._logger.debug("Provider is already set, ignoring setProvider call");
820
- return;
821
- }
822
- if (!provider.runsOn) {
823
- this._logger.debug(`Provider '${provider.metadata.name}' has not defined its intended use.`);
824
- } else if (provider.runsOn !== this._runsOn) {
825
- throw new GeneralError(`Provider '${provider.metadata.name}' is intended for use on the ${provider.runsOn}.`);
826
- }
827
- const emitters = this.getAssociatedEventEmitters(clientName);
828
- if (typeof provider.initialize === "function" && provider.status === void 0) {
829
- const activeLogger = this._logger || console;
830
- activeLogger.warn(
831
- `Provider ${providerName} implements 'initialize' but not 'status'. Please implement 'status'.`
832
- );
833
- }
834
- let initializationPromise = void 0;
835
- if ((provider == null ? void 0 : provider.status) === "NOT_READY" /* NOT_READY */ && typeof provider.initialize === "function") {
836
- initializationPromise = (_d = (_c = (_b = provider.initialize) == null ? void 0 : _b.call(provider, this._context)) == null ? void 0 : _c.then(() => {
837
- var _a2;
838
- this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
839
- emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
840
- });
841
- (_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
842
- })) == null ? void 0 : _d.catch((error) => {
843
- var _a2;
844
- this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
845
- emitter == null ? void 0 : emitter.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
846
- });
847
- (_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
848
- throw error;
849
- });
850
- } else {
851
- emitters.forEach((emitter) => {
852
- emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
853
- });
854
- (_e = this._events) == null ? void 0 : _e.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
855
- }
856
- if (clientName) {
857
- this._clientProviders.set(clientName, provider);
858
- } else {
859
- this._defaultProvider = provider;
860
- }
861
- this.transferListeners(oldProvider, provider, clientName, emitters);
862
- if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {
863
- (_f = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _f.call(oldProvider);
864
- }
865
- return initializationPromise;
866
- }
867
- getProviderForClient(name) {
868
- var _a;
869
- if (!name) {
870
- return this._defaultProvider;
871
- }
872
- return (_a = this._clientProviders.get(name)) != null ? _a : this._defaultProvider;
873
- }
874
- buildAndCacheEventEmitterForClient(name) {
875
- const emitter = this._clientEvents.get(name);
876
- if (emitter) {
877
- return emitter;
878
- }
879
- const newEmitter = new InternalEventEmitter(() => this._logger);
880
- this._clientEvents.set(name, newEmitter);
881
- const clientProvider = this.getProviderForClient(name);
882
- Object.values(ProviderEvents).forEach(
883
- (eventType) => {
884
- var _a;
885
- return (_a = clientProvider.events) == null ? void 0 : _a.addHandler(eventType, (details) => __async(this, null, function* () {
886
- newEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName: name, providerName: clientProvider.metadata.name }));
887
- }));
888
- }
889
- );
890
- return newEmitter;
891
- }
892
- getUnboundEmitters() {
893
- const namedProviders = [...this._clientProviders.keys()];
894
- const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined);
895
- const unboundEmitterNames = eventEmitterNames.filter((name) => !namedProviders.includes(name));
896
- return [
897
- // all unbound, named emitters
898
- ...unboundEmitterNames.map((name) => this._clientEvents.get(name)),
899
- // the default emitter
900
- this._clientEvents.get(void 0)
901
- ].filter(isDefined);
902
- }
903
- getAssociatedEventEmitters(clientName) {
904
- return clientName ? [this.buildAndCacheEventEmitterForClient(clientName)] : this.getUnboundEmitters();
905
- }
906
- transferListeners(oldProvider, newProvider, clientName, emitters) {
907
- var _a;
908
- (_a = this._clientEventHandlers.get(clientName)) == null ? void 0 : _a.forEach((eventHandler) => {
909
- var _a2;
910
- return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler);
911
- });
912
- const newClientHandlers = Object.values(ProviderEvents).map((eventType) => {
913
- const handler = (details) => __async(this, null, function* () {
914
- emitters.forEach((emitter) => {
915
- emitter == null ? void 0 : emitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
916
- });
917
- this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
918
- });
919
- return [eventType, handler];
920
- });
921
- this._clientEventHandlers.set(clientName, newClientHandlers);
922
- newClientHandlers.forEach((eventHandler) => {
923
- var _a2;
924
- return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(...eventHandler);
925
- });
926
- }
927
- close() {
928
- return __async(this, null, function* () {
929
- var _a, _b;
930
- try {
931
- yield (_b = (_a = this == null ? void 0 : this._defaultProvider) == null ? void 0 : _a.onClose) == null ? void 0 : _b.call(_a);
932
- } catch (err) {
933
- this.handleShutdownError(this._defaultProvider, err);
934
- }
935
- const providers = Array.from(this._clientProviders);
936
- yield Promise.all(
937
- providers.map((_0) => __async(this, [_0], function* ([, provider]) {
938
- var _a2;
939
- try {
940
- yield (_a2 = provider.onClose) == null ? void 0 : _a2.call(provider);
941
- } catch (err) {
942
- this.handleShutdownError(this._defaultProvider, err);
943
- }
944
- }))
945
- );
946
- });
947
- }
948
- handleShutdownError(provider, err) {
949
- this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);
950
- this._logger.error(err == null ? void 0 : err.stack);
951
- }
952
- setTransactionContextPropagator(transactionContextPropagator) {
953
- const baseMessage = "Invalid TransactionContextPropagator, will not be set: ";
954
- if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.getTransactionContext) !== "function") {
955
- this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);
956
- } else if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.setTransactionContext) !== "function") {
957
- this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);
958
- } else {
959
- this._transactionContextPropagator = transactionContextPropagator;
960
- }
961
- return this;
962
- }
963
- setTransactionContext(transactionContext, callback, ...args) {
964
- this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);
965
- }
966
- getTransactionContext() {
967
- try {
968
- return this._transactionContextPropagator.getTransactionContext();
969
- } catch (err) {
970
- const error = err;
971
- this._logger.error(`Error getting transaction context: ${error == null ? void 0 : error.message}, returning empty context.`);
972
- this._logger.error(error == null ? void 0 : error.stack);
973
- return {};
974
- }
975
- }
976
- };
448
+ // src/open-feature.ts
449
+ import { OpenFeatureCommonAPI } from "@openfeature/core";
977
450
 
978
451
  // src/provider/no-op-provider.ts
452
+ import { ProviderStatus } from "@openfeature/core";
979
453
  var REASON_NO_OP = "No-op";
980
454
  var NoopFeatureProvider = class {
981
455
  constructor() {
@@ -984,7 +458,7 @@ var NoopFeatureProvider = class {
984
458
  };
985
459
  }
986
460
  get status() {
987
- return "NOT_READY" /* NOT_READY */;
461
+ return ProviderStatus.NOT_READY;
988
462
  }
989
463
  resolveBooleanEvaluation(_, defaultValue) {
990
464
  return this.noOp(defaultValue);
@@ -1071,6 +545,13 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
1071
545
  { name, version }
1072
546
  );
1073
547
  }
548
+ /**
549
+ * Clears all registered providers and resets the default provider.
550
+ * @returns {Promise<void>}
551
+ */
552
+ clearProviders() {
553
+ return super.clearProvidersAndSetDefault(NOOP_PROVIDER);
554
+ }
1074
555
  };
1075
556
  var OpenFeature = OpenFeatureAPI.getInstance();
1076
557
 
@@ -1093,8 +574,8 @@ var OpenFeatureClient = class {
1093
574
  addHandler(eventType, handler) {
1094
575
  var _a;
1095
576
  this.emitterAccessor().addHandler(eventType, handler);
1096
- const providerReady = !this._provider.status || this._provider.status === "READY" /* READY */;
1097
- if (eventType === "PROVIDER_READY" /* Ready */ && providerReady) {
577
+ const providerReady = !this._provider.status || this._provider.status === ProviderStatus2.READY;
578
+ if (eventType === ProviderEvents.Ready && providerReady) {
1098
579
  try {
1099
580
  handler({ clientName: this.metadata.name, providerName: this._provider.metadata.name });
1100
581
  } catch (err) {
@@ -1191,7 +672,7 @@ var OpenFeatureClient = class {
1191
672
  return evaluationDetails;
1192
673
  } catch (err) {
1193
674
  const errorMessage = err == null ? void 0 : err.message;
1194
- const errorCode = (err == null ? void 0 : err.code) || "GENERAL" /* GENERAL */;
675
+ const errorCode = (err == null ? void 0 : err.code) || ErrorCode.GENERAL;
1195
676
  this.errorHooks(allHooksReversed, hookContext, err, options);
1196
677
  return {
1197
678
  errorCode,
@@ -1254,33 +735,13 @@ var OpenFeatureClient = class {
1254
735
  return this._clientLogger || this.globalLogger();
1255
736
  }
1256
737
  };
738
+
739
+ // src/index.ts
740
+ export * from "@openfeature/core";
1257
741
  export {
1258
- DefaultLogger,
1259
- ErrorCode,
1260
- FlagNotFoundError,
1261
- GeneralError,
1262
- InternalEventEmitter,
1263
- InvalidContextError,
1264
- LOG_LEVELS,
1265
742
  NOOP_PROVIDER,
1266
- NOOP_TRANSACTION_CONTEXT_PROPAGATOR,
1267
743
  OpenFeature,
1268
744
  OpenFeatureAPI,
1269
- OpenFeatureClient,
1270
- OpenFeatureCommonAPI,
1271
- OpenFeatureError,
1272
- OpenFeatureEventEmitter,
1273
- ParseError,
1274
- ProviderEvents,
1275
- ProviderStatus,
1276
- SafeLogger,
1277
- StandardResolutionReasons,
1278
- TargetingKeyMissingError,
1279
- TypeMismatchError,
1280
- isObject,
1281
- isString,
1282
- objectOrUndefined,
1283
- statusMatchesEvent,
1284
- stringOrUndefined
745
+ OpenFeatureClient
1285
746
  };
1286
747
  //# sourceMappingURL=index.js.map