@openfeature/web-sdk 0.1.0-experimental → 0.3.0-experimental

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/esm/index.js CHANGED
@@ -1,7 +1,11 @@
1
+ var __create = Object.create;
1
2
  var __defProp = Object.defineProperty;
2
3
  var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
5
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
7
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __getProtoOf = Object.getPrototypeOf;
5
9
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
10
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
11
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -17,6 +21,25 @@ var __spreadValues = (a, b) => {
17
21
  return a;
18
22
  };
19
23
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
24
+ var __commonJS = (cb, mod) => function __require() {
25
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
26
+ };
27
+ var __copyProps = (to, from, except, desc) => {
28
+ if (from && typeof from === "object" || typeof from === "function") {
29
+ for (let key of __getOwnPropNames(from))
30
+ if (!__hasOwnProp.call(to, key) && key !== except)
31
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
32
+ }
33
+ return to;
34
+ };
35
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
36
+ // If the importer is in node compatibility mode or this is not an ESM
37
+ // file that has been converted to a CommonJS file using a Babel-
38
+ // compatible transform (i.e. "__esModule" has not been set), then set
39
+ // "default" to the CommonJS "module.exports" for node compatibility.
40
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
41
+ mod
42
+ ));
20
43
  var __async = (__this, __arguments, generator) => {
21
44
  return new Promise((resolve, reject) => {
22
45
  var fulfilled = (value) => {
@@ -38,6 +61,381 @@ var __async = (__this, __arguments, generator) => {
38
61
  });
39
62
  };
40
63
 
64
+ // ../../node_modules/events/events.js
65
+ var require_events = __commonJS({
66
+ "../../node_modules/events/events.js"(exports, module) {
67
+ "use strict";
68
+ var R = typeof Reflect === "object" ? Reflect : null;
69
+ var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) {
70
+ return Function.prototype.apply.call(target, receiver, args);
71
+ };
72
+ var ReflectOwnKeys;
73
+ if (R && typeof R.ownKeys === "function") {
74
+ ReflectOwnKeys = R.ownKeys;
75
+ } else if (Object.getOwnPropertySymbols) {
76
+ ReflectOwnKeys = function ReflectOwnKeys2(target) {
77
+ return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));
78
+ };
79
+ } else {
80
+ ReflectOwnKeys = function ReflectOwnKeys2(target) {
81
+ return Object.getOwnPropertyNames(target);
82
+ };
83
+ }
84
+ function ProcessEmitWarning(warning) {
85
+ if (console && console.warn)
86
+ console.warn(warning);
87
+ }
88
+ var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) {
89
+ return value !== value;
90
+ };
91
+ function EventEmitter2() {
92
+ EventEmitter2.init.call(this);
93
+ }
94
+ module.exports = EventEmitter2;
95
+ module.exports.once = once;
96
+ EventEmitter2.EventEmitter = EventEmitter2;
97
+ EventEmitter2.prototype._events = void 0;
98
+ EventEmitter2.prototype._eventsCount = 0;
99
+ EventEmitter2.prototype._maxListeners = void 0;
100
+ var defaultMaxListeners = 10;
101
+ function checkListener(listener) {
102
+ if (typeof listener !== "function") {
103
+ throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
104
+ }
105
+ }
106
+ Object.defineProperty(EventEmitter2, "defaultMaxListeners", {
107
+ enumerable: true,
108
+ get: function() {
109
+ return defaultMaxListeners;
110
+ },
111
+ set: function(arg) {
112
+ if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) {
113
+ throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + ".");
114
+ }
115
+ defaultMaxListeners = arg;
116
+ }
117
+ });
118
+ EventEmitter2.init = function() {
119
+ if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) {
120
+ this._events = /* @__PURE__ */ Object.create(null);
121
+ this._eventsCount = 0;
122
+ }
123
+ this._maxListeners = this._maxListeners || void 0;
124
+ };
125
+ EventEmitter2.prototype.setMaxListeners = function setMaxListeners(n) {
126
+ if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) {
127
+ throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + ".");
128
+ }
129
+ this._maxListeners = n;
130
+ return this;
131
+ };
132
+ function _getMaxListeners(that) {
133
+ if (that._maxListeners === void 0)
134
+ return EventEmitter2.defaultMaxListeners;
135
+ return that._maxListeners;
136
+ }
137
+ EventEmitter2.prototype.getMaxListeners = function getMaxListeners() {
138
+ return _getMaxListeners(this);
139
+ };
140
+ EventEmitter2.prototype.emit = function emit(type) {
141
+ var args = [];
142
+ for (var i = 1; i < arguments.length; i++)
143
+ args.push(arguments[i]);
144
+ var doError = type === "error";
145
+ var events = this._events;
146
+ if (events !== void 0)
147
+ doError = doError && events.error === void 0;
148
+ else if (!doError)
149
+ return false;
150
+ if (doError) {
151
+ var er;
152
+ if (args.length > 0)
153
+ er = args[0];
154
+ if (er instanceof Error) {
155
+ throw er;
156
+ }
157
+ var err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : ""));
158
+ err.context = er;
159
+ throw err;
160
+ }
161
+ var handler = events[type];
162
+ if (handler === void 0)
163
+ return false;
164
+ if (typeof handler === "function") {
165
+ ReflectApply(handler, this, args);
166
+ } else {
167
+ var len = handler.length;
168
+ var listeners = arrayClone(handler, len);
169
+ for (var i = 0; i < len; ++i)
170
+ ReflectApply(listeners[i], this, args);
171
+ }
172
+ return true;
173
+ };
174
+ function _addListener(target, type, listener, prepend) {
175
+ var m;
176
+ var events;
177
+ var existing;
178
+ checkListener(listener);
179
+ events = target._events;
180
+ if (events === void 0) {
181
+ events = target._events = /* @__PURE__ */ Object.create(null);
182
+ target._eventsCount = 0;
183
+ } else {
184
+ if (events.newListener !== void 0) {
185
+ target.emit(
186
+ "newListener",
187
+ type,
188
+ listener.listener ? listener.listener : listener
189
+ );
190
+ events = target._events;
191
+ }
192
+ existing = events[type];
193
+ }
194
+ if (existing === void 0) {
195
+ existing = events[type] = listener;
196
+ ++target._eventsCount;
197
+ } else {
198
+ if (typeof existing === "function") {
199
+ existing = events[type] = prepend ? [listener, existing] : [existing, listener];
200
+ } else if (prepend) {
201
+ existing.unshift(listener);
202
+ } else {
203
+ existing.push(listener);
204
+ }
205
+ m = _getMaxListeners(target);
206
+ if (m > 0 && existing.length > m && !existing.warned) {
207
+ existing.warned = true;
208
+ var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit");
209
+ w.name = "MaxListenersExceededWarning";
210
+ w.emitter = target;
211
+ w.type = type;
212
+ w.count = existing.length;
213
+ ProcessEmitWarning(w);
214
+ }
215
+ }
216
+ return target;
217
+ }
218
+ EventEmitter2.prototype.addListener = function addListener(type, listener) {
219
+ return _addListener(this, type, listener, false);
220
+ };
221
+ EventEmitter2.prototype.on = EventEmitter2.prototype.addListener;
222
+ EventEmitter2.prototype.prependListener = function prependListener(type, listener) {
223
+ return _addListener(this, type, listener, true);
224
+ };
225
+ function onceWrapper() {
226
+ if (!this.fired) {
227
+ this.target.removeListener(this.type, this.wrapFn);
228
+ this.fired = true;
229
+ if (arguments.length === 0)
230
+ return this.listener.call(this.target);
231
+ return this.listener.apply(this.target, arguments);
232
+ }
233
+ }
234
+ function _onceWrap(target, type, listener) {
235
+ var state = { fired: false, wrapFn: void 0, target, type, listener };
236
+ var wrapped = onceWrapper.bind(state);
237
+ wrapped.listener = listener;
238
+ state.wrapFn = wrapped;
239
+ return wrapped;
240
+ }
241
+ EventEmitter2.prototype.once = function once2(type, listener) {
242
+ checkListener(listener);
243
+ this.on(type, _onceWrap(this, type, listener));
244
+ return this;
245
+ };
246
+ EventEmitter2.prototype.prependOnceListener = function prependOnceListener(type, listener) {
247
+ checkListener(listener);
248
+ this.prependListener(type, _onceWrap(this, type, listener));
249
+ return this;
250
+ };
251
+ EventEmitter2.prototype.removeListener = function removeListener(type, listener) {
252
+ var list, events, position, i, originalListener;
253
+ checkListener(listener);
254
+ events = this._events;
255
+ if (events === void 0)
256
+ return this;
257
+ list = events[type];
258
+ if (list === void 0)
259
+ return this;
260
+ if (list === listener || list.listener === listener) {
261
+ if (--this._eventsCount === 0)
262
+ this._events = /* @__PURE__ */ Object.create(null);
263
+ else {
264
+ delete events[type];
265
+ if (events.removeListener)
266
+ this.emit("removeListener", type, list.listener || listener);
267
+ }
268
+ } else if (typeof list !== "function") {
269
+ position = -1;
270
+ for (i = list.length - 1; i >= 0; i--) {
271
+ if (list[i] === listener || list[i].listener === listener) {
272
+ originalListener = list[i].listener;
273
+ position = i;
274
+ break;
275
+ }
276
+ }
277
+ if (position < 0)
278
+ return this;
279
+ if (position === 0)
280
+ list.shift();
281
+ else {
282
+ spliceOne(list, position);
283
+ }
284
+ if (list.length === 1)
285
+ events[type] = list[0];
286
+ if (events.removeListener !== void 0)
287
+ this.emit("removeListener", type, originalListener || listener);
288
+ }
289
+ return this;
290
+ };
291
+ EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;
292
+ EventEmitter2.prototype.removeAllListeners = function removeAllListeners(type) {
293
+ var listeners, events, i;
294
+ events = this._events;
295
+ if (events === void 0)
296
+ return this;
297
+ if (events.removeListener === void 0) {
298
+ if (arguments.length === 0) {
299
+ this._events = /* @__PURE__ */ Object.create(null);
300
+ this._eventsCount = 0;
301
+ } else if (events[type] !== void 0) {
302
+ if (--this._eventsCount === 0)
303
+ this._events = /* @__PURE__ */ Object.create(null);
304
+ else
305
+ delete events[type];
306
+ }
307
+ return this;
308
+ }
309
+ if (arguments.length === 0) {
310
+ var keys = Object.keys(events);
311
+ var key;
312
+ for (i = 0; i < keys.length; ++i) {
313
+ key = keys[i];
314
+ if (key === "removeListener")
315
+ continue;
316
+ this.removeAllListeners(key);
317
+ }
318
+ this.removeAllListeners("removeListener");
319
+ this._events = /* @__PURE__ */ Object.create(null);
320
+ this._eventsCount = 0;
321
+ return this;
322
+ }
323
+ listeners = events[type];
324
+ if (typeof listeners === "function") {
325
+ this.removeListener(type, listeners);
326
+ } else if (listeners !== void 0) {
327
+ for (i = listeners.length - 1; i >= 0; i--) {
328
+ this.removeListener(type, listeners[i]);
329
+ }
330
+ }
331
+ return this;
332
+ };
333
+ function _listeners(target, type, unwrap) {
334
+ var events = target._events;
335
+ if (events === void 0)
336
+ return [];
337
+ var evlistener = events[type];
338
+ if (evlistener === void 0)
339
+ return [];
340
+ if (typeof evlistener === "function")
341
+ return unwrap ? [evlistener.listener || evlistener] : [evlistener];
342
+ return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
343
+ }
344
+ EventEmitter2.prototype.listeners = function listeners(type) {
345
+ return _listeners(this, type, true);
346
+ };
347
+ EventEmitter2.prototype.rawListeners = function rawListeners(type) {
348
+ return _listeners(this, type, false);
349
+ };
350
+ EventEmitter2.listenerCount = function(emitter, type) {
351
+ if (typeof emitter.listenerCount === "function") {
352
+ return emitter.listenerCount(type);
353
+ } else {
354
+ return listenerCount.call(emitter, type);
355
+ }
356
+ };
357
+ EventEmitter2.prototype.listenerCount = listenerCount;
358
+ function listenerCount(type) {
359
+ var events = this._events;
360
+ if (events !== void 0) {
361
+ var evlistener = events[type];
362
+ if (typeof evlistener === "function") {
363
+ return 1;
364
+ } else if (evlistener !== void 0) {
365
+ return evlistener.length;
366
+ }
367
+ }
368
+ return 0;
369
+ }
370
+ EventEmitter2.prototype.eventNames = function eventNames() {
371
+ return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
372
+ };
373
+ function arrayClone(arr, n) {
374
+ var copy = new Array(n);
375
+ for (var i = 0; i < n; ++i)
376
+ copy[i] = arr[i];
377
+ return copy;
378
+ }
379
+ function spliceOne(list, index) {
380
+ for (; index + 1 < list.length; index++)
381
+ list[index] = list[index + 1];
382
+ list.pop();
383
+ }
384
+ function unwrapListeners(arr) {
385
+ var ret = new Array(arr.length);
386
+ for (var i = 0; i < ret.length; ++i) {
387
+ ret[i] = arr[i].listener || arr[i];
388
+ }
389
+ return ret;
390
+ }
391
+ function once(emitter, name) {
392
+ return new Promise(function(resolve, reject) {
393
+ function errorListener(err) {
394
+ emitter.removeListener(name, resolver);
395
+ reject(err);
396
+ }
397
+ function resolver() {
398
+ if (typeof emitter.removeListener === "function") {
399
+ emitter.removeListener("error", errorListener);
400
+ }
401
+ resolve([].slice.call(arguments));
402
+ }
403
+ ;
404
+ eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
405
+ if (name !== "error") {
406
+ addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
407
+ }
408
+ });
409
+ }
410
+ function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
411
+ if (typeof emitter.on === "function") {
412
+ eventTargetAgnosticAddListener(emitter, "error", handler, flags);
413
+ }
414
+ }
415
+ function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
416
+ if (typeof emitter.on === "function") {
417
+ if (flags.once) {
418
+ emitter.once(name, listener);
419
+ } else {
420
+ emitter.on(name, listener);
421
+ }
422
+ } else if (typeof emitter.addEventListener === "function") {
423
+ emitter.addEventListener(name, function wrapListener(arg) {
424
+ if (flags.once) {
425
+ emitter.removeEventListener(name, wrapListener);
426
+ }
427
+ listener(arg);
428
+ });
429
+ } else {
430
+ throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
431
+ }
432
+ }
433
+ }
434
+ });
435
+
436
+ // src/index.ts
437
+ var import_events = __toESM(require_events());
438
+
41
439
  // ../shared/src/types.ts
42
440
  var ProviderEvents = /* @__PURE__ */ ((ProviderEvents2) => {
43
441
  ProviderEvents2["Ready"] = "PROVIDER_READY";
@@ -300,6 +698,8 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
300
698
  // eslint-disable-next-line @typescript-eslint/no-empty-function
301
699
  constructor() {
302
700
  super();
701
+ this._apiEvents = new import_events.EventEmitter();
702
+ this._providerReady = false;
303
703
  this._hooks = [];
304
704
  this._provider = NOOP_PROVIDER;
305
705
  }
@@ -350,12 +750,29 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
350
750
  });
351
751
  }
352
752
  setProvider(provider) {
353
- var _a;
753
+ var _a, _b, _c, _d, _e, _f, _g;
354
754
  if (this._provider !== provider) {
355
755
  const oldProvider = this._provider;
356
756
  this._provider = provider;
357
- window.dispatchEvent(new CustomEvent("providerChanged" /* ProviderChanged */));
358
- (_a = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _a.call(oldProvider);
757
+ this._providerReady = false;
758
+ if (!this._provider.events) {
759
+ this._provider.events = new import_events.EventEmitter();
760
+ }
761
+ if (typeof ((_a = this._provider) == null ? void 0 : _a.initialize) === "function") {
762
+ (_e = (_d = (_c = (_b = this._provider).initialize) == null ? void 0 : _c.call(_b, this._context)) == null ? void 0 : _d.then(() => {
763
+ var _a2;
764
+ this._providerReady = true;
765
+ (_a2 = this._provider.events) == null ? void 0 : _a2.emit("PROVIDER_READY" /* Ready */);
766
+ })) == null ? void 0 : _e.catch(() => {
767
+ var _a2;
768
+ (_a2 = this._provider.events) == null ? void 0 : _a2.emit("PROVIDER_ERROR" /* Error */);
769
+ });
770
+ } else {
771
+ this._providerReady = true;
772
+ (_f = this._provider.events) == null ? void 0 : _f.emit("PROVIDER_READY" /* Ready */);
773
+ }
774
+ this._apiEvents.emit("providerChanged" /* ProviderChanged */);
775
+ (_g = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _g.call(oldProvider);
359
776
  }
360
777
  return this;
361
778
  }
@@ -367,7 +784,11 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
367
784
  }
368
785
  getClient(name, version) {
369
786
  return new OpenFeatureClient(
787
+ // functions are passed here to make sure that these values are always up to date,
788
+ // and so we don't have to make these public properties on the API class.
370
789
  () => this._provider,
790
+ () => this._providerReady,
791
+ () => this._apiEvents,
371
792
  () => this._logger,
372
793
  { name, version }
373
794
  );
@@ -377,8 +798,9 @@ var OpenFeature = OpenFeatureAPI.getInstance();
377
798
 
378
799
  // src/client.ts
379
800
  var OpenFeatureClient = class {
380
- constructor(providerAccessor, globalLogger, options) {
801
+ constructor(providerAccessor, providerReady, apiEvents, globalLogger, options) {
381
802
  this.providerAccessor = providerAccessor;
803
+ this.providerReady = providerReady;
382
804
  this.globalLogger = globalLogger;
383
805
  this._hooks = [];
384
806
  this._handlerWrappers = [];
@@ -387,11 +809,13 @@ var OpenFeatureClient = class {
387
809
  version: options.version
388
810
  };
389
811
  this.attachListeners();
390
- window.dispatchEvent(new CustomEvent("providerChanged" /* ProviderChanged */));
812
+ apiEvents().on("providerChanged" /* ProviderChanged */, () => {
813
+ this.attachListeners();
814
+ });
391
815
  }
392
816
  addHandler(eventType, handler) {
393
817
  this._handlerWrappers.push({ eventType, handler });
394
- if (eventType === "PROVIDER_READY" /* Ready */ && this.providerAccessor().ready) {
818
+ if (eventType === "PROVIDER_READY" /* Ready */ && this.providerReady()) {
395
819
  handler();
396
820
  }
397
821
  }
@@ -474,7 +898,7 @@ var OpenFeatureClient = class {
474
898
  };
475
899
  try {
476
900
  this.beforeHooks(allHooks, hookContext, options);
477
- const resolution = resolver.call(this._provider, flagKey, defaultValue, this._logger);
901
+ const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);
478
902
  const evaluationDetails = __spreadProps(__spreadValues({}, resolution), {
479
903
  flagKey
480
904
  });
@@ -544,11 +968,15 @@ var OpenFeatureClient = class {
544
968
  return this._clientLogger || this.globalLogger();
545
969
  }
546
970
  attachListeners() {
547
- Object.values(ProviderEvents).forEach((eventType) => window.addEventListener(eventType, () => {
548
- this._handlerWrappers.filter((wrapper) => wrapper.eventType === eventType).forEach((wrapper) => wrapper.handler());
549
- }));
971
+ Object.values(ProviderEvents).forEach((eventType) => {
972
+ var _a;
973
+ return (_a = this._provider.events) == null ? void 0 : _a.on(eventType, () => {
974
+ this._handlerWrappers.filter((wrapper) => wrapper.eventType === eventType).forEach((wrapper) => wrapper.handler());
975
+ });
976
+ });
550
977
  }
551
978
  };
979
+ var export_OpenFeatureEventEmitter = import_events.EventEmitter;
552
980
  export {
553
981
  ApiEvents,
554
982
  DefaultLogger,
@@ -563,6 +991,7 @@ export {
563
991
  OpenFeatureClient,
564
992
  OpenFeatureCommonAPI,
565
993
  OpenFeatureError,
994
+ export_OpenFeatureEventEmitter as OpenFeatureEventEmitter,
566
995
  ParseError,
567
996
  ProviderEvents,
568
997
  SafeLogger,