@openfeature/web-sdk 0.4.2 → 0.4.4
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 +29 -27
- package/dist/cjs/index.js +44 -572
- package/dist/cjs/index.js.map +4 -4
- package/dist/esm/index.js +47 -568
- package/dist/esm/index.js.map +4 -4
- package/dist/types.d.ts +3 -573
- 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,525 +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
|
-
};
|
|
436
|
+
// src/index.ts
|
|
437
|
+
var import_events = __toESM(require_events());
|
|
502
438
|
|
|
503
|
-
//
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
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/type-guards.ts
|
|
692
|
-
function isString(value) {
|
|
693
|
-
return typeof value === "string";
|
|
694
|
-
}
|
|
695
|
-
function stringOrUndefined(value) {
|
|
696
|
-
return isString(value) ? value : void 0;
|
|
697
|
-
}
|
|
698
|
-
function isObject(value) {
|
|
699
|
-
return typeof value === "object";
|
|
700
|
-
}
|
|
701
|
-
function objectOrUndefined(value) {
|
|
702
|
-
return isObject(value) ? value : void 0;
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
// ../shared/src/filter.ts
|
|
706
|
-
function isDefined(input) {
|
|
707
|
-
return typeof input !== "undefined" && input !== null;
|
|
708
|
-
}
|
|
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";
|
|
709
447
|
|
|
710
|
-
//
|
|
711
|
-
|
|
712
|
-
constructor(category) {
|
|
713
|
-
this._hooks = [];
|
|
714
|
-
this._context = {};
|
|
715
|
-
this._logger = new DefaultLogger();
|
|
716
|
-
this._events = new InternalEventEmitter(() => this._logger);
|
|
717
|
-
this._clientEventHandlers = /* @__PURE__ */ new Map();
|
|
718
|
-
this._clientProviders = /* @__PURE__ */ new Map();
|
|
719
|
-
this._clientEvents = /* @__PURE__ */ new Map();
|
|
720
|
-
this._runsOn = category;
|
|
721
|
-
}
|
|
722
|
-
addHooks(...hooks) {
|
|
723
|
-
this._hooks = [...this._hooks, ...hooks];
|
|
724
|
-
return this;
|
|
725
|
-
}
|
|
726
|
-
getHooks() {
|
|
727
|
-
return this._hooks;
|
|
728
|
-
}
|
|
729
|
-
clearHooks() {
|
|
730
|
-
this._hooks = [];
|
|
731
|
-
return this;
|
|
732
|
-
}
|
|
733
|
-
setLogger(logger) {
|
|
734
|
-
this._logger = new SafeLogger(logger);
|
|
735
|
-
return this;
|
|
736
|
-
}
|
|
737
|
-
/**
|
|
738
|
-
* Get metadata about registered provider.
|
|
739
|
-
* @returns {ProviderMetadata} Provider Metadata
|
|
740
|
-
*/
|
|
741
|
-
get providerMetadata() {
|
|
742
|
-
return this._defaultProvider.metadata;
|
|
743
|
-
}
|
|
744
|
-
/**
|
|
745
|
-
* Adds a handler for the given provider event type.
|
|
746
|
-
* The handlers are called in the order they have been added.
|
|
747
|
-
* API (global) events run for all providers.
|
|
748
|
-
* @param {ProviderEvents} eventType The provider event type to listen to
|
|
749
|
-
* @param {EventHandler} handler The handler to run on occurrence of the event type
|
|
750
|
-
*/
|
|
751
|
-
addHandler(eventType, handler) {
|
|
752
|
-
[.../* @__PURE__ */ new Map([[void 0, this._defaultProvider]]), ...this._clientProviders].forEach((keyProviderTuple) => {
|
|
753
|
-
var _a;
|
|
754
|
-
const clientName = keyProviderTuple[0];
|
|
755
|
-
const provider = keyProviderTuple[1];
|
|
756
|
-
const shouldRunNow = statusMatchesEvent(eventType, keyProviderTuple[1].status);
|
|
757
|
-
if (shouldRunNow) {
|
|
758
|
-
try {
|
|
759
|
-
handler({ clientName, providerName: provider.metadata.name });
|
|
760
|
-
} catch (err) {
|
|
761
|
-
(_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
});
|
|
765
|
-
this._events.addHandler(eventType, handler);
|
|
766
|
-
}
|
|
767
|
-
/**
|
|
768
|
-
* Removes a handler for the given provider event type.
|
|
769
|
-
* @param {ProviderEvents} eventType The provider event type to remove the listener for
|
|
770
|
-
* @param {EventHandler} handler The handler to remove for the provider event type
|
|
771
|
-
*/
|
|
772
|
-
removeHandler(eventType, handler) {
|
|
773
|
-
this._events.removeHandler(eventType, handler);
|
|
774
|
-
}
|
|
775
|
-
/**
|
|
776
|
-
* Gets the current handlers for the given provider event type.
|
|
777
|
-
* @param {ProviderEvents} eventType The provider event type to get the current handlers for
|
|
778
|
-
* @returns {EventHandler[]} The handlers currently attached to the given provider event type
|
|
779
|
-
*/
|
|
780
|
-
getHandlers(eventType) {
|
|
781
|
-
return this._events.getHandlers(eventType);
|
|
782
|
-
}
|
|
783
|
-
setProviderAndWait(clientOrProvider, providerOrUndefined) {
|
|
784
|
-
return __async(this, null, function* () {
|
|
785
|
-
yield this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
|
|
786
|
-
});
|
|
787
|
-
}
|
|
788
|
-
setProvider(clientOrProvider, providerOrUndefined) {
|
|
789
|
-
const maybePromise = this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
|
|
790
|
-
if (maybePromise) {
|
|
791
|
-
maybePromise.catch(() => {
|
|
792
|
-
});
|
|
793
|
-
}
|
|
794
|
-
return this;
|
|
795
|
-
}
|
|
796
|
-
setAwaitableProvider(clientOrProvider, providerOrUndefined) {
|
|
797
|
-
var _a, _b, _c, _d, _e, _f;
|
|
798
|
-
const clientName = stringOrUndefined(clientOrProvider);
|
|
799
|
-
const provider = (_a = objectOrUndefined(clientOrProvider)) != null ? _a : objectOrUndefined(providerOrUndefined);
|
|
800
|
-
if (!provider) {
|
|
801
|
-
this._logger.debug("No provider defined, ignoring setProvider call");
|
|
802
|
-
return;
|
|
803
|
-
}
|
|
804
|
-
const oldProvider = this.getProviderForClient(clientName);
|
|
805
|
-
const providerName = provider.metadata.name;
|
|
806
|
-
if (oldProvider === provider) {
|
|
807
|
-
this._logger.debug("Provider is already set, ignoring setProvider call");
|
|
808
|
-
return;
|
|
809
|
-
}
|
|
810
|
-
if (!provider.runsOn) {
|
|
811
|
-
this._logger.debug(`Provider '${provider.metadata.name}' has not defined its intended use.`);
|
|
812
|
-
} else if (provider.runsOn !== this._runsOn) {
|
|
813
|
-
throw new GeneralError(`Provider '${provider.metadata.name}' is intended for use on the ${provider.runsOn}.`);
|
|
814
|
-
}
|
|
815
|
-
const emitters = this.getAssociatedEventEmitters(clientName);
|
|
816
|
-
if (typeof provider.initialize === "function" && provider.status === void 0) {
|
|
817
|
-
const activeLogger = this._logger || console;
|
|
818
|
-
activeLogger.warn(
|
|
819
|
-
`Provider ${providerName} implements 'initialize' but not 'status'. Please implement 'status'.`
|
|
820
|
-
);
|
|
821
|
-
}
|
|
822
|
-
let initializationPromise = void 0;
|
|
823
|
-
if ((provider == null ? void 0 : provider.status) === "NOT_READY" /* NOT_READY */ && typeof provider.initialize === "function") {
|
|
824
|
-
initializationPromise = (_d = (_c = (_b = provider.initialize) == null ? void 0 : _b.call(provider, this._context)) == null ? void 0 : _c.then(() => {
|
|
825
|
-
var _a2;
|
|
826
|
-
this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
|
|
827
|
-
emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
|
|
828
|
-
});
|
|
829
|
-
(_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
|
|
830
|
-
})) == null ? void 0 : _d.catch((error) => {
|
|
831
|
-
var _a2;
|
|
832
|
-
this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
|
|
833
|
-
emitter == null ? void 0 : emitter.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
|
|
834
|
-
});
|
|
835
|
-
(_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
|
|
836
|
-
throw error;
|
|
837
|
-
});
|
|
838
|
-
} else {
|
|
839
|
-
emitters.forEach((emitter) => {
|
|
840
|
-
emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
|
|
841
|
-
});
|
|
842
|
-
(_e = this._events) == null ? void 0 : _e.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
|
|
843
|
-
}
|
|
844
|
-
if (clientName) {
|
|
845
|
-
this._clientProviders.set(clientName, provider);
|
|
846
|
-
} else {
|
|
847
|
-
this._defaultProvider = provider;
|
|
848
|
-
}
|
|
849
|
-
this.transferListeners(oldProvider, provider, clientName, emitters);
|
|
850
|
-
if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {
|
|
851
|
-
(_f = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _f.call(oldProvider);
|
|
852
|
-
}
|
|
853
|
-
return initializationPromise;
|
|
854
|
-
}
|
|
855
|
-
getProviderForClient(name) {
|
|
856
|
-
var _a;
|
|
857
|
-
if (!name) {
|
|
858
|
-
return this._defaultProvider;
|
|
859
|
-
}
|
|
860
|
-
return (_a = this._clientProviders.get(name)) != null ? _a : this._defaultProvider;
|
|
861
|
-
}
|
|
862
|
-
buildAndCacheEventEmitterForClient(name) {
|
|
863
|
-
const emitter = this._clientEvents.get(name);
|
|
864
|
-
if (emitter) {
|
|
865
|
-
return emitter;
|
|
866
|
-
}
|
|
867
|
-
const newEmitter = new InternalEventEmitter(() => this._logger);
|
|
868
|
-
this._clientEvents.set(name, newEmitter);
|
|
869
|
-
const clientProvider = this.getProviderForClient(name);
|
|
870
|
-
Object.values(ProviderEvents).forEach(
|
|
871
|
-
(eventType) => {
|
|
872
|
-
var _a;
|
|
873
|
-
return (_a = clientProvider.events) == null ? void 0 : _a.addHandler(eventType, (details) => __async(this, null, function* () {
|
|
874
|
-
newEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName: name, providerName: clientProvider.metadata.name }));
|
|
875
|
-
}));
|
|
876
|
-
}
|
|
877
|
-
);
|
|
878
|
-
return newEmitter;
|
|
879
|
-
}
|
|
880
|
-
getUnboundEmitters() {
|
|
881
|
-
const namedProviders = [...this._clientProviders.keys()];
|
|
882
|
-
const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined);
|
|
883
|
-
const unboundEmitterNames = eventEmitterNames.filter((name) => !namedProviders.includes(name));
|
|
884
|
-
return [
|
|
885
|
-
// all unbound, named emitters
|
|
886
|
-
...unboundEmitterNames.map((name) => this._clientEvents.get(name)),
|
|
887
|
-
// the default emitter
|
|
888
|
-
this._clientEvents.get(void 0)
|
|
889
|
-
].filter(isDefined);
|
|
890
|
-
}
|
|
891
|
-
getAssociatedEventEmitters(clientName) {
|
|
892
|
-
return clientName ? [this.buildAndCacheEventEmitterForClient(clientName)] : this.getUnboundEmitters();
|
|
893
|
-
}
|
|
894
|
-
transferListeners(oldProvider, newProvider, clientName, emitters) {
|
|
895
|
-
var _a;
|
|
896
|
-
(_a = this._clientEventHandlers.get(clientName)) == null ? void 0 : _a.forEach((eventHandler) => {
|
|
897
|
-
var _a2;
|
|
898
|
-
return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler);
|
|
899
|
-
});
|
|
900
|
-
const newClientHandlers = Object.values(ProviderEvents).map((eventType) => {
|
|
901
|
-
const handler = (details) => __async(this, null, function* () {
|
|
902
|
-
emitters.forEach((emitter) => {
|
|
903
|
-
emitter == null ? void 0 : emitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
|
|
904
|
-
});
|
|
905
|
-
this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
|
|
906
|
-
});
|
|
907
|
-
return [eventType, handler];
|
|
908
|
-
});
|
|
909
|
-
this._clientEventHandlers.set(clientName, newClientHandlers);
|
|
910
|
-
newClientHandlers.forEach((eventHandler) => {
|
|
911
|
-
var _a2;
|
|
912
|
-
return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(...eventHandler);
|
|
913
|
-
});
|
|
914
|
-
}
|
|
915
|
-
close() {
|
|
916
|
-
return __async(this, null, function* () {
|
|
917
|
-
var _a, _b;
|
|
918
|
-
try {
|
|
919
|
-
yield (_b = (_a = this == null ? void 0 : this._defaultProvider) == null ? void 0 : _a.onClose) == null ? void 0 : _b.call(_a);
|
|
920
|
-
} catch (err) {
|
|
921
|
-
this.handleShutdownError(this._defaultProvider, err);
|
|
922
|
-
}
|
|
923
|
-
const providers = Array.from(this._clientProviders);
|
|
924
|
-
yield Promise.all(
|
|
925
|
-
providers.map((_0) => __async(this, [_0], function* ([, provider]) {
|
|
926
|
-
var _a2;
|
|
927
|
-
try {
|
|
928
|
-
yield (_a2 = provider.onClose) == null ? void 0 : _a2.call(provider);
|
|
929
|
-
} catch (err) {
|
|
930
|
-
this.handleShutdownError(provider, err);
|
|
931
|
-
}
|
|
932
|
-
}))
|
|
933
|
-
);
|
|
934
|
-
});
|
|
935
|
-
}
|
|
936
|
-
clearProvidersAndSetDefault(defaultProvider) {
|
|
937
|
-
return __async(this, null, function* () {
|
|
938
|
-
try {
|
|
939
|
-
yield this.close();
|
|
940
|
-
} catch (err) {
|
|
941
|
-
this._logger.error("Unable to cleanly close providers. Resetting to the default configuration.");
|
|
942
|
-
} finally {
|
|
943
|
-
this._clientProviders.clear();
|
|
944
|
-
this._defaultProvider = defaultProvider;
|
|
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
|
-
};
|
|
448
|
+
// src/open-feature.ts
|
|
449
|
+
import { OpenFeatureCommonAPI } from "@openfeature/core";
|
|
953
450
|
|
|
954
451
|
// src/provider/no-op-provider.ts
|
|
452
|
+
import { ProviderStatus } from "@openfeature/core";
|
|
955
453
|
var REASON_NO_OP = "No-op";
|
|
956
454
|
var NoopFeatureProvider = class {
|
|
957
455
|
constructor() {
|
|
@@ -960,7 +458,7 @@ var NoopFeatureProvider = class {
|
|
|
960
458
|
};
|
|
961
459
|
}
|
|
962
460
|
get status() {
|
|
963
|
-
return
|
|
461
|
+
return ProviderStatus.NOT_READY;
|
|
964
462
|
}
|
|
965
463
|
resolveBooleanEvaluation(_, defaultValue) {
|
|
966
464
|
return this.noOp(defaultValue);
|
|
@@ -1076,8 +574,8 @@ var OpenFeatureClient = class {
|
|
|
1076
574
|
addHandler(eventType, handler) {
|
|
1077
575
|
var _a;
|
|
1078
576
|
this.emitterAccessor().addHandler(eventType, handler);
|
|
1079
|
-
const providerReady = !this._provider.status || this._provider.status ===
|
|
1080
|
-
if (eventType ===
|
|
577
|
+
const providerReady = !this._provider.status || this._provider.status === ProviderStatus2.READY;
|
|
578
|
+
if (eventType === ProviderEvents.Ready && providerReady) {
|
|
1081
579
|
try {
|
|
1082
580
|
handler({ clientName: this.metadata.name, providerName: this._provider.metadata.name });
|
|
1083
581
|
} catch (err) {
|
|
@@ -1174,7 +672,7 @@ var OpenFeatureClient = class {
|
|
|
1174
672
|
return evaluationDetails;
|
|
1175
673
|
} catch (err) {
|
|
1176
674
|
const errorMessage = err == null ? void 0 : err.message;
|
|
1177
|
-
const errorCode = (err == null ? void 0 : err.code) ||
|
|
675
|
+
const errorCode = (err == null ? void 0 : err.code) || ErrorCode.GENERAL;
|
|
1178
676
|
this.errorHooks(allHooksReversed, hookContext, err, options);
|
|
1179
677
|
return {
|
|
1180
678
|
errorCode,
|
|
@@ -1237,32 +735,13 @@ var OpenFeatureClient = class {
|
|
|
1237
735
|
return this._clientLogger || this.globalLogger();
|
|
1238
736
|
}
|
|
1239
737
|
};
|
|
738
|
+
|
|
739
|
+
// src/index.ts
|
|
740
|
+
export * from "@openfeature/core";
|
|
1240
741
|
export {
|
|
1241
|
-
DefaultLogger,
|
|
1242
|
-
ErrorCode,
|
|
1243
|
-
FlagNotFoundError,
|
|
1244
|
-
GeneralError,
|
|
1245
|
-
InternalEventEmitter,
|
|
1246
|
-
InvalidContextError,
|
|
1247
|
-
LOG_LEVELS,
|
|
1248
742
|
NOOP_PROVIDER,
|
|
1249
743
|
OpenFeature,
|
|
1250
744
|
OpenFeatureAPI,
|
|
1251
|
-
OpenFeatureClient
|
|
1252
|
-
OpenFeatureCommonAPI,
|
|
1253
|
-
OpenFeatureError,
|
|
1254
|
-
OpenFeatureEventEmitter,
|
|
1255
|
-
ParseError,
|
|
1256
|
-
ProviderEvents,
|
|
1257
|
-
ProviderStatus,
|
|
1258
|
-
SafeLogger,
|
|
1259
|
-
StandardResolutionReasons,
|
|
1260
|
-
TargetingKeyMissingError,
|
|
1261
|
-
TypeMismatchError,
|
|
1262
|
-
isObject,
|
|
1263
|
-
isString,
|
|
1264
|
-
objectOrUndefined,
|
|
1265
|
-
statusMatchesEvent,
|
|
1266
|
-
stringOrUndefined
|
|
745
|
+
OpenFeatureClient
|
|
1267
746
|
};
|
|
1268
747
|
//# sourceMappingURL=index.js.map
|