@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/cjs/index.js +110 -82
- package/dist/cjs/index.js.map +4 -4
- package/dist/esm/index.js +110 -82
- package/dist/esm/index.js.map +4 -4
- package/dist/types.d.ts +343 -293
- package/package.json +1 -1
package/dist/esm/index.js
CHANGED
|
@@ -433,7 +433,16 @@ var require_events = __commonJS({
|
|
|
433
433
|
}
|
|
434
434
|
});
|
|
435
435
|
|
|
436
|
-
// ../shared/src/
|
|
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/
|
|
560
|
-
var
|
|
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/
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
(
|
|
829
|
-
|
|
830
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|