@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/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,579 +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
|
-
NOOP_TRANSACTION_CONTEXT_PROPAGATOR: () => NOOP_TRANSACTION_CONTEXT_PROPAGATOR,
|
|
454
447
|
OpenFeature: () => OpenFeature,
|
|
455
448
|
OpenFeatureAPI: () => OpenFeatureAPI,
|
|
456
|
-
OpenFeatureClient: () => OpenFeatureClient
|
|
457
|
-
OpenFeatureCommonAPI: () => OpenFeatureCommonAPI,
|
|
458
|
-
OpenFeatureError: () => OpenFeatureError,
|
|
459
|
-
OpenFeatureEventEmitter: () => OpenFeatureEventEmitter,
|
|
460
|
-
ParseError: () => ParseError,
|
|
461
|
-
ProviderEvents: () => ProviderEvents,
|
|
462
|
-
ProviderStatus: () => ProviderStatus,
|
|
463
|
-
SafeLogger: () => SafeLogger,
|
|
464
|
-
StandardResolutionReasons: () => StandardResolutionReasons,
|
|
465
|
-
TargetingKeyMissingError: () => TargetingKeyMissingError,
|
|
466
|
-
TypeMismatchError: () => TypeMismatchError,
|
|
467
|
-
isObject: () => isObject,
|
|
468
|
-
isString: () => isString,
|
|
469
|
-
objectOrUndefined: () => objectOrUndefined,
|
|
470
|
-
statusMatchesEvent: () => statusMatchesEvent,
|
|
471
|
-
stringOrUndefined: () => stringOrUndefined
|
|
449
|
+
OpenFeatureClient: () => OpenFeatureClient
|
|
472
450
|
});
|
|
473
451
|
module.exports = __toCommonJS(src_exports);
|
|
452
|
+
var import_events = __toESM(require_events());
|
|
474
453
|
|
|
475
|
-
//
|
|
476
|
-
var
|
|
477
|
-
constructor(message) {
|
|
478
|
-
super(message);
|
|
479
|
-
Object.setPrototypeOf(this, OpenFeatureError.prototype);
|
|
480
|
-
this.name = "OpenFeatureError";
|
|
481
|
-
}
|
|
482
|
-
};
|
|
483
|
-
|
|
484
|
-
// ../shared/src/evaluation/evaluation.ts
|
|
485
|
-
var StandardResolutionReasons = {
|
|
486
|
-
/**
|
|
487
|
-
* The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.
|
|
488
|
-
*/
|
|
489
|
-
TARGETING_MATCH: "TARGETING_MATCH",
|
|
490
|
-
/**
|
|
491
|
-
* The resolved value was the result of pseudorandom assignment.
|
|
492
|
-
*/
|
|
493
|
-
SPLIT: "SPLIT",
|
|
494
|
-
/**
|
|
495
|
-
* The resolved value was the result of the flag being disabled in the management system.
|
|
496
|
-
*/
|
|
497
|
-
DISABLED: "DISABLED",
|
|
498
|
-
/**
|
|
499
|
-
* The resolved value was configured statically, or otherwise fell back to a pre-configured value.
|
|
500
|
-
*/
|
|
501
|
-
DEFAULT: "DEFAULT",
|
|
502
|
-
/**
|
|
503
|
-
* The reason for the resolved value could not be determined.
|
|
504
|
-
*/
|
|
505
|
-
UNKNOWN: "UNKNOWN",
|
|
506
|
-
/**
|
|
507
|
-
* The resolved value is static (no dynamic evaluation).
|
|
508
|
-
*/
|
|
509
|
-
STATIC: "STATIC",
|
|
510
|
-
/**
|
|
511
|
-
* The resolved value was retrieved from cache.
|
|
512
|
-
*/
|
|
513
|
-
CACHED: "CACHED",
|
|
514
|
-
/**
|
|
515
|
-
* The resolved value was the result of an error.
|
|
516
|
-
*
|
|
517
|
-
* Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.
|
|
518
|
-
*/
|
|
519
|
-
ERROR: "ERROR"
|
|
520
|
-
};
|
|
521
|
-
var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
|
|
522
|
-
ErrorCode2["PROVIDER_NOT_READY"] = "PROVIDER_NOT_READY";
|
|
523
|
-
ErrorCode2["FLAG_NOT_FOUND"] = "FLAG_NOT_FOUND";
|
|
524
|
-
ErrorCode2["PARSE_ERROR"] = "PARSE_ERROR";
|
|
525
|
-
ErrorCode2["TYPE_MISMATCH"] = "TYPE_MISMATCH";
|
|
526
|
-
ErrorCode2["TARGETING_KEY_MISSING"] = "TARGETING_KEY_MISSING";
|
|
527
|
-
ErrorCode2["INVALID_CONTEXT"] = "INVALID_CONTEXT";
|
|
528
|
-
ErrorCode2["GENERAL"] = "GENERAL";
|
|
529
|
-
return ErrorCode2;
|
|
530
|
-
})(ErrorCode || {});
|
|
531
|
-
|
|
532
|
-
// ../shared/src/errors/general-error.ts
|
|
533
|
-
var GeneralError = class extends OpenFeatureError {
|
|
534
|
-
constructor(message) {
|
|
535
|
-
super(message);
|
|
536
|
-
Object.setPrototypeOf(this, GeneralError.prototype);
|
|
537
|
-
this.name = "GeneralError";
|
|
538
|
-
this.code = "GENERAL" /* GENERAL */;
|
|
539
|
-
}
|
|
540
|
-
};
|
|
541
|
-
|
|
542
|
-
// ../shared/src/errors/flag-not-found-error.ts
|
|
543
|
-
var FlagNotFoundError = class extends OpenFeatureError {
|
|
544
|
-
constructor(message) {
|
|
545
|
-
super(message);
|
|
546
|
-
Object.setPrototypeOf(this, FlagNotFoundError.prototype);
|
|
547
|
-
this.name = "FlagNotFoundError";
|
|
548
|
-
this.code = "FLAG_NOT_FOUND" /* FLAG_NOT_FOUND */;
|
|
549
|
-
}
|
|
550
|
-
};
|
|
551
|
-
|
|
552
|
-
// ../shared/src/errors/parse-error.ts
|
|
553
|
-
var ParseError = class extends OpenFeatureError {
|
|
554
|
-
constructor(message) {
|
|
555
|
-
super(message);
|
|
556
|
-
Object.setPrototypeOf(this, ParseError.prototype);
|
|
557
|
-
this.name = "ParseError";
|
|
558
|
-
this.code = "PARSE_ERROR" /* PARSE_ERROR */;
|
|
559
|
-
}
|
|
560
|
-
};
|
|
561
|
-
|
|
562
|
-
// ../shared/src/errors/type-mismatch-error.ts
|
|
563
|
-
var TypeMismatchError = class extends OpenFeatureError {
|
|
564
|
-
constructor(message) {
|
|
565
|
-
super(message);
|
|
566
|
-
Object.setPrototypeOf(this, TypeMismatchError.prototype);
|
|
567
|
-
this.name = "TypeMismatchError";
|
|
568
|
-
this.code = "TYPE_MISMATCH" /* TYPE_MISMATCH */;
|
|
569
|
-
}
|
|
570
|
-
};
|
|
571
|
-
|
|
572
|
-
// ../shared/src/errors/targeting-key-missing-error.ts
|
|
573
|
-
var TargetingKeyMissingError = class extends OpenFeatureError {
|
|
574
|
-
constructor(message) {
|
|
575
|
-
super(message);
|
|
576
|
-
Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);
|
|
577
|
-
this.name = "TargetingKeyMissingError";
|
|
578
|
-
this.code = "TARGETING_KEY_MISSING" /* TARGETING_KEY_MISSING */;
|
|
579
|
-
}
|
|
580
|
-
};
|
|
581
|
-
|
|
582
|
-
// ../shared/src/errors/invalid-context-error.ts
|
|
583
|
-
var InvalidContextError = class extends OpenFeatureError {
|
|
584
|
-
constructor(message) {
|
|
585
|
-
super(message);
|
|
586
|
-
Object.setPrototypeOf(this, InvalidContextError.prototype);
|
|
587
|
-
this.name = "InvalidContextError";
|
|
588
|
-
this.code = "INVALID_CONTEXT" /* INVALID_CONTEXT */;
|
|
589
|
-
}
|
|
590
|
-
};
|
|
591
|
-
|
|
592
|
-
// ../shared/src/provider/provider.ts
|
|
593
|
-
var ProviderStatus = /* @__PURE__ */ ((ProviderStatus2) => {
|
|
594
|
-
ProviderStatus2["NOT_READY"] = "NOT_READY";
|
|
595
|
-
ProviderStatus2["READY"] = "READY";
|
|
596
|
-
ProviderStatus2["ERROR"] = "ERROR";
|
|
597
|
-
ProviderStatus2["STALE"] = "STALE";
|
|
598
|
-
return ProviderStatus2;
|
|
599
|
-
})(ProviderStatus || {});
|
|
600
|
-
|
|
601
|
-
// ../shared/src/events/events.ts
|
|
602
|
-
var ProviderEvents = /* @__PURE__ */ ((ProviderEvents2) => {
|
|
603
|
-
ProviderEvents2["Ready"] = "PROVIDER_READY";
|
|
604
|
-
ProviderEvents2["Error"] = "PROVIDER_ERROR";
|
|
605
|
-
ProviderEvents2["ConfigurationChanged"] = "PROVIDER_CONFIGURATION_CHANGED";
|
|
606
|
-
ProviderEvents2["Stale"] = "PROVIDER_STALE";
|
|
607
|
-
return ProviderEvents2;
|
|
608
|
-
})(ProviderEvents || {});
|
|
609
|
-
|
|
610
|
-
// ../shared/src/events/event-utils.ts
|
|
611
|
-
var eventStatusMap = {
|
|
612
|
-
["READY" /* READY */]: "PROVIDER_READY" /* Ready */,
|
|
613
|
-
["ERROR" /* ERROR */]: "PROVIDER_ERROR" /* Error */,
|
|
614
|
-
["STALE" /* STALE */]: "PROVIDER_STALE" /* Stale */,
|
|
615
|
-
["NOT_READY" /* NOT_READY */]: void 0
|
|
616
|
-
};
|
|
617
|
-
var statusMatchesEvent = (event, status) => {
|
|
618
|
-
return !status && event === "PROVIDER_READY" /* Ready */ || eventStatusMap[status] === event;
|
|
619
|
-
};
|
|
620
|
-
|
|
621
|
-
// ../shared/src/events/open-feature-event-emitter.ts
|
|
622
|
-
var import_events2 = __toESM(require_events());
|
|
623
|
-
|
|
624
|
-
// ../shared/src/logger/default-logger.ts
|
|
625
|
-
var DefaultLogger = class {
|
|
626
|
-
error(...args) {
|
|
627
|
-
console.error(...args);
|
|
628
|
-
}
|
|
629
|
-
warn(...args) {
|
|
630
|
-
console.warn(...args);
|
|
631
|
-
}
|
|
632
|
-
info() {
|
|
633
|
-
}
|
|
634
|
-
debug() {
|
|
635
|
-
}
|
|
636
|
-
};
|
|
637
|
-
|
|
638
|
-
// ../shared/src/logger/safe-logger.ts
|
|
639
|
-
var LOG_LEVELS = ["error", "warn", "info", "debug"];
|
|
640
|
-
var SafeLogger = class {
|
|
641
|
-
constructor(logger) {
|
|
642
|
-
this.fallbackLogger = new DefaultLogger();
|
|
643
|
-
try {
|
|
644
|
-
for (const level of LOG_LEVELS) {
|
|
645
|
-
if (!logger[level] || typeof logger[level] !== "function") {
|
|
646
|
-
throw new Error(`The provided logger is missing the ${level} method.`);
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
this.logger = logger;
|
|
650
|
-
} catch (err) {
|
|
651
|
-
console.error(err);
|
|
652
|
-
console.error("Falling back to the default logger.");
|
|
653
|
-
this.logger = this.fallbackLogger;
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
error(...args) {
|
|
657
|
-
this.log("error", ...args);
|
|
658
|
-
}
|
|
659
|
-
warn(...args) {
|
|
660
|
-
this.log("warn", ...args);
|
|
661
|
-
}
|
|
662
|
-
info(...args) {
|
|
663
|
-
this.log("info", ...args);
|
|
664
|
-
}
|
|
665
|
-
debug(...args) {
|
|
666
|
-
this.log("debug", ...args);
|
|
667
|
-
}
|
|
668
|
-
log(level, ...args) {
|
|
669
|
-
try {
|
|
670
|
-
this.logger[level](...args);
|
|
671
|
-
} catch (error) {
|
|
672
|
-
this.fallbackLogger[level](...args);
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
};
|
|
676
|
-
|
|
677
|
-
// ../shared/src/events/open-feature-event-emitter.ts
|
|
678
|
-
var GenericEventEmitter = class {
|
|
679
|
-
constructor(globalLogger) {
|
|
680
|
-
this.globalLogger = globalLogger;
|
|
681
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
682
|
-
this._handlers = /* @__PURE__ */ new WeakMap();
|
|
683
|
-
this.eventEmitter = new import_events2.default({ captureRejections: true });
|
|
684
|
-
this.eventEmitter.on("error", (err) => {
|
|
685
|
-
var _a;
|
|
686
|
-
(_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
|
|
687
|
-
});
|
|
688
|
-
}
|
|
689
|
-
emit(eventType, context) {
|
|
690
|
-
this.eventEmitter.emit(eventType, context);
|
|
691
|
-
}
|
|
692
|
-
addHandler(eventType, handler) {
|
|
693
|
-
const asyncHandler = (details) => __async(this, null, function* () {
|
|
694
|
-
yield handler(details);
|
|
695
|
-
});
|
|
696
|
-
this._handlers.set(handler, asyncHandler);
|
|
697
|
-
this.eventEmitter.on(eventType, asyncHandler);
|
|
698
|
-
}
|
|
699
|
-
removeHandler(eventType, handler) {
|
|
700
|
-
const asyncHandler = this._handlers.get(handler);
|
|
701
|
-
if (!asyncHandler) {
|
|
702
|
-
return;
|
|
703
|
-
}
|
|
704
|
-
this.eventEmitter.removeListener(eventType, asyncHandler);
|
|
705
|
-
}
|
|
706
|
-
removeAllHandlers(eventType) {
|
|
707
|
-
if (eventType) {
|
|
708
|
-
this.eventEmitter.removeAllListeners(eventType);
|
|
709
|
-
} else {
|
|
710
|
-
this.eventEmitter.removeAllListeners();
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
getHandlers(eventType) {
|
|
714
|
-
return this.eventEmitter.listeners(eventType);
|
|
715
|
-
}
|
|
716
|
-
setLogger(logger) {
|
|
717
|
-
this._eventLogger = new SafeLogger(logger);
|
|
718
|
-
return this;
|
|
719
|
-
}
|
|
720
|
-
get _logger() {
|
|
721
|
-
var _a, _b;
|
|
722
|
-
return (_b = this._eventLogger) != null ? _b : (_a = this.globalLogger) == null ? void 0 : _a.call(this);
|
|
723
|
-
}
|
|
724
|
-
};
|
|
725
|
-
var OpenFeatureEventEmitter = class extends GenericEventEmitter {
|
|
726
|
-
};
|
|
727
|
-
var InternalEventEmitter = class extends GenericEventEmitter {
|
|
728
|
-
};
|
|
729
|
-
|
|
730
|
-
// ../shared/src/transaction-context/no-op-transaction-context-propagator.ts
|
|
731
|
-
var NoopTransactionContextPropagator = class {
|
|
732
|
-
getTransactionContext() {
|
|
733
|
-
return {};
|
|
734
|
-
}
|
|
735
|
-
setTransactionContext(_, callback) {
|
|
736
|
-
callback();
|
|
737
|
-
}
|
|
738
|
-
};
|
|
739
|
-
var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();
|
|
740
|
-
|
|
741
|
-
// ../shared/src/type-guards.ts
|
|
742
|
-
function isString(value) {
|
|
743
|
-
return typeof value === "string";
|
|
744
|
-
}
|
|
745
|
-
function stringOrUndefined(value) {
|
|
746
|
-
return isString(value) ? value : void 0;
|
|
747
|
-
}
|
|
748
|
-
function isObject(value) {
|
|
749
|
-
return typeof value === "object";
|
|
750
|
-
}
|
|
751
|
-
function objectOrUndefined(value) {
|
|
752
|
-
return isObject(value) ? value : void 0;
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
// ../shared/src/filter.ts
|
|
756
|
-
function isDefined(input) {
|
|
757
|
-
return typeof input !== "undefined" && input !== null;
|
|
758
|
-
}
|
|
454
|
+
// src/client/open-feature-client.ts
|
|
455
|
+
var import_core3 = require("@openfeature/core");
|
|
759
456
|
|
|
760
|
-
//
|
|
761
|
-
var
|
|
762
|
-
constructor(category) {
|
|
763
|
-
this._hooks = [];
|
|
764
|
-
this._transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
|
|
765
|
-
this._context = {};
|
|
766
|
-
this._logger = new DefaultLogger();
|
|
767
|
-
this._events = new InternalEventEmitter(() => this._logger);
|
|
768
|
-
this._clientEventHandlers = /* @__PURE__ */ new Map();
|
|
769
|
-
this._clientProviders = /* @__PURE__ */ new Map();
|
|
770
|
-
this._clientEvents = /* @__PURE__ */ new Map();
|
|
771
|
-
this._runsOn = category;
|
|
772
|
-
}
|
|
773
|
-
addHooks(...hooks) {
|
|
774
|
-
this._hooks = [...this._hooks, ...hooks];
|
|
775
|
-
return this;
|
|
776
|
-
}
|
|
777
|
-
getHooks() {
|
|
778
|
-
return this._hooks;
|
|
779
|
-
}
|
|
780
|
-
clearHooks() {
|
|
781
|
-
this._hooks = [];
|
|
782
|
-
return this;
|
|
783
|
-
}
|
|
784
|
-
setLogger(logger) {
|
|
785
|
-
this._logger = new SafeLogger(logger);
|
|
786
|
-
return this;
|
|
787
|
-
}
|
|
788
|
-
/**
|
|
789
|
-
* Get metadata about registered provider.
|
|
790
|
-
* @returns {ProviderMetadata} Provider Metadata
|
|
791
|
-
*/
|
|
792
|
-
get providerMetadata() {
|
|
793
|
-
return this._defaultProvider.metadata;
|
|
794
|
-
}
|
|
795
|
-
/**
|
|
796
|
-
* Adds a handler for the given provider event type.
|
|
797
|
-
* The handlers are called in the order they have been added.
|
|
798
|
-
* API (global) events run for all providers.
|
|
799
|
-
* @param {ProviderEvents} eventType The provider event type to listen to
|
|
800
|
-
* @param {EventHandler} handler The handler to run on occurrence of the event type
|
|
801
|
-
*/
|
|
802
|
-
addHandler(eventType, handler) {
|
|
803
|
-
[.../* @__PURE__ */ new Map([[void 0, this._defaultProvider]]), ...this._clientProviders].forEach((keyProviderTuple) => {
|
|
804
|
-
var _a;
|
|
805
|
-
const clientName = keyProviderTuple[0];
|
|
806
|
-
const provider = keyProviderTuple[1];
|
|
807
|
-
const shouldRunNow = statusMatchesEvent(eventType, keyProviderTuple[1].status);
|
|
808
|
-
if (shouldRunNow) {
|
|
809
|
-
try {
|
|
810
|
-
handler({ clientName, providerName: provider.metadata.name });
|
|
811
|
-
} catch (err) {
|
|
812
|
-
(_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
});
|
|
816
|
-
this._events.addHandler(eventType, handler);
|
|
817
|
-
}
|
|
818
|
-
/**
|
|
819
|
-
* Removes a handler for the given provider event type.
|
|
820
|
-
* @param {ProviderEvents} eventType The provider event type to remove the listener for
|
|
821
|
-
* @param {EventHandler} handler The handler to remove for the provider event type
|
|
822
|
-
*/
|
|
823
|
-
removeHandler(eventType, handler) {
|
|
824
|
-
this._events.removeHandler(eventType, handler);
|
|
825
|
-
}
|
|
826
|
-
/**
|
|
827
|
-
* Gets the current handlers for the given provider event type.
|
|
828
|
-
* @param {ProviderEvents} eventType The provider event type to get the current handlers for
|
|
829
|
-
* @returns {EventHandler[]} The handlers currently attached to the given provider event type
|
|
830
|
-
*/
|
|
831
|
-
getHandlers(eventType) {
|
|
832
|
-
return this._events.getHandlers(eventType);
|
|
833
|
-
}
|
|
834
|
-
setProviderAndWait(clientOrProvider, providerOrUndefined) {
|
|
835
|
-
return __async(this, null, function* () {
|
|
836
|
-
yield this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
|
|
837
|
-
});
|
|
838
|
-
}
|
|
839
|
-
setProvider(clientOrProvider, providerOrUndefined) {
|
|
840
|
-
const maybePromise = this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
|
|
841
|
-
if (maybePromise) {
|
|
842
|
-
maybePromise.catch(() => {
|
|
843
|
-
});
|
|
844
|
-
}
|
|
845
|
-
return this;
|
|
846
|
-
}
|
|
847
|
-
setAwaitableProvider(clientOrProvider, providerOrUndefined) {
|
|
848
|
-
var _a, _b, _c, _d, _e, _f;
|
|
849
|
-
const clientName = stringOrUndefined(clientOrProvider);
|
|
850
|
-
const provider = (_a = objectOrUndefined(clientOrProvider)) != null ? _a : objectOrUndefined(providerOrUndefined);
|
|
851
|
-
if (!provider) {
|
|
852
|
-
this._logger.debug("No provider defined, ignoring setProvider call");
|
|
853
|
-
return;
|
|
854
|
-
}
|
|
855
|
-
const oldProvider = this.getProviderForClient(clientName);
|
|
856
|
-
const providerName = provider.metadata.name;
|
|
857
|
-
if (oldProvider === provider) {
|
|
858
|
-
this._logger.debug("Provider is already set, ignoring setProvider call");
|
|
859
|
-
return;
|
|
860
|
-
}
|
|
861
|
-
if (!provider.runsOn) {
|
|
862
|
-
this._logger.debug(`Provider '${provider.metadata.name}' has not defined its intended use.`);
|
|
863
|
-
} else if (provider.runsOn !== this._runsOn) {
|
|
864
|
-
throw new GeneralError(`Provider '${provider.metadata.name}' is intended for use on the ${provider.runsOn}.`);
|
|
865
|
-
}
|
|
866
|
-
const emitters = this.getAssociatedEventEmitters(clientName);
|
|
867
|
-
if (typeof provider.initialize === "function" && provider.status === void 0) {
|
|
868
|
-
const activeLogger = this._logger || console;
|
|
869
|
-
activeLogger.warn(
|
|
870
|
-
`Provider ${providerName} implements 'initialize' but not 'status'. Please implement 'status'.`
|
|
871
|
-
);
|
|
872
|
-
}
|
|
873
|
-
let initializationPromise = void 0;
|
|
874
|
-
if ((provider == null ? void 0 : provider.status) === "NOT_READY" /* NOT_READY */ && typeof provider.initialize === "function") {
|
|
875
|
-
initializationPromise = (_d = (_c = (_b = provider.initialize) == null ? void 0 : _b.call(provider, this._context)) == null ? void 0 : _c.then(() => {
|
|
876
|
-
var _a2;
|
|
877
|
-
this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
|
|
878
|
-
emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
|
|
879
|
-
});
|
|
880
|
-
(_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
|
|
881
|
-
})) == null ? void 0 : _d.catch((error) => {
|
|
882
|
-
var _a2;
|
|
883
|
-
this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
|
|
884
|
-
emitter == null ? void 0 : emitter.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
|
|
885
|
-
});
|
|
886
|
-
(_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
|
|
887
|
-
throw error;
|
|
888
|
-
});
|
|
889
|
-
} else {
|
|
890
|
-
emitters.forEach((emitter) => {
|
|
891
|
-
emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
|
|
892
|
-
});
|
|
893
|
-
(_e = this._events) == null ? void 0 : _e.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
|
|
894
|
-
}
|
|
895
|
-
if (clientName) {
|
|
896
|
-
this._clientProviders.set(clientName, provider);
|
|
897
|
-
} else {
|
|
898
|
-
this._defaultProvider = provider;
|
|
899
|
-
}
|
|
900
|
-
this.transferListeners(oldProvider, provider, clientName, emitters);
|
|
901
|
-
if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {
|
|
902
|
-
(_f = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _f.call(oldProvider);
|
|
903
|
-
}
|
|
904
|
-
return initializationPromise;
|
|
905
|
-
}
|
|
906
|
-
getProviderForClient(name) {
|
|
907
|
-
var _a;
|
|
908
|
-
if (!name) {
|
|
909
|
-
return this._defaultProvider;
|
|
910
|
-
}
|
|
911
|
-
return (_a = this._clientProviders.get(name)) != null ? _a : this._defaultProvider;
|
|
912
|
-
}
|
|
913
|
-
buildAndCacheEventEmitterForClient(name) {
|
|
914
|
-
const emitter = this._clientEvents.get(name);
|
|
915
|
-
if (emitter) {
|
|
916
|
-
return emitter;
|
|
917
|
-
}
|
|
918
|
-
const newEmitter = new InternalEventEmitter(() => this._logger);
|
|
919
|
-
this._clientEvents.set(name, newEmitter);
|
|
920
|
-
const clientProvider = this.getProviderForClient(name);
|
|
921
|
-
Object.values(ProviderEvents).forEach(
|
|
922
|
-
(eventType) => {
|
|
923
|
-
var _a;
|
|
924
|
-
return (_a = clientProvider.events) == null ? void 0 : _a.addHandler(eventType, (details) => __async(this, null, function* () {
|
|
925
|
-
newEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName: name, providerName: clientProvider.metadata.name }));
|
|
926
|
-
}));
|
|
927
|
-
}
|
|
928
|
-
);
|
|
929
|
-
return newEmitter;
|
|
930
|
-
}
|
|
931
|
-
getUnboundEmitters() {
|
|
932
|
-
const namedProviders = [...this._clientProviders.keys()];
|
|
933
|
-
const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined);
|
|
934
|
-
const unboundEmitterNames = eventEmitterNames.filter((name) => !namedProviders.includes(name));
|
|
935
|
-
return [
|
|
936
|
-
// all unbound, named emitters
|
|
937
|
-
...unboundEmitterNames.map((name) => this._clientEvents.get(name)),
|
|
938
|
-
// the default emitter
|
|
939
|
-
this._clientEvents.get(void 0)
|
|
940
|
-
].filter(isDefined);
|
|
941
|
-
}
|
|
942
|
-
getAssociatedEventEmitters(clientName) {
|
|
943
|
-
return clientName ? [this.buildAndCacheEventEmitterForClient(clientName)] : this.getUnboundEmitters();
|
|
944
|
-
}
|
|
945
|
-
transferListeners(oldProvider, newProvider, clientName, emitters) {
|
|
946
|
-
var _a;
|
|
947
|
-
(_a = this._clientEventHandlers.get(clientName)) == null ? void 0 : _a.forEach((eventHandler) => {
|
|
948
|
-
var _a2;
|
|
949
|
-
return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler);
|
|
950
|
-
});
|
|
951
|
-
const newClientHandlers = Object.values(ProviderEvents).map((eventType) => {
|
|
952
|
-
const handler = (details) => __async(this, null, function* () {
|
|
953
|
-
emitters.forEach((emitter) => {
|
|
954
|
-
emitter == null ? void 0 : emitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
|
|
955
|
-
});
|
|
956
|
-
this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
|
|
957
|
-
});
|
|
958
|
-
return [eventType, handler];
|
|
959
|
-
});
|
|
960
|
-
this._clientEventHandlers.set(clientName, newClientHandlers);
|
|
961
|
-
newClientHandlers.forEach((eventHandler) => {
|
|
962
|
-
var _a2;
|
|
963
|
-
return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(...eventHandler);
|
|
964
|
-
});
|
|
965
|
-
}
|
|
966
|
-
close() {
|
|
967
|
-
return __async(this, null, function* () {
|
|
968
|
-
var _a, _b;
|
|
969
|
-
try {
|
|
970
|
-
yield (_b = (_a = this == null ? void 0 : this._defaultProvider) == null ? void 0 : _a.onClose) == null ? void 0 : _b.call(_a);
|
|
971
|
-
} catch (err) {
|
|
972
|
-
this.handleShutdownError(this._defaultProvider, err);
|
|
973
|
-
}
|
|
974
|
-
const providers = Array.from(this._clientProviders);
|
|
975
|
-
yield Promise.all(
|
|
976
|
-
providers.map((_0) => __async(this, [_0], function* ([, provider]) {
|
|
977
|
-
var _a2;
|
|
978
|
-
try {
|
|
979
|
-
yield (_a2 = provider.onClose) == null ? void 0 : _a2.call(provider);
|
|
980
|
-
} catch (err) {
|
|
981
|
-
this.handleShutdownError(this._defaultProvider, err);
|
|
982
|
-
}
|
|
983
|
-
}))
|
|
984
|
-
);
|
|
985
|
-
});
|
|
986
|
-
}
|
|
987
|
-
handleShutdownError(provider, err) {
|
|
988
|
-
this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);
|
|
989
|
-
this._logger.error(err == null ? void 0 : err.stack);
|
|
990
|
-
}
|
|
991
|
-
setTransactionContextPropagator(transactionContextPropagator) {
|
|
992
|
-
const baseMessage = "Invalid TransactionContextPropagator, will not be set: ";
|
|
993
|
-
if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.getTransactionContext) !== "function") {
|
|
994
|
-
this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);
|
|
995
|
-
} else if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.setTransactionContext) !== "function") {
|
|
996
|
-
this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);
|
|
997
|
-
} else {
|
|
998
|
-
this._transactionContextPropagator = transactionContextPropagator;
|
|
999
|
-
}
|
|
1000
|
-
return this;
|
|
1001
|
-
}
|
|
1002
|
-
setTransactionContext(transactionContext, callback, ...args) {
|
|
1003
|
-
this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);
|
|
1004
|
-
}
|
|
1005
|
-
getTransactionContext() {
|
|
1006
|
-
try {
|
|
1007
|
-
return this._transactionContextPropagator.getTransactionContext();
|
|
1008
|
-
} catch (err) {
|
|
1009
|
-
const error = err;
|
|
1010
|
-
this._logger.error(`Error getting transaction context: ${error == null ? void 0 : error.message}, returning empty context.`);
|
|
1011
|
-
this._logger.error(error == null ? void 0 : error.stack);
|
|
1012
|
-
return {};
|
|
1013
|
-
}
|
|
1014
|
-
}
|
|
1015
|
-
};
|
|
457
|
+
// src/open-feature.ts
|
|
458
|
+
var import_core2 = require("@openfeature/core");
|
|
1016
459
|
|
|
1017
460
|
// src/provider/no-op-provider.ts
|
|
461
|
+
var import_core = require("@openfeature/core");
|
|
1018
462
|
var REASON_NO_OP = "No-op";
|
|
1019
463
|
var NoopFeatureProvider = class {
|
|
1020
464
|
constructor() {
|
|
@@ -1023,7 +467,7 @@ var NoopFeatureProvider = class {
|
|
|
1023
467
|
};
|
|
1024
468
|
}
|
|
1025
469
|
get status() {
|
|
1026
|
-
return
|
|
470
|
+
return import_core.ProviderStatus.NOT_READY;
|
|
1027
471
|
}
|
|
1028
472
|
resolveBooleanEvaluation(_, defaultValue) {
|
|
1029
473
|
return this.noOp(defaultValue);
|
|
@@ -1049,7 +493,7 @@ var NOOP_PROVIDER = new NoopFeatureProvider();
|
|
|
1049
493
|
// src/open-feature.ts
|
|
1050
494
|
var GLOBAL_OPENFEATURE_API_KEY = Symbol.for("@openfeature/web-sdk/api");
|
|
1051
495
|
var _globalThis = globalThis;
|
|
1052
|
-
var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
|
|
496
|
+
var OpenFeatureAPI = class extends import_core2.OpenFeatureCommonAPI {
|
|
1053
497
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
1054
498
|
constructor() {
|
|
1055
499
|
super("client");
|
|
@@ -1110,6 +554,13 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
|
|
|
1110
554
|
{ name, version }
|
|
1111
555
|
);
|
|
1112
556
|
}
|
|
557
|
+
/**
|
|
558
|
+
* Clears all registered providers and resets the default provider.
|
|
559
|
+
* @returns {Promise<void>}
|
|
560
|
+
*/
|
|
561
|
+
clearProviders() {
|
|
562
|
+
return super.clearProvidersAndSetDefault(NOOP_PROVIDER);
|
|
563
|
+
}
|
|
1113
564
|
};
|
|
1114
565
|
var OpenFeature = OpenFeatureAPI.getInstance();
|
|
1115
566
|
|
|
@@ -1132,8 +583,8 @@ var OpenFeatureClient = class {
|
|
|
1132
583
|
addHandler(eventType, handler) {
|
|
1133
584
|
var _a;
|
|
1134
585
|
this.emitterAccessor().addHandler(eventType, handler);
|
|
1135
|
-
const providerReady = !this._provider.status || this._provider.status ===
|
|
1136
|
-
if (eventType ===
|
|
586
|
+
const providerReady = !this._provider.status || this._provider.status === import_core3.ProviderStatus.READY;
|
|
587
|
+
if (eventType === import_core3.ProviderEvents.Ready && providerReady) {
|
|
1137
588
|
try {
|
|
1138
589
|
handler({ clientName: this.metadata.name, providerName: this._provider.metadata.name });
|
|
1139
590
|
} catch (err) {
|
|
@@ -1148,7 +599,7 @@ var OpenFeatureClient = class {
|
|
|
1148
599
|
return this.emitterAccessor().getHandlers(eventType);
|
|
1149
600
|
}
|
|
1150
601
|
setLogger(logger) {
|
|
1151
|
-
this._clientLogger = new SafeLogger(logger);
|
|
602
|
+
this._clientLogger = new import_core3.SafeLogger(logger);
|
|
1152
603
|
return this;
|
|
1153
604
|
}
|
|
1154
605
|
addHooks(...hooks) {
|
|
@@ -1230,13 +681,13 @@ var OpenFeatureClient = class {
|
|
|
1230
681
|
return evaluationDetails;
|
|
1231
682
|
} catch (err) {
|
|
1232
683
|
const errorMessage = err == null ? void 0 : err.message;
|
|
1233
|
-
const errorCode = (err == null ? void 0 : err.code) ||
|
|
684
|
+
const errorCode = (err == null ? void 0 : err.code) || import_core3.ErrorCode.GENERAL;
|
|
1234
685
|
this.errorHooks(allHooksReversed, hookContext, err, options);
|
|
1235
686
|
return {
|
|
1236
687
|
errorCode,
|
|
1237
688
|
errorMessage,
|
|
1238
689
|
value: defaultValue,
|
|
1239
|
-
reason: StandardResolutionReasons.ERROR,
|
|
690
|
+
reason: import_core3.StandardResolutionReasons.ERROR,
|
|
1240
691
|
flagMetadata: Object.freeze({}),
|
|
1241
692
|
flagKey
|
|
1242
693
|
};
|
|
@@ -1293,4 +744,7 @@ var OpenFeatureClient = class {
|
|
|
1293
744
|
return this._clientLogger || this.globalLogger();
|
|
1294
745
|
}
|
|
1295
746
|
};
|
|
747
|
+
|
|
748
|
+
// src/index.ts
|
|
749
|
+
__reExport(src_exports, require("@openfeature/core"), module.exports);
|
|
1296
750
|
//# sourceMappingURL=index.js.map
|