@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/README.md +4 -4
- package/dist/cjs/index.js +51 -597
- package/dist/cjs/index.js.map +4 -4
- package/dist/esm/index.js +54 -593
- package/dist/esm/index.js.map +4 -4
- package/dist/types.d.ts +8 -628
- package/package.json +8 -9
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
|
|
92
|
-
|
|
91
|
+
function EventEmitter() {
|
|
92
|
+
EventEmitter.init.call(this);
|
|
93
93
|
}
|
|
94
|
-
module.exports =
|
|
94
|
+
module.exports = EventEmitter;
|
|
95
95
|
module.exports.once = once;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
134
|
+
return EventEmitter.defaultMaxListeners;
|
|
135
135
|
return that._maxListeners;
|
|
136
136
|
}
|
|
137
|
-
|
|
137
|
+
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
|
|
138
138
|
return _getMaxListeners(this);
|
|
139
139
|
};
|
|
140
|
-
|
|
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
|
-
|
|
218
|
+
EventEmitter.prototype.addListener = function addListener(type, listener) {
|
|
219
219
|
return _addListener(this, type, listener, false);
|
|
220
220
|
};
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
292
|
-
|
|
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
|
-
|
|
344
|
+
EventEmitter.prototype.listeners = function listeners(type) {
|
|
345
345
|
return _listeners(this, type, true);
|
|
346
346
|
};
|
|
347
|
-
|
|
347
|
+
EventEmitter.prototype.rawListeners = function rawListeners(type) {
|
|
348
348
|
return _listeners(this, type, false);
|
|
349
349
|
};
|
|
350
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
437
|
-
var
|
|
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
|
-
//
|
|
717
|
-
|
|
718
|
-
|
|
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
|
-
//
|
|
722
|
-
|
|
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
|
|
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 ===
|
|
1097
|
-
if (eventType ===
|
|
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) ||
|
|
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
|