@openfeature/web-sdk 0.4.13 → 0.4.15

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/dist/cjs/index.js CHANGED
@@ -31,374 +31,184 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
31
31
  ));
32
32
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
33
33
 
34
- // ../../node_modules/events/events.js
35
- var require_events = __commonJS({
36
- "../../node_modules/events/events.js"(exports, module2) {
34
+ // ../../node_modules/eventemitter3/index.js
35
+ var require_eventemitter3 = __commonJS({
36
+ "../../node_modules/eventemitter3/index.js"(exports, module2) {
37
37
  "use strict";
38
- var R = typeof Reflect === "object" ? Reflect : null;
39
- var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) {
40
- return Function.prototype.apply.call(target, receiver, args);
41
- };
42
- var ReflectOwnKeys;
43
- if (R && typeof R.ownKeys === "function") {
44
- ReflectOwnKeys = R.ownKeys;
45
- } else if (Object.getOwnPropertySymbols) {
46
- ReflectOwnKeys = function ReflectOwnKeys2(target) {
47
- return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));
48
- };
49
- } else {
50
- ReflectOwnKeys = function ReflectOwnKeys2(target) {
51
- return Object.getOwnPropertyNames(target);
52
- };
53
- }
54
- function ProcessEmitWarning(warning) {
55
- if (console && console.warn)
56
- console.warn(warning);
38
+ var has = Object.prototype.hasOwnProperty;
39
+ var prefix = "~";
40
+ function Events() {
41
+ }
42
+ if (Object.create) {
43
+ Events.prototype = /* @__PURE__ */ Object.create(null);
44
+ if (!new Events().__proto__)
45
+ prefix = false;
46
+ }
47
+ function EE(fn, context, once) {
48
+ this.fn = fn;
49
+ this.context = context;
50
+ this.once = once || false;
51
+ }
52
+ function addListener(emitter, event, fn, context, once) {
53
+ if (typeof fn !== "function") {
54
+ throw new TypeError("The listener must be a function");
55
+ }
56
+ var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
57
+ if (!emitter._events[evt])
58
+ emitter._events[evt] = listener, emitter._eventsCount++;
59
+ else if (!emitter._events[evt].fn)
60
+ emitter._events[evt].push(listener);
61
+ else
62
+ emitter._events[evt] = [emitter._events[evt], listener];
63
+ return emitter;
64
+ }
65
+ function clearEvent(emitter, evt) {
66
+ if (--emitter._eventsCount === 0)
67
+ emitter._events = new Events();
68
+ else
69
+ delete emitter._events[evt];
57
70
  }
58
- var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) {
59
- return value !== value;
60
- };
61
71
  function EventEmitter2() {
62
- EventEmitter2.init.call(this);
72
+ this._events = new Events();
73
+ this._eventsCount = 0;
63
74
  }
64
- module2.exports = EventEmitter2;
65
- module2.exports.once = once;
66
- EventEmitter2.EventEmitter = EventEmitter2;
67
- EventEmitter2.prototype._events = void 0;
68
- EventEmitter2.prototype._eventsCount = 0;
69
- EventEmitter2.prototype._maxListeners = void 0;
70
- var defaultMaxListeners = 10;
71
- function checkListener(listener) {
72
- if (typeof listener !== "function") {
73
- throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
74
- }
75
- }
76
- Object.defineProperty(EventEmitter2, "defaultMaxListeners", {
77
- enumerable: true,
78
- get: function() {
79
- return defaultMaxListeners;
80
- },
81
- set: function(arg) {
82
- if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) {
83
- throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + ".");
84
- }
85
- defaultMaxListeners = arg;
75
+ EventEmitter2.prototype.eventNames = function eventNames() {
76
+ var names = [], events, name;
77
+ if (this._eventsCount === 0)
78
+ return names;
79
+ for (name in events = this._events) {
80
+ if (has.call(events, name))
81
+ names.push(prefix ? name.slice(1) : name);
86
82
  }
87
- });
88
- EventEmitter2.init = function() {
89
- if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) {
90
- this._events = /* @__PURE__ */ Object.create(null);
91
- this._eventsCount = 0;
83
+ if (Object.getOwnPropertySymbols) {
84
+ return names.concat(Object.getOwnPropertySymbols(events));
92
85
  }
93
- this._maxListeners = this._maxListeners || void 0;
86
+ return names;
94
87
  };
95
- EventEmitter2.prototype.setMaxListeners = function setMaxListeners(n) {
96
- if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) {
97
- throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + ".");
88
+ EventEmitter2.prototype.listeners = function listeners(event) {
89
+ var evt = prefix ? prefix + event : event, handlers = this._events[evt];
90
+ if (!handlers)
91
+ return [];
92
+ if (handlers.fn)
93
+ return [handlers.fn];
94
+ for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
95
+ ee[i] = handlers[i].fn;
98
96
  }
99
- this._maxListeners = n;
100
- return this;
97
+ return ee;
101
98
  };
102
- function _getMaxListeners(that) {
103
- if (that._maxListeners === void 0)
104
- return EventEmitter2.defaultMaxListeners;
105
- return that._maxListeners;
106
- }
107
- EventEmitter2.prototype.getMaxListeners = function getMaxListeners() {
108
- return _getMaxListeners(this);
99
+ EventEmitter2.prototype.listenerCount = function listenerCount(event) {
100
+ var evt = prefix ? prefix + event : event, listeners = this._events[evt];
101
+ if (!listeners)
102
+ return 0;
103
+ if (listeners.fn)
104
+ return 1;
105
+ return listeners.length;
109
106
  };
110
- EventEmitter2.prototype.emit = function emit(type) {
111
- var args = [];
112
- for (var i = 1; i < arguments.length; i++)
113
- args.push(arguments[i]);
114
- var doError = type === "error";
115
- var events = this._events;
116
- if (events !== void 0)
117
- doError = doError && events.error === void 0;
118
- else if (!doError)
107
+ EventEmitter2.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
108
+ var evt = prefix ? prefix + event : event;
109
+ if (!this._events[evt])
119
110
  return false;
120
- if (doError) {
121
- var er;
122
- if (args.length > 0)
123
- er = args[0];
124
- if (er instanceof Error) {
125
- throw er;
111
+ var listeners = this._events[evt], len = arguments.length, args, i;
112
+ if (listeners.fn) {
113
+ if (listeners.once)
114
+ this.removeListener(event, listeners.fn, void 0, true);
115
+ switch (len) {
116
+ case 1:
117
+ return listeners.fn.call(listeners.context), true;
118
+ case 2:
119
+ return listeners.fn.call(listeners.context, a1), true;
120
+ case 3:
121
+ return listeners.fn.call(listeners.context, a1, a2), true;
122
+ case 4:
123
+ return listeners.fn.call(listeners.context, a1, a2, a3), true;
124
+ case 5:
125
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
126
+ case 6:
127
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
126
128
  }
127
- var err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : ""));
128
- err.context = er;
129
- throw err;
130
- }
131
- var handler = events[type];
132
- if (handler === void 0)
133
- return false;
134
- if (typeof handler === "function") {
135
- ReflectApply(handler, this, args);
136
- } else {
137
- var len = handler.length;
138
- var listeners = arrayClone(handler, len);
139
- for (var i = 0; i < len; ++i)
140
- ReflectApply(listeners[i], this, args);
141
- }
142
- return true;
143
- };
144
- function _addListener(target, type, listener, prepend) {
145
- var m;
146
- var events;
147
- var existing;
148
- checkListener(listener);
149
- events = target._events;
150
- if (events === void 0) {
151
- events = target._events = /* @__PURE__ */ Object.create(null);
152
- target._eventsCount = 0;
153
- } else {
154
- if (events.newListener !== void 0) {
155
- target.emit(
156
- "newListener",
157
- type,
158
- listener.listener ? listener.listener : listener
159
- );
160
- events = target._events;
129
+ for (i = 1, args = new Array(len - 1); i < len; i++) {
130
+ args[i - 1] = arguments[i];
161
131
  }
162
- existing = events[type];
163
- }
164
- if (existing === void 0) {
165
- existing = events[type] = listener;
166
- ++target._eventsCount;
132
+ listeners.fn.apply(listeners.context, args);
167
133
  } else {
168
- if (typeof existing === "function") {
169
- existing = events[type] = prepend ? [listener, existing] : [existing, listener];
170
- } else if (prepend) {
171
- existing.unshift(listener);
172
- } else {
173
- existing.push(listener);
174
- }
175
- m = _getMaxListeners(target);
176
- if (m > 0 && existing.length > m && !existing.warned) {
177
- existing.warned = true;
178
- var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit");
179
- w.name = "MaxListenersExceededWarning";
180
- w.emitter = target;
181
- w.type = type;
182
- w.count = existing.length;
183
- ProcessEmitWarning(w);
134
+ var length = listeners.length, j;
135
+ for (i = 0; i < length; i++) {
136
+ if (listeners[i].once)
137
+ this.removeListener(event, listeners[i].fn, void 0, true);
138
+ switch (len) {
139
+ case 1:
140
+ listeners[i].fn.call(listeners[i].context);
141
+ break;
142
+ case 2:
143
+ listeners[i].fn.call(listeners[i].context, a1);
144
+ break;
145
+ case 3:
146
+ listeners[i].fn.call(listeners[i].context, a1, a2);
147
+ break;
148
+ case 4:
149
+ listeners[i].fn.call(listeners[i].context, a1, a2, a3);
150
+ break;
151
+ default:
152
+ if (!args)
153
+ for (j = 1, args = new Array(len - 1); j < len; j++) {
154
+ args[j - 1] = arguments[j];
155
+ }
156
+ listeners[i].fn.apply(listeners[i].context, args);
157
+ }
184
158
  }
185
159
  }
186
- return target;
187
- }
188
- EventEmitter2.prototype.addListener = function addListener(type, listener) {
189
- return _addListener(this, type, listener, false);
190
- };
191
- EventEmitter2.prototype.on = EventEmitter2.prototype.addListener;
192
- EventEmitter2.prototype.prependListener = function prependListener(type, listener) {
193
- return _addListener(this, type, listener, true);
160
+ return true;
194
161
  };
195
- function onceWrapper() {
196
- if (!this.fired) {
197
- this.target.removeListener(this.type, this.wrapFn);
198
- this.fired = true;
199
- if (arguments.length === 0)
200
- return this.listener.call(this.target);
201
- return this.listener.apply(this.target, arguments);
202
- }
203
- }
204
- function _onceWrap(target, type, listener) {
205
- var state = { fired: false, wrapFn: void 0, target, type, listener };
206
- var wrapped = onceWrapper.bind(state);
207
- wrapped.listener = listener;
208
- state.wrapFn = wrapped;
209
- return wrapped;
210
- }
211
- EventEmitter2.prototype.once = function once2(type, listener) {
212
- checkListener(listener);
213
- this.on(type, _onceWrap(this, type, listener));
214
- return this;
162
+ EventEmitter2.prototype.on = function on(event, fn, context) {
163
+ return addListener(this, event, fn, context, false);
215
164
  };
216
- EventEmitter2.prototype.prependOnceListener = function prependOnceListener(type, listener) {
217
- checkListener(listener);
218
- this.prependListener(type, _onceWrap(this, type, listener));
219
- return this;
165
+ EventEmitter2.prototype.once = function once(event, fn, context) {
166
+ return addListener(this, event, fn, context, true);
220
167
  };
221
- EventEmitter2.prototype.removeListener = function removeListener(type, listener) {
222
- var list, events, position, i, originalListener;
223
- checkListener(listener);
224
- events = this._events;
225
- if (events === void 0)
168
+ EventEmitter2.prototype.removeListener = function removeListener(event, fn, context, once) {
169
+ var evt = prefix ? prefix + event : event;
170
+ if (!this._events[evt])
226
171
  return this;
227
- list = events[type];
228
- if (list === void 0)
172
+ if (!fn) {
173
+ clearEvent(this, evt);
229
174
  return this;
230
- if (list === listener || list.listener === listener) {
231
- if (--this._eventsCount === 0)
232
- this._events = /* @__PURE__ */ Object.create(null);
233
- else {
234
- delete events[type];
235
- if (events.removeListener)
236
- this.emit("removeListener", type, list.listener || listener);
175
+ }
176
+ var listeners = this._events[evt];
177
+ if (listeners.fn) {
178
+ if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
179
+ clearEvent(this, evt);
237
180
  }
238
- } else if (typeof list !== "function") {
239
- position = -1;
240
- for (i = list.length - 1; i >= 0; i--) {
241
- if (list[i] === listener || list[i].listener === listener) {
242
- originalListener = list[i].listener;
243
- position = i;
244
- break;
181
+ } else {
182
+ for (var i = 0, events = [], length = listeners.length; i < length; i++) {
183
+ if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
184
+ events.push(listeners[i]);
245
185
  }
246
186
  }
247
- if (position < 0)
248
- return this;
249
- if (position === 0)
250
- list.shift();
251
- else {
252
- spliceOne(list, position);
253
- }
254
- if (list.length === 1)
255
- events[type] = list[0];
256
- if (events.removeListener !== void 0)
257
- this.emit("removeListener", type, originalListener || listener);
187
+ if (events.length)
188
+ this._events[evt] = events.length === 1 ? events[0] : events;
189
+ else
190
+ clearEvent(this, evt);
258
191
  }
259
192
  return this;
260
193
  };
261
- EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;
262
- EventEmitter2.prototype.removeAllListeners = function removeAllListeners(type) {
263
- var listeners, events, i;
264
- events = this._events;
265
- if (events === void 0)
266
- return this;
267
- if (events.removeListener === void 0) {
268
- if (arguments.length === 0) {
269
- this._events = /* @__PURE__ */ Object.create(null);
270
- this._eventsCount = 0;
271
- } else if (events[type] !== void 0) {
272
- if (--this._eventsCount === 0)
273
- this._events = /* @__PURE__ */ Object.create(null);
274
- else
275
- delete events[type];
276
- }
277
- return this;
278
- }
279
- if (arguments.length === 0) {
280
- var keys = Object.keys(events);
281
- var key;
282
- for (i = 0; i < keys.length; ++i) {
283
- key = keys[i];
284
- if (key === "removeListener")
285
- continue;
286
- this.removeAllListeners(key);
287
- }
288
- this.removeAllListeners("removeListener");
289
- this._events = /* @__PURE__ */ Object.create(null);
194
+ EventEmitter2.prototype.removeAllListeners = function removeAllListeners(event) {
195
+ var evt;
196
+ if (event) {
197
+ evt = prefix ? prefix + event : event;
198
+ if (this._events[evt])
199
+ clearEvent(this, evt);
200
+ } else {
201
+ this._events = new Events();
290
202
  this._eventsCount = 0;
291
- return this;
292
- }
293
- listeners = events[type];
294
- if (typeof listeners === "function") {
295
- this.removeListener(type, listeners);
296
- } else if (listeners !== void 0) {
297
- for (i = listeners.length - 1; i >= 0; i--) {
298
- this.removeListener(type, listeners[i]);
299
- }
300
203
  }
301
204
  return this;
302
205
  };
303
- function _listeners(target, type, unwrap) {
304
- var events = target._events;
305
- if (events === void 0)
306
- return [];
307
- var evlistener = events[type];
308
- if (evlistener === void 0)
309
- return [];
310
- if (typeof evlistener === "function")
311
- return unwrap ? [evlistener.listener || evlistener] : [evlistener];
312
- return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
313
- }
314
- EventEmitter2.prototype.listeners = function listeners(type) {
315
- return _listeners(this, type, true);
316
- };
317
- EventEmitter2.prototype.rawListeners = function rawListeners(type) {
318
- return _listeners(this, type, false);
319
- };
320
- EventEmitter2.listenerCount = function(emitter, type) {
321
- if (typeof emitter.listenerCount === "function") {
322
- return emitter.listenerCount(type);
323
- } else {
324
- return listenerCount.call(emitter, type);
325
- }
326
- };
327
- EventEmitter2.prototype.listenerCount = listenerCount;
328
- function listenerCount(type) {
329
- var events = this._events;
330
- if (events !== void 0) {
331
- var evlistener = events[type];
332
- if (typeof evlistener === "function") {
333
- return 1;
334
- } else if (evlistener !== void 0) {
335
- return evlistener.length;
336
- }
337
- }
338
- return 0;
339
- }
340
- EventEmitter2.prototype.eventNames = function eventNames() {
341
- return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
342
- };
343
- function arrayClone(arr, n) {
344
- var copy = new Array(n);
345
- for (var i = 0; i < n; ++i)
346
- copy[i] = arr[i];
347
- return copy;
348
- }
349
- function spliceOne(list, index) {
350
- for (; index + 1 < list.length; index++)
351
- list[index] = list[index + 1];
352
- list.pop();
353
- }
354
- function unwrapListeners(arr) {
355
- var ret = new Array(arr.length);
356
- for (var i = 0; i < ret.length; ++i) {
357
- ret[i] = arr[i].listener || arr[i];
358
- }
359
- return ret;
360
- }
361
- function once(emitter, name) {
362
- return new Promise(function(resolve, reject) {
363
- function errorListener(err) {
364
- emitter.removeListener(name, resolver);
365
- reject(err);
366
- }
367
- function resolver() {
368
- if (typeof emitter.removeListener === "function") {
369
- emitter.removeListener("error", errorListener);
370
- }
371
- resolve([].slice.call(arguments));
372
- }
373
- ;
374
- eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
375
- if (name !== "error") {
376
- addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
377
- }
378
- });
379
- }
380
- function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
381
- if (typeof emitter.on === "function") {
382
- eventTargetAgnosticAddListener(emitter, "error", handler, flags);
383
- }
384
- }
385
- function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
386
- if (typeof emitter.on === "function") {
387
- if (flags.once) {
388
- emitter.once(name, listener);
389
- } else {
390
- emitter.on(name, listener);
391
- }
392
- } else if (typeof emitter.addEventListener === "function") {
393
- emitter.addEventListener(name, function wrapListener(arg) {
394
- if (flags.once) {
395
- emitter.removeEventListener(name, wrapListener);
396
- }
397
- listener(arg);
398
- });
399
- } else {
400
- throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
401
- }
206
+ EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;
207
+ EventEmitter2.prototype.addListener = EventEmitter2.prototype.on;
208
+ EventEmitter2.prefixed = prefix;
209
+ EventEmitter2.EventEmitter = EventEmitter2;
210
+ if ("undefined" !== typeof module2) {
211
+ module2.exports = EventEmitter2;
402
212
  }
403
213
  }
404
214
  });
@@ -412,7 +222,8 @@ __export(src_exports, {
412
222
  OpenFeatureAPI: () => OpenFeatureAPI,
413
223
  OpenFeatureClient: () => OpenFeatureClient,
414
224
  OpenFeatureEventEmitter: () => OpenFeatureEventEmitter,
415
- ProviderEvents: () => import_core2.ClientProviderEvents
225
+ ProviderEvents: () => import_core2.ClientProviderEvents,
226
+ ProviderStatus: () => import_core3.ClientProviderStatus
416
227
  });
417
228
  module.exports = __toCommonJS(src_exports);
418
229
 
@@ -424,30 +235,30 @@ var import_core6 = require("@openfeature/core");
424
235
 
425
236
  // src/events/open-feature-event-emitter.ts
426
237
  var import_core = require("@openfeature/core");
427
- var import_events = __toESM(require_events());
238
+
239
+ // ../../node_modules/eventemitter3/index.mjs
240
+ var import_index = __toESM(require_eventemitter3(), 1);
241
+
242
+ // src/events/open-feature-event-emitter.ts
428
243
  var OpenFeatureEventEmitter = class extends import_core.GenericEventEmitter {
429
- eventEmitter = new import_events.default({ captureRejections: true });
244
+ eventEmitter = new import_index.default();
430
245
  constructor() {
431
246
  super();
432
- this.eventEmitter.on("error", (err) => {
433
- this._logger?.error("Error running event handler:", err);
434
- });
435
247
  }
436
248
  };
437
249
 
438
250
  // src/events/events.ts
439
251
  var import_core2 = require("@openfeature/core");
440
252
 
441
- // src/provider/no-op-provider.ts
253
+ // src/provider/provider.ts
442
254
  var import_core3 = require("@openfeature/core");
255
+
256
+ // src/provider/no-op-provider.ts
443
257
  var REASON_NO_OP = "No-op";
444
258
  var NoopFeatureProvider = class {
445
259
  metadata = {
446
260
  name: "No-op Provider"
447
261
  };
448
- get status() {
449
- return import_core3.ProviderStatus.NOT_READY;
450
- }
451
262
  resolveBooleanEvaluation(_, defaultValue) {
452
263
  return this.noOp(defaultValue);
453
264
  }
@@ -488,7 +299,6 @@ var VariantNotFoundError = class _VariantNotFoundError extends import_core4.Open
488
299
  var InMemoryProvider = class {
489
300
  events = new OpenFeatureEventEmitter();
490
301
  runsOn = "client";
491
- status = import_core5.ProviderStatus.NOT_READY;
492
302
  metadata = {
493
303
  name: "in-memory"
494
304
  };
@@ -503,10 +313,8 @@ var InMemoryProvider = class {
503
313
  this.resolveFlagWithReason(key, context);
504
314
  }
505
315
  this._context = context;
506
- this.status = import_core5.ProviderStatus.READY;
507
- } catch (error) {
508
- this.status = import_core5.ProviderStatus.ERROR;
509
- throw error;
316
+ } catch (err) {
317
+ throw new Error("initialization failure", { cause: err });
510
318
  }
511
319
  }
512
320
  /**
@@ -515,13 +323,10 @@ var InMemoryProvider = class {
515
323
  */
516
324
  async putConfiguration(flagConfiguration) {
517
325
  const flagsChanged = Object.entries(flagConfiguration).filter(([key, value]) => this._flagConfiguration[key] !== value).map(([key]) => key);
518
- this.status = import_core5.ProviderStatus.STALE;
519
- this.events.emit(import_core2.ClientProviderEvents.Stale);
520
326
  this._flagConfiguration = { ...flagConfiguration };
521
- this.events.emit(import_core2.ClientProviderEvents.ConfigurationChanged, { flagsChanged });
522
327
  try {
523
328
  await this.initialize(this._context);
524
- this.events.emit(import_core2.ClientProviderEvents.Ready);
329
+ this.events.emit(import_core2.ClientProviderEvents.ConfigurationChanged, { flagsChanged });
525
330
  } catch (err) {
526
331
  this.events.emit(import_core2.ClientProviderEvents.Error);
527
332
  throw err;
@@ -575,8 +380,7 @@ var InMemoryProvider = class {
575
380
  const isContextEval = ctx && flagSpec?.contextEvaluator;
576
381
  const variant = isContextEval ? flagSpec.contextEvaluator?.(ctx) : flagSpec.defaultVariant;
577
382
  const value = variant && flagSpec?.variants[variant];
578
- const evalReason = isContextEval ? import_core5.StandardResolutionReasons.TARGETING_MATCH : import_core5.StandardResolutionReasons.STATIC;
579
- const reason = this.status === import_core5.ProviderStatus.STALE ? import_core5.StandardResolutionReasons.CACHED : evalReason;
383
+ const reason = isContextEval ? import_core5.StandardResolutionReasons.TARGETING_MATCH : import_core5.StandardResolutionReasons.STATIC;
580
384
  return {
581
385
  value,
582
386
  ...variant && { variant },
@@ -589,8 +393,10 @@ var InMemoryProvider = class {
589
393
  var GLOBAL_OPENFEATURE_API_KEY = Symbol.for("@openfeature/web-sdk/api");
590
394
  var _globalThis = globalThis;
591
395
  var OpenFeatureAPI = class _OpenFeatureAPI extends import_core6.OpenFeatureCommonAPI {
592
- _events = new OpenFeatureEventEmitter();
593
- _defaultProvider = NOOP_PROVIDER;
396
+ _statusEnumType = import_core3.ClientProviderStatus;
397
+ _apiEmitter = new OpenFeatureEventEmitter();
398
+ _defaultProvider = new import_core6.ProviderWrapper(NOOP_PROVIDER, import_core3.ClientProviderStatus.NOT_READY, this._statusEnumType);
399
+ _domainScopedProviders = /* @__PURE__ */ new Map();
594
400
  _createEventEmitter = () => new OpenFeatureEventEmitter();
595
401
  constructor() {
596
402
  super("client");
@@ -609,33 +415,39 @@ var OpenFeatureAPI = class _OpenFeatureAPI extends import_core6.OpenFeatureCommo
609
415
  _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;
610
416
  return instance;
611
417
  }
418
+ getProviderStatus(domain) {
419
+ if (!domain) {
420
+ return this._defaultProvider.status;
421
+ }
422
+ return this._domainScopedProviders.get(domain)?.status ?? this._defaultProvider.status;
423
+ }
612
424
  async setContext(domainOrContext, contextOrUndefined) {
613
425
  const domain = (0, import_core6.stringOrUndefined)(domainOrContext);
614
426
  const context = (0, import_core6.objectOrUndefined)(domainOrContext) ?? (0, import_core6.objectOrUndefined)(contextOrUndefined) ?? {};
615
427
  if (domain) {
616
- const provider = this._domainScopedProviders.get(domain);
617
- if (provider) {
428
+ const wrapper = this._domainScopedProviders.get(domain);
429
+ if (wrapper) {
618
430
  const oldContext = this.getContext(domain);
619
431
  this._domainScopedContext.set(domain, context);
620
- await this.runProviderContextChangeHandler(domain, provider, oldContext, context);
432
+ await this.runProviderContextChangeHandler(domain, wrapper, oldContext, context);
621
433
  } else {
622
434
  this._domainScopedContext.set(domain, context);
623
435
  }
624
436
  } else {
625
437
  const oldContext = this._context;
626
438
  this._context = context;
627
- const unboundProviders = Array.from(this._domainScopedProviders.entries()).filter(([domain2]) => !this._domainScopedContext.has(domain2)).reduce((acc, [domain2, provider]) => {
628
- acc.push({ domain: domain2, provider });
439
+ const unboundProviders = Array.from(this._domainScopedProviders.entries()).filter(([domain2]) => !this._domainScopedContext.has(domain2)).reduce((acc, [domain2, wrapper]) => {
440
+ acc.push({ domain: domain2, wrapper });
629
441
  return acc;
630
442
  }, []);
631
- const allProviders = [
443
+ const allDomainRecords = [
632
444
  // add in the default (no domain)
633
- { domain: void 0, provider: this._defaultProvider },
445
+ { domain: void 0, wrapper: this._defaultProvider },
634
446
  ...unboundProviders
635
447
  ];
636
448
  await Promise.all(
637
- allProviders.map(
638
- (tuple) => this.runProviderContextChangeHandler(tuple.domain, tuple.provider, oldContext, context)
449
+ allDomainRecords.map(
450
+ (dm) => this.runProviderContextChangeHandler(dm.domain, dm.wrapper, oldContext, context)
639
451
  )
640
452
  );
641
453
  }
@@ -655,12 +467,12 @@ var OpenFeatureAPI = class _OpenFeatureAPI extends import_core6.OpenFeatureCommo
655
467
  async clearContext(domainOrUndefined) {
656
468
  const domain = (0, import_core6.stringOrUndefined)(domainOrUndefined);
657
469
  if (domain) {
658
- const provider = this._domainScopedProviders.get(domain);
659
- if (provider) {
470
+ const wrapper = this._domainScopedProviders.get(domain);
471
+ if (wrapper) {
660
472
  const oldContext = this.getContext(domain);
661
473
  this._domainScopedContext.delete(domain);
662
474
  const newContext = this.getContext();
663
- await this.runProviderContextChangeHandler(domain, provider, oldContext, newContext);
475
+ await this.runProviderContextChangeHandler(domain, wrapper, oldContext, newContext);
664
476
  } else {
665
477
  this._domainScopedContext.delete(domain);
666
478
  }
@@ -692,6 +504,7 @@ var OpenFeatureAPI = class _OpenFeatureAPI extends import_core6.OpenFeatureCommo
692
504
  // functions are passed here to make sure that these values are always up to date,
693
505
  // and so we don't have to make these public properties on the API class.
694
506
  () => this.getProviderForClient(domain),
507
+ () => this.getProviderStatus(domain),
695
508
  () => this.buildAndCacheEventEmitterForClient(domain),
696
509
  () => this._logger,
697
510
  { domain, version }
@@ -705,22 +518,38 @@ var OpenFeatureAPI = class _OpenFeatureAPI extends import_core6.OpenFeatureCommo
705
518
  await super.clearProvidersAndSetDefault(NOOP_PROVIDER);
706
519
  this._domainScopedContext.clear();
707
520
  }
708
- async runProviderContextChangeHandler(domain, provider, oldContext, newContext) {
709
- const providerName = provider.metadata.name;
521
+ async runProviderContextChangeHandler(domain, wrapper, oldContext, newContext) {
522
+ const providerName = wrapper.provider?.metadata?.name || "unnamed-provider";
710
523
  try {
711
- await provider.onContextChange?.(oldContext, newContext);
712
- this.getAssociatedEventEmitters(domain).forEach((emitter) => {
713
- emitter?.emit(import_core2.ClientProviderEvents.ContextChanged, { clientName: domain, domain, providerName });
714
- });
715
- this._events?.emit(import_core2.ClientProviderEvents.ContextChanged, { clientName: domain, domain, providerName });
524
+ if (typeof wrapper.provider.onContextChange === "function") {
525
+ wrapper.incrementPendingContextChanges();
526
+ wrapper.status = this._statusEnumType.RECONCILING;
527
+ this.getAssociatedEventEmitters(domain).forEach((emitter) => {
528
+ emitter?.emit(import_core2.ClientProviderEvents.Reconciling, { domain, providerName });
529
+ });
530
+ this._apiEmitter?.emit(import_core2.ClientProviderEvents.Reconciling, { domain, providerName });
531
+ await wrapper.provider.onContextChange(oldContext, newContext);
532
+ wrapper.decrementPendingContextChanges();
533
+ }
534
+ wrapper.status = this._statusEnumType.READY;
535
+ if (wrapper.allContextChangesSettled) {
536
+ this.getAssociatedEventEmitters(domain).forEach((emitter) => {
537
+ emitter?.emit(import_core2.ClientProviderEvents.ContextChanged, { clientName: domain, domain, providerName });
538
+ });
539
+ this._apiEmitter?.emit(import_core2.ClientProviderEvents.ContextChanged, { clientName: domain, domain, providerName });
540
+ }
716
541
  } catch (err) {
717
- const error = err;
718
- const message = `Error running ${provider?.metadata?.name}'s context change handler: ${error?.message}`;
719
- this._logger?.error(`${message}`, err);
720
- this.getAssociatedEventEmitters(domain).forEach((emitter) => {
721
- emitter?.emit(import_core2.ClientProviderEvents.Error, { clientName: domain, domain, providerName, message });
722
- });
723
- this._events?.emit(import_core2.ClientProviderEvents.Error, { clientName: domain, domain, providerName, message });
542
+ wrapper.decrementPendingContextChanges();
543
+ wrapper.status = this._statusEnumType.ERROR;
544
+ if (wrapper.allContextChangesSettled) {
545
+ const error = err;
546
+ const message = `Error running ${providerName}'s context change handler: ${error?.message}`;
547
+ this._logger?.error(`${message}`, err);
548
+ this.getAssociatedEventEmitters(domain).forEach((emitter) => {
549
+ emitter?.emit(import_core2.ClientProviderEvents.Error, { clientName: domain, domain, providerName, message });
550
+ });
551
+ this._apiEmitter?.emit(import_core2.ClientProviderEvents.Error, { clientName: domain, domain, providerName, message });
552
+ }
724
553
  }
725
554
  }
726
555
  };
@@ -728,8 +557,9 @@ var OpenFeature = OpenFeatureAPI.getInstance();
728
557
 
729
558
  // src/client/open-feature-client.ts
730
559
  var OpenFeatureClient = class {
731
- constructor(providerAccessor, emitterAccessor, globalLogger, options) {
560
+ constructor(providerAccessor, providerStatusAccessor, emitterAccessor, globalLogger, options) {
732
561
  this.providerAccessor = providerAccessor;
562
+ this.providerStatusAccessor = providerStatusAccessor;
733
563
  this.emitterAccessor = emitterAccessor;
734
564
  this.globalLogger = globalLogger;
735
565
  this.options = options;
@@ -746,11 +576,11 @@ var OpenFeatureClient = class {
746
576
  };
747
577
  }
748
578
  get providerStatus() {
749
- return this.providerAccessor()?.status || import_core7.ProviderStatus.READY;
579
+ return this.providerStatusAccessor();
750
580
  }
751
581
  addHandler(eventType, handler) {
752
582
  this.emitterAccessor().addHandler(eventType, handler);
753
- const shouldRunNow = (0, import_core7.statusMatchesEvent)(eventType, this._provider.status);
583
+ const shouldRunNow = (0, import_core7.statusMatchesEvent)(eventType, this.providerStatus);
754
584
  if (shouldRunNow) {
755
585
  try {
756
586
  handler({
@@ -844,6 +674,11 @@ var OpenFeatureClient = class {
844
674
  };
845
675
  try {
846
676
  this.beforeHooks(allHooks, hookContext, options);
677
+ if (this.providerStatus === import_core3.ClientProviderStatus.NOT_READY) {
678
+ throw new import_core7.ProviderNotReadyError("provider has not yet initialized");
679
+ } else if (this.providerStatus === import_core3.ClientProviderStatus.FATAL) {
680
+ throw new import_core7.ProviderFatalError("provider is in an irrecoverable error state");
681
+ }
847
682
  const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);
848
683
  const evaluationDetails = {
849
684
  ...resolution,