@xyd-js/host 0.0.0-build

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.
@@ -0,0 +1,1715 @@
1
+ "use strict";
2
+ var OpenFeature = (() => {
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __defProps = Object.defineProperties;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
8
+ var __getOwnPropNames = Object.getOwnPropertyNames;
9
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
10
+ var __getProtoOf = Object.getPrototypeOf;
11
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
12
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
13
+ var __reflectGet = Reflect.get;
14
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15
+ var __spreadValues = (a, b) => {
16
+ for (var prop in b || (b = {}))
17
+ if (__hasOwnProp.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ if (__getOwnPropSymbols)
20
+ for (var prop of __getOwnPropSymbols(b)) {
21
+ if (__propIsEnum.call(b, prop))
22
+ __defNormalProp(a, prop, b[prop]);
23
+ }
24
+ return a;
25
+ };
26
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
27
+ var __commonJS = (cb, mod) => function __require() {
28
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
29
+ };
30
+ var __export = (target, all) => {
31
+ for (var name in all)
32
+ __defProp(target, name, { get: all[name], enumerable: true });
33
+ };
34
+ var __copyProps = (to, from, except, desc) => {
35
+ if (from && typeof from === "object" || typeof from === "function") {
36
+ for (let key of __getOwnPropNames(from))
37
+ if (!__hasOwnProp.call(to, key) && key !== except)
38
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
39
+ }
40
+ return to;
41
+ };
42
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
43
+ // If the importer is in node compatibility mode or this is not an ESM
44
+ // file that has been converted to a CommonJS file using a Babel-
45
+ // compatible transform (i.e. "__esModule" has not been set), then set
46
+ // "default" to the CommonJS "module.exports" for node compatibility.
47
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
48
+ mod
49
+ ));
50
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
51
+ var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
52
+ var __async = (__this, __arguments, generator) => {
53
+ return new Promise((resolve, reject) => {
54
+ var fulfilled = (value) => {
55
+ try {
56
+ step(generator.next(value));
57
+ } catch (e) {
58
+ reject(e);
59
+ }
60
+ };
61
+ var rejected = (value) => {
62
+ try {
63
+ step(generator.throw(value));
64
+ } catch (e) {
65
+ reject(e);
66
+ }
67
+ };
68
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
69
+ step((generator = generator.apply(__this, __arguments)).next());
70
+ });
71
+ };
72
+
73
+ // ../../node_modules/eventemitter3/index.js
74
+ var require_eventemitter3 = __commonJS({
75
+ "../../node_modules/eventemitter3/index.js"(exports, module) {
76
+ "use strict";
77
+ var has = Object.prototype.hasOwnProperty;
78
+ var prefix = "~";
79
+ function Events() {
80
+ }
81
+ if (Object.create) {
82
+ Events.prototype = /* @__PURE__ */ Object.create(null);
83
+ if (!new Events().__proto__) prefix = false;
84
+ }
85
+ function EE(fn, context, once) {
86
+ this.fn = fn;
87
+ this.context = context;
88
+ this.once = once || false;
89
+ }
90
+ function addListener(emitter, event, fn, context, once) {
91
+ if (typeof fn !== "function") {
92
+ throw new TypeError("The listener must be a function");
93
+ }
94
+ var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
95
+ if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
96
+ else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
97
+ else emitter._events[evt] = [emitter._events[evt], listener];
98
+ return emitter;
99
+ }
100
+ function clearEvent(emitter, evt) {
101
+ if (--emitter._eventsCount === 0) emitter._events = new Events();
102
+ else delete emitter._events[evt];
103
+ }
104
+ function EventEmitter2() {
105
+ this._events = new Events();
106
+ this._eventsCount = 0;
107
+ }
108
+ EventEmitter2.prototype.eventNames = function eventNames() {
109
+ var names = [], events, name;
110
+ if (this._eventsCount === 0) return names;
111
+ for (name in events = this._events) {
112
+ if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
113
+ }
114
+ if (Object.getOwnPropertySymbols) {
115
+ return names.concat(Object.getOwnPropertySymbols(events));
116
+ }
117
+ return names;
118
+ };
119
+ EventEmitter2.prototype.listeners = function listeners(event) {
120
+ var evt = prefix ? prefix + event : event, handlers = this._events[evt];
121
+ if (!handlers) return [];
122
+ if (handlers.fn) return [handlers.fn];
123
+ for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
124
+ ee[i] = handlers[i].fn;
125
+ }
126
+ return ee;
127
+ };
128
+ EventEmitter2.prototype.listenerCount = function listenerCount(event) {
129
+ var evt = prefix ? prefix + event : event, listeners = this._events[evt];
130
+ if (!listeners) return 0;
131
+ if (listeners.fn) return 1;
132
+ return listeners.length;
133
+ };
134
+ EventEmitter2.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
135
+ var evt = prefix ? prefix + event : event;
136
+ if (!this._events[evt]) return false;
137
+ var listeners = this._events[evt], len = arguments.length, args, i;
138
+ if (listeners.fn) {
139
+ if (listeners.once) this.removeListener(event, listeners.fn, void 0, true);
140
+ switch (len) {
141
+ case 1:
142
+ return listeners.fn.call(listeners.context), true;
143
+ case 2:
144
+ return listeners.fn.call(listeners.context, a1), true;
145
+ case 3:
146
+ return listeners.fn.call(listeners.context, a1, a2), true;
147
+ case 4:
148
+ return listeners.fn.call(listeners.context, a1, a2, a3), true;
149
+ case 5:
150
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
151
+ case 6:
152
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
153
+ }
154
+ for (i = 1, args = new Array(len - 1); i < len; i++) {
155
+ args[i - 1] = arguments[i];
156
+ }
157
+ listeners.fn.apply(listeners.context, args);
158
+ } else {
159
+ var length = listeners.length, j;
160
+ for (i = 0; i < length; i++) {
161
+ if (listeners[i].once) this.removeListener(event, listeners[i].fn, void 0, true);
162
+ switch (len) {
163
+ case 1:
164
+ listeners[i].fn.call(listeners[i].context);
165
+ break;
166
+ case 2:
167
+ listeners[i].fn.call(listeners[i].context, a1);
168
+ break;
169
+ case 3:
170
+ listeners[i].fn.call(listeners[i].context, a1, a2);
171
+ break;
172
+ case 4:
173
+ listeners[i].fn.call(listeners[i].context, a1, a2, a3);
174
+ break;
175
+ default:
176
+ if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) {
177
+ args[j - 1] = arguments[j];
178
+ }
179
+ listeners[i].fn.apply(listeners[i].context, args);
180
+ }
181
+ }
182
+ }
183
+ return true;
184
+ };
185
+ EventEmitter2.prototype.on = function on(event, fn, context) {
186
+ return addListener(this, event, fn, context, false);
187
+ };
188
+ EventEmitter2.prototype.once = function once(event, fn, context) {
189
+ return addListener(this, event, fn, context, true);
190
+ };
191
+ EventEmitter2.prototype.removeListener = function removeListener(event, fn, context, once) {
192
+ var evt = prefix ? prefix + event : event;
193
+ if (!this._events[evt]) return this;
194
+ if (!fn) {
195
+ clearEvent(this, evt);
196
+ return this;
197
+ }
198
+ var listeners = this._events[evt];
199
+ if (listeners.fn) {
200
+ if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
201
+ clearEvent(this, evt);
202
+ }
203
+ } else {
204
+ for (var i = 0, events = [], length = listeners.length; i < length; i++) {
205
+ if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
206
+ events.push(listeners[i]);
207
+ }
208
+ }
209
+ if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
210
+ else clearEvent(this, evt);
211
+ }
212
+ return this;
213
+ };
214
+ EventEmitter2.prototype.removeAllListeners = function removeAllListeners(event) {
215
+ var evt;
216
+ if (event) {
217
+ evt = prefix ? prefix + event : event;
218
+ if (this._events[evt]) clearEvent(this, evt);
219
+ } else {
220
+ this._events = new Events();
221
+ this._eventsCount = 0;
222
+ }
223
+ return this;
224
+ };
225
+ EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;
226
+ EventEmitter2.prototype.addListener = EventEmitter2.prototype.on;
227
+ EventEmitter2.prefixed = prefix;
228
+ EventEmitter2.EventEmitter = EventEmitter2;
229
+ if ("undefined" !== typeof module) {
230
+ module.exports = EventEmitter2;
231
+ }
232
+ }
233
+ });
234
+
235
+ // src/index.ts
236
+ var index_exports = {};
237
+ __export(index_exports, {
238
+ AllProviderEvents: () => ClientProviderEvents,
239
+ AllProviderStatus: () => ClientProviderStatus,
240
+ ClientProviderEvents: () => ClientProviderEvents,
241
+ ClientProviderStatus: () => ClientProviderStatus,
242
+ DefaultLogger: () => DefaultLogger,
243
+ ErrorCode: () => ErrorCode,
244
+ FlagNotFoundError: () => FlagNotFoundError,
245
+ GeneralError: () => GeneralError,
246
+ GenericEventEmitter: () => GenericEventEmitter,
247
+ InMemoryProvider: () => InMemoryProvider,
248
+ InvalidContextError: () => InvalidContextError,
249
+ LOG_LEVELS: () => LOG_LEVELS,
250
+ MapHookData: () => MapHookData,
251
+ NOOP_PROVIDER: () => NOOP_PROVIDER,
252
+ OpenFeature: () => OpenFeature,
253
+ OpenFeatureAPI: () => OpenFeatureAPI,
254
+ OpenFeatureCommonAPI: () => OpenFeatureCommonAPI,
255
+ OpenFeatureError: () => OpenFeatureError,
256
+ OpenFeatureEventEmitter: () => OpenFeatureEventEmitter,
257
+ ParseError: () => ParseError,
258
+ ProviderEvents: () => ClientProviderEvents,
259
+ ProviderFatalError: () => ProviderFatalError,
260
+ ProviderNotReadyError: () => ProviderNotReadyError,
261
+ ProviderStatus: () => ClientProviderStatus,
262
+ ProviderWrapper: () => ProviderWrapper,
263
+ SafeLogger: () => SafeLogger,
264
+ ServerProviderEvents: () => ServerProviderEvents,
265
+ ServerProviderStatus: () => ServerProviderStatus,
266
+ StandardResolutionReasons: () => StandardResolutionReasons,
267
+ TargetingKeyMissingError: () => TargetingKeyMissingError,
268
+ TelemetryAttribute: () => TelemetryAttribute,
269
+ TelemetryFlagMetadata: () => TelemetryFlagMetadata,
270
+ TypeMismatchError: () => TypeMismatchError,
271
+ createEvaluationEvent: () => createEvaluationEvent,
272
+ instantiateErrorByErrorCode: () => instantiateErrorByErrorCode,
273
+ isObject: () => isObject,
274
+ isString: () => isString,
275
+ objectOrUndefined: () => objectOrUndefined,
276
+ statusMatchesEvent: () => statusMatchesEvent,
277
+ stringOrUndefined: () => stringOrUndefined
278
+ });
279
+
280
+ // ../shared/src/hooks/hook-data.ts
281
+ var MapHookData = class {
282
+ constructor() {
283
+ this.data = /* @__PURE__ */ new Map();
284
+ }
285
+ set(key, value) {
286
+ this.data.set(key, value);
287
+ }
288
+ get(key) {
289
+ return this.data.get(key);
290
+ }
291
+ has(key) {
292
+ return this.data.has(key);
293
+ }
294
+ delete(key) {
295
+ return this.data.delete(key);
296
+ }
297
+ clear() {
298
+ this.data.clear();
299
+ }
300
+ };
301
+
302
+ // ../shared/src/evaluation/evaluation.ts
303
+ var StandardResolutionReasons = {
304
+ /**
305
+ * The resolved value is static (no dynamic evaluation).
306
+ */
307
+ STATIC: "STATIC",
308
+ /**
309
+ * The resolved value was configured statically, or otherwise fell back to a pre-configured value.
310
+ */
311
+ DEFAULT: "DEFAULT",
312
+ /**
313
+ * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.
314
+ */
315
+ TARGETING_MATCH: "TARGETING_MATCH",
316
+ /**
317
+ * The resolved value was the result of pseudorandom assignment.
318
+ */
319
+ SPLIT: "SPLIT",
320
+ /**
321
+ * The resolved value was retrieved from cache.
322
+ */
323
+ CACHED: "CACHED",
324
+ /**
325
+ * The resolved value was the result of the flag being disabled in the management system.
326
+ */
327
+ DISABLED: "DISABLED",
328
+ /**
329
+ * The reason for the resolved value could not be determined.
330
+ */
331
+ UNKNOWN: "UNKNOWN",
332
+ /**
333
+ * The resolved value is non-authoritative or possibly out of date.
334
+ */
335
+ STALE: "STALE",
336
+ /**
337
+ * The resolved value was the result of an error.
338
+ *
339
+ * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.
340
+ */
341
+ ERROR: "ERROR"
342
+ };
343
+ var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
344
+ ErrorCode2["PROVIDER_NOT_READY"] = "PROVIDER_NOT_READY";
345
+ ErrorCode2["PROVIDER_FATAL"] = "PROVIDER_FATAL";
346
+ ErrorCode2["FLAG_NOT_FOUND"] = "FLAG_NOT_FOUND";
347
+ ErrorCode2["PARSE_ERROR"] = "PARSE_ERROR";
348
+ ErrorCode2["TYPE_MISMATCH"] = "TYPE_MISMATCH";
349
+ ErrorCode2["TARGETING_KEY_MISSING"] = "TARGETING_KEY_MISSING";
350
+ ErrorCode2["INVALID_CONTEXT"] = "INVALID_CONTEXT";
351
+ ErrorCode2["GENERAL"] = "GENERAL";
352
+ return ErrorCode2;
353
+ })(ErrorCode || {});
354
+
355
+ // ../shared/src/errors/open-feature-error-abstract.ts
356
+ var OpenFeatureError = class _OpenFeatureError extends Error {
357
+ constructor(message, options) {
358
+ super(message);
359
+ Object.setPrototypeOf(this, _OpenFeatureError.prototype);
360
+ this.name = "OpenFeatureError";
361
+ this.cause = options == null ? void 0 : options.cause;
362
+ }
363
+ };
364
+
365
+ // ../shared/src/errors/flag-not-found-error.ts
366
+ var FlagNotFoundError = class _FlagNotFoundError extends OpenFeatureError {
367
+ constructor(message, options) {
368
+ super(message, options);
369
+ Object.setPrototypeOf(this, _FlagNotFoundError.prototype);
370
+ this.name = "FlagNotFoundError";
371
+ this.code = "FLAG_NOT_FOUND" /* FLAG_NOT_FOUND */;
372
+ }
373
+ };
374
+
375
+ // ../shared/src/errors/general-error.ts
376
+ var GeneralError = class _GeneralError extends OpenFeatureError {
377
+ constructor(message, options) {
378
+ super(message, options);
379
+ Object.setPrototypeOf(this, _GeneralError.prototype);
380
+ this.name = "GeneralError";
381
+ this.code = "GENERAL" /* GENERAL */;
382
+ }
383
+ };
384
+
385
+ // ../shared/src/errors/invalid-context-error.ts
386
+ var InvalidContextError = class _InvalidContextError extends OpenFeatureError {
387
+ constructor(message, options) {
388
+ super(message, options);
389
+ Object.setPrototypeOf(this, _InvalidContextError.prototype);
390
+ this.name = "InvalidContextError";
391
+ this.code = "INVALID_CONTEXT" /* INVALID_CONTEXT */;
392
+ }
393
+ };
394
+
395
+ // ../shared/src/errors/parse-error.ts
396
+ var ParseError = class _ParseError extends OpenFeatureError {
397
+ constructor(message, options) {
398
+ super(message, options);
399
+ Object.setPrototypeOf(this, _ParseError.prototype);
400
+ this.name = "ParseError";
401
+ this.code = "PARSE_ERROR" /* PARSE_ERROR */;
402
+ }
403
+ };
404
+
405
+ // ../shared/src/errors/provider-fatal-error.ts
406
+ var ProviderFatalError = class _ProviderFatalError extends OpenFeatureError {
407
+ constructor(message, options) {
408
+ super(message, options);
409
+ Object.setPrototypeOf(this, _ProviderFatalError.prototype);
410
+ this.name = "ProviderFatalError";
411
+ this.code = "PROVIDER_FATAL" /* PROVIDER_FATAL */;
412
+ }
413
+ };
414
+
415
+ // ../shared/src/errors/provider-not-ready-error.ts
416
+ var ProviderNotReadyError = class _ProviderNotReadyError extends OpenFeatureError {
417
+ constructor(message, options) {
418
+ super(message, options);
419
+ Object.setPrototypeOf(this, _ProviderNotReadyError.prototype);
420
+ this.name = "ProviderNotReadyError";
421
+ this.code = "PROVIDER_NOT_READY" /* PROVIDER_NOT_READY */;
422
+ }
423
+ };
424
+
425
+ // ../shared/src/errors/targeting-key-missing-error.ts
426
+ var TargetingKeyMissingError = class _TargetingKeyMissingError extends OpenFeatureError {
427
+ constructor(message, options) {
428
+ super(message, options);
429
+ Object.setPrototypeOf(this, _TargetingKeyMissingError.prototype);
430
+ this.name = "TargetingKeyMissingError";
431
+ this.code = "TARGETING_KEY_MISSING" /* TARGETING_KEY_MISSING */;
432
+ }
433
+ };
434
+
435
+ // ../shared/src/errors/type-mismatch-error.ts
436
+ var TypeMismatchError = class _TypeMismatchError extends OpenFeatureError {
437
+ constructor(message, options) {
438
+ super(message, options);
439
+ Object.setPrototypeOf(this, _TypeMismatchError.prototype);
440
+ this.name = "TypeMismatchError";
441
+ this.code = "TYPE_MISMATCH" /* TYPE_MISMATCH */;
442
+ }
443
+ };
444
+
445
+ // ../shared/src/errors/index.ts
446
+ var instantiateErrorByErrorCode = (errorCode, message) => {
447
+ switch (errorCode) {
448
+ case "FLAG_NOT_FOUND" /* FLAG_NOT_FOUND */:
449
+ return new FlagNotFoundError(message);
450
+ case "PARSE_ERROR" /* PARSE_ERROR */:
451
+ return new ParseError(message);
452
+ case "TYPE_MISMATCH" /* TYPE_MISMATCH */:
453
+ return new TypeMismatchError(message);
454
+ case "TARGETING_KEY_MISSING" /* TARGETING_KEY_MISSING */:
455
+ return new TargetingKeyMissingError(message);
456
+ case "INVALID_CONTEXT" /* INVALID_CONTEXT */:
457
+ return new InvalidContextError(message);
458
+ case "PROVIDER_NOT_READY" /* PROVIDER_NOT_READY */:
459
+ return new ProviderNotReadyError(message);
460
+ case "PROVIDER_FATAL" /* PROVIDER_FATAL */:
461
+ return new ProviderFatalError(message);
462
+ default:
463
+ return new GeneralError(message);
464
+ }
465
+ };
466
+
467
+ // ../shared/src/provider/provider.ts
468
+ var ServerProviderStatus = /* @__PURE__ */ ((ServerProviderStatus2) => {
469
+ ServerProviderStatus2["NOT_READY"] = "NOT_READY";
470
+ ServerProviderStatus2["READY"] = "READY";
471
+ ServerProviderStatus2["ERROR"] = "ERROR";
472
+ ServerProviderStatus2["STALE"] = "STALE";
473
+ ServerProviderStatus2["FATAL"] = "FATAL";
474
+ return ServerProviderStatus2;
475
+ })(ServerProviderStatus || {});
476
+ var ClientProviderStatus = /* @__PURE__ */ ((ClientProviderStatus2) => {
477
+ ClientProviderStatus2["NOT_READY"] = "NOT_READY";
478
+ ClientProviderStatus2["READY"] = "READY";
479
+ ClientProviderStatus2["ERROR"] = "ERROR";
480
+ ClientProviderStatus2["STALE"] = "STALE";
481
+ ClientProviderStatus2["FATAL"] = "FATAL";
482
+ ClientProviderStatus2["RECONCILING"] = "RECONCILING";
483
+ return ClientProviderStatus2;
484
+ })(ClientProviderStatus || {});
485
+
486
+ // ../shared/src/events/events.ts
487
+ var ServerProviderEvents = /* @__PURE__ */ ((ServerProviderEvents2) => {
488
+ ServerProviderEvents2["Ready"] = "PROVIDER_READY";
489
+ ServerProviderEvents2["Error"] = "PROVIDER_ERROR";
490
+ ServerProviderEvents2["ConfigurationChanged"] = "PROVIDER_CONFIGURATION_CHANGED";
491
+ ServerProviderEvents2["Stale"] = "PROVIDER_STALE";
492
+ return ServerProviderEvents2;
493
+ })(ServerProviderEvents || {});
494
+ var ClientProviderEvents = /* @__PURE__ */ ((ClientProviderEvents2) => {
495
+ ClientProviderEvents2["Ready"] = "PROVIDER_READY";
496
+ ClientProviderEvents2["Error"] = "PROVIDER_ERROR";
497
+ ClientProviderEvents2["ConfigurationChanged"] = "PROVIDER_CONFIGURATION_CHANGED";
498
+ ClientProviderEvents2["ContextChanged"] = "PROVIDER_CONTEXT_CHANGED";
499
+ ClientProviderEvents2["Reconciling"] = "PROVIDER_RECONCILING";
500
+ ClientProviderEvents2["Stale"] = "PROVIDER_STALE";
501
+ return ClientProviderEvents2;
502
+ })(ClientProviderEvents || {});
503
+
504
+ // ../shared/src/events/event-utils.ts
505
+ var eventStatusMap = {
506
+ ["READY" /* READY */]: "PROVIDER_READY" /* Ready */,
507
+ ["ERROR" /* ERROR */]: "PROVIDER_ERROR" /* Error */,
508
+ ["FATAL" /* FATAL */]: "PROVIDER_ERROR" /* Error */,
509
+ ["STALE" /* STALE */]: "PROVIDER_STALE" /* Stale */,
510
+ ["RECONCILING" /* RECONCILING */]: "PROVIDER_RECONCILING" /* Reconciling */,
511
+ ["NOT_READY" /* NOT_READY */]: void 0
512
+ };
513
+ var statusMatchesEvent = (event, status) => {
514
+ return !status && event === "PROVIDER_READY" /* Ready */ || eventStatusMap[status] === event;
515
+ };
516
+
517
+ // ../shared/src/logger/default-logger.ts
518
+ var DefaultLogger = class {
519
+ error(...args) {
520
+ console.error(...args);
521
+ }
522
+ warn(...args) {
523
+ console.warn(...args);
524
+ }
525
+ info() {
526
+ }
527
+ debug() {
528
+ }
529
+ };
530
+
531
+ // ../shared/src/logger/safe-logger.ts
532
+ var LOG_LEVELS = ["error", "warn", "info", "debug"];
533
+ var SafeLogger = class {
534
+ constructor(logger) {
535
+ this.fallbackLogger = new DefaultLogger();
536
+ try {
537
+ for (const level of LOG_LEVELS) {
538
+ if (!logger[level] || typeof logger[level] !== "function") {
539
+ throw new Error(`The provided logger is missing the ${level} method.`);
540
+ }
541
+ }
542
+ this.logger = logger;
543
+ } catch (err) {
544
+ console.error(err);
545
+ console.error("Falling back to the default logger.");
546
+ this.logger = this.fallbackLogger;
547
+ }
548
+ }
549
+ error(...args) {
550
+ this.log("error", ...args);
551
+ }
552
+ warn(...args) {
553
+ this.log("warn", ...args);
554
+ }
555
+ info(...args) {
556
+ this.log("info", ...args);
557
+ }
558
+ debug(...args) {
559
+ this.log("debug", ...args);
560
+ }
561
+ log(level, ...args) {
562
+ try {
563
+ this.logger[level](...args);
564
+ } catch (error) {
565
+ this.fallbackLogger[level](...args);
566
+ }
567
+ }
568
+ };
569
+
570
+ // ../shared/src/events/generic-event-emitter.ts
571
+ var GenericEventEmitter = class {
572
+ constructor(globalLogger) {
573
+ this.globalLogger = globalLogger;
574
+ this._handlers = {
575
+ ["PROVIDER_CONFIGURATION_CHANGED" /* ConfigurationChanged */]: /* @__PURE__ */ new WeakMap(),
576
+ ["PROVIDER_CONTEXT_CHANGED" /* ContextChanged */]: /* @__PURE__ */ new WeakMap(),
577
+ ["PROVIDER_READY" /* Ready */]: /* @__PURE__ */ new WeakMap(),
578
+ ["PROVIDER_ERROR" /* Error */]: /* @__PURE__ */ new WeakMap(),
579
+ ["PROVIDER_STALE" /* Stale */]: /* @__PURE__ */ new WeakMap(),
580
+ ["PROVIDER_RECONCILING" /* Reconciling */]: /* @__PURE__ */ new WeakMap()
581
+ };
582
+ }
583
+ // here we use E, to restrict the events a provider can manually emit (PROVIDER_CONTEXT_CHANGED is emitted by the SDK)
584
+ emit(eventType, context) {
585
+ this.eventEmitter.emit(eventType, context);
586
+ }
587
+ addHandler(eventType, handler) {
588
+ const asyncHandler = (details) => __async(this, null, function* () {
589
+ var _a;
590
+ try {
591
+ yield handler(details);
592
+ } catch (err) {
593
+ (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
594
+ }
595
+ });
596
+ const existingAsyncHandlers = this._handlers[eventType].get(handler);
597
+ this._handlers[eventType].set(handler, [...existingAsyncHandlers || [], asyncHandler]);
598
+ this.eventEmitter.on(eventType, asyncHandler);
599
+ }
600
+ removeHandler(eventType, handler) {
601
+ const existingAsyncHandlers = this._handlers[eventType].get(handler);
602
+ if (existingAsyncHandlers) {
603
+ const removedAsyncHandler = existingAsyncHandlers.pop();
604
+ if (removedAsyncHandler) {
605
+ this.eventEmitter.removeListener(eventType, removedAsyncHandler);
606
+ }
607
+ }
608
+ }
609
+ removeAllHandlers(eventType) {
610
+ if (eventType) {
611
+ this.eventEmitter.removeAllListeners(eventType);
612
+ } else {
613
+ this.eventEmitter.removeAllListeners();
614
+ }
615
+ }
616
+ getHandlers(eventType) {
617
+ return this.eventEmitter.listeners(eventType);
618
+ }
619
+ setLogger(logger) {
620
+ this._eventLogger = new SafeLogger(logger);
621
+ return this;
622
+ }
623
+ get _logger() {
624
+ var _a, _b;
625
+ return (_b = this._eventLogger) != null ? _b : (_a = this.globalLogger) == null ? void 0 : _a.call(this);
626
+ }
627
+ };
628
+
629
+ // ../shared/src/telemetry/attributes.ts
630
+ var TelemetryAttribute = {
631
+ /**
632
+ * The lookup key of the feature flag.
633
+ *
634
+ * - type: `string`
635
+ * - requirement level: `required`
636
+ * - example: `logo-color`
637
+ */
638
+ KEY: "feature_flag.key",
639
+ /**
640
+ * Describes a class of error the operation ended with.
641
+ *
642
+ * - type: `string`
643
+ * - requirement level: `conditionally required`
644
+ * - condition: `reason` is `error`
645
+ * - example: `flag_not_found`
646
+ */
647
+ ERROR_CODE: "error.type",
648
+ /**
649
+ * A message explaining the nature of an error occurring during flag evaluation.
650
+ *
651
+ * - type: `string`
652
+ * - requirement level: `recommended`
653
+ * - example: `Flag not found`
654
+ */
655
+ ERROR_MESSAGE: "error.message",
656
+ /**
657
+ * A semantic identifier for an evaluated flag value.
658
+ *
659
+ * - type: `string`
660
+ * - requirement level: `conditionally required`
661
+ * - condition: variant is defined on the evaluation details
662
+ * - example: `blue`; `on`; `true`
663
+ */
664
+ VARIANT: "feature_flag.result.variant",
665
+ /**
666
+ * The evaluated value of the feature flag.
667
+ *
668
+ * - type: `undefined`
669
+ * - requirement level: `conditionally required`
670
+ * - condition: variant is not defined on the evaluation details
671
+ * - example: `#ff0000`; `1`; `true`
672
+ */
673
+ VALUE: "feature_flag.result.value",
674
+ /**
675
+ * The unique identifier for the flag evaluation context. For example, the targeting key.
676
+ *
677
+ * - type: `string`
678
+ * - requirement level: `recommended`
679
+ * - example: `5157782b-2203-4c80-a857-dbbd5e7761db`
680
+ */
681
+ CONTEXT_ID: "feature_flag.context.id",
682
+ /**
683
+ * The reason code which shows how a feature flag value was determined.
684
+ *
685
+ * - type: `string`
686
+ * - requirement level: `recommended`
687
+ * - example: `targeting_match`
688
+ */
689
+ REASON: "feature_flag.result.reason",
690
+ /**
691
+ * Describes a class of error the operation ended with.
692
+ *
693
+ * - type: `string`
694
+ * - requirement level: `recommended`
695
+ * - example: `flag_not_found`
696
+ */
697
+ PROVIDER: "feature_flag.provider.name",
698
+ /**
699
+ * The identifier of the flag set to which the feature flag belongs.
700
+ *
701
+ * - type: `string`
702
+ * - requirement level: `recommended`
703
+ * - example: `proj-1`; `ab98sgs`; `service1/dev`
704
+ */
705
+ FLAG_SET_ID: "feature_flag.set.id",
706
+ /**
707
+ * The version of the ruleset used during the evaluation. This may be any stable value which uniquely identifies the ruleset.
708
+ *
709
+ * - type: `string`
710
+ * - requirement level: `recommended`
711
+ * - example: `1.0.0`; `2021-01-01`
712
+ */
713
+ VERSION: "feature_flag.version"
714
+ };
715
+
716
+ // ../shared/src/telemetry/flag-metadata.ts
717
+ var TelemetryFlagMetadata = {
718
+ /**
719
+ * The context identifier returned in the flag metadata uniquely identifies
720
+ * the subject of the flag evaluation. If not available, the targeting key
721
+ * should be used.
722
+ */
723
+ CONTEXT_ID: "contextId",
724
+ /**
725
+ * A logical identifier for the flag set.
726
+ */
727
+ FLAG_SET_ID: "flagSetId",
728
+ /**
729
+ * A version string (format unspecified) for the flag or flag set.
730
+ */
731
+ VERSION: "version"
732
+ };
733
+
734
+ // ../shared/src/telemetry/evaluation-event.ts
735
+ var FLAG_EVALUATION_EVENT_NAME = "feature_flag.evaluation";
736
+ function createEvaluationEvent(hookContext, evaluationDetails) {
737
+ var _a, _b;
738
+ const attributes = {
739
+ [TelemetryAttribute.KEY]: hookContext.flagKey,
740
+ [TelemetryAttribute.PROVIDER]: hookContext.providerMetadata.name,
741
+ [TelemetryAttribute.REASON]: ((_a = evaluationDetails.reason) != null ? _a : StandardResolutionReasons.UNKNOWN).toLowerCase()
742
+ };
743
+ if (evaluationDetails.variant) {
744
+ attributes[TelemetryAttribute.VARIANT] = evaluationDetails.variant;
745
+ } else {
746
+ attributes[TelemetryAttribute.VALUE] = evaluationDetails.value;
747
+ }
748
+ const contextId = evaluationDetails.flagMetadata[TelemetryFlagMetadata.CONTEXT_ID] || hookContext.context.targetingKey;
749
+ if (contextId) {
750
+ attributes[TelemetryAttribute.CONTEXT_ID] = contextId;
751
+ }
752
+ const setId = evaluationDetails.flagMetadata[TelemetryFlagMetadata.FLAG_SET_ID];
753
+ if (setId) {
754
+ attributes[TelemetryAttribute.FLAG_SET_ID] = setId;
755
+ }
756
+ const version = evaluationDetails.flagMetadata[TelemetryFlagMetadata.VERSION];
757
+ if (version) {
758
+ attributes[TelemetryAttribute.VERSION] = version;
759
+ }
760
+ if (evaluationDetails.reason === StandardResolutionReasons.ERROR) {
761
+ attributes[TelemetryAttribute.ERROR_CODE] = ((_b = evaluationDetails.errorCode) != null ? _b : "GENERAL" /* GENERAL */).toLowerCase();
762
+ if (evaluationDetails.errorMessage) {
763
+ attributes[TelemetryAttribute.ERROR_MESSAGE] = evaluationDetails.errorMessage;
764
+ }
765
+ }
766
+ return {
767
+ name: FLAG_EVALUATION_EVENT_NAME,
768
+ attributes
769
+ };
770
+ }
771
+
772
+ // ../shared/src/type-guards.ts
773
+ function isString(value) {
774
+ return typeof value === "string";
775
+ }
776
+ function stringOrUndefined(value) {
777
+ return isString(value) ? value : void 0;
778
+ }
779
+ function isObject(value) {
780
+ return typeof value === "object";
781
+ }
782
+ function objectOrUndefined(value) {
783
+ return isObject(value) ? value : void 0;
784
+ }
785
+
786
+ // ../shared/src/filter.ts
787
+ function isDefined(input) {
788
+ return typeof input !== "undefined" && input !== null;
789
+ }
790
+
791
+ // ../shared/src/open-feature.ts
792
+ var ProviderWrapper = class {
793
+ constructor(_provider, _status, _statusEnumType) {
794
+ this._provider = _provider;
795
+ this._status = _status;
796
+ this._pendingContextChanges = 0;
797
+ var _a, _b, _c;
798
+ (_a = _provider.events) == null ? void 0 : _a.addHandler("PROVIDER_READY" /* Ready */, () => {
799
+ this._status = _statusEnumType.READY;
800
+ });
801
+ (_b = _provider.events) == null ? void 0 : _b.addHandler("PROVIDER_STALE" /* Stale */, () => {
802
+ this._status = _statusEnumType.STALE;
803
+ });
804
+ (_c = _provider.events) == null ? void 0 : _c.addHandler("PROVIDER_ERROR" /* Error */, (details) => {
805
+ if ((details == null ? void 0 : details.errorCode) === "PROVIDER_FATAL" /* PROVIDER_FATAL */) {
806
+ this._status = _statusEnumType.FATAL;
807
+ } else {
808
+ this._status = _statusEnumType.ERROR;
809
+ }
810
+ });
811
+ }
812
+ get provider() {
813
+ return this._provider;
814
+ }
815
+ set provider(provider) {
816
+ this._provider = provider;
817
+ }
818
+ get status() {
819
+ return this._status;
820
+ }
821
+ set status(status) {
822
+ this._status = status;
823
+ }
824
+ get allContextChangesSettled() {
825
+ return this._pendingContextChanges === 0;
826
+ }
827
+ incrementPendingContextChanges() {
828
+ this._pendingContextChanges++;
829
+ }
830
+ decrementPendingContextChanges() {
831
+ this._pendingContextChanges--;
832
+ }
833
+ };
834
+ var OpenFeatureCommonAPI = class {
835
+ constructor(category) {
836
+ this._hooks = [];
837
+ this._context = {};
838
+ this._logger = new DefaultLogger();
839
+ this._clientEventHandlers = /* @__PURE__ */ new Map();
840
+ this._domainScopedContext = /* @__PURE__ */ new Map();
841
+ this._clientEvents = /* @__PURE__ */ new Map();
842
+ this._runsOn = category;
843
+ }
844
+ addHooks(...hooks) {
845
+ this._hooks = [...this._hooks, ...hooks];
846
+ return this;
847
+ }
848
+ getHooks() {
849
+ return this._hooks;
850
+ }
851
+ clearHooks() {
852
+ this._hooks = [];
853
+ return this;
854
+ }
855
+ setLogger(logger) {
856
+ this._logger = new SafeLogger(logger);
857
+ return this;
858
+ }
859
+ /**
860
+ * Get metadata about the default provider.
861
+ * @returns {ProviderMetadata} Provider Metadata
862
+ */
863
+ get providerMetadata() {
864
+ return this.getProviderMetadata();
865
+ }
866
+ /**
867
+ * Get metadata about a registered provider using the client name.
868
+ * An unbound or empty client name will return metadata from the default provider.
869
+ * @param {string} domain An identifier which logically binds clients with providers
870
+ * @returns {ProviderMetadata} Provider Metadata
871
+ */
872
+ getProviderMetadata(domain) {
873
+ return this.getProviderForClient(domain).metadata;
874
+ }
875
+ /**
876
+ * Adds a handler for the given provider event type.
877
+ * The handlers are called in the order they have been added.
878
+ * API (global) events run for all providers.
879
+ * @param {AnyProviderEvent} eventType The provider event type to listen to
880
+ * @param {EventHandler} handler The handler to run on occurrence of the event type
881
+ * @param {EventOptions} options Optional options such as signal for aborting
882
+ */
883
+ addHandler(eventType, handler, options) {
884
+ [.../* @__PURE__ */ new Map([[void 0, this._defaultProvider]]), ...this._domainScopedProviders].forEach((keyProviderTuple) => {
885
+ var _a;
886
+ const domain = keyProviderTuple[0];
887
+ const provider = keyProviderTuple[1].provider;
888
+ const status = keyProviderTuple[1].status;
889
+ const shouldRunNow = statusMatchesEvent(eventType, status);
890
+ if (shouldRunNow) {
891
+ try {
892
+ handler({ domain, providerName: provider.metadata.name });
893
+ } catch (err) {
894
+ (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
895
+ }
896
+ }
897
+ });
898
+ this._apiEmitter.addHandler(eventType, handler);
899
+ if ((options == null ? void 0 : options.signal) && typeof options.signal.addEventListener === "function") {
900
+ options.signal.addEventListener("abort", () => {
901
+ this.removeHandler(eventType, handler);
902
+ });
903
+ }
904
+ }
905
+ /**
906
+ * Removes a handler for the given provider event type.
907
+ * @param {AnyProviderEvent} eventType The provider event type to remove the listener for
908
+ * @param {EventHandler} handler The handler to remove for the provider event type
909
+ */
910
+ removeHandler(eventType, handler) {
911
+ this._apiEmitter.removeHandler(eventType, handler);
912
+ }
913
+ /**
914
+ * Removes all event handlers.
915
+ */
916
+ clearHandlers() {
917
+ this._apiEmitter.removeAllHandlers();
918
+ }
919
+ /**
920
+ * Gets the current handlers for the given provider event type.
921
+ * @param {AnyProviderEvent} eventType The provider event type to get the current handlers for
922
+ * @returns {EventHandler[]} The handlers currently attached to the given provider event type
923
+ */
924
+ getHandlers(eventType) {
925
+ return this._apiEmitter.getHandlers(eventType);
926
+ }
927
+ setAwaitableProvider(domainOrProvider, providerOrUndefined) {
928
+ var _a, _b, _c, _d, _e, _f, _g, _h;
929
+ const domain = stringOrUndefined(domainOrProvider);
930
+ const provider = (_a = objectOrUndefined(domainOrProvider)) != null ? _a : objectOrUndefined(providerOrUndefined);
931
+ if (!provider) {
932
+ this._logger.debug("No provider defined, ignoring setProvider call");
933
+ return;
934
+ }
935
+ const oldProvider = this.getProviderForClient(domain);
936
+ const providerName = provider.metadata.name;
937
+ if (oldProvider === provider) {
938
+ this._logger.debug("Provider is already set, ignoring setProvider call");
939
+ return;
940
+ }
941
+ if (!provider.runsOn) {
942
+ this._logger.debug(`Provider '${provider.metadata.name}' has not defined its intended use.`);
943
+ } else if (provider.runsOn !== this._runsOn) {
944
+ throw new GeneralError(`Provider '${provider.metadata.name}' is intended for use on the ${provider.runsOn}.`);
945
+ }
946
+ const emitters = this.getAssociatedEventEmitters(domain);
947
+ let initializationPromise = void 0;
948
+ const wrappedProvider = new ProviderWrapper(
949
+ provider,
950
+ this._statusEnumType.NOT_READY,
951
+ this._statusEnumType
952
+ );
953
+ if (typeof provider.initialize === "function" && !this.allProviders.includes(provider)) {
954
+ initializationPromise = (_e = (_d = (_c = provider.initialize) == null ? void 0 : _c.call(provider, domain ? (_b = this._domainScopedContext.get(domain)) != null ? _b : this._context : this._context)) == null ? void 0 : _d.then(() => {
955
+ var _a2;
956
+ wrappedProvider.status = this._statusEnumType.READY;
957
+ this.getAssociatedEventEmitters(domain).forEach((emitter) => {
958
+ emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName: domain, domain, providerName });
959
+ });
960
+ (_a2 = this._apiEmitter) == null ? void 0 : _a2.emit("PROVIDER_READY" /* Ready */, { clientName: domain, domain, providerName });
961
+ })) == null ? void 0 : _e.catch((error) => {
962
+ var _a2;
963
+ if ((error == null ? void 0 : error.code) === "PROVIDER_FATAL" /* PROVIDER_FATAL */) {
964
+ wrappedProvider.status = this._statusEnumType.FATAL;
965
+ } else {
966
+ wrappedProvider.status = this._statusEnumType.ERROR;
967
+ }
968
+ this.getAssociatedEventEmitters(domain).forEach((emitter) => {
969
+ emitter == null ? void 0 : emitter.emit("PROVIDER_ERROR" /* Error */, {
970
+ clientName: domain,
971
+ domain,
972
+ providerName,
973
+ message: error == null ? void 0 : error.message
974
+ });
975
+ });
976
+ (_a2 = this._apiEmitter) == null ? void 0 : _a2.emit("PROVIDER_ERROR" /* Error */, {
977
+ clientName: domain,
978
+ domain,
979
+ providerName,
980
+ message: error == null ? void 0 : error.message
981
+ });
982
+ throw error;
983
+ });
984
+ } else {
985
+ wrappedProvider.status = this._statusEnumType.READY;
986
+ emitters.forEach((emitter) => {
987
+ emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName: domain, domain, providerName });
988
+ });
989
+ (_f = this._apiEmitter) == null ? void 0 : _f.emit("PROVIDER_READY" /* Ready */, { clientName: domain, domain, providerName });
990
+ }
991
+ if (domain) {
992
+ this._domainScopedProviders.set(domain, wrappedProvider);
993
+ } else {
994
+ this._defaultProvider = wrappedProvider;
995
+ }
996
+ this.transferListeners(oldProvider, provider, domain, emitters);
997
+ if (!this.allProviders.includes(oldProvider)) {
998
+ (_h = (_g = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _g.call(oldProvider)) == null ? void 0 : _h.catch((err) => {
999
+ this._logger.error(`error closing provider: ${err == null ? void 0 : err.message}, ${err == null ? void 0 : err.stack}`);
1000
+ });
1001
+ }
1002
+ return initializationPromise;
1003
+ }
1004
+ getProviderForClient(domain) {
1005
+ var _a, _b;
1006
+ if (!domain) {
1007
+ return this._defaultProvider.provider;
1008
+ }
1009
+ return (_b = (_a = this._domainScopedProviders.get(domain)) == null ? void 0 : _a.provider) != null ? _b : this._defaultProvider.provider;
1010
+ }
1011
+ buildAndCacheEventEmitterForClient(domain) {
1012
+ const emitter = this._clientEvents.get(domain);
1013
+ if (emitter) {
1014
+ return emitter;
1015
+ }
1016
+ const newEmitter = this._createEventEmitter();
1017
+ this._clientEvents.set(domain, newEmitter);
1018
+ const clientProvider = this.getProviderForClient(domain);
1019
+ Object.values(ClientProviderEvents).forEach(
1020
+ (eventType) => {
1021
+ var _a;
1022
+ return (_a = clientProvider.events) == null ? void 0 : _a.addHandler(eventType, (details) => __async(this, null, function* () {
1023
+ newEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), {
1024
+ clientName: domain,
1025
+ domain,
1026
+ providerName: clientProvider.metadata.name
1027
+ }));
1028
+ }));
1029
+ }
1030
+ );
1031
+ return newEmitter;
1032
+ }
1033
+ getUnboundEmitters() {
1034
+ const domainScopedProviders = [...this._domainScopedProviders.keys()];
1035
+ const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined);
1036
+ const unboundEmitterNames = eventEmitterNames.filter((name) => !domainScopedProviders.includes(name));
1037
+ return [
1038
+ // all unbound, named emitters
1039
+ ...unboundEmitterNames.map((name) => this._clientEvents.get(name)),
1040
+ // the default emitter
1041
+ this._clientEvents.get(void 0)
1042
+ ].filter(isDefined);
1043
+ }
1044
+ getAssociatedEventEmitters(domain) {
1045
+ return domain ? [this.buildAndCacheEventEmitterForClient(domain)] : this.getUnboundEmitters();
1046
+ }
1047
+ transferListeners(oldProvider, newProvider, domain, emitters) {
1048
+ var _a;
1049
+ (_a = this._clientEventHandlers.get(domain)) == null ? void 0 : _a.forEach((eventHandler) => {
1050
+ var _a2;
1051
+ return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler);
1052
+ });
1053
+ const newClientHandlers = Object.values(ClientProviderEvents).map((eventType) => {
1054
+ const handler = (details) => __async(this, null, function* () {
1055
+ emitters.forEach((emitter) => {
1056
+ emitter == null ? void 0 : emitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName: domain, domain, providerName: newProvider.metadata.name }));
1057
+ });
1058
+ this._apiEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), {
1059
+ clientName: domain,
1060
+ domain,
1061
+ providerName: newProvider.metadata.name
1062
+ }));
1063
+ });
1064
+ return [eventType, handler];
1065
+ });
1066
+ this._clientEventHandlers.set(domain, newClientHandlers);
1067
+ newClientHandlers.forEach((eventHandler) => {
1068
+ var _a2;
1069
+ return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(...eventHandler);
1070
+ });
1071
+ }
1072
+ close() {
1073
+ return __async(this, null, function* () {
1074
+ var _a, _b;
1075
+ try {
1076
+ yield (_b = (_a = this == null ? void 0 : this._defaultProvider.provider) == null ? void 0 : _a.onClose) == null ? void 0 : _b.call(_a);
1077
+ } catch (err) {
1078
+ this.handleShutdownError(this._defaultProvider.provider, err);
1079
+ }
1080
+ const wrappers = Array.from(this._domainScopedProviders);
1081
+ yield Promise.all(
1082
+ wrappers.map((_0) => __async(this, [_0], function* ([, wrapper]) {
1083
+ var _a2, _b2;
1084
+ try {
1085
+ yield (_b2 = wrapper == null ? void 0 : (_a2 = wrapper.provider).onClose) == null ? void 0 : _b2.call(_a2);
1086
+ } catch (err) {
1087
+ this.handleShutdownError(wrapper == null ? void 0 : wrapper.provider, err);
1088
+ }
1089
+ }))
1090
+ );
1091
+ });
1092
+ }
1093
+ clearProvidersAndSetDefault(defaultProvider) {
1094
+ return __async(this, null, function* () {
1095
+ try {
1096
+ yield this.close();
1097
+ } catch (err) {
1098
+ this._logger.error("Unable to cleanly close providers. Resetting to the default configuration.");
1099
+ } finally {
1100
+ this._domainScopedProviders.clear();
1101
+ this._defaultProvider = new ProviderWrapper(
1102
+ defaultProvider,
1103
+ this._statusEnumType.NOT_READY,
1104
+ this._statusEnumType
1105
+ );
1106
+ }
1107
+ });
1108
+ }
1109
+ get allProviders() {
1110
+ return [
1111
+ ...[...this._domainScopedProviders.values()].map((wrappers) => wrappers.provider),
1112
+ this._defaultProvider.provider
1113
+ ];
1114
+ }
1115
+ handleShutdownError(provider, err) {
1116
+ this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);
1117
+ this._logger.error(err == null ? void 0 : err.stack);
1118
+ }
1119
+ };
1120
+
1121
+ // src/provider/no-op-provider.ts
1122
+ var REASON_NO_OP = "No-op";
1123
+ var NoopFeatureProvider = class {
1124
+ constructor() {
1125
+ this.metadata = {
1126
+ name: "No-op Provider"
1127
+ };
1128
+ }
1129
+ resolveBooleanEvaluation(_, defaultValue) {
1130
+ return this.noOp(defaultValue);
1131
+ }
1132
+ resolveStringEvaluation(_, defaultValue) {
1133
+ return this.noOp(defaultValue);
1134
+ }
1135
+ resolveNumberEvaluation(_, defaultValue) {
1136
+ return this.noOp(defaultValue);
1137
+ }
1138
+ resolveObjectEvaluation(_, defaultValue) {
1139
+ return this.noOp(defaultValue);
1140
+ }
1141
+ noOp(defaultValue) {
1142
+ return {
1143
+ value: defaultValue,
1144
+ reason: REASON_NO_OP
1145
+ };
1146
+ }
1147
+ };
1148
+ var NOOP_PROVIDER = new NoopFeatureProvider();
1149
+
1150
+ // ../../node_modules/eventemitter3/index.mjs
1151
+ var import_index = __toESM(require_eventemitter3(), 1);
1152
+
1153
+ // src/events/open-feature-event-emitter.ts
1154
+ var OpenFeatureEventEmitter = class extends GenericEventEmitter {
1155
+ constructor() {
1156
+ super();
1157
+ this.eventEmitter = new import_index.default();
1158
+ }
1159
+ };
1160
+
1161
+ // src/provider/in-memory-provider/variant-not-found-error.ts
1162
+ var VariantNotFoundError = class _VariantNotFoundError extends OpenFeatureError {
1163
+ constructor(message) {
1164
+ super(message);
1165
+ Object.setPrototypeOf(this, _VariantNotFoundError.prototype);
1166
+ this.name = "VariantNotFoundError";
1167
+ this.code = "GENERAL" /* GENERAL */;
1168
+ }
1169
+ };
1170
+
1171
+ // src/provider/in-memory-provider/in-memory-provider.ts
1172
+ var InMemoryProvider = class {
1173
+ constructor(flagConfiguration = {}) {
1174
+ this.events = new OpenFeatureEventEmitter();
1175
+ this.runsOn = "client";
1176
+ this.metadata = {
1177
+ name: "in-memory"
1178
+ };
1179
+ this._flagConfiguration = __spreadValues({}, flagConfiguration);
1180
+ }
1181
+ /**
1182
+ * Overwrites the configured flags.
1183
+ * @param { FlagConfiguration } flagConfiguration new flag configuration
1184
+ */
1185
+ putConfiguration(flagConfiguration) {
1186
+ return __async(this, null, function* () {
1187
+ try {
1188
+ const flagsChanged = Object.entries(__spreadValues(__spreadValues({}, flagConfiguration), this._flagConfiguration)).map(([key]) => key);
1189
+ this._flagConfiguration = __spreadValues({}, flagConfiguration);
1190
+ this.events.emit("PROVIDER_CONFIGURATION_CHANGED" /* ConfigurationChanged */, { flagsChanged });
1191
+ } catch (err) {
1192
+ this.events.emit("PROVIDER_ERROR" /* Error */);
1193
+ throw err;
1194
+ }
1195
+ });
1196
+ }
1197
+ resolveBooleanEvaluation(flagKey, defaultValue, context, logger) {
1198
+ return this.resolveAndCheckFlag(flagKey, defaultValue, context || this._context, logger);
1199
+ }
1200
+ resolveNumberEvaluation(flagKey, defaultValue, context, logger) {
1201
+ return this.resolveAndCheckFlag(flagKey, defaultValue, context || this._context, logger);
1202
+ }
1203
+ resolveStringEvaluation(flagKey, defaultValue, context, logger) {
1204
+ return this.resolveAndCheckFlag(flagKey, defaultValue, context || this._context, logger);
1205
+ }
1206
+ resolveObjectEvaluation(flagKey, defaultValue, context, logger) {
1207
+ return this.resolveAndCheckFlag(flagKey, defaultValue, context || this._context, logger);
1208
+ }
1209
+ resolveAndCheckFlag(flagKey, defaultValue, context, logger) {
1210
+ if (!(flagKey in this._flagConfiguration)) {
1211
+ const message = `no flag found with key ${flagKey}`;
1212
+ logger == null ? void 0 : logger.debug(message);
1213
+ throw new FlagNotFoundError(message);
1214
+ }
1215
+ if (this._flagConfiguration[flagKey].disabled) {
1216
+ return { value: defaultValue, reason: StandardResolutionReasons.DISABLED };
1217
+ }
1218
+ const resolvedFlag = this.resolveFlagWithReason(flagKey, context);
1219
+ if (resolvedFlag.value === void 0) {
1220
+ const message = `no value associated with variant provided for ${flagKey} found`;
1221
+ logger == null ? void 0 : logger.error(message);
1222
+ throw new VariantNotFoundError(message);
1223
+ }
1224
+ if (typeof resolvedFlag.value != typeof defaultValue) {
1225
+ throw new TypeMismatchError();
1226
+ }
1227
+ return resolvedFlag;
1228
+ }
1229
+ resolveFlagWithReason(flagKey, ctx) {
1230
+ try {
1231
+ const resolutionResult = this.lookupFlagValue(flagKey, ctx);
1232
+ return resolutionResult;
1233
+ } catch (error) {
1234
+ if (!(error instanceof OpenFeatureError)) {
1235
+ throw new GeneralError((error == null ? void 0 : error.message) || "unknown error");
1236
+ }
1237
+ throw error;
1238
+ }
1239
+ }
1240
+ lookupFlagValue(flagKey, ctx) {
1241
+ var _a;
1242
+ const flagSpec = this._flagConfiguration[flagKey];
1243
+ const isContextEval = ctx && (flagSpec == null ? void 0 : flagSpec.contextEvaluator);
1244
+ const variant = isContextEval ? (_a = flagSpec.contextEvaluator) == null ? void 0 : _a.call(flagSpec, ctx) : flagSpec.defaultVariant;
1245
+ const value = variant && (flagSpec == null ? void 0 : flagSpec.variants[variant]);
1246
+ const reason = isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC;
1247
+ return __spreadProps(__spreadValues({
1248
+ value
1249
+ }, variant && { variant }), {
1250
+ reason
1251
+ });
1252
+ }
1253
+ };
1254
+
1255
+ // src/client/internal/open-feature-client.ts
1256
+ var OpenFeatureClient = class {
1257
+ constructor(providerAccessor, providerStatusAccessor, emitterAccessor, apiContextAccessor, apiHooksAccessor, globalLogger, options) {
1258
+ this.providerAccessor = providerAccessor;
1259
+ this.providerStatusAccessor = providerStatusAccessor;
1260
+ this.emitterAccessor = emitterAccessor;
1261
+ this.apiContextAccessor = apiContextAccessor;
1262
+ this.apiHooksAccessor = apiHooksAccessor;
1263
+ this.globalLogger = globalLogger;
1264
+ this.options = options;
1265
+ this._hooks = [];
1266
+ }
1267
+ get metadata() {
1268
+ var _a, _b;
1269
+ return {
1270
+ // Use domain if name is not provided
1271
+ name: (_a = this.options.domain) != null ? _a : this.options.name,
1272
+ domain: (_b = this.options.domain) != null ? _b : this.options.name,
1273
+ version: this.options.version,
1274
+ providerMetadata: this.providerAccessor().metadata
1275
+ };
1276
+ }
1277
+ get providerStatus() {
1278
+ return this.providerStatusAccessor();
1279
+ }
1280
+ addHandler(eventType, handler, options) {
1281
+ var _a;
1282
+ this.emitterAccessor().addHandler(eventType, handler);
1283
+ const shouldRunNow = statusMatchesEvent(eventType, this.providerStatus);
1284
+ if (shouldRunNow) {
1285
+ try {
1286
+ handler({
1287
+ clientName: this.metadata.name,
1288
+ domain: this.metadata.domain,
1289
+ providerName: this._provider.metadata.name
1290
+ });
1291
+ } catch (err) {
1292
+ (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
1293
+ }
1294
+ }
1295
+ if ((options == null ? void 0 : options.signal) && typeof options.signal.addEventListener === "function") {
1296
+ options.signal.addEventListener("abort", () => {
1297
+ this.removeHandler(eventType, handler);
1298
+ });
1299
+ }
1300
+ }
1301
+ removeHandler(notificationType, handler) {
1302
+ this.emitterAccessor().removeHandler(notificationType, handler);
1303
+ }
1304
+ getHandlers(eventType) {
1305
+ return this.emitterAccessor().getHandlers(eventType);
1306
+ }
1307
+ setLogger(logger) {
1308
+ this._clientLogger = new SafeLogger(logger);
1309
+ return this;
1310
+ }
1311
+ addHooks(...hooks) {
1312
+ this._hooks = [...this._hooks, ...hooks];
1313
+ return this;
1314
+ }
1315
+ getHooks() {
1316
+ return this._hooks;
1317
+ }
1318
+ clearHooks() {
1319
+ this._hooks = [];
1320
+ return this;
1321
+ }
1322
+ getBooleanValue(flagKey, defaultValue, options) {
1323
+ return this.getBooleanDetails(flagKey, defaultValue, options).value;
1324
+ }
1325
+ getBooleanDetails(flagKey, defaultValue, options) {
1326
+ return this.evaluate(flagKey, this._provider.resolveBooleanEvaluation, defaultValue, "boolean", options);
1327
+ }
1328
+ getStringValue(flagKey, defaultValue, options) {
1329
+ return this.getStringDetails(flagKey, defaultValue, options).value;
1330
+ }
1331
+ getStringDetails(flagKey, defaultValue, options) {
1332
+ return this.evaluate(
1333
+ flagKey,
1334
+ // this isolates providers from our restricted string generic argument.
1335
+ this._provider.resolveStringEvaluation,
1336
+ defaultValue,
1337
+ "string",
1338
+ options
1339
+ );
1340
+ }
1341
+ getNumberValue(flagKey, defaultValue, options) {
1342
+ return this.getNumberDetails(flagKey, defaultValue, options).value;
1343
+ }
1344
+ getNumberDetails(flagKey, defaultValue, options) {
1345
+ return this.evaluate(
1346
+ flagKey,
1347
+ // this isolates providers from our restricted number generic argument.
1348
+ this._provider.resolveNumberEvaluation,
1349
+ defaultValue,
1350
+ "number",
1351
+ options
1352
+ );
1353
+ }
1354
+ getObjectValue(flagKey, defaultValue, options) {
1355
+ return this.getObjectDetails(flagKey, defaultValue, options).value;
1356
+ }
1357
+ getObjectDetails(flagKey, defaultValue, options) {
1358
+ return this.evaluate(flagKey, this._provider.resolveObjectEvaluation, defaultValue, "object", options);
1359
+ }
1360
+ track(occurrenceKey, occurrenceDetails = {}) {
1361
+ var _a, _b, _c;
1362
+ try {
1363
+ this.shortCircuitIfNotReady();
1364
+ if (typeof this._provider.track === "function") {
1365
+ const frozenContext = Object.freeze(__spreadValues({}, this.apiContextAccessor((_a = this == null ? void 0 : this.options) == null ? void 0 : _a.domain)));
1366
+ return (_c = (_b = this._provider).track) == null ? void 0 : _c.call(_b, occurrenceKey, frozenContext, occurrenceDetails);
1367
+ } else {
1368
+ this._logger.debug("Provider does not support the track function; will no-op.");
1369
+ }
1370
+ } catch (err) {
1371
+ this._logger.debug("Error recording tracking event.", err);
1372
+ }
1373
+ }
1374
+ evaluate(flagKey, resolver, defaultValue, flagType, options = {}) {
1375
+ var _a, _b;
1376
+ const allHooks = [
1377
+ ...this.apiHooksAccessor(),
1378
+ ...this.getHooks(),
1379
+ ...options.hooks || [],
1380
+ ...this._provider.hooks || []
1381
+ ];
1382
+ const allHooksReversed = [...allHooks].reverse();
1383
+ const context = __spreadValues({}, this.apiContextAccessor((_a = this == null ? void 0 : this.options) == null ? void 0 : _a.domain));
1384
+ const hookContexts = allHooksReversed.map(
1385
+ () => Object.freeze({
1386
+ flagKey,
1387
+ defaultValue,
1388
+ flagValueType: flagType,
1389
+ clientMetadata: this.metadata,
1390
+ providerMetadata: this._provider.metadata,
1391
+ context,
1392
+ logger: this._logger,
1393
+ hookData: new MapHookData()
1394
+ })
1395
+ );
1396
+ let evaluationDetails;
1397
+ try {
1398
+ this.beforeHooks(allHooks, hookContexts, options);
1399
+ this.shortCircuitIfNotReady();
1400
+ const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);
1401
+ const resolutionDetails = __spreadProps(__spreadValues({}, resolution), {
1402
+ flagMetadata: Object.freeze((_b = resolution.flagMetadata) != null ? _b : {}),
1403
+ flagKey
1404
+ });
1405
+ if (resolutionDetails.errorCode) {
1406
+ const err = instantiateErrorByErrorCode(resolutionDetails.errorCode, resolutionDetails.errorMessage);
1407
+ this.errorHooks(allHooksReversed, hookContexts, err, options);
1408
+ evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err, resolutionDetails.flagMetadata);
1409
+ } else {
1410
+ this.afterHooks(allHooksReversed, hookContexts, resolutionDetails, options);
1411
+ evaluationDetails = resolutionDetails;
1412
+ }
1413
+ } catch (err) {
1414
+ this.errorHooks(allHooksReversed, hookContexts, err, options);
1415
+ evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err);
1416
+ }
1417
+ this.finallyHooks(allHooksReversed, hookContexts, evaluationDetails, options);
1418
+ return evaluationDetails;
1419
+ }
1420
+ beforeHooks(hooks, hookContexts, options) {
1421
+ var _a;
1422
+ for (const [index, hook] of hooks.entries()) {
1423
+ const hookContextIndex = hooks.length - 1 - index;
1424
+ const hookContext = hookContexts[hookContextIndex];
1425
+ Object.freeze(hookContext);
1426
+ Object.freeze(hookContext.context);
1427
+ (_a = hook == null ? void 0 : hook.before) == null ? void 0 : _a.call(hook, hookContext, Object.freeze(options.hookHints));
1428
+ }
1429
+ }
1430
+ afterHooks(hooks, hookContexts, evaluationDetails, options) {
1431
+ var _a;
1432
+ for (const [index, hook] of hooks.entries()) {
1433
+ const hookContext = hookContexts[index];
1434
+ (_a = hook == null ? void 0 : hook.after) == null ? void 0 : _a.call(hook, hookContext, evaluationDetails, options.hookHints);
1435
+ }
1436
+ }
1437
+ errorHooks(hooks, hookContexts, err, options) {
1438
+ var _a;
1439
+ for (const [index, hook] of hooks.entries()) {
1440
+ try {
1441
+ const hookContext = hookContexts[index];
1442
+ (_a = hook == null ? void 0 : hook.error) == null ? void 0 : _a.call(hook, hookContext, err, options.hookHints);
1443
+ } catch (err2) {
1444
+ this._logger.error(`Unhandled error during 'error' hook: ${err2}`);
1445
+ if (err2 instanceof Error) {
1446
+ this._logger.error(err2.stack);
1447
+ }
1448
+ this._logger.error(err2 == null ? void 0 : err2.stack);
1449
+ }
1450
+ }
1451
+ }
1452
+ finallyHooks(hooks, hookContexts, evaluationDetails, options) {
1453
+ var _a;
1454
+ for (const [index, hook] of hooks.entries()) {
1455
+ try {
1456
+ const hookContext = hookContexts[index];
1457
+ (_a = hook == null ? void 0 : hook.finally) == null ? void 0 : _a.call(hook, hookContext, evaluationDetails, options.hookHints);
1458
+ } catch (err) {
1459
+ this._logger.error(`Unhandled error during 'finally' hook: ${err}`);
1460
+ if (err instanceof Error) {
1461
+ this._logger.error(err.stack);
1462
+ }
1463
+ this._logger.error(err == null ? void 0 : err.stack);
1464
+ }
1465
+ }
1466
+ }
1467
+ get _provider() {
1468
+ return this.providerAccessor();
1469
+ }
1470
+ get _logger() {
1471
+ return this._clientLogger || this.globalLogger();
1472
+ }
1473
+ shortCircuitIfNotReady() {
1474
+ if (this.providerStatus === "NOT_READY" /* NOT_READY */) {
1475
+ throw new ProviderNotReadyError("provider has not yet initialized");
1476
+ } else if (this.providerStatus === "FATAL" /* FATAL */) {
1477
+ throw new ProviderFatalError("provider is in an irrecoverable error state");
1478
+ }
1479
+ }
1480
+ getErrorEvaluationDetails(flagKey, defaultValue, err, flagMetadata = {}) {
1481
+ const errorMessage = err == null ? void 0 : err.message;
1482
+ const errorCode = (err == null ? void 0 : err.code) || "GENERAL" /* GENERAL */;
1483
+ return {
1484
+ errorCode,
1485
+ errorMessage,
1486
+ value: defaultValue,
1487
+ reason: StandardResolutionReasons.ERROR,
1488
+ flagMetadata: Object.freeze(flagMetadata),
1489
+ flagKey
1490
+ };
1491
+ }
1492
+ };
1493
+
1494
+ // src/open-feature.ts
1495
+ var GLOBAL_OPENFEATURE_API_KEY = Symbol.for("@openfeature/web-sdk/api");
1496
+ var _globalThis = globalThis;
1497
+ var OpenFeatureAPI = class _OpenFeatureAPI extends OpenFeatureCommonAPI {
1498
+ constructor() {
1499
+ super("client");
1500
+ this._statusEnumType = ClientProviderStatus;
1501
+ this._apiEmitter = new OpenFeatureEventEmitter();
1502
+ this._defaultProvider = new ProviderWrapper(
1503
+ NOOP_PROVIDER,
1504
+ "NOT_READY" /* NOT_READY */,
1505
+ this._statusEnumType
1506
+ );
1507
+ this._domainScopedProviders = /* @__PURE__ */ new Map();
1508
+ this._createEventEmitter = () => new OpenFeatureEventEmitter();
1509
+ }
1510
+ /**
1511
+ * Gets a singleton instance of the OpenFeature API.
1512
+ * @ignore
1513
+ * @returns {OpenFeatureAPI} OpenFeature API
1514
+ */
1515
+ static getInstance() {
1516
+ const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];
1517
+ if (globalApi) {
1518
+ return globalApi;
1519
+ }
1520
+ const instance = new _OpenFeatureAPI();
1521
+ _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;
1522
+ return instance;
1523
+ }
1524
+ getProviderStatus(domain) {
1525
+ var _a, _b;
1526
+ if (!domain) {
1527
+ return this._defaultProvider.status;
1528
+ }
1529
+ return (_b = (_a = this._domainScopedProviders.get(domain)) == null ? void 0 : _a.status) != null ? _b : this._defaultProvider.status;
1530
+ }
1531
+ setProviderAndWait(clientOrProvider, providerContextOrUndefined, contextOrUndefined) {
1532
+ return __async(this, null, function* () {
1533
+ const domain = stringOrUndefined(clientOrProvider);
1534
+ const provider = domain ? objectOrUndefined(providerContextOrUndefined) : objectOrUndefined(clientOrProvider);
1535
+ const context = domain ? objectOrUndefined(contextOrUndefined) : objectOrUndefined(providerContextOrUndefined);
1536
+ if (context) {
1537
+ if (domain) {
1538
+ this._domainScopedContext.set(domain, context);
1539
+ } else {
1540
+ this._context = context;
1541
+ }
1542
+ }
1543
+ yield this.setAwaitableProvider(domain, provider);
1544
+ });
1545
+ }
1546
+ setProvider(domainOrProvider, providerContextOrUndefined, contextOrUndefined) {
1547
+ const domain = stringOrUndefined(domainOrProvider);
1548
+ const provider = domain ? objectOrUndefined(providerContextOrUndefined) : objectOrUndefined(domainOrProvider);
1549
+ const context = domain ? objectOrUndefined(contextOrUndefined) : objectOrUndefined(providerContextOrUndefined);
1550
+ if (context) {
1551
+ if (domain) {
1552
+ this._domainScopedContext.set(domain, context);
1553
+ } else {
1554
+ this._context = context;
1555
+ }
1556
+ }
1557
+ const maybePromise = this.setAwaitableProvider(domain, provider);
1558
+ Promise.resolve(maybePromise).catch((err) => {
1559
+ this._logger.error("Error during provider initialization:", err);
1560
+ });
1561
+ return this;
1562
+ }
1563
+ getProvider(domain) {
1564
+ return this.getProviderForClient(domain);
1565
+ }
1566
+ setContext(domainOrContext, contextOrUndefined) {
1567
+ return __async(this, null, function* () {
1568
+ var _a, _b;
1569
+ const domain = stringOrUndefined(domainOrContext);
1570
+ const context = (_b = (_a = objectOrUndefined(domainOrContext)) != null ? _a : objectOrUndefined(contextOrUndefined)) != null ? _b : {};
1571
+ if (domain) {
1572
+ const wrapper = this._domainScopedProviders.get(domain);
1573
+ if (wrapper) {
1574
+ const oldContext = this.getContext(domain);
1575
+ this._domainScopedContext.set(domain, context);
1576
+ yield this.runProviderContextChangeHandler(domain, wrapper, oldContext, context);
1577
+ } else {
1578
+ this._domainScopedContext.set(domain, context);
1579
+ }
1580
+ } else {
1581
+ const oldContext = this._context;
1582
+ this._context = context;
1583
+ const unboundProviders = Array.from(this._domainScopedProviders.entries()).filter(([domain2]) => !this._domainScopedContext.has(domain2)).reduce((acc, [domain2, wrapper]) => {
1584
+ acc.push({ domain: domain2, wrapper });
1585
+ return acc;
1586
+ }, []);
1587
+ const allDomainRecords = [
1588
+ // add in the default (no domain)
1589
+ { domain: void 0, wrapper: this._defaultProvider },
1590
+ ...unboundProviders
1591
+ ];
1592
+ yield Promise.all(
1593
+ allDomainRecords.map((dm) => this.runProviderContextChangeHandler(dm.domain, dm.wrapper, oldContext, context))
1594
+ );
1595
+ }
1596
+ });
1597
+ }
1598
+ getContext(domainOrUndefined) {
1599
+ const domain = stringOrUndefined(domainOrUndefined);
1600
+ if (domain) {
1601
+ const context = this._domainScopedContext.get(domain);
1602
+ if (context) {
1603
+ return context;
1604
+ } else {
1605
+ this._logger.debug(`Unable to find context for '${domain}'.`);
1606
+ }
1607
+ }
1608
+ return this._context;
1609
+ }
1610
+ clearContext(domainOrUndefined) {
1611
+ return __async(this, null, function* () {
1612
+ const domain = stringOrUndefined(domainOrUndefined);
1613
+ if (domain) {
1614
+ const wrapper = this._domainScopedProviders.get(domain);
1615
+ if (wrapper) {
1616
+ const oldContext = this.getContext(domain);
1617
+ this._domainScopedContext.delete(domain);
1618
+ const newContext = this.getContext();
1619
+ yield this.runProviderContextChangeHandler(domain, wrapper, oldContext, newContext);
1620
+ } else {
1621
+ this._domainScopedContext.delete(domain);
1622
+ }
1623
+ } else {
1624
+ return this.setContext({});
1625
+ }
1626
+ });
1627
+ }
1628
+ /**
1629
+ * Resets the global evaluation context and removes the evaluation context for
1630
+ * all domains.
1631
+ */
1632
+ clearContexts() {
1633
+ return __async(this, null, function* () {
1634
+ yield this.clearContext();
1635
+ yield Promise.allSettled(Array.from(this._domainScopedProviders.keys()).map((domain) => this.clearContext(domain)));
1636
+ });
1637
+ }
1638
+ /**
1639
+ * A factory function for creating new domain-scoped OpenFeature clients. Clients
1640
+ * can contain their own state (e.g. logger, hook, context). Multiple domains
1641
+ * can be used to segment feature flag configuration.
1642
+ *
1643
+ * If there is already a provider bound to this name via {@link this.setProvider setProvider}, this provider will be used.
1644
+ * Otherwise, the default provider is used until a provider is assigned to that name.
1645
+ * @param {string} domain An identifier which logically binds clients with providers
1646
+ * @param {string} version The version of the client (only used for metadata)
1647
+ * @returns {Client} OpenFeature Client
1648
+ */
1649
+ getClient(domain, version) {
1650
+ return new OpenFeatureClient(
1651
+ // functions are passed here to make sure that these values are always up to date,
1652
+ // and so we don't have to make these public properties on the API class.
1653
+ () => this.getProviderForClient(domain),
1654
+ () => this.getProviderStatus(domain),
1655
+ () => this.buildAndCacheEventEmitterForClient(domain),
1656
+ (domain2) => this.getContext(domain2),
1657
+ () => this.getHooks(),
1658
+ () => this._logger,
1659
+ { domain, version }
1660
+ );
1661
+ }
1662
+ /**
1663
+ * Clears all registered providers and resets the default provider.
1664
+ * @returns {Promise<void>}
1665
+ */
1666
+ clearProviders() {
1667
+ return __async(this, null, function* () {
1668
+ yield __superGet(_OpenFeatureAPI.prototype, this, "clearProvidersAndSetDefault").call(this, NOOP_PROVIDER);
1669
+ this._domainScopedContext.clear();
1670
+ });
1671
+ }
1672
+ runProviderContextChangeHandler(domain, wrapper, oldContext, newContext) {
1673
+ return __async(this, null, function* () {
1674
+ var _a, _b, _c, _d, _e, _f;
1675
+ const providerName = ((_b = (_a = wrapper.provider) == null ? void 0 : _a.metadata) == null ? void 0 : _b.name) || "unnamed-provider";
1676
+ try {
1677
+ if (typeof wrapper.provider.onContextChange === "function") {
1678
+ const maybePromise = wrapper.provider.onContextChange(oldContext, newContext);
1679
+ if (typeof (maybePromise == null ? void 0 : maybePromise.then) === "function") {
1680
+ wrapper.incrementPendingContextChanges();
1681
+ wrapper.status = this._statusEnumType.RECONCILING;
1682
+ this.getAssociatedEventEmitters(domain).forEach((emitter) => {
1683
+ emitter == null ? void 0 : emitter.emit("PROVIDER_RECONCILING" /* Reconciling */, { domain, providerName });
1684
+ });
1685
+ (_c = this._apiEmitter) == null ? void 0 : _c.emit("PROVIDER_RECONCILING" /* Reconciling */, { domain, providerName });
1686
+ yield maybePromise;
1687
+ wrapper.decrementPendingContextChanges();
1688
+ }
1689
+ }
1690
+ wrapper.status = this._statusEnumType.READY;
1691
+ if (wrapper.allContextChangesSettled) {
1692
+ this.getAssociatedEventEmitters(domain).forEach((emitter) => {
1693
+ emitter == null ? void 0 : emitter.emit("PROVIDER_CONTEXT_CHANGED" /* ContextChanged */, { clientName: domain, domain, providerName });
1694
+ });
1695
+ (_d = this._apiEmitter) == null ? void 0 : _d.emit("PROVIDER_CONTEXT_CHANGED" /* ContextChanged */, { clientName: domain, domain, providerName });
1696
+ }
1697
+ } catch (err) {
1698
+ wrapper.decrementPendingContextChanges();
1699
+ wrapper.status = this._statusEnumType.ERROR;
1700
+ if (wrapper.allContextChangesSettled) {
1701
+ const error = err;
1702
+ const message = `Error running ${providerName}'s context change handler: ${error == null ? void 0 : error.message}`;
1703
+ (_e = this._logger) == null ? void 0 : _e.error(`${message}`, err);
1704
+ this.getAssociatedEventEmitters(domain).forEach((emitter) => {
1705
+ emitter == null ? void 0 : emitter.emit("PROVIDER_ERROR" /* Error */, { clientName: domain, domain, providerName, message });
1706
+ });
1707
+ (_f = this._apiEmitter) == null ? void 0 : _f.emit("PROVIDER_ERROR" /* Error */, { clientName: domain, domain, providerName, message });
1708
+ }
1709
+ }
1710
+ });
1711
+ }
1712
+ };
1713
+ var OpenFeature = OpenFeatureAPI.getInstance();
1714
+ return __toCommonJS(index_exports);
1715
+ })();