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